jamdesk 1.1.6 → 1.1.8
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/README.md +46 -1
- package/dist/__tests__/unit/docs-json-writer.test.js +59 -1
- package/dist/__tests__/unit/docs-json-writer.test.js.map +1 -1
- package/dist/__tests__/unit/spellcheck-fix.test.d.ts +2 -0
- package/dist/__tests__/unit/spellcheck-fix.test.d.ts.map +1 -0
- package/dist/__tests__/unit/spellcheck-fix.test.js +82 -0
- package/dist/__tests__/unit/spellcheck-fix.test.js.map +1 -0
- package/dist/__tests__/unit/spellcheck-utils.test.d.ts +2 -0
- package/dist/__tests__/unit/spellcheck-utils.test.d.ts.map +1 -0
- package/dist/__tests__/unit/spellcheck-utils.test.js +234 -0
- package/dist/__tests__/unit/spellcheck-utils.test.js.map +1 -0
- package/dist/__tests__/unit/tech-words.test.d.ts +2 -0
- package/dist/__tests__/unit/tech-words.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tech-words.test.js +31 -0
- package/dist/__tests__/unit/tech-words.test.js.map +1 -0
- package/dist/commands/spellcheck.d.ts +13 -0
- package/dist/commands/spellcheck.d.ts.map +1 -0
- package/dist/commands/spellcheck.js +144 -0
- package/dist/commands/spellcheck.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/deps.js +2 -2
- package/dist/lib/docs-json-writer.d.ts +6 -0
- package/dist/lib/docs-json-writer.d.ts.map +1 -1
- package/dist/lib/docs-json-writer.js +29 -0
- package/dist/lib/docs-json-writer.js.map +1 -1
- package/dist/lib/openapi/types.d.ts +11 -6
- package/dist/lib/openapi/types.d.ts.map +1 -1
- package/dist/lib/path-security.d.ts +3 -0
- package/dist/lib/path-security.d.ts.map +1 -1
- package/dist/lib/path-security.js +14 -1
- package/dist/lib/path-security.js.map +1 -1
- package/dist/lib/spellcheck-fix.d.ts +37 -0
- package/dist/lib/spellcheck-fix.d.ts.map +1 -0
- package/dist/lib/spellcheck-fix.js +292 -0
- package/dist/lib/spellcheck-fix.js.map +1 -0
- package/dist/lib/spellcheck-utils.d.ts +36 -0
- package/dist/lib/spellcheck-utils.d.ts.map +1 -0
- package/dist/lib/spellcheck-utils.js +138 -0
- package/dist/lib/spellcheck-utils.js.map +1 -0
- package/dist/lib/tech-words.d.ts +9 -0
- package/dist/lib/tech-words.d.ts.map +1 -0
- package/dist/lib/tech-words.js +118 -0
- package/dist/lib/tech-words.js.map +1 -0
- package/package.json +15 -10
- package/vendored/app/[[...slug]]/page.tsx +48 -13
- package/vendored/app/api/assets/[...path]/route.ts +2 -0
- package/vendored/components/layout/LayoutWrapper.tsx +3 -4
- package/vendored/components/mdx/ApiEndpoint.tsx +13 -2
- package/vendored/components/mdx/MDXComponents.tsx +16 -0
- package/vendored/components/mdx/OpenApiEndpoint.tsx +76 -36
- package/vendored/components/mdx/Tabs.tsx +1 -1
- package/vendored/components/mdx/Video.tsx +82 -0
- package/vendored/components/navigation/Header.tsx +3 -3
- package/vendored/components/navigation/Sidebar.tsx +3 -3
- package/vendored/components/ui/CodePanel.tsx +5 -5
- package/vendored/components/ui/CodePanelModal.tsx +3 -3
- package/vendored/components/ui/DevOnlyNotice.tsx +78 -0
- package/vendored/hooks/useChatPanel.tsx +21 -2
- package/vendored/hooks/useMediaQuery.ts +27 -0
- package/vendored/lib/build-endpoint-from-mdx.ts +66 -0
- package/vendored/lib/isr-build-executor.ts +1 -1
- package/vendored/lib/middleware-helpers.ts +6 -1
- package/vendored/lib/openapi/code-examples.ts +479 -99
- package/vendored/lib/openapi/index.ts +9 -1
- package/vendored/lib/openapi/types.ts +29 -5
- package/vendored/lib/preprocess-mdx.ts +103 -36
- package/vendored/lib/process-mdx-with-exports.ts +22 -14
- package/vendored/lib/remark-extract-param-fields.ts +134 -0
- package/vendored/lib/shiki-client.ts +12 -0
- package/vendored/lib/static-artifacts.ts +2 -0
- package/vendored/lib/static-file-route.ts +1 -1
- package/vendored/lib/url-safety.ts +122 -0
- package/vendored/next.config.js +7 -0
- package/vendored/schema/docs-schema.json +35 -4
- package/vendored/scripts/copy-files.cjs +60 -54
- package/vendored/scripts/validate-links.cjs +1 -1
- package/vendored/shared/path-security.ts +17 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spellcheck Fix Utilities
|
|
3
|
+
*
|
|
4
|
+
* Prose-safe word replacement and interactive fix flow for spellcheck --fix.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { select, confirm } from '@inquirer/prompts';
|
|
9
|
+
import { output } from './output.js';
|
|
10
|
+
import { writeIgnoreWordsToDocsJson } from './docs-json-writer.js';
|
|
11
|
+
/** Escape special regex characters in a string. */
|
|
12
|
+
export function escapeRegex(str) {
|
|
13
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
14
|
+
}
|
|
15
|
+
/** Build non-prose character ranges for a line (inline code, JSX attrs, URLs). */
|
|
16
|
+
function buildNonProseRanges(line) {
|
|
17
|
+
const ranges = [];
|
|
18
|
+
const patterns = [
|
|
19
|
+
/`[^`]*`/g, // Inline code
|
|
20
|
+
/[a-zA-Z]+=["'][^"']*["']/g, // JSX string attributes
|
|
21
|
+
/[a-zA-Z]+=\{[^}]*\}/g, // JSX expression attributes
|
|
22
|
+
/https?:\/\/[^\s)>\]]+/g, // URLs
|
|
23
|
+
/\]\([^)]*\)/g, // Markdown link/image URLs
|
|
24
|
+
];
|
|
25
|
+
for (const pattern of patterns) {
|
|
26
|
+
for (const m of line.matchAll(pattern)) {
|
|
27
|
+
ranges.push([m.index, m.index + m[0].length]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return ranges;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Replace a word in a single line, only within prose segments.
|
|
34
|
+
* Skips inline code, JSX attribute values, and URLs.
|
|
35
|
+
* Optionally accepts pre-computed non-prose ranges to avoid recomputation.
|
|
36
|
+
*/
|
|
37
|
+
export function replaceWordInLine(line, word, replacement, nonProseRanges) {
|
|
38
|
+
const ranges = nonProseRanges ?? buildNonProseRanges(line);
|
|
39
|
+
function isInNonProse(pos) {
|
|
40
|
+
return ranges.some(([start, end]) => pos >= start && pos < end);
|
|
41
|
+
}
|
|
42
|
+
function caseAwareReplace(original, suggestion) {
|
|
43
|
+
if (!suggestion)
|
|
44
|
+
return suggestion;
|
|
45
|
+
if (original === original.toUpperCase() && original.length > 1) {
|
|
46
|
+
return suggestion.toUpperCase();
|
|
47
|
+
}
|
|
48
|
+
if (original[0] === original[0].toUpperCase()) {
|
|
49
|
+
return suggestion[0].toUpperCase() + suggestion.slice(1);
|
|
50
|
+
}
|
|
51
|
+
return suggestion;
|
|
52
|
+
}
|
|
53
|
+
const pattern = new RegExp(`\\b${escapeRegex(word)}\\b`, 'gi');
|
|
54
|
+
let result = '';
|
|
55
|
+
let lastIndex = 0;
|
|
56
|
+
for (const match of line.matchAll(pattern)) {
|
|
57
|
+
const matchStart = match.index;
|
|
58
|
+
const matchEnd = matchStart + match[0].length;
|
|
59
|
+
result += line.slice(lastIndex, matchStart);
|
|
60
|
+
if (isInNonProse(matchStart)) {
|
|
61
|
+
result += match[0];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
result += caseAwareReplace(match[0], replacement);
|
|
65
|
+
}
|
|
66
|
+
lastIndex = matchEnd;
|
|
67
|
+
}
|
|
68
|
+
result += line.slice(lastIndex);
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Apply multiple word fixes to file content.
|
|
73
|
+
* Processes line-by-line, replacing only in prose segments.
|
|
74
|
+
*/
|
|
75
|
+
export function applyFixesToContent(content, fixes) {
|
|
76
|
+
const lines = content.split('\n');
|
|
77
|
+
// Skip frontmatter (same logic as extractProseWords)
|
|
78
|
+
let startLine = 0;
|
|
79
|
+
if (lines[0]?.trim() === '---') {
|
|
80
|
+
for (let j = 1; j < lines.length; j++) {
|
|
81
|
+
if (lines[j].trim() === '---') {
|
|
82
|
+
startLine = j + 1;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (let i = startLine; i < lines.length; i++) {
|
|
88
|
+
// Skip fenced code blocks
|
|
89
|
+
if (lines[i].trim().startsWith('```')) {
|
|
90
|
+
i++;
|
|
91
|
+
while (i < lines.length && !lines[i].trim().startsWith('```'))
|
|
92
|
+
i++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Skip import/export statements (matches extractProseWords behavior)
|
|
96
|
+
if (/^(import|export)\s/.test(lines[i].trim()))
|
|
97
|
+
continue;
|
|
98
|
+
for (const { word, replacement } of fixes) {
|
|
99
|
+
// Recompute ranges per fix since previous replacements may shift positions
|
|
100
|
+
lines[i] = replaceWordInLine(lines[i], word, replacement);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return lines.join('\n');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Group misspellings by unique word (lowercase key).
|
|
107
|
+
*/
|
|
108
|
+
function groupMisspellings(misspellings) {
|
|
109
|
+
const groups = new Map();
|
|
110
|
+
for (const m of misspellings) {
|
|
111
|
+
const key = m.word.toLowerCase();
|
|
112
|
+
if (!groups.has(key)) {
|
|
113
|
+
groups.set(key, { casings: new Map(), files: [], suggestions: m.suggestions });
|
|
114
|
+
}
|
|
115
|
+
const g = groups.get(key);
|
|
116
|
+
g.casings.set(m.word, (g.casings.get(m.word) || 0) + 1);
|
|
117
|
+
g.files.push({ file: m.file, line: m.line });
|
|
118
|
+
}
|
|
119
|
+
return [...groups.entries()].map(([key, g]) => {
|
|
120
|
+
let bestWord = key;
|
|
121
|
+
let bestCount = 0;
|
|
122
|
+
for (const [w, c] of g.casings) {
|
|
123
|
+
if (c > bestCount) {
|
|
124
|
+
bestWord = w;
|
|
125
|
+
bestCount = c;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { word: bestWord, key, files: g.files, suggestions: g.suggestions };
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Run the interactive fix flow.
|
|
133
|
+
* Steps through each unique misspelled word and collects fix/ignore/skip decisions.
|
|
134
|
+
* Applies all changes after user confirmation.
|
|
135
|
+
*/
|
|
136
|
+
export async function runInteractiveFix(misspellings, docsJsonPath, projectDir, spell) {
|
|
137
|
+
const grouped = groupMisspellings(misspellings);
|
|
138
|
+
const decisions = [];
|
|
139
|
+
console.log(`\n${grouped.length} unique misspelled words found.\n`);
|
|
140
|
+
let interrupted = false;
|
|
141
|
+
try {
|
|
142
|
+
let ignoreAllRemaining = false;
|
|
143
|
+
let skipAllRemaining = false;
|
|
144
|
+
for (let i = 0; i < grouped.length; i++) {
|
|
145
|
+
const { word, files, suggestions } = grouped[i];
|
|
146
|
+
const remaining = grouped.length - i;
|
|
147
|
+
if (ignoreAllRemaining) {
|
|
148
|
+
decisions.push({ action: 'ignore', word });
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (skipAllRemaining) {
|
|
152
|
+
decisions.push({ action: 'skip', word });
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// Visual separator between words
|
|
156
|
+
if (i > 0) {
|
|
157
|
+
console.log('\n ─────────────────────────────────────\n');
|
|
158
|
+
}
|
|
159
|
+
// Display context
|
|
160
|
+
const fileList = files.slice(0, 5).map((f) => `${f.file}:${f.line}`).join(', ');
|
|
161
|
+
const moreCount = files.length - 5;
|
|
162
|
+
const fileDisplay = moreCount > 0 ? `${fileList}, ... and ${moreCount} more` : fileList;
|
|
163
|
+
console.log(` ${i + 1}/${grouped.length} "${word}" — found in ${files.length} file${files.length === 1 ? '' : 's'}`);
|
|
164
|
+
console.log(` ${fileDisplay}\n`);
|
|
165
|
+
// Compute suggestions on-demand if not already available
|
|
166
|
+
let wordSuggestions = suggestions;
|
|
167
|
+
if (wordSuggestions.length === 0 && spell) {
|
|
168
|
+
wordSuggestions = spell.suggest(word).slice(0, 3);
|
|
169
|
+
}
|
|
170
|
+
// Build choices with structured values
|
|
171
|
+
const choices = [];
|
|
172
|
+
for (let j = 0; j < wordSuggestions.length; j++) {
|
|
173
|
+
const label = j === 0 ? `Fix → ${wordSuggestions[j]} (recommended)` : `Fix → ${wordSuggestions[j]}`;
|
|
174
|
+
choices.push({ name: label, value: { action: 'fix', replacement: wordSuggestions[j] } });
|
|
175
|
+
}
|
|
176
|
+
choices.push({ name: 'Ignore in the future (add to docs.json)', value: { action: 'ignore' } });
|
|
177
|
+
choices.push({ name: 'Skip', value: { action: 'skip' } });
|
|
178
|
+
if (remaining >= 5 || wordSuggestions.length === 0) {
|
|
179
|
+
choices.push({ name: 'Ignore all remaining', value: { action: 'ignore-all' } });
|
|
180
|
+
choices.push({ name: 'Skip all remaining', value: { action: 'skip-all' } });
|
|
181
|
+
}
|
|
182
|
+
const answer = await select({
|
|
183
|
+
message: 'What do you want to do?',
|
|
184
|
+
choices,
|
|
185
|
+
loop: false,
|
|
186
|
+
});
|
|
187
|
+
if (answer.action === 'ignore-all') {
|
|
188
|
+
ignoreAllRemaining = true;
|
|
189
|
+
decisions.push({ action: 'ignore', word });
|
|
190
|
+
}
|
|
191
|
+
else if (answer.action === 'skip-all') {
|
|
192
|
+
skipAllRemaining = true;
|
|
193
|
+
decisions.push({ action: 'skip', word });
|
|
194
|
+
}
|
|
195
|
+
else if (answer.action === 'ignore') {
|
|
196
|
+
decisions.push({ action: 'ignore', word });
|
|
197
|
+
}
|
|
198
|
+
else if (answer.action === 'skip') {
|
|
199
|
+
decisions.push({ action: 'skip', word });
|
|
200
|
+
}
|
|
201
|
+
else if (answer.action === 'fix') {
|
|
202
|
+
decisions.push({ action: 'fix', word, replacement: answer.replacement });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
// Ctrl+C during prompts — apply decisions made so far
|
|
208
|
+
if (err instanceof Error && err.name === 'ExitPromptError') {
|
|
209
|
+
interrupted = true;
|
|
210
|
+
console.log('');
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
throw err;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Tally
|
|
217
|
+
const fixes = decisions.filter((d) => d.action === 'fix');
|
|
218
|
+
const ignores = decisions.filter((d) => d.action === 'ignore');
|
|
219
|
+
const skips = decisions.filter((d) => d.action === 'skip');
|
|
220
|
+
const reviewed = fixes.length + ignores.length + skips.length;
|
|
221
|
+
if (fixes.length === 0 && ignores.length === 0) {
|
|
222
|
+
console.log('\nNo changes to apply.');
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Count affected files for fixes
|
|
226
|
+
const fixWords = new Set(fixes.map((f) => f.word.toLowerCase()));
|
|
227
|
+
const affectedFiles = new Set(misspellings.filter((m) => fixWords.has(m.word.toLowerCase())).map((m) => m.file));
|
|
228
|
+
// Summary
|
|
229
|
+
if (interrupted) {
|
|
230
|
+
console.log(`\nStopped early — reviewed ${reviewed} of ${grouped.length} words.\n`);
|
|
231
|
+
}
|
|
232
|
+
console.log('Summary:');
|
|
233
|
+
if (fixes.length > 0) {
|
|
234
|
+
console.log(` Fix: ${fixes.length} word${fixes.length === 1 ? '' : 's'} across ${affectedFiles.size} file${affectedFiles.size === 1 ? '' : 's'}`);
|
|
235
|
+
}
|
|
236
|
+
if (ignores.length > 0) {
|
|
237
|
+
console.log(` Ignore: ${ignores.length} word${ignores.length === 1 ? '' : 's'} (added to docs.json)`);
|
|
238
|
+
}
|
|
239
|
+
if (skips.length > 0) {
|
|
240
|
+
console.log(` Skip: ${skips.length} word${skips.length === 1 ? '' : 's'} (no changes)`);
|
|
241
|
+
}
|
|
242
|
+
if (interrupted && reviewed < grouped.length) {
|
|
243
|
+
console.log(` Not reviewed: ${grouped.length - reviewed} word${grouped.length - reviewed === 1 ? '' : 's'}`);
|
|
244
|
+
}
|
|
245
|
+
console.log('');
|
|
246
|
+
const confirmed = await confirm({
|
|
247
|
+
message: interrupted ? 'Apply changes made so far?' : 'Apply changes?',
|
|
248
|
+
default: true,
|
|
249
|
+
});
|
|
250
|
+
if (!confirmed) {
|
|
251
|
+
console.log('No changes applied.');
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
// Apply fixes — batch per file
|
|
255
|
+
if (fixes.length > 0) {
|
|
256
|
+
const fixActions = fixes
|
|
257
|
+
.filter((f) => !!f.replacement)
|
|
258
|
+
.map((f) => ({ word: f.word, replacement: f.replacement }));
|
|
259
|
+
// Collect all affected file paths
|
|
260
|
+
const filePaths = new Set();
|
|
261
|
+
for (const m of misspellings) {
|
|
262
|
+
if (fixWords.has(m.word.toLowerCase())) {
|
|
263
|
+
filePaths.add(path.join(projectDir, m.file));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
let filesFixed = 0;
|
|
267
|
+
for (const absPath of filePaths) {
|
|
268
|
+
try {
|
|
269
|
+
const content = await fs.readFile(absPath, 'utf8');
|
|
270
|
+
const modified = applyFixesToContent(content, fixActions);
|
|
271
|
+
if (modified !== content) {
|
|
272
|
+
await fs.writeFile(absPath, modified);
|
|
273
|
+
filesFixed++;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
const code = err.code;
|
|
278
|
+
if (code !== 'ENOENT') {
|
|
279
|
+
output.warn(`Could not fix ${absPath}: ${err.message}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
output.success(`Fixed ${fixes.length} word${fixes.length === 1 ? '' : 's'} across ${filesFixed} file${filesFixed === 1 ? '' : 's'}`);
|
|
284
|
+
}
|
|
285
|
+
// Apply ignores
|
|
286
|
+
if (ignores.length > 0) {
|
|
287
|
+
const ignoreWordsList = ignores.map((d) => d.word);
|
|
288
|
+
await writeIgnoreWordsToDocsJson(docsJsonPath, ignoreWordsList);
|
|
289
|
+
output.success(`Added ${ignores.length} word${ignores.length === 1 ? '' : 's'} to spellcheck.ignore in docs.json`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=spellcheck-fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spellcheck-fix.js","sourceRoot":"","sources":["../../src/lib/spellcheck-fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spellcheck Utilities
|
|
3
|
+
*
|
|
4
|
+
* MDX text extraction and nspell wrapper for the spellcheck command.
|
|
5
|
+
*/
|
|
6
|
+
export interface ProseWord {
|
|
7
|
+
word: string;
|
|
8
|
+
line: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Misspelling {
|
|
11
|
+
file: string;
|
|
12
|
+
line: number;
|
|
13
|
+
word: string;
|
|
14
|
+
suggestions: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Extract prose words from MDX content, skipping code, frontmatter, JSX, etc.
|
|
18
|
+
* Returns words with their original line numbers.
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractProseWords(content: string): ProseWord[];
|
|
21
|
+
/**
|
|
22
|
+
* Create an nspell instance loaded with the English dictionary.
|
|
23
|
+
* Adds all provided ignore words via spell.add().
|
|
24
|
+
*
|
|
25
|
+
* dictionary-en v4 returns Uint8Array, but nspell expects Buffer.
|
|
26
|
+
* Wrap with Buffer.from() to fix.
|
|
27
|
+
*
|
|
28
|
+
* nspell add() follows Hunspell rules: adding an uppercase word only covers
|
|
29
|
+
* that exact casing. We also add the lowercase form so "API" covers "api" too.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createSpellchecker(ignoreWords: string[]): import("nspell").NSpell;
|
|
32
|
+
/**
|
|
33
|
+
* Build the complete ignore word list from config.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildIgnoreWords(techWords: string[], projectName: string | undefined, userIgnoreWords: string[]): string[];
|
|
36
|
+
//# sourceMappingURL=spellcheck-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spellcheck-utils.d.ts","sourceRoot":"","sources":["../../src/lib/spellcheck-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CA+G9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,2BAcvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,eAAe,EAAE,MAAM,EAAE,GACxB,MAAM,EAAE,CAUV"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spellcheck Utilities
|
|
3
|
+
*
|
|
4
|
+
* MDX text extraction and nspell wrapper for the spellcheck command.
|
|
5
|
+
*/
|
|
6
|
+
import nspell from 'nspell';
|
|
7
|
+
import dictionaryEn from 'dictionary-en';
|
|
8
|
+
/**
|
|
9
|
+
* Extract prose words from MDX content, skipping code, frontmatter, JSX, etc.
|
|
10
|
+
* Returns words with their original line numbers.
|
|
11
|
+
*/
|
|
12
|
+
export function extractProseWords(content) {
|
|
13
|
+
const lines = content.split('\n');
|
|
14
|
+
const words = [];
|
|
15
|
+
let inFrontmatter = false;
|
|
16
|
+
let frontmatterDone = false;
|
|
17
|
+
let inCodeBlock = false;
|
|
18
|
+
for (let i = 0; i < lines.length; i++) {
|
|
19
|
+
const lineNum = i + 1;
|
|
20
|
+
let line = lines[i];
|
|
21
|
+
// Frontmatter tracking
|
|
22
|
+
if (!frontmatterDone && lineNum === 1 && line.trim() === '---') {
|
|
23
|
+
inFrontmatter = true;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (inFrontmatter) {
|
|
27
|
+
if (line.trim() === '---') {
|
|
28
|
+
inFrontmatter = false;
|
|
29
|
+
frontmatterDone = true;
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Fenced code block tracking
|
|
34
|
+
if (line.trim().startsWith('```')) {
|
|
35
|
+
inCodeBlock = !inCodeBlock;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (inCodeBlock)
|
|
39
|
+
continue;
|
|
40
|
+
// Skip import/export statements
|
|
41
|
+
if (/^(import|export)\s/.test(line.trim()))
|
|
42
|
+
continue;
|
|
43
|
+
// Strip inline patterns (order matters)
|
|
44
|
+
// MDX comments {/* ... */}
|
|
45
|
+
line = line.replace(/\{\/\*[\s\S]*?\*\/\}/g, ' ');
|
|
46
|
+
// MDX expressions {variable}
|
|
47
|
+
line = line.replace(/\{[^}]*\}/g, ' ');
|
|
48
|
+
// Inline code `...`
|
|
49
|
+
line = line.replace(/`[^`]*`/g, ' ');
|
|
50
|
+
// Markdown images  — keep alt text, strip url
|
|
51
|
+
line = line.replace(/!\[([^\]]*)\]\([^)]*\)/g, '$1');
|
|
52
|
+
// Markdown links [text](url) — keep text, strip url
|
|
53
|
+
line = line.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1');
|
|
54
|
+
// JSX/HTML tags (opening, closing, self-closing) — strip tag but keep inner text
|
|
55
|
+
line = line.replace(/<\/?[A-Za-z][A-Za-z0-9]*(?:\s[^>]*)?\/?>/g, ' ');
|
|
56
|
+
// Bare HTML attributes that leak from multi-line JSX tags (e.g., href="/path")
|
|
57
|
+
// These appear as standalone lines like: title="API Overview" or href="/docs"
|
|
58
|
+
line = line.replace(/[a-zA-Z]+=["'][^"']*["']/g, ' ');
|
|
59
|
+
line = line.replace(/[a-zA-Z]+=\{[^}]*\}/g, ' ');
|
|
60
|
+
// Standalone URLs
|
|
61
|
+
line = line.replace(/https?:\/\/[^\s)>\]]+/g, ' ');
|
|
62
|
+
// File paths (slash-prefixed)
|
|
63
|
+
line = line.replace(/\/[a-zA-Z0-9_\-/.]+\.[a-zA-Z]+/g, ' ');
|
|
64
|
+
// HTML entities
|
|
65
|
+
line = line.replace(/&[a-zA-Z]+;/g, ' ');
|
|
66
|
+
// Email addresses (must run before domain-like pattern which would partially consume them)
|
|
67
|
+
line = line.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+/g, ' ');
|
|
68
|
+
// Fragment references (word#fragment)
|
|
69
|
+
line = line.replace(/[a-zA-Z0-9_]+#[a-zA-Z0-9_]+/g, ' ');
|
|
70
|
+
// Domain-like references (e.g., docs.json, example.com, dashboard.jamdesk.com)
|
|
71
|
+
line = line.replace(/[a-zA-Z0-9_-]+\.[a-zA-Z0-9_./-]+/g, ' ');
|
|
72
|
+
// Strip markdown heading markers
|
|
73
|
+
line = line.replace(/^#{1,6}\s+/, '');
|
|
74
|
+
// Split on whitespace, punctuation, hyphens, en/em-dashes, slashes, and plus signs
|
|
75
|
+
// Splitting on hyphens means "built-in" checks "built" and "in" separately (both valid)
|
|
76
|
+
const rawWords = line.split(/[\s,;:!?()[\]{}"–—\-/+]+/);
|
|
77
|
+
for (const raw of rawWords) {
|
|
78
|
+
// Strip surrounding punctuation
|
|
79
|
+
let word = raw.replace(/^[^a-zA-Z]+|[^a-zA-Z]+$/g, '');
|
|
80
|
+
if (!word)
|
|
81
|
+
continue;
|
|
82
|
+
// Handle possessives: Jamdesk's -> Jamdesk
|
|
83
|
+
word = word.replace(/'s$/, '');
|
|
84
|
+
if (!word)
|
|
85
|
+
continue;
|
|
86
|
+
// Skip camelCase/PascalCase (has lowercase followed by uppercase)
|
|
87
|
+
if (/[a-z][A-Z]/.test(word))
|
|
88
|
+
continue;
|
|
89
|
+
// Skip tokens with underscores (snake_case variables, SCREAMING_CASE constants)
|
|
90
|
+
if (word.includes('_'))
|
|
91
|
+
continue;
|
|
92
|
+
// Skip tokens with digits
|
|
93
|
+
if (/\d/.test(word))
|
|
94
|
+
continue;
|
|
95
|
+
// Skip short tokens (single chars, 2-letter codes like country/language codes)
|
|
96
|
+
if (word.length <= 2)
|
|
97
|
+
continue;
|
|
98
|
+
words.push({ word, line: lineNum });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return words;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create an nspell instance loaded with the English dictionary.
|
|
105
|
+
* Adds all provided ignore words via spell.add().
|
|
106
|
+
*
|
|
107
|
+
* dictionary-en v4 returns Uint8Array, but nspell expects Buffer.
|
|
108
|
+
* Wrap with Buffer.from() to fix.
|
|
109
|
+
*
|
|
110
|
+
* nspell add() follows Hunspell rules: adding an uppercase word only covers
|
|
111
|
+
* that exact casing. We also add the lowercase form so "API" covers "api" too.
|
|
112
|
+
*/
|
|
113
|
+
export function createSpellchecker(ignoreWords) {
|
|
114
|
+
const { aff, dic } = dictionaryEn;
|
|
115
|
+
const spell = nspell(Buffer.from(aff), Buffer.from(dic));
|
|
116
|
+
for (const word of ignoreWords) {
|
|
117
|
+
spell.add(word);
|
|
118
|
+
// Adding lowercase covers all case variants in Hunspell
|
|
119
|
+
const lower = word.toLowerCase();
|
|
120
|
+
if (lower !== word) {
|
|
121
|
+
spell.add(lower);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return spell;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Build the complete ignore word list from config.
|
|
128
|
+
*/
|
|
129
|
+
export function buildIgnoreWords(techWords, projectName, userIgnoreWords) {
|
|
130
|
+
const words = [...techWords, ...userIgnoreWords];
|
|
131
|
+
// Auto-extract individual words from project name
|
|
132
|
+
if (projectName) {
|
|
133
|
+
const nameWords = projectName.split(/\s+/).filter((w) => w.length > 0);
|
|
134
|
+
words.push(...nameWords);
|
|
135
|
+
}
|
|
136
|
+
return words;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=spellcheck-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spellcheck-utils.js","sourceRoot":"","sources":["../../src/lib/spellcheck-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in tech terms for spellcheck.
|
|
3
|
+
*
|
|
4
|
+
* These are added to the dictionary automatically so users don't have to
|
|
5
|
+
* list common programming jargon in their docs.json spellcheck.ignore.
|
|
6
|
+
* createSpellchecker() adds both the original and lowercase form of each word.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TECH_WORDS: string[];
|
|
9
|
+
//# sourceMappingURL=tech-words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tech-words.d.ts","sourceRoot":"","sources":["../../src/lib/tech-words.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,EAwH9B,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in tech terms for spellcheck.
|
|
3
|
+
*
|
|
4
|
+
* These are added to the dictionary automatically so users don't have to
|
|
5
|
+
* list common programming jargon in their docs.json spellcheck.ignore.
|
|
6
|
+
* createSpellchecker() adds both the original and lowercase form of each word.
|
|
7
|
+
*/
|
|
8
|
+
export const TECH_WORDS = [
|
|
9
|
+
// Jamdesk
|
|
10
|
+
'Jamdesk',
|
|
11
|
+
// Languages & runtimes
|
|
12
|
+
'JavaScript', 'TypeScript', 'Python', 'Golang', 'Kotlin', 'Rust',
|
|
13
|
+
'Deno', 'Bun', 'Node', 'NodeJS',
|
|
14
|
+
// Web & API
|
|
15
|
+
'API', 'APIs', 'REST', 'RESTful', 'GraphQL', 'gRPC', 'WebSocket',
|
|
16
|
+
'WebSockets', 'OAuth', 'OAuth2', 'JWT', 'JSON', 'YAML', 'TOML',
|
|
17
|
+
'XML', 'HTML', 'CSS', 'SCSS', 'MDX', 'JSX', 'TSX',
|
|
18
|
+
'HTTP', 'HTTPS', 'URL', 'URLs', 'URI', 'URIs',
|
|
19
|
+
'SDK', 'SDKs', 'CLI', 'CORS', 'CSRF', 'XSS',
|
|
20
|
+
'HMAC', 'TLS', 'SSL', 'SSH', 'DNS', 'CDN',
|
|
21
|
+
'iframe', 'iframes',
|
|
22
|
+
// HTML attributes (leak through from multi-line JSX)
|
|
23
|
+
'href', 'src', 'img', 'autoplay',
|
|
24
|
+
// Tools & platforms
|
|
25
|
+
'npm', 'npx', 'pnpm', 'yarn', 'Webpack', 'Vite', 'Turbopack',
|
|
26
|
+
'ESLint', 'Prettier', 'Vitest', 'Jest', 'Mocha',
|
|
27
|
+
'Docker', 'Kubernetes', 'kubectl', 'Terraform', 'Ansible',
|
|
28
|
+
'GitHub', 'GitLab', 'Bitbucket', 'Vercel', 'Netlify', 'Heroku',
|
|
29
|
+
'AWS', 'Azure', 'GCP', 'Firebase', 'Supabase', 'Cloudflare',
|
|
30
|
+
'Redis', 'PostgreSQL', 'MySQL', 'MongoDB', 'SQLite', 'DynamoDB',
|
|
31
|
+
'Elasticsearch', 'Nginx', 'Apache',
|
|
32
|
+
'Homebrew', 'FFmpeg', 'Zapier', 'Airtable',
|
|
33
|
+
'Firestore', 'Turborepo', 'Lerna', 'Lucide',
|
|
34
|
+
'Cloudfront', 'Okta', 'Wix', 'Octokit',
|
|
35
|
+
'VSCode', 'Gradle', 'JDK', 'CMS',
|
|
36
|
+
// Social platforms
|
|
37
|
+
'Reddit', 'subreddit', 'subreddits',
|
|
38
|
+
'Bluesky', 'Pinterest', 'Snapchat',
|
|
39
|
+
'LinkedIn', 'YouTube', 'TikTok',
|
|
40
|
+
'Wordpress', 'Shopify',
|
|
41
|
+
// Frameworks & libraries
|
|
42
|
+
'React', 'NextJS', 'Vue', 'Nuxt', 'Svelte', 'Angular',
|
|
43
|
+
'Express', 'FastAPI', 'Django', 'Flask', 'Rails',
|
|
44
|
+
'Tailwind', 'Prisma', 'Drizzle', 'Zod', 'Chakra',
|
|
45
|
+
// Concepts & patterns
|
|
46
|
+
'UI', 'UX', 'SSR', 'SSG', 'ISR', 'SPA',
|
|
47
|
+
'CRUD', 'ORM', 'MVC', 'RBAC', 'SAML', 'OIDC', 'SSO',
|
|
48
|
+
'async', 'await', 'middleware', 'webhook', 'webhooks',
|
|
49
|
+
'codebase', 'monorepo', 'monorepos', 'localhost', 'endpoint', 'endpoints',
|
|
50
|
+
'frontend', 'backend', 'fullstack', 'dev', 'DevOps', 'CI', 'CD',
|
|
51
|
+
'regex', 'cron', 'config', 'configs', 'env', 'changelog', 'changelogs',
|
|
52
|
+
'metadata', 'serializer', 'deserializer',
|
|
53
|
+
'boolean', 'param', 'params', 'args', 'kwargs',
|
|
54
|
+
'namespace', 'namespaces', 'enum', 'enums',
|
|
55
|
+
'nullable', 'nonnull',
|
|
56
|
+
'README', 'TODO', 'FIXME',
|
|
57
|
+
'autogenerate', 'autogenerated',
|
|
58
|
+
'pre', 'preconfigured', 'prebuilt', 'presigned',
|
|
59
|
+
'uncomment', 'uncommented',
|
|
60
|
+
'whitelist', 'blocklist', 'allowlist', 'denylist',
|
|
61
|
+
'repo', 'repos', 'subpath', 'subgraph', 'subdirectory', 'subdirectories',
|
|
62
|
+
'dropdown', 'navbar', 'sidebar', 'tooltip', 'tooltips', 'favicon', 'favicons',
|
|
63
|
+
'callout', 'callouts', 'walkthrough', 'walkthroughs', 'onboarding',
|
|
64
|
+
'frontmatter', 'schemas', 'proxying', 'proxied', 'debounced', 'debounce',
|
|
65
|
+
'natively', 'programmatically', 'presentational',
|
|
66
|
+
'embeddings', 'integrations', 'discoverability',
|
|
67
|
+
'quickstart', 'quickstarts', 'kickstart', 'jumpstart',
|
|
68
|
+
'lifecycle', 'rollup', 'rollouts', 'roadmap', 'roadmaps',
|
|
69
|
+
'blockquote', 'blockquotes', 'strikethrough',
|
|
70
|
+
'uptime', 'backoff', 'downrank',
|
|
71
|
+
'signin', 'signup', 'loggedin',
|
|
72
|
+
'customizable', 'customizations', 'scalable',
|
|
73
|
+
'automations', 'anonymized', 'anonymization',
|
|
74
|
+
'cancelled', 'cancelling', 'cancelation',
|
|
75
|
+
'unlink', 'unlinked', 'unlinking',
|
|
76
|
+
'unfollowing', 'unfollow',
|
|
77
|
+
'unpause', 'unpaused', 'unpausing',
|
|
78
|
+
'nofollow', 'typeahead', 'chatbot',
|
|
79
|
+
'heatmap', 'geolocation', 'geofencing',
|
|
80
|
+
'unicode', 'gzip', 'bitrate', 'codec',
|
|
81
|
+
// DNS & networking
|
|
82
|
+
'CNAME', 'TXT', 'MX', 'SEO', 'RSS', 'MCP', 'GDPR', 'CCPA',
|
|
83
|
+
'RTL', 'VPN', 'VPNs', 'RPC', 'ACL',
|
|
84
|
+
'UTM', 'CTA', 'CTAs', 'GTM', 'DPA', 'AES', 'CAA', 'SHA',
|
|
85
|
+
'PDFs', 'GIFs', 'SVGs', 'SLAs',
|
|
86
|
+
// Common docs terms
|
|
87
|
+
'Mintlify', 'Docusaurus', 'auth', 'authenticator',
|
|
88
|
+
'validator', 'validators', 'const', 'init', 'parsers',
|
|
89
|
+
'Cmd', 'Ctrl', 'Duotone',
|
|
90
|
+
'Vimeo', 'Anthropic', 'Shiki', 'Catppuccin',
|
|
91
|
+
'Pandoc', 'Caddy', 'Traefik', 'HAProxy',
|
|
92
|
+
'scannable', 'linter', 'checkmark', 'checkboxes',
|
|
93
|
+
'cryptographic', 'urlencoded',
|
|
94
|
+
'Bing', 'Mastercard',
|
|
95
|
+
'Cursor', 'Claude', 'Twoslash', 'Quill', 'Prism',
|
|
96
|
+
'Gantt', 'IFTTT', 'Plex', 'YYYY',
|
|
97
|
+
'vuejs', 'cdnjs', 'mintignore',
|
|
98
|
+
'sourcemaps', 'pathname',
|
|
99
|
+
'openapi', 'todos', 'nav', 'php', 'bcrypt',
|
|
100
|
+
'theming', 'hotfix', 'fallbacks', 'inlined',
|
|
101
|
+
'workspaces', 'unselected', 'unclosed', 'unescaped',
|
|
102
|
+
'realtime', 'sortable', 'subscribable',
|
|
103
|
+
'microsoft', 'Yandex', 'Namecheap',
|
|
104
|
+
// File formats & extensions
|
|
105
|
+
'PNG', 'JPG', 'JPEG', 'SVG', 'WebP', 'GIF', 'PDF',
|
|
106
|
+
'CSV', 'TSV', 'DOCX', 'PPTX', 'MOV', 'AVI', 'WAV', 'AAC',
|
|
107
|
+
'BMP', 'ICO', 'SRT',
|
|
108
|
+
// Misc tech
|
|
109
|
+
'SMTP', 'IMAP', 'FTP', 'SFTP',
|
|
110
|
+
'IPv4', 'IPv6', 'TCP', 'UDP',
|
|
111
|
+
'UUID', 'GUID', 'BASE64', 'UTF',
|
|
112
|
+
'LLM', 'LLMs', 'GPT', 'RAG',
|
|
113
|
+
'idempotent', 'idempotency',
|
|
114
|
+
'CAPTCHA', 'RGBA', 'RGB', 'DOM',
|
|
115
|
+
'USD', 'GBP',
|
|
116
|
+
'LTS', 'OG',
|
|
117
|
+
];
|
|
118
|
+
//# sourceMappingURL=tech-words.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tech-words.js","sourceRoot":"","sources":["../../src/lib/tech-words.ts"],"names":[],"mappings":"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"}
|