jamdesk 1.1.69 → 1.1.71

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 (75) hide show
  1. package/dist/__tests__/integration/validate.integration.test.js +21 -0
  2. package/dist/__tests__/integration/validate.integration.test.js.map +1 -1
  3. package/dist/__tests__/unit/extract-hooks.test.js +102 -1
  4. package/dist/__tests__/unit/extract-hooks.test.js.map +1 -1
  5. package/dist/__tests__/unit/mdx-validator.test.js +22 -0
  6. package/dist/__tests__/unit/mdx-validator.test.js.map +1 -1
  7. package/dist/__tests__/unit/migrate-mdx.test.js +121 -1
  8. package/dist/__tests__/unit/migrate-mdx.test.js.map +1 -1
  9. package/dist/__tests__/unit/relative-mdx-imports.test.d.ts +2 -0
  10. package/dist/__tests__/unit/relative-mdx-imports.test.d.ts.map +1 -0
  11. package/dist/__tests__/unit/relative-mdx-imports.test.js +452 -0
  12. package/dist/__tests__/unit/relative-mdx-imports.test.js.map +1 -0
  13. package/dist/__tests__/unit/relocate-snippets.test.d.ts +2 -0
  14. package/dist/__tests__/unit/relocate-snippets.test.d.ts.map +1 -0
  15. package/dist/__tests__/unit/relocate-snippets.test.js +542 -0
  16. package/dist/__tests__/unit/relocate-snippets.test.js.map +1 -0
  17. package/dist/__tests__/unit/run-build-script.test.js +23 -1
  18. package/dist/__tests__/unit/run-build-script.test.js.map +1 -1
  19. package/dist/__tests__/unit/warn-relative-imports.test.d.ts +2 -0
  20. package/dist/__tests__/unit/warn-relative-imports.test.d.ts.map +1 -0
  21. package/dist/__tests__/unit/warn-relative-imports.test.js +44 -0
  22. package/dist/__tests__/unit/warn-relative-imports.test.js.map +1 -0
  23. package/dist/commands/dev.d.ts.map +1 -1
  24. package/dist/commands/dev.js +22 -8
  25. package/dist/commands/dev.js.map +1 -1
  26. package/dist/commands/migrate/convert-mdx.d.ts +5 -1
  27. package/dist/commands/migrate/convert-mdx.d.ts.map +1 -1
  28. package/dist/commands/migrate/convert-mdx.js +19 -6
  29. package/dist/commands/migrate/convert-mdx.js.map +1 -1
  30. package/dist/commands/migrate/extract-hooks.d.ts +26 -0
  31. package/dist/commands/migrate/extract-hooks.d.ts.map +1 -1
  32. package/dist/commands/migrate/extract-hooks.js +71 -12
  33. package/dist/commands/migrate/extract-hooks.js.map +1 -1
  34. package/dist/commands/migrate/fix-mdx-syntax.d.ts +38 -0
  35. package/dist/commands/migrate/fix-mdx-syntax.d.ts.map +1 -0
  36. package/dist/commands/migrate/fix-mdx-syntax.js +80 -0
  37. package/dist/commands/migrate/fix-mdx-syntax.js.map +1 -0
  38. package/dist/commands/migrate/index.d.ts.map +1 -1
  39. package/dist/commands/migrate/index.js +165 -3
  40. package/dist/commands/migrate/index.js.map +1 -1
  41. package/dist/commands/migrate/relocate-snippets.d.ts +30 -0
  42. package/dist/commands/migrate/relocate-snippets.d.ts.map +1 -0
  43. package/dist/commands/migrate/relocate-snippets.js +357 -0
  44. package/dist/commands/migrate/relocate-snippets.js.map +1 -0
  45. package/dist/commands/validate.d.ts.map +1 -1
  46. package/dist/commands/validate.js +31 -1
  47. package/dist/commands/validate.js.map +1 -1
  48. package/dist/lib/mdx-syntax-fixes.d.ts +14 -0
  49. package/dist/lib/mdx-syntax-fixes.d.ts.map +1 -0
  50. package/dist/lib/mdx-syntax-fixes.js +38 -0
  51. package/dist/lib/mdx-syntax-fixes.js.map +1 -0
  52. package/dist/lib/mdx-validator.d.ts +11 -2
  53. package/dist/lib/mdx-validator.d.ts.map +1 -1
  54. package/dist/lib/mdx-validator.js +41 -4
  55. package/dist/lib/mdx-validator.js.map +1 -1
  56. package/dist/lib/relative-mdx-imports.d.ts +44 -0
  57. package/dist/lib/relative-mdx-imports.d.ts.map +1 -0
  58. package/dist/lib/relative-mdx-imports.js +145 -0
  59. package/dist/lib/relative-mdx-imports.js.map +1 -0
  60. package/dist/lib/run-build-script.d.ts.map +1 -1
  61. package/dist/lib/run-build-script.js +7 -0
  62. package/dist/lib/run-build-script.js.map +1 -1
  63. package/dist/lib/warn-relative-imports.d.ts +2 -0
  64. package/dist/lib/warn-relative-imports.d.ts.map +1 -0
  65. package/dist/lib/warn-relative-imports.js +29 -0
  66. package/dist/lib/warn-relative-imports.js.map +1 -0
  67. package/package.json +1 -1
  68. package/vendored/app/(unlock)/jd/unlock/page.tsx +32 -0
  69. package/vendored/app/[[...slug]]/page.tsx +63 -15
  70. package/vendored/components/navigation/SocialFooter.tsx +4 -18
  71. package/vendored/lib/branding-url.ts +9 -0
  72. package/vendored/lib/layout-helpers.tsx +7 -9
  73. package/vendored/lib/preprocess-mdx.ts +42 -0
  74. package/vendored/scripts/compile-snippets.cjs +50 -7
  75. package/vendored/workspace-package-lock.json +3 -3
@@ -0,0 +1,542 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { mkdtemp, mkdir, writeFile, readFile, access, rm } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ import { relocateOrphanSnippets } from '../../commands/migrate/relocate-snippets.js';
6
+ async function setupTmp() {
7
+ return mkdtemp(path.join(tmpdir(), 'jd-reloc-'));
8
+ }
9
+ async function writeMdx(dir, rel, body) {
10
+ const abs = path.join(dir, rel);
11
+ await mkdir(path.dirname(abs), { recursive: true });
12
+ await writeFile(abs, body);
13
+ return abs;
14
+ }
15
+ describe('relocateOrphanSnippets', () => {
16
+ it('moves an imported MDX outside /snippets/ and rewrites the importer', async () => {
17
+ const dir = await setupTmp();
18
+ try {
19
+ // Page imports a sibling .mdx that is not in nav and not linked.
20
+ await writeMdx(dir, 'de/page.mdx', `---\ntitle: Page\n---\nimport Shared from './shared.mdx';\n\n# Page\n\n<Shared />\n`);
21
+ await writeMdx(dir, 'de/shared.mdx', `Shared content here.\n`);
22
+ const navigation = {
23
+ groups: [{ pages: ['de/page'] }],
24
+ };
25
+ const result = await relocateOrphanSnippets(dir, { navigation });
26
+ expect(result.moves).toHaveLength(1);
27
+ expect(result.moves[0].from).toBe(path.join('de', 'shared.mdx'));
28
+ expect(result.moves[0].to).toBe(path.join('snippets', 'de', 'shared.mdx'));
29
+ // Original gone, destination exists.
30
+ await expect(access(path.join(dir, 'de/shared.mdx'))).rejects.toThrow();
31
+ await expect(access(path.join(dir, 'snippets/de/shared.mdx'))).resolves.toBeUndefined();
32
+ // Importer's import statement rewritten to root-relative form.
33
+ const updated = await readFile(path.join(dir, 'de/page.mdx'), 'utf-8');
34
+ expect(updated).toContain(`from '/snippets/de/shared.mdx'`);
35
+ expect(updated).not.toContain(`from './shared.mdx'`);
36
+ }
37
+ finally {
38
+ await rm(dir, { recursive: true, force: true });
39
+ }
40
+ });
41
+ it('does NOT move a file that is referenced as a page in docs.json navigation', async () => {
42
+ const dir = await setupTmp();
43
+ try {
44
+ // page-a imports page-b. page-b is also in nav — it's a real page
45
+ // that happens to be embedded; do not move it.
46
+ await writeMdx(dir, 'page-a.mdx', `import B from './page-b.mdx';\n\n# A\n\n<B />\n`);
47
+ await writeMdx(dir, 'page-b.mdx', `# B\nReal page content.\n`);
48
+ const navigation = { groups: [{ pages: ['page-a', 'page-b'] }] };
49
+ const result = await relocateOrphanSnippets(dir, { navigation });
50
+ expect(result.moves).toHaveLength(0);
51
+ expect(result.skipped).toEqual([
52
+ { file: 'page-b.mdx', reason: expect.stringContaining('navigation') },
53
+ ]);
54
+ // File still in original location.
55
+ await expect(access(path.join(dir, 'page-b.mdx'))).resolves.toBeUndefined();
56
+ }
57
+ finally {
58
+ await rm(dir, { recursive: true, force: true });
59
+ }
60
+ });
61
+ it('does NOT move a file that is the target of a markdown link', async () => {
62
+ const dir = await setupTmp();
63
+ try {
64
+ // page-a imports page-b (signal A) AND links to page-b (signal C).
65
+ // The link is the dominant signal — page-b is a navigable page.
66
+ await writeMdx(dir, 'page-a.mdx', `import B from './page-b.mdx';\n\nSee [the other page](/page-b) for details.\n\n<B />\n`);
67
+ await writeMdx(dir, 'page-b.mdx', `# B\n`);
68
+ const navigation = { groups: [{ pages: ['page-a'] }] };
69
+ const result = await relocateOrphanSnippets(dir, { navigation });
70
+ expect(result.moves).toHaveLength(0);
71
+ expect(result.skipped[0].reason).toContain('linked');
72
+ }
73
+ finally {
74
+ await rm(dir, { recursive: true, force: true });
75
+ }
76
+ });
77
+ it('preserves locale + folder structure in the destination', async () => {
78
+ const dir = await setupTmp();
79
+ try {
80
+ // German page imports its own localized snippet sitting outside /snippets/.
81
+ // Destination should keep the `de/marketing/` prefix to avoid collisions
82
+ // with `en/marketing/share.mdx`, `fr/marketing/share.mdx`, etc.
83
+ await writeMdx(dir, 'de/marketing/landing.mdx', `import Share from './share.mdx';\n\n<Share />\n`);
84
+ await writeMdx(dir, 'de/marketing/share.mdx', `German share blurb.\n`);
85
+ const navigation = { groups: [{ pages: ['de/marketing/landing'] }] };
86
+ const result = await relocateOrphanSnippets(dir, { navigation });
87
+ expect(result.moves).toHaveLength(1);
88
+ expect(result.moves[0].to).toBe(path.join('snippets', 'de', 'marketing', 'share.mdx'));
89
+ }
90
+ finally {
91
+ await rm(dir, { recursive: true, force: true });
92
+ }
93
+ });
94
+ it('is idempotent — a second run on the post-relocation tree is a no-op', async () => {
95
+ const dir = await setupTmp();
96
+ try {
97
+ await writeMdx(dir, 'page.mdx', `import S from './share.mdx';\n\n<S />\n`);
98
+ await writeMdx(dir, 'share.mdx', `Shared.\n`);
99
+ const navigation = { groups: [{ pages: ['page'] }] };
100
+ const first = await relocateOrphanSnippets(dir, { navigation });
101
+ expect(first.moves).toHaveLength(1);
102
+ // Importer should now reference /snippets/share.mdx, which doesn't
103
+ // match the parent-relative pattern at all → import graph empty →
104
+ // no candidates → no moves.
105
+ const second = await relocateOrphanSnippets(dir, { navigation });
106
+ expect(second.moves).toHaveLength(0);
107
+ expect(second.skipped).toHaveLength(0);
108
+ }
109
+ finally {
110
+ await rm(dir, { recursive: true, force: true });
111
+ }
112
+ });
113
+ it('skips relocation when the destination already exists with different content', async () => {
114
+ const dir = await setupTmp();
115
+ try {
116
+ await writeMdx(dir, 'page.mdx', `import S from './share.mdx';\n\n<S />\n`);
117
+ await writeMdx(dir, 'share.mdx', `New version.\n`);
118
+ // A different file already sitting at the would-be destination.
119
+ await writeMdx(dir, 'snippets/share.mdx', `Existing content.\n`);
120
+ const result = await relocateOrphanSnippets(dir, {
121
+ navigation: { groups: [{ pages: ['page'] }] },
122
+ });
123
+ expect(result.moves).toHaveLength(0);
124
+ expect(result.skipped[0].reason).toContain('content differs');
125
+ // Both files preserved, destination untouched.
126
+ const orig = await readFile(path.join(dir, 'share.mdx'), 'utf-8');
127
+ const dest = await readFile(path.join(dir, 'snippets/share.mdx'), 'utf-8');
128
+ expect(orig).toBe('New version.\n');
129
+ expect(dest).toBe('Existing content.\n');
130
+ }
131
+ finally {
132
+ await rm(dir, { recursive: true, force: true });
133
+ }
134
+ });
135
+ it('resumes relocation when the destination is byte-identical (partial-run leftover)', async () => {
136
+ const dir = await setupTmp();
137
+ try {
138
+ // User scenario: previous migrate run successfully moved share.mdx →
139
+ // snippets/share.mdx and rewrote the importer. User then `git checkout`'d
140
+ // away the importer change AND restored share.mdx (untracked snippets/
141
+ // copy survives). Both files now exist with identical content; the
142
+ // importer is back to parent-relative.
143
+ await writeMdx(dir, 'page.mdx', `import S from './share.mdx';\n\n<S />\n`);
144
+ const sharedContent = `Shared content here.\n`;
145
+ await writeMdx(dir, 'share.mdx', sharedContent);
146
+ await writeMdx(dir, 'snippets/share.mdx', sharedContent);
147
+ const result = await relocateOrphanSnippets(dir, {
148
+ navigation: { groups: [{ pages: ['page'] }] },
149
+ });
150
+ expect(result.moves).toHaveLength(1);
151
+ expect(result.moves[0].resumed).toBe(true);
152
+ expect(result.moves[0].from).toBe('share.mdx');
153
+ expect(result.moves[0].to).toBe(path.join('snippets', 'share.mdx'));
154
+ // Source removed, dest survives byte-identical.
155
+ await expect(access(path.join(dir, 'share.mdx'))).rejects.toThrow();
156
+ const dest = await readFile(path.join(dir, 'snippets/share.mdx'), 'utf-8');
157
+ expect(dest).toBe(sharedContent);
158
+ // Importer rewritten to root-relative.
159
+ const updated = await readFile(path.join(dir, 'page.mdx'), 'utf-8');
160
+ expect(updated).toContain(`from '/snippets/share.mdx'`);
161
+ expect(updated).not.toContain(`from './share.mdx'`);
162
+ }
163
+ finally {
164
+ await rm(dir, { recursive: true, force: true });
165
+ }
166
+ });
167
+ it('updates multiple importers when several pages share a snippet', async () => {
168
+ const dir = await setupTmp();
169
+ try {
170
+ await writeMdx(dir, 'page-a.mdx', `import S from './share.mdx';\n\n<S />\n`);
171
+ await writeMdx(dir, 'page-b.mdx', `import S from './share.mdx';\n\n<S />\n`);
172
+ await writeMdx(dir, 'share.mdx', `Shared.\n`);
173
+ const result = await relocateOrphanSnippets(dir, {
174
+ navigation: { groups: [{ pages: ['page-a', 'page-b'] }] },
175
+ });
176
+ expect(result.moves).toHaveLength(1);
177
+ // Both importers' import statements were rewritten in place.
178
+ const a = await readFile(path.join(dir, 'page-a.mdx'), 'utf-8');
179
+ const b = await readFile(path.join(dir, 'page-b.mdx'), 'utf-8');
180
+ expect(a).toContain(`from '/snippets/share.mdx'`);
181
+ expect(b).toContain(`from '/snippets/share.mdx'`);
182
+ }
183
+ finally {
184
+ await rm(dir, { recursive: true, force: true });
185
+ }
186
+ });
187
+ it('leaves files already under /snippets/ alone', async () => {
188
+ const dir = await setupTmp();
189
+ try {
190
+ // A page imports a sibling that lives under snippets/ already. The
191
+ // import is parent-relative and resolves correctly, so it is in the
192
+ // graph — but the candidate filter must skip it.
193
+ await writeMdx(dir, 'snippets/page.mdx', `import S from './share.mdx';\n\n<S />\n`);
194
+ await writeMdx(dir, 'snippets/share.mdx', `Shared.\n`);
195
+ const result = await relocateOrphanSnippets(dir, {});
196
+ expect(result.moves).toHaveLength(0);
197
+ expect(result.skipped).toHaveLength(0);
198
+ }
199
+ finally {
200
+ await rm(dir, { recursive: true, force: true });
201
+ }
202
+ });
203
+ it('handles cross-language snippets with chained snippet-imports-snippet', async () => {
204
+ const dir = await setupTmp();
205
+ try {
206
+ // Realistic Mintlify pattern: localized landing page imports a
207
+ // localized snippet, which itself imports a base snippet. Both
208
+ // candidates qualify; both must be relocated and bar's import to
209
+ // baz must keep working after the moves. Bulk pages keep the
210
+ // 2 planned moves below the 50% ratio safety bound — a real
211
+ // Mintlify migration always has many unrelated pages alongside
212
+ // the chained snippet pattern.
213
+ await writeMdx(dir, 'de/page.mdx', `import Bar from './bar.mdx';\n\n<Bar />\n`);
214
+ await writeMdx(dir, 'de/bar.mdx', `import Baz from './baz.mdx';\n\n<Baz />\n`);
215
+ await writeMdx(dir, 'de/baz.mdx', `Leaf.\n`);
216
+ const bulkPages = Array.from({ length: 8 }, (_, i) => `de/extra-${i}`);
217
+ for (const p of bulkPages) {
218
+ await writeMdx(dir, `${p}.mdx`, `# Extra ${p}\nUnrelated page.\n`);
219
+ }
220
+ const result = await relocateOrphanSnippets(dir, {
221
+ navigation: {
222
+ groups: [{ pages: ['de/page', ...bulkPages] }],
223
+ },
224
+ });
225
+ // Both bar and baz get relocated.
226
+ expect(result.moves).toHaveLength(2);
227
+ const moveTargets = result.moves.map((m) => m.to.replaceAll(path.sep, '/'));
228
+ expect(moveTargets).toContain('snippets/de/bar.mdx');
229
+ expect(moveTargets).toContain('snippets/de/baz.mdx');
230
+ // bar (now at snippets/de/bar.mdx) keeps its parent-relative import
231
+ // to baz — both moved together so `./baz.mdx` still resolves under
232
+ // snippets/de/. The standard rewriter (run by migrateMdxFiles
233
+ // afterwards) normalizes this to /snippets/de/baz.mdx on the next
234
+ // pass. We verify the import statement is still well-formed.
235
+ const barContent = await readFile(path.join(dir, 'snippets/de/bar.mdx'), 'utf-8');
236
+ expect(barContent).toMatch(/import\s+Baz\s+from\s+['"]\.\/baz\.mdx['"]/);
237
+ // Re-run on the post-move tree must be a no-op for the multi-file
238
+ // case too (idempotency for chained relocations).
239
+ const second = await relocateOrphanSnippets(dir, {
240
+ navigation: {
241
+ groups: [{ pages: ['de/page', ...bulkPages] }],
242
+ },
243
+ });
244
+ expect(second.moves).toHaveLength(0);
245
+ }
246
+ finally {
247
+ await rm(dir, { recursive: true, force: true });
248
+ }
249
+ });
250
+ it('respects { pages: [...] } navigation shape produced by Mintlify converter', async () => {
251
+ const dir = await setupTmp();
252
+ try {
253
+ // convertMintlifyToJamdesk wraps a top-level navigation array as
254
+ // `navigation: { pages: [...] }`. extractAllPages must walk the
255
+ // pages branch or every page reachable through this shape would be
256
+ // misclassified as an orphan and moved.
257
+ await writeMdx(dir, 'page-a.mdx', `import B from './page-b.mdx';\n\n# A\n\n<B />\n`);
258
+ await writeMdx(dir, 'page-b.mdx', `# B\nReal page content.\n`);
259
+ const navigation = { pages: ['page-a', 'page-b'] };
260
+ const result = await relocateOrphanSnippets(dir, { navigation });
261
+ expect(result.moves).toHaveLength(0);
262
+ expect(result.skipped[0].reason).toContain('navigation');
263
+ }
264
+ finally {
265
+ await rm(dir, { recursive: true, force: true });
266
+ }
267
+ });
268
+ it('detects pages reachable only via JSX <Card href="..." />', async () => {
269
+ const dir = await setupTmp();
270
+ try {
271
+ // page-a imports page-b (signal A). page-b is NOT in nav directly
272
+ // (it's a sub-page reached via a Card on page-a). The href markup
273
+ // is the only "linked-as-page" signal — without JSX detection,
274
+ // page-b would be misclassified as an orphan snippet.
275
+ await writeMdx(dir, 'page-a.mdx', `import B from './page-b.mdx';\n\n<Card href="/page-b" title="Details" />\n\n<B />\n`);
276
+ await writeMdx(dir, 'page-b.mdx', `# B\n`);
277
+ const navigation = { pages: ['page-a'] };
278
+ const result = await relocateOrphanSnippets(dir, { navigation });
279
+ expect(result.moves).toHaveLength(0);
280
+ expect(result.skipped[0].reason).toContain('linked');
281
+ }
282
+ finally {
283
+ await rm(dir, { recursive: true, force: true });
284
+ }
285
+ });
286
+ it('detects reference-style markdown link definitions', async () => {
287
+ const dir = await setupTmp();
288
+ try {
289
+ await writeMdx(dir, 'page-a.mdx', `import B from './page-b.mdx';\n\nSee [the other one][b].\n\n[b]: /page-b\n\n<B />\n`);
290
+ await writeMdx(dir, 'page-b.mdx', `# B\n`);
291
+ const result = await relocateOrphanSnippets(dir, {
292
+ navigation: { pages: ['page-a'] },
293
+ });
294
+ expect(result.moves).toHaveLength(0);
295
+ expect(result.skipped[0].reason).toContain('linked');
296
+ }
297
+ finally {
298
+ await rm(dir, { recursive: true, force: true });
299
+ }
300
+ });
301
+ it('does NOT relocate a snippet that imports a real page (back-edge guard)', async () => {
302
+ const dir = await setupTmp();
303
+ try {
304
+ // bar is imported by page (signal A), not in nav, not linked. But
305
+ // bar itself imports page back (`<Link to overview>` style). Moving
306
+ // bar to /snippets/ would orphan that back-edge import — there is
307
+ // no way to express the path from /snippets/foo.mdx back to /page
308
+ // in Jamdesk. Skip.
309
+ await writeMdx(dir, 'page.mdx', `import Bar from './bar.mdx';\n\n# Page\n\n<Bar />\n`);
310
+ await writeMdx(dir, 'bar.mdx', `import P from './page.mdx';\n\nBack to <P />.\n`);
311
+ const result = await relocateOrphanSnippets(dir, {
312
+ navigation: { pages: ['page'] },
313
+ });
314
+ expect(result.moves).toHaveLength(0);
315
+ expect(result.skipped.some((s) => s.reason.includes('back-edge'))).toBe(true);
316
+ // Original location preserved.
317
+ await expect(access(path.join(dir, 'bar.mdx'))).resolves.toBeUndefined();
318
+ }
319
+ finally {
320
+ await rm(dir, { recursive: true, force: true });
321
+ }
322
+ });
323
+ it('ignores imports inside fenced code blocks when classifying targets', async () => {
324
+ const dir = await setupTmp();
325
+ try {
326
+ // The `import` inside a fenced code block must not count as a
327
+ // real importer — otherwise the documented snippet would be
328
+ // misclassified as imported.
329
+ await writeMdx(dir, 'docs.mdx', '# How to import\n\n```mdx\nimport Foo from "../foo.mdx";\n```\n');
330
+ await writeMdx(dir, 'foo.mdx', `Standalone.\n`);
331
+ const result = await relocateOrphanSnippets(dir, {
332
+ navigation: { groups: [{ pages: ['docs', 'foo'] }] },
333
+ });
334
+ // Not imported (fence stripped) → not a candidate at all.
335
+ expect(result.moves).toHaveLength(0);
336
+ expect(result.skipped).toHaveLength(0);
337
+ }
338
+ finally {
339
+ await rm(dir, { recursive: true, force: true });
340
+ }
341
+ });
342
+ it('treats redirect source/destination as page references (no relocation)', async () => {
343
+ const dir = await setupTmp();
344
+ try {
345
+ // legacy-page is no longer in nav, but kept around because docs.json
346
+ // declares a redirect for it. Importing it from another page is a
347
+ // page-embed pattern, not a snippet — must not be moved.
348
+ await writeMdx(dir, 'page.mdx', `import Legacy from './legacy-page.mdx';\n\n# Page\n\n<Legacy />\n`);
349
+ await writeMdx(dir, 'legacy-page.mdx', `# Legacy\n\nOld content.\n`);
350
+ const result = await relocateOrphanSnippets(dir, {
351
+ navigation: { pages: ['page'] },
352
+ redirects: [{ source: '/legacy-page', destination: '/new-page' }],
353
+ });
354
+ expect(result.moves).toHaveLength(0);
355
+ expect(result.skipped[0].reason).toContain('redirect');
356
+ }
357
+ finally {
358
+ await rm(dir, { recursive: true, force: true });
359
+ }
360
+ });
361
+ it('detects pages reachable via JSX `to=`, `path=`, or `src=` props', async () => {
362
+ const dir = await setupTmp();
363
+ try {
364
+ // Three different JSX prop patterns reach three different pages.
365
+ // Without the widened regex, all three would be misclassified.
366
+ await writeMdx(dir, 'page-a.mdx', `import B from './target-b.mdx';\nimport C from './target-c.mdx';\nimport D from './target-d.mdx';\n\n` +
367
+ `<Link to="/target-b">B</Link>\n<Route path="/target-c">C</Route>\n<Embed src="/target-d.mdx">D</Embed>\n` +
368
+ `<B />\n<C />\n<D />\n`);
369
+ await writeMdx(dir, 'target-b.mdx', `# B\n`);
370
+ await writeMdx(dir, 'target-c.mdx', `# C\n`);
371
+ await writeMdx(dir, 'target-d.mdx', `# D\n`);
372
+ const result = await relocateOrphanSnippets(dir, {
373
+ navigation: { pages: ['page-a'] },
374
+ });
375
+ expect(result.moves).toHaveLength(0);
376
+ expect(result.skipped).toHaveLength(3);
377
+ for (const s of result.skipped) {
378
+ expect(s.reason).toContain('linked');
379
+ }
380
+ }
381
+ finally {
382
+ await rm(dir, { recursive: true, force: true });
383
+ }
384
+ });
385
+ it('skips files whose frontmatter declares a `title` (page-shaped)', async () => {
386
+ const dir = await setupTmp();
387
+ try {
388
+ // looks-like-a-page is imported (signal A) and not in nav, but its
389
+ // frontmatter has a `title` — that's a strong signal it was authored
390
+ // as a page, even if it isn't currently linked. Don't auto-move it;
391
+ // surface it for manual review.
392
+ await writeMdx(dir, 'page.mdx', `import P from './looks-like-a-page.mdx';\n\n<P />\n`);
393
+ await writeMdx(dir, 'looks-like-a-page.mdx', `---\ntitle: Some Page\n---\n\n# Some Page\n\nReal content.\n`);
394
+ const result = await relocateOrphanSnippets(dir, {
395
+ navigation: { pages: ['page'] },
396
+ });
397
+ expect(result.moves).toHaveLength(0);
398
+ expect(result.skipped[0].reason).toContain('page-shaped frontmatter');
399
+ }
400
+ finally {
401
+ await rm(dir, { recursive: true, force: true });
402
+ }
403
+ });
404
+ it('skips reserved page names (index, 404, home, etc.)', async () => {
405
+ const dir = await setupTmp();
406
+ try {
407
+ await writeMdx(dir, 'page.mdx', `import I from './index.mdx';\nimport NF from './404.mdx';\n\n<I />\n<NF />\n`);
408
+ await writeMdx(dir, 'index.mdx', `Index content.\n`);
409
+ await writeMdx(dir, '404.mdx', `Not found content.\n`);
410
+ const result = await relocateOrphanSnippets(dir, {
411
+ navigation: { pages: ['page'] },
412
+ });
413
+ expect(result.moves).toHaveLength(0);
414
+ expect(result.skipped).toHaveLength(2);
415
+ for (const s of result.skipped) {
416
+ expect(s.reason).toContain('reserved');
417
+ }
418
+ }
419
+ finally {
420
+ await rm(dir, { recursive: true, force: true });
421
+ }
422
+ });
423
+ it('aborts when navigation resolves to zero pages', async () => {
424
+ const dir = await setupTmp();
425
+ try {
426
+ // Without nav, every imported file looks like a snippet — refuse to
427
+ // act so a misconfigured docs.json doesn't wipe out half the tree.
428
+ await writeMdx(dir, 'page.mdx', `import S from './shared.mdx';\n\n<S />\n`);
429
+ await writeMdx(dir, 'shared.mdx', `Shared.\n`);
430
+ const result = await relocateOrphanSnippets(dir, {});
431
+ expect(result.aborted).toBeDefined();
432
+ expect(result.aborted?.reason).toContain('no navigation');
433
+ expect(result.moves).toHaveLength(0);
434
+ // Original files preserved.
435
+ await expect(access(path.join(dir, 'shared.mdx'))).resolves.toBeUndefined();
436
+ }
437
+ finally {
438
+ await rm(dir, { recursive: true, force: true });
439
+ }
440
+ });
441
+ it('aborts on empty navigation even when redirects are configured', async () => {
442
+ const dir = await setupTmp();
443
+ try {
444
+ // Redirects alone don't constitute "real navigation" — a project
445
+ // with only redirect URLs has no published pages, so the empty-nav
446
+ // abort must still fire. Otherwise a redirect-only docs.json would
447
+ // silently disarm the safety gate.
448
+ await writeMdx(dir, 'page.mdx', `import S from './shared.mdx';\n\n<S />\n`);
449
+ await writeMdx(dir, 'shared.mdx', `Shared.\n`);
450
+ const result = await relocateOrphanSnippets(dir, {
451
+ navigation: {},
452
+ redirects: [{ source: '/old', destination: '/new' }],
453
+ });
454
+ expect(result.aborted).toBeDefined();
455
+ expect(result.aborted?.reason).toContain('no navigation');
456
+ }
457
+ finally {
458
+ await rm(dir, { recursive: true, force: true });
459
+ }
460
+ });
461
+ it('aborts when planned moves exceed the safety bound (>25% of files)', async () => {
462
+ const dir = await setupTmp();
463
+ try {
464
+ // Single nav page imports 10 sibling files. Safety bound is
465
+ // max(5, 25% of 11 files) = 5. 10 planned moves > 5 → abort.
466
+ const imports = Array.from({ length: 10 }, (_, i) => `import S${i} from './snip-${i}.mdx';`).join('\n');
467
+ const renders = Array.from({ length: 10 }, (_, i) => `<S${i} />`).join('\n');
468
+ await writeMdx(dir, 'page.mdx', `${imports}\n\n# Page\n\n${renders}\n`);
469
+ for (let i = 0; i < 10; i++) {
470
+ await writeMdx(dir, `snip-${i}.mdx`, `Snippet ${i}.\n`);
471
+ }
472
+ const result = await relocateOrphanSnippets(dir, {
473
+ navigation: { pages: ['page'] },
474
+ });
475
+ expect(result.aborted).toBeDefined();
476
+ expect(result.aborted?.reason).toContain('safety bound');
477
+ expect(result.moves).toHaveLength(0);
478
+ // Every candidate left alone, not just the first one.
479
+ for (let i = 0; i < 10; i++) {
480
+ await expect(access(path.join(dir, `snip-${i}.mdx`))).resolves.toBeUndefined();
481
+ }
482
+ }
483
+ finally {
484
+ await rm(dir, { recursive: true, force: true });
485
+ }
486
+ });
487
+ it('aborts when planned moves exceed the 50% ratio in a small project', async () => {
488
+ const dir = await setupTmp();
489
+ try {
490
+ // 1 page + 4 snippets = 5 files; threshold is max(5, floor(5*0.25)=1)=5,
491
+ // so 4 < 5 doesn't trigger the absolute bound — but 4/5 = 80% > 50%
492
+ // ratio bound. The ratio guard catches small-project mass moves the
493
+ // floor would otherwise let through.
494
+ await writeMdx(dir, 'page.mdx', `import A from './a.mdx';\nimport B from './b.mdx';\n` +
495
+ `import C from './c.mdx';\nimport D from './d.mdx';\n\n` +
496
+ `<A />\n<B />\n<C />\n<D />\n`);
497
+ await writeMdx(dir, 'a.mdx', `A.\n`);
498
+ await writeMdx(dir, 'b.mdx', `B.\n`);
499
+ await writeMdx(dir, 'c.mdx', `C.\n`);
500
+ await writeMdx(dir, 'd.mdx', `D.\n`);
501
+ const result = await relocateOrphanSnippets(dir, {
502
+ navigation: { pages: ['page'] },
503
+ });
504
+ expect(result.aborted).toBeDefined();
505
+ expect(result.aborted?.reason).toMatch(/80%|of the project/);
506
+ expect(result.moves).toHaveLength(0);
507
+ // All four candidates preserved.
508
+ for (const name of ['a.mdx', 'b.mdx', 'c.mdx', 'd.mdx']) {
509
+ await expect(access(path.join(dir, name))).resolves.toBeUndefined();
510
+ }
511
+ }
512
+ finally {
513
+ await rm(dir, { recursive: true, force: true });
514
+ }
515
+ });
516
+ it('does NOT abort when planned moves equal the absolute threshold exactly', async () => {
517
+ const dir = await setupTmp();
518
+ try {
519
+ // Boundary check: 1 page + 9 snippets = 10 files; threshold is
520
+ // max(5, floor(10*0.25)=2) = 5. 5 planned moves == threshold, not
521
+ // strictly greater, so no abort. Ratio is 5/10 = 50%, also at the
522
+ // boundary (must be > 50% to abort).
523
+ const imports = Array.from({ length: 5 }, (_, i) => `import S${i} from './snip-${i}.mdx';`).join('\n');
524
+ const renders = Array.from({ length: 5 }, (_, i) => `<S${i} />`).join('\n');
525
+ await writeMdx(dir, 'page.mdx', `${imports}\n\n${renders}\n`);
526
+ for (let i = 0; i < 9; i++) {
527
+ await writeMdx(dir, `snip-${i}.mdx`, `Snippet ${i}.\n`);
528
+ }
529
+ const result = await relocateOrphanSnippets(dir, {
530
+ navigation: { pages: ['page'] },
531
+ });
532
+ // 5 imported (snip-0..4), 4 unimported but present (snip-5..8).
533
+ // Imported five all qualify → 5 moves, no abort.
534
+ expect(result.aborted).toBeUndefined();
535
+ expect(result.moves).toHaveLength(5);
536
+ }
537
+ finally {
538
+ await rm(dir, { recursive: true, force: true });
539
+ }
540
+ });
541
+ });
542
+ //# sourceMappingURL=relocate-snippets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocate-snippets.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/relocate-snippets.test.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * - the failure path (stderr surfaced via result.stderr, not just thrown),
7
7
  * - the maxBuffer ceiling (50MB absorbs >1MB stdout).
8
8
  */
9
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
10
10
  import fs from 'fs-extra';
11
11
  import path from 'path';
12
12
  import { tmpdir } from 'os';
@@ -54,5 +54,27 @@ describe('runBuildScript', () => {
54
54
  expect(result.success).toBe(false);
55
55
  expect(result.error).toBeDefined();
56
56
  });
57
+ it('surfaces stderr from a successful script in non-verbose mode', async () => {
58
+ // compile-snippets emits collision warnings via console.warn (stderr)
59
+ // even when the build itself succeeds. If runBuildScript swallowed those,
60
+ // the user would never see the warning that explains why the next dev
61
+ // start mysteriously crashes.
62
+ fs.writeFileSync(path.join(scriptsDir, 'warn.cjs'), `console.warn(' ⚠ warning surface check');\nconsole.log('all good');`);
63
+ const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
64
+ const stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
65
+ try {
66
+ const result = await runBuildScript('warn.cjs', { cwd, env: process.env, verbose: false });
67
+ expect(result.success).toBe(true);
68
+ const stderrOutput = stderrSpy.mock.calls.map((c) => c[0]).join('');
69
+ expect(stderrOutput).toContain('warning surface check');
70
+ // Non-verbose: stdout from a successful script stays suppressed.
71
+ const stdoutOutput = stdoutSpy.mock.calls.map((c) => c[0]).join('');
72
+ expect(stdoutOutput).not.toContain('all good');
73
+ }
74
+ finally {
75
+ stderrSpy.mockRestore();
76
+ stdoutSpy.mockRestore();
77
+ }
78
+ });
57
79
  });
58
80
  //# sourceMappingURL=run-build-script.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-build-script.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/run-build-script.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-build-script.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/run-build-script.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=warn-relative-imports.test.d.ts.map