jamdesk 1.1.24 → 1.1.26

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 (31) hide show
  1. package/dist/__tests__/integration/validate.integration.test.js +40 -1
  2. package/dist/__tests__/integration/validate.integration.test.js.map +1 -1
  3. package/dist/__tests__/unit/deps.test.js +142 -6
  4. package/dist/__tests__/unit/deps.test.js.map +1 -1
  5. package/dist/__tests__/unit/templates-consistency.test.d.ts +2 -0
  6. package/dist/__tests__/unit/templates-consistency.test.d.ts.map +1 -0
  7. package/dist/__tests__/unit/templates-consistency.test.js +19 -0
  8. package/dist/__tests__/unit/templates-consistency.test.js.map +1 -0
  9. package/dist/__tests__/unit/windows-ci-diagnosis.test.d.ts +2 -0
  10. package/dist/__tests__/unit/windows-ci-diagnosis.test.d.ts.map +1 -0
  11. package/dist/__tests__/unit/windows-ci-diagnosis.test.js +132 -0
  12. package/dist/__tests__/unit/windows-ci-diagnosis.test.js.map +1 -0
  13. package/dist/commands/validate.d.ts.map +1 -1
  14. package/dist/commands/validate.js +9 -6
  15. package/dist/commands/validate.js.map +1 -1
  16. package/dist/lib/deps.d.ts +1 -0
  17. package/dist/lib/deps.d.ts.map +1 -1
  18. package/dist/lib/deps.js +209 -45
  19. package/dist/lib/deps.js.map +1 -1
  20. package/dist/lib/navigation-validator.d.ts +39 -17
  21. package/dist/lib/navigation-validator.d.ts.map +1 -1
  22. package/dist/lib/navigation-validator.js +65 -36
  23. package/dist/lib/navigation-validator.js.map +1 -1
  24. package/package.json +4 -1
  25. package/vendored/lib/docs-types.ts +14 -4
  26. package/vendored/lib/extract-highlights.ts +2 -2
  27. package/vendored/lib/validate-config.ts +118 -13
  28. package/vendored/schema/docs-schema.json +0 -3
  29. package/vendored/shared/navigation-validator.ts +103 -53
  30. package/vendored/shared/status-reporter.ts +1 -1
  31. package/vendored/workspace-package-lock.json +6735 -0
package/dist/lib/deps.js CHANGED
@@ -9,6 +9,7 @@ import { spawn } from 'child_process';
9
9
  import crypto from 'crypto';
10
10
  import fs from 'fs-extra';
11
11
  import path from 'path';
12
+ import { fileURLToPath } from 'url';
12
13
  import { homedir } from 'os';
13
14
  import { output } from './output.js';
14
15
  import { spinner } from './spinner.js';
@@ -16,8 +17,11 @@ import { createRequire } from 'module';
16
17
  const require = createRequire(import.meta.url);
17
18
  const cliPackage = require('../../package.json');
18
19
  const JAMDESK_DIR = path.join(homedir(), '.jamdesk');
19
- // Match build-service versions exactly
20
- const REQUIRED_DEPS = {
20
+ // Match build-service versions exactly.
21
+ // Exported so the workspace-lockfile generator script
22
+ // (scripts/generate-workspace-lockfile.js) can read the canonical map from
23
+ // compiled dist/lib/deps.js instead of re-parsing the TypeScript source.
24
+ export const REQUIRED_DEPS = {
21
25
  // Next.js and React
22
26
  'next': '16.2.3',
23
27
  // OpenAPI validation (for API reference docs)
@@ -139,43 +143,168 @@ export async function verifyCriticalPackagesInstalled(depsDir) {
139
143
  }
140
144
  return true;
141
145
  }
142
- export async function ensureDependencies(verbose, overrideDepsDir) {
143
- const depsDir = overrideDepsDir || JAMDESK_DIR;
144
- const depsNodeModulesDir = path.join(depsDir, 'node_modules');
145
- const packageJsonPath = path.join(depsDir, 'package.json');
146
- const CLI_VERSION = cliPackage.version;
147
- const DEPS_HASH = getDepsHash();
148
- // Check if deps are already installed with matching version AND deps hash
149
- // AND a healthy node_modules (the integrity check). Each branch below lines
150
- // up with one of the three reinstall triggers, in the order they're checked.
151
- if (fs.existsSync(packageJsonPath)) {
146
+ /**
147
+ * File-based lock to serialize ensureDependencies across concurrent jamdesk
148
+ * invocations. `npm ci` deletes and rewrites node_modules, so two overlapping
149
+ * runs can corrupt each other's trees AND both write "success" markers
150
+ * against a partially-corrupted state — the same silent-corruption class
151
+ * the integrity check was supposed to fix.
152
+ *
153
+ * Stale locks (older than INSTALL_LOCK_STALE_MS) are bypassed on the
154
+ * assumption that the holding process crashed. The 10-minute bound is a
155
+ * safe upper bound for `npm ci` (5-minute spawn timeout) plus slack for
156
+ * slow CI runners and post-install integrity checks.
157
+ */
158
+ const INSTALL_LOCK_FILE = '.install.lock';
159
+ const INSTALL_LOCK_STALE_MS = 10 * 60 * 1000;
160
+ const INSTALL_LOCK_POLL_MS = 150;
161
+ const INSTALL_LOCK_HEARTBEAT_MS = 60 * 1000;
162
+ async function withInstallLock(depsDir, verbose, fn) {
163
+ const lockPath = path.join(depsDir, INSTALL_LOCK_FILE);
164
+ let notifiedWait = false;
165
+ while (true) {
152
166
  try {
153
- const pkg = await fs.readJson(packageJsonPath);
154
- let reinstallReason = null;
155
- if (pkg._jamdeskVersion !== CLI_VERSION) {
156
- reinstallReason = `CLI version changed: ${pkg._jamdeskVersion}${CLI_VERSION}`;
167
+ // `wx`: O_CREAT | O_EXCL — atomic create-or-fail. Cross-platform.
168
+ const fd = fs.openSync(lockPath, 'wx');
169
+ try {
170
+ fs.writeSync(fd, `${process.pid}\n${Date.now()}\n`);
171
+ }
172
+ finally {
173
+ fs.closeSync(fd);
157
174
  }
158
- else if (pkg._depsHash !== DEPS_HASH) {
159
- reinstallReason = 'deps changed';
175
+ break;
176
+ }
177
+ catch (err) {
178
+ const code = err.code;
179
+ if (code !== 'EEXIST')
180
+ throw err;
181
+ // Another process holds the lock. Check staleness before waiting.
182
+ let stat;
183
+ try {
184
+ stat = fs.statSync(lockPath);
160
185
  }
161
- else if (!(await verifyCriticalPackagesInstalled(depsDir))) {
162
- // Only pay for the integrity check (N stat calls) when version+hash
163
- // already agree — otherwise we short-circuit into reinstall above.
164
- reinstallReason = 'install is incomplete (missing critical packages)';
186
+ catch {
187
+ // Lock disappeared between openSync and statSync; retry immediately.
188
+ continue;
165
189
  }
166
- if (reinstallReason === null) {
190
+ if (Date.now() - stat.mtimeMs > INSTALL_LOCK_STALE_MS) {
167
191
  if (verbose)
168
- output.info('Dependencies already installed');
169
- return depsNodeModulesDir;
192
+ output.warn('Removing stale install lock');
193
+ try {
194
+ fs.unlinkSync(lockPath);
195
+ }
196
+ catch { /* ignore */ }
197
+ continue;
198
+ }
199
+ if (!notifiedWait && verbose) {
200
+ output.info('Another jamdesk process is installing dependencies; waiting...');
201
+ notifiedWait = true;
170
202
  }
171
- if (verbose)
172
- output.info(`Updating dependencies (${reinstallReason})`);
203
+ await new Promise((r) => setTimeout(r, INSTALL_LOCK_POLL_MS));
204
+ }
205
+ }
206
+ // Heartbeat: bump mtime every minute so a slow-but-live install isn't
207
+ // declared stale by a peer waiter. unref() so we don't pin the event
208
+ // loop if the caller abandons the promise.
209
+ const heartbeat = setInterval(() => {
210
+ try {
211
+ const now = new Date();
212
+ fs.utimesSync(lockPath, now, now);
173
213
  }
174
214
  catch {
175
- // Invalid package.json, will reinstall
215
+ // Lock file gone (unlinked early by a buggy peer, or filesystem
216
+ // eviction); no recovery needed — we'll release in the finally.
217
+ }
218
+ }, INSTALL_LOCK_HEARTBEAT_MS);
219
+ heartbeat.unref();
220
+ try {
221
+ return await fn();
222
+ }
223
+ finally {
224
+ clearInterval(heartbeat);
225
+ try {
226
+ fs.unlinkSync(lockPath);
227
+ }
228
+ catch { /* ignore */ }
229
+ }
230
+ }
231
+ /**
232
+ * Returns the reason a reinstall is needed, or `null` if the existing
233
+ * install is healthy. Non-null strings feed directly into user-facing
234
+ * spinner text — keep them terse and actionable.
235
+ */
236
+ async function checkInstallReinstallReason(depsDir) {
237
+ const packageJsonPath = path.join(depsDir, 'package.json');
238
+ if (!fs.existsSync(packageJsonPath))
239
+ return 'first-run install';
240
+ try {
241
+ const pkg = await fs.readJson(packageJsonPath);
242
+ if (pkg._jamdeskVersion !== cliPackage.version) {
243
+ return `CLI version changed: ${pkg._jamdeskVersion} → ${cliPackage.version}`;
176
244
  }
245
+ if (pkg._depsHash !== getDepsHash())
246
+ return 'deps changed';
247
+ // N stat calls — only pay this once version+hash already match.
248
+ if (!(await verifyCriticalPackagesInstalled(depsDir))) {
249
+ return 'install is incomplete (missing critical packages)';
250
+ }
251
+ return null;
252
+ }
253
+ catch {
254
+ return 'package.json unreadable';
255
+ }
256
+ }
257
+ export async function ensureDependencies(verbose, overrideDepsDir) {
258
+ const depsDir = overrideDepsDir || JAMDESK_DIR;
259
+ const depsNodeModulesDir = path.join(depsDir, 'node_modules');
260
+ // Fast path: skip lock acquisition when already up-to-date.
261
+ const initialReason = await checkInstallReinstallReason(depsDir);
262
+ if (initialReason === null) {
263
+ if (verbose)
264
+ output.info('Dependencies already installed');
265
+ return depsNodeModulesDir;
177
266
  }
178
- const spin = spinner('Installing dependencies (first run only)...');
267
+ if (verbose)
268
+ output.info(`Updating dependencies (${initialReason})`);
269
+ await fs.ensureDir(depsDir);
270
+ return withInstallLock(depsDir, verbose, async () => {
271
+ // Re-check after acquiring the lock — a peer install may have wiped +
272
+ // rewritten node_modules while we waited.
273
+ const reason = await checkInstallReinstallReason(depsDir);
274
+ if (reason === null) {
275
+ if (verbose) {
276
+ output.info('Dependencies were installed by another jamdesk process');
277
+ }
278
+ return depsNodeModulesDir;
279
+ }
280
+ return runInstall(depsDir, verbose);
281
+ });
282
+ }
283
+ /**
284
+ * Detect the shape of an `npm ci` drift error — the shipped workspace
285
+ * lockfile is out of sync with REQUIRED_DEPS. Surfacing a reinstall hint
286
+ * turns a wall of npm boilerplate into one actionable instruction.
287
+ *
288
+ * Each pattern targets a specific drift message npm prints. We deliberately
289
+ * do NOT match bare `EUSAGE` (the generic usage-error code) because it can
290
+ * also fire on unrelated npm misuse; matching only the drift-specific
291
+ * phrases avoids telling users to reinstall when the real error is e.g.
292
+ * a missing CLI flag.
293
+ */
294
+ function looksLikeLockfileDrift(stderr) {
295
+ return (/can only install packages when your package\.json and package-lock\.json/i.test(stderr) ||
296
+ /Missing:.*from lock file/i.test(stderr) ||
297
+ /lock file'?s?\s.*does not satisfy/i.test(stderr));
298
+ }
299
+ async function runInstall(depsDir, verbose) {
300
+ const depsNodeModulesDir = path.join(depsDir, 'node_modules');
301
+ const packageJsonPath = path.join(depsDir, 'package.json');
302
+ // Direct check — "first run" means no pre-existing marker file. Corrupt
303
+ // package.json falls through as "Updating..." since the file already exists.
304
+ const isFirstRun = !fs.existsSync(packageJsonPath);
305
+ const spin = spinner(isFirstRun
306
+ ? 'Installing dependencies (first run only)...'
307
+ : 'Updating dependencies...');
179
308
  // Shared shape for both the pre-install and post-install writes. The
180
309
  // version/hash marker fields are added ONLY in the post-install write —
181
310
  // their absence from basePkg is the whole point of the two-phase write.
@@ -194,23 +323,54 @@ export async function ensureDependencies(verbose, overrideDepsDir) {
194
323
  };
195
324
  }
196
325
  try {
197
- // Write the package.json WITHOUT the version/hash marker first. npm reads
198
- // dependencies from this file; the marker is added only after the install
199
- // completes so a crashed/killed install never leaves a stale "success"
200
- // marker behind (see docs/plans/2026-04-14-cli-mdx-broken-install-fix.md).
201
- await fs.ensureDir(depsDir);
326
+ // Two-phase write: the pre-install pkg omits version/hash markers for
327
+ // two independent reasons. (1) Crash-safety: a crashed install must not
328
+ // leave a stale "success" marker behind (see
329
+ // docs/plans/2026-04-14-cli-mdx-broken-install-fix.md). (2) Lockfile
330
+ // drift: the shipped workspace-package-lock.json is generated from a
331
+ // package.json with only { name, private, type, dependencies } — any
332
+ // extra field here (including _jamdeskVersion / _depsHash) causes npm
333
+ // ci to reject the tree as drift. If you add a field to buildPkg(),
334
+ // regenerate the lockfile via `npm run vendor`. Markers are added
335
+ // post-install in the second writeJson below.
202
336
  await fs.writeJson(packageJsonPath, buildPkg(), { spaces: 2 });
337
+ // Copy the precomputed lockfile into ~/.jamdesk alongside the dynamic
338
+ // package.json. deps.ts ships with vendored/workspace-package-lock.json
339
+ // generated from the same REQUIRED_DEPS map — running `npm ci` against
340
+ // this lockfile finishes in ~30s vs. 5+ minutes for `npm install` which
341
+ // has to do a full resolver pass from scratch.
342
+ //
343
+ // Path resolution: import.meta.url → src/lib/deps.ts at test time or
344
+ // dist/lib/deps.js at runtime. Both resolve up two parents + vendored/
345
+ // to the same vendored/ directory (source tree in tests, installed
346
+ // package tree at runtime).
347
+ const thisFileDir = path.dirname(fileURLToPath(import.meta.url));
348
+ const workspaceLockSrc = path.resolve(thisFileDir, '../../vendored/workspace-package-lock.json');
349
+ const workspaceLockDest = path.join(depsDir, 'package-lock.json');
350
+ try {
351
+ await fs.copy(workspaceLockSrc, workspaceLockDest);
352
+ }
353
+ catch (err) {
354
+ const msg = err instanceof Error ? err.message : String(err);
355
+ throw new Error(`Failed to copy workspace lockfile from ${workspaceLockSrc}. ` +
356
+ `This usually means the jamdesk CLI install is damaged. ` +
357
+ `Try reinstalling with: npm install -g jamdesk\n` +
358
+ `Original error: ${msg}`);
359
+ }
203
360
  // Install dependencies (async to allow spinner animation)
204
361
  await new Promise((resolve, reject) => {
205
362
  // Windows needs shell:true so npm.cmd resolves — Node refuses to spawn
206
363
  // .cmd files directly since CVE-2024-27980 hardening. Our args are all
207
364
  // hardcoded literals so there's no injection surface.
208
- // --omit=dev replaces the deprecated --production flag (Node 24+
209
- // emits a deprecation warning for the latter).
210
- // --loglevel=error suppresses "npm warn deprecated" messages for
211
- // transitive deps; we surface real failures via stderr capture below.
212
365
  const isWindows = process.platform === 'win32';
213
- const npmInstall = spawn('npm', ['install', '--omit=dev', '--no-audit', '--no-fund', '--loglevel=error'], {
366
+ // npm ci: skips the resolver pass entirely, installs from the
367
+ // pre-resolved tarball URLs in package-lock.json. ~15x faster than
368
+ // `npm install` on a cold Windows runner. Requires the shipped
369
+ // lockfile to match package.json exactly — the generator script
370
+ // (scripts/generate-workspace-lockfile.js) guarantees sync, and
371
+ // the verify:workspace-lockfile pre-commit hook + CI job guard
372
+ // against drift.
373
+ const npmInstall = spawn('npm', ['ci', '--no-audit', '--no-fund', '--loglevel=error'], {
214
374
  cwd: depsDir,
215
375
  stdio: verbose ? 'inherit' : 'pipe',
216
376
  ...(isWindows ? { shell: true } : {}),
@@ -218,7 +378,7 @@ export async function ensureDependencies(verbose, overrideDepsDir) {
218
378
  // 5 minute timeout
219
379
  const timeout = setTimeout(() => {
220
380
  npmInstall.kill('SIGKILL');
221
- reject(new Error('npm install timed out after 5 minutes'));
381
+ reject(new Error('npm ci timed out after 5 minutes'));
222
382
  }, 300000);
223
383
  // Capture stderr for better error messages
224
384
  let stderrOutput = '';
@@ -231,11 +391,15 @@ export async function ensureDependencies(verbose, overrideDepsDir) {
231
391
  clearTimeout(timeout);
232
392
  if (code === 0) {
233
393
  resolve();
394
+ return;
234
395
  }
235
- else {
236
- const details = stderrOutput ? `\n${stderrOutput.trim()}` : '';
237
- reject(new Error(`npm install exited with code ${code}${details}`));
396
+ const details = stderrOutput ? `\n${stderrOutput.trim()}` : '';
397
+ if (looksLikeLockfileDrift(stderrOutput)) {
398
+ reject(new Error(`The jamdesk CLI's shipped lockfile is out of sync with its ` +
399
+ `dependencies. Upgrade the CLI: \`npm install -g jamdesk@latest\`${details}`));
400
+ return;
238
401
  }
402
+ reject(new Error(`npm ci exited with code ${code}${details}`));
239
403
  });
240
404
  npmInstall.on('error', (err) => {
241
405
  clearTimeout(timeout);
@@ -247,10 +411,10 @@ export async function ensureDependencies(verbose, overrideDepsDir) {
247
411
  // won't commit a marker that claims a broken install is healthy.
248
412
  const integrityOk = await verifyCriticalPackagesInstalled(depsDir);
249
413
  if (!integrityOk) {
250
- throw new Error(`npm install exited 0 but critical packages are missing in ${depsDir}. ` +
414
+ throw new Error(`npm ci exited 0 but critical packages are missing in ${depsDir}. ` +
251
415
  'Try removing that directory and running jamdesk dev again.');
252
416
  }
253
- await fs.writeJson(packageJsonPath, buildPkg({ version: CLI_VERSION, hash: DEPS_HASH }), { spaces: 2 });
417
+ await fs.writeJson(packageJsonPath, buildPkg({ version: cliPackage.version, hash: getDepsHash() }), { spaces: 2 });
254
418
  spin.succeed('Dependencies installed');
255
419
  return depsNodeModulesDir;
256
420
  }
@@ -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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAExE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAErD,wCAAwC;AACxC,sDAAsD;AACtD,2EAA2E;AAC3E,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,oBAAoB;IACpB,MAAM,EAAE,QAAQ;IAChB,8CAA8C;IAC9C,6BAA6B,EAAE,SAAS;IACxC,eAAe,EAAE,SAAS;IAC1B,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,SAAS;IACtB,WAAW,EAAE,QAAQ;IACrB,iBAAiB,EAAE,QAAQ;IAC3B,aAAa,EAAE,QAAQ;IACvB,QAAQ;IACR,mCAAmC,EAAE,QAAQ;IAC7C,oCAAoC,EAAE,QAAQ;IAC9C,qCAAqC,EAAE,QAAQ;IAC/C,mCAAmC,EAAE,QAAQ;IAC7C,gCAAgC,EAAE,QAAQ;IAC1C,cAAc,EAAE,UAAU;IAC1B,6BAA6B;IAC7B,aAAa,EAAE,QAAQ;IACvB,YAAY,EAAE,UAAU;IACxB,SAAS,EAAE,QAAQ;IACnB,qBAAqB;IACrB,cAAc,EAAE,SAAS;IACzB,gCAAgC,EAAE,SAAS;IAC3C,gBAAgB,EAAE,SAAS;IAC3B,OAAO,EAAE,QAAQ;IACjB,iBAAiB,EAAE,QAAQ;IAC3B,uBAAuB,EAAE,QAAQ;IACjC,kBAAkB,EAAE,QAAQ;IAC5B,cAAc,EAAE,QAAQ;IACxB,aAAa,EAAE,QAAQ;IACvB,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,oBAAoB,EAAE,QAAQ;IAC9B,uBAAuB;IACvB,OAAO,EAAE,UAAU;IACnB,WAAW;IACX,SAAS,EAAE,UAAU;IACrB,mCAAmC;IACnC,SAAS,EAAE,QAAQ;IACnB,oBAAoB;IACpB,KAAK,EAAE,SAAS;IAChB,aAAa,EAAE,QAAQ;IACvB,yCAAyC;IACzC,aAAa,EAAE,QAAQ;IACvB,sDAAsD;IACtD,mBAAmB,EAAE,SAAS;IAC9B,4CAA4C;IAC5C,SAAS,EAAE,SAAS;IACpB,kBAAkB,EAAE,QAAQ;IAC5B,MAAM;IACN,aAAa,EAAE,QAAQ;IACvB,sBAAsB,EAAE,QAAQ;IAChC,yBAAyB,EAAE,SAAS;IACpC,SAAS,EAAE,QAAQ;IACnB,cAAc,EAAE,UAAU;IAC1B,6CAA6C;IAC7C,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,SAAS;IACjB,yEAAyE;IACzE,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,SAAS;IACxB,cAAc,EAAE,UAAU;IAC1B,kBAAkB,EAAE,SAAS;IAC7B,qBAAqB,EAAE,QAAQ;CAChC,CAAC;AAWF;;;GAGG;AACH,SAAS,WAAW;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,wBAAwB,GAAG;IAC/B,MAAM;IACN,OAAO;IACP,WAAW;IACX,aAAa;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,OAAe;IAEf,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,wBAAwB,EAAE,CAAC;QAC5C,mEAAmE;QACnE,kEAAkE;QAClE,sDAAsD;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE5C,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,OAAgB,EAChB,EAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACvD,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,kEAAkE;YAClE,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtD,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;YACD,MAAM;QACR,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;YACjD,IAAI,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAEjC,kEAAkE;YAClE,IAAI,IAAc,CAAC;YACnB,IAAI,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,qEAAqE;gBACrE,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,qBAAqB,EAAE,CAAC;gBACtD,IAAI,OAAO;oBAAE,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBACxD,IAAI,CAAC;oBAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACvD,SAAS;YACX,CAAC;YACD,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;gBAC9E,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,qEAAqE;IACrE,2CAA2C;IAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;YAChE,gEAAgE;QAClE,CAAC;IACH,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAC9B,SAAS,CAAC,KAAK,EAAE,CAAC;IAElB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,2BAA2B,CACxC,OAAe;IAEf,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAqB,CAAC;QACnE,IAAI,GAAG,CAAC,eAAe,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;YAC/C,OAAO,wBAAwB,GAAG,CAAC,eAAe,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;QAC/E,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,WAAW,EAAE;YAAE,OAAO,cAAc,CAAC;QAC3D,gEAAgE;QAChE,IAAI,CAAC,CAAC,MAAM,+BAA+B,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,mDAAmD,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,yBAAyB,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAgB,EAChB,eAAwB;IAExB,MAAM,OAAO,GAAG,eAAe,IAAI,WAAW,CAAC;IAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAE9D,4DAA4D;IAC5D,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC3D,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,0BAA0B,aAAa,GAAG,CAAC,CAAC;IAErE,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;QAClD,sEAAsE;QACtE,0CAA0C;QAC1C,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QACD,OAAO,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,sBAAsB,CAAC,MAAc;IAC5C,OAAO,CACL,2EAA2E,CAAC,IAAI,CAAC,MAAM,CAAC;QACxF,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC;QACxC,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,OAAgB;IAEhB,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC3D,wEAAwE;IACxE,6EAA6E;IAC7E,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAClB,UAAU;QACR,CAAC,CAAC,6CAA6C;QAC/C,CAAC,CAAC,0BAA0B,CAC/B,CAAC;IAEF,qEAAqE;IACrE,wEAAwE;IACxE,wEAAwE;IACxE,2EAA2E;IAC3E,oDAAoD;IACpD,SAAS,QAAQ,CAAC,MAA0C;QAC1D,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,QAAQ;YACd,GAAG,CAAC,MAAM,IAAI;gBACZ,eAAe,EAAE,MAAM,CAAC,OAAO;gBAC/B,SAAS,EAAE,MAAM,CAAC,IAAI;aACvB,CAAC;YACF,YAAY,EAAE,aAAa;SAC5B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,sEAAsE;QACtE,wEAAwE;QACxE,6CAA6C;QAC7C,qEAAqE;QACrE,qEAAqE;QACrE,qEAAqE;QACrE,sEAAsE;QACtE,oEAAoE;QACpE,kEAAkE;QAClE,8CAA8C;QAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAE/D,sEAAsE;QACtE,wEAAwE;QACxE,uEAAuE;QACvE,wEAAwE;QACxE,+CAA+C;QAC/C,EAAE;QACF,qEAAqE;QACrE,uEAAuE;QACvE,mEAAmE;QACnE,4BAA4B;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CACnC,WAAW,EACX,4CAA4C,CAC7C,CAAC;QACF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,KAAK,CACb,0CAA0C,gBAAgB,IAAI;gBAC9D,yDAAyD;gBACzD,iDAAiD;gBACjD,mBAAmB,GAAG,EAAE,CACzB,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,uEAAuE;YACvE,uEAAuE;YACvE,sDAAsD;YACtD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;YAC/C,8DAA8D;YAC9D,mEAAmE;YACnE,+DAA+D;YAC/D,gEAAgE;YAChE,gEAAgE;YAChE,+DAA+D;YAC/D,iBAAiB;YACjB,MAAM,UAAU,GAAG,KAAK,CACtB,KAAK,EACL,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,CAAC,EACrD;gBACE,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBACnC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC,CACF,CAAC;YAEF,mBAAmB;YACnB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YACxD,CAAC,EAAE,MAAM,CAAC,CAAC;YAEX,2CAA2C;YAC3C,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBAClC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACpC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,CAAC,CAAC,CAAC;YACL,CAAC;YAED,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC9B,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBACD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,IAAI,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;oBACzC,MAAM,CAAC,IAAI,KAAK,CACd,6DAA6D;wBAC7D,mEAAmE,OAAO,EAAE,CAC7E,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC7B,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,wEAAwE;QACxE,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,WAAW,GAAG,MAAM,+BAA+B,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,wDAAwD,OAAO,IAAI;gBACnE,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,CAChB,eAAe,EACf,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,EAC9D,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACvC,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC5C,uEAAuE;QACvE,6BAA6B;QAC7B,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAChE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC"}
@@ -6,26 +6,48 @@
6
6
  *
7
7
  * Used by both CLI (validate command) and build-service (build-time warnings).
8
8
  */
9
- interface PageObject {
10
- page?: string;
11
- title?: string;
12
- }
13
- interface NavigationGroup {
14
- group?: string;
15
- pages?: (string | PageObject | NavigationGroup)[];
16
- }
17
- interface DocsConfig {
18
- navigation?: NavigationGroup[];
19
- }
20
9
  /**
21
- * Extract all page paths from navigation config.
22
- * Skips external URLs (http:// and https://).
10
+ * Structural copy of `BuildWarning` from ./status-reporter.ts. Kept local so
11
+ * this file can be copied byte-identically to all four tracked locations
12
+ * (build-service/shared, functions/src/shared, cli/vendored/shared,
13
+ * cli/src/lib) — the CLI src/lib copy has no sibling status-reporter.ts, and
14
+ * an `import type { BuildWarning } from './status-reporter.js'` would fail to
15
+ * resolve under the CLI's NodeNext tsconfig. TypeScript structural typing
16
+ * means callers in build-service/functions can still assign these to their
17
+ * imported BuildWarning[] without issue. Keep the shape in sync with
18
+ * builder/shared/status-reporter.ts.
23
19
  */
24
- export declare function extractNavigationPages(navigation: NavigationGroup[]): string[];
20
+ type BuildWarning = {
21
+ type: 'broken_link' | 'auto_migrate' | 'missing_asset' | 'missing_page';
22
+ file: string;
23
+ line?: number;
24
+ link?: string;
25
+ message?: string;
26
+ };
25
27
  /**
26
- * Validate that all navigation pages exist as MDX files.
27
- * Returns array of missing file paths.
28
+ * Extract all local page paths referenced anywhere in a navigation config.
29
+ *
30
+ * Walks every nav container shape (groups, tabs, anchors, dropdowns,
31
+ * products, versions, languages, global) recursively. Skips external URLs.
32
+ * Deduplicates — a page referenced from multiple containers is returned once.
33
+ *
34
+ * Input may be the full `navigation` object from docs.json, or any nested
35
+ * container. Returns a sorted unique list.
36
+ */
37
+ export declare function extractNavigationPages(nav: unknown): string[];
38
+ /**
39
+ * Boundary type for `validateNavigationPages` — any object with an optional
40
+ * `navigation` key. Callers' stricter `DocsConfig` types assign here.
41
+ */
42
+ export type NavValidationInput = {
43
+ navigation?: unknown;
44
+ [key: string]: unknown;
45
+ };
46
+ /**
47
+ * Validate that all pages referenced in docs.json navigation exist on disk
48
+ * as either `.mdx` or `.md` files. Returns a BuildWarning[] suitable for
49
+ * merging into `reporter.reportCompletion({ warnings })`.
28
50
  */
29
- export declare function validateNavigationFiles(config: DocsConfig, projectDir: string): Promise<string[]>;
51
+ export declare function validateNavigationPages(config: NavValidationInput | null | undefined, projectDir: string): Promise<BuildWarning[]>;
30
52
  export {};
31
53
  //# sourceMappingURL=navigation-validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-validator.d.ts","sourceRoot":"","sources":["../../src/lib/navigation-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,UAAU,GAAG,eAAe,CAAC,EAAE,CAAC;CACnD;AAED,UAAU,UAAU;IAClB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAcD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CA4B9E;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB"}
1
+ {"version":3,"file":"navigation-validator.d.ts","sourceRoot":"","sources":["../../src/lib/navigation-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;;;;;GAUG;AACH,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,eAAe,GAAG,cAAc,CAAC;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA6BF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CA0C7D;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAElF;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC7C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBzB"}
@@ -21,55 +21,84 @@ async function fileExists(filePath) {
21
21
  }
22
22
  }
23
23
  /**
24
- * Extract all page paths from navigation config.
25
- * Skips external URLs (http:// and https://).
24
+ * Extract all local page paths referenced anywhere in a navigation config.
25
+ *
26
+ * Walks every nav container shape (groups, tabs, anchors, dropdowns,
27
+ * products, versions, languages, global) recursively. Skips external URLs.
28
+ * Deduplicates — a page referenced from multiple containers is returned once.
29
+ *
30
+ * Input may be the full `navigation` object from docs.json, or any nested
31
+ * container. Returns a sorted unique list.
26
32
  */
27
- export function extractNavigationPages(navigation) {
28
- const pages = [];
29
- function processPages(items) {
33
+ export function extractNavigationPages(nav) {
34
+ if (!nav || typeof nav !== 'object')
35
+ return [];
36
+ const seen = new Set();
37
+ function addPage(value) {
38
+ if (typeof value !== 'string')
39
+ return;
40
+ if (value.startsWith('http://') || value.startsWith('https://'))
41
+ return;
42
+ seen.add(value);
43
+ }
44
+ function walkItems(items) {
45
+ if (!Array.isArray(items))
46
+ return;
30
47
  for (const item of items) {
31
48
  if (typeof item === 'string') {
32
- // Skip external URLs
33
- if (!item.startsWith('http://') && !item.startsWith('https://')) {
34
- pages.push(item);
35
- }
49
+ addPage(item);
36
50
  }
37
51
  else if (item && typeof item === 'object') {
38
- if ('page' in item && typeof item.page === 'string') {
39
- pages.push(item.page);
40
- }
41
- if ('pages' in item && Array.isArray(item.pages)) {
42
- processPages(item.pages);
43
- }
52
+ walkContainer(item);
44
53
  }
45
54
  }
46
55
  }
47
- for (const group of navigation) {
48
- if (group.pages) {
49
- processPages(group.pages);
50
- }
56
+ function walkContainer(container) {
57
+ if (!container || typeof container !== 'object')
58
+ return;
59
+ // `page` property on an item (e.g., { page: "foo", title: "..." })
60
+ if ('page' in container)
61
+ addPage(container.page);
62
+ walkItems(container.pages);
63
+ walkItems(container.groups);
64
+ walkItems(container.tabs);
65
+ walkItems(container.anchors);
66
+ walkItems(container.dropdowns);
67
+ walkItems(container.products);
68
+ walkItems(container.versions);
69
+ walkItems(container.languages);
70
+ if (container.global)
71
+ walkContainer(container.global);
51
72
  }
52
- return pages;
73
+ walkContainer(nav);
74
+ return Array.from(seen).sort();
53
75
  }
54
76
  /**
55
- * Validate that all navigation pages exist as MDX files.
56
- * Returns array of missing file paths.
77
+ * Validate that all pages referenced in docs.json navigation exist on disk
78
+ * as either `.mdx` or `.md` files. Returns a BuildWarning[] suitable for
79
+ * merging into `reporter.reportCompletion({ warnings })`.
57
80
  */
58
- export async function validateNavigationFiles(config, projectDir) {
59
- if (!config.navigation || !Array.isArray(config.navigation)) {
81
+ export async function validateNavigationPages(config, projectDir) {
82
+ if (!config || typeof config !== 'object')
60
83
  return [];
61
- }
62
84
  const pagePaths = extractNavigationPages(config.navigation);
63
- const missing = [];
64
- for (const pagePath of pagePaths) {
65
- const mdxPath = path.join(projectDir, `${pagePath}.mdx`);
66
- const mdPath = path.join(projectDir, `${pagePath}.md`);
67
- const mdxExists = await fileExists(mdxPath);
68
- const mdExists = await fileExists(mdPath);
69
- if (!mdxExists && !mdExists) {
70
- missing.push(`${pagePath}.mdx`);
71
- }
72
- }
73
- return missing;
85
+ if (pagePaths.length === 0)
86
+ return [];
87
+ // Short-circuits to `.md` only if `.mdx` doesn't exist, avoiding a second
88
+ // stat when the first hits.
89
+ const results = await Promise.all(pagePaths.map(async (pagePath) => {
90
+ const mdxExists = await fileExists(path.join(projectDir, `${pagePath}.mdx`));
91
+ if (mdxExists)
92
+ return { pagePath, exists: true };
93
+ const mdExists = await fileExists(path.join(projectDir, `${pagePath}.md`));
94
+ return { pagePath, exists: mdExists };
95
+ }));
96
+ return results
97
+ .filter((r) => !r.exists)
98
+ .map(({ pagePath }) => ({
99
+ type: 'missing_page',
100
+ file: `${pagePath}.mdx`,
101
+ message: `Page "${pagePath}" is referenced in navigation but no ${pagePath}.mdx or ${pagePath}.md file exists`,
102
+ }));
74
103
  }
75
104
  //# sourceMappingURL=navigation-validator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-validator.js","sourceRoot":"","sources":["../../src/lib/navigation-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAgBxB;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA6B;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,YAAY,CAAC,KAAgD;QACpE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,qBAAqB;gBACrB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAChE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5C,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;gBACD,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAkB,EAClB,UAAkB;IAElB,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;QAEvD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"navigation-validator.js","sourceRoot":"","sources":["../../src/lib/navigation-validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jamdesk",
3
- "version": "1.1.24",
3
+ "version": "1.1.26",
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",
@@ -76,6 +76,7 @@
76
76
  "vendored/tailwind.config.ts",
77
77
  "vendored/postcss.config.mjs",
78
78
  "vendored/tsconfig.json",
79
+ "vendored/workspace-package-lock.json",
79
80
  "README.md",
80
81
  "LICENSE",
81
82
  "NOTICE"
@@ -84,6 +85,8 @@
84
85
  "build": "tsc",
85
86
  "prepare": "npm run build",
86
87
  "vendor": "node scripts/vendor.js",
88
+ "generate-workspace-lockfile": "node scripts/generate-workspace-lockfile.js",
89
+ "verify:workspace-lockfile": "node scripts/verify-workspace-lockfile.js",
87
90
  "security-check": "node scripts/security-check.js",
88
91
  "prepublishOnly": "npm run vendor && npm run build && npm run security-check",
89
92
  "publish:npm": "node scripts/publish.js npm",
@@ -214,9 +214,13 @@ export interface TabConfig {
214
214
  }
215
215
 
216
216
  /**
217
- * Anchor configuration (top-level navigation sections)
218
- * @deprecated Use TabConfig instead. Anchors in navigation are deprecated.
219
- * For external links, use the top-level `anchors` field with ExternalAnchorConfig.
217
+ * Legacy anchor configuration (top-level navigation sections).
218
+ *
219
+ * Retained so NavigationConfig / DropdownConfig / ProductConfig /
220
+ * VersionConfig / LanguageConfig can continue to type customer configs
221
+ * that still carry the legacy shape. New configs should use TabConfig
222
+ * for internal sections and top-level ExternalAnchorConfig for external
223
+ * links; `validateConfig` rejects `navigation.anchors` at build time.
220
224
  */
221
225
  export interface AnchorConfig {
222
226
  anchor: string;
@@ -792,9 +796,15 @@ export interface DocsConfig {
792
796
  // Required fields
793
797
  theme: ThemeName;
794
798
  name: string;
795
- colors: ColorsConfig;
796
799
  navigation: NavigationConfig;
797
800
 
801
+ // Boundary escape hatch — docs.json is user-authored and may carry fields
802
+ // not represented in this interface. Unknown keys read as `unknown`.
803
+ [key: string]: unknown;
804
+
805
+ // Optional — themes provide defaults at render time
806
+ colors?: ColorsConfig;
807
+
798
808
  // Optional fields
799
809
  description?: string;
800
810
  favicon?: Favicon;