Home About Contact
UXP , InDesign , TypeScript , Deno

UXP InDesign, TypeScript を使う (Denoを使用) require を回避

Deno を使えば TypeScript を使って UXP InDesign スクリプトをバンドルできることがわかった、 というのが前回のポスト。 しかし、 require("uxp").storage.localFileSystem を使う場合なども機能するのだろうか? と思い立ち調査しました。 結論としては問題ありません。

結論だけ知りたい場合はこちらのレポジトリの read-text-ts をご覧ください。

まずは環境の確認:

$ deno --version
deno 1.30.3 (release, x86_64-apple-darwin)
v8 10.9.194.5
typescript 4.9.4

main.ts を用意

const ufs = require('uxp').storage.localFileSystem
const file = await ufs.getFileForOpening({ types: ['md'] })
if( file!=null ){
    const text = await file.read()
    console.log(text)
}

require('uxp') や await などありうまくいくか不安にはなる。

$ deno bundle main.ts
Check file:///Users/foo/path-to/main.ts
error: TS2580 [ERROR]: Cannot find name 'require'.
const ufs = require('uxp').storage.localFileSystem
            ~~~~~~~

require がない、と。 まあ当然の結果ではある。

そこで例によって宣言を追加。雑に型は any で対処します。

declare var require: any

実行します。

$ deno bundle main.ts 
Check file:///Users/foo/path-to/main.ts
Bundle file:///Users/foo/path-to/main.ts
// deno-fmt-ignore-file
// deno-lint-ignore-file
// This code was bundled using `deno bundle` and it's not recommended to edit it manually

const ufs = require('uxp').storage.localFileSystem;
const file = await ufs.getFileForOpening({
    types: [
        'md'
    ]
});
if (file != null) {
    const text = await file.read();
    console.log(text);
}

うまくいきました。

まとめ

main.ts 全体

declare var require: any

const ufs = require('uxp').storage.localFileSystem
const file = await ufs.getFileForOpening({ types: ['md'] })
if( file!=null ){
    const text = await file.read()
    console.log(text)
}

Deno は (Node.jsと違って) CommonJS モジュールを扱わないので、require を独自の変数として declare しても問題ない。