jamdesk 1.1.129 → 1.1.131

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 (91) hide show
  1. package/dist/__tests__/unit/deps-sync.test.js +6 -1
  2. package/dist/__tests__/unit/deps-sync.test.js.map +1 -1
  3. package/dist/__tests__/unit/migrate-mdx.test.js +54 -0
  4. package/dist/__tests__/unit/migrate-mdx.test.js.map +1 -1
  5. package/dist/__tests__/unit/migrate-noindex-warning.test.d.ts +2 -0
  6. package/dist/__tests__/unit/migrate-noindex-warning.test.d.ts.map +1 -0
  7. package/dist/__tests__/unit/migrate-noindex-warning.test.js +115 -0
  8. package/dist/__tests__/unit/migrate-noindex-warning.test.js.map +1 -0
  9. package/dist/__tests__/unit/risky-expression-scanner-sync.test.d.ts +2 -0
  10. package/dist/__tests__/unit/risky-expression-scanner-sync.test.d.ts.map +1 -0
  11. package/dist/__tests__/unit/risky-expression-scanner-sync.test.js +43 -0
  12. package/dist/__tests__/unit/risky-expression-scanner-sync.test.js.map +1 -0
  13. package/dist/__tests__/unit/snippet-component-convert.test.d.ts +2 -0
  14. package/dist/__tests__/unit/snippet-component-convert.test.d.ts.map +1 -0
  15. package/dist/__tests__/unit/snippet-component-convert.test.js +105 -0
  16. package/dist/__tests__/unit/snippet-component-convert.test.js.map +1 -0
  17. package/dist/__tests__/unit/snippet-scanner-sync.test.d.ts +2 -0
  18. package/dist/__tests__/unit/snippet-scanner-sync.test.d.ts.map +1 -0
  19. package/dist/__tests__/unit/snippet-scanner-sync.test.js +43 -0
  20. package/dist/__tests__/unit/snippet-scanner-sync.test.js.map +1 -0
  21. package/dist/__tests__/unit/validate-risky-expressions.test.d.ts +17 -0
  22. package/dist/__tests__/unit/validate-risky-expressions.test.d.ts.map +1 -0
  23. package/dist/__tests__/unit/validate-risky-expressions.test.js +111 -0
  24. package/dist/__tests__/unit/validate-risky-expressions.test.js.map +1 -0
  25. package/dist/__tests__/unit/validate-snippets.test.d.ts +19 -0
  26. package/dist/__tests__/unit/validate-snippets.test.d.ts.map +1 -0
  27. package/dist/__tests__/unit/validate-snippets.test.js +190 -0
  28. package/dist/__tests__/unit/validate-snippets.test.js.map +1 -0
  29. package/dist/commands/migrate/convert-mdx.d.ts +12 -0
  30. package/dist/commands/migrate/convert-mdx.d.ts.map +1 -1
  31. package/dist/commands/migrate/convert-mdx.js +72 -2
  32. package/dist/commands/migrate/convert-mdx.js.map +1 -1
  33. package/dist/commands/migrate/convert.d.ts +11 -0
  34. package/dist/commands/migrate/convert.d.ts.map +1 -1
  35. package/dist/commands/migrate/convert.js +22 -0
  36. package/dist/commands/migrate/convert.js.map +1 -1
  37. package/dist/commands/migrate/index.d.ts.map +1 -1
  38. package/dist/commands/migrate/index.js +12 -8
  39. package/dist/commands/migrate/index.js.map +1 -1
  40. package/dist/commands/migrate/snippet-component-convert.d.ts +45 -0
  41. package/dist/commands/migrate/snippet-component-convert.d.ts.map +1 -0
  42. package/dist/commands/migrate/snippet-component-convert.js +222 -0
  43. package/dist/commands/migrate/snippet-component-convert.js.map +1 -0
  44. package/dist/commands/validate.d.ts.map +1 -1
  45. package/dist/commands/validate.js +39 -0
  46. package/dist/commands/validate.js.map +1 -1
  47. package/dist/lib/deps.d.ts.map +1 -1
  48. package/dist/lib/deps.js +4 -1
  49. package/dist/lib/deps.js.map +1 -1
  50. package/dist/lib/risky-expression-scanner.d.ts +32 -0
  51. package/dist/lib/risky-expression-scanner.d.ts.map +1 -0
  52. package/dist/lib/risky-expression-scanner.js +195 -0
  53. package/dist/lib/risky-expression-scanner.js.map +1 -0
  54. package/dist/lib/snippet-scanner.d.ts +78 -0
  55. package/dist/lib/snippet-scanner.d.ts.map +1 -0
  56. package/dist/lib/snippet-scanner.js +198 -0
  57. package/dist/lib/snippet-scanner.js.map +1 -0
  58. package/dist/lib/validate-risky-expressions.d.ts +34 -0
  59. package/dist/lib/validate-risky-expressions.d.ts.map +1 -0
  60. package/dist/lib/validate-risky-expressions.js +54 -0
  61. package/dist/lib/validate-risky-expressions.js.map +1 -0
  62. package/dist/lib/validate-snippets.d.ts +37 -0
  63. package/dist/lib/validate-snippets.d.ts.map +1 -0
  64. package/dist/lib/validate-snippets.js +71 -0
  65. package/dist/lib/validate-snippets.js.map +1 -0
  66. package/package.json +7 -2
  67. package/vendored/components/errors/MdxRenderBoundary.tsx +52 -0
  68. package/vendored/components/mdx/MDXComponents.tsx +3 -0
  69. package/vendored/components/mdx/MdxErrorBlock.tsx +42 -0
  70. package/vendored/lib/isr-build-executor.ts +13 -0
  71. package/vendored/lib/recma-collect-missing-refs.ts +51 -0
  72. package/vendored/lib/recma-guard-expressions.ts +230 -0
  73. package/vendored/lib/render-doc-page.tsx +121 -30
  74. package/vendored/lib/risky-expression-scanner.ts +225 -0
  75. package/vendored/lib/snippet-scanner.ts +237 -0
  76. package/vendored/lib/static-artifacts.ts +22 -10
  77. package/vendored/lib/static-file-route.ts +19 -8
  78. package/vendored/shared/status-reporter.ts +1 -1
  79. package/vendored/workspace-package-lock.json +11 -10
  80. package/dist/__tests__/unit/dev-workspace-symlinks.test.d.ts +0 -2
  81. package/dist/__tests__/unit/dev-workspace-symlinks.test.d.ts.map +0 -1
  82. package/dist/__tests__/unit/dev-workspace-symlinks.test.js +0 -112
  83. package/dist/__tests__/unit/dev-workspace-symlinks.test.js.map +0 -1
  84. package/dist/__tests__/unit/language-filter.test.d.ts +0 -2
  85. package/dist/__tests__/unit/language-filter.test.d.ts.map +0 -1
  86. package/dist/__tests__/unit/language-filter.test.js +0 -166
  87. package/dist/__tests__/unit/language-filter.test.js.map +0 -1
  88. package/dist/lib/language-filter.d.ts +0 -31
  89. package/dist/lib/language-filter.d.ts.map +0 -1
  90. package/dist/lib/language-filter.js +0 -14
  91. package/dist/lib/language-filter.js.map +0 -1
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Tests for validate-risky-expressions.ts
3
+ *
4
+ * Mirrors the shape of validate-snippets.test.ts. Focuses on the
5
+ * `validateRiskyExpressions` function — fast, pure-ish, no process.exit.
6
+ *
7
+ * Key properties:
8
+ * - A page with a `{x, y}`-style undefined-reference expression → warning.
9
+ * - A page with only valid expressions ({2+2}, {Math.max(...)}, props) → none.
10
+ * - Scans the full file list it's given (orphan pages included).
11
+ * - Returns warnings WITHOUT throwing / without a non-zero exit code.
12
+ *
13
+ * The exhaustive scanner-behavior suite lives in build-service's
14
+ * __tests__/lib/risky-expression-scanner.test.ts (same scanner, vendored).
15
+ */
16
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
17
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
18
+ import { tmpdir } from 'node:os';
19
+ import path from 'node:path';
20
+ import { validateRiskyExpressions } from '../../lib/validate-risky-expressions.js';
21
+ let projectDir;
22
+ beforeEach(() => {
23
+ projectDir = mkdtempSync(path.join(tmpdir(), 'jamdesk-risky-val-'));
24
+ });
25
+ afterEach(() => {
26
+ rmSync(projectDir, { recursive: true, force: true });
27
+ });
28
+ function write(relPath, content) {
29
+ const abs = path.join(projectDir, relPath);
30
+ mkdirSync(path.dirname(abs), { recursive: true });
31
+ writeFileSync(abs, content);
32
+ }
33
+ describe('validateRiskyExpressions — undefined-reference expressions', () => {
34
+ it('warns on the {x, y} literal-braces bug', async () => {
35
+ write('tests/tap.mdx', 'Coordinates: {x, y} pixel positions.\n');
36
+ const warnings = await validateRiskyExpressions(projectDir, ['tests/tap.mdx']);
37
+ expect(warnings).toHaveLength(1);
38
+ expect(warnings[0].file).toBe('tests/tap.mdx');
39
+ expect(warnings[0].message).toContain('tests/tap.mdx');
40
+ expect(warnings[0].message).toContain('`x`');
41
+ });
42
+ it('warns on a single undefined identifier', async () => {
43
+ write('page.mdx', 'Hello {name}, welcome.\n');
44
+ const warnings = await validateRiskyExpressions(projectDir, ['page.mdx']);
45
+ expect(warnings).toHaveLength(1);
46
+ expect(warnings[0].message).toContain('`name`');
47
+ });
48
+ });
49
+ describe('validateRiskyExpressions — valid expressions are not flagged', () => {
50
+ it('does NOT warn on literal/global/props expressions', async () => {
51
+ write('p.mdx', 'Sum {2 + 2}, max {Math.max(1, 2)}, prop {props.x}, year {new Date().getFullYear()}.\n');
52
+ const warnings = await validateRiskyExpressions(projectDir, ['p.mdx']);
53
+ expect(warnings).toHaveLength(0);
54
+ });
55
+ it('does NOT warn on imported/exported bindings', async () => {
56
+ write('p.mdx', "import Foo from '/snippets/foo.mdx'\nexport const greeting = 'hi'\n\n{Foo} {greeting}\n");
57
+ const warnings = await validateRiskyExpressions(projectDir, ['p.mdx']);
58
+ expect(warnings).toHaveLength(0);
59
+ });
60
+ it('does NOT warn on braces inside fenced or inline code', async () => {
61
+ write('p.mdx', 'Inline `{x, y}` is code.\n\n```js\nconst {x, y} = pt\n```\n');
62
+ const warnings = await validateRiskyExpressions(projectDir, ['p.mdx']);
63
+ expect(warnings).toHaveLength(0);
64
+ });
65
+ });
66
+ describe('validateRiskyExpressions — orphan pages (full project walk)', () => {
67
+ it('warns on a page that is NOT in navigation but IS in the file list', async () => {
68
+ write('orphan-not-in-nav.mdx', 'Coordinates: {x, y}.\n');
69
+ const warnings = await validateRiskyExpressions(projectDir, ['orphan-not-in-nav.mdx']);
70
+ expect(warnings).toHaveLength(1);
71
+ expect(warnings[0].file).toBe('orphan-not-in-nav.mdx');
72
+ });
73
+ });
74
+ describe('validateRiskyExpressions — robustness', () => {
75
+ it('skips files that do not exist on disk (no throw)', async () => {
76
+ const warnings = await validateRiskyExpressions(projectDir, ['nonexistent.mdx']);
77
+ expect(warnings).toHaveLength(0);
78
+ });
79
+ it('accepts absolute file paths (the full project walk passes absolutes)', async () => {
80
+ write('tests/tap.mdx', 'Coordinates: {x, y}.\n');
81
+ const warnings = await validateRiskyExpressions(projectDir, [
82
+ path.join(projectDir, 'tests/tap.mdx'),
83
+ ]);
84
+ expect(warnings).toHaveLength(1);
85
+ expect(warnings[0].file).toBe('tests/tap.mdx');
86
+ });
87
+ it('does not throw on malformed MDX (returns no warnings)', async () => {
88
+ write('p.mdx', '<Tabs>\n\nunclosed\n');
89
+ await expect(validateRiskyExpressions(projectDir, ['p.mdx'])).resolves.toBeDefined();
90
+ });
91
+ it('caps at 50 warnings even when there are more issues', async () => {
92
+ const files = [];
93
+ for (let i = 0; i < 60; i++) {
94
+ write(`page-${i}.mdx`, `Value: {undefinedVar${i}}.\n`);
95
+ files.push(`page-${i}.mdx`);
96
+ }
97
+ const warnings = await validateRiskyExpressions(projectDir, files);
98
+ expect(warnings.length).toBe(50);
99
+ });
100
+ it('returns no warnings when there are no files', async () => {
101
+ const warnings = await validateRiskyExpressions(projectDir, []);
102
+ expect(warnings).toHaveLength(0);
103
+ });
104
+ it('supports .md files (not just .mdx)', async () => {
105
+ write('guide.md', 'Coordinates: {x, y}.\n');
106
+ const warnings = await validateRiskyExpressions(projectDir, ['guide.md']);
107
+ expect(warnings).toHaveLength(1);
108
+ expect(warnings[0].file).toBe('guide.md');
109
+ });
110
+ });
111
+ //# sourceMappingURL=validate-risky-expressions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-risky-expressions.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/validate-risky-expressions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Tests for validate-snippets.ts
3
+ *
4
+ * Mirrors the shape of validate-image-refs.test.ts.
5
+ * Focuses on the `validateSnippets` function — fast, pure-ish, no process.exit.
6
+ *
7
+ * Key properties:
8
+ * - A page with a <Snippet file="x"/> tag → unsupported_tag warning.
9
+ * - A page importing a MISSING /snippets/… target → missing_import warning.
10
+ * - A page importing a PRESENT snippet → NO warning.
11
+ * - Scans the full file list it's given (orphan pages included), mirroring
12
+ * the cloud build — NOT just navigation pages.
13
+ * - Validator returns warnings WITHOUT throwing / without a non-zero exit code.
14
+ *
15
+ * validateSnippets takes a list of MDX/MD files (absolute or relative to
16
+ * projectDir), so the helpers below pass the written page paths explicitly.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=validate-snippets.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-snippets.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/validate-snippets.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Tests for validate-snippets.ts
3
+ *
4
+ * Mirrors the shape of validate-image-refs.test.ts.
5
+ * Focuses on the `validateSnippets` function — fast, pure-ish, no process.exit.
6
+ *
7
+ * Key properties:
8
+ * - A page with a <Snippet file="x"/> tag → unsupported_tag warning.
9
+ * - A page importing a MISSING /snippets/… target → missing_import warning.
10
+ * - A page importing a PRESENT snippet → NO warning.
11
+ * - Scans the full file list it's given (orphan pages included), mirroring
12
+ * the cloud build — NOT just navigation pages.
13
+ * - Validator returns warnings WITHOUT throwing / without a non-zero exit code.
14
+ *
15
+ * validateSnippets takes a list of MDX/MD files (absolute or relative to
16
+ * projectDir), so the helpers below pass the written page paths explicitly.
17
+ */
18
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
19
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
20
+ import { tmpdir } from 'node:os';
21
+ import path from 'node:path';
22
+ import { validateSnippets } from '../../lib/validate-snippets.js';
23
+ // ---------------------------------------------------------------------------
24
+ // Helpers
25
+ // ---------------------------------------------------------------------------
26
+ let projectDir;
27
+ beforeEach(() => {
28
+ projectDir = mkdtempSync(path.join(tmpdir(), 'jamdesk-snippet-val-'));
29
+ });
30
+ afterEach(() => {
31
+ rmSync(projectDir, { recursive: true, force: true });
32
+ });
33
+ function write(relPath, content) {
34
+ const abs = path.join(projectDir, relPath);
35
+ mkdirSync(path.dirname(abs), { recursive: true });
36
+ writeFileSync(abs, content);
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // <Snippet> tag → unsupported_tag warning
40
+ // ---------------------------------------------------------------------------
41
+ describe('validateSnippets — <Snippet> tag (unsupported_tag)', () => {
42
+ it('returns a warning for a page with a <Snippet file="x"/> tag', async () => {
43
+ write('guide/intro.mdx', `<Snippet file="foo.mdx" />`);
44
+ const warnings = await validateSnippets(projectDir, ['guide/intro.mdx']);
45
+ expect(warnings).toHaveLength(1);
46
+ expect(warnings[0].file).toBe('guide/intro.mdx');
47
+ expect(warnings[0].variant).toBe('unsupported_tag');
48
+ // Message must contain the backtick-wrapped token so renderers don't drop it
49
+ expect(warnings[0].message).toContain('`<Snippet>`');
50
+ expect(warnings[0].message).toContain('foo.mdx');
51
+ expect(warnings[0].message).toContain('import');
52
+ });
53
+ it('returns a warning for a bare <Snippet/> with no file attr', async () => {
54
+ write('page.mdx', `<Snippet />`);
55
+ const warnings = await validateSnippets(projectDir, ['page.mdx']);
56
+ expect(warnings).toHaveLength(1);
57
+ expect(warnings[0].message).toContain('`<Snippet>`');
58
+ });
59
+ it('warns even when the referenced snippet file EXISTS (tag is always unsupported)', async () => {
60
+ // Critical: the tag is never valid regardless of file existence.
61
+ // A naive existence check would wrongly suppress this.
62
+ write('snippets/existing.mdx', 'hello');
63
+ write('intro.mdx', `<Snippet file="existing.mdx" />`);
64
+ const warnings = await validateSnippets(projectDir, ['intro.mdx']);
65
+ expect(warnings).toHaveLength(1);
66
+ expect(warnings[0].message).toContain('`<Snippet>`');
67
+ });
68
+ });
69
+ // ---------------------------------------------------------------------------
70
+ // import … from '/snippets/…' with a missing target → missing_import warning
71
+ // ---------------------------------------------------------------------------
72
+ describe('validateSnippets — missing import (missing_import)', () => {
73
+ it('returns a warning for an import of a snippet that does not exist', async () => {
74
+ write('guide/page.mdx', `import MySnippet from '/snippets/missing.mdx'`);
75
+ const warnings = await validateSnippets(projectDir, ['guide/page.mdx']);
76
+ expect(warnings).toHaveLength(1);
77
+ expect(warnings[0].file).toBe('guide/page.mdx');
78
+ expect(warnings[0].variant).toBe('missing_import');
79
+ expect(warnings[0].message).toContain('missing.mdx');
80
+ expect(warnings[0].message).toContain('snippets/');
81
+ });
82
+ it('returns NO warning for an import of a snippet that DOES exist', async () => {
83
+ write('snippets/present.mdx', 'hello');
84
+ write('guide/page.mdx', `import Present from '/snippets/present.mdx'`);
85
+ const warnings = await validateSnippets(projectDir, ['guide/page.mdx']);
86
+ expect(warnings).toHaveLength(0);
87
+ });
88
+ it('handles extension mismatch: .tsx file on disk, .mdx in import path', async () => {
89
+ // normalizeSnippetRef strips extension on both sides → same key
90
+ write('snippets/card.tsx', 'export const Card = () => null');
91
+ write('page.mdx', `import Card from '/snippets/card.mdx'`);
92
+ const warnings = await validateSnippets(projectDir, ['page.mdx']);
93
+ expect(warnings).toHaveLength(0);
94
+ });
95
+ it('returns NO warning for non-snippet imports', async () => {
96
+ write('page.mdx', `import Button from '/components/Button'`);
97
+ const warnings = await validateSnippets(projectDir, ['page.mdx']);
98
+ expect(warnings).toHaveLength(0);
99
+ });
100
+ });
101
+ // ---------------------------------------------------------------------------
102
+ // Mixed page: both variants
103
+ // ---------------------------------------------------------------------------
104
+ describe('validateSnippets — mixed page', () => {
105
+ it('returns both unsupported_tag and missing_import warnings on the same page', async () => {
106
+ write('snippets/present.mdx', 'content');
107
+ write('page.mdx', [
108
+ `import P from '/snippets/present.mdx'`,
109
+ `import M from '/snippets/missing.mdx'`,
110
+ ``,
111
+ `<Snippet file="present.mdx" />`,
112
+ ].join('\n'));
113
+ const warnings = await validateSnippets(projectDir, ['page.mdx']);
114
+ // The <Snippet> tag always warns; the import of 'missing.mdx' warns; 'present.mdx' is fine
115
+ expect(warnings.length).toBeGreaterThanOrEqual(2);
116
+ expect(warnings.some(w => w.variant === 'unsupported_tag')).toBe(true);
117
+ expect(warnings.some(w => w.variant === 'missing_import' && w.message.includes('missing.mdx'))).toBe(true);
118
+ });
119
+ });
120
+ // ---------------------------------------------------------------------------
121
+ // Orphan pages: scans ALL given files, not just navigation pages
122
+ // ---------------------------------------------------------------------------
123
+ describe('validateSnippets — orphan pages (full project walk)', () => {
124
+ it('warns on a <Snippet> in a page that is NOT in navigation but IS in the file list', async () => {
125
+ // The cloud build scans every collected MDX file. The CLI is passed the
126
+ // same full project walk, so an orphan page (not referenced by docs.json
127
+ // navigation) must still be scanned and warned.
128
+ write('orphan-not-in-nav.mdx', `<Snippet file="foo.mdx" />`);
129
+ const warnings = await validateSnippets(projectDir, ['orphan-not-in-nav.mdx']);
130
+ expect(warnings).toHaveLength(1);
131
+ expect(warnings[0].file).toBe('orphan-not-in-nav.mdx');
132
+ expect(warnings[0].variant).toBe('unsupported_tag');
133
+ });
134
+ });
135
+ // ---------------------------------------------------------------------------
136
+ // No warnings when everything is clean
137
+ // ---------------------------------------------------------------------------
138
+ describe('validateSnippets — clean project', () => {
139
+ it('returns no warnings when snippets are properly imported and present', async () => {
140
+ write('snippets/shared.mdx', 'shared content');
141
+ write('intro.mdx', `import Shared from '/snippets/shared.mdx'\n\n<Shared />`);
142
+ const warnings = await validateSnippets(projectDir, ['intro.mdx']);
143
+ expect(warnings).toHaveLength(0);
144
+ });
145
+ it('returns no warnings when no pages have snippet-related content', async () => {
146
+ write('intro.mdx', `# Hello\n\nJust some text.`);
147
+ const warnings = await validateSnippets(projectDir, ['intro.mdx']);
148
+ expect(warnings).toHaveLength(0);
149
+ });
150
+ it('returns no warnings when there are no files', async () => {
151
+ const warnings = await validateSnippets(projectDir, []);
152
+ expect(warnings).toHaveLength(0);
153
+ });
154
+ });
155
+ // ---------------------------------------------------------------------------
156
+ // Robustness
157
+ // ---------------------------------------------------------------------------
158
+ describe('validateSnippets — robustness', () => {
159
+ it('skips files that do not exist on disk (no throw)', async () => {
160
+ // 'nonexistent.mdx' was never written — must not throw
161
+ const warnings = await validateSnippets(projectDir, ['nonexistent.mdx']);
162
+ expect(warnings).toHaveLength(0);
163
+ });
164
+ it('accepts absolute file paths (the full project walk passes absolutes)', async () => {
165
+ write('guide/intro.mdx', `<Snippet file="foo.mdx" />`);
166
+ const warnings = await validateSnippets(projectDir, [
167
+ path.join(projectDir, 'guide/intro.mdx'),
168
+ ]);
169
+ expect(warnings).toHaveLength(1);
170
+ expect(warnings[0].file).toBe('guide/intro.mdx');
171
+ });
172
+ it('caps at 50 warnings even when there are more issues', async () => {
173
+ // Write 60 pages each with one <Snippet> tag
174
+ const files = [];
175
+ for (let i = 0; i < 60; i++) {
176
+ write(`page-${i}.mdx`, `<Snippet file="x-${i}.mdx" />`);
177
+ files.push(`page-${i}.mdx`);
178
+ }
179
+ const warnings = await validateSnippets(projectDir, files);
180
+ expect(warnings.length).toBeLessThanOrEqual(50);
181
+ expect(warnings.length).toBe(50);
182
+ });
183
+ it('supports .md files (not just .mdx)', async () => {
184
+ write('guide.md', `<Snippet file="foo.mdx" />`);
185
+ const warnings = await validateSnippets(projectDir, ['guide.md']);
186
+ expect(warnings).toHaveLength(1);
187
+ expect(warnings[0].file).toBe('guide.md');
188
+ });
189
+ });
190
+ //# sourceMappingURL=validate-snippets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-snippets.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/validate-snippets.test.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,18 @@
7
7
  */
8
8
  import { convertDeprecatedComponents } from '../../lib/deprecated-components.js';
9
9
  export { convertDeprecatedComponents };
10
+ /**
11
+ * Resolve a `<Snippet file="X">` reference to the canonical root-relative import
12
+ * spec (`/snippets/…`) Jamdesk understands, when it points at an existing file
13
+ * under the project's `snippets/` directory — else `null` (leave untouched).
14
+ *
15
+ * Two resolution bases are tried, both clamped to `snippets/` so a converted
16
+ * import can actually resolve at build time (Jamdesk only resolves
17
+ * `/snippets/*`) and so a `../`-escaping `file` can never import outside it:
18
+ * 1. snippets-root relative (the Mintlify convention: `file="essentials/x.mdx"`)
19
+ * 2. page-relative (`file="../snippets/x.mdx"` from the page's own directory)
20
+ */
21
+ export declare function resolveSnippetImportSpec(fileAttr: string, pageFile: string, projectDir: string): string | null;
10
22
  export interface MdxMigrationResult {
11
23
  file: string;
12
24
  changes: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"convert-mdx.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/convert-mdx.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAIjF,OAAO,EAAE,2BAA2B,EAAE,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA+B5F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmB3F;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoC/E"}
1
+ {"version":3,"file":"convert-mdx.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/convert-mdx.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAMjF,OAAO,EAAE,2BAA2B,EAAE,CAAC;AAQvC;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CA2Bf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA+B5F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmB3F;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkE/E"}
@@ -10,8 +10,53 @@ import path from 'path';
10
10
  import { glob } from 'glob';
11
11
  import { convertDeprecatedComponents } from '../../lib/deprecated-components.js';
12
12
  import { rewriteRelativeMdxImports } from '../../lib/relative-mdx-imports.js';
13
+ import { convertSnippetComponents } from './snippet-component-convert.js';
14
+ import { findRiskyExpressions } from '../../lib/risky-expression-scanner.js';
13
15
  // Re-export for use by tests and other modules
14
16
  export { convertDeprecatedComponents };
17
+ /** True when `child` is strictly inside `parent` (not equal, no `..` escape). */
18
+ function isUnderDir(child, parent) {
19
+ const rel = path.relative(parent, child);
20
+ return rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel);
21
+ }
22
+ /**
23
+ * Resolve a `<Snippet file="X">` reference to the canonical root-relative import
24
+ * spec (`/snippets/…`) Jamdesk understands, when it points at an existing file
25
+ * under the project's `snippets/` directory — else `null` (leave untouched).
26
+ *
27
+ * Two resolution bases are tried, both clamped to `snippets/` so a converted
28
+ * import can actually resolve at build time (Jamdesk only resolves
29
+ * `/snippets/*`) and so a `../`-escaping `file` can never import outside it:
30
+ * 1. snippets-root relative (the Mintlify convention: `file="essentials/x.mdx"`)
31
+ * 2. page-relative (`file="../snippets/x.mdx"` from the page's own directory)
32
+ */
33
+ export function resolveSnippetImportSpec(fileAttr, pageFile, projectDir) {
34
+ const snippetsRoot = path.join(projectDir, 'snippets');
35
+ const rel = fileAttr.replace(/^\//, '');
36
+ const relNoSnippets = rel.replace(/^snippets[\\/]/, '');
37
+ const candidates = [
38
+ path.join(snippetsRoot, relNoSnippets), // snippets-root relative (Mintlify)
39
+ path.resolve(path.dirname(pageFile), fileAttr), // page-relative
40
+ ];
41
+ for (const candidate of candidates) {
42
+ try {
43
+ // `statSync` throws ENOENT for a missing path (caught below), so it
44
+ // doubles as the existence check — no separate `existsSync` stat needed.
45
+ if (fs.statSync(candidate).isFile() &&
46
+ isUnderDir(candidate, snippetsRoot)) {
47
+ const relFromSnippets = path
48
+ .relative(snippetsRoot, candidate)
49
+ .split(path.sep)
50
+ .join('/');
51
+ return `/snippets/${relFromSnippets}`;
52
+ }
53
+ }
54
+ catch {
55
+ // ignore unreadable candidate, try the next
56
+ }
57
+ }
58
+ return null;
59
+ }
15
60
  /**
16
61
  * Normalize YouTube/video iframes to full-width with standard classes.
17
62
  *
@@ -95,11 +140,36 @@ export async function migrateMdxFiles(dir) {
95
140
  const original = await fs.readFile(file, 'utf-8');
96
141
  const { content: transformed, changes } = transformMdxContent(original);
97
142
  const importResult = await rewriteRelativeMdxImports(transformed, file, dir);
98
- const finalContent = importResult.content;
143
+ let finalContent = importResult.content;
99
144
  if (importResult.rewrites.length > 0) {
100
145
  changes.push(`Normalized ${importResult.rewrites.length} relative MDX import(s)`);
101
146
  }
102
- const warnings = importResult.warnings;
147
+ const warnings = [...importResult.warnings];
148
+ // Convert non-standard `<Snippet file="…">` tags to the supported import
149
+ // pattern, but ONLY when the referenced file actually exists under
150
+ // `snippets/` (the resolver returns null otherwise → tag left untouched, the
151
+ // build-time missing_snippet warning covers it).
152
+ const snippetResult = convertSnippetComponents(finalContent, (fileAttr) => resolveSnippetImportSpec(fileAttr, file, dir));
153
+ finalContent = snippetResult.content;
154
+ changes.push(...snippetResult.changes);
155
+ warnings.push(...snippetResult.warnings);
156
+ // Warn — but never auto-rewrite — on bare `{…}` prose that won't render
157
+ // (undefined references). Auto-escaping author prose is too aggressive; the
158
+ // recma render guard already keeps these from 500ing, and `jamdesk validate`
159
+ // surfaces the same `risky_expression` diagnostic. A file with no `{` can
160
+ // hold no expression, so skip the full MDX parse for those (the common case).
161
+ try {
162
+ const risky = finalContent.includes('{')
163
+ ? findRiskyExpressions(finalContent, path.relative(dir, file))
164
+ : [];
165
+ if (risky.length > 0) {
166
+ warnings.push(`${risky.length} bare {…} expression(s) won't render (e.g. \`{${risky[0].expression}}\`) — ` +
167
+ `wrap in backticks or escape as \\{…\\}.`);
168
+ }
169
+ }
170
+ catch {
171
+ // A parse failure here must never block migration — skip the diagnostic.
172
+ }
103
173
  if (finalContent !== original) {
104
174
  await fs.writeFile(file, finalContent, 'utf-8');
105
175
  filesModified++;
@@ -1 +1 @@
1
- {"version":3,"file":"convert-mdx.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert-mdx.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert-mdx.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert-mdx.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,17 @@ export interface JamdeskConfig {
58
58
  footerSocials?: undefined;
59
59
  [key: string]: unknown;
60
60
  }
61
+ /**
62
+ * Returns true when the converted config's `seo.metatags.robots` contains
63
+ * the substring "noindex" (case-insensitive). The explicit type guards below
64
+ * ensure no exception is thrown for any valid `Record<string, unknown>` input;
65
+ * absent or non-string values simply return false.
66
+ *
67
+ * Call this on the POST-conversion result so it catches both:
68
+ * - A Mintlify `metadata.robots` that was lifted into `seo.metatags`
69
+ * - A docs.json that already carried `seo.metatags.robots`
70
+ */
71
+ export declare function hasNoindexRobots(config: Record<string, unknown>): boolean;
61
72
  /**
62
73
  * Convert a Mintlify config object to Jamdesk format.
63
74
  *
@@ -1 +1 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAuBhE,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC;CACtC;AAGD,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC;CACvC;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAClC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,KAAK,EAAE,SAAS,EAChB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,aAAa,CA2Lf"}
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAuBhE,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC;CACtC;AAGD,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC;CACvC;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAClC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAQzE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,KAAK,EAAE,SAAS,EAChB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,aAAa,CA2Lf"}
@@ -8,6 +8,28 @@
8
8
  * This module is designed to be extensible - add new converters as needed.
9
9
  */
10
10
  import { JAMDESK_SCHEMA_URL } from './types.js';
11
+ /**
12
+ * Returns true when the converted config's `seo.metatags.robots` contains
13
+ * the substring "noindex" (case-insensitive). The explicit type guards below
14
+ * ensure no exception is thrown for any valid `Record<string, unknown>` input;
15
+ * absent or non-string values simply return false.
16
+ *
17
+ * Call this on the POST-conversion result so it catches both:
18
+ * - A Mintlify `metadata.robots` that was lifted into `seo.metatags`
19
+ * - A docs.json that already carried `seo.metatags.robots`
20
+ */
21
+ export function hasNoindexRobots(config) {
22
+ const seo = config.seo;
23
+ if (!seo || typeof seo !== 'object' || Array.isArray(seo))
24
+ return false;
25
+ const metatags = seo.metatags;
26
+ if (!metatags || typeof metatags !== 'object' || Array.isArray(metatags))
27
+ return false;
28
+ const robots = metatags.robots;
29
+ if (typeof robots !== 'string')
30
+ return false;
31
+ return robots.toLowerCase().includes('noindex');
32
+ }
11
33
  /**
12
34
  * Convert a Mintlify config object to Jamdesk format.
13
35
  *
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAmBH,OAAO,EAAU,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EACzB,eAAe,EAAE,OAAO,EACxB,aAAa,EAAE,OAAO,GACrB,SAAS,GAAG,IAAI,CAmBlB;AAgFD,wBAAsB,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ZtE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAmBH,OAAO,EAAU,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EACzB,eAAe,EAAE,OAAO,EACxB,aAAa,EAAE,OAAO,GACrB,SAAS,GAAG,IAAI,CAmBlB;AAgFD,wBAAsB,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoatE"}