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.
Files changed (79) hide show
  1. package/README.md +46 -1
  2. package/dist/__tests__/unit/docs-json-writer.test.js +59 -1
  3. package/dist/__tests__/unit/docs-json-writer.test.js.map +1 -1
  4. package/dist/__tests__/unit/spellcheck-fix.test.d.ts +2 -0
  5. package/dist/__tests__/unit/spellcheck-fix.test.d.ts.map +1 -0
  6. package/dist/__tests__/unit/spellcheck-fix.test.js +82 -0
  7. package/dist/__tests__/unit/spellcheck-fix.test.js.map +1 -0
  8. package/dist/__tests__/unit/spellcheck-utils.test.d.ts +2 -0
  9. package/dist/__tests__/unit/spellcheck-utils.test.d.ts.map +1 -0
  10. package/dist/__tests__/unit/spellcheck-utils.test.js +234 -0
  11. package/dist/__tests__/unit/spellcheck-utils.test.js.map +1 -0
  12. package/dist/__tests__/unit/tech-words.test.d.ts +2 -0
  13. package/dist/__tests__/unit/tech-words.test.d.ts.map +1 -0
  14. package/dist/__tests__/unit/tech-words.test.js +31 -0
  15. package/dist/__tests__/unit/tech-words.test.js.map +1 -0
  16. package/dist/commands/spellcheck.d.ts +13 -0
  17. package/dist/commands/spellcheck.d.ts.map +1 -0
  18. package/dist/commands/spellcheck.js +144 -0
  19. package/dist/commands/spellcheck.js.map +1 -0
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +28 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/lib/deps.js +2 -2
  24. package/dist/lib/docs-json-writer.d.ts +6 -0
  25. package/dist/lib/docs-json-writer.d.ts.map +1 -1
  26. package/dist/lib/docs-json-writer.js +29 -0
  27. package/dist/lib/docs-json-writer.js.map +1 -1
  28. package/dist/lib/openapi/types.d.ts +11 -6
  29. package/dist/lib/openapi/types.d.ts.map +1 -1
  30. package/dist/lib/path-security.d.ts +3 -0
  31. package/dist/lib/path-security.d.ts.map +1 -1
  32. package/dist/lib/path-security.js +14 -1
  33. package/dist/lib/path-security.js.map +1 -1
  34. package/dist/lib/spellcheck-fix.d.ts +37 -0
  35. package/dist/lib/spellcheck-fix.d.ts.map +1 -0
  36. package/dist/lib/spellcheck-fix.js +292 -0
  37. package/dist/lib/spellcheck-fix.js.map +1 -0
  38. package/dist/lib/spellcheck-utils.d.ts +36 -0
  39. package/dist/lib/spellcheck-utils.d.ts.map +1 -0
  40. package/dist/lib/spellcheck-utils.js +138 -0
  41. package/dist/lib/spellcheck-utils.js.map +1 -0
  42. package/dist/lib/tech-words.d.ts +9 -0
  43. package/dist/lib/tech-words.d.ts.map +1 -0
  44. package/dist/lib/tech-words.js +118 -0
  45. package/dist/lib/tech-words.js.map +1 -0
  46. package/package.json +15 -10
  47. package/vendored/app/[[...slug]]/page.tsx +48 -13
  48. package/vendored/app/api/assets/[...path]/route.ts +2 -0
  49. package/vendored/components/layout/LayoutWrapper.tsx +3 -4
  50. package/vendored/components/mdx/ApiEndpoint.tsx +13 -2
  51. package/vendored/components/mdx/MDXComponents.tsx +16 -0
  52. package/vendored/components/mdx/OpenApiEndpoint.tsx +76 -36
  53. package/vendored/components/mdx/Tabs.tsx +1 -1
  54. package/vendored/components/mdx/Video.tsx +82 -0
  55. package/vendored/components/navigation/Header.tsx +3 -3
  56. package/vendored/components/navigation/Sidebar.tsx +3 -3
  57. package/vendored/components/ui/CodePanel.tsx +5 -5
  58. package/vendored/components/ui/CodePanelModal.tsx +3 -3
  59. package/vendored/components/ui/DevOnlyNotice.tsx +78 -0
  60. package/vendored/hooks/useChatPanel.tsx +21 -2
  61. package/vendored/hooks/useMediaQuery.ts +27 -0
  62. package/vendored/lib/build-endpoint-from-mdx.ts +66 -0
  63. package/vendored/lib/isr-build-executor.ts +1 -1
  64. package/vendored/lib/middleware-helpers.ts +6 -1
  65. package/vendored/lib/openapi/code-examples.ts +479 -99
  66. package/vendored/lib/openapi/index.ts +9 -1
  67. package/vendored/lib/openapi/types.ts +29 -5
  68. package/vendored/lib/preprocess-mdx.ts +103 -36
  69. package/vendored/lib/process-mdx-with-exports.ts +22 -14
  70. package/vendored/lib/remark-extract-param-fields.ts +134 -0
  71. package/vendored/lib/shiki-client.ts +12 -0
  72. package/vendored/lib/static-artifacts.ts +2 -0
  73. package/vendored/lib/static-file-route.ts +1 -1
  74. package/vendored/lib/url-safety.ts +122 -0
  75. package/vendored/next.config.js +7 -0
  76. package/vendored/schema/docs-schema.json +35 -4
  77. package/vendored/scripts/copy-files.cjs +60 -54
  78. package/vendored/scripts/validate-links.cjs +1 -1
  79. 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 ![alt](url) — 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":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAa;IAClC,UAAU;IACV,SAAS;IAET,uBAAuB;IACvB,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;IAChE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ;IAE/B,YAAY;IACZ,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;IAChE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC9D,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACjD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAC7C,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IAC3C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACzC,QAAQ,EAAE,SAAS;IAEnB,qDAAqD;IACrD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU;IAEhC,oBAAoB;IACpB,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;IAC5D,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO;IAC/C,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS;IACzD,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;IAC9D,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY;IAC3D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU;IAC/D,eAAe,EAAE,OAAO,EAAE,QAAQ;IAClC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU;IAC1C,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ;IAC3C,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;IACtC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;IAEhC,mBAAmB;IACnB,QAAQ,EAAE,WAAW,EAAE,YAAY;IACnC,SAAS,EAAE,WAAW,EAAE,UAAU;IAClC,UAAU,EAAE,SAAS,EAAE,QAAQ;IAC/B,WAAW,EAAE,SAAS;IAEtB,yBAAyB;IACzB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS;IACrD,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO;IAChD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ;IAEhD,sBAAsB;IACtB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACtC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IACnD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU;IACrD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW;IACzE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI;IAC/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY;IACtE,UAAU,EAAE,YAAY,EAAE,cAAc;IACxC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;IAC9C,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO;IAC1C,UAAU,EAAE,SAAS;IACrB,QAAQ,EAAE,MAAM,EAAE,OAAO;IACzB,cAAc,EAAE,eAAe;IAC/B,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW;IAC/C,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU;IACjD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB;IACxE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;IAC7E,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY;IAClE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU;IACxE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB;IAChD,YAAY,EAAE,cAAc,EAAE,iBAAiB;IAC/C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW;IACrD,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;IACxD,YAAY,EAAE,aAAa,EAAE,eAAe;IAC5C,QAAQ,EAAE,SAAS,EAAE,UAAU;IAC/B,QAAQ,EAAE,QAAQ,EAAE,UAAU;IAC9B,cAAc,EAAE,gBAAgB,EAAE,UAAU;IAC5C,aAAa,EAAE,YAAY,EAAE,eAAe;IAC5C,WAAW,EAAE,YAAY,EAAE,aAAa;IACxC,QAAQ,EAAE,UAAU,EAAE,WAAW;IACjC,aAAa,EAAE,UAAU;IACzB,SAAS,EAAE,UAAU,EAAE,WAAW;IAClC,UAAU,EAAE,WAAW,EAAE,SAAS;IAClC,SAAS,EAAE,aAAa,EAAE,YAAY;IACtC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;IAErC,mBAAmB;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IACzD,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAClC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACvD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAE9B,oBAAoB;IACpB,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe;IACjD,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;IACrD,KAAK,EAAE,MAAM,EAAE,SAAS;IACxB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY;IAC3C,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;IACvC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY;IAChD,eAAe,EAAE,YAAY;IAC7B,MAAM,EAAE,YAAY;IACpB,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;IAChD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAChC,OAAO,EAAE,OAAO,EAAE,YAAY;IAC9B,YAAY,EAAE,UAAU;IACxB,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ;IAC1C,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS;IAC3C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW;IACnD,UAAU,EAAE,UAAU,EAAE,cAAc;IACtC,WAAW,EAAE,QAAQ,EAAE,WAAW;IAElC,4BAA4B;IAC5B,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IACjD,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACxD,KAAK,EAAE,KAAK,EAAE,KAAK;IAEnB,YAAY;IACZ,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAC7B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAC5B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;IAC/B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAC3B,YAAY,EAAE,aAAa;IAC3B,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAC/B,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,IAAI;CACZ,CAAC"}