-
-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TypeScript-ify entrypoint scripts #428
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
詳細の説明です
@@ -0,0 +1,6 @@ | |||
export class SwiftRuntime { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
JavaScriptKitの index.mjs
があると想定されている場所に、index.d.ts
を置いて型付けします。
cartonはJavaScriptKitをユーザが用意する事を想定しているため、
ここで利用するJavaScriptKitのバージョンがcartonに対して固定されません。
そのためここでの型定義は、他のコードと相互作用するために必要な最小限の定義にします。
@@ -13,15 +13,17 @@ | |||
// limitations under the License. | |||
|
|||
import { WasmRunner } from "./common.js"; | |||
import type { SwiftRuntimeConstructor } from "./JavaScriptKit_JavaScriptKit.resources/Runtime"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
JavaScriptKitはユーザが配布する想定で、実装はcarton側ではバンドルしません。
それを明確に表明するため import type
を使います。
try { | ||
const { SwiftRuntime } = await import( | ||
// @ts-ignore |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TypeScriptが下記のパスを検証して、ファイルが存在しない事のエラーを出しますが、
コンパイル後はまさにこのパスをimportしたいので、エラーを潰しています。
なお、 .../Runtime
や .../Runtime/index
であれば型チェックが通りますが、
そうするとコンパイル後が index.mjs
にならないためダメでした。
if (SwiftRuntime) { | ||
swift = new SwiftRuntime(); | ||
} | ||
|
||
const wasmFs = createWasmFS( | ||
(stdout) => { | ||
console.log(stdout); | ||
options.onStdout(stdout); | ||
options.onStdout?.call(undefined, stdout); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
onStdout
が設定されてない場合はスキップして動くようにしました。
@@ -91,7 +105,7 @@ export const WasmRunner = (rawOptions, SwiftRuntime) => { | |||
wasi.start(instance); | |||
|
|||
// Initialize and start Reactor | |||
if (instance.exports._initialize) { | |||
if (typeof instance.exports._initialize == "function") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ifの先で関数呼び出しをするために型チェックが必要です。
// Instantiate a new WASI Instance | ||
const wasmFs = new WasmFs(); | ||
|
||
// Output stdout and stderr to console | ||
const originalWriteSync = wasmFs.fs.writeSync; | ||
wasmFs.fs.writeSync = (fd, buffer, offset, length, position) => { | ||
(wasmFs.fs as any).writeSync = ( | ||
fd: number, buffer: Buffer | Uint8Array, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここの Buffer
を書くために nodejs の型が必要でした。
// Instantiate a new WASI Instance | ||
const wasmFs = new WasmFs(); | ||
|
||
// Output stdout and stderr to console | ||
const originalWriteSync = wasmFs.fs.writeSync; | ||
wasmFs.fs.writeSync = (fd, buffer, offset, length, position) => { | ||
(wasmFs.fs as any).writeSync = ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
メソッドのインターフェースであり、差し替えられるようになってないので、any
を経由します。
@@ -20,11 +20,14 @@ | |||
}, | |||
"homepage": "https://github.com/swiftwasm/carton#readme", | |||
"devDependencies": { | |||
"@types/node": "^20.12.7", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Buffer
を書くために必要です
"reconnecting-websocket": "^4.4.0" | ||
"path-browserify": "^1.0.1", | ||
"reconnecting-websocket": "^4.4.0", | ||
"typescript": "^5.4.5" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ローカルで $ npx tsc
すると型チェックできます。
entrypointのスクリプトはcartonのために作られていますが、
cartonを使わない構成においても再利用しやすいと便利です。
例えば、僕が作っているライブラリの開発においては、
cartonを使わないユーザと使うユーザの両方に対応するために、
それぞれの構成をテストしています。
前者において、cartonのentrypointと重複した作業が生じるので、
スクリプトを再利用したくなりました。
このような場合に、スクリプトがTypeScriptで型付けされていれば、
コードのインターフェースを把握しやすくなるため、
ライブラリとして再利用しやすくなります。
また、cartonにおいても、型がついていれば、
スクリプトの改修においてバグを回避しやすいなど、
生産性が向上すると思います。
このパッチを当てると、
VSCodeで開いたときに自然と型チェックされます。
$ npx tsc
で明示的に型チェックできます。carton-release
の使い方は変わらず、そのまま動作します。マージを検討していただけると幸いです。
パッチの詳細はレビューコメントで補足します。