# Milkee

[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![Vitest](https://github.com/otnc/coffeescript-milkee/actions/workflows/test.yml/badge.svg)](https://github.com/otnc/coffeescript-milkee/actions)
[![npm version](https://img.shields.io/npm/v/milkee.svg)](https://www.npmjs.com/package/milkee)
[![Downloads](https://img.shields.io/npm/dw/milkee.svg)](https://www.npmjs.com/package/milkee)
[![License](https://img.shields.io/npm/l/milkee.svg)](./LICENSE)

[English](./README.md) | **日本語**  

[![Milkee logo](./img/Milkee-logo.png)](https://milkee.org)  

[coffee.config.cjs](./temp/setup/coffee.config.cjs) を使ったシンプルな CoffeeScript ビルドツール ☕  

公式サイト: https://milkee.org  

## はじめに

### インストール

Milkee をインストールします:  

```bash
# npm
npm i -g milkee
# pnpm
pnpm add -g milkee
# yarn
yarn global add milkee
# bun
bun add -g milkee

# ローカルインストールの場合
npm i -D milkee
pnpm add -D milkee
```

CoffeeScript と `@babel/core` が必要です。  

> [!TIP]
> `options.transpile` が `true` の場合は `@babel/core` が必要です。

```bash
# グローバルインストール
npm i -g coffeescript @babel/core

# ローカルインストール
npm i -D coffeescript @babel/core
```

### セットアップ

`-s` (`--setup`) コマンドを実行すると、[coffee.config.cjs](./temp/setup/coffee.config.cjs) が生成されます！  

```bash
# グローバル
milkee -s

# ローカル
npx milkee -s
```

#### `coffee.config.cjs`

```js
/** @type {import('@milkee/d').Config} */

module.exports = {
  // コンパイルのエントリーポイント。
  // 単一ファイルまたはディレクトリ（例: 'src/' や 'src/app.coffee'）を指定できます。
  entry: 'src',
  // コンパイルされた JavaScript ファイルの出力先。
  // `options.join` が true の場合は単一ファイルパス（例: 'dist/app.js'）
  // `options.join` が false の場合はディレクトリ（例: 'dist'）を指定します。
  output: 'dist',
  // (任意) CoffeeScript コンパイラの追加オプション。
  // 利用可能な全オプションは `coffee --help` を参照してください。
  // Web: https://coffeescript.org/annotated-source/command.html
  options: {
    // 以下のオプションがサポートされています:
    // bare: false,
    // join: false,
    // map: false,
    // inlineMap: false,
    // noHeader: false,
    // transpile: false,
    // literate: false,
    // watch: false,
  },
  // (任意) Milkee ビルダーの追加オプション / プラグイン。
  milkee: {
    // 使用するパッケージマネージャー。ロックファイルや package.json から自動検出されます。
    // 対応: 'npm' | 'pnpm' | 'yarn' | 'bun' | 'aube' | 'nub' | 'vlt' | 'bower'
    // packageManager: 'npm',
    options: {
      // アップデート通知を無視します。
      // ignoreUpdate: false,
      // コンパイル前に出力ディレクトリをリセットします。
      // refresh: false,
      // コンパイル前に「実行しますか？」と確認します。
      // confirm: false,
      // コンパイル後に entry から output へ非 CoffeeScript ファイルをコピーします。（`options.join` が false の場合のみ有効）
      // copy: false,
    },
    plugins: []
  },
};
```

##### `options` (CoffeeScript コンパイラオプション)

これらのオプションは `coffee` コンパイラに直接渡されます。  

| オプション | 型 | デフォルト | 説明 |
| :--- | :--- | :--- | :--- |
| `bare` | `boolean` | `false` | トップレベルの関数ラッパーなしでコンパイルする |
| `join` | `boolean` | `false` | コンパイル前にソースを連結する |
| `map` | `boolean` | `false` | ソースマップを生成して `.js.map` として保存する |
| `inlineMap` | `boolean` | `false` | ソースマップを生成して出力内に直接含める |
| `noHeader` | `boolean` | `false` | "Generated by" ヘッダを抑制する |
| `transpile` | `boolean` | `false` | 生成された JavaScript を Babel に通す |
| `literate` | `boolean` | `false` | 標準入力をリテラート形式の CoffeeScript として扱う |
| `watch` | `boolean` | `false` | ファイル変更を監視してコマンドを再実行する |

[CoffeeScript - command.coffee](https://coffeescript.org/annotated-source/command.html)  

##### `milkee.packageManager` (パッケージマネージャー)

Milkee はロックファイルや `package.json` の `packageManager` フィールドからパッケージマネージャーを自動検出します。明示的に指定することもできます。  

| 検出元 | 優先度 |
| :--- | :--- |
| `coffee.config.cjs` の `milkee.packageManager` | 1位（最高） |
| `package.json` の `packageManager` フィールド | 2位 |
| ロックファイル（`pnpm-lock.yaml`、`yarn.lock`、`bun.lockb`、`vlt-lock.json`、`bower.json`） | 3位 |
| デフォルト | `npm` |

対応する値: `'npm'` `'pnpm'` `'yarn'` `'bun'` `'aube'` `'nub'` `'vlt'` `'bower'`

##### `milkee.options` (Milkee 固有オプション)

これらのオプションは Milkee の動作を制御します。  

| オプション | 型 | デフォルト | 説明 |
| :--- | :--- | :--- | :--- |
| `ignoreUpdate` | `boolean` | `false` | アップデート通知を無視する |
| `refresh` | `boolean` | `false` | コンパイル前に出力ディレクトリをリセットする |
| `confirm` | `boolean` | `false` | コンパイル前に「実行しますか？」と確認する |
| `copy` | `boolean` | `false` | コンパイル後に entry から output へ非 CoffeeScript ファイルをコピーする（`options.join` が false の場合のみ） |

##### `milkee.plugins` (Milkee 固有プラグイン)

Milkee の機能はプラグインで拡張できます。プラグインは、各コンパイル成功後に実行され、コンパイル済みファイルと設定にアクセスできる単純な関数です。

例:

```js
const myPlugin = require('./plugins/my-plugin.js');

module.exports = {
  // ...
  milkee: {
    plugins: [
      // この呼び出しは PluginExecutor を返します
      myPlugin({ option: 'value' }),
      // ...
    ]
  }
}
```

### コンパイル

Milkee は自動で [coffee.config.cjs](./temp/setup/coffee.config.cjs) を読み、`options` からコマンドを組み立ててコンパイルを開始します！  

```bash
# グローバル
milkee

# ローカル
npx milkee
```

## プラグインの作成

独自の Milkee プラグインを作成したいですか？プラグインのドキュメントを確認してください:  

- [English](./docs/PLUGIN.md)
- [日本語](./docs/PLUGIN-ja.md)

## 寄付

<a href="https://www.buymeacoffee.com/devuloper" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>

<a href='https://ko-fi.com/E1E41LY2C9' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
