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
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 しても問題ない。