@markuplint/spec-generator 4.8.2 → 5.0.0-alpha.1
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/ARCHITECTURE.ja.md +11 -11
- package/ARCHITECTURE.md +16 -14
- package/CHANGELOG.md +16 -0
- package/README.md +7 -7
- package/docs/maintenance.ja.md +3 -3
- package/docs/maintenance.md +3 -3
- package/docs/modules.ja.md +7 -3
- package/docs/modules.md +7 -3
- package/docs/scraping.ja.md +31 -17
- package/docs/scraping.md +31 -17
- package/lib/aria.d.ts +3 -0
- package/lib/aria.js +75 -7
- package/lib/fetch.js +15 -9
- package/lib/html-elements.js +3 -3
- package/lib/read-json.js +4 -5
- package/lib/utils.js +1 -2
- package/package.json +12 -9
package/ARCHITECTURE.ja.md
CHANGED
|
@@ -46,9 +46,9 @@ flowchart TD
|
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
subgraph local ["ローカルデータ"]
|
|
49
|
-
specFiles["spec.*.
|
|
50
|
-
commonAttrs["spec-common.attributes.
|
|
51
|
-
commonContents["spec-common.contents.
|
|
49
|
+
specFiles["spec.*.jsonc ファイル\n(read-json.ts)"]
|
|
50
|
+
commonAttrs["spec-common.attributes.jsonc\n(read-json.ts)"]
|
|
51
|
+
commonContents["spec-common.contents.jsonc\n(read-json.ts)"]
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
subgraph output ["出力"]
|
|
@@ -121,14 +121,14 @@ export async function main(options: Options): Promise<void>;
|
|
|
121
121
|
|
|
122
122
|
## 外部依存
|
|
123
123
|
|
|
124
|
-
| パッケージ
|
|
125
|
-
|
|
|
126
|
-
| `cheerio`
|
|
127
|
-
| `cli-progress`
|
|
128
|
-
| `ajv`
|
|
129
|
-
| `fast-xml-parser`
|
|
130
|
-
| `glob`
|
|
131
|
-
| `
|
|
124
|
+
| パッケージ | 用途 |
|
|
125
|
+
| ----------------- | --------------------------------------------------------- |
|
|
126
|
+
| `cheerio` | スクレイピングしたウェブページの HTML 解析と DOM クエリ |
|
|
127
|
+
| `cli-progress` | フェッチ操作のターミナルプログレスバー |
|
|
128
|
+
| `ajv` | JSON スキーマバリデーション(利用可能だが実行時は未使用) |
|
|
129
|
+
| `fast-xml-parser` | XML パース(利用可能だが現在のモジュールでは未使用) |
|
|
130
|
+
| `glob` | `readJsons()` 用のファイル glob パターンマッチング |
|
|
131
|
+
| `jsonc-parser` | JSONC ファイル(コメント付き JSON)のパース |
|
|
132
132
|
|
|
133
133
|
**開発依存:**
|
|
134
134
|
|
package/ARCHITECTURE.md
CHANGED
|
@@ -42,13 +42,14 @@ flowchart TD
|
|
|
42
42
|
mdnSVG["MDN SVG Element Index\n(svg.ts)"]
|
|
43
43
|
ariaSpecs["W3C ARIA 1.1 / 1.2 / 1.3\n(aria.ts)"]
|
|
44
44
|
graphicsAria["Graphics ARIA\n(aria.ts)"]
|
|
45
|
+
dpubAria["DPub ARIA\n(aria.ts)"]
|
|
45
46
|
htmlAria["HTML-ARIA Mapping\n(aria.ts)"]
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
subgraph local ["Local Data"]
|
|
49
|
-
specFiles["spec.*.
|
|
50
|
-
commonAttrs["spec-common.attributes.
|
|
51
|
-
commonContents["spec-common.contents.
|
|
50
|
+
specFiles["spec.*.jsonc files\n(read-json.ts)"]
|
|
51
|
+
commonAttrs["spec-common.attributes.jsonc\n(read-json.ts)"]
|
|
52
|
+
commonContents["spec-common.contents.jsonc\n(read-json.ts)"]
|
|
52
53
|
end
|
|
53
54
|
|
|
54
55
|
subgraph output ["Output"]
|
|
@@ -65,6 +66,7 @@ flowchart TD
|
|
|
65
66
|
getGlobalAttrs --> commonAttrs
|
|
66
67
|
getAria --> ariaSpecs
|
|
67
68
|
getAria --> graphicsAria
|
|
69
|
+
getAria --> dpubAria
|
|
68
70
|
getAria --> htmlAria
|
|
69
71
|
|
|
70
72
|
getElements --> extendedSpec
|
|
@@ -108,12 +110,12 @@ export async function main(options: Options): Promise<void>;
|
|
|
108
110
|
1. **Parallel data gathering** -- `main()` launches three tasks concurrently via `Promise.all`:
|
|
109
111
|
- `getElements(htmlFilePattern)` -- reads local spec files, scrapes MDN for each element, appends obsolete elements
|
|
110
112
|
- `getGlobalAttrs(commonAttrsFilePath)` -- reads global attribute definitions
|
|
111
|
-
- `getAria()` -- scrapes W3C ARIA specs (1.1, 1.2, 1.3) plus Graphics ARIA and HTML-ARIA
|
|
113
|
+
- `getAria()` -- scrapes W3C ARIA specs (1.1, 1.2, 1.3) plus Graphics ARIA, DPub ARIA, and HTML-ARIA
|
|
112
114
|
|
|
113
115
|
2. **Assembly** -- The results are combined into an `ExtendedSpec` object:
|
|
114
116
|
- `cites` -- sorted list of all fetched URLs (from `getReferences()`)
|
|
115
117
|
- `def["#globalAttrs"]` -- global attribute categories
|
|
116
|
-
- `def["#aria"]` -- ARIA roles, properties, and
|
|
118
|
+
- `def["#aria"]` -- ARIA roles, properties, graphics roles, and DPub roles per version
|
|
117
119
|
- `def["#contentModels"]` -- content model categories (from `readJson()`)
|
|
118
120
|
- `specs` -- element specification array
|
|
119
121
|
|
|
@@ -121,14 +123,14 @@ export async function main(options: Options): Promise<void>;
|
|
|
121
123
|
|
|
122
124
|
## External Dependencies
|
|
123
125
|
|
|
124
|
-
| Package
|
|
125
|
-
|
|
|
126
|
-
| `cheerio`
|
|
127
|
-
| `cli-progress`
|
|
128
|
-
| `ajv`
|
|
129
|
-
| `fast-xml-parser`
|
|
130
|
-
| `glob`
|
|
131
|
-
| `
|
|
126
|
+
| Package | Purpose |
|
|
127
|
+
| ----------------- | -------------------------------------------------------- |
|
|
128
|
+
| `cheerio` | HTML parsing and DOM querying of scraped web pages |
|
|
129
|
+
| `cli-progress` | Terminal progress bar for fetch operations |
|
|
130
|
+
| `ajv` | JSON Schema validation (available but unused in runtime) |
|
|
131
|
+
| `fast-xml-parser` | XML parsing (available but unused in current modules) |
|
|
132
|
+
| `glob` | File glob pattern matching for `readJsons()` |
|
|
133
|
+
| `jsonc-parser` | Parse JSONC files (JSON with comments) for spec data |
|
|
132
134
|
|
|
133
135
|
**Dev dependencies:**
|
|
134
136
|
|
|
@@ -155,7 +157,7 @@ flowchart LR
|
|
|
155
157
|
|
|
156
158
|
subgraph external ["External Sources"]
|
|
157
159
|
mdn["MDN Web Docs"]
|
|
158
|
-
w3c["W3C ARIA / HTML-ARIA"]
|
|
160
|
+
w3c["W3C ARIA / DPub ARIA / HTML-ARIA"]
|
|
159
161
|
end
|
|
160
162
|
|
|
161
163
|
mlSpec -->|"types"| pkg
|
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [5.0.0-alpha.1](https://github.com/markuplint/markuplint/compare/v5.0.0-alpha.0...v5.0.0-alpha.1) (2026-02-22)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @markuplint/spec-generator
|
|
9
|
+
|
|
10
|
+
# [5.0.0-alpha.0](https://github.com/markuplint/markuplint/compare/v4.14.1...v5.0.0-alpha.0) (2026-02-20)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- resolve additional eslint-plugin-unicorn v63 errors ([e58a72c](https://github.com/markuplint/markuplint/commit/e58a72c17c97bbec522f9513b99777fac6904d64))
|
|
15
|
+
- **spec-generator:** add windowsPathsNoEscape option to glob call ([77189eb](https://github.com/markuplint/markuplint/commit/77189ebaa7511c32e50246a4b70dbe495117b784))
|
|
16
|
+
- **spec-generator:** disable progress bar in CI and run up:gen twice daily ([526044d](https://github.com/markuplint/markuplint/commit/526044d26ed207e0c2a04c266c9491a14c56b3e1))
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
- **spec-generator:** scrape DPub ARIA roles from W3C spec ([681abed](https://github.com/markuplint/markuplint/commit/681abed45c1e61facba040fc3535e3e46ea410be))
|
|
21
|
+
|
|
6
22
|
## [4.8.2](https://github.com/markuplint/markuplint/compare/@markuplint/spec-generator@4.8.1...@markuplint/spec-generator@4.8.2) (2026-02-10)
|
|
7
23
|
|
|
8
24
|
### Bug Fixes
|
package/README.md
CHANGED
|
@@ -12,9 +12,9 @@ Called from `packages/@markuplint/html-spec/build.mjs`:
|
|
|
12
12
|
```ts
|
|
13
13
|
await main({
|
|
14
14
|
outputFilePath: 'index.json',
|
|
15
|
-
htmlFilePattern: 'src/spec.*.
|
|
16
|
-
commonAttrsFilePath: 'src/spec-common.attributes.
|
|
17
|
-
commonContentsFilePath: 'src/spec-common.contents.
|
|
15
|
+
htmlFilePattern: 'src/spec.*.jsonc',
|
|
16
|
+
commonAttrsFilePath: 'src/spec-common.attributes.jsonc',
|
|
17
|
+
commonContentsFilePath: 'src/spec-common.contents.jsonc',
|
|
18
18
|
});
|
|
19
19
|
```
|
|
20
20
|
|
|
@@ -25,20 +25,20 @@ You normally don't run this directly; use:
|
|
|
25
25
|
|
|
26
26
|
## What it does
|
|
27
27
|
|
|
28
|
-
1. **Read element sources** -- Load every `src/spec.*.
|
|
28
|
+
1. **Read element sources** -- Load every `src/spec.*.jsonc` and infer the element name from the filename
|
|
29
29
|
2. **Enrich from MDN** -- Fetch MDN element pages for descriptions, categories, and attribute metadata (manual specs take precedence)
|
|
30
30
|
3. **Add obsolete elements** -- Inject HTML obsolete elements and deprecated SVG elements
|
|
31
31
|
4. **Load shared data** -- Read global attributes and content model definitions
|
|
32
|
-
5. **Build ARIA definitions** -- Scrape WAI-ARIA (1.1/1.2/1.3), Graphics-ARIA, and HTML-ARIA
|
|
32
|
+
5. **Build ARIA definitions** -- Scrape WAI-ARIA (1.1/1.2/1.3), Graphics-ARIA, DPub-ARIA, and HTML-ARIA
|
|
33
33
|
6. **Emit Extended Spec JSON** -- Write `{ cites, def, specs }` to `index.json`
|
|
34
34
|
|
|
35
35
|
For detailed architecture and data flow, see [ARCHITECTURE.md](ARCHITECTURE.md).
|
|
36
36
|
|
|
37
37
|
## Precedence rules
|
|
38
38
|
|
|
39
|
-
- Manual data in `src/spec.*.
|
|
39
|
+
- Manual data in `src/spec.*.jsonc` overrides MDN-scraped values on conflict.
|
|
40
40
|
- Attribute objects are merged per name; manual keys win, MDN may fill missing flags.
|
|
41
|
-
- Shared files under `src/spec-common.*.
|
|
41
|
+
- Shared files under `src/spec-common.*.jsonc` are imported as-is.
|
|
42
42
|
|
|
43
43
|
## Network and caching
|
|
44
44
|
|
package/docs/maintenance.ja.md
CHANGED
|
@@ -109,6 +109,7 @@ MDN が要素リファレンスページを再構築した場合、`scraping.ts`
|
|
|
109
109
|
roles: roles14,
|
|
110
110
|
props: await getProps('1.4', roles14),
|
|
111
111
|
graphicsRoles: await getRoles('1.4', true),
|
|
112
|
+
dpubRoles,
|
|
112
113
|
},
|
|
113
114
|
```
|
|
114
115
|
4. **パッケージ間連携:** `@markuplint/ml-spec` の `ARIAVersion` 型も `'1.4'` を含むよう更新が必要
|
|
@@ -198,10 +199,9 @@ MDN が要素リファレンスページを再構築した場合、`scraping.ts`
|
|
|
198
199
|
- 依存として記載されているが、現在どのソースモジュールからもインポートされていない
|
|
199
200
|
- 将来の XML パースニーズのために予約されている可能性あり
|
|
200
201
|
|
|
201
|
-
###
|
|
202
|
+
### jsonc-parser
|
|
202
203
|
|
|
203
|
-
-
|
|
204
|
-
- `read-json.ts` で JSON 仕様ファイルの `//` および `/* */` コメントをサポートするために使用
|
|
204
|
+
- `read-json.ts` で JSONC ファイル(`//` および `/* */` コメント付き JSON)のパースに使用
|
|
205
205
|
- `html-spec` パッケージは仕様ファイルの先頭に仕様 URL の参照としてコメントを使用
|
|
206
206
|
|
|
207
207
|
### cli-progress
|
package/docs/maintenance.md
CHANGED
|
@@ -109,6 +109,7 @@ When a new ARIA specification version is published (e.g., 1.4):
|
|
|
109
109
|
roles: roles14,
|
|
110
110
|
props: await getProps('1.4', roles14),
|
|
111
111
|
graphicsRoles: await getRoles('1.4', true),
|
|
112
|
+
dpubRoles,
|
|
112
113
|
},
|
|
113
114
|
```
|
|
114
115
|
4. **Cross-package:** The `ARIAVersion` type in `@markuplint/ml-spec` must also be updated to include `'1.4'`
|
|
@@ -198,10 +199,9 @@ To check which roles were extracted from a specific ARIA version:
|
|
|
198
199
|
- Listed as a dependency but not currently imported by any source module
|
|
199
200
|
- May be reserved for future XML parsing needs
|
|
200
201
|
|
|
201
|
-
###
|
|
202
|
+
### jsonc-parser
|
|
202
203
|
|
|
203
|
-
-
|
|
204
|
-
- Used in `read-json.ts` to support `//` and `/* */` comments in JSON spec files
|
|
204
|
+
- Used in `read-json.ts` to parse JSONC files (JSON with `//` and `/* */` comments)
|
|
205
205
|
- The `html-spec` package uses comments at the top of spec files for spec URL references
|
|
206
206
|
|
|
207
207
|
### cli-progress
|
package/docs/modules.ja.md
CHANGED
|
@@ -51,7 +51,7 @@ HTML および SVG 要素仕様の完全なリストを構築します。
|
|
|
51
51
|
|
|
52
52
|
**フロー:**
|
|
53
53
|
|
|
54
|
-
1. `readJsons()` で glob パターンにマッチする全仕様ファイルを読み込み。要素名は正規表現 `spec.([\w-]+).
|
|
54
|
+
1. `readJsons()` で glob パターンにマッチする全仕様ファイルを読み込み。要素名は正規表現 `spec.([\w-]+).jsonc` でファイル名から抽出(例: `spec.a.jsonc` → `a`)
|
|
55
55
|
2. `getSVGElementList()` で非推奨 SVG 要素リストを取得
|
|
56
56
|
3. `fetchObsoleteElements()` で既存の仕様にない非推奨要素のスタブを生成
|
|
57
57
|
4. 各要素について MDN URL を構築し、`fetchHTMLElement()` でメタデータをスクレイピング:
|
|
@@ -111,13 +111,14 @@ MDN 要素リファレンスページからメタデータをスクレイピン
|
|
|
111
111
|
|
|
112
112
|
W3C ARIA 仕様からロールとプロパティの定義をスクレイピングします。URL パターンとセレクタの詳細は[スクレイピング詳細](scraping.ja.md)を参照。
|
|
113
113
|
|
|
114
|
-
### `getAria(): Promise<Record<ARIAVersion, { roles, props, graphicsRoles }>>`
|
|
114
|
+
### `getAria(): Promise<Record<ARIAVersion, { roles, props, graphicsRoles, dpubRoles }>>`
|
|
115
115
|
|
|
116
116
|
サポートされている3つのバージョンすべての ARIA データを返します。各バージョンについて:
|
|
117
117
|
|
|
118
118
|
1. `getRoles(version)` でロールを取得
|
|
119
119
|
2. `getProps(version, roles)` でプロパティ/ステートを取得
|
|
120
120
|
3. `getRoles(version, true)` でグラフィックス ARIA ロールを取得
|
|
121
|
+
4. `getDpubRoles()` で DPub ARIA ロールを取得(1回だけフェッチし、全バージョンで共有)
|
|
121
122
|
|
|
122
123
|
**実行順序:** バージョンは順次処理されます(1.3 → 1.2 → 1.1)。各バージョン内では、プロパティの前にロールを取得する必要があります(プロパティはロールの `ownedProperties` から検出されるため)。
|
|
123
124
|
|
|
@@ -129,9 +130,12 @@ W3C ARIA 仕様からロールとプロパティの定義をスクレイピン
|
|
|
129
130
|
| 1.2 | `https://www.w3.org/TR/wai-aria-1.2/` | `https://w3c.github.io/graphics-aria/` |
|
|
130
131
|
| 1.3 | `https://w3c.github.io/aria/` | `https://w3c.github.io/graphics-aria/` |
|
|
131
132
|
|
|
133
|
+
**DPub ARIA URL:** `https://w3c.github.io/dpub-aria/`(全バージョン共通)
|
|
134
|
+
|
|
132
135
|
### プライベート関数
|
|
133
136
|
|
|
134
137
|
- `getRoles(version, graphicsAria?)` -- `#role_definitions section.role` 要素をスクレイピング。抽出内容: name, description, generalization, owned properties(required/inherited/general), required context roles, required owned elements, accessible name 設定, children presentational フラグ, prohibited properties。ロールの同義語を処理(`none`/`presentation`, `image`/`img`)
|
|
138
|
+
- `getDpubRoles()` -- DPub ARIA 仕様からデジタル出版ロール(例: `doc-abstract`, `doc-chapter`)をスクレイピング。`getRoles()` と同じ CSS セレクタを使用。41個の DPub ロールは1回だけフェッチされ、全 ARIA バージョンで共有される
|
|
135
139
|
- `getProps(version, roles)` -- 全ロールの `ownedProperties` からプロパティリストを構築し、各プロパティのセクションをスクレイピング: type(property/state), value type, enum values, default value, global フラグ, 同等の HTML 属性。`aria-checked` と `aria-hidden` の条件付き値オーバーライドを適用
|
|
136
140
|
- `getAriaInHtml()` -- `https://www.w3.org/TR/html-aria/` から HTML 属性と ARIA プロパティのマッピングテーブルをスクレイピング。`contenteditable` はスキップ(祖先の評価が必要なため)
|
|
137
141
|
- `$$(el, selectors)` -- 複数の CSS セレクタを試し、最初の非空マッチを返す
|
|
@@ -181,7 +185,7 @@ W3C ARIA 仕様からロールとプロパティの定義をスクレイピン
|
|
|
181
185
|
|
|
182
186
|
### `readJson<T>(filePath: string): T`
|
|
183
187
|
|
|
184
|
-
単一の
|
|
188
|
+
単一の JSONC ファイルを読み込みます。`jsonc-parser` を使用して `//` および `/* */` コメント付き JSON をパースします。パスが絶対パスでない場合はエラーをスローします。
|
|
185
189
|
|
|
186
190
|
### `readJsons<T>(pattern: string, hook?): Promise<T[]>`
|
|
187
191
|
|
package/docs/modules.md
CHANGED
|
@@ -51,7 +51,7 @@ Builds the complete list of HTML and SVG element specifications.
|
|
|
51
51
|
|
|
52
52
|
**Flow:**
|
|
53
53
|
|
|
54
|
-
1. Read all spec files matching the glob pattern via `readJsons()`. Element names are extracted from filenames using the regex `spec.([\w-]+).
|
|
54
|
+
1. Read all spec files matching the glob pattern via `readJsons()`. Element names are extracted from filenames using the regex `spec.([\w-]+).jsonc` (e.g., `spec.a.jsonc` becomes `a`)
|
|
55
55
|
2. Fetch the deprecated SVG element list via `getSVGElementList()`
|
|
56
56
|
3. Generate stubs for obsolete elements not already present via `fetchObsoleteElements()`
|
|
57
57
|
4. For each element, construct the MDN URL and scrape metadata via `fetchHTMLElement()`:
|
|
@@ -111,13 +111,14 @@ Generates minimal spec stubs for obsolete elements not already present in the ex
|
|
|
111
111
|
|
|
112
112
|
Scrapes W3C ARIA specifications for role and property definitions. See [Scraping Details](scraping.md) for URL patterns and selectors.
|
|
113
113
|
|
|
114
|
-
### `getAria(): Promise<Record<ARIAVersion, { roles, props, graphicsRoles }>>`
|
|
114
|
+
### `getAria(): Promise<Record<ARIAVersion, { roles, props, graphicsRoles, dpubRoles }>>`
|
|
115
115
|
|
|
116
116
|
Returns ARIA data for all three supported versions. For each version:
|
|
117
117
|
|
|
118
118
|
1. Fetch roles via `getRoles(version)`
|
|
119
119
|
2. Fetch properties/states via `getProps(version, roles)`
|
|
120
120
|
3. Fetch graphics ARIA roles via `getRoles(version, true)`
|
|
121
|
+
4. Fetch DPub ARIA roles via `getDpubRoles()` (fetched once, shared across all versions)
|
|
121
122
|
|
|
122
123
|
**Execution order:** Versions are processed sequentially (1.3, then 1.2, then 1.1). Within each version, roles must be fetched before properties (properties are discovered from the roles' `ownedProperties`).
|
|
123
124
|
|
|
@@ -129,9 +130,12 @@ Returns ARIA data for all three supported versions. For each version:
|
|
|
129
130
|
| 1.2 | `https://www.w3.org/TR/wai-aria-1.2/` | `https://w3c.github.io/graphics-aria/` |
|
|
130
131
|
| 1.3 | `https://w3c.github.io/aria/` | `https://w3c.github.io/graphics-aria/` |
|
|
131
132
|
|
|
133
|
+
**DPub ARIA URL:** `https://w3c.github.io/dpub-aria/` (same for all versions)
|
|
134
|
+
|
|
132
135
|
### Private functions
|
|
133
136
|
|
|
134
137
|
- `getRoles(version, graphicsAria?)` -- Scrapes `#role_definitions section.role` elements. Extracts: name, description, generalization, owned properties (required/inherited/general), required context roles, required owned elements, accessible name settings, children presentational flag, prohibited properties. Handles role synonyms (`none`/`presentation`, `image`/`img`)
|
|
138
|
+
- `getDpubRoles()` -- Scrapes the DPub ARIA specification for Digital Publishing roles (e.g., `doc-abstract`, `doc-chapter`). Uses the same CSS selectors as `getRoles()`. The 41 DPub roles are fetched once and shared across all ARIA versions
|
|
135
139
|
- `getProps(version, roles)` -- Builds a property list from all role `ownedProperties`, then scrapes each property's section for: type (property/state), value type, enum values, default value, global flag, equivalent HTML attributes. Applies conditional value overrides for `aria-checked` and `aria-hidden`
|
|
136
140
|
- `getAriaInHtml()` -- Scrapes `https://www.w3.org/TR/html-aria/` for the HTML attribute to ARIA property mapping table. Skips `contenteditable` (requires ancestor evaluation)
|
|
137
141
|
- `$$(el, selectors)` -- Tries multiple CSS selectors and returns the first non-empty match
|
|
@@ -181,7 +185,7 @@ JSON file reading with comment support.
|
|
|
181
185
|
|
|
182
186
|
### `readJson<T>(filePath: string): T`
|
|
183
187
|
|
|
184
|
-
Reads a single
|
|
188
|
+
Reads a single JSONC file. Uses `jsonc-parser` to parse JSON with `//` and `/* */` comments. Throws if the path is not absolute.
|
|
185
189
|
|
|
186
190
|
### `readJsons<T>(pattern: string, hook?): Promise<T[]>`
|
|
187
191
|
|
package/docs/scraping.ja.md
CHANGED
|
@@ -140,23 +140,23 @@ https://developer.mozilla.org/en-US/docs/Web/SVG/Element
|
|
|
140
140
|
|
|
141
141
|
各ロールセクションについて:
|
|
142
142
|
|
|
143
|
-
| データ
|
|
144
|
-
|
|
|
145
|
-
| 名前
|
|
146
|
-
| 説明
|
|
147
|
-
| 抽象かどうか
|
|
148
|
-
| 汎化
|
|
149
|
-
| 必須プロパティ
|
|
150
|
-
| 継承プロパティ
|
|
151
|
-
| 所有プロパティ
|
|
152
|
-
|
|
|
153
|
-
|
|
|
154
|
-
| アクセシブル名必須
|
|
155
|
-
| アクセシブル名(著者から)
|
|
156
|
-
| アクセシブル名(コンテンツから)
|
|
157
|
-
| アクセシブル名禁止
|
|
158
|
-
| 子の表示
|
|
159
|
-
| 禁止プロパティ
|
|
143
|
+
| データ | セレクタ |
|
|
144
|
+
| ---------------------------------- | ---------------------------------------------------- |
|
|
145
|
+
| 名前 | `.role-name[title]` |
|
|
146
|
+
| 説明 | `.role-description p`(`\n\n` で結合) |
|
|
147
|
+
| 抽象かどうか | `.role-abstract` テキストが "true" |
|
|
148
|
+
| 汎化 | `.role-parent a` |
|
|
149
|
+
| 必須プロパティ | `.role-required-properties li`(親にフォールバック) |
|
|
150
|
+
| 継承プロパティ | `.role-inherited li` |
|
|
151
|
+
| 所有プロパティ | `.role-properties li` または `.role-properties > a` |
|
|
152
|
+
| Required Accessibility Parent Role | `.role-scope li` または `.role-scope a` |
|
|
153
|
+
| Allowed Accessibility Child Roles | `.role-mustcontain li` または `.role-mustcontain a` |
|
|
154
|
+
| アクセシブル名必須 | `.role-namerequired` に "true" を含む |
|
|
155
|
+
| アクセシブル名(著者から) | `.role-namefrom` に "author" を含む |
|
|
156
|
+
| アクセシブル名(コンテンツから) | `.role-namefrom` に "content" を含む |
|
|
157
|
+
| アクセシブル名禁止 | `.role-namefrom` に "prohibited" を含む |
|
|
158
|
+
| 子の表示 | `.role-childpresentational` "true"/"false" |
|
|
159
|
+
| 禁止プロパティ | `.role-disallowed li code` |
|
|
160
160
|
|
|
161
161
|
**ロール同義語の処理:**
|
|
162
162
|
|
|
@@ -206,6 +206,20 @@ Graphics ARIA ロールは、同じ `getRoles()` 関数に `graphicsAria = true`
|
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
+
## DPub ARIA スクレイピング
|
|
210
|
+
|
|
211
|
+
**モジュール:** `aria.ts`
|
|
212
|
+
|
|
213
|
+
DPub ARIA ロール(Digital Publishing WAI-ARIA Module)は `getDpubRoles()` 関数でフェッチされます。
|
|
214
|
+
|
|
215
|
+
| URL |
|
|
216
|
+
| ---------------------------------- |
|
|
217
|
+
| `https://w3c.github.io/dpub-aria/` |
|
|
218
|
+
|
|
219
|
+
DPub ARIA 仕様は標準 WAI-ARIA 仕様と同じ HTML 構造および CSS セレクタ(`#role_definitions section.role`、`.role-name[title]`、`.role-parent a` など)を使用しています。`getDpubRoles()` 関数は1回だけ呼び出され、41個のロールはすべての ARIA バージョンで共有されます。
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
209
223
|
## HTML-ARIA マッピング
|
|
210
224
|
|
|
211
225
|
**モジュール:** `aria.ts`(`getAriaInHtml()`)
|
package/docs/scraping.md
CHANGED
|
@@ -140,23 +140,23 @@ https://developer.mozilla.org/en-US/docs/Web/SVG/Element
|
|
|
140
140
|
|
|
141
141
|
For each role section:
|
|
142
142
|
|
|
143
|
-
| Data
|
|
144
|
-
|
|
|
145
|
-
| Name
|
|
146
|
-
| Description
|
|
147
|
-
| Is Abstract
|
|
148
|
-
| Generalization
|
|
149
|
-
| Required Properties
|
|
150
|
-
| Inherited Properties
|
|
151
|
-
| Owned Properties
|
|
152
|
-
| Required
|
|
153
|
-
|
|
|
154
|
-
| Accessible Name Required
|
|
155
|
-
| Accessible Name From Author
|
|
156
|
-
| Accessible Name From Content
|
|
157
|
-
| Accessible Name Prohibited
|
|
158
|
-
| Children Presentational
|
|
159
|
-
| Prohibited Properties
|
|
143
|
+
| Data | Selector |
|
|
144
|
+
| ---------------------------------- | --------------------------------------------------- |
|
|
145
|
+
| Name | `.role-name[title]` |
|
|
146
|
+
| Description | `.role-description p` (joined with `\n\n`) |
|
|
147
|
+
| Is Abstract | `.role-abstract` text equals "true" |
|
|
148
|
+
| Generalization | `.role-parent a` |
|
|
149
|
+
| Required Properties | `.role-required-properties li` (fallback to parent) |
|
|
150
|
+
| Inherited Properties | `.role-inherited li` |
|
|
151
|
+
| Owned Properties | `.role-properties li` or `.role-properties > a` |
|
|
152
|
+
| Required Accessibility Parent Role | `.role-scope li` or `.role-scope a` |
|
|
153
|
+
| Allowed Accessibility Child Roles | `.role-mustcontain li` or `.role-mustcontain a` |
|
|
154
|
+
| Accessible Name Required | `.role-namerequired` contains "true" |
|
|
155
|
+
| Accessible Name From Author | `.role-namefrom` contains "author" |
|
|
156
|
+
| Accessible Name From Content | `.role-namefrom` contains "content" |
|
|
157
|
+
| Accessible Name Prohibited | `.role-namefrom` contains "prohibited" |
|
|
158
|
+
| Children Presentational | `.role-childpresentational` "true"/"false" |
|
|
159
|
+
| Prohibited Properties | `.role-disallowed li code` |
|
|
160
160
|
|
|
161
161
|
**Role synonym handling:**
|
|
162
162
|
|
|
@@ -206,6 +206,20 @@ The same CSS selectors used for standard ARIA roles apply to Graphics ARIA roles
|
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
+
## DPub ARIA Scraping
|
|
210
|
+
|
|
211
|
+
**Module:** `aria.ts`
|
|
212
|
+
|
|
213
|
+
DPub ARIA roles (Digital Publishing WAI-ARIA Module) are fetched using the `getDpubRoles()` function.
|
|
214
|
+
|
|
215
|
+
| URL |
|
|
216
|
+
| ---------------------------------- |
|
|
217
|
+
| `https://w3c.github.io/dpub-aria/` |
|
|
218
|
+
|
|
219
|
+
The DPub ARIA specification uses the same HTML structure and CSS selectors as the standard WAI-ARIA specification (`#role_definitions section.role`, `.role-name[title]`, `.role-parent a`, etc.). The `getDpubRoles()` function is called once and the 41 roles are shared across all ARIA versions.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
209
223
|
## HTML-ARIA Mapping
|
|
210
224
|
|
|
211
225
|
**Module:** `aria.ts` (`getAriaInHtml()`)
|
package/lib/aria.d.ts
CHANGED
|
@@ -10,15 +10,18 @@ export declare function getAria(): Promise<{
|
|
|
10
10
|
roles: ARIARoleInSchema[];
|
|
11
11
|
props: ARIAProperty[];
|
|
12
12
|
graphicsRoles: ARIARoleInSchema[];
|
|
13
|
+
dpubRoles: ARIARoleInSchema[];
|
|
13
14
|
};
|
|
14
15
|
'1.2': {
|
|
15
16
|
roles: ARIARoleInSchema[];
|
|
16
17
|
props: ARIAProperty[];
|
|
17
18
|
graphicsRoles: ARIARoleInSchema[];
|
|
19
|
+
dpubRoles: ARIARoleInSchema[];
|
|
18
20
|
};
|
|
19
21
|
'1.1': {
|
|
20
22
|
roles: ARIARoleInSchema[];
|
|
21
23
|
props: ARIAProperty[];
|
|
22
24
|
graphicsRoles: ARIARoleInSchema[];
|
|
25
|
+
dpubRoles: ARIARoleInSchema[];
|
|
23
26
|
};
|
|
24
27
|
}>;
|
package/lib/aria.js
CHANGED
|
@@ -10,24 +10,94 @@ export async function getAria() {
|
|
|
10
10
|
const roles13 = await getRoles('1.3');
|
|
11
11
|
const roles12 = await getRoles('1.2');
|
|
12
12
|
const roles11 = await getRoles('1.1');
|
|
13
|
+
const dpubRoles = await getDpubRoles();
|
|
13
14
|
return {
|
|
14
15
|
'1.3': {
|
|
15
16
|
roles: roles13,
|
|
16
17
|
props: await getProps('1.3', roles13),
|
|
17
18
|
graphicsRoles: await getRoles('1.3', true),
|
|
19
|
+
dpubRoles,
|
|
18
20
|
},
|
|
19
21
|
'1.2': {
|
|
20
22
|
roles: roles12,
|
|
21
23
|
props: await getProps('1.2', roles12),
|
|
22
24
|
graphicsRoles: await getRoles('1.2', true),
|
|
25
|
+
dpubRoles,
|
|
23
26
|
},
|
|
24
27
|
'1.1': {
|
|
25
28
|
roles: roles11,
|
|
26
29
|
props: await getProps('1.1', roles11),
|
|
27
30
|
graphicsRoles: await getRoles('1.1', true),
|
|
31
|
+
dpubRoles,
|
|
28
32
|
},
|
|
29
33
|
};
|
|
30
34
|
}
|
|
35
|
+
const DPUB_ARIA_URL = 'https://w3c.github.io/dpub-aria/';
|
|
36
|
+
/**
|
|
37
|
+
* Scrapes DPub (Digital Publishing) ARIA role definitions from the W3C specification.
|
|
38
|
+
* DPub ARIA is a single-version module independent of WAI-ARIA versioning, so the same
|
|
39
|
+
* roles are shared across all ARIA versions.
|
|
40
|
+
*
|
|
41
|
+
* @returns A sorted array of DPub ARIA role schema objects
|
|
42
|
+
*/
|
|
43
|
+
async function getDpubRoles() {
|
|
44
|
+
const $ = await fetch(DPUB_ARIA_URL);
|
|
45
|
+
const $roleList = $('#role_definitions section.role');
|
|
46
|
+
const roles = [];
|
|
47
|
+
$roleList.each((_, el) => {
|
|
48
|
+
const $el = $(el);
|
|
49
|
+
const name = $el.find('.role-name').attr('title')?.trim() ?? '';
|
|
50
|
+
const description = $el
|
|
51
|
+
.find('.role-description p')
|
|
52
|
+
.toArray()
|
|
53
|
+
.map(p => $(p).text().trim().replaceAll(/\s+/g, ' ').replaceAll(/\t+/g, ''))
|
|
54
|
+
.join('\n\n');
|
|
55
|
+
const generalization = $el
|
|
56
|
+
.find('table.def .role-parent a')
|
|
57
|
+
.toArray()
|
|
58
|
+
.map(a => $(a).text().trim());
|
|
59
|
+
const ownedInheritedProps = $el
|
|
60
|
+
.find('table.def .role-inherited li')
|
|
61
|
+
.toArray()
|
|
62
|
+
.map(li => {
|
|
63
|
+
const $li = $(li);
|
|
64
|
+
const $a = $li.find('a');
|
|
65
|
+
const text = $li.text();
|
|
66
|
+
const propName = $a.length > 0
|
|
67
|
+
? $a
|
|
68
|
+
.text()
|
|
69
|
+
.replace(/\s*\(\s*state\s*\)\s*/i, '')
|
|
70
|
+
.trim()
|
|
71
|
+
: text.trim();
|
|
72
|
+
return {
|
|
73
|
+
name: propName,
|
|
74
|
+
inherited: true,
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
const accessibleNameRequired = !!/true/i.test($el.find('table.def .role-namerequired').text());
|
|
78
|
+
const accessibleNameFromAuthor = !!/author/i.test($el.find('table.def .role-namefrom').text());
|
|
79
|
+
const accessibleNameFromContent = !!/content/i.test($el.find('table.def .role-namefrom').text());
|
|
80
|
+
const accessibleNameProhibited = !!/prohibited/i.test($el.find('table.def .role-namefrom').text());
|
|
81
|
+
const $childrenPresentational = $el.find('table.def .role-childpresentational').text();
|
|
82
|
+
const childrenPresentational = /true/i.test($childrenPresentational)
|
|
83
|
+
? true
|
|
84
|
+
: /false/i.test($childrenPresentational)
|
|
85
|
+
? false
|
|
86
|
+
: undefined;
|
|
87
|
+
roles.push({
|
|
88
|
+
name,
|
|
89
|
+
description,
|
|
90
|
+
generalization,
|
|
91
|
+
ownedProperties: ownedInheritedProps.toSorted(nameCompare),
|
|
92
|
+
accessibleNameRequired,
|
|
93
|
+
accessibleNameFromAuthor,
|
|
94
|
+
accessibleNameFromContent,
|
|
95
|
+
accessibleNameProhibited,
|
|
96
|
+
childrenPresentational,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
return roles.toSorted(nameCompare);
|
|
100
|
+
}
|
|
31
101
|
/**
|
|
32
102
|
* Returns the URL of the WAI-ARIA specification for a given version.
|
|
33
103
|
*
|
|
@@ -143,7 +213,7 @@ async function getRoles(version, graphicsAria = false) {
|
|
|
143
213
|
: /false/i.test($childrenPresentational)
|
|
144
214
|
? false
|
|
145
215
|
: undefined;
|
|
146
|
-
const ownedProperties = arrayUnique([...ownedRequiredProps, ...ownedInheritedProps, ...ownedProps].
|
|
216
|
+
const ownedProperties = arrayUnique([...ownedRequiredProps, ...ownedInheritedProps, ...ownedProps].toSorted(nameCompare));
|
|
147
217
|
const prohibitedProperties = $features
|
|
148
218
|
.find('.role-disallowed li code')
|
|
149
219
|
.toArray()
|
|
@@ -197,8 +267,7 @@ async function getRoles(version, graphicsAria = false) {
|
|
|
197
267
|
};
|
|
198
268
|
}
|
|
199
269
|
}
|
|
200
|
-
roles.
|
|
201
|
-
return roles;
|
|
270
|
+
return roles.toSorted(nameCompare);
|
|
202
271
|
}
|
|
203
272
|
/**
|
|
204
273
|
* Scrapes ARIA properties and states from the specification for a given version.
|
|
@@ -228,7 +297,7 @@ async function getProps(version, roles) {
|
|
|
228
297
|
return hash?.slice(1);
|
|
229
298
|
})
|
|
230
299
|
.filter((s) => !!s));
|
|
231
|
-
const arias = [...ariaNameList].
|
|
300
|
+
const arias = [...ariaNameList].toSorted().map((name) => {
|
|
232
301
|
const $section = $(`#${name}`);
|
|
233
302
|
const className = $section.attr('class');
|
|
234
303
|
const type = className && /property/i.test(className) ? 'property' : 'state';
|
|
@@ -306,8 +375,7 @@ async function getProps(version, roles) {
|
|
|
306
375
|
}
|
|
307
376
|
return aria;
|
|
308
377
|
});
|
|
309
|
-
arias.
|
|
310
|
-
return arias;
|
|
378
|
+
return arias.toSorted(nameCompare);
|
|
311
379
|
}
|
|
312
380
|
/**
|
|
313
381
|
* Scrapes the W3C HTML-ARIA specification to extract the mapping between
|
|
@@ -331,7 +399,7 @@ async function getAriaInHtml() {
|
|
|
331
399
|
if (!name) {
|
|
332
400
|
continue;
|
|
333
401
|
}
|
|
334
|
-
const value = _value?.
|
|
402
|
+
const value = _value?.replaceAll(/"|'/g, '').trim() ?? null;
|
|
335
403
|
const data = {
|
|
336
404
|
name: name,
|
|
337
405
|
value: value === '...' ? null : value,
|
package/lib/fetch.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import * as cheerio from 'cheerio';
|
|
2
2
|
import { Bar, Presets } from 'cli-progress';
|
|
3
|
+
/**
|
|
4
|
+
* Whether the process is running in a CI environment.
|
|
5
|
+
*/
|
|
6
|
+
const isCI = Boolean(process.env.CI);
|
|
3
7
|
/**
|
|
4
8
|
* In-memory cache mapping URLs to their raw HTML text responses.
|
|
5
9
|
*/
|
|
@@ -10,10 +14,12 @@ const cache = new Map();
|
|
|
10
14
|
const domCache = new Map();
|
|
11
15
|
let total = 1;
|
|
12
16
|
let current = 0;
|
|
13
|
-
const bar =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
const bar = isCI
|
|
18
|
+
? null
|
|
19
|
+
: new Bar({
|
|
20
|
+
format: '🔎 Fetch references... {bar} {percentage}% | ETA: {eta}s | {value}/{total} {process}',
|
|
21
|
+
}, Presets.shades_grey);
|
|
22
|
+
bar?.start(total, current, { process: '🚀 Started.' });
|
|
17
23
|
/**
|
|
18
24
|
* Fetches a URL and returns a parsed Cheerio DOM instance.
|
|
19
25
|
* Results are cached so subsequent calls with the same URL avoid re-fetching and re-parsing.
|
|
@@ -40,7 +46,7 @@ export async function fetch(url) {
|
|
|
40
46
|
*/
|
|
41
47
|
export async function fetchText(url) {
|
|
42
48
|
total += 1;
|
|
43
|
-
bar
|
|
49
|
+
bar?.setTotal(total);
|
|
44
50
|
let text;
|
|
45
51
|
if (cache.has(url)) {
|
|
46
52
|
text = cache.get(url);
|
|
@@ -57,7 +63,7 @@ export async function fetchText(url) {
|
|
|
57
63
|
}
|
|
58
64
|
}
|
|
59
65
|
current += 1;
|
|
60
|
-
bar
|
|
66
|
+
bar?.update(current, { process: `🔗 ${url.length > 30 ? `${url.slice(0, 15)}...${url.slice(-15)}` : url}` });
|
|
61
67
|
return text;
|
|
62
68
|
}
|
|
63
69
|
/**
|
|
@@ -68,7 +74,7 @@ export async function fetchText(url) {
|
|
|
68
74
|
*/
|
|
69
75
|
export function getReferences() {
|
|
70
76
|
current += 1;
|
|
71
|
-
bar
|
|
72
|
-
bar
|
|
73
|
-
return [...cache.keys()].
|
|
77
|
+
bar?.update(current, { process: '🎉 Finished.' });
|
|
78
|
+
bar?.stop();
|
|
79
|
+
return [...cache.keys()].toSorted();
|
|
74
80
|
}
|
package/lib/html-elements.js
CHANGED
|
@@ -48,7 +48,7 @@ const obsoleteList = [
|
|
|
48
48
|
*/
|
|
49
49
|
export async function getElements(filePattern) {
|
|
50
50
|
let specs = await readJsons(filePattern, (file, body) => {
|
|
51
|
-
const name = file.replace(/^.+spec\.([\w-]+)\.
|
|
51
|
+
const name = file.replace(/^.+spec\.([\w-]+)\.jsonc$/i, '$1');
|
|
52
52
|
return {
|
|
53
53
|
// @ts-ignore
|
|
54
54
|
name,
|
|
@@ -127,6 +127,6 @@ export async function getElements(filePattern) {
|
|
|
127
127
|
return spec;
|
|
128
128
|
}));
|
|
129
129
|
return specs
|
|
130
|
-
.
|
|
131
|
-
.
|
|
130
|
+
.toSorted(nameCompare)
|
|
131
|
+
.toSorted((a, b) => (a.namespace == b.namespace ? 0 : a.namespace === 'http://www.w3.org/2000/svg' ? 1 : -1));
|
|
132
132
|
}
|
package/lib/read-json.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { glob } from 'glob';
|
|
4
|
-
import
|
|
4
|
+
import { parse } from 'jsonc-parser';
|
|
5
5
|
/**
|
|
6
6
|
* Reads and parses a single JSON file (with support for JSON comments) from an absolute file path.
|
|
7
7
|
*
|
|
@@ -14,9 +14,8 @@ export function readJson(filePath) {
|
|
|
14
14
|
if (!path.isAbsolute(filePath)) {
|
|
15
15
|
throw new Error(`The path must be absolute path: ${filePath}`);
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return JSON.parse(json);
|
|
17
|
+
const json = fs.readFileSync(filePath, { encoding: 'utf8' });
|
|
18
|
+
return parse(json);
|
|
20
19
|
}
|
|
21
20
|
/**
|
|
22
21
|
* Reads multiple JSON files matching a glob pattern and optionally transforms each result.
|
|
@@ -32,7 +31,7 @@ export async function readJsons(pattern, hook = (_, body) => body) {
|
|
|
32
31
|
if (!path.isAbsolute(pattern)) {
|
|
33
32
|
throw new Error(`The pattern must be absolute path: ${pattern}`);
|
|
34
33
|
}
|
|
35
|
-
const files = await glob(pattern);
|
|
34
|
+
const files = await glob(pattern, { windowsPathsNoEscape: true });
|
|
36
35
|
return Promise.all(files.map(file => {
|
|
37
36
|
const json = readJson(file);
|
|
38
37
|
return hook(file, json);
|
package/lib/utils.js
CHANGED
|
@@ -26,8 +26,7 @@ export function nameCompare(a, b) {
|
|
|
26
26
|
*/
|
|
27
27
|
export function sortObjectByKey(o) {
|
|
28
28
|
// @ts-ignore
|
|
29
|
-
const keys = Object.keys(o);
|
|
30
|
-
keys.sort(nameCompare);
|
|
29
|
+
const keys = Object.keys(o).toSorted(nameCompare);
|
|
31
30
|
// @ts-ignore
|
|
32
31
|
const newObj = {};
|
|
33
32
|
for (const key of keys) {
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markuplint/spec-generator",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-alpha.1",
|
|
4
4
|
"description": "Generates @markuplint/html-spec",
|
|
5
5
|
"repository": "git@github.com:markuplint/markuplint.git",
|
|
6
6
|
"author": "Yusuke Hirao <yusukehirao@me.com>",
|
|
7
7
|
"license": "MIT",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=22"
|
|
10
|
+
},
|
|
8
11
|
"type": "module",
|
|
9
12
|
"exports": {
|
|
10
13
|
".": {
|
|
@@ -22,18 +25,18 @@
|
|
|
22
25
|
},
|
|
23
26
|
"dependencies": {
|
|
24
27
|
"@types/cheerio": "1.0.0",
|
|
25
|
-
"ajv": "8.
|
|
28
|
+
"ajv": "8.18.0",
|
|
26
29
|
"cheerio": "1.2.0",
|
|
27
30
|
"cli-progress": "3.12.0",
|
|
28
|
-
"fast-xml-parser": "5.3.
|
|
29
|
-
"glob": "13.0.
|
|
30
|
-
"
|
|
31
|
+
"fast-xml-parser": "5.3.7",
|
|
32
|
+
"glob": "13.0.6",
|
|
33
|
+
"jsonc-parser": "3.3.1"
|
|
31
34
|
},
|
|
32
35
|
"devDependencies": {
|
|
33
|
-
"@markuplint/ml-spec": "
|
|
34
|
-
"@markuplint/test-tools": "
|
|
36
|
+
"@markuplint/ml-spec": "5.0.0-alpha.1",
|
|
37
|
+
"@markuplint/test-tools": "5.0.0-alpha.1",
|
|
35
38
|
"@types/cli-progress": "3.11.6",
|
|
36
|
-
"type-fest": "4.
|
|
39
|
+
"type-fest": "5.4.4"
|
|
37
40
|
},
|
|
38
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "78a295e73a097a1ce09c777c06fa21ab68136387"
|
|
39
42
|
}
|