1688-cli 0.1.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 (80) hide show
  1. package/AGENTS.md +118 -0
  2. package/README.md +48 -0
  3. package/dist/auth/cookies.js +31 -0
  4. package/dist/auth/cookies.js.map +1 -0
  5. package/dist/auth/verify.js +25 -0
  6. package/dist/auth/verify.js.map +1 -0
  7. package/dist/cli.js +373 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/cart-add.js +199 -0
  10. package/dist/commands/cart-add.js.map +1 -0
  11. package/dist/commands/cart-list.js +168 -0
  12. package/dist/commands/cart-list.js.map +1 -0
  13. package/dist/commands/cart-remove.js +119 -0
  14. package/dist/commands/cart-remove.js.map +1 -0
  15. package/dist/commands/checkout-confirm.js +407 -0
  16. package/dist/commands/checkout-confirm.js.map +1 -0
  17. package/dist/commands/checkout-prepare.js +244 -0
  18. package/dist/commands/checkout-prepare.js.map +1 -0
  19. package/dist/commands/doctor.js +246 -0
  20. package/dist/commands/doctor.js.map +1 -0
  21. package/dist/commands/image-search.js +210 -0
  22. package/dist/commands/image-search.js.map +1 -0
  23. package/dist/commands/login.js +209 -0
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/logout.js +59 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/offer.js +185 -0
  28. package/dist/commands/offer.js.map +1 -0
  29. package/dist/commands/order-get.js +76 -0
  30. package/dist/commands/order-get.js.map +1 -0
  31. package/dist/commands/order-list.js +176 -0
  32. package/dist/commands/order-list.js.map +1 -0
  33. package/dist/commands/order-logistics.js +152 -0
  34. package/dist/commands/order-logistics.js.map +1 -0
  35. package/dist/commands/search.js +250 -0
  36. package/dist/commands/search.js.map +1 -0
  37. package/dist/commands/seller-chat.js +213 -0
  38. package/dist/commands/seller-chat.js.map +1 -0
  39. package/dist/commands/seller-inquire.js +110 -0
  40. package/dist/commands/seller-inquire.js.map +1 -0
  41. package/dist/commands/seller-lookup-ww.js +6 -0
  42. package/dist/commands/seller-lookup-ww.js.map +1 -0
  43. package/dist/commands/seller-messages.js +181 -0
  44. package/dist/commands/seller-messages.js.map +1 -0
  45. package/dist/commands/whoami.js +53 -0
  46. package/dist/commands/whoami.js.map +1 -0
  47. package/dist/commands/workflows.js +264 -0
  48. package/dist/commands/workflows.js.map +1 -0
  49. package/dist/daemon/client.js +75 -0
  50. package/dist/daemon/client.js.map +1 -0
  51. package/dist/daemon/manager.js +128 -0
  52. package/dist/daemon/manager.js.map +1 -0
  53. package/dist/daemon/protocol.js +5 -0
  54. package/dist/daemon/protocol.js.map +1 -0
  55. package/dist/daemon/server.js +197 -0
  56. package/dist/daemon/server.js.map +1 -0
  57. package/dist/daemon/throttle.js +17 -0
  58. package/dist/daemon/throttle.js.map +1 -0
  59. package/dist/io/errors.js +10 -0
  60. package/dist/io/errors.js.map +1 -0
  61. package/dist/io/output.js +17 -0
  62. package/dist/io/output.js.map +1 -0
  63. package/dist/io/prompt.js +17 -0
  64. package/dist/io/prompt.js.map +1 -0
  65. package/dist/session/context.js +91 -0
  66. package/dist/session/context.js.map +1 -0
  67. package/dist/session/dispatch.js +50 -0
  68. package/dist/session/dispatch.js.map +1 -0
  69. package/dist/session/lock.js +23 -0
  70. package/dist/session/lock.js.map +1 -0
  71. package/dist/session/paths.js +31 -0
  72. package/dist/session/paths.js.map +1 -0
  73. package/dist/session/shared.js +104 -0
  74. package/dist/session/shared.js.map +1 -0
  75. package/dist/session/state.js +27 -0
  76. package/dist/session/state.js.map +1 -0
  77. package/dist/util/time.js +17 -0
  78. package/dist/util/time.js.map +1 -0
  79. package/package.json +44 -0
  80. package/scripts/postinstall.mjs +49 -0
@@ -0,0 +1,244 @@
1
+ import { dispatch } from '../session/dispatch.js';
2
+ import { emit, info } from '../io/output.js';
3
+ import { CliError } from '../io/errors.js';
4
+ import { execute as cartListExecute } from './cart-list.js';
5
+ export async function execute(ctx, args) {
6
+ if (!Array.isArray(args.cartIds) || args.cartIds.length === 0) {
7
+ throw new CliError(2, 'BAD_INPUT', 'cartIds required.');
8
+ }
9
+ for (const id of args.cartIds) {
10
+ if (!/^\d+$/.test(id)) {
11
+ throw new CliError(2, 'BAD_INPUT', `Invalid cartId: ${id}`);
12
+ }
13
+ }
14
+ // Verify cartIds exist in current cart.
15
+ info('Verifying cart items...');
16
+ const cart = await cartListExecute(ctx, {});
17
+ const wanted = new Set(args.cartIds);
18
+ const missing = args.cartIds.filter((id) => !cart.items.some((i) => i.cartId === id));
19
+ if (missing.length > 0) {
20
+ throw new CliError(12, 'CART_ITEM_NOT_FOUND', `cartId(s) not found: ${missing.join(', ')}`);
21
+ }
22
+ // Open cart page, uncheck all, check only the wanted items, click 结算.
23
+ info('Selecting items in cart...');
24
+ const page = await ctx.newPage();
25
+ try {
26
+ await page.goto('https://cart.1688.com/', {
27
+ waitUntil: 'domcontentloaded',
28
+ timeout: 30000,
29
+ });
30
+ if (/login\.1688\.com|login\.taobao\.com/.test(page.url())) {
31
+ throw new CliError(3, 'NOT_LOGGED_IN', 'Session expired. Run `1688 login`.');
32
+ }
33
+ try {
34
+ await page.waitForSelector('input[type="checkbox"].next-checkbox-input', {
35
+ timeout: 15000,
36
+ });
37
+ }
38
+ catch {
39
+ throw new CliError(11, 'CART_NOT_LOADED', 'Cart page did not load.');
40
+ }
41
+ await new Promise((r) => setTimeout(r, 1500));
42
+ // For each wanted cartId, find its row by product title and check it.
43
+ // For SAFETY, we won't uncheck others — we just toggle the targets to checked.
44
+ // 1688's 结算 only acts on currently checked items.
45
+ // First: uncheck everything via the master select-all (if checked) so only
46
+ // our targets end up checked.
47
+ await uncheckAll(page);
48
+ await new Promise((r) => setTimeout(r, 1000));
49
+ for (const cartId of args.cartIds) {
50
+ const item = cart.items.find((i) => i.cartId === cartId);
51
+ const titleHint = item.productTitle.slice(0, 12);
52
+ const skuHint = item.skuTitle?.trim() ?? null;
53
+ const result = await page.evaluate(({ titleHint, skuHint }) => {
54
+ const probe = skuHint && skuHint.length >= 3 ? skuHint : titleHint;
55
+ const all = Array.from(document.querySelectorAll('*'));
56
+ const candidates = all.filter((el) => el.children.length === 0 &&
57
+ el.textContent !== null &&
58
+ el.textContent.includes(probe));
59
+ for (const c of candidates) {
60
+ let row = c;
61
+ for (let d = 0; d < 10 && row; d++) {
62
+ row = row.parentElement;
63
+ if (!row)
64
+ break;
65
+ const txt = row.textContent ?? '';
66
+ if (!txt.includes(titleHint))
67
+ continue;
68
+ const cb = row.querySelector('.next-checkbox-wrapper');
69
+ if (cb) {
70
+ const aria = cb.querySelector('[aria-checked]');
71
+ const checked = aria?.getAttribute('aria-checked') === 'true';
72
+ if (!checked)
73
+ cb.click();
74
+ return { ok: true, alreadyChecked: checked };
75
+ }
76
+ }
77
+ }
78
+ return { ok: false, reason: 'row-not-found' };
79
+ }, { titleHint, skuHint });
80
+ if (!result.ok) {
81
+ throw new CliError(14, 'UI_ELEMENT_NOT_FOUND', `Could not select cartId ${cartId} (${result.reason}, sku="${item.skuTitle ?? ''}").`);
82
+ }
83
+ await new Promise((r) => setTimeout(r, 800));
84
+ }
85
+ info('Clicking 结算...');
86
+ const [_nav] = await Promise.all([
87
+ page
88
+ .waitForURL(/smart_make_order|order\.1688\.com\/order/i, {
89
+ timeout: 25000,
90
+ })
91
+ .catch(() => undefined),
92
+ page
93
+ .locator('button:has-text("结算"):not([disabled])')
94
+ .first()
95
+ .click({ force: true, timeout: 5000 }),
96
+ ]);
97
+ if (!/smart_make_order/i.test(page.url())) {
98
+ // Sometimes the page renders inline rather than navigating.
99
+ await new Promise((r) => setTimeout(r, 3000));
100
+ }
101
+ if (!/order\.1688\.com/i.test(page.url())) {
102
+ throw new CliError(18, 'PREVIEW_NAV_FAILED', `Did not reach checkout preview page. URL: ${page.url()}`);
103
+ }
104
+ info('Reading order preview...');
105
+ await new Promise((r) => setTimeout(r, 5000));
106
+ const html = await page.content();
107
+ return parsePreview(html, page.url());
108
+ }
109
+ finally {
110
+ await page.close().catch(() => { });
111
+ }
112
+ }
113
+ async function uncheckAll(page) {
114
+ // Try to find a master "全选" checkbox that's currently checked, and click it
115
+ // to uncheck everything. Fallback: walk all checkboxes and click each that is checked.
116
+ await page.evaluate(() => {
117
+ const wrappers = Array.from(document.querySelectorAll('.next-checkbox-wrapper'));
118
+ for (const w of wrappers) {
119
+ const aria = w.querySelector('[aria-checked]');
120
+ if (aria?.getAttribute('aria-checked') === 'true') {
121
+ w.click();
122
+ }
123
+ }
124
+ });
125
+ }
126
+ function parsePreview(rawHtml, url) {
127
+ const match = rawHtml.match(/data-source="([^"]+sumPayment[^"]+)"/);
128
+ if (!match) {
129
+ throw new CliError(19, 'PREVIEW_NOT_FOUND', 'Could not locate preview data in page.');
130
+ }
131
+ const unescaped = decodeHtmlEntities(match[1]);
132
+ let raw;
133
+ try {
134
+ raw = JSON.parse(unescaped);
135
+ }
136
+ catch (e) {
137
+ throw new CliError(19, 'PREVIEW_PARSE_FAILED', `Could not parse preview JSON: ${e.message}`);
138
+ }
139
+ const orders = raw.orders ?? [];
140
+ if (orders.length === 0) {
141
+ throw new CliError(19, 'PREVIEW_EMPTY', 'No orders in preview.');
142
+ }
143
+ // Total = sum of per-seller order sums.
144
+ let totalAmount = 0;
145
+ let productAmount = 0;
146
+ let shippingAmount = 0;
147
+ let taxAmount = 0;
148
+ const out = [];
149
+ let firstAddress;
150
+ for (const o of orders) {
151
+ totalAmount += cents(o.sumPayment);
152
+ productAmount += cents(o.sumPaymentNoCarriage);
153
+ shippingAmount += cents(o.sumCarriage);
154
+ taxAmount += cents(o.sumTaxAmount);
155
+ if (!firstAddress)
156
+ firstAddress = o.receiveAddress;
157
+ const items = [];
158
+ for (const cg of o.cargoGroupedByLogistics ?? []) {
159
+ for (const cargo of cg.cargoList ?? []) {
160
+ for (const oc of cargo.orderCargos ?? []) {
161
+ items.push({
162
+ cartId: oc.cartId !== undefined ? String(oc.cartId) : '',
163
+ offerId: cargo.offerId !== undefined ? String(cargo.offerId) : '',
164
+ productNumber: oc.cargoNumber ?? null,
165
+ skuNumber: oc.cargoSkuNumber ?? null,
166
+ quantity: oc.commonQuantity ?? 0,
167
+ unitPrice: oc.finalUnitPrice ?? 0,
168
+ amount: oc.amount ?? 0,
169
+ });
170
+ }
171
+ }
172
+ }
173
+ out.push({
174
+ seller: {
175
+ memberId: o.simpleSeller?.memberId ?? null,
176
+ loginId: o.simpleSeller?.loginId ?? null,
177
+ companyName: o.simpleSeller?.companyName ?? null,
178
+ },
179
+ totalAmount: cents(o.sumPayment),
180
+ productAmount: cents(o.sumPaymentNoCarriage),
181
+ shippingAmount: cents(o.sumCarriage),
182
+ items,
183
+ });
184
+ }
185
+ return {
186
+ ok: true,
187
+ url,
188
+ totalAmount,
189
+ productAmount,
190
+ shippingAmount,
191
+ taxAmount,
192
+ receiveAddress: {
193
+ fullName: firstAddress?.fullName ?? null,
194
+ mobile: firstAddress?.mobile ?? null,
195
+ address: firstAddress?.address ?? null,
196
+ region: firstAddress?.addressCodeText ?? null,
197
+ },
198
+ orders: out,
199
+ };
200
+ }
201
+ function cents(v) {
202
+ if (v === undefined || v === null)
203
+ return 0;
204
+ return Math.round(v) / 100;
205
+ }
206
+ function decodeHtmlEntities(s) {
207
+ return s
208
+ .replace(/&quot;/g, '"')
209
+ .replace(/&#39;/g, "'")
210
+ .replace(/&amp;/g, '&')
211
+ .replace(/&lt;/g, '<')
212
+ .replace(/&gt;/g, '>');
213
+ }
214
+ export async function run(opts) {
215
+ if (!opts.cartIds || opts.cartIds.length === 0) {
216
+ throw new CliError(2, 'BAD_INPUT', 'At least one cartId is required.');
217
+ }
218
+ const data = await dispatch('checkout-prepare', { cartIds: opts.cartIds }, { headed: opts.headed, profile: opts.profile });
219
+ emit({
220
+ human: () => printPreview(data),
221
+ data,
222
+ });
223
+ }
224
+ function printPreview(r) {
225
+ process.stdout.write('=== Checkout Preview ===\n');
226
+ process.stdout.write(` total: ¥${r.totalAmount.toFixed(2)}`);
227
+ process.stdout.write(` (items ¥${r.productAmount.toFixed(2)} + shipping ¥${r.shippingAmount.toFixed(2)}`);
228
+ if (r.taxAmount > 0)
229
+ process.stdout.write(` + tax ¥${r.taxAmount.toFixed(2)}`);
230
+ process.stdout.write(')\n');
231
+ if (r.receiveAddress.fullName) {
232
+ process.stdout.write(` ship to: ${r.receiveAddress.fullName} (${r.receiveAddress.mobile ?? '-'})\n ${r.receiveAddress.region ?? ''} ${r.receiveAddress.address ?? ''}\n`);
233
+ }
234
+ process.stdout.write('\n');
235
+ r.orders.forEach((o, i) => {
236
+ process.stdout.write(`Seller ${i + 1}: ${o.seller.companyName ?? '?'} (${o.seller.loginId ?? '-'})\n`);
237
+ process.stdout.write(` subtotal: ¥${o.totalAmount.toFixed(2)} = items ¥${o.productAmount.toFixed(2)} + shipping ¥${o.shippingAmount.toFixed(2)}\n`);
238
+ for (const it of o.items) {
239
+ process.stdout.write(` * cartId=${it.cartId} ${it.quantity}×¥${it.unitPrice.toFixed(2)} = ¥${it.amount.toFixed(2)}\n`);
240
+ }
241
+ });
242
+ process.stdout.write('\nThis is a PREVIEW only. To actually place the order, you must do it manually in 1688 or via `1688 checkout confirm` (not yet implemented).\n');
243
+ }
244
+ //# sourceMappingURL=checkout-prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout-prepare.js","sourceRoot":"","sources":["../../src/commands/checkout-prepare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import fs from 'node:fs/promises';
4
+ import { chromium } from 'playwright';
5
+ import { root, stateFile, lockFile, profilePath, } from '../session/paths.js';
6
+ import { readState } from '../session/state.js';
7
+ import { emit } from '../io/output.js';
8
+ import { CliError } from '../io/errors.js';
9
+ export async function run(opts) {
10
+ const checks = [];
11
+ checks.push(checkNode());
12
+ checks.push(await checkYibabaRoot());
13
+ checks.push(await checkProfile(opts.profile));
14
+ checks.push(await checkChromiumCache());
15
+ checks.push(await checkLock());
16
+ checks.push(await checkStateFile());
17
+ if (opts.launch !== false) {
18
+ checks.push(await checkChromiumLaunch());
19
+ }
20
+ checks.push(await checkSession());
21
+ const failed = checks.some((c) => c.status === 'fail');
22
+ emit({
23
+ human: () => printHuman(checks),
24
+ data: { ok: !failed, checks },
25
+ });
26
+ if (failed)
27
+ throw new CliError(6, 'DOCTOR_FAILED', '');
28
+ }
29
+ function checkNode() {
30
+ const v = process.versions.node;
31
+ const major = parseInt(v.split('.')[0] ?? '0', 10);
32
+ if (major >= 20) {
33
+ return { name: 'Node version', status: 'ok', message: `v${v}` };
34
+ }
35
+ return {
36
+ name: 'Node version',
37
+ status: 'fail',
38
+ message: `v${v} (need >= 20)`,
39
+ fix: 'Upgrade Node (e.g. `nvm install 20`).',
40
+ };
41
+ }
42
+ async function checkYibabaRoot() {
43
+ const dir = root();
44
+ try {
45
+ await fs.mkdir(dir, { recursive: true });
46
+ await fs.access(dir, fs.constants.W_OK);
47
+ return { name: '1688 home', status: 'ok', message: dir };
48
+ }
49
+ catch (e) {
50
+ return {
51
+ name: '1688 home',
52
+ status: 'fail',
53
+ message: `${dir}: ${e.message}`,
54
+ fix: `chmod u+w ${dir}`,
55
+ };
56
+ }
57
+ }
58
+ async function checkProfile(name) {
59
+ const dir = profilePath(name);
60
+ try {
61
+ await fs.mkdir(dir, { recursive: true });
62
+ await fs.access(dir, fs.constants.W_OK);
63
+ return { name: 'profile dir', status: 'ok', message: dir };
64
+ }
65
+ catch (e) {
66
+ return {
67
+ name: 'profile dir',
68
+ status: 'fail',
69
+ message: `${dir}: ${e.message}`,
70
+ };
71
+ }
72
+ }
73
+ function chromiumCacheDir() {
74
+ if (process.env.PLAYWRIGHT_BROWSERS_PATH) {
75
+ return process.env.PLAYWRIGHT_BROWSERS_PATH;
76
+ }
77
+ if (process.platform === 'darwin') {
78
+ return path.join(os.homedir(), 'Library/Caches/ms-playwright');
79
+ }
80
+ if (process.platform === 'win32') {
81
+ return path.join(process.env.LOCALAPPDATA ?? os.homedir(), 'ms-playwright');
82
+ }
83
+ return path.join(os.homedir(), '.cache/ms-playwright');
84
+ }
85
+ async function checkChromiumCache() {
86
+ const cache = chromiumCacheDir();
87
+ try {
88
+ const entries = await fs.readdir(cache);
89
+ const hit = entries.find((n) => n.startsWith('chromium'));
90
+ if (hit) {
91
+ return {
92
+ name: 'Chromium cache',
93
+ status: 'ok',
94
+ message: `${hit} @ ${cache}`,
95
+ };
96
+ }
97
+ return {
98
+ name: 'Chromium cache',
99
+ status: 'fail',
100
+ message: `no chromium-* dir in ${cache}`,
101
+ fix: 'npx playwright install chromium',
102
+ };
103
+ }
104
+ catch {
105
+ return {
106
+ name: 'Chromium cache',
107
+ status: 'fail',
108
+ message: `cache dir missing (${cache})`,
109
+ fix: 'npx playwright install chromium',
110
+ };
111
+ }
112
+ }
113
+ async function checkLock() {
114
+ // proper-lockfile uses `<lock>.lock` as the semaphore directory.
115
+ const semaphore = lockFile() + '.lock';
116
+ try {
117
+ const st = await fs.stat(semaphore);
118
+ const ageMs = Date.now() - st.mtimeMs;
119
+ // Lock held — but if it's the daemon holding it, that's expected.
120
+ const { status: daemonStatus } = await import('../daemon/manager.js');
121
+ const ds = await daemonStatus();
122
+ if (ds.running && ds.pid) {
123
+ return {
124
+ name: 'lock',
125
+ status: 'ok',
126
+ message: `held by daemon (pid ${ds.pid})`,
127
+ };
128
+ }
129
+ if (ageMs > 5 * 60 * 1000) {
130
+ return {
131
+ name: 'lock',
132
+ status: 'warn',
133
+ message: `stale lock (${Math.round(ageMs / 1000)}s old)`,
134
+ fix: `rm -rf "${semaphore}"`,
135
+ };
136
+ }
137
+ return {
138
+ name: 'lock',
139
+ status: 'warn',
140
+ message: 'another 1688 command appears to be running',
141
+ };
142
+ }
143
+ catch (e) {
144
+ if (e.code === 'ENOENT') {
145
+ return { name: 'lock', status: 'ok', message: 'free' };
146
+ }
147
+ return {
148
+ name: 'lock',
149
+ status: 'warn',
150
+ message: `unknown: ${e.message}`,
151
+ };
152
+ }
153
+ }
154
+ async function checkStateFile() {
155
+ try {
156
+ const s = await readState();
157
+ if (s.version !== 1) {
158
+ return {
159
+ name: 'state.json',
160
+ status: 'warn',
161
+ message: `unexpected version ${s.version}`,
162
+ };
163
+ }
164
+ return { name: 'state.json', status: 'ok', message: stateFile() };
165
+ }
166
+ catch (e) {
167
+ return {
168
+ name: 'state.json',
169
+ status: 'warn',
170
+ message: `unreadable: ${e.message}`,
171
+ fix: `rm "${stateFile()}"`,
172
+ };
173
+ }
174
+ }
175
+ async function checkChromiumLaunch() {
176
+ // Use a temp profile so doctor is safe to run alongside the real lock.
177
+ const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'bb1688-doctor-'));
178
+ try {
179
+ const ctx = await chromium.launchPersistentContext(tmp, {
180
+ headless: true,
181
+ });
182
+ await ctx.close();
183
+ return {
184
+ name: 'Chromium launch',
185
+ status: 'ok',
186
+ message: 'headless launch OK',
187
+ };
188
+ }
189
+ catch (e) {
190
+ const first = e.message.split('\n')[0] ?? 'launch failed';
191
+ return {
192
+ name: 'Chromium launch',
193
+ status: 'fail',
194
+ message: first,
195
+ fix: 'npx playwright install chromium',
196
+ };
197
+ }
198
+ finally {
199
+ await fs.rm(tmp, { recursive: true, force: true });
200
+ }
201
+ }
202
+ async function checkSession() {
203
+ try {
204
+ const s = await readState();
205
+ if (s.memberId) {
206
+ const name = s.nick ?? s.memberId;
207
+ return {
208
+ name: 'session',
209
+ status: 'ok',
210
+ message: `${name} (memberId: ${s.memberId}, cached)`,
211
+ };
212
+ }
213
+ return {
214
+ name: 'session',
215
+ status: 'warn',
216
+ message: 'not logged in',
217
+ fix: '1688 login',
218
+ };
219
+ }
220
+ catch {
221
+ return { name: 'session', status: 'warn', message: 'unknown' };
222
+ }
223
+ }
224
+ function printHuman(checks) {
225
+ const icon = (s) => (s === 'ok' ? '✓' : s === 'warn' ? '⚠' : '✗');
226
+ const pad = Math.max(...checks.map((c) => c.name.length));
227
+ for (const c of checks) {
228
+ process.stdout.write(`${icon(c.status)} ${c.name.padEnd(pad)} ${c.message}\n`);
229
+ if (c.fix && c.status !== 'ok') {
230
+ process.stdout.write(` ${' '.repeat(pad)} fix: ${c.fix}\n`);
231
+ }
232
+ }
233
+ const failed = checks.filter((c) => c.status === 'fail').length;
234
+ const warned = checks.filter((c) => c.status === 'warn').length;
235
+ process.stdout.write('\n');
236
+ if (failed) {
237
+ process.stdout.write(`${failed} failed, ${warned} warning(s).\n`);
238
+ }
239
+ else if (warned) {
240
+ process.stdout.write(`All critical checks passed (${warned} warning(s)).\n`);
241
+ }
242
+ else {
243
+ process.stdout.write('All checks passed.\n');
244
+ }
245
+ }
246
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}