jamdesk 1.1.110 → 1.1.112
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.
- package/dist/__tests__/unit/validate-image-refs.test.d.ts +2 -0
- package/dist/__tests__/unit/validate-image-refs.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validate-image-refs.test.js +157 -0
- package/dist/__tests__/unit/validate-image-refs.test.js.map +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +13 -0
- package/dist/commands/validate.js.map +1 -1
- package/dist/lib/validate-image-refs.d.ts +45 -0
- package/dist/lib/validate-image-refs.d.ts.map +1 -0
- package/dist/lib/validate-image-refs.js +142 -0
- package/dist/lib/validate-image-refs.js.map +1 -0
- package/package.json +1 -1
- package/vendored/components/mdx/MDXComponents.tsx +1 -1
- package/vendored/components/navigation/Sidebar.tsx +25 -5
- package/vendored/components/navigation/TabsNav.tsx +18 -49
- package/vendored/workspace-package-lock.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-image-refs.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/validate-image-refs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { extractImageRefs, validateImageRefs, } from '../../lib/validate-image-refs.js';
|
|
6
|
+
describe('extractImageRefs', () => {
|
|
7
|
+
it('extracts <img src="..."> with quoted string literal', () => {
|
|
8
|
+
const refs = extractImageRefs(`# Title\n\n<img src="/images/foo.webp" alt="..." />`);
|
|
9
|
+
expect(refs).toEqual([{ src: '/images/foo.webp', line: 3 }]);
|
|
10
|
+
});
|
|
11
|
+
it('extracts <Image src="..."> capitalized component', () => {
|
|
12
|
+
const refs = extractImageRefs(`<Image src="/x/y.png" width="100" />`);
|
|
13
|
+
expect(refs).toEqual([{ src: '/x/y.png', line: 1 }]);
|
|
14
|
+
});
|
|
15
|
+
it('extracts markdown  syntax', () => {
|
|
16
|
+
const refs = extractImageRefs(``);
|
|
17
|
+
expect(refs).toEqual([{ src: '/images/bar.png', line: 1 }]);
|
|
18
|
+
});
|
|
19
|
+
it('extracts markdown image with title attribute', () => {
|
|
20
|
+
const refs = extractImageRefs(``);
|
|
21
|
+
expect(refs).toEqual([{ src: '/a.png', line: 1 }]);
|
|
22
|
+
});
|
|
23
|
+
it('reports the correct line for multi-line content', () => {
|
|
24
|
+
const refs = extractImageRefs(`line 1\nline 2\n<img src="/x.png" />\nline 4`);
|
|
25
|
+
expect(refs).toEqual([{ src: '/x.png', line: 3 }]);
|
|
26
|
+
});
|
|
27
|
+
it('ignores JSX with dynamic src={expression}', () => {
|
|
28
|
+
const refs = extractImageRefs(`<img src={dynamicVar} alt="x" />`);
|
|
29
|
+
expect(refs).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
it('finds multiple refs in one file', () => {
|
|
32
|
+
const refs = extractImageRefs(`<img src="/a.png" />\n<img src="/b.png" />\n`);
|
|
33
|
+
expect(refs).toEqual([
|
|
34
|
+
{ src: '/a.png', line: 1 },
|
|
35
|
+
{ src: '/b.png', line: 2 },
|
|
36
|
+
{ src: '/c.png', line: 3 },
|
|
37
|
+
]);
|
|
38
|
+
});
|
|
39
|
+
it('ignores image syntax inside inline code spans', () => {
|
|
40
|
+
// Tutorials show example syntax via inline code: \`\`
|
|
41
|
+
const refs = extractImageRefs('Use the `` syntax to reference an image.');
|
|
42
|
+
expect(refs).toEqual([]);
|
|
43
|
+
});
|
|
44
|
+
it('ignores image syntax inside HTML comments (single and multi-line)', () => {
|
|
45
|
+
const refs = extractImageRefs([
|
|
46
|
+
'<!--  -->',
|
|
47
|
+
'',
|
|
48
|
+
'<!--',
|
|
49
|
+
'',
|
|
50
|
+
'-->',
|
|
51
|
+
'',
|
|
52
|
+
'<img src="/real.png" />',
|
|
53
|
+
].join('\n'));
|
|
54
|
+
expect(refs).toEqual([{ src: '/real.png', line: 7 }]);
|
|
55
|
+
});
|
|
56
|
+
it('ignores image syntax inside indented fenced code blocks', () => {
|
|
57
|
+
// 4-space indent — common inside <Tab>/<Steps>/<Frame> wrappers in MDX
|
|
58
|
+
const refs = extractImageRefs([
|
|
59
|
+
'<Tab>',
|
|
60
|
+
' ```markdown',
|
|
61
|
+
' ',
|
|
62
|
+
' ```',
|
|
63
|
+
'</Tab>',
|
|
64
|
+
'',
|
|
65
|
+
'<img src="/real.png" />',
|
|
66
|
+
].join('\n'));
|
|
67
|
+
expect(refs).toEqual([{ src: '/real.png', line: 7 }]);
|
|
68
|
+
});
|
|
69
|
+
it('ignores image syntax inside fenced code blocks', () => {
|
|
70
|
+
const refs = extractImageRefs([
|
|
71
|
+
'Example:',
|
|
72
|
+
'',
|
|
73
|
+
'```markdown',
|
|
74
|
+
'',
|
|
75
|
+
'<img src="/also-example.png" />',
|
|
76
|
+
'```',
|
|
77
|
+
'',
|
|
78
|
+
'Real image here:',
|
|
79
|
+
'<img src="/real.png" />',
|
|
80
|
+
].join('\n'));
|
|
81
|
+
expect(refs).toEqual([{ src: '/real.png', line: 9 }]);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('validateImageRefs', () => {
|
|
85
|
+
let projectDir;
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
projectDir = mkdtempSync(path.join(tmpdir(), 'jamdesk-img-refs-'));
|
|
88
|
+
});
|
|
89
|
+
afterEach(() => {
|
|
90
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
91
|
+
});
|
|
92
|
+
function write(relPath, content) {
|
|
93
|
+
const abs = path.join(projectDir, relPath);
|
|
94
|
+
mkdirSync(path.dirname(abs), { recursive: true });
|
|
95
|
+
writeFileSync(abs, content);
|
|
96
|
+
}
|
|
97
|
+
it('returns no warnings when all referenced images exist', async () => {
|
|
98
|
+
write('images/logo.webp', '');
|
|
99
|
+
write('page.mdx', `<img src="/images/logo.webp" alt="logo" />`);
|
|
100
|
+
const warnings = await validateImageRefs(projectDir);
|
|
101
|
+
expect(warnings).toEqual([]);
|
|
102
|
+
});
|
|
103
|
+
it('reports missing project-absolute image references', async () => {
|
|
104
|
+
write('page.mdx', `<img src="/images/missing.webp" alt="x" />`);
|
|
105
|
+
const warnings = await validateImageRefs(projectDir);
|
|
106
|
+
expect(warnings).toHaveLength(1);
|
|
107
|
+
expect(warnings[0]).toMatchObject({
|
|
108
|
+
file: 'page.mdx',
|
|
109
|
+
line: 1,
|
|
110
|
+
src: '/images/missing.webp',
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
it('skips external URLs (http/https/protocol-relative/data)', async () => {
|
|
114
|
+
write('page.mdx', [
|
|
115
|
+
`<img src="https://example.com/a.png" />`,
|
|
116
|
+
`<img src="http://example.com/b.png" />`,
|
|
117
|
+
`<img src="//example.com/c.png" />`,
|
|
118
|
+
`<img src="data:image/png;base64,iVBORw0KGgo=" />`,
|
|
119
|
+
].join('\n'));
|
|
120
|
+
const warnings = await validateImageRefs(projectDir);
|
|
121
|
+
expect(warnings).toEqual([]);
|
|
122
|
+
});
|
|
123
|
+
it('resolves relative paths against the containing MDX directory', async () => {
|
|
124
|
+
write('guides/here.png', '');
|
|
125
|
+
write('guides/page.mdx', `<img src="./here.png" />`);
|
|
126
|
+
const warnings = await validateImageRefs(projectDir);
|
|
127
|
+
expect(warnings).toEqual([]);
|
|
128
|
+
});
|
|
129
|
+
it('reports missing relative-path images', async () => {
|
|
130
|
+
write('guides/page.mdx', `<img src="./missing.png" />`);
|
|
131
|
+
const warnings = await validateImageRefs(projectDir);
|
|
132
|
+
expect(warnings).toHaveLength(1);
|
|
133
|
+
expect(warnings[0].file).toBe('guides/page.mdx');
|
|
134
|
+
});
|
|
135
|
+
it('strips query string and fragment before fs check', async () => {
|
|
136
|
+
write('images/logo.webp', '');
|
|
137
|
+
write('page.mdx', `<img src="/images/logo.webp?v=2#frag" />`);
|
|
138
|
+
const warnings = await validateImageRefs(projectDir);
|
|
139
|
+
expect(warnings).toEqual([]);
|
|
140
|
+
});
|
|
141
|
+
it('falls back to public/ for project-absolute paths', async () => {
|
|
142
|
+
write('public/images/logo.webp', '');
|
|
143
|
+
write('page.mdx', `<img src="/images/logo.webp" />`);
|
|
144
|
+
const warnings = await validateImageRefs(projectDir);
|
|
145
|
+
expect(warnings).toEqual([]);
|
|
146
|
+
});
|
|
147
|
+
it('catches the exact regression: <Frame><img /></Frame> with missing webp', async () => {
|
|
148
|
+
write('navigation/overview.mdx', `<Frame caption="...">\n <img src="/images/navigation/sidebar-group-collapsed.webp" alt="..." width="320" height="900" />\n</Frame>`);
|
|
149
|
+
const warnings = await validateImageRefs(projectDir);
|
|
150
|
+
expect(warnings).toHaveLength(1);
|
|
151
|
+
expect(warnings[0]).toMatchObject({
|
|
152
|
+
file: 'navigation/overview.mdx',
|
|
153
|
+
src: '/images/navigation/sidebar-group-collapsed.webp',
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=validate-image-refs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-image-refs.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/validate-image-refs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAUD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2StE"}
|
|
@@ -17,6 +17,7 @@ import { validateBrandingAssets } from '../lib/validate-branding.js';
|
|
|
17
17
|
import { ensureDependencies } from '../lib/deps.js';
|
|
18
18
|
import { rewriteRelativeMdxImports } from '../lib/relative-mdx-imports.js';
|
|
19
19
|
import { validateApiPagePanels } from '../lib/api-page-panel-validator.js';
|
|
20
|
+
import { validateImageRefs } from '../lib/validate-image-refs.js';
|
|
20
21
|
export async function validate(options) {
|
|
21
22
|
const { verbose } = options;
|
|
22
23
|
const cwd = process.cwd();
|
|
@@ -226,6 +227,18 @@ export async function validate(options) {
|
|
|
226
227
|
process.exit(1);
|
|
227
228
|
}
|
|
228
229
|
output.success('No deprecated components found');
|
|
230
|
+
// Step 3.6: Check image references in MDX point at existing files.
|
|
231
|
+
// Reuse the already-walked file list from Step 3.5 to avoid a second glob.
|
|
232
|
+
const imageWarnings = await validateImageRefs(projectDir, allMdxFiles.map((f) => path.join(projectDir, f)));
|
|
233
|
+
if (imageWarnings.length > 0) {
|
|
234
|
+
console.log('');
|
|
235
|
+
output.warn(`Found ${imageWarnings.length} broken image reference(s):`);
|
|
236
|
+
for (const w of imageWarnings) {
|
|
237
|
+
console.log(` - ${w.file}:${w.line} — ${w.src}`);
|
|
238
|
+
}
|
|
239
|
+
console.log('');
|
|
240
|
+
output.hint('Add the missing image file or update the reference in the MDX.');
|
|
241
|
+
}
|
|
229
242
|
// Step 4: Validate OpenAPI specs if configured
|
|
230
243
|
const config = result.config;
|
|
231
244
|
const openApiSpecs = config?.api?.openapi;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MDX Image Reference Validation (CLI)
|
|
3
|
+
*
|
|
4
|
+
* Scans MDX/MD content for image references and reports any that point at
|
|
5
|
+
* files which don't exist on disk. Catches the silent-link-rot scenario
|
|
6
|
+
* `jamdesk validate` previously missed.
|
|
7
|
+
*
|
|
8
|
+
* Recognized syntaxes:
|
|
9
|
+
* - JSX: <img src="..." /> and <Image src="..." />
|
|
10
|
+
* - Markdown inline: 
|
|
11
|
+
*
|
|
12
|
+
* Skipped:
|
|
13
|
+
* - External URLs (http://, https://, //, data:)
|
|
14
|
+
* - Empty/whitespace src values
|
|
15
|
+
* - Dynamic JSX expressions: src={someVar} (we can't statically resolve)
|
|
16
|
+
* - URL fragments and query strings — stripped before fs check
|
|
17
|
+
* - Reference-style markdown images: ![alt][ref] with [ref]: /path elsewhere.
|
|
18
|
+
* Not currently used in Jamdesk content (grep across all docs finds zero
|
|
19
|
+
* occurrences); add a second pass if a customer ever adopts the syntax.
|
|
20
|
+
*/
|
|
21
|
+
export interface ImageRefWarning {
|
|
22
|
+
/** Path of the .mdx file containing the broken reference, relative to projectDir */
|
|
23
|
+
file: string;
|
|
24
|
+
line: number;
|
|
25
|
+
/** Raw src path as written in the MDX source */
|
|
26
|
+
src: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extract image references from MDX/MD content.
|
|
30
|
+
* Returns the `src` string and 1-based line number for each match.
|
|
31
|
+
*/
|
|
32
|
+
export declare function extractImageRefs(content: string): {
|
|
33
|
+
src: string;
|
|
34
|
+
line: number;
|
|
35
|
+
}[];
|
|
36
|
+
/**
|
|
37
|
+
* Walk every MDX/MD file under projectDir (excluding node_modules / .git),
|
|
38
|
+
* extract image references, and return warnings for any that don't resolve.
|
|
39
|
+
*
|
|
40
|
+
* Caller-provided `files` lets the unit tests inject a fixed file list
|
|
41
|
+
* without touching the filesystem walker. Production callers pass the
|
|
42
|
+
* project dir and let the function glob.
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateImageRefs(projectDir: string, files?: string[]): Promise<ImageRefWarning[]>;
|
|
45
|
+
//# sourceMappingURL=validate-image-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-image-refs.d.ts","sourceRoot":"","sources":["../../src/lib/validate-image-refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AA4DD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CA4BjF;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAmC5B"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MDX Image Reference Validation (CLI)
|
|
3
|
+
*
|
|
4
|
+
* Scans MDX/MD content for image references and reports any that point at
|
|
5
|
+
* files which don't exist on disk. Catches the silent-link-rot scenario
|
|
6
|
+
* `jamdesk validate` previously missed.
|
|
7
|
+
*
|
|
8
|
+
* Recognized syntaxes:
|
|
9
|
+
* - JSX: <img src="..." /> and <Image src="..." />
|
|
10
|
+
* - Markdown inline: 
|
|
11
|
+
*
|
|
12
|
+
* Skipped:
|
|
13
|
+
* - External URLs (http://, https://, //, data:)
|
|
14
|
+
* - Empty/whitespace src values
|
|
15
|
+
* - Dynamic JSX expressions: src={someVar} (we can't statically resolve)
|
|
16
|
+
* - URL fragments and query strings — stripped before fs check
|
|
17
|
+
* - Reference-style markdown images: ![alt][ref] with [ref]: /path elsewhere.
|
|
18
|
+
* Not currently used in Jamdesk content (grep across all docs finds zero
|
|
19
|
+
* occurrences); add a second pass if a customer ever adopts the syntax.
|
|
20
|
+
*/
|
|
21
|
+
import fs from 'fs-extra';
|
|
22
|
+
import path from 'path';
|
|
23
|
+
function isExternalOrDataUrl(src) {
|
|
24
|
+
return (src.startsWith('http://') ||
|
|
25
|
+
src.startsWith('https://') ||
|
|
26
|
+
src.startsWith('//') ||
|
|
27
|
+
src.startsWith('data:'));
|
|
28
|
+
}
|
|
29
|
+
/** Resolve an MDX-referenced image path to an absolute filesystem path. */
|
|
30
|
+
function resolveImagePath(src, mdxFileAbsPath, projectDir) {
|
|
31
|
+
// Strip query string and fragment — both legal in a URL, neither part of the filename
|
|
32
|
+
const clean = src.split(/[?#]/)[0];
|
|
33
|
+
if (!clean)
|
|
34
|
+
return [];
|
|
35
|
+
if (clean.startsWith('/')) {
|
|
36
|
+
// Project-absolute: /images/foo.webp → projectDir/images/foo.webp
|
|
37
|
+
// Also check public/ since some setups serve from there
|
|
38
|
+
const rel = clean.slice(1);
|
|
39
|
+
return [
|
|
40
|
+
path.join(projectDir, rel),
|
|
41
|
+
path.join(projectDir, 'public', rel),
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
// Relative to the containing MDX file
|
|
45
|
+
return [path.resolve(path.dirname(mdxFileAbsPath), clean)];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Strip MDX regions that hold non-rendered content: HTML comments, fenced
|
|
49
|
+
* code blocks (```…``` and ~~~…~~~, optionally indented), and inline code
|
|
50
|
+
* spans (`…`). Image-like syntax inside these is for display only — treating
|
|
51
|
+
* it as a real reference would produce false-positive warnings (e.g., a
|
|
52
|
+
* tutorial showing `` as an example).
|
|
53
|
+
*
|
|
54
|
+
* Strategy: replace stripped regions with spaces of equal length so that
|
|
55
|
+
* line numbers reported against the original content stay accurate.
|
|
56
|
+
*/
|
|
57
|
+
function stripCodeRegions(content) {
|
|
58
|
+
const blank = (m) => m.replace(/[^\n]/g, ' ');
|
|
59
|
+
// HTML comments first — they can wrap fences and inline code, and MDX
|
|
60
|
+
// permits them anywhere.
|
|
61
|
+
let out = content.replace(/<!--[\s\S]*?-->/g, blank);
|
|
62
|
+
// Fenced code blocks (allow leading indent on opener and closer, e.g.,
|
|
63
|
+
// inside <Tab> wrappers that indent their children).
|
|
64
|
+
out = out.replace(/(^|\n)[ \t]*(```|~~~)[^\n]*\n([\s\S]*?)\n[ \t]*\2(?=\n|$)/g, blank);
|
|
65
|
+
// Inline code spans on remaining content. Match the shortest possible run
|
|
66
|
+
// of backticks (`…`) since MDX-supported double-backtick spans (``…``) are
|
|
67
|
+
// rare in our content.
|
|
68
|
+
out = out.replace(/`[^`\n]+`/g, blank);
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract image references from MDX/MD content.
|
|
73
|
+
* Returns the `src` string and 1-based line number for each match.
|
|
74
|
+
*/
|
|
75
|
+
export function extractImageRefs(content) {
|
|
76
|
+
const refs = [];
|
|
77
|
+
const scanContent = stripCodeRegions(content);
|
|
78
|
+
// JSX <img src="..."> and <Image src="..."> — string literal only (skip {expr})
|
|
79
|
+
// Note: this is regex, not AST. Acceptable trade-off vs. parsing every file.
|
|
80
|
+
const jsxRegex = /<(?:img|Image)\b[^>]*?\bsrc\s*=\s*(["'])([^"'{}]+?)\1/gi;
|
|
81
|
+
// Markdown  — capture path before optional title
|
|
82
|
+
// Skip if path starts with `<` (anchor-style markdown) or is wrapped in <>
|
|
83
|
+
const mdRegex = /!\[[^\]]*\]\(\s*<?([^)\s<>]+)>?(?:\s+["'][^"']*["'])?\s*\)/g;
|
|
84
|
+
const indexToLine = (idx) => {
|
|
85
|
+
let line = 1;
|
|
86
|
+
for (let i = 0; i < idx; i++) {
|
|
87
|
+
if (scanContent.charCodeAt(i) === 10 /* \n */)
|
|
88
|
+
line++;
|
|
89
|
+
}
|
|
90
|
+
return line;
|
|
91
|
+
};
|
|
92
|
+
for (const m of scanContent.matchAll(jsxRegex)) {
|
|
93
|
+
refs.push({ src: m[2], line: indexToLine(m.index ?? 0) });
|
|
94
|
+
}
|
|
95
|
+
for (const m of scanContent.matchAll(mdRegex)) {
|
|
96
|
+
refs.push({ src: m[1], line: indexToLine(m.index ?? 0) });
|
|
97
|
+
}
|
|
98
|
+
return refs;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Walk every MDX/MD file under projectDir (excluding node_modules / .git),
|
|
102
|
+
* extract image references, and return warnings for any that don't resolve.
|
|
103
|
+
*
|
|
104
|
+
* Caller-provided `files` lets the unit tests inject a fixed file list
|
|
105
|
+
* without touching the filesystem walker. Production callers pass the
|
|
106
|
+
* project dir and let the function glob.
|
|
107
|
+
*/
|
|
108
|
+
export async function validateImageRefs(projectDir, files) {
|
|
109
|
+
const { glob } = await import('glob');
|
|
110
|
+
const mdxFiles = files ??
|
|
111
|
+
(await glob('**/*.{mdx,md}', {
|
|
112
|
+
cwd: projectDir,
|
|
113
|
+
ignore: ['**/node_modules/**', '**/.git/**'],
|
|
114
|
+
}));
|
|
115
|
+
const warnings = [];
|
|
116
|
+
for (const file of mdxFiles) {
|
|
117
|
+
const abs = path.isAbsolute(file) ? file : path.join(projectDir, file);
|
|
118
|
+
const rel = path.relative(projectDir, abs);
|
|
119
|
+
let content;
|
|
120
|
+
try {
|
|
121
|
+
content = await fs.readFile(abs, 'utf-8');
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
continue; // missing file is its own check elsewhere
|
|
125
|
+
}
|
|
126
|
+
for (const { src, line } of extractImageRefs(content)) {
|
|
127
|
+
if (isExternalOrDataUrl(src))
|
|
128
|
+
continue;
|
|
129
|
+
const trimmed = src.trim();
|
|
130
|
+
if (!trimmed)
|
|
131
|
+
continue;
|
|
132
|
+
const candidates = resolveImagePath(trimmed, abs, projectDir);
|
|
133
|
+
if (candidates.length === 0)
|
|
134
|
+
continue;
|
|
135
|
+
if (!candidates.some((p) => fs.existsSync(p))) {
|
|
136
|
+
warnings.push({ file: rel, line, src: trimmed });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return warnings;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=validate-image-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-image-refs.js","sourceRoot":"","sources":["../../src/lib/validate-image-refs.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.
|
|
3
|
+
"version": "1.1.112",
|
|
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",
|
|
@@ -156,7 +156,7 @@ function HttpCodeBlock({ method, url }: { method: string; url: string }) {
|
|
|
156
156
|
</span>
|
|
157
157
|
{/* Copy button - functionality added via client-side script */}
|
|
158
158
|
<button
|
|
159
|
-
className="http-copy-btn p-1.5 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-bg-secondary)] rounded-md transition-colors flex-shrink-0"
|
|
159
|
+
className="http-copy-btn cursor-pointer p-1.5 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-bg-secondary)] rounded-md transition-colors flex-shrink-0"
|
|
160
160
|
title="Copy"
|
|
161
161
|
aria-label="Copy"
|
|
162
162
|
type="button"
|
|
@@ -122,6 +122,18 @@ function findFirstPageInGroups(groups: ResolvedGroup[]): string | null {
|
|
|
122
122
|
return null;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
+
/** Find all groups whose `expanded: true` schema flag should open them by default */
|
|
126
|
+
function findInitiallyExpandedGroups(groups: ResolvedGroup[]): Set<string> {
|
|
127
|
+
const result = new Set<string>();
|
|
128
|
+
for (const group of groups) {
|
|
129
|
+
if (group.expanded && group.name) result.add(group.name);
|
|
130
|
+
if (group.nested) {
|
|
131
|
+
findInitiallyExpandedGroups(group.nested).forEach(name => result.add(name));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
|
|
125
137
|
/** Find all groups in the path from root to the page containing currentPath */
|
|
126
138
|
function findGroupsContainingPath(groups: ResolvedGroup[], currentPath: string, parentNames: string[] = []): Set<string> {
|
|
127
139
|
const result = new Set<string>();
|
|
@@ -229,23 +241,31 @@ export function Sidebar({ config, layout = 'header-logo', tabsPosition: tabsPosi
|
|
|
229
241
|
return findGroupsContainingPath(resolvedNav.groups, currentPath);
|
|
230
242
|
}, [resolvedNav.groups, activePathname]);
|
|
231
243
|
|
|
244
|
+
// Groups marked `expanded: true` in docs.json open by default on initial load.
|
|
245
|
+
// Schema says "Expand this navigation group by default when the page loads",
|
|
246
|
+
// so this only seeds the initial mount — manual collapse during the session sticks.
|
|
247
|
+
const initiallyExpandedGroups = useMemo(
|
|
248
|
+
() => findInitiallyExpandedGroups(resolvedNav.groups),
|
|
249
|
+
[resolvedNav.groups],
|
|
250
|
+
);
|
|
251
|
+
|
|
232
252
|
// Expand groups containing current page
|
|
233
|
-
// On initial mount: reset to
|
|
253
|
+
// On initial mount: reset to current page's groups + any `expanded: true` groups
|
|
234
254
|
// On navigation: add current page's groups to existing expanded set (preserve manually opened)
|
|
235
255
|
useEffect(() => {
|
|
236
256
|
if (isInitialMount.current) {
|
|
237
|
-
// Initial mount (page load/refresh): only expand current page's groups
|
|
238
257
|
isInitialMount.current = false;
|
|
239
|
-
|
|
258
|
+
const initial = new Set(groupsForCurrentPage);
|
|
259
|
+
initiallyExpandedGroups.forEach(g => initial.add(g));
|
|
260
|
+
setExpandedGroups(initial);
|
|
240
261
|
} else {
|
|
241
|
-
// Navigation: add current page's groups to existing expanded set
|
|
242
262
|
setExpandedGroups(prev => {
|
|
243
263
|
const newSet = new Set(prev);
|
|
244
264
|
groupsForCurrentPage.forEach(g => newSet.add(g));
|
|
245
265
|
return newSet;
|
|
246
266
|
});
|
|
247
267
|
}
|
|
248
|
-
}, [groupsForCurrentPage]);
|
|
268
|
+
}, [groupsForCurrentPage, initiallyExpandedGroups]);
|
|
249
269
|
|
|
250
270
|
// Detect dark mode for logo switching
|
|
251
271
|
useEffect(() => {
|
|
@@ -4,12 +4,7 @@ import { useMemo } from 'react';
|
|
|
4
4
|
import Link from 'next/link';
|
|
5
5
|
import { usePathname } from 'next/navigation';
|
|
6
6
|
// Icons use Font Awesome CSS classes for lightweight rendering
|
|
7
|
-
import type {
|
|
8
|
-
DocsConfig,
|
|
9
|
-
GroupConfig,
|
|
10
|
-
NavigationPage,
|
|
11
|
-
TabsPosition,
|
|
12
|
-
} from '@/lib/docs-types';
|
|
7
|
+
import type { DocsConfig, TabsPosition } from '@/lib/docs-types';
|
|
13
8
|
import { resolveNavigation } from '@/lib/navigation-resolver';
|
|
14
9
|
import { getIconClass } from '@/lib/icon-utils';
|
|
15
10
|
import { getTheme } from '@/themes';
|
|
@@ -56,7 +51,7 @@ export function TabsNav({ config, className = '' }: TabsNavProps) {
|
|
|
56
51
|
isActive: false,
|
|
57
52
|
};
|
|
58
53
|
}
|
|
59
|
-
|
|
54
|
+
|
|
60
55
|
// For internal tabs, find first page to link to
|
|
61
56
|
// We need to look into the tab's groups
|
|
62
57
|
let firstPath: string | null = null;
|
|
@@ -86,52 +81,18 @@ export function TabsNav({ config, className = '' }: TabsNavProps) {
|
|
|
86
81
|
firstPath = firstPage.page;
|
|
87
82
|
}
|
|
88
83
|
}
|
|
89
|
-
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const checkPages = (pages: (NavigationPage | GroupConfig)[]): boolean => {
|
|
96
|
-
for (const page of pages) {
|
|
97
|
-
const pagePath =
|
|
98
|
-
typeof page === 'string'
|
|
99
|
-
? page
|
|
100
|
-
: 'page' in page
|
|
101
|
-
? page.page
|
|
102
|
-
: 'group' in page
|
|
103
|
-
? page.group
|
|
104
|
-
: undefined;
|
|
105
|
-
if (pagePath && (pagePath === currentPath || currentPath.startsWith(pagePath + '/'))) {
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
// Check nested groups
|
|
109
|
-
if (typeof page !== 'string' && 'pages' in page && page.pages) {
|
|
110
|
-
if (checkPages(page.pages)) return true;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return false;
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
if (tab.groups) {
|
|
117
|
-
for (const group of tab.groups) {
|
|
118
|
-
if (group.pages && checkPages(group.pages)) {
|
|
119
|
-
isActive = true;
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (!isActive && tab.pages) {
|
|
125
|
-
isActive = checkPages(tab.pages);
|
|
126
|
-
}
|
|
127
|
-
|
|
84
|
+
|
|
85
|
+
// Defer to navigation-resolver's findActiveTab — single source of truth.
|
|
86
|
+
// Keeps multilingual path-stripping rules and nested-group recursion in one place.
|
|
87
|
+
const isActive = resolved.activeTab === resolvedTab.name;
|
|
88
|
+
|
|
128
89
|
return {
|
|
129
90
|
...resolvedTab,
|
|
130
91
|
path: firstPath ? `${linkPrefix}/${firstPath}` : '#',
|
|
131
92
|
isActive,
|
|
132
93
|
};
|
|
133
94
|
});
|
|
134
|
-
}, [configTabs, resolved.tabs,
|
|
95
|
+
}, [configTabs, resolved.tabs, resolved.activeTab, linkPrefix, effectiveTabsPosition]);
|
|
135
96
|
|
|
136
97
|
// TabsNav is only for 'top' position - when tabs should appear below header
|
|
137
98
|
// When tabsPosition is 'left', tabs are rendered in the Sidebar instead
|
|
@@ -146,8 +107,16 @@ export function TabsNav({ config, className = '' }: TabsNavProps) {
|
|
|
146
107
|
return (
|
|
147
108
|
<nav className={`hidden lg:block ${className}`}>
|
|
148
109
|
{/* flex-wrap so the row degrades to two lines instead of clipping when
|
|
149
|
-
the project has many tabs and/or a narrow desktop viewport.
|
|
150
|
-
|
|
110
|
+
the project has many tabs and/or a narrow desktop viewport.
|
|
111
|
+
Inline-start margin is 12px (not 24px) so the first tab's `px-3`
|
|
112
|
+
padding lands its icon flush with the sidebar group icons.
|
|
113
|
+
Uses logical `marginInline` (start/end) — physical `margin` shorthand
|
|
114
|
+
would not flip under `dir="rtl"` and would invert the misalignment
|
|
115
|
+
for Arabic/Hebrew docs sites with `tabsPosition: 'top'`. */}
|
|
116
|
+
<div
|
|
117
|
+
className="flex flex-wrap items-center gap-x-2 gap-y-1 py-3"
|
|
118
|
+
style={{ marginBlock: 0, marginInline: '12px 24px', borderBottom: '0.5px solid var(--color-border)' }}
|
|
119
|
+
>
|
|
151
120
|
{tabsWithPaths.map((tab) => {
|
|
152
121
|
if (tab.isExternal && tab.href) {
|
|
153
122
|
return (
|
|
@@ -2913,9 +2913,9 @@
|
|
|
2913
2913
|
}
|
|
2914
2914
|
},
|
|
2915
2915
|
"node_modules/dompurify": {
|
|
2916
|
-
"version": "3.4.
|
|
2917
|
-
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.
|
|
2918
|
-
"integrity": "sha512
|
|
2916
|
+
"version": "3.4.6",
|
|
2917
|
+
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.6.tgz",
|
|
2918
|
+
"integrity": "sha512-+7gzEI8trIIQkVCvQ3ucGtNfH3nOmDgVTzc62rAAOlMxLth78pwpPoZCPc7CyRzAQF89MqcfPdEWkDwnjgqktg==",
|
|
2919
2919
|
"license": "(MPL-2.0 OR Apache-2.0)",
|
|
2920
2920
|
"optionalDependencies": {
|
|
2921
2921
|
"@types/trusted-types": "^2.0.7"
|