Skip to content
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

Merged
merged 1 commit into from
Apr 17, 2024
Merged

Conversation

omochi
Copy link
Contributor

@omochi omochi commented Apr 17, 2024

entrypointのスクリプトはcartonのために作られていますが、
cartonを使わない構成においても再利用しやすいと便利です。

例えば、僕が作っているライブラリの開発においては、
cartonを使わないユーザと使うユーザの両方に対応するために、
それぞれの構成をテストしています。
前者において、cartonのentrypointと重複した作業が生じるので、
スクリプトを再利用したくなりました。

このような場合に、スクリプトがTypeScriptで型付けされていれば、
コードのインターフェースを把握しやすくなるため、
ライブラリとして再利用しやすくなります。

また、cartonにおいても、型がついていれば、
スクリプトの改修においてバグを回避しやすいなど、
生産性が向上すると思います。

このパッチを当てると、
VSCodeで開いたときに自然と型チェックされます。
$ npx tsc で明示的に型チェックできます。

carton-release の使い方は変わらず、そのまま動作します。

マージを検討していただけると幸いです。

パッチの詳細はレビューコメントで補足します。

@kateinoigakukun kateinoigakukun added the enhancement New feature or request label Apr 17, 2024
Copy link
Contributor Author

@omochi omochi left a 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 {
Copy link
Contributor Author

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";
Copy link
Contributor Author

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
Copy link
Contributor Author

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);
Copy link
Contributor Author

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") {
Copy link
Contributor Author

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,
Copy link
Contributor Author

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 = (
Copy link
Contributor Author

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",
Copy link
Contributor Author

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"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ローカルで $ npx tsc すると型チェックできます。

@kateinoigakukun kateinoigakukun merged commit 3abdbd2 into swiftwasm:main Apr 17, 2024
3 of 4 checks passed
@kateinoigakukun kateinoigakukun changed the title entrypointをTypeScriptにする TypeScript-ify entrypoint scripts Apr 17, 2024
@omochi omochi deleted the entry-ts branch April 17, 2024 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants