@entro314labs/markdownfix 0.0.15 → 0.0.20

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.
@@ -234,7 +234,7 @@ See [.remarkrc.js](./.remarkrc.js) for full configuration.
234
234
 
235
235
  ```javascript
236
236
  function example() {
237
- var unused = "bad";
237
+ const unused = "bad";
238
238
  return "hello"
239
239
  }
240
240
  ```
package/README.md CHANGED
@@ -179,12 +179,11 @@ markdownfix setup # Create example content structure
179
179
 
180
180
  ### 🚀 Nuclear Mode
181
181
 
182
- The `nuclear` command runs a comprehensive 4-step workflow that applies **all** available linters and fixers:
182
+ The `nuclear` command runs a comprehensive 3-step workflow that applies **all** available linters and fixers:
183
183
 
184
184
  1. **Remark Formatting** - Auto-fix markdown syntax
185
- 2. **Remark Linting** - Validate markdown rules (40+ rules)
186
- 3. **ESLint Auto-fix** - Fix JavaScript/JSX in code blocks
187
- 4. **ESLint Linting** - Validate code quality
185
+ 2. **ESLint Auto-fix** - Fix JavaScript/JSX in code blocks
186
+ 3. **Final Validation** - Report any remaining issues
188
187
 
189
188
  **Perfect for:**
190
189
 
@@ -210,36 +209,73 @@ markdownfix nuclear --glob "docs/**/*.{md,mdx}"
210
209
  }
211
210
  ```
212
211
 
213
- **Example Output:**
212
+ **Example Output (Success):**
214
213
 
215
214
  ```
216
215
  🚀 NUCLEAR MODE ACTIVATED
217
216
 
218
217
  Processing 15 file(s) with comprehensive workflow...
219
218
 
220
- Step 1/4: Running remark formatting...
221
- ✓ Remark formatting completed
219
+ Step 1/3: Running remark formatting...
220
+ ✓ Formatted 15 file(s)
222
221
 
223
- Step 2/4: Running remark linting...
224
- ✓ Remark linting passed
225
-
226
- Step 3/4: Running ESLint auto-fix...
222
+ Step 2/3: Running ESLint auto-fix on code blocks...
227
223
  ✓ ESLint auto-fix completed
228
224
 
229
- Step 4/4: Running ESLint linting...
230
- ✓ ESLint linting passed
225
+ Step 3/3: Running final validation...
226
+ ✓ All validation checks passed
231
227
 
232
228
  ════════════════════════════════════════════════════════════
233
229
  NUCLEAR MODE SUMMARY
234
230
  ════════════════════════════════════════════════════════════
235
- ✓ Remark Format PASS Formatted 15/15 files
236
- ✓ Remark Lint PASS Linted 15 files
237
- ✓ ESLint Fix PASS Auto-fixed code blocks
238
- ✓ ESLint Lint PASS All code blocks valid
231
+ ✓ Remark Format PASS Formatted 15/15 files
232
+ ✓ ESLint Fix PASS Fixed code blocks
233
+ ✓ Validation PASS All checks passed
239
234
  ════════════════════════════════════════════════════════════
240
235
  🎉 All checks passed! Your markdown is pristine.
241
236
  ```
242
237
 
238
+ **Example Output (Issues Found):**
239
+
240
+ ````
241
+ 🚀 NUCLEAR MODE ACTIVATED
242
+
243
+ Processing 8 file(s) with comprehensive workflow...
244
+
245
+ Step 1/3: Running remark formatting...
246
+ ✓ Formatted 8 file(s)
247
+ â„šī¸ Some issues require manual fixes
248
+
249
+ Step 2/3: Running ESLint auto-fix on code blocks...
250
+ âš ī¸ ESLint found issues that need manual fixes
251
+
252
+ Step 3/3: Running final validation...
253
+ âš ī¸ Validation found remaining issues
254
+
255
+ ════════════════════════════════════════════════════════════
256
+ REMAINING ISSUES
257
+ ════════════════════════════════════════════════════════════
258
+ file.md
259
+ 3:128 error Line too long (max 80 chars)
260
+ 17:1 error Missing code block language flag
261
+
262
+ ════════════════════════════════════════════════════════════
263
+ NUCLEAR MODE SUMMARY
264
+ ════════════════════════════════════════════════════════════
265
+ ✓ Remark Format PASS Formatted 8/8 files
266
+ âš ī¸ ESLint Fix NEEDS ATTENTION Some issues remain
267
+ âš ī¸ Validation NEEDS ATTENTION Issues found
268
+ ════════════════════════════════════════════════════════════
269
+
270
+ 📋 NEXT STEPS:
271
+ Review the issues above and fix them manually.
272
+ Common fixes:
273
+ â€ĸ Shorten long lines (max 80 chars)
274
+ â€ĸ Add language flags to code blocks (```js, ```bash, etc.)
275
+ â€ĸ Fix filename issues (use lowercase, avoid special chars)
276
+ â€ĸ Add blank lines between list items
277
+ ````
278
+
243
279
  ### Command Aliases
244
280
 
245
281
  The CLI is available via two commands:
package/cli.js CHANGED
@@ -22,15 +22,28 @@ import { execSync } from 'child_process';
22
22
  const MARKDOWN_EXTENSIONS = ['md', 'mdx', 'mdc', 'mdd'];
23
23
 
24
24
  // Import configuration from .remarkrc.js
25
+ // Suppress console output during import to avoid MDD warnings in nuclear mode
26
+ const originalLog = console.log;
27
+ const originalInfo = console.info;
28
+ console.log = () => {};
29
+ console.info = () => {};
30
+
25
31
  let remarkConfig;
26
32
  try {
27
33
  const configModule = await import(path.join(process.cwd(), '.remarkrc.js'));
28
34
  remarkConfig = configModule.default;
29
35
  } catch (e) {
36
+ // Restore console before warning
37
+ console.log = originalLog;
38
+ console.info = originalInfo;
30
39
  console.warn('âš ī¸ No .remarkrc.js found in current directory, using default config');
31
40
  remarkConfig = null;
32
41
  }
33
42
 
43
+ // Restore console
44
+ console.log = originalLog;
45
+ console.info = originalInfo;
46
+
34
47
  /**
35
48
  * Show help text
36
49
  */
@@ -79,9 +92,8 @@ EXAMPLES:
79
92
  NUCLEAR MODE:
80
93
  The nuclear command runs a comprehensive fix workflow:
81
94
  1. Remark formatting (auto-fix markdown syntax)
82
- 2. Remark linting (validate markdown rules)
83
- 3. ESLint auto-fix (fix JavaScript in code blocks)
84
- 4. ESLint linting (validate code quality)
95
+ 2. ESLint auto-fix (fix JavaScript/JSX in code blocks)
96
+ 3. Final validation (report remaining issues)
85
97
 
86
98
  Perfect for: CI/CD, pre-commit hooks, major cleanups
87
99
 
@@ -188,34 +200,53 @@ async function processFiles(files, options = {}) {
188
200
 
189
201
  /**
190
202
  * Run nuclear mode - comprehensive fix workflow
191
- * Executes: remark format -> remark lint -> eslint fix -> eslint lint
203
+ * Executes: remark format -> eslint fix -> final validation
192
204
  */
193
205
  async function runNuclearMode(files, options = {}) {
194
206
  const { quiet = false } = options;
195
207
  const hasEslint = await checkEslintAvailable();
196
208
 
209
+ // Filter out ESLint-ignored files in nuclear mode
210
+ let filteredFiles = files;
211
+ let ignoredCount = 0;
212
+ if (hasEslint) {
213
+ const ignorePatterns = await getEslintIgnorePatterns();
214
+ const originalCount = files.length;
215
+ filteredFiles = files.filter(file => !isFileIgnored(file, ignorePatterns));
216
+ ignoredCount = originalCount - filteredFiles.length;
217
+ }
218
+
197
219
  if (!quiet) {
198
220
  console.log('\n🚀 NUCLEAR MODE ACTIVATED\n');
199
- console.log(`Processing ${files.length} file(s) with comprehensive workflow...\n`);
221
+ if (ignoredCount > 0) {
222
+ console.log(`Found ${files.length} file(s), processing ${filteredFiles.length} (${ignoredCount} ignored by ESLint config)\n`);
223
+ } else {
224
+ console.log(`Processing ${filteredFiles.length} file(s) with comprehensive workflow...\n`);
225
+ }
200
226
  }
201
227
 
202
228
  let overallSuccess = true;
203
229
  const steps = [];
230
+ let remarkIssues = [];
231
+ let eslintIssues = [];
204
232
 
205
- // Step 1: Remark formatting
206
- if (!quiet) console.log('Step 1/4: Running remark formatting...');
233
+ // Step 1: Remark formatting (auto-fixes what it can)
234
+ if (!quiet) console.log('Step 1/3: Running remark formatting...');
207
235
  try {
208
- const result = await processFiles(files, { write: true, quiet: true });
236
+ const result = await processFiles(filteredFiles, { write: true, quiet: true });
237
+ const formatted = result.processedCount;
238
+ const withIssues = result.hasErrors;
239
+
209
240
  steps.push({
210
241
  name: 'Remark Format',
211
- success: !result.hasErrors,
212
- details: `Wrote ${result.processedCount}/${result.totalFiles} files`
242
+ success: formatted > 0,
243
+ details: `Formatted ${formatted}/${result.totalFiles} files`
213
244
  });
214
- if (result.hasErrors) overallSuccess = false;
245
+
215
246
  if (!quiet) {
216
- console.log(` ✓ Remark formatting completed (${result.processedCount} files written)`);
217
- if (result.hasErrors) {
218
- console.log(` âš ī¸ Some files had lint warnings (but were still formatted)\n`);
247
+ console.log(` ✓ Formatted ${formatted} file(s)`);
248
+ if (withIssues) {
249
+ console.log(` â„šī¸ Some issues require manual fixes\n`);
219
250
  } else {
220
251
  console.log();
221
252
  }
@@ -226,87 +257,94 @@ async function runNuclearMode(files, options = {}) {
226
257
  if (!quiet) console.log(` ✗ Remark formatting failed: ${error.message}\n`);
227
258
  }
228
259
 
229
- // Step 2: Remark linting
230
- if (!quiet) console.log('Step 2/4: Running remark linting...');
231
- try {
232
- const result = await processFiles(files, { lintOnly: true, quiet: true });
233
- steps.push({
234
- name: 'Remark Lint',
235
- success: !result.hasErrors,
236
- details: `Linted ${result.totalFiles} files`
237
- });
238
- if (result.hasErrors) {
239
- if (!quiet) console.log(' âš ī¸ Remark linting found issues (check output above)\n');
240
- overallSuccess = false;
241
- } else {
242
- if (!quiet) console.log(` ✓ Remark linting passed\n`);
243
- }
244
- } catch (error) {
245
- steps.push({ name: 'Remark Lint', success: false, details: error.message });
246
- overallSuccess = false;
247
- if (!quiet) console.log(` ✗ Remark linting failed: ${error.message}\n`);
248
- }
249
260
 
250
- // Step 3 & 4: ESLint (only if ESLint is available)
261
+ // Step 2: ESLint auto-fix (only if ESLint is available)
251
262
  if (hasEslint) {
252
263
  const eslintConfigInfo = await getEslintConfigPath();
253
264
  const { configPath, source } = eslintConfigInfo;
254
265
 
255
- if (!quiet && source === 'bundled') {
256
- console.log(' â„šī¸ Using bundled ESLint config (no local config found)\n');
257
- }
258
-
259
- // Step 3: ESLint auto-fix
260
- if (!quiet) console.log('Step 3/4: Running ESLint auto-fix...');
266
+ if (!quiet) console.log('Step 2/3: Running ESLint auto-fix on code blocks...');
261
267
  try {
262
- // Quote each file path to handle spaces and special characters
263
- const fileList = files.map(f => `"${f}"`).join(' ');
268
+ const fileList = filteredFiles.map(f => `"${f}"`).join(' ');
264
269
  const eslintCmd = `npx eslint --config "${configPath}" --fix ${fileList}`;
265
270
 
266
271
  try {
267
- execSync(eslintCmd, {
268
- stdio: quiet ? 'pipe' : 'inherit',
272
+ const result = execSync(eslintCmd, {
273
+ stdio: 'pipe',
269
274
  cwd: process.cwd()
270
275
  });
271
- steps.push({ name: 'ESLint Fix', success: true, details: 'Auto-fixed code blocks' });
276
+ steps.push({ name: 'ESLint Fix', success: true, details: 'Fixed code blocks' });
272
277
  if (!quiet) console.log(` ✓ ESLint auto-fix completed\n`);
273
278
  } catch (eslintError) {
274
- // ESLint returns non-zero even if it fixes issues
275
- steps.push({ name: 'ESLint Fix', success: false, details: 'Some issues could not be auto-fixed' });
276
- if (!quiet) console.log(` âš ī¸ ESLint auto-fix completed with warnings\n`);
279
+ // ESLint returns non-zero if there are unfixable issues
280
+ const output = eslintError.stdout?.toString() || eslintError.stderr?.toString() || '';
281
+
282
+ // Filter out "File ignored" warnings - these are expected
283
+ const lines = output.split('\n').filter(line =>
284
+ !line.includes('File ignored because of a matching ignore pattern')
285
+ );
286
+ const filteredOutput = lines.join('\n');
287
+
288
+ const hasWarnings = filteredOutput.includes('warning');
289
+ const hasErrors = filteredOutput.includes('error');
290
+
291
+ if (hasErrors || hasWarnings) {
292
+ steps.push({ name: 'ESLint Fix', success: false, details: 'Some issues remain' });
293
+ if (!quiet) console.log(` âš ī¸ ESLint found issues that need manual fixes\n`);
294
+ } else {
295
+ steps.push({ name: 'ESLint Fix', success: true, details: 'Fixed code blocks' });
296
+ if (!quiet) console.log(` ✓ ESLint auto-fix completed\n`);
297
+ }
277
298
  }
278
299
  } catch (error) {
279
300
  steps.push({ name: 'ESLint Fix', success: false, details: error.message });
280
301
  if (!quiet) console.log(` ✗ ESLint auto-fix failed: ${error.message}\n`);
281
302
  }
303
+ } else {
304
+ if (!quiet) {
305
+ console.log('Step 2/3: Skipping ESLint (not installed)');
306
+ console.log(' â„šī¸ Install with: npm install -D eslint eslint-plugin-mdx\n');
307
+ }
308
+ steps.push({ name: 'ESLint Fix', success: true, details: 'Skipped (not installed)' });
309
+ }
282
310
 
283
- // Step 4: ESLint linting
284
- if (!quiet) console.log('Step 4/4: Running ESLint linting...');
285
- try {
286
- // Quote each file path to handle spaces and special characters
287
- const fileList = files.map(f => `"${f}"`).join(' ');
288
- const eslintCmd = `npx eslint --config "${configPath}" ${fileList}`;
289
-
290
- execSync(eslintCmd, {
291
- stdio: quiet ? 'pipe' : 'inherit',
292
- cwd: process.cwd()
293
- });
294
- steps.push({ name: 'ESLint Lint', success: true, details: 'All code blocks valid' });
295
- if (!quiet) console.log(` ✓ ESLint linting passed\n`);
296
- } catch (eslintError) {
297
- steps.push({ name: 'ESLint Lint', success: false, details: 'Linting issues found' });
311
+ // Step 3: Final validation
312
+ if (!quiet) console.log('Step 3/3: Running final validation...');
313
+ let validationResult;
314
+ try {
315
+ validationResult = await processFiles(filteredFiles, { lintOnly: true, quiet: true });
316
+ const hasIssues = validationResult.hasErrors;
317
+
318
+ if (hasIssues) {
298
319
  overallSuccess = false;
299
- if (!quiet) console.log(` âš ī¸ ESLint linting found issues\n`);
300
320
  }
301
- } else {
302
- // ESLint not installed
321
+
322
+ steps.push({
323
+ name: 'Validation',
324
+ success: !hasIssues,
325
+ details: hasIssues ? 'Issues found' : 'All checks passed'
326
+ });
327
+
303
328
  if (!quiet) {
304
- console.log('Step 3/4: Skipping ESLint (not installed)');
305
- console.log(' â„šī¸ Install ESLint with: npm install -D eslint eslint-plugin-mdx\n');
306
- console.log('Step 4/4: Skipping ESLint linting\n');
329
+ if (hasIssues) {
330
+ console.log(` âš ī¸ Validation found remaining issues\n`);
331
+ } else {
332
+ console.log(` ✓ All validation checks passed\n`);
333
+ }
307
334
  }
308
- steps.push({ name: 'ESLint Fix', success: true, details: 'Skipped (not installed)' });
309
- steps.push({ name: 'ESLint Lint', success: true, details: 'Skipped (not installed)' });
335
+ } catch (error) {
336
+ steps.push({ name: 'Validation', success: false, details: error.message });
337
+ overallSuccess = false;
338
+ if (!quiet) console.log(` ✗ Validation failed: ${error.message}\n`);
339
+ }
340
+
341
+ // Show detailed issues if validation failed
342
+ if (!quiet && validationResult?.hasErrors) {
343
+ console.log('═'.repeat(60));
344
+ console.log('REMAINING ISSUES');
345
+ console.log('═'.repeat(60));
346
+ await processFiles(filteredFiles, { lintOnly: true, quiet: false });
347
+ console.log();
310
348
  }
311
349
 
312
350
  // Summary
@@ -315,15 +353,22 @@ async function runNuclearMode(files, options = {}) {
315
353
  console.log('NUCLEAR MODE SUMMARY');
316
354
  console.log('═'.repeat(60));
317
355
  steps.forEach(step => {
318
- const icon = step.success ? '✓' : '✗';
319
- const status = step.success ? 'PASS' : 'FAIL';
320
- console.log(`${icon} ${step.name.padEnd(20)} ${status.padEnd(6)} ${step.details}`);
356
+ const icon = step.success ? '✓' : 'âš ī¸';
357
+ const status = step.success ? 'PASS' : 'NEEDS ATTENTION';
358
+ console.log(`${icon} ${step.name.padEnd(20)} ${status.padEnd(16)} ${step.details}`);
321
359
  });
322
360
  console.log('═'.repeat(60));
361
+
323
362
  if (overallSuccess) {
324
363
  console.log('🎉 All checks passed! Your markdown is pristine.\n');
325
364
  } else {
326
- console.log('âš ī¸ Some issues remain. Review the output above.\n');
365
+ console.log('\n📋 NEXT STEPS:');
366
+ console.log(' Review the issues above and fix them manually.');
367
+ console.log(' Common fixes:');
368
+ console.log(' â€ĸ Shorten long lines (max 80 chars)');
369
+ console.log(' â€ĸ Add language flags to code blocks (```js, ```bash, etc.)');
370
+ console.log(' â€ĸ Fix filename issues (use lowercase, avoid special chars)');
371
+ console.log(' â€ĸ Add blank lines between list items\n');
327
372
  }
328
373
  }
329
374
 
@@ -359,6 +404,60 @@ async function getEslintConfigPath() {
359
404
  const bundledConfig = new URL('./eslint.config.js', import.meta.url).pathname;
360
405
  return { configPath: bundledConfig, source: 'bundled' };
361
406
  }
407
+ }
408
+
409
+ /**
410
+ * Get ESLint ignore patterns from config
411
+ * Returns array of ignore patterns to filter files in nuclear mode
412
+ * Note: We parse the config file as text instead of importing it because
413
+ * the config has dependencies that require ESLint to be in the require cache
414
+ */
415
+ async function getEslintIgnorePatterns() {
416
+ try {
417
+ const { configPath } = await getEslintConfigPath();
418
+ const configContent = await fs.readFile(configPath, 'utf-8');
419
+
420
+ // Extract the ignores array using regex
421
+ // Look for: ignores: [ ... ]
422
+ const ignoresMatch = configContent.match(/ignores:\s*\[([\s\S]*?)\]/);
423
+ if (!ignoresMatch) return [];
424
+
425
+ const ignoresContent = ignoresMatch[1];
426
+
427
+ // Extract quoted strings from the array
428
+ const patterns = [];
429
+ const stringMatches = ignoresContent.matchAll(/['"]([^'"]+)['"]/g);
430
+ for (const match of stringMatches) {
431
+ patterns.push(match[1]);
432
+ }
433
+
434
+ return patterns;
435
+ } catch (error) {
436
+ return [];
437
+ }
438
+ }
439
+
440
+ /**
441
+ * Check if a file matches any of the ignore patterns
442
+ */
443
+ function isFileIgnored(filePath, ignorePatterns) {
444
+ // Convert ignore patterns to regex-like matching
445
+ for (const pattern of ignorePatterns) {
446
+ // Handle glob patterns
447
+ if (pattern.includes('**')) {
448
+ // **/*.config.js -> matches any .config.js file
449
+ const regex = new RegExp(pattern.replace(/\*\*/g, '.*').replace(/\*/g, '[^/]*').replace(/\./g, '\\.'));
450
+ if (regex.test(filePath)) return true;
451
+ } else if (pattern.includes('*')) {
452
+ // *.js -> matches .js files in root
453
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '[^/]*').replace(/\./g, '\\.') + '$');
454
+ if (regex.test(filePath)) return true;
455
+ } else {
456
+ // Exact match or ends with pattern
457
+ if (filePath === pattern || filePath.endsWith('/' + pattern)) return true;
458
+ }
459
+ }
460
+ return false;
362
461
  }/**
363
462
  * Initialize .remarkrc.js configuration
364
463
  */
package/eslint.config.js CHANGED
@@ -71,12 +71,22 @@ export default [
71
71
  },
72
72
  rules: {
73
73
  ...mdxPlugin.flatCodeBlocks.rules,
74
- // Add JavaScript rules for code blocks
74
+ // Rules that make sense for documentation examples
75
75
  'no-var': 'error',
76
76
  'prefer-const': 'error',
77
- 'no-unused-vars': 'warn',
78
- // Allow common globals in documentation examples
79
- 'no-undef': 'off',
77
+
78
+ // Disable rules that don't make sense for isolated code examples
79
+ 'no-unused-vars': 'off', // Examples often show declarations without usage
80
+ 'no-undef': 'off', // Examples may reference external variables/functions
81
+ 'no-console': 'off', // Console logs are common in examples
82
+ 'no-unreachable': 'off', // Examples may show code patterns, not full logic
83
+ 'no-constant-condition': 'off', // Examples may use simplified conditions
84
+ 'no-empty': 'off', // Empty blocks may be placeholders in examples
85
+ 'prefer-rest-params': 'off', // Examples may show older patterns
86
+ 'prefer-spread': 'off', // Examples may demonstrate various approaches
87
+ '@typescript-eslint/no-unused-vars': 'off', // TypeScript variant
88
+ 'import/no-unresolved': 'off', // Examples won't have real imports
89
+ 'no-redeclare': 'off', // Multiple examples might reuse variable names
80
90
  }
81
91
  }
82
92
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entro314labs/markdownfix",
3
- "version": "0.0.15",
3
+ "version": "0.0.20",
4
4
  "description": "Opinionated markdown formatter and linter for MD, MDX, MDC, and MDD files using Remark/Unified ecosystem",
5
5
  "type": "module",
6
6
  "repository": {
@@ -45,27 +45,27 @@
45
45
  "author": "Dominikos Pritis",
46
46
  "license": "MIT",
47
47
  "devDependencies": {
48
- "markdown-link-check": "^3.14.1",
48
+ "markdown-link-check": "^3.14.2",
49
49
  "remark-cli": "^12.0.1"
50
50
  },
51
51
  "engines": {
52
52
  "node": ">=22.x"
53
53
  },
54
54
  "dependencies": {
55
- "@adobe/remark-gridtables": "^3.0.15",
55
+ "@adobe/remark-gridtables": "^3.0.16",
56
56
  "@code-dot-org/remark-plugins": "^2.0.1",
57
- "@entro314labs/remark-mdd": "^0.0.15",
57
+ "@entro314labs/remark-mdd": "^0.0.16",
58
58
  "@theguild/remark-mermaid": "^0.3.0",
59
- "eslint": "^9.39.1",
59
+ "eslint": "^9.39.2",
60
60
  "eslint-plugin-mdx": "^3.6.2",
61
61
  "eslint-plugin-react": "^7.37.5",
62
62
  "fumadocs-docgen": "^3.0.4",
63
- "glob": "^11.0.3",
64
- "js-yaml": "^4.1.0",
63
+ "glob": "^13.0.0",
64
+ "js-yaml": "^4.1.1",
65
65
  "rehype-remark": "^10.0.1",
66
- "remark": "^15.0.1",
66
+ "remark": "latest",
67
67
  "remark-directive": "^4.0.0",
68
- "remark-docx": "^0.2.0",
68
+ "remark-docx": "^0.3.19",
69
69
  "remark-emoji": "^5.0.2",
70
70
  "remark-frontmatter": "^5.0.0",
71
71
  "remark-gfm": "^4.0.1",
@@ -99,7 +99,7 @@
99
99
  "remark-lint-no-empty-sections": "^4.0.0",
100
100
  "remark-lint-no-heading-indent": "^5.0.1",
101
101
  "remark-lint-no-heading-punctuation": "^4.0.1",
102
- "remark-lint-no-trailing-spaces": "^3.0.2",
102
+ "remark-lint-no-trailing-spaces": "^4.0.3",
103
103
  "remark-lint-ordered-list-marker-style": "^4.0.1",
104
104
  "remark-lint-ordered-list-marker-value": "^4.0.1",
105
105
  "remark-lint-strong-marker": "^4.0.1",
@@ -107,7 +107,7 @@
107
107
  "remark-lint-table-pipe-alignment": "^4.1.1",
108
108
  "remark-lint-table-pipes": "^5.0.1",
109
109
  "remark-lint-unordered-list-marker-style": "^4.0.1",
110
- "remark-mdc": "^3.8.1",
110
+ "remark-mdc": "^3.10.0",
111
111
  "remark-mdx": "^3.1.1",
112
112
  "remark-mdx-frontmatter": "^5.2.0",
113
113
  "remark-preset-lint-consistent": "^6.0.1",