Basic

Node.js Validation

動作する最小限の ReScript + Node.js スターターである。「Hello World」ではないConsole.log に加えて、argv のパース、node:fs/promises 経由のファイル I/O、そしてウィザードで選択した zod または sury を使った Validation.res による同梱の config.sample.json のバリデーションを示している。

プラグインが生成する最小限の scaffolding を正確に理解したい場合、あるいはその場限りで終わりかねない小さな Node.js スクリプトの出発点として、本テンプレートを参照すると良い。

生成内容

my-project/
├── rescript.json
├── package.json
├── config.sample.json
├── src/
│   ├── App.res                  # entry — parses argv, optionally reads & validates config
│   ├── Args.res                 # tiny argv parser (--flag / --flag=value / positional)
│   ├── Files.res                # fs/promises helpers (readFile / writeFile / exists)
│   ├── Validation.res           # zod or sury — selected in the wizard
│   └── __tests__/App.test.mjs   # vitest smoke test that imports App.res.mjs
├── README.md                    # script docs + Project Layout + Run the App
├── LICENSE                      # MIT, holder = project name
├── .nvmrc                       # Node 24
├── .gitignore                   # node_modules + ReScript build artifacts
├── .editorconfig                # 2-space indent, LF line endings
└── .github/
    ├── dependabot.yml           # weekly npm updates
    └── workflows/ci.yml         # install + rescript build + vitest

ウィザードオプション

オプション

効果

Project name

npm の name、ライセンス保有者、および App.res の例で --name として echo される値となる

Package manager

npm / pnpm / yarn / bun。packageManager フィールド、README のインストール/実行コマンド、CI のキャッシュキーに影響する

Validation library

zodsury。同梱される src/Validation.res のバリアントと追加される依存を選択する

主要な依存

パッケージ

用途

バージョン

rescript

ReScript コンパイラ

TemplateVersions.RESCRIPT

@rescript/core

標準ライブラリ

TemplateVersions.RESCRIPT_CORE

@rescript/runtime

コンパイル後の .res.mjs がインポートするランタイムスタブ

TemplateVersions.RESCRIPT_RUNTIME

zod または sury

バリデーションのバックエンド(ウィザードで選択)

TemplateVersions.ZOD / SURY

vitest (dev)

スモークテストランナー

TemplateVersions.VITEST

@vitest/coverage-v8 (dev)

test:coverage 用のカバレッジプロバイダ

TemplateVersions.VITEST_COVERAGE_V8

主要なファイル

src/App.res

npm start から呼び出されるエントリポイント。Args.parse(NodeJs.Process.process->NodeJs.Process.argv) を呼び出し、挨拶を表示するか、(--config <path> が指定された場合は)Files.readFile でファイルを読み込み、Validation.parseConfig 経由でパースする。

src/Args.res / src/Files.res

CLI フレームワークを引き込まずに 実用的な API を示すために用意された 2 つの小さなモジュール:

  • Args.res--flag / --flag=value / 位置引数を扱う最小限のパーサー

  • Files.resnode:fs/promises をラップする readFilewriteFileexists のラッパー

いずれも意図的に短くしてある — @module / @val バインディングで Node API を ラップする方法の実例も兼ねている。

src/Validation.res

同梱の config.sample.json 用の parseConfig: Js.Json.t => result<config, string>。シグネチャは zod 版と sury 版で同一なので、呼び出し側で分岐する必要はない。

config.sample.json

バリデータを実際に動かすためのリファレンス設定:

{
  "name": "demo",
  "version": 1,
  "tags": ["alpha", "beta"]
}

npm スクリプト

スクリプト

説明

start

node src/App.res.mjs — コンパイル済みのエントリポイントを実行

test

vitest run — スモークスイートを実行

test:coverage

vitest run --coverage — 同上に v8 のカバレッジレポートを付与

res:build

rescript — ワンショットコンパイル

res:dev

rescript -w — 保存時に再コンパイル

res:clean

rescript clean — 生成された .res.mjs を削除

2日目以降のレシピ

このテンプレートは意図的に低レベル寄りで、拡張すべきフレームワークは存在しない。よくある次のステップ:

  • CLI サブコマンドを追加 → CLI Tool テンプレートへ移行する(または Commands/ パターンを複製する)

  • HTTP を追加 → Hono (Node.js) へ移行する

  • npm に公開 → npm Library へ移行する

プロジェクトを開いた後の ReScript 側のエディタワークフローについては、機能概要 を参照すること。

補足

  • node エンジンは >=24 に固定されており、.nvmrc には 24 が記載されている。これより古いメジャーバージョンは CI で検証されない。

  • スモークテストは import("../App.res.mjs") が解決できることだけを確認するもので、Files.resValidation.res までは検証しない。プロジェクトを育てる過程でドメイン固有のテストを追加すること。

  • config.sample.json というファイル名は意図的なものである: .gitignore が(実運用の、場合によっては秘匿される)config.json をリポジトリから除外しつつ、サンプル はソースとともに配布できるようにしている。