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.
- package/dist/__tests__/integration/validate.integration.test.js +21 -0
- package/dist/__tests__/integration/validate.integration.test.js.map +1 -1
- package/dist/__tests__/unit/extract-hooks.test.js +102 -1
- package/dist/__tests__/unit/extract-hooks.test.js.map +1 -1
- package/dist/__tests__/unit/mdx-validator.test.js +22 -0
- package/dist/__tests__/unit/mdx-validator.test.js.map +1 -1
- package/dist/__tests__/unit/migrate-mdx.test.js +121 -1
- package/dist/__tests__/unit/migrate-mdx.test.js.map +1 -1
- package/dist/__tests__/unit/relative-mdx-imports.test.d.ts +2 -0
- package/dist/__tests__/unit/relative-mdx-imports.test.d.ts.map +1 -0
- package/dist/__tests__/unit/relative-mdx-imports.test.js +452 -0
- package/dist/__tests__/unit/relative-mdx-imports.test.js.map +1 -0
- package/dist/__tests__/unit/relocate-snippets.test.d.ts +2 -0
- package/dist/__tests__/unit/relocate-snippets.test.d.ts.map +1 -0
- package/dist/__tests__/unit/relocate-snippets.test.js +542 -0
- package/dist/__tests__/unit/relocate-snippets.test.js.map +1 -0
- package/dist/__tests__/unit/run-build-script.test.js +23 -1
- package/dist/__tests__/unit/run-build-script.test.js.map +1 -1
- package/dist/__tests__/unit/warn-relative-imports.test.d.ts +2 -0
- package/dist/__tests__/unit/warn-relative-imports.test.d.ts.map +1 -0
- package/dist/__tests__/unit/warn-relative-imports.test.js +44 -0
- package/dist/__tests__/unit/warn-relative-imports.test.js.map +1 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +22 -8
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/migrate/convert-mdx.d.ts +5 -1
- package/dist/commands/migrate/convert-mdx.d.ts.map +1 -1
- package/dist/commands/migrate/convert-mdx.js +19 -6
- package/dist/commands/migrate/convert-mdx.js.map +1 -1
- package/dist/commands/migrate/extract-hooks.d.ts +26 -0
- package/dist/commands/migrate/extract-hooks.d.ts.map +1 -1
- package/dist/commands/migrate/extract-hooks.js +71 -12
- package/dist/commands/migrate/extract-hooks.js.map +1 -1
- package/dist/commands/migrate/fix-mdx-syntax.d.ts +38 -0
- package/dist/commands/migrate/fix-mdx-syntax.d.ts.map +1 -0
- package/dist/commands/migrate/fix-mdx-syntax.js +80 -0
- package/dist/commands/migrate/fix-mdx-syntax.js.map +1 -0
- package/dist/commands/migrate/index.d.ts.map +1 -1
- package/dist/commands/migrate/index.js +165 -3
- package/dist/commands/migrate/index.js.map +1 -1
- package/dist/commands/migrate/relocate-snippets.d.ts +30 -0
- package/dist/commands/migrate/relocate-snippets.d.ts.map +1 -0
- package/dist/commands/migrate/relocate-snippets.js +357 -0
- package/dist/commands/migrate/relocate-snippets.js.map +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +31 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/lib/mdx-syntax-fixes.d.ts +14 -0
- package/dist/lib/mdx-syntax-fixes.d.ts.map +1 -0
- package/dist/lib/mdx-syntax-fixes.js +38 -0
- package/dist/lib/mdx-syntax-fixes.js.map +1 -0
- package/dist/lib/mdx-validator.d.ts +11 -2
- package/dist/lib/mdx-validator.d.ts.map +1 -1
- package/dist/lib/mdx-validator.js +41 -4
- package/dist/lib/mdx-validator.js.map +1 -1
- package/dist/lib/relative-mdx-imports.d.ts +44 -0
- package/dist/lib/relative-mdx-imports.d.ts.map +1 -0
- package/dist/lib/relative-mdx-imports.js +145 -0
- package/dist/lib/relative-mdx-imports.js.map +1 -0
- package/dist/lib/run-build-script.d.ts.map +1 -1
- package/dist/lib/run-build-script.js +7 -0
- package/dist/lib/run-build-script.js.map +1 -1
- package/dist/lib/warn-relative-imports.d.ts +2 -0
- package/dist/lib/warn-relative-imports.d.ts.map +1 -0
- package/dist/lib/warn-relative-imports.js +29 -0
- package/dist/lib/warn-relative-imports.js.map +1 -0
- package/package.json +1 -1
- package/vendored/app/(unlock)/jd/unlock/page.tsx +32 -0
- package/vendored/app/[[...slug]]/page.tsx +63 -15
- package/vendored/components/navigation/SocialFooter.tsx +4 -18
- package/vendored/lib/branding-url.ts +9 -0
- package/vendored/lib/layout-helpers.tsx +7 -9
- package/vendored/lib/preprocess-mdx.ts +42 -0
- package/vendored/scripts/compile-snippets.cjs +50 -7
- package/vendored/workspace-package-lock.json +3 -3
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
// Auto-relocate orphan snippets during `jamdesk migrate`.
|
|
2
|
+
//
|
|
3
|
+
// Mintlify lets users put MDX snippets anywhere and import them with
|
|
4
|
+
// parent-relative paths (`import X from "../foo/bar.mdx"`). Jamdesk only
|
|
5
|
+
// resolves root-relative `/snippets/*` imports. This module detects MDX
|
|
6
|
+
// files used as snippets but living outside `/snippets/`, and moves
|
|
7
|
+
// them in-place — rewriting parent-relative importers to root-relative.
|
|
8
|
+
//
|
|
9
|
+
// Heuristic — a file is relocated only if ALL of the following hold:
|
|
10
|
+
// A — it's imported by >=1 other MDX (parent-relative import)
|
|
11
|
+
// B — it's NOT in docs.json navigation (or referenced by a redirect)
|
|
12
|
+
// C — it's NOT the target of a `[text](path)`, JSX `href|to|path|src`,
|
|
13
|
+
// or reference-style `[ref]: path` link from any MDX
|
|
14
|
+
// D — its filename isn't reserved (`index`, `404`, `home`, etc.)
|
|
15
|
+
// E — its frontmatter has no `title` field (page-shaped frontmatter)
|
|
16
|
+
// F — it doesn't itself import a real page (back-edge would break)
|
|
17
|
+
//
|
|
18
|
+
// Safety bounds — the heuristic refuses to act when the project shape
|
|
19
|
+
// makes it untrustworthy:
|
|
20
|
+
// • aborts entirely if `navigation` resolves to zero pages (without
|
|
21
|
+
// a real nav, signal B is unreliable and every imported file looks
|
|
22
|
+
// like a snippet)
|
|
23
|
+
// • aborts if the planned moves exceed max(5, 25% of all MDX files)
|
|
24
|
+
//
|
|
25
|
+
// Destination preserves the relative path: `<rel>` -> `snippets/<rel>`
|
|
26
|
+
// so locale-prefixed snippets (`de/foo/bar.mdx`) don't collide across
|
|
27
|
+
// languages. Idempotent: anything already under `snippets/` is skipped.
|
|
28
|
+
import fs from 'fs-extra';
|
|
29
|
+
import path from 'node:path';
|
|
30
|
+
import { glob } from 'glob';
|
|
31
|
+
import { detectRelativeMdxImports, stripFencedCodeBlocks, } from '../../lib/relative-mdx-imports.js';
|
|
32
|
+
import { extractNavigationPages } from '../../lib/navigation-validator.js';
|
|
33
|
+
import { parseFrontmatterLenient } from '../../lib/frontmatter-utils.js';
|
|
34
|
+
const MARKDOWN_LINK_RE = /\[(?:[^\]]*)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
|
|
35
|
+
// JSX nav/asset props: `href`, `to`, `path` (router patterns), `src`
|
|
36
|
+
// (embeds, iframes, video sources). Without these, a page reachable
|
|
37
|
+
// only via `<Link to=...>` or `<Embed src=...>` would fall through
|
|
38
|
+
// signal C and be misclassified as an orphan snippet.
|
|
39
|
+
const JSX_NAV_PROP_RE = /\b(?:href|to|path|src)\s*=\s*["']([^"']+)["']/g;
|
|
40
|
+
const REF_LINK_DEF_RE = /^\s{0,3}\[[^\]]+\]:\s*(\S+)/gm;
|
|
41
|
+
const RESERVED_PAGE_NAMES = new Set([
|
|
42
|
+
'index',
|
|
43
|
+
'404',
|
|
44
|
+
'500',
|
|
45
|
+
'home',
|
|
46
|
+
'readme',
|
|
47
|
+
'_app',
|
|
48
|
+
'_document',
|
|
49
|
+
'_layout',
|
|
50
|
+
'_error',
|
|
51
|
+
]);
|
|
52
|
+
// Two-stage safety bound:
|
|
53
|
+
// • absolute: refuse if planned > max(FLOOR, total * PERCENTAGE) — protects
|
|
54
|
+
// mid-to-large projects where a misclassification would move dozens
|
|
55
|
+
// of files. The floor (5) lets legitimate small relocations through.
|
|
56
|
+
// • ratio: refuse if planned/total > RATIO regardless of count — closes
|
|
57
|
+
// the floor's blind spot: a 4-file project with 4 planned moves
|
|
58
|
+
// should still abort even though 4 < FLOOR.
|
|
59
|
+
const SAFETY_BOUND_PERCENTAGE = 0.25;
|
|
60
|
+
const SAFETY_BOUND_FLOOR = 5;
|
|
61
|
+
const SAFETY_BOUND_RATIO = 0.5;
|
|
62
|
+
function addMdxVariants(base, set) {
|
|
63
|
+
if (base.endsWith('.mdx') || base.endsWith('.md')) {
|
|
64
|
+
set.add(base);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
set.add(`${base}.mdx`);
|
|
68
|
+
set.add(`${base}.md`);
|
|
69
|
+
}
|
|
70
|
+
function collectLinkTargets(stripped, sourcePath, projectDir, out) {
|
|
71
|
+
for (const re of [MARKDOWN_LINK_RE, JSX_NAV_PROP_RE, REF_LINK_DEF_RE]) {
|
|
72
|
+
re.lastIndex = 0;
|
|
73
|
+
let m;
|
|
74
|
+
while ((m = re.exec(stripped)) !== null) {
|
|
75
|
+
let url = m[1];
|
|
76
|
+
if (!url)
|
|
77
|
+
continue;
|
|
78
|
+
if (/^(?:[a-z][a-z0-9+\-.]*:|#)/i.test(url))
|
|
79
|
+
continue;
|
|
80
|
+
url = url.split('#')[0].split('?')[0];
|
|
81
|
+
if (!url)
|
|
82
|
+
continue;
|
|
83
|
+
const base = url.startsWith('/')
|
|
84
|
+
? path.join(projectDir, url.slice(1))
|
|
85
|
+
: path.resolve(path.dirname(sourcePath), url);
|
|
86
|
+
addMdxVariants(base, out);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function hasFrontmatterTitle(content) {
|
|
91
|
+
if (!content.startsWith('---'))
|
|
92
|
+
return false;
|
|
93
|
+
try {
|
|
94
|
+
const { data } = parseFrontmatterLenient(content);
|
|
95
|
+
return typeof data.title === 'string' && data.title.trim().length > 0;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function buildProjectGraph(projectDir, allMdxFiles) {
|
|
102
|
+
const importedBy = new Map();
|
|
103
|
+
const imports = new Map();
|
|
104
|
+
const linked = new Set();
|
|
105
|
+
const pageShaped = new Set();
|
|
106
|
+
await Promise.all(allMdxFiles.map(async (file) => {
|
|
107
|
+
let content;
|
|
108
|
+
try {
|
|
109
|
+
content = await fs.readFile(file, 'utf-8');
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Strip fenced code blocks once — both link extraction and import
|
|
115
|
+
// detection need the same stripped view, so don't pay for the regex
|
|
116
|
+
// pass twice per file.
|
|
117
|
+
const stripped = stripFencedCodeBlocks(content);
|
|
118
|
+
collectLinkTargets(stripped, file, projectDir, linked);
|
|
119
|
+
if (hasFrontmatterTitle(content)) {
|
|
120
|
+
pageShaped.add(file);
|
|
121
|
+
}
|
|
122
|
+
const detected = detectRelativeMdxImports(stripped, true);
|
|
123
|
+
for (const imp of detected) {
|
|
124
|
+
const resolved = path.resolve(path.dirname(file), imp.specifier);
|
|
125
|
+
if (!(await fs.pathExists(resolved)))
|
|
126
|
+
continue;
|
|
127
|
+
let by = importedBy.get(resolved);
|
|
128
|
+
if (!by) {
|
|
129
|
+
by = new Set();
|
|
130
|
+
importedBy.set(resolved, by);
|
|
131
|
+
}
|
|
132
|
+
by.add(file);
|
|
133
|
+
let outgoing = imports.get(file);
|
|
134
|
+
if (!outgoing) {
|
|
135
|
+
outgoing = new Set();
|
|
136
|
+
imports.set(file, outgoing);
|
|
137
|
+
}
|
|
138
|
+
outgoing.add(resolved);
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
return { importedBy, imports, linked, pageShaped };
|
|
142
|
+
}
|
|
143
|
+
function buildNavSet(config, projectDir) {
|
|
144
|
+
const out = new Set();
|
|
145
|
+
const addPath = (p) => {
|
|
146
|
+
let cleaned = p.split('#')[0].split('?')[0];
|
|
147
|
+
if (cleaned.startsWith('http://') || cleaned.startsWith('https://'))
|
|
148
|
+
return;
|
|
149
|
+
if (cleaned.startsWith('/'))
|
|
150
|
+
cleaned = cleaned.slice(1);
|
|
151
|
+
if (!cleaned)
|
|
152
|
+
return;
|
|
153
|
+
addMdxVariants(path.join(projectDir, cleaned), out);
|
|
154
|
+
};
|
|
155
|
+
const pages = extractNavigationPages(config?.navigation);
|
|
156
|
+
for (const p of pages)
|
|
157
|
+
addPath(p);
|
|
158
|
+
// A page that exists only as a redirect target (or source) is still a
|
|
159
|
+
// real page — kept around for old URLs. Counted separately so a
|
|
160
|
+
// redirect-only docs.json doesn't disarm the empty-nav abort.
|
|
161
|
+
const redirects = config?.redirects;
|
|
162
|
+
if (Array.isArray(redirects)) {
|
|
163
|
+
for (const r of redirects) {
|
|
164
|
+
if (typeof r?.source === 'string')
|
|
165
|
+
addPath(r.source);
|
|
166
|
+
if (typeof r?.destination === 'string')
|
|
167
|
+
addPath(r.destination);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return { set: out, navigationPageCount: pages.length };
|
|
171
|
+
}
|
|
172
|
+
async function rewriteImporterImports(importerPath, oldAbs, newSpec) {
|
|
173
|
+
const content = await fs.readFile(importerPath, 'utf-8');
|
|
174
|
+
const detected = detectRelativeMdxImports(content);
|
|
175
|
+
if (detected.length === 0)
|
|
176
|
+
return false;
|
|
177
|
+
const importerDir = path.dirname(importerPath);
|
|
178
|
+
let next = content;
|
|
179
|
+
let changed = false;
|
|
180
|
+
for (const m of detected) {
|
|
181
|
+
const resolved = path.resolve(importerDir, m.specifier);
|
|
182
|
+
if (resolved !== oldAbs)
|
|
183
|
+
continue;
|
|
184
|
+
const newImport = m.raw.replace(m.specifier, () => newSpec);
|
|
185
|
+
next = next.replace(m.raw, () => newImport);
|
|
186
|
+
changed = true;
|
|
187
|
+
}
|
|
188
|
+
if (changed) {
|
|
189
|
+
await fs.writeFile(importerPath, next, 'utf-8');
|
|
190
|
+
}
|
|
191
|
+
return changed;
|
|
192
|
+
}
|
|
193
|
+
function findPageImport(outgoing, navSet) {
|
|
194
|
+
if (!outgoing)
|
|
195
|
+
return undefined;
|
|
196
|
+
for (const target of outgoing) {
|
|
197
|
+
if (navSet.has(target))
|
|
198
|
+
return target;
|
|
199
|
+
}
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
function isReservedName(absPath) {
|
|
203
|
+
const base = path.basename(absPath).replace(/\.(mdx|md)$/i, '').toLowerCase();
|
|
204
|
+
return RESERVED_PAGE_NAMES.has(base);
|
|
205
|
+
}
|
|
206
|
+
async function filesAreByteEqual(a, b) {
|
|
207
|
+
// Compare size first to short-circuit on the common no-match case without
|
|
208
|
+
// reading both files. Any difference in length means contents differ.
|
|
209
|
+
const [sa, sb] = await Promise.all([fs.stat(a), fs.stat(b)]);
|
|
210
|
+
if (sa.size !== sb.size)
|
|
211
|
+
return false;
|
|
212
|
+
const [ba, bb] = await Promise.all([fs.readFile(a), fs.readFile(b)]);
|
|
213
|
+
return ba.equals(bb);
|
|
214
|
+
}
|
|
215
|
+
async function classify(importee, ctx) {
|
|
216
|
+
const { projectDir, snippetsRoot, graph, navSet } = ctx;
|
|
217
|
+
const rel = path.relative(projectDir, importee);
|
|
218
|
+
if (rel.startsWith(`snippets${path.sep}`) || rel === 'snippets')
|
|
219
|
+
return null;
|
|
220
|
+
if (navSet.has(importee)) {
|
|
221
|
+
return { skip: { file: rel, reason: 'referenced as page in docs.json navigation or redirects' } };
|
|
222
|
+
}
|
|
223
|
+
if (graph.linked.has(importee)) {
|
|
224
|
+
return { skip: { file: rel, reason: 'linked as a page from another MDX file' } };
|
|
225
|
+
}
|
|
226
|
+
if (isReservedName(importee)) {
|
|
227
|
+
return { skip: { file: rel, reason: `reserved page name (${path.basename(importee)})` } };
|
|
228
|
+
}
|
|
229
|
+
if (graph.pageShaped.has(importee)) {
|
|
230
|
+
return {
|
|
231
|
+
skip: {
|
|
232
|
+
file: rel,
|
|
233
|
+
reason: 'has page-shaped frontmatter (title) — review manually',
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const pageImport = findPageImport(graph.imports.get(importee), navSet);
|
|
238
|
+
if (pageImport) {
|
|
239
|
+
return {
|
|
240
|
+
skip: {
|
|
241
|
+
file: rel,
|
|
242
|
+
reason: `imports the page ${path.relative(projectDir, pageImport)} — relocation would break the back-edge`,
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const destAbs = path.join(snippetsRoot, rel);
|
|
247
|
+
if (await fs.pathExists(destAbs)) {
|
|
248
|
+
// Dest exists. If it's byte-identical to the source, this is a leftover
|
|
249
|
+
// from a previous successful relocate where the user restored the source
|
|
250
|
+
// via `git checkout` (or a stash-pop). Resume safely: drop the source +
|
|
251
|
+
// rewrite importers — the dest is already canonical, no data loss.
|
|
252
|
+
// Different content means the user has hand-edited one side; skip and
|
|
253
|
+
// let them resolve manually (case where data loss IS possible).
|
|
254
|
+
if (await filesAreByteEqual(importee, destAbs)) {
|
|
255
|
+
return { move: { importee, rel, destAbs, resumed: true } };
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
skip: {
|
|
259
|
+
file: rel,
|
|
260
|
+
reason: `would overwrite existing ${path.relative(projectDir, destAbs)} ` +
|
|
261
|
+
`(content differs from source — review manually)`,
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
return { move: { importee, rel, destAbs } };
|
|
266
|
+
}
|
|
267
|
+
function computeAbortReason(planned, totalFiles, navigationPageCount) {
|
|
268
|
+
if (planned === 0)
|
|
269
|
+
return undefined;
|
|
270
|
+
if (navigationPageCount === 0) {
|
|
271
|
+
return (`docs.json has no navigation pages — without published pages, ` +
|
|
272
|
+
`every imported file looks like a snippet. Refusing to move ` +
|
|
273
|
+
`${planned} file(s). Add navigation entries first.`);
|
|
274
|
+
}
|
|
275
|
+
const threshold = Math.max(SAFETY_BOUND_FLOOR, Math.floor(totalFiles * SAFETY_BOUND_PERCENTAGE));
|
|
276
|
+
if (planned > threshold) {
|
|
277
|
+
return (`Would move ${planned} of ${totalFiles} MDX file(s) — exceeds ` +
|
|
278
|
+
`the ${Math.floor(SAFETY_BOUND_PERCENTAGE * 100)}% safety bound. ` +
|
|
279
|
+
`Aborting. Review docs.json navigation and re-run.`);
|
|
280
|
+
}
|
|
281
|
+
if (totalFiles > 0 && planned / totalFiles > SAFETY_BOUND_RATIO) {
|
|
282
|
+
return (`Would move ${planned} of ${totalFiles} MDX file(s) — that's ` +
|
|
283
|
+
`${Math.round((planned / totalFiles) * 100)}% of the project. ` +
|
|
284
|
+
`Aborting. Review docs.json navigation and re-run.`);
|
|
285
|
+
}
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
export async function relocateOrphanSnippets(projectDir, config) {
|
|
289
|
+
const allMdxFiles = await glob('**/*.{mdx,md}', {
|
|
290
|
+
cwd: projectDir,
|
|
291
|
+
ignore: ['**/node_modules/**', '**/.git/**'],
|
|
292
|
+
absolute: true,
|
|
293
|
+
});
|
|
294
|
+
const graph = await buildProjectGraph(projectDir, allMdxFiles);
|
|
295
|
+
const { set: navSet, navigationPageCount } = buildNavSet(config, projectDir);
|
|
296
|
+
const ctx = {
|
|
297
|
+
projectDir,
|
|
298
|
+
snippetsRoot: path.join(projectDir, 'snippets'),
|
|
299
|
+
graph,
|
|
300
|
+
navSet,
|
|
301
|
+
};
|
|
302
|
+
// Sort for deterministic output (test stability) and to make
|
|
303
|
+
// snippet-imports-snippet ordering predictable when both qualify.
|
|
304
|
+
const candidates = [...graph.importedBy.keys()].sort();
|
|
305
|
+
const planned = [];
|
|
306
|
+
const skipped = [];
|
|
307
|
+
for (const importee of candidates) {
|
|
308
|
+
const decision = await classify(importee, ctx);
|
|
309
|
+
if (!decision)
|
|
310
|
+
continue;
|
|
311
|
+
if ('move' in decision)
|
|
312
|
+
planned.push(decision.move);
|
|
313
|
+
else
|
|
314
|
+
skipped.push(decision.skip);
|
|
315
|
+
}
|
|
316
|
+
const abortReason = computeAbortReason(planned.length, allMdxFiles.length, navigationPageCount);
|
|
317
|
+
if (abortReason) {
|
|
318
|
+
return {
|
|
319
|
+
moves: [],
|
|
320
|
+
skipped: [
|
|
321
|
+
...skipped,
|
|
322
|
+
...planned.map((p) => ({ file: p.rel, reason: 'aborted by safety bound' })),
|
|
323
|
+
],
|
|
324
|
+
aborted: { reason: abortReason },
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
const moves = [];
|
|
328
|
+
const moveMap = new Map();
|
|
329
|
+
for (const p of planned) {
|
|
330
|
+
if (p.resumed) {
|
|
331
|
+
// Dest already exists with identical content — drop the source so we
|
|
332
|
+
// don't end up with two copies on disk. fs.remove tolerates already-
|
|
333
|
+
// missing files but the importee was just confirmed to exist above.
|
|
334
|
+
await fs.remove(p.importee);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
await fs.ensureDir(path.dirname(p.destAbs));
|
|
338
|
+
await fs.move(p.importee, p.destAbs);
|
|
339
|
+
}
|
|
340
|
+
moveMap.set(p.importee, p.destAbs);
|
|
341
|
+
const newSpec = `/snippets/${p.rel.replaceAll(path.sep, '/')}`;
|
|
342
|
+
const importers = graph.importedBy.get(p.importee);
|
|
343
|
+
if (importers) {
|
|
344
|
+
for (const importer of importers) {
|
|
345
|
+
const currentImporterPath = moveMap.get(importer) ?? importer;
|
|
346
|
+
await rewriteImporterImports(currentImporterPath, p.importee, newSpec);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
moves.push({
|
|
350
|
+
from: p.rel,
|
|
351
|
+
to: path.relative(projectDir, p.destAbs),
|
|
352
|
+
...(p.resumed && { resumed: true }),
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return { moves, skipped };
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=relocate-snippets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relocate-snippets.js","sourceRoot":"","sources":["../../../src/commands/migrate/relocate-snippets.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;AAeH,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,CAgPtE"}
|
|
@@ -14,6 +14,7 @@ import { validateNavigationPages } from '../lib/navigation-validator.js';
|
|
|
14
14
|
import { extractAllPages } from '../lib/mdx-validator.js';
|
|
15
15
|
import { validateBrandingAssets } from '../lib/validate-branding.js';
|
|
16
16
|
import { ensureDependencies } from '../lib/deps.js';
|
|
17
|
+
import { rewriteRelativeMdxImports } from '../lib/relative-mdx-imports.js';
|
|
17
18
|
export async function validate(options) {
|
|
18
19
|
const { verbose } = options;
|
|
19
20
|
const projectDir = process.cwd();
|
|
@@ -113,6 +114,7 @@ export async function validate(options) {
|
|
|
113
114
|
const { checkForDeprecatedComponents } = await import('../lib/deprecated-components.js');
|
|
114
115
|
const { glob } = await import('glob');
|
|
115
116
|
const allDeprecatedErrors = [];
|
|
117
|
+
const relativeImportWarnings = [];
|
|
116
118
|
// Get all page paths from navigation (handles all formats: tabs, anchors, groups, languages, flat array)
|
|
117
119
|
const pagePaths = extractAllPages(result.config?.navigation);
|
|
118
120
|
// Check page files
|
|
@@ -132,7 +134,8 @@ export async function validate(options) {
|
|
|
132
134
|
const relPath = path.relative(projectDir, filePath);
|
|
133
135
|
allDeprecatedErrors.push(...checkForDeprecatedComponents(content, relPath));
|
|
134
136
|
}
|
|
135
|
-
// Check snippet files
|
|
137
|
+
// Check snippet files for deprecated components (relative imports are
|
|
138
|
+
// collected separately below in a project-wide walk).
|
|
136
139
|
const snippetsDir = path.join(projectDir, 'snippets');
|
|
137
140
|
if (await fs.pathExists(snippetsDir)) {
|
|
138
141
|
const snippetFiles = await glob('**/*.{mdx,md}', { cwd: snippetsDir });
|
|
@@ -142,6 +145,33 @@ export async function validate(options) {
|
|
|
142
145
|
allDeprecatedErrors.push(...checkForDeprecatedComponents(content, `snippets/${file}`));
|
|
143
146
|
}
|
|
144
147
|
}
|
|
148
|
+
// Walk EVERY .mdx file (not just nav-referenced pages) so validate matches
|
|
149
|
+
// the build-service skip detector — orphan pages with bad imports fail to
|
|
150
|
+
// compile too, and the user needs to know about them. The rewriter
|
|
151
|
+
// classifies each import: rewrites[] for auto-fixable, warnings[] for
|
|
152
|
+
// ones that need a manual action.
|
|
153
|
+
const allMdxFiles = await glob('**/*.{mdx,md}', {
|
|
154
|
+
cwd: projectDir,
|
|
155
|
+
ignore: ['**/node_modules/**', '**/.git/**'],
|
|
156
|
+
});
|
|
157
|
+
for (const file of allMdxFiles) {
|
|
158
|
+
const filePath = path.join(projectDir, file);
|
|
159
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
160
|
+
const { rewrites, warnings } = await rewriteRelativeMdxImports(content, filePath, projectDir);
|
|
161
|
+
for (const r of rewrites) {
|
|
162
|
+
relativeImportWarnings.push(`${file}:${r.line}: parent-relative MDX import "${r.from}" — run "jamdesk migrate" to auto-rewrite to ${r.to}`);
|
|
163
|
+
}
|
|
164
|
+
relativeImportWarnings.push(...warnings);
|
|
165
|
+
}
|
|
166
|
+
if (relativeImportWarnings.length > 0) {
|
|
167
|
+
console.log('');
|
|
168
|
+
output.warn(`Found ${relativeImportWarnings.length} parent-relative MDX import(s):`);
|
|
169
|
+
for (const w of relativeImportWarnings) {
|
|
170
|
+
console.log(` - ${w}`);
|
|
171
|
+
}
|
|
172
|
+
output.hint('Run "jamdesk migrate" to auto-fix the rewritable ones; the rest need the manual action shown above.');
|
|
173
|
+
console.log('');
|
|
174
|
+
}
|
|
145
175
|
if (allDeprecatedErrors.length > 0) {
|
|
146
176
|
console.log('');
|
|
147
177
|
output.error(`Found ${allDeprecatedErrors.length} deprecated component(s):`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAuB,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure MDX syntax-fix transforms shared by `jamdesk dev` (in-memory before
|
|
3
|
+
* MDX compile) and `jamdesk migrate` (on disk).
|
|
4
|
+
*
|
|
5
|
+
* Mirror of `unindentClosingTagAfterList` in
|
|
6
|
+
* builder/build-service/lib/preprocess-mdx.ts — keep regex in sync. The cli
|
|
7
|
+
* variant additionally returns 1-based touched-line numbers for migrate's
|
|
8
|
+
* report output.
|
|
9
|
+
*/
|
|
10
|
+
export declare function unindentClosingTagsAfterLists(content: string): {
|
|
11
|
+
content: string;
|
|
12
|
+
lines: number[];
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=mdx-syntax-fixes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdx-syntax-fixes.d.ts","sourceRoot":"","sources":["../../src/lib/mdx-syntax-fixes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAyBtC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure MDX syntax-fix transforms shared by `jamdesk dev` (in-memory before
|
|
3
|
+
* MDX compile) and `jamdesk migrate` (on disk).
|
|
4
|
+
*
|
|
5
|
+
* Mirror of `unindentClosingTagAfterList` in
|
|
6
|
+
* builder/build-service/lib/preprocess-mdx.ts — keep regex in sync. The cli
|
|
7
|
+
* variant additionally returns 1-based touched-line numbers for migrate's
|
|
8
|
+
* report output.
|
|
9
|
+
*/
|
|
10
|
+
const LIST_ITEM_LINE = /^\s*(?:[-*+]\s|\d+\.\s)/;
|
|
11
|
+
const INDENTED_CLOSING_TAG = /^(\s+)(<\/[A-Z][\w-]*>)\s*$/;
|
|
12
|
+
const HAS_INDENTED_CLOSING_TAG = /^\s+<\/[A-Z]/m;
|
|
13
|
+
export function unindentClosingTagsAfterLists(content) {
|
|
14
|
+
// Cheap prefilter — the migrate command iterates every MDX file and the
|
|
15
|
+
// validator runs on every dev validate. Most files have no indented
|
|
16
|
+
// closing tag at all; skip the split+walk in that case.
|
|
17
|
+
if (!HAS_INDENTED_CLOSING_TAG.test(content))
|
|
18
|
+
return { content, lines: [] };
|
|
19
|
+
const lines = content.split('\n');
|
|
20
|
+
const out = [];
|
|
21
|
+
const touched = [];
|
|
22
|
+
let lastNonBlank = '';
|
|
23
|
+
for (let i = 0; i < lines.length; i++) {
|
|
24
|
+
const line = lines[i];
|
|
25
|
+
const closing = line.match(INDENTED_CLOSING_TAG);
|
|
26
|
+
if (closing && LIST_ITEM_LINE.test(lastNonBlank)) {
|
|
27
|
+
out.push(closing[2]);
|
|
28
|
+
touched.push(i + 1);
|
|
29
|
+
lastNonBlank = closing[2];
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
out.push(line);
|
|
33
|
+
if (line.trim() !== '')
|
|
34
|
+
lastNonBlank = line;
|
|
35
|
+
}
|
|
36
|
+
return { content: out.join('\n'), lines: touched };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=mdx-syntax-fixes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdx-syntax-fixes.js","sourceRoot":"","sources":["../../src/lib/mdx-syntax-fixes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,cAAc,GAAG,yBAAyB,CAAC;AACjD,MAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAC3D,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAEjD,MAAM,UAAU,6BAA6B,CAC3C,OAAe;IAEf,wEAAwE;IACxE,oEAAoE;IACpE,wDAAwD;IACxD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAE3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpB,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -18,9 +18,18 @@ export interface MdxValidationError {
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function buildMdxNotFoundError(depsDir: string): Error;
|
|
20
20
|
/**
|
|
21
|
-
* Validate a single MDX file's content
|
|
21
|
+
* Validate a single MDX file's content.
|
|
22
|
+
*
|
|
23
|
+
* @param applySyntaxFixes - Whether to apply the same in-memory rewrites
|
|
24
|
+
* that build-service's preprocessMdx pipeline applies at render time
|
|
25
|
+
* (e.g. unindenting closing tags absorbed by list items). Default `true`
|
|
26
|
+
* so dev's gate matches what actually compiles. Pass `false` to see the
|
|
27
|
+
* verdict against raw on-disk content — used by `jamdesk migrate` to
|
|
28
|
+
* detect files that *would* break without the runtime safety net.
|
|
22
29
|
*/
|
|
23
|
-
export declare function validateMdxFile(content: string, filePath: string
|
|
30
|
+
export declare function validateMdxFile(content: string, filePath: string, options?: {
|
|
31
|
+
applySyntaxFixes?: boolean;
|
|
32
|
+
}): Promise<MdxValidationError | null>;
|
|
24
33
|
/**
|
|
25
34
|
* Extract all page paths from navigation config.
|
|
26
35
|
* Handles tabs, anchors, groups, languages (multi-language), and flat array structures.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdx-validator.d.ts","sourceRoot":"","sources":["../../src/lib/mdx-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"mdx-validator.d.ts","sourceRoot":"","sources":["../../src/lib/mdx-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAWD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAQ5D;AAmBD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA+BpC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,GAAG,GAAG,MAAM,EAAE,CAiEzD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA4B/B"}
|