deno x(dx) が導入されたので textlint の実行基盤を Deno へ移行する

この記事は、Deno Advent Calendar 2025 の15日目の記事です。

2025 年 12 月 11日に deno v2.6がリリースされました。
このリリースに、dx が導入されています。
これはnpm における npx のようなパッケージバイナリの実行ツールです。

こちらを使い、deno 上で textlint を動かすようにしてみました。

参考

導入

dx は、deno 2.6 以降で利用可能です。

1
$ deno upgrade

dx は、deno x コマンドのエイリアスとして存在します。
以下のように、導入してほしい旨の記載がありますが、弊windows環境では導入がうまくいきませんでした。
後述の操作はすべて deno x コマンドで実行していきます。

1
$ deno x --install-alias

既存 textlint プロジェクトへの導入

既に設定されている textlint で使えるか確認します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ npx textlint hogehoge/js110.md
# => 正常に動作する

$ deno x
Available (local) commands:
esparse
esvalidate
js-yaml
json5
mkdirp
parser
prh
resolve
rimraf
semver
sentence-splitter
textlint

deno x textlint hogehoge/js110.md
# => 正常に動作する

正常動作します。

というわけには行かないので深堀。

textlint は対象のファイルにアクセスして文法なりを調べてくれるツールです。
すなわち、ローカルファイルへの読み込みアクセスがあります。
しかし、先のコマンドでは、deno の権限に関する記述していません。
これは、特別設定されなければ、-A(–allow-all) 権限が付与されるためでした。

そのため、明示的に権限を中途半端に与えて実行すると、以下のように確認して実行がされます。

1
2
3
4
5
6
7
$ deno x -E textlint hogehoge/js110.md
deno x -E textlint hogehoge/js110.md
✅ Granted sys access to "osRelease".
✅ Granted read access to "hogehoge\textlint\node_modules\@textlint\linter-formatter\lib\src\formatters".
✅ Granted read access to "hogehoge\textlint\node_modules\@textlint\fixer-formatter\lib\src\formatters".
✅ Granted sys access to "homedir".
...

もし、明示的に権限を与えながら、確認プロンプトを出さずに実行するには、以下のように記述します。

1
deno x -ERS textlint hogehoge/js110.md

もしくは、deno.json へ以下のように記述を用意して、-P を与えることでも実行できました。

deno.json
1
2
3
4
5
6
7
8
9
10
11
{
"permissions": {
"default":{
"read": true,
"write": true,
"net": false,
"env": true,
"sys": true
}
}
}
1
2
deno x -P textlint hogehoge/js110.md
# => 正常に動作する

もし、既存の deno task 運用に乗せるなら、以下のように記述をすればよいです。

deno.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{

"tasks":{
"textlint": "deno x -P textlint"
},
"permissions": {
"default":{
"read": true,
"write": true,
"net": false,
"env": true,
"sys": true
}
}
}
1
2
3
4
5
6
7
8
9
10
11
$ deno task
Available tasks:
- textlint
deno x -P textlint

$ deno task textlint hogehoge/js110.md
Task textlint deno x -P textlint "hogehoge/js110.md"
Warning Permissions in the config file is an experimental feature and may change in the future.

hogehoge\js110.md
13:24 error "よう" が連続して2回使われています。 ja-technical-writing/ja-no-successive-word

deno x で textlint を初期構築(失敗)

先のものは、npm で導入したものを deno x で動かしたものでした。
deno x で textlint プロジェクトを初期構築を試みます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 新しいディレクトリにて
$ deno x textlint --init
Install npm:textlint? [Y/n] => y
Download ▰▰▰▰▰▰ [00:08] 54/56
# 各種パッケージが導入


== No rules found, textlint hasn’t done anything ==

Possible reasons:
* Your textlint config file has no rules.
* You have no config file and you aren’t passing rules via command line.
* Your textlint config has a syntax error.

=> How to set up rules?
https://github.com/textlint/textlint/blob/master/docs/configuring.md

正常に導入されました。

設定については、もとから使っていた.textlintrc を移植しますが、ルールを見つけられないようです。

.textlintrc
1
2
3
4
5
6
7
8
9
10
11
12
{
"filters": {
"comments": {
"enablingComment": "textlint-enable",
"disablingComment": "textlint-disable"
}
},
"rules": {
"preset-ja-technical-writing": true,
"textlint-rule-preset-japanese": true
}
}

一旦ルールに必要なパッケージ群を導入します。

1
$ deno add npm:textlint-filter-rule-comments npm:textlint-rule-preset-ja-technical-writing npm:textlint-rule-preset-japanese

ここで気が付いて、–init があり実行すると、設定ファイルが変更されているということが分かりました。

1
2
$ deno x textlint --init
.textlintrc.json is created.

.textlintrcの内容は、.textlintrc.json に移植します。

これでもルールが見つからないようです。
ここで感づいたので、 deno add npm:textlint も実行します。
あくまで、deno x は実行してくれるが、ローカルに展開はしてくれるわけではないので、インストールはしておく必要があった模様です。

deno x で textlint を初期構築(改めて)

改めて、0->1でやり直します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ deno init

$ deno add npm:textlint
Add npm:textlint@15.5.0

Dependencies:
+ npm:textlint 15.5.0

$ deno x
Available (local) commands:
textlint
$ deno x textlint --init
.textlintrc.json is created.

$ deno add npm:textlint-filter-rule-comments npm:textlint-rule-preset-ja-technical-writing npm:textlint-rule-preset-japanese
Add npm:textlint-filter-rule-comments@1.2.2
Add npm:textlint-rule-preset-ja-technical-writing@12.0.2
Add npm:textlint-rule-preset-japanese@10.0.4

Dependencies:
+ npm:textlint-filter-rule-comments 1.2.2
+ npm:textlint-rule-preset-ja-technical-writing 12.0.2
+ npm:textlint-rule-preset-japanese 10.0.4

作成された .textlintrc.json を編集して、実行。

1
2
3
4
$ deno x textlint hogehoge/js110.md

hogehoge/js110.md
13:24 error "よう" が連続して2回使われています。 ja-technical-writing/ja-no-successive-word

改めて、deno.jsonにtask 定義と権限定義し、deno task で実行。

1
2
3
4
5
6
$ deno task textlint hogehoge/js110.md
Task textlint deno x -P textlint "hogehoge/js110.md"
Warning Permissions in the config file is an experimental feature and may change in the future.

hogehoge/js110.md
13:24 error "よう" が連続して2回使われています。 ja-technical-writing/ja-no-successive-word

この手順で良いようです。


deno x 及び dx の導入により、パッケージバイナリを実行しやすくなりました。
これにより、Node to Deno へ移行しやすくなることが期待されます。

では。