jamdesk 1.1.75 → 1.1.77

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 (61) hide show
  1. package/dist/__tests__/unit/deps.test.js +184 -0
  2. package/dist/__tests__/unit/deps.test.js.map +1 -1
  3. package/dist/__tests__/unit/dev-spinner-ownership.test.d.ts +2 -0
  4. package/dist/__tests__/unit/dev-spinner-ownership.test.d.ts.map +1 -0
  5. package/dist/__tests__/unit/dev-spinner-ownership.test.js +37 -0
  6. package/dist/__tests__/unit/dev-spinner-ownership.test.js.map +1 -0
  7. package/dist/__tests__/unit/dev-workspace-symlinks.test.d.ts +2 -0
  8. package/dist/__tests__/unit/dev-workspace-symlinks.test.d.ts.map +1 -0
  9. package/dist/__tests__/unit/dev-workspace-symlinks.test.js +112 -0
  10. package/dist/__tests__/unit/dev-workspace-symlinks.test.js.map +1 -0
  11. package/dist/__tests__/unit/language-filter.test.d.ts +2 -0
  12. package/dist/__tests__/unit/language-filter.test.d.ts.map +1 -0
  13. package/dist/__tests__/unit/language-filter.test.js +166 -0
  14. package/dist/__tests__/unit/language-filter.test.js.map +1 -0
  15. package/dist/__tests__/unit/output.test.d.ts +2 -0
  16. package/dist/__tests__/unit/output.test.d.ts.map +1 -0
  17. package/dist/__tests__/unit/output.test.js +61 -0
  18. package/dist/__tests__/unit/output.test.js.map +1 -0
  19. package/dist/__tests__/unit/spinner.test.d.ts +2 -0
  20. package/dist/__tests__/unit/spinner.test.d.ts.map +1 -0
  21. package/dist/__tests__/unit/spinner.test.js +83 -0
  22. package/dist/__tests__/unit/spinner.test.js.map +1 -0
  23. package/dist/commands/dev.d.ts.map +1 -1
  24. package/dist/commands/dev.js +13 -3
  25. package/dist/commands/dev.js.map +1 -1
  26. package/dist/lib/deps.d.ts +22 -0
  27. package/dist/lib/deps.d.ts.map +1 -1
  28. package/dist/lib/deps.js +121 -27
  29. package/dist/lib/deps.js.map +1 -1
  30. package/dist/lib/language-filter.d.ts +31 -0
  31. package/dist/lib/language-filter.d.ts.map +1 -0
  32. package/dist/lib/language-filter.js +14 -0
  33. package/dist/lib/language-filter.js.map +1 -0
  34. package/dist/lib/spinner.d.ts +24 -0
  35. package/dist/lib/spinner.d.ts.map +1 -1
  36. package/dist/lib/spinner.js +59 -0
  37. package/dist/lib/spinner.js.map +1 -1
  38. package/package.json +3 -3
  39. package/vendored/app/[[...slug]]/page.tsx +12 -4
  40. package/vendored/app/layout.tsx +25 -10
  41. package/vendored/components/mdx/ApiPage.tsx +10 -2
  42. package/vendored/components/mdx/OpenApiEndpoint.tsx +41 -44
  43. package/vendored/components/mdx/YouTube.tsx +8 -0
  44. package/vendored/components/navigation/Sidebar.tsx +32 -17
  45. package/vendored/components/navigation/TabsNav.tsx +22 -30
  46. package/vendored/components/ui/CodePanel.tsx +48 -3
  47. package/vendored/hooks/useIsNavigationSettled.ts +74 -0
  48. package/vendored/lib/layout-helpers.tsx +27 -0
  49. package/vendored/lib/middleware-helpers.ts +79 -8
  50. package/vendored/lib/page-isr-helpers.ts +14 -9
  51. package/vendored/lib/prefetch-batcher.ts +51 -0
  52. package/vendored/lib/prefetch-rsc.ts +19 -0
  53. package/vendored/lib/project-resolver.ts +21 -5
  54. package/vendored/lib/r2-content.ts +16 -0
  55. package/vendored/lib/r2-feature-flags.ts +7 -0
  56. package/vendored/lib/render-doc-page-openapi-helpers.ts +110 -0
  57. package/vendored/lib/render-doc-page-parallel-helpers.ts +60 -0
  58. package/vendored/lib/render-doc-page.tsx +101 -52
  59. package/vendored/lib/sidebar-prefetch-walker.ts +50 -0
  60. package/vendored/lib/static-artifacts.ts +2 -1
  61. package/vendored/workspace-package-lock.json +101 -99
package/dist/lib/deps.js CHANGED
@@ -13,7 +13,7 @@ import { fileURLToPath } from 'url';
13
13
  import { homedir } from 'os';
14
14
  import { output } from './output.js';
15
15
  import { runWithSlowHint } from './slow-hint.js';
16
- import { spinner } from './spinner.js';
16
+ import { spinner, logAboveSpinner } from './spinner.js';
17
17
  import { createRequire } from 'module';
18
18
  const require = createRequire(import.meta.url);
19
19
  const cliPackage = require('../../package.json');
@@ -24,13 +24,13 @@ const JAMDESK_DIR = path.join(homedir(), '.jamdesk');
24
24
  // compiled dist/lib/deps.js instead of re-parsing the TypeScript source.
25
25
  export const REQUIRED_DEPS = {
26
26
  // Next.js and React
27
- 'next': '^16.2.5',
27
+ 'next': '^16.2.6',
28
28
  // OpenAPI validation (for API reference docs)
29
29
  '@apidevtools/swagger-parser': '^12.1.0',
30
30
  'openapi-types': '^12.1.3',
31
31
  'react': '^19.2.6',
32
32
  'react-dom': '^19.2.6',
33
- '@next/mdx': '^16.2.5',
33
+ '@next/mdx': '^16.2.6',
34
34
  'next-mdx-remote': '^6.0.0',
35
35
  'next-themes': '^0.4.6',
36
36
  // Icons
@@ -88,10 +88,10 @@ export const REQUIRED_DEPS = {
88
88
  '@upstash/redis': '^1.37.0',
89
89
  // TypeScript (needed for Next.js to avoid auto-install breaking symlink)
90
90
  'typescript': '^6.0.3',
91
- '@types/node': '^25.5.2',
91
+ '@types/node': '^25.6.2',
92
92
  '@types/react': '^19.2.14',
93
93
  '@types/react-dom': '^19.0.0',
94
- '@next/third-parties': '^16.2.5',
94
+ '@next/third-parties': '^16.2.6',
95
95
  };
96
96
  /**
97
97
  * Generate a hash of REQUIRED_DEPS to detect when dependencies change.
@@ -232,6 +232,33 @@ async function withInstallLock(depsDir, verbose, fn) {
232
232
  catch { /* ignore */ }
233
233
  }
234
234
  }
235
+ /**
236
+ * Reasons a reinstall might be triggered. Exported so the width-budget
237
+ * test in __tests__/unit/deps.test.ts can derive the worst-case spinner
238
+ * text from the same source production uses — locking the test to the
239
+ * actual constants prevents the "test asserts against its own copy" trap
240
+ * we'd otherwise have. Keep these terse and actionable: each value feeds
241
+ * directly into user-facing spinner text via `Updating dependencies (...)`.
242
+ */
243
+ export const REINSTALL_REASONS = {
244
+ firstRun: 'first-run install',
245
+ depsChanged: 'deps changed',
246
+ // Kept brief intentionally: this value feeds directly into spinner text
247
+ // and combined with SLOW_HINT_SUFFIX must stay ≤ 78 cols.
248
+ // 'install is incomplete (missing critical packages)' (49 chars) was the
249
+ // original but exceeded the column budget — see width-budget test in
250
+ // src/__tests__/unit/deps.test.ts.
251
+ incomplete: 'install is incomplete',
252
+ unreadable: 'package.json unreadable',
253
+ };
254
+ /**
255
+ * Suffix appended to the install spinner text after `runWithSlowHint`'s
256
+ * 15-second threshold. Width budget: combined with the longest reason in
257
+ * `REINSTALL_REASONS` this string must keep the total spinner text ≤ 78
258
+ * chars (80 cols minus glyph + space). See plan
259
+ * docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
260
+ */
261
+ export const SLOW_HINT_SUFFIX = ' (~1 min on first install)';
235
262
  /**
236
263
  * Returns the reason a reinstall is needed, or `null` if the existing
237
264
  * install is healthy. Non-null strings feed directly into user-facing
@@ -240,7 +267,7 @@ async function withInstallLock(depsDir, verbose, fn) {
240
267
  async function checkInstallReinstallReason(depsDir) {
241
268
  const packageJsonPath = path.join(depsDir, 'package.json');
242
269
  if (!fs.existsSync(packageJsonPath))
243
- return 'first-run install';
270
+ return REINSTALL_REASONS.firstRun;
244
271
  try {
245
272
  const pkg = await fs.readJson(packageJsonPath);
246
273
  // _depsHash is the precise reinstall trigger — it's an MD5 of
@@ -250,15 +277,15 @@ async function checkInstallReinstallReason(depsDir) {
250
277
  // with "deps need reinstalling" forced a 30s npm ci on every patch
251
278
  // release. The marker is still WRITTEN post-install for debugging.
252
279
  if (pkg._depsHash !== getDepsHash())
253
- return 'deps changed';
280
+ return REINSTALL_REASONS.depsChanged;
254
281
  // N stat calls — only pay this once the hash already matches.
255
282
  if (!(await verifyCriticalPackagesInstalled(depsDir))) {
256
- return 'install is incomplete (missing critical packages)';
283
+ return REINSTALL_REASONS.incomplete;
257
284
  }
258
285
  return null;
259
286
  }
260
287
  catch {
261
- return 'package.json unreadable';
288
+ return REINSTALL_REASONS.unreadable;
262
289
  }
263
290
  }
264
291
  export async function ensureDependencies(verbose, overrideDepsDir) {
@@ -271,12 +298,21 @@ export async function ensureDependencies(verbose, overrideDepsDir) {
271
298
  output.info('Dependencies already installed');
272
299
  return depsNodeModulesDir;
273
300
  }
274
- if (verbose)
275
- output.info(`Updating dependencies (${initialReason})`);
301
+ // INVARIANT: from this point on, ensureDependencies (and any function it
302
+ // calls) MUST NOT print via output.* / console.* while the install
303
+ // spinner is live. Those writes are plain console.log under the hood
304
+ // and interleave with ora's 80ms-cadence redraw, producing the visible
305
+ // "flash" symptom. Callers may safely print AFTER ensureDependencies
306
+ // returns. The pre-2026-05-08 code printed the reinstall reason here
307
+ // via output.info before entering withInstallLock, which is exactly
308
+ // what this invariant exists to forbid. The reason now lives inside
309
+ // the install-spinner's initial text — see runInstall below and plan
310
+ // docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
276
311
  await fs.ensureDir(depsDir);
277
312
  return withInstallLock(depsDir, verbose, async () => {
278
313
  // Re-check after acquiring the lock — a peer install may have wiped +
279
- // rewritten node_modules while we waited.
314
+ // rewritten node_modules while we waited. The fresh reason is what
315
+ // gets shown to the user, so it always reflects the actual cause.
280
316
  const reason = await checkInstallReinstallReason(depsDir);
281
317
  if (reason === null) {
282
318
  if (verbose) {
@@ -284,7 +320,7 @@ export async function ensureDependencies(verbose, overrideDepsDir) {
284
320
  }
285
321
  return depsNodeModulesDir;
286
322
  }
287
- return runInstall(depsDir, verbose);
323
+ return runInstall(depsDir, verbose, reason);
288
324
  });
289
325
  }
290
326
  /**
@@ -303,15 +339,20 @@ function looksLikeLockfileDrift(stderr) {
303
339
  /Missing:.*from lock file/i.test(stderr) ||
304
340
  /lock file'?s?\s.*does not satisfy/i.test(stderr));
305
341
  }
306
- async function runInstall(depsDir, verbose) {
342
+ async function runInstall(depsDir, verbose, reason) {
307
343
  const depsNodeModulesDir = path.join(depsDir, 'node_modules');
308
344
  const packageJsonPath = path.join(depsDir, 'package.json');
309
345
  // Direct check — "first run" means no pre-existing marker file. Corrupt
310
346
  // package.json falls through as "Updating..." since the file already exists.
311
347
  const isFirstRun = !fs.existsSync(packageJsonPath);
348
+ // Fold the reinstall reason into the spinner text so all users (not just
349
+ // verbose) see the cause. Previously the reason was printed via
350
+ // output.info BEFORE the spinner, which interleaved console.log with
351
+ // ora's render — see plan
352
+ // docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
312
353
  const baseSpinText = isFirstRun
313
- ? 'Installing dependencies (first run only)'
314
- : 'Updating dependencies';
354
+ ? 'Installing dependencies'
355
+ : `Updating dependencies (${reason})`;
315
356
  const spin = spinner(`${baseSpinText}...`);
316
357
  // Shared shape for both the pre-install and post-install writes. The
317
358
  // version/hash marker fields are added ONLY in the post-install write —
@@ -378,9 +419,18 @@ async function runInstall(depsDir, verbose) {
378
419
  // (scripts/generate-workspace-lockfile.js) guarantees sync, and
379
420
  // the verify:workspace-lockfile pre-commit hook + CI job guard
380
421
  // against drift.
422
+ //
423
+ // stdio: 'pipe' is hard-coded (NOT verbose-conditional). With
424
+ // 'inherit', npm's lifecycle scripts (postinstall hooks for next,
425
+ // sharp, esbuild, etc.) print directly to the terminal and push the
426
+ // ora spinner down a row on every emission — visually this looks
427
+ // like the spinner is "flashing." Piping + an explicit
428
+ // logAboveSpinner stream keeps verbose output visible AND keeps the
429
+ // spinner stable beneath it. See plan
430
+ // docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
381
431
  const npmInstall = spawn('npm', ['ci', '--no-audit', '--no-fund', '--loglevel=error'], {
382
432
  cwd: depsDir,
383
- stdio: verbose ? 'inherit' : 'pipe',
433
+ stdio: 'pipe',
384
434
  ...(isWindows ? { shell: true } : {}),
385
435
  });
386
436
  // 5 minute timeout
@@ -388,15 +438,54 @@ async function runInstall(depsDir, verbose) {
388
438
  npmInstall.kill('SIGKILL');
389
439
  reject(new Error('npm ci timed out after 5 minutes'));
390
440
  }, 300000);
391
- // Capture stderr for better error messages
441
+ // Always capture stderr for error messages. When verbose, ALSO stream
442
+ // both stdout and stderr above the live spinner so the user sees what
443
+ // npm is doing without disturbing ora's render.
444
+ //
445
+ // Per-stream line buffer: npm output arrives in arbitrary chunks that
446
+ // can split mid-line. Holding the trailing partial in `buf` until the
447
+ // next chunk completes it (with `\n`) prevents broken-up rows in the
448
+ // verbose output. The final partial (if any) is flushed on `close` so
449
+ // the most-diagnostic last line never goes missing on crash paths.
450
+ //
451
+ // The `?.` on `npmInstall.stderr?.on(...)` and `npmInstall.stdout?.on(...)`
452
+ // is load-bearing: at least one test (the ENOENT error path) provides
453
+ // an inline mock with no stdout EventEmitter. Removing the chaining
454
+ // breaks that test at runtime.
392
455
  let stderrOutput = '';
393
- if (!verbose && npmInstall.stderr) {
394
- npmInstall.stderr.on('data', (data) => {
395
- stderrOutput += data.toString();
396
- });
397
- }
456
+ let stderrBuf = '';
457
+ let stdoutBuf = '';
458
+ const handleData = (chunk, isStderr) => {
459
+ const text = chunk.toString();
460
+ if (isStderr)
461
+ stderrOutput += text;
462
+ const combined = (isStderr ? stderrBuf : stdoutBuf) + text;
463
+ const parts = combined.split('\n');
464
+ const trailing = parts.pop() ?? '';
465
+ if (verbose) {
466
+ for (const line of parts)
467
+ logAboveSpinner(line);
468
+ }
469
+ if (isStderr)
470
+ stderrBuf = trailing;
471
+ else
472
+ stdoutBuf = trailing;
473
+ };
474
+ const flushBuffers = () => {
475
+ if (verbose) {
476
+ if (stderrBuf.length > 0)
477
+ logAboveSpinner(stderrBuf);
478
+ if (stdoutBuf.length > 0)
479
+ logAboveSpinner(stdoutBuf);
480
+ }
481
+ stderrBuf = '';
482
+ stdoutBuf = '';
483
+ };
484
+ npmInstall.stderr?.on('data', (data) => handleData(data, true));
485
+ npmInstall.stdout?.on('data', (data) => handleData(data, false));
398
486
  npmInstall.on('close', (code) => {
399
487
  clearTimeout(timeout);
488
+ flushBuffers();
400
489
  if (code === 0) {
401
490
  resolve();
402
491
  return;
@@ -414,11 +503,16 @@ async function runInstall(depsDir, verbose) {
414
503
  reject(err);
415
504
  });
416
505
  });
417
- // Update the spinner text after 15s with a "may take up to a minute"
418
- // hint first-run npm ci on a cold cache is the long-tail slow path
419
- // most likely to surprise users post-upgrade.
506
+ // Update the spinner text after 15s with a slow-install hint. Combined
507
+ // with the longest reason in REINSTALL_REASONS, it must fit in 78 cols
508
+ // (80 minus glyph + space) so ora doesn't wrap-and-flicker on standard
509
+ // terminals. Test guard:
510
+ // src/__tests__/unit/deps.test.ts > 'slow-hint text fits in 78 columns'
511
+ // imports both this constant and REINSTALL_REASONS to catch edits that
512
+ // blow past the budget. See plan
513
+ // docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
420
514
  await runWithSlowHint(15000, () => {
421
- spin.text = `${baseSpinText} (may take up to a minute on first run, then cached)...`;
515
+ spin.text = `${baseSpinText}${SLOW_HINT_SUFFIX}...`;
422
516
  }, npmCi);
423
517
  // Write the marker only after install reports success AND the integrity
424
518
  // check agrees. Belt-and-braces: if npm lies about exit code, we still
@@ -1 +1 @@
1
- {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/lib/deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/lib/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Picks which `<lang>/` directories under projectDir to keep as workspace
3
+ * symlinks and which to skip. Skipping non-active language directories
4
+ * shrinks Turbopack's filesystem scan and dropped cold compile from ~67s
5
+ * to ~12s on jamdesk-docs (commit 90d781b4).
6
+ *
7
+ * The dev server still reads content from the user's source tree via
8
+ * JAMDESK_PROJECTS_DIR, so the language picker keeps showing every
9
+ * language and clicks always 200 OK — the workspace symlinks are a
10
+ * Turbopack-only performance layer.
11
+ *
12
+ * Default rules:
13
+ * 1. Language with `default: true`
14
+ * 2. First language in `navigation.languages[]`
15
+ */
16
+ export interface LanguageFilter {
17
+ active: string | null;
18
+ skip: Set<string>;
19
+ }
20
+ interface NavigationLanguageEntry {
21
+ language?: string;
22
+ default?: boolean;
23
+ }
24
+ interface MinimalConfig {
25
+ navigation?: {
26
+ languages?: NavigationLanguageEntry[];
27
+ };
28
+ }
29
+ export declare function getActiveLanguageFilter(config: MinimalConfig): LanguageFilter;
30
+ export {};
31
+ //# sourceMappingURL=language-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-filter.d.ts","sourceRoot":"","sources":["../../src/lib/language-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnB;AAED,UAAU,uBAAuB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE;QACX,SAAS,CAAC,EAAE,uBAAuB,EAAE,CAAC;KACvC,CAAC;CACH;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAc7E"}
@@ -0,0 +1,14 @@
1
+ export function getActiveLanguageFilter(config) {
2
+ const validEntries = (config.navigation?.languages ?? []).filter((l) => typeof l.language === 'string');
3
+ if (validEntries.length === 0) {
4
+ return { active: null, skip: new Set() };
5
+ }
6
+ const codes = validEntries.map((l) => l.language);
7
+ const active = validEntries.find((l) => l.default)?.language ?? validEntries[0].language;
8
+ if (codes.length === 1) {
9
+ return { active, skip: new Set() };
10
+ }
11
+ const skip = new Set(codes.filter((c) => c !== active));
12
+ return { active, skip };
13
+ }
14
+ //# sourceMappingURL=language-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-filter.js","sourceRoot":"","sources":["../../src/lib/language-filter.ts"],"names":[],"mappings":"AA+BA,MAAM,UAAU,uBAAuB,CAAC,MAAqB;IAC3D,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAC9D,CAAC,CAAC,EAAgD,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CACpF,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IACnD,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -1,4 +1,28 @@
1
1
  import { type Ora } from 'ora';
2
+ export type { Ora };
2
3
  export declare function spinner(text: string): Ora;
3
4
  export declare function stopSpinner(): void;
5
+ /**
6
+ * Print `line` above any active ora spinner without garbling its render.
7
+ *
8
+ * On a TTY, ora 9.x's `start()` installs a `process.stdout.write`
9
+ * interceptor (`#hookedWrite` in ora/index.js) that automatically runs
10
+ * `clear()` → `originalWrite()` → `render()` for every external write
11
+ * while the spinner is active. So a bare `process.stdout.write` is the
12
+ * RIGHT way to log around a live spinner — the hook does the cursor
13
+ * dance correctly. Adding our own explicit `clear()` / `render()` on
14
+ * top of the hook causes runaway cursor churn (verified in Task 9
15
+ * smoke: 1.2 GB of redundant escape sequences in 5 minutes during
16
+ * npm ci). See plan
17
+ * docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
18
+ *
19
+ * In non-TTY environments (CI, log redirection, vitest's child runner)
20
+ * ora's `isEnabled` is `false`, so no hook is installed and the bare
21
+ * write goes through directly. Same code, both paths.
22
+ *
23
+ * Empty lines are skipped — npm output streams arrive in chunks that
24
+ * often end in `\n`, producing a trailing empty token after `split('\n')`
25
+ * that we don't want to emit as a blank row.
26
+ */
27
+ export declare function logAboveSpinner(line: string): void;
4
28
  //# sourceMappingURL=spinner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAIpC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAMzC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAKlC"}
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAMpC,YAAY,EAAE,GAAG,EAAE,CAAC;AAoBpB,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAsBzC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAKlC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGlD"}
@@ -1,9 +1,41 @@
1
1
  import ora from 'ora';
2
+ // Singleton spinner state. The contract enforced by `spinner()` below is
3
+ // "stop the previous one (silently — no checkmark) and start a new one." That
4
+ // is intentional: it lets `runInstall` in deps.ts seamlessly transition from
5
+ // "Checking dependencies..." into "Updating dependencies (...)..." without
6
+ // the caller having to know about it.
7
+ //
8
+ // The trap this comment exists to prevent: callers MUST NOT keep a reference
9
+ // to the value returned by `spinner()` across an `await` that re-enters
10
+ // `spinner()` (directly or indirectly). Doing so leaves the caller holding a
11
+ // dead reference whose `.succeed()` / `.fail()` calls land on the WRONG ora
12
+ // instance — typically one already stopped, which silently no-ops the
13
+ // status update. Pre-2026-05-08 dev.ts had exactly this bug across the
14
+ // `await ensureDependencies(...)` boundary; see plan
15
+ // docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
16
+ //
17
+ // If you need to log around an active spinner, use `logAboveSpinner` below.
2
18
  let currentSpinner = null;
3
19
  export function spinner(text) {
4
20
  if (currentSpinner) {
5
21
  currentSpinner.stop();
6
22
  }
23
+ // Guard against PTY environments (e.g. `script -q`) that report
24
+ // process.stdout.columns = 0. Ora 9.x uses columns in
25
+ // #computeLineCountFrom: `Math.ceil(width / columns)`. When columns
26
+ // is 0, this evaluates to Infinity, setting #linesToClear = Infinity
27
+ // and causing an infinite clear loop that emits gigabytes of
28
+ // `ESC[1A ESC[0K` sequences. The `?? 80` fallback in ora only fires
29
+ // for null/undefined — 0 falls through. We clamp to 80 here so the
30
+ // spinner is always safe. This path is hit in `script -q` / any PTY
31
+ // tool that initialises column width to 0 before SIGWINCH fires.
32
+ if (process.stdout.columns === 0) {
33
+ Object.defineProperty(process.stdout, 'columns', {
34
+ value: 80,
35
+ writable: true,
36
+ configurable: true,
37
+ });
38
+ }
7
39
  currentSpinner = ora(text).start();
8
40
  return currentSpinner;
9
41
  }
@@ -13,4 +45,31 @@ export function stopSpinner() {
13
45
  currentSpinner = null;
14
46
  }
15
47
  }
48
+ /**
49
+ * Print `line` above any active ora spinner without garbling its render.
50
+ *
51
+ * On a TTY, ora 9.x's `start()` installs a `process.stdout.write`
52
+ * interceptor (`#hookedWrite` in ora/index.js) that automatically runs
53
+ * `clear()` → `originalWrite()` → `render()` for every external write
54
+ * while the spinner is active. So a bare `process.stdout.write` is the
55
+ * RIGHT way to log around a live spinner — the hook does the cursor
56
+ * dance correctly. Adding our own explicit `clear()` / `render()` on
57
+ * top of the hook causes runaway cursor churn (verified in Task 9
58
+ * smoke: 1.2 GB of redundant escape sequences in 5 minutes during
59
+ * npm ci). See plan
60
+ * docs/plans/2026-05-08-cli-deps-spinner-flashing-fix.md.
61
+ *
62
+ * In non-TTY environments (CI, log redirection, vitest's child runner)
63
+ * ora's `isEnabled` is `false`, so no hook is installed and the bare
64
+ * write goes through directly. Same code, both paths.
65
+ *
66
+ * Empty lines are skipped — npm output streams arrive in chunks that
67
+ * often end in `\n`, producing a trailing empty token after `split('\n')`
68
+ * that we don't want to emit as a blank row.
69
+ */
70
+ export function logAboveSpinner(line) {
71
+ if (line.length === 0)
72
+ return;
73
+ process.stdout.write(`${line}\n`);
74
+ }
16
75
  //# sourceMappingURL=spinner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAiB,MAAM,KAAK,CAAC;AAEpC,IAAI,cAAc,GAAe,IAAI,CAAC;AAEtC,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IACD,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,IAAI,EAAE,CAAC;QACtB,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAiB,MAAM,KAAK,CAAC;AAQpC,yEAAyE;AACzE,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,sCAAsC;AACtC,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAC5E,sEAAsE;AACtE,uEAAuE;AACvE,qDAAqD;AACrD,0DAA0D;AAC1D,EAAE;AACF,4EAA4E;AAC5E,IAAI,cAAc,GAAe,IAAI,CAAC;AAEtC,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IACD,gEAAgE;IAChE,sDAAsD;IACtD,oEAAoE;IACpE,qEAAqE;IACrE,6DAA6D;IAC7D,oEAAoE;IACpE,mEAAmE;IACnE,oEAAoE;IACpE,iEAAiE;IACjE,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;YAC/C,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;IACD,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,IAAI,EAAE,CAAC;QACtB,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACpC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jamdesk",
3
- "version": "1.1.75",
3
+ "version": "1.1.77",
4
4
  "description": "CLI for Jamdesk — build, preview, and deploy documentation sites from MDX. Dev server with hot reload, 50+ components, OpenAPI support, AI search, and Mintlify migration",
5
5
  "keywords": [
6
6
  "jamdesk",
@@ -115,12 +115,12 @@
115
115
  "nspell": "^2.1.5",
116
116
  "open": "^11.0.0",
117
117
  "ora": "^9.4.0",
118
- "tar": "^7.5.14"
118
+ "tar": "^7.5.15"
119
119
  },
120
120
  "devDependencies": {
121
121
  "@mdx-js/mdx": "^3.1.1",
122
122
  "@types/fs-extra": "^11.0.0",
123
- "@types/node": "^25.5.0",
123
+ "@types/node": "^25.6.2",
124
124
  "typescript": "^6.0.2",
125
125
  "vitest": "^4.1.5"
126
126
  },
@@ -4,6 +4,7 @@
4
4
  // `/[project]/...` URLs without middleware involvement (used by tests and
5
5
  // non-ISR local dev). The render body lives in lib/render-doc-page.tsx.
6
6
  import { headers } from 'next/headers';
7
+ import { after } from 'next/server';
7
8
  import fs from 'fs';
8
9
  import path from 'path';
9
10
  import type { Metadata } from 'next';
@@ -14,6 +15,7 @@ import {
14
15
  getHostAtDocs,
15
16
  } from '@/lib/content-loader';
16
17
  import { renderDocPage, buildDocMetadata, type RenderInput } from '@/lib/render-doc-page';
18
+ import { withR2OpsContext, emitR2OpsSummary } from '@/lib/r2-content';
17
19
  import { readFileSync as readMdxFile } from '@/lib/fs-readfile';
18
20
 
19
21
  export const dynamic = 'force-dynamic';
@@ -195,11 +197,17 @@ async function resolveInput(params: PageProps['params']): Promise<RenderInput> {
195
197
  }
196
198
 
197
199
  export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
198
- const input = await resolveInput(params);
199
- return buildDocMetadata(input);
200
+ return withR2OpsContext(async () => {
201
+ const input = await resolveInput(params);
202
+ after(() => emitR2OpsSummary(input.projectSlug, 'page-metadata'));
203
+ return buildDocMetadata(input);
204
+ });
200
205
  }
201
206
 
202
207
  export default async function DocPage({ params }: PageProps) {
203
- const input = await resolveInput(params);
204
- return renderDocPage(input);
208
+ return withR2OpsContext(async () => {
209
+ const input = await resolveInput(params);
210
+ after(() => emitR2OpsSummary(input.projectSlug, 'page-render'));
211
+ return renderDocPage(input);
212
+ });
205
213
  }
@@ -7,6 +7,7 @@
7
7
  // producing the visible flash + next-themes script-tag warnings.
8
8
  import type { Metadata } from 'next';
9
9
  import { headers } from 'next/headers';
10
+ import { after } from 'next/server';
10
11
  import './globals.css';
11
12
  import { getDocsConfig } from '@/lib/docs';
12
13
  import { getDocsConfig as getIsrDocsConfig } from '@/lib/docs-isr';
@@ -19,10 +20,10 @@ import {
19
20
  import { isRTLLanguage, resolveLanguageWithFallback } from '@/lib/language-utils';
20
21
  import type { DocsConfig } from '@/lib/docs-types';
21
22
  import { buildSiteTitle, getFaviconPath, FALLBACK_METADATA } from '@/lib/seo';
22
- import { fetchCustomCss, fetchCustomJs } from '@/lib/r2-content';
23
- import { DocsChrome, getLocalFileContent } from '@/lib/layout-helpers';
23
+ import { withR2OpsContext, emitR2OpsSummary } from '@/lib/r2-content';
24
+ import { DocsChrome, getLocalFileContent, loadCustomAssets } from '@/lib/layout-helpers';
24
25
 
25
- export async function generateMetadata(): Promise<Metadata> {
26
+ async function generateMetadataImpl(): Promise<Metadata> {
26
27
  // The placeholder shell would otherwise render with the paused
27
28
  // project's title/favicon (and pay an R2 round-trip for it) — the
28
29
  // nested (jd-system)/jd-inactive layout supplies neutral metadata.
@@ -32,6 +33,11 @@ export async function generateMetadata(): Promise<Metadata> {
32
33
  return {robots: {index: false, follow: false}};
33
34
  }
34
35
  }
36
+
37
+ // No-op when no R2 ops happened (incl. flag-off path) — paths that do no
38
+ // R2 work simply log nothing.
39
+ after(() => emitR2OpsSummary(null, 'layout-metadata'));
40
+
35
41
  let config: DocsConfig;
36
42
  if (isIsrMode()) {
37
43
  const headersList = await headers();
@@ -60,7 +66,11 @@ export async function generateMetadata(): Promise<Metadata> {
60
66
  };
61
67
  }
62
68
 
63
- export default async function RootLayout({
69
+ export async function generateMetadata(): Promise<Metadata> {
70
+ return withR2OpsContext(() => generateMetadataImpl());
71
+ }
72
+
73
+ async function rootLayoutImpl({
64
74
  children,
65
75
  }: {
66
76
  children: React.ReactNode;
@@ -158,12 +168,11 @@ export default async function RootLayout({
158
168
  let customCss: string | null = null;
159
169
  let customJs: string | null = null;
160
170
  if (isIsr && resolvedProjectSlug) {
161
- if (config._hasCustomCss) {
162
- customCss = await fetchCustomCss(resolvedProjectSlug);
163
- }
164
- if (config._hasCustomJs) {
165
- customJs = await fetchCustomJs(resolvedProjectSlug);
166
- }
171
+ ({ customCss, customJs } = await loadCustomAssets({
172
+ projectSlug: resolvedProjectSlug,
173
+ hasCustomCss: !!config._hasCustomCss,
174
+ hasCustomJs: !!config._hasCustomJs,
175
+ }));
167
176
  } else {
168
177
  customCss = getLocalFileContent('custom.css');
169
178
  customJs = getLocalFileContent('custom.js');
@@ -173,6 +182,8 @@ export default async function RootLayout({
173
182
  const lang = getLanguageFromRequest(headersList) ?? projectDefaultLang;
174
183
  const dir = isRTLLanguage(lang) ? 'rtl' : undefined;
175
184
 
185
+ after(() => emitR2OpsSummary(resolvedProjectSlug, 'layout-render'));
186
+
176
187
  return (
177
188
  <DocsChrome
178
189
  config={config}
@@ -187,3 +198,7 @@ export default async function RootLayout({
187
198
  </DocsChrome>
188
199
  );
189
200
  }
201
+
202
+ export default async function RootLayout(props: { children: React.ReactNode }) {
203
+ return withR2OpsContext(() => rootLayoutImpl(props));
204
+ }