@takazudo/mdx-formatter 0.5.0-next.2 → 1.0.0
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 +55 -20
- package/dist/browser.d.ts +7 -17
- package/dist/browser.js +6 -44
- package/dist/index.d.ts +3 -3
- package/dist/index.js +7 -26
- package/dist/load-config.js +10 -2
- package/dist/rust-formatter.d.ts +10 -9
- package/dist/rust-formatter.js +46 -24
- package/dist/settings.d.ts +0 -1
- package/dist/settings.js +0 -9
- package/dist/types.d.ts +0 -131
- package/dist/utils.js +3 -0
- package/package.json +19 -18
- package/dist/html-block-formatter.d.ts +0 -46
- package/dist/html-block-formatter.js +0 -370
- package/dist/hybrid-formatter.d.ts +0 -83
- package/dist/hybrid-formatter.js +0 -1150
- package/dist/indent-detector.d.ts +0 -62
- package/dist/indent-detector.js +0 -358
- package/dist/plugins/docusaurus-admonitions.d.ts +0 -5
- package/dist/plugins/docusaurus-admonitions.js +0 -42
- package/dist/plugins/fix-autolink-output.d.ts +0 -4
- package/dist/plugins/fix-autolink-output.js +0 -24
- package/dist/plugins/fix-formatting-issues.d.ts +0 -4
- package/dist/plugins/fix-formatting-issues.js +0 -42
- package/dist/plugins/fix-paragraph-spacing.d.ts +0 -5
- package/dist/plugins/fix-paragraph-spacing.js +0 -96
- package/dist/plugins/html-definition-list.d.ts +0 -5
- package/dist/plugins/html-definition-list.js +0 -64
- package/dist/plugins/japanese-text.d.ts +0 -5
- package/dist/plugins/japanese-text.js +0 -79
- package/dist/plugins/normalize-lists.d.ts +0 -5
- package/dist/plugins/normalize-lists.js +0 -58
- package/dist/plugins/preprocess-japanese.d.ts +0 -7
- package/dist/plugins/preprocess-japanese.js +0 -15
- package/dist/plugins/preserve-image-alt.d.ts +0 -8
- package/dist/plugins/preserve-image-alt.js +0 -19
- package/dist/plugins/preserve-jsx.d.ts +0 -6
- package/dist/plugins/preserve-jsx.js +0 -48
- package/dist/specific-formatter.d.ts +0 -30
- package/dist/specific-formatter.js +0 -469
package/README.md
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
# @takazudo/mdx-formatter
|
|
2
2
|
|
|
3
|
-
AST-based markdown and MDX formatter with Japanese text support.
|
|
3
|
+
AST-based markdown and MDX formatter with Japanese text support. Powered by a Rust engine (via napi-rs) for fast, reliable formatting.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **
|
|
7
|
+
- **Rust-powered** — Native Rust engine via napi-rs, 3-7x faster than pure JS
|
|
8
|
+
- **Hybrid formatter** — Parses AST for analysis, applies edits to original source lines (no lossy round-trip)
|
|
9
|
+
- **MDX support** — Full support for MDX syntax including JSX components, imports, exports
|
|
10
|
+
- **Japanese text handling** — Preserves Japanese punctuation and text formatting
|
|
11
|
+
- **Docusaurus admonitions** — Preserves `:::note`, `:::tip`, `:::warning` etc. syntax
|
|
12
|
+
- **HTML block formatting** — Proper indentation for HTML blocks (dl, table, ul, div, etc.)
|
|
13
|
+
- **GFM features** — Tables, strikethrough, task lists
|
|
14
|
+
- **YAML frontmatter** — Formatting with safe value pre-processing
|
|
15
|
+
- **CLI and API** — Use as command-line tool or import as library
|
|
16
|
+
- **WASM support** — Browser-compatible WASM build available
|
|
17
|
+
- **Configurable** — 10 independently toggleable rules via config file or API
|
|
16
18
|
|
|
17
19
|
## Installation
|
|
18
20
|
|
|
@@ -26,6 +28,12 @@ Or use directly with npx:
|
|
|
26
28
|
npx @takazudo/mdx-formatter --write "**/*.md"
|
|
27
29
|
```
|
|
28
30
|
|
|
31
|
+
### Prerelease (next)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install @takazudo/mdx-formatter@next
|
|
35
|
+
```
|
|
36
|
+
|
|
29
37
|
## Usage
|
|
30
38
|
|
|
31
39
|
### CLI
|
|
@@ -36,6 +44,9 @@ mdx-formatter --check "**/*.{md,mdx}"
|
|
|
36
44
|
|
|
37
45
|
# Format files in place
|
|
38
46
|
mdx-formatter --write "**/*.{md,mdx}"
|
|
47
|
+
|
|
48
|
+
# With config file
|
|
49
|
+
mdx-formatter --config .mdx-formatter.json --write "**/*.mdx"
|
|
39
50
|
```
|
|
40
51
|
|
|
41
52
|
### API
|
|
@@ -47,24 +58,48 @@ const formatted = await format('# Hello\nWorld');
|
|
|
47
58
|
console.log(formatted); // '# Hello\n\nWorld'
|
|
48
59
|
```
|
|
49
60
|
|
|
61
|
+
### Browser / WebView
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
import { format } from '@takazudo/mdx-formatter/browser';
|
|
65
|
+
|
|
66
|
+
const formatted = await format('# Hello\nWorld');
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The browser export avoids Node.js `fs`/`path` dependencies. See [Browser Usage](https://takazudomodular.com/pj/mdx-formatter/docs/overview/browser-usage) for details.
|
|
70
|
+
|
|
50
71
|
## Documentation
|
|
51
72
|
|
|
52
|
-
|
|
73
|
+
Full documentation at **[takazudomodular.com/pj/mdx-formatter](https://takazudomodular.com/pj/mdx-formatter/)**:
|
|
74
|
+
|
|
75
|
+
- [Overview](https://takazudomodular.com/pj/mdx-formatter/docs/overview) — Installation, usage, API, configuration
|
|
76
|
+
- [Formatting Rules](https://takazudomodular.com/pj/mdx-formatter/docs/formatting) — How the formatter handles each construct
|
|
77
|
+
- [Options](https://takazudomodular.com/pj/mdx-formatter/docs/options) — Per-rule configuration reference
|
|
78
|
+
- [Architecture](https://takazudomodular.com/pj/mdx-formatter/docs/architecture) — Hybrid formatter approach, Rust rewrite strategy
|
|
79
|
+
- [Changelog](https://takazudomodular.com/pj/mdx-formatter/docs/changelog) — Release history
|
|
80
|
+
|
|
81
|
+
## Architecture
|
|
82
|
+
|
|
83
|
+
The formatting engine is written in Rust using [markdown-rs](https://github.com/wooorm/markdown-rs) and [napi-rs](https://napi.rs/). The npm package loads the native Rust module at runtime. A standalone CLI binary and WASM build for browsers are also available. See [Architecture](https://takazudomodular.com/pj/mdx-formatter/docs/architecture) for details.
|
|
53
84
|
|
|
54
85
|
## Development
|
|
55
86
|
|
|
56
87
|
```bash
|
|
57
|
-
# Install dependencies
|
|
58
|
-
pnpm
|
|
59
|
-
|
|
60
|
-
#
|
|
61
|
-
pnpm test
|
|
88
|
+
pnpm install # Install dependencies
|
|
89
|
+
pnpm build # Compile TypeScript
|
|
90
|
+
pnpm test # Run tests (207 tests)
|
|
91
|
+
pnpm test:watch # Watch mode
|
|
92
|
+
pnpm test:coverage # Coverage report
|
|
93
|
+
pnpm lint # ESLint check
|
|
94
|
+
pnpm check # Prettier + ESLint check
|
|
95
|
+
```
|
|
62
96
|
|
|
63
|
-
|
|
64
|
-
pnpm test:watch
|
|
97
|
+
### Doc Site
|
|
65
98
|
|
|
66
|
-
|
|
67
|
-
pnpm
|
|
99
|
+
```bash
|
|
100
|
+
pnpm --dir doc dev # Dev server on port 3518
|
|
101
|
+
pnpm --dir doc dev:network # Network accessible (0.0.0.0:3518)
|
|
102
|
+
pnpm --dir doc build # Production build
|
|
68
103
|
```
|
|
69
104
|
|
|
70
105
|
## License
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Browser-safe entry point for mdx-formatter.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Vite, webpack, or any browser environment.
|
|
4
|
+
* Note: In browser environments, use the WASM module directly instead.
|
|
5
|
+
* This export is kept for API compatibility but requires the napi native
|
|
6
|
+
* module to be available (Node.js only).
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* path is never reached, bundlers can tree-shake the prettier import away.
|
|
8
|
+
* For true browser usage, see the WASM package at
|
|
9
|
+
* `crates/mdx-formatter-wasm/` or the doc site playground.
|
|
12
10
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
export { detectMdx };
|
|
16
|
-
/**
|
|
17
|
-
* Format markdown/MDX content in browser environments.
|
|
18
|
-
*
|
|
19
|
-
* Uses browser-safe defaults (formatHtmlBlocksInMdx disabled).
|
|
20
|
-
* Pass an optional `settings` object to override individual rules.
|
|
21
|
-
*/
|
|
22
|
-
export declare function format(content: string, settings?: DeepPartial<FormatterSettings>): Promise<string>;
|
|
11
|
+
export { format, detectMdx } from './index.js';
|
|
12
|
+
export type { FormatterSettings, DeepPartial } from './types.js';
|
package/dist/browser.js
CHANGED
|
@@ -1,49 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Browser-safe entry point for mdx-formatter.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Vite, webpack, or any browser environment.
|
|
4
|
+
* Note: In browser environments, use the WASM module directly instead.
|
|
5
|
+
* This export is kept for API compatibility but requires the napi native
|
|
6
|
+
* module to be available (Node.js only).
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* path is never reached, bundlers can tree-shake the prettier import away.
|
|
8
|
+
* For true browser usage, see the WASM package at
|
|
9
|
+
* `crates/mdx-formatter-wasm/` or the doc site playground.
|
|
12
10
|
*/
|
|
13
|
-
|
|
14
|
-
import { detectMdx } from './detect-mdx.js';
|
|
15
|
-
import { formatterSettings } from './settings.js';
|
|
16
|
-
import { deepCloneSettings, deepMerge } from './utils.js';
|
|
17
|
-
export { detectMdx };
|
|
18
|
-
const MAX_ITERATIONS = 3;
|
|
19
|
-
// Browser-safe defaults: disable formatHtmlBlocksInMdx (requires prettier/Node.js)
|
|
20
|
-
const browserDefaults = {
|
|
21
|
-
...formatterSettings,
|
|
22
|
-
formatHtmlBlocksInMdx: {
|
|
23
|
-
...formatterSettings.formatHtmlBlocksInMdx,
|
|
24
|
-
enabled: false,
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Format markdown/MDX content in browser environments.
|
|
29
|
-
*
|
|
30
|
-
* Uses browser-safe defaults (formatHtmlBlocksInMdx disabled).
|
|
31
|
-
* Pass an optional `settings` object to override individual rules.
|
|
32
|
-
*/
|
|
33
|
-
export async function format(content, settings = {}) {
|
|
34
|
-
const merged = deepMerge(deepCloneSettings(browserDefaults), settings);
|
|
35
|
-
try {
|
|
36
|
-
let result = content;
|
|
37
|
-
for (let i = 0; i < MAX_ITERATIONS; i++) {
|
|
38
|
-
const formatter = new HybridFormatter(result, merged);
|
|
39
|
-
const formatted = await formatter.format();
|
|
40
|
-
if (formatted === result)
|
|
41
|
-
break;
|
|
42
|
-
result = formatted;
|
|
43
|
-
}
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return content;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
11
|
+
export { format, detectMdx } from './index.js';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Main entry point for
|
|
3
|
-
* Uses
|
|
2
|
+
* Main entry point for mdx-formatter.
|
|
3
|
+
* Uses the Rust napi formatter as the sole formatting engine.
|
|
4
4
|
*/
|
|
5
5
|
import { detectMdx } from './detect-mdx.js';
|
|
6
6
|
import type { FormatOptions } from './types.js';
|
|
7
7
|
export { detectMdx };
|
|
8
8
|
/**
|
|
9
|
-
* Format markdown/MDX content using
|
|
9
|
+
* Format markdown/MDX content using the Rust formatter.
|
|
10
10
|
*/
|
|
11
11
|
export declare function format(content: string, options?: FormatOptions): Promise<string>;
|
|
12
12
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1,37 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Main entry point for
|
|
3
|
-
* Uses
|
|
2
|
+
* Main entry point for mdx-formatter.
|
|
3
|
+
* Uses the Rust napi formatter as the sole formatting engine.
|
|
4
4
|
*/
|
|
5
5
|
import { promises as fs } from 'fs';
|
|
6
|
-
import { HybridFormatter } from './hybrid-formatter.js';
|
|
7
6
|
import { loadConfig } from './load-config.js';
|
|
8
7
|
import { detectMdx } from './detect-mdx.js';
|
|
8
|
+
import { nativeFormat } from './rust-formatter.js';
|
|
9
9
|
export { detectMdx };
|
|
10
10
|
/**
|
|
11
|
-
* Format markdown/MDX content using
|
|
11
|
+
* Format markdown/MDX content using the Rust formatter.
|
|
12
12
|
*/
|
|
13
13
|
export async function format(content, options = {}) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// Some rule interactions (e.g., list indent normalization + addEmptyLinesInBlockJsx)
|
|
18
|
-
// may require multiple passes to converge. 3 iterations is sufficient for all known
|
|
19
|
-
// cases (most files converge in 1, edge cases in 2).
|
|
20
|
-
const MAX_ITERATIONS = 3;
|
|
21
|
-
for (let i = 0; i < MAX_ITERATIONS; i++) {
|
|
22
|
-
const formatter = new HybridFormatter(result, settings);
|
|
23
|
-
const formatted = await formatter.format();
|
|
24
|
-
if (formatted === result)
|
|
25
|
-
break;
|
|
26
|
-
result = formatted;
|
|
27
|
-
}
|
|
28
|
-
return result;
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
// Silently return original content if formatting fails
|
|
32
|
-
// This is expected for files with certain JSX patterns that remark-mdx doesn't like
|
|
33
|
-
return content;
|
|
34
|
-
}
|
|
14
|
+
const settings = loadConfig(options);
|
|
15
|
+
const settingsJson = JSON.stringify(settings);
|
|
16
|
+
return nativeFormat(content, settingsJson);
|
|
35
17
|
}
|
|
36
18
|
/**
|
|
37
19
|
* Format a file and write it back if changed
|
|
@@ -53,7 +35,6 @@ export async function checkFile(filePath, options = {}) {
|
|
|
53
35
|
const formatted = await format(content, options);
|
|
54
36
|
return content !== formatted;
|
|
55
37
|
}
|
|
56
|
-
// Export all functions
|
|
57
38
|
export default {
|
|
58
39
|
format,
|
|
59
40
|
formatFile,
|
package/dist/load-config.js
CHANGED
|
@@ -25,7 +25,11 @@ function findConfigFile(configPath) {
|
|
|
25
25
|
if (configPath) {
|
|
26
26
|
try {
|
|
27
27
|
const content = readFileSync(resolve(configPath), 'utf-8');
|
|
28
|
-
|
|
28
|
+
const parsed = JSON.parse(content);
|
|
29
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return parsed;
|
|
29
33
|
}
|
|
30
34
|
catch {
|
|
31
35
|
return null;
|
|
@@ -34,7 +38,11 @@ function findConfigFile(configPath) {
|
|
|
34
38
|
// Try .mdx-formatter.json in cwd
|
|
35
39
|
try {
|
|
36
40
|
const content = readFileSync(resolve('.mdx-formatter.json'), 'utf-8');
|
|
37
|
-
|
|
41
|
+
const parsed = JSON.parse(content);
|
|
42
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return parsed;
|
|
38
46
|
}
|
|
39
47
|
catch {
|
|
40
48
|
// Not found, try package.json
|
package/dist/rust-formatter.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Rust napi formatter loader.
|
|
3
|
+
* Loads the native Rust formatter compiled via napi-rs.
|
|
4
|
+
* This is the sole formatting engine — no TypeScript fallback.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
type NativeFormat = (content: string, settingsJson: string) => string;
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* The native format function. Loaded once at module init.
|
|
9
|
+
* Throws if the native module is not available.
|
|
9
10
|
*/
|
|
10
|
-
export declare
|
|
11
|
+
export declare const nativeFormat: NativeFormat;
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
-
* API-compatible with the TypeScript format() function
|
|
13
|
+
* Check if the Rust formatter is available
|
|
14
14
|
*/
|
|
15
|
-
export declare function
|
|
15
|
+
export declare function isRustFormatterAvailable(): boolean;
|
|
16
|
+
export {};
|
package/dist/rust-formatter.js
CHANGED
|
@@ -1,35 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Rust napi formatter loader.
|
|
3
|
+
* Loads the native Rust formatter compiled via napi-rs.
|
|
4
|
+
* This is the sole formatting engine — no TypeScript fallback.
|
|
5
5
|
*/
|
|
6
6
|
import { createRequire } from 'module';
|
|
7
|
-
import {
|
|
7
|
+
import { platform, arch } from 'os';
|
|
8
8
|
const require = createRequire(import.meta.url);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
9
|
+
function getPackageName() {
|
|
10
|
+
const platformName = platform();
|
|
11
|
+
const archName = arch();
|
|
12
|
+
const platformMap = {
|
|
13
|
+
darwin: {
|
|
14
|
+
arm64: '@takazudo/mdx-formatter-darwin-arm64',
|
|
15
|
+
x64: '@takazudo/mdx-formatter-darwin-x64',
|
|
16
|
+
},
|
|
17
|
+
linux: {
|
|
18
|
+
x64: '@takazudo/mdx-formatter-linux-x64-gnu',
|
|
19
|
+
},
|
|
20
|
+
win32: {
|
|
21
|
+
x64: '@takazudo/mdx-formatter-win32-x64-msvc',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
return platformMap[platformName]?.[archName] ?? '';
|
|
14
25
|
}
|
|
15
|
-
|
|
16
|
-
//
|
|
26
|
+
function loadNativeModule() {
|
|
27
|
+
// Try platform-specific npm package first
|
|
28
|
+
const packageName = getPackageName();
|
|
29
|
+
if (packageName) {
|
|
30
|
+
try {
|
|
31
|
+
const native = require(packageName);
|
|
32
|
+
return native.format;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Platform package not installed, try local build
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Try local build
|
|
39
|
+
try {
|
|
40
|
+
const native = require('../crates/mdx-formatter-napi/mdx-formatter-napi.node');
|
|
41
|
+
return native.format;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw new Error('Rust native module not available. Build it with: pnpm build:rust');
|
|
45
|
+
}
|
|
17
46
|
}
|
|
18
47
|
/**
|
|
19
|
-
*
|
|
48
|
+
* The native format function. Loaded once at module init.
|
|
49
|
+
* Throws if the native module is not available.
|
|
20
50
|
*/
|
|
21
|
-
export
|
|
22
|
-
return nativeFormat !== null;
|
|
23
|
-
}
|
|
51
|
+
export const nativeFormat = loadNativeModule();
|
|
24
52
|
/**
|
|
25
|
-
*
|
|
26
|
-
* API-compatible with the TypeScript format() function
|
|
53
|
+
* Check if the Rust formatter is available
|
|
27
54
|
*/
|
|
28
|
-
export
|
|
29
|
-
|
|
30
|
-
throw new Error('Rust formatter not available. Build it first with: cd crates/mdx-formatter-napi && cargo build');
|
|
31
|
-
}
|
|
32
|
-
const settings = loadConfig(options);
|
|
33
|
-
const settingsJson = JSON.stringify(settings);
|
|
34
|
-
return nativeFormat(content, settingsJson);
|
|
55
|
+
export function isRustFormatterAvailable() {
|
|
56
|
+
return true; // If we got here, the module loaded successfully
|
|
35
57
|
}
|
package/dist/settings.d.ts
CHANGED
package/dist/settings.js
CHANGED
|
@@ -83,12 +83,3 @@ export const formatterSettings = {
|
|
|
83
83
|
minConfidence: 0.7, // Minimum confidence score to use detected indentation
|
|
84
84
|
},
|
|
85
85
|
};
|
|
86
|
-
// Export function to get only enabled rules
|
|
87
|
-
export function getEnabledRules() {
|
|
88
|
-
return Object.entries(formatterSettings)
|
|
89
|
-
.filter(([_, config]) => config.enabled)
|
|
90
|
-
.reduce((acc, [key, config]) => {
|
|
91
|
-
acc[key] = config;
|
|
92
|
-
return acc;
|
|
93
|
-
}, {});
|
|
94
|
-
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,68 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core type definitions for mdx-formatter
|
|
3
3
|
*/
|
|
4
|
-
import type { Node, Parent, Position } from 'unist';
|
|
5
|
-
import type { Root } from 'mdast';
|
|
6
|
-
export type { Node, Parent, Position, Root };
|
|
7
|
-
/**
|
|
8
|
-
* Common AST node interfaces used across plugins
|
|
9
|
-
*/
|
|
10
|
-
export interface ParentNode extends Node {
|
|
11
|
-
children: Node[];
|
|
12
|
-
}
|
|
13
|
-
export interface TextNode extends Node {
|
|
14
|
-
type: 'text';
|
|
15
|
-
value: string;
|
|
16
|
-
}
|
|
17
|
-
export interface HeadingNode extends Node {
|
|
18
|
-
type: 'heading';
|
|
19
|
-
children: Node[];
|
|
20
|
-
}
|
|
21
|
-
export interface HtmlNode extends Node {
|
|
22
|
-
value?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface ListNode extends Node {
|
|
25
|
-
type: 'list';
|
|
26
|
-
ordered?: boolean;
|
|
27
|
-
start?: number | null;
|
|
28
|
-
spread?: boolean;
|
|
29
|
-
children: ListItemNode[];
|
|
30
|
-
}
|
|
31
|
-
export interface ListItemNode extends Node {
|
|
32
|
-
type: 'listItem';
|
|
33
|
-
spread?: boolean;
|
|
34
|
-
data?: Record<string, unknown>;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* MDX JSX attribute value expression node
|
|
38
|
-
*/
|
|
39
|
-
export interface MdxJsxAttributeValueExpression {
|
|
40
|
-
type: 'mdxJsxAttributeValueExpression';
|
|
41
|
-
value?: string;
|
|
42
|
-
position?: Position;
|
|
43
|
-
data?: {
|
|
44
|
-
estree?: unknown;
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* MDX JSX attribute node
|
|
49
|
-
*/
|
|
50
|
-
export interface MdxJsxAttribute {
|
|
51
|
-
type: 'mdxJsxAttribute';
|
|
52
|
-
name: string;
|
|
53
|
-
value: string | MdxJsxAttributeValueExpression | null | undefined;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* MDX JSX element node (flow or text)
|
|
57
|
-
*/
|
|
58
|
-
export interface MdxJsxElement extends Node {
|
|
59
|
-
type: 'mdxJsxFlowElement' | 'mdxJsxTextElement';
|
|
60
|
-
name: string | null;
|
|
61
|
-
attributes: MdxJsxAttribute[];
|
|
62
|
-
children: Node[];
|
|
63
|
-
selfClosing?: boolean;
|
|
64
|
-
data?: Record<string, unknown>;
|
|
65
|
-
}
|
|
66
4
|
/**
|
|
67
5
|
* Individual formatter setting rule configurations
|
|
68
6
|
*/
|
|
@@ -157,72 +95,3 @@ export interface FormatOptions {
|
|
|
157
95
|
export type DeepPartial<T> = {
|
|
158
96
|
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
159
97
|
};
|
|
160
|
-
/**
|
|
161
|
-
* Formatter operation types used in HybridFormatter
|
|
162
|
-
*/
|
|
163
|
-
export type FormatterOperation = {
|
|
164
|
-
type: 'insertLine';
|
|
165
|
-
startLine: number;
|
|
166
|
-
content: string;
|
|
167
|
-
} | {
|
|
168
|
-
type: 'replaceLines';
|
|
169
|
-
startLine: number;
|
|
170
|
-
endLine: number;
|
|
171
|
-
lines: string[];
|
|
172
|
-
} | {
|
|
173
|
-
type: 'indentLine';
|
|
174
|
-
startLine: number;
|
|
175
|
-
indent: string;
|
|
176
|
-
} | {
|
|
177
|
-
type: 'fixListIndent';
|
|
178
|
-
startLine: number;
|
|
179
|
-
indent: string;
|
|
180
|
-
} | {
|
|
181
|
-
type: 'replaceHtmlBlock';
|
|
182
|
-
startLine: number;
|
|
183
|
-
endLine: number;
|
|
184
|
-
content: string;
|
|
185
|
-
};
|
|
186
|
-
/**
|
|
187
|
-
* Position map entry for line/character mapping
|
|
188
|
-
*/
|
|
189
|
-
export interface PositionMapEntry {
|
|
190
|
-
line: number;
|
|
191
|
-
start: number;
|
|
192
|
-
end: number;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Indent detector interface (for duck-typed fallback)
|
|
196
|
-
*/
|
|
197
|
-
export interface IndentDetectorLike {
|
|
198
|
-
getIndentSize(): number;
|
|
199
|
-
getIndentType(): string;
|
|
200
|
-
getIndentString(): string;
|
|
201
|
-
getConfidence(): number;
|
|
202
|
-
formatWithIndent(text: string, level: number): string;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Indent detection statistics
|
|
206
|
-
*/
|
|
207
|
-
export interface IndentStats {
|
|
208
|
-
totalLines: number;
|
|
209
|
-
indentedLines: number;
|
|
210
|
-
patterns: Record<string, number>;
|
|
211
|
-
tabLines: number;
|
|
212
|
-
spaceLines: number;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Indent pattern entry
|
|
216
|
-
*/
|
|
217
|
-
export interface IndentPattern {
|
|
218
|
-
type: 'tab' | 'space';
|
|
219
|
-
size: number;
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* JSX stack entry used in SpecificFormatter
|
|
223
|
-
*/
|
|
224
|
-
export interface JsxStackEntry {
|
|
225
|
-
name: string;
|
|
226
|
-
isContainer: boolean;
|
|
227
|
-
hasContent: boolean;
|
|
228
|
-
}
|
package/dist/utils.js
CHANGED
|
@@ -29,6 +29,9 @@ export function deepCloneSettings(obj) {
|
|
|
29
29
|
export function deepMerge(target, source) {
|
|
30
30
|
const result = deepCloneSettings(target);
|
|
31
31
|
for (const key of Object.keys(source)) {
|
|
32
|
+
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
32
35
|
const sourceVal = source[key];
|
|
33
36
|
const targetVal = result[key];
|
|
34
37
|
if (sourceVal &&
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@takazudo/mdx-formatter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "AST-based markdown and MDX formatter with Japanese text support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -38,8 +38,13 @@
|
|
|
38
38
|
"check": "prettier --check . && eslint .",
|
|
39
39
|
"check:fix": "prettier --write . && eslint --fix .",
|
|
40
40
|
"test:rust": "vitest run --config vitest.rust.config.ts",
|
|
41
|
-
"
|
|
42
|
-
"build:rust
|
|
41
|
+
"test:rust-passthrough": "vitest run --config vitest.rust-passthrough.config.ts",
|
|
42
|
+
"build:rust": ". \"$HOME/.cargo/env\" && cargo build -p mdx-formatter-napi && cp target/debug/libmdx_formatter_napi.so crates/mdx-formatter-napi/mdx-formatter-napi.node",
|
|
43
|
+
"build:rust:release": ". \"$HOME/.cargo/env\" && cargo build -p mdx-formatter-napi --release && cp target/release/libmdx_formatter_napi.so crates/mdx-formatter-napi/mdx-formatter-napi.node",
|
|
44
|
+
"benchmark": "npx tsx benchmark/run.ts",
|
|
45
|
+
"build:wasm": ". \"$HOME/.cargo/env\" && wasm-pack build crates/mdx-formatter-wasm --target web --out-dir ../../wasm/pkg",
|
|
46
|
+
"build:wasm:bundler": ". \"$HOME/.cargo/env\" && wasm-pack build crates/mdx-formatter-wasm --target bundler --out-dir ../../wasm/pkg-bundler",
|
|
47
|
+
"build:wasm:doc": ". \"$HOME/.cargo/env\" && wasm-pack build crates/mdx-formatter-wasm --target web --out-dir ../../doc/src/wasm-pkg && mkdir -p doc/public/wasm && cp doc/src/wasm-pkg/mdx_formatter_wasm_bg.wasm doc/public/wasm/",
|
|
43
48
|
"b4push": "./scripts/run-b4push.sh",
|
|
44
49
|
"doc:start": "pnpm --dir doc start",
|
|
45
50
|
"prepublishOnly": "tsc && vitest run"
|
|
@@ -70,33 +75,29 @@
|
|
|
70
75
|
"chalk": "^5.3.0",
|
|
71
76
|
"commander": "^14.0.3",
|
|
72
77
|
"glob": "^13.0.1",
|
|
73
|
-
"js-yaml": "^4.1.1"
|
|
74
|
-
"prettier": "^3.8.0",
|
|
75
|
-
"remark": "^15.0.1",
|
|
76
|
-
"remark-directive": "^3.0.0",
|
|
77
|
-
"remark-frontmatter": "^5.0.0",
|
|
78
|
-
"remark-gfm": "^4.0.0",
|
|
79
|
-
"remark-mdx": "^3.0.0",
|
|
80
|
-
"remark-parse": "^11.0.0",
|
|
81
|
-
"remark-stringify": "^11.0.0",
|
|
82
|
-
"unified": "^11.0.4",
|
|
83
|
-
"unist-util-visit": "^5.0.0"
|
|
78
|
+
"js-yaml": "^4.1.1"
|
|
84
79
|
},
|
|
85
80
|
"devDependencies": {
|
|
86
|
-
"@types/hast": "^3.0.4",
|
|
87
81
|
"@types/js-yaml": "^4.0.9",
|
|
88
|
-
"@types/mdast": "^4.0.4",
|
|
89
82
|
"@types/node": "^25.2.1",
|
|
90
|
-
"@types/unist": "^3.0.3",
|
|
91
83
|
"@vitest/coverage-v8": "^4.0.17",
|
|
92
84
|
"eslint": "^9.39.2",
|
|
93
85
|
"lefthook": "^2.1.4",
|
|
86
|
+
"prettier": "^3.8.1",
|
|
94
87
|
"typescript": "^5.9.3",
|
|
95
88
|
"typescript-eslint": "^8.54.0",
|
|
96
|
-
"vfile": "^6.0.3",
|
|
97
89
|
"vitest": "^4.0.17"
|
|
98
90
|
},
|
|
99
91
|
"engines": {
|
|
100
92
|
"node": ">=18.0.0"
|
|
93
|
+
},
|
|
94
|
+
"napi": {
|
|
95
|
+
"binaryName": "mdx-formatter-napi",
|
|
96
|
+
"targets": [
|
|
97
|
+
"aarch64-apple-darwin",
|
|
98
|
+
"x86_64-apple-darwin",
|
|
99
|
+
"x86_64-unknown-linux-gnu",
|
|
100
|
+
"x86_64-pc-windows-msvc"
|
|
101
|
+
]
|
|
101
102
|
}
|
|
102
103
|
}
|