open-index/open-npm huggingface dataset:
npm package: @mezzanine-stack/auth-core
Description: OAuth ブローカー向けの共通コアロジック。Cloudflare など特定ランタイムに依存しない関数と型を提供します。
Latest version: 0.1.0

# @mezzanine-stack/auth-core

OAuth ブローカー向けの共通コアロジック。Cloudflare など特定ランタイムに依存しない関数と型を提供します。

## 責務

- GitHub OAuth 認可 URL の組み立て
- 認可コード (`code`) から access token への交換
- popup 連携用 `postMessage` 文字列のエンコード
- Origin 許可判定（文字列リスト / KV ベース）
- CORS ヘッダ生成

## 主要 API

- `buildGitHubAuthorizeUrl(env, state)`
- `exchangeGitHubCode(env, code)`
- `encodeOAuthMessage(result)`
- `allowOrigin(origin, list)`
- `allowOriginFromKv(origin, kv)`
- `allowOriginWithFallback(origin, kv, list)`
- `buildCorsHeaders(origin, list, extra?)`

## 公開型

- `OAuthProvider` (`"github"`)
- `OAuthResult`
- `OAuthBrokerEnv`
- `GitHubOAuthEnv`

## 利用先

- `apps/auth-broker-cloudflare` の composition root から利用
npm package: @mezzanine-stack/captcha-turnstile
Description: [Cloudflare Turnstile](https://developers.cloudflare.com/turnstile/) を使う `CaptchaAdapter` の実装。`@mezzanine-stack/contact-core` の `CaptchaAdapter` contract を満たします。
Latest version: 0.1.0

# @mezzanine-stack/captcha-turnstile

[Cloudflare Turnstile](https://developers.cloudflare.com/turnstile/) を使う `CaptchaAdapter` の実装。`@mezzanine-stack/contact-core` の `CaptchaAdapter` contract を満たします。

## 使い方

```typescript
import { TurnstileCaptchaAdapter } from "@mezzanine-stack/captcha-turnstile";

const captcha = new TurnstileCaptchaAdapter({ secretKey: env.TURNSTILE_SECRET_KEY });
const result = await captcha.verify(token, ip);

if (!result.ok) {
  console.error("Captcha failed:", result.reason);
}
```

## フォームのフィールド名

Turnstile ウィジェットは `cf-turnstile-response` という名前でトークンを送信します。HTML フォームの場合:

```html
<div class="cf-turnstile" data-sitekey="YOUR_SITE_KEY"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
```

`contact-service-cloudflare` は `cf-turnstile-response` フィールドを自動で読み取ります。

## 戻り値 (`CaptchaResult`)

| フィールド | 型 | 説明 |
|---|---|---|
| `ok` | `boolean` | 検証成功の可否 |
| `reason` | `string?` | Turnstile `error-codes` の最初の値 |

## よくある error-codes

| コード | 説明 |
|---|---|
| `missing-input-response` | トークンが空 |
| `invalid-input-response` | トークンが無効または期限切れ |
| `timeout-or-duplicate` | タイムアウトまたは重複検証 |

## 環境変数

| 変数名 | 必須 | 説明 |
|---|---|---|
| `TURNSTILE_SECRET_KEY` | ✓ | Turnstile シークレットキー。Wrangler secret で設定。 |
npm package: @mezzanine-stack/cms-core
Description: CMS の Git provider 非依存なドメインロジックとシリアライザを提供するパッケージです。
Latest version: 0.1.0

# @mezzanine-stack/cms-core

CMS の Git provider 非依存なドメインロジックとシリアライザを提供するパッケージです。

## 責務

- CMS が扱うエントリ/アセットの共通型定義
- `GitProvider` 契約の定義
- Markdown エントリの serialize / deserialize
- JSON エントリの serialize / deserialize

## 主要 API

- 型: `GitProvider`, `CatalogEntry`, `EntryModel`, `SaveResult`, `AssetItem`
- Markdown: `serializeMarkdown()`, `deserializeMarkdown()`
- JSON: `serializeJson()`, `deserializeJson()`

## 依存関係

- `@mezzanine-stack/content-schema` の `MezzCollection` 型を参照

## 実装先アダプタ

- `@mezzanine-stack/git-provider-github`
- `@mezzanine-stack/git-provider-local`
npm package: @mezzanine-stack/cms-local-backend
Description: 開発専用のローカル CMS バックエンド。ワークスペースのファイルを直接読み書きし、各変更を Git コミットします。
Latest version: 0.2.1

# cms-local-backend

開発専用のローカル CMS バックエンド。ワークスペースのファイルを直接読み書きし、各変更を Git コミットします。

パッケージとして配布することを想定しており、**インストール先（このリポジトリでは `apps/cms-local-backend/`）に `.env` を置く前提にはしていません。** 環境変数は利用者のプロジェクト側で設定してください。

## 警告

- **認証なし**で同一マシン上のファイルにアクセスします。
- `127.0.0.1` のみで待ち受けますが、悪意のあるローカルページから悪用される可能性があるため、**本番では使わないでください**。

## 環境変数

| 変数 | 説明 |
|------|------|
| `CMS_LOCAL_BACKEND_ENABLE` | `1` のときのみ起動 |
| `CMS_LOCAL_WORKSPACE_ROOT` | 編集するサイトルートの**絶対パス** |
| `CMS_LOCAL_BACKEND_PORT` | 任意（既定: `8789`） |

## 起動

シェルで渡す例:

```bash
export CMS_LOCAL_BACKEND_ENABLE=1
export CMS_LOCAL_WORKSPACE_ROOT=/absolute/path/to/your-site
pnpm --filter @mezzanine-stack/cms-local-backend dev
```

利用者リポジトリの `.env` に `CMS_LOCAL_*` を書く場合（`PUBLIC_*` と同じファイルでも可）、**このプロセスに読み込ませる**必要があります。Astro の `.env` は別プロセス用のため、バックエンドには自動では効きません。

例:

- **このモノレポ:** ルートに `dotenv-cli` があり、`pnpm run cms:local-backend` で `apps/site-starter-astro/.env` を読み込んでからバックエンドを起動する。
- **手動:** 起動前に `export` する、または `direnv` で注入する。
- **他リポジトリ:** `pnpm add -D dotenv-cli` のうえ  
  `pnpm exec dotenv -e path/to/.env -- npx @mezzanine-stack/cms-local-backend`
- **Node 20.6+:** `node --env-file=path/to/.env` でラップする。

モノレポでサイトの `.env` に `CMS_LOCAL_*` と `PUBLIC_CMS_*` をまとめて書く運用にすると、Astro 用とバックエンド用の定義を一箇所にできます（バックエンド起動コマンドだけ上記のように `.env` を明示的に読み込む）。

ワークスペースは **Git リポジトリ**である必要があります。コミット作者は `git config user.name` / `user.email` に従います。

## CMS 側

`PUBLIC_CMS_AUTH_MODE=local` と `PUBLIC_CMS_LOCAL_BACKEND_URL=http://127.0.0.1:8789` を Astro アプリに設定してください。
npm package: @mezzanine-stack/contact-core
Description: Contact フォーム処理の共有コアロジック。HTTP ランタイムに非依存な純粋関数とユースケースを提供します。
Latest version: 0.1.0

# @mezzanine-stack/contact-core

Contact フォーム処理の共有コアロジック。HTTP ランタイムに非依存な純粋関数とユースケースを提供します。

## 責務

- 入力フィールドの sanitize とバリデーション
- honeypot / URL スパム検出
- `processContactSubmission()` — rate limit → validation → CAPTCHA → mail 送信の実行フロー
- 通知メールの件名・本文組み立て（`formatContactEmail`）
- adapter contract の型定義（`RateLimitAdapter` / `CaptchaAdapter` / `MailAdapter`）

## 設計原則

- HTTP レイヤーへの依存なし — `Request` / `Response` を一切扱わない
- adapter contract は全て `interface` として定義し、具体的な provider 実装は別 package に委ねる
- v1 の CAPTCHA 必須・honeypot 有効はデフォルト有効、`ContactSubmitOptions` で設定変更可能

## 主要 API

### `processContactSubmission()`

```typescript
import { processContactSubmission } from "@mezzanine-stack/contact-core";

const result = await processContactSubmission(
  input,          // ContactInput
  options,        // ContactSubmitOptions
  deps,           // { rateLimit, captcha, mail }
  context,        // { ip, ua }
);

switch (result.outcome) {
  case "accepted":          // 送信成功
  case "spam_silent":       // honeypot — 成功として扱う
  case "rate_limited":      // レート超過
  case "validation_failed": // バリデーションエラー (result.errorCode 参照)
  case "captcha_failed":    // CAPTCHA 検証失敗
  case "mail_failed":       // メール送信失敗
}
```

### `validateContact()`

```typescript
import { validateContact } from "@mezzanine-stack/contact-core";

const result = validateContact(input, { captchaRequired: false, maxUrlsInMessage: 2 });
```

### `formatContactEmail()`

```typescript
import { formatContactEmail } from "@mezzanine-stack/contact-core";

const mailParams = formatContactEmail(payload, context, {
  toEmails: ["owner@example.com"],
  fromEmail: "noreply@example.com",
  subjectPrefix: "[Contact]",
});
```

## adapter contract

各 adapter は以下のインタフェースを実装します。

```typescript
interface RateLimitAdapter {
  check(ip: string, ua: string): Promise<RateLimitResult>;
}

interface CaptchaAdapter {
  verify(token: string, ip: string): Promise<CaptchaResult>;
}

interface MailAdapter {
  send(params: MailParams): Promise<MailSendResult>;
}
```

provider 実装:
- `@mezzanine-stack/mail-resend` — Resend メール adapter
- `@mezzanine-stack/captcha-turnstile` — Cloudflare Turnstile adapter
- `@mezzanine-stack/ratelimit-kv` — Cloudflare KV rate limit adapter

## ContactSubmitOptions

| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
| `toEmails` | `string[]` | 必須 | 通知先メールアドレス |
| `fromEmail` | `string` | 必須 | 送信元メールアドレス |
| `subjectPrefix` | `string?` | undefined | 件名プレフィックス |
| `captchaRequired` | `boolean?` | `true` | CAPTCHA トークン必須 |
| `honeypotEnabled` | `boolean?` | `true` | honeypot フィールド保護 |
| `maxUrlsInMessage` | `number?` | `3` | メッセージ内 URL 許容数 |
npm package: @mezzanine-stack/content-document
Description: CMS プレビューや描画共通化向けの Document Model 変換ロジック。Markdown と frontmatter から正規化済みドキュメントを生成します。
Latest version: 0.1.0

# @mezzanine-stack/content-document

CMS プレビューや描画共通化向けの Document Model 変換ロジック。Markdown と frontmatter から正規化済みドキュメントを生成します。

## 責務

- Markdown 本文を `BodyNode` / `InlineNode` へ変換
- frontmatter + body から `BlogDocument` を生成
- frontmatter + body から `MarkdownPageDocument` を生成
- CMS / Astro 共通で扱える `CmsDocument` 型を提供

## 主要 API

- `parseMarkdownToBodyNodes(markdown)`
- `toBlogDocument({ frontmatter, body })`
- `toMarkdownPageDocument({ frontmatter, body })`

## 公開型

- `InlineNode`
- `BodyNode`
- `EntrySource`
- `BlogDocument`
- `MarkdownPageDocument`
- `CmsDocument`

## 依存ライブラリ

- `unified`
- `remark-parse`
npm package: @mezzanine-stack/content-schema
Description: CMS と Astro が共有するコンテンツスキーマ DSL の正本パッケージです。
Latest version: 0.1.0

# @mezzanine-stack/content-schema

CMS と Astro が共有するコンテンツスキーマ DSL の正本パッケージです。

## 責務

- フィールド型 (`MezzField`) とコレクション型 (`MezzCollection`) の定義
- フィールドビルダー関数の提供
- Astro Content Collections 用 Zod スキーマ生成
- CMS フォーム定義生成 (`toFormFields`)
- 標準コレクションプリセット（works / blog / gallery / markdown / pages）

## 主要 API

### フィールドビルダー

- `text`, `richText`, `date`, `boolean`, `image`, `file`, `select`, `list`, `object`, `relation`

### ジェネレーター

- `toAstroSchema()`
- `toAstroFileEntrySchema()`
- `toAstroFileCollectionSchemas()`
- `toFormFields()`

### 標準コレクション

- `worksCollection`
- `blogCollection`
- `galleryCollection`
- `markdownCollection`
- `pagesCollection`

## 依存ライブラリ

- `zod`
npm package: @mezzanine-stack/create-mezzanine
Description: Mezzanine Platform のプロジェクト生成・運用補助 CLI です。
Latest version: 0.2.2

# create-mezzanine

Mezzanine Platform のプロジェクト生成・運用補助 CLI です。

## 主な利用ケース

- 顧客向けの Astro 単体スターターを新規作成する
- Contact service 用の `wrangler.toml [vars]` テンプレートを出力する
- Managed ops 用の `customer-manifest.yaml` テンプレートを出力する
- マルチテナント運用で KV 登録用 JSON を作る / 登録済みテナントを確認する

## 提供コマンド一覧

- `create-starter`
- `contact-env`
- `manifest-init`
- `tenant-add`
- `tenant-list`

## インストールせずに実行

```bash
npx @mezzanine-stack/create-mezzanine@latest <command> [options]
npx @mezzanine-stack/create-mezzanine@latest <project-name> [create-starter options]
```

`create-starter` は基幹コマンドのため、省略した場合は `create-starter` として扱われます。

## コマンド詳細

### `create-starter`

Astro 単体（npm）で動作するスタータープロジェクトを生成します。  
`@mezzanine-stack/*` 依存は生成物の `vendor/` に同梱されます。

```bash
npx @mezzanine-stack/create-mezzanine@latest acme-site --hosting cloudflare

# 明示的に書く場合
npx @mezzanine-stack/create-mezzanine@latest create-starter \
  acme-site \
  --hosting cloudflare \
  --name acme-site
```

または `--output` 指定でも生成できます。

```bash
npx @mezzanine-stack/create-mezzanine@latest create-starter \
  --output ../acme-site \
  --hosting cloudflare
```

オプション:

- `project-name`: 実行ディレクトリ配下に作る生成先ディレクトリ名（`--output` 未指定時）
- `--output <dir>`: 出力先ディレクトリ（`project-name` の代替）
- `--hosting <cloudflare|vercel|netlify|static>`: hosting 設定テンプレート
- `--name <project-name>`: 生成する `package.json` の `name`（省略時は `project-name` を利用）
- `--smoke-test`: 生成後に `npm install` / `npm run build` を実行

生成される主なファイル:

- `package.json`（npm scripts + `cms:local-backend` 含む）
- `astro.config.mjs`（vendor alias 設定済み）
- `vendor/@mezzanine-stack/*`（必要 package 同梱）
- `env.cms-local.example`（local backend 用 env 例）

### `contact-env`

`apps/contact-service-cloudflare` 向けの `wrangler.toml [vars]` テンプレートを出力します。

```bash
npx @mezzanine-stack/create-mezzanine@latest contact-env --output ./contact-vars.example.toml
```

オプション:

- `--output <path>`: ファイル出力先（省略時は標準出力）

### `manifest-init`

Managed ops 向け `customer-manifest.yaml` テンプレートを出力します。

```bash
npx @mezzanine-stack/create-mezzanine@latest manifest-init --tenant acme --output ./customer-manifest.yaml
```

オプション:

- `--tenant <id>`: `tenantId` 初期値（省略時はプレースホルダー）
- `--output <path>`: ファイル出力先（省略時は標準出力）

### `tenant-add`

TENANT_CONFIG_KV に投入する顧客設定 JSON を生成します。

```bash
npx @mezzanine-stack/create-mezzanine@latest tenant-add \
  --origin https://acme.com \
  --to owner@acme.com \
  --from noreply@your-domain.com \
  --success https://acme.com/contact/thanks \
  --tenant acme \
  --output tenant-acme.json
```

オプション:

- 必須: `--origin`, `--to`, `--from`, `--success`
- 任意: `--tenant`, `--subject`, `--failure`, `--output`

### `tenant-list`

Wrangler CLI を使って TENANT_CONFIG_KV の登録済みテナントを一覧表示します。

```bash
npx @mezzanine-stack/create-mezzanine@latest tenant-list --namespace-id <KV_NAMESPACE_ID>
```

オプション:

- `--namespace-id <id>`: Cloudflare KV namespace id（必須）

## 開発者向け

```bash
pnpm --filter @mezzanine-stack/create-mezzanine typecheck
pnpm --filter @mezzanine-stack/create-mezzanine test
```
npm package: @mezzanine-stack/css
Description: Mezzanine 共通スタイルレイヤを提供する CSS パッケージです。
Latest version: 0.1.0

# @mezzanine-stack/css

Mezzanine 共通スタイルレイヤを提供する CSS パッケージです。

## 提供ファイル

- `@mezzanine-stack/css/index.css`
- `@mezzanine-stack/css/field-renderer.css`
- `@mezzanine-stack/css/markdown.css`

## 依存関係

- `@mezzanine-stack/tokens` の CSS 変数を前提に設計

## 利用例

```css
@import "@mezzanine-stack/tokens/tokens.core.css";
@import "@mezzanine-stack/tokens/tokens.brand.defaults.css";
@import "@mezzanine-stack/css/index.css";
@import "@mezzanine-stack/css/markdown.css";
```
npm package: @mezzanine-stack/git-provider-github
Description: `@mezzanine-stack/cms-core` の `GitProvider` を GitHub REST API で実装するアダプタです。
Latest version: 0.1.0

# @mezzanine-stack/git-provider-github

`@mezzanine-stack/cms-core` の `GitProvider` を GitHub REST API で実装するアダプタです。

## 責務

- Markdown エントリの一覧/取得/保存/削除
- `public/uploads/` 配下のアセット一覧取得
- 画像・ファイルのアップロード
- GitHub blob SHA を使った楽観的排他制御

## 主要 API

- `GitHubProvider`
- `GitHubProviderOptions`
- `GitHubApiError`

## 利用例

```typescript
import { GitHubProvider } from "@mezzanine-stack/git-provider-github";

const provider = new GitHubProvider({
  token: process.env.GITHUB_TOKEN!,
  owner: "your-org",
  repo: "your-site-repo",
  branch: "main",
});
```

## 依存関係

- `@mezzanine-stack/cms-core`
npm package: @mezzanine-stack/git-provider-local
Description: `cms-core` の `GitProvider` を、ローカル専用 HTTP バックエンド（`apps/cms-local-backend`）経由で実装するパッケージ。ブラウザから利用し、`revision` はサーバ定義の SHA-256(hex) です（GitHub blob SHA とは異なる）。
Latest version: 0.1.0

# @mezzanine-stack/git-provider-local

`cms-core` の `GitProvider` を、ローカル専用 HTTP バックエンド（`apps/cms-local-backend`）経由で実装するパッケージ。ブラウザから利用し、`revision` はサーバ定義の SHA-256(hex) です（GitHub blob SHA とは異なる）。

詳細は `docs/adr/0006-cms-local-backend-planning.md` を参照。
npm package: @mezzanine-stack/mail-resend
Description: [Resend](https://resend.com) を使う `MailAdapter` の実装。`@mezzanine-stack/contact-core` の `MailAdapter` contract を満たします。
Latest version: 0.1.0

# @mezzanine-stack/mail-resend

[Resend](https://resend.com) を使う `MailAdapter` の実装。`@mezzanine-stack/contact-core` の `MailAdapter` contract を満たします。

## 使い方

```typescript
import { ResendMailAdapter } from "@mezzanine-stack/mail-resend";

const mailer = new ResendMailAdapter({ apiKey: process.env.RESEND_API_KEY });
const result = await mailer.send({
  to: ["owner@example.com"],
  from: "noreply@example.com",
  subject: "[Contact] Contact: Alice",
  text: "...",
  replyTo: "alice@example.com",
});

if (!result.ok) {
  console.error("Mail failed:", result.reason);
}
```

## 戻り値 (`MailSendResult`)

| フィールド | 型 | 説明 |
|---|---|---|
| `ok` | `boolean` | 送信成功の可否 |
| `providerMessageId` | `string?` | Resend が返すメッセージ ID |
| `reason` | `string?` | 失敗時のエラー理由（Resend API メッセージまたは `http_<status>`） |

## 制約

- テキストメール（`text`）のみ。HTML メールは未対応。
- `reply_to` には投稿者のメールアドレスを設定します。
- Resend API は `https://api.resend.com/emails` への `POST` で送信します。
- API キーは Wrangler secret (`wrangler secret put RESEND_API_KEY`) で設定します。

## 環境変数

| 変数名 | 必須 | 説明 |
|---|---|---|
| `RESEND_API_KEY` | ✓ | Resend API キー |
npm package: @mezzanine-stack/ratelimit-kv
Description: Cloudflare KV を使う `RateLimitAdapter` の実装。2 窓（1 分 / 10 分）のレート制限を IP ベースで行います。
Latest version: 0.1.0

# @mezzanine-stack/ratelimit-kv

Cloudflare KV を使う `RateLimitAdapter` の実装。2 窓（1 分 / 10 分）のレート制限を IP ベースで行います。

## 使い方

```typescript
import { KvRateLimitAdapter } from "@mezzanine-stack/ratelimit-kv";

const limiter = new KvRateLimitAdapter({
  kv: env.RATE_LIMIT_KV,      // KVNamespace binding
  perMinute: 5,
  per10Minutes: 20,
});

const result = await limiter.check(ip, ua);
if (!result.allowed) {
  // result.retryAfterSeconds には推奨待機秒数が入る
}
```

## 戻り値 (`RateLimitResult`)

| フィールド | 型 | 説明 |
|---|---|---|
| `allowed` | `boolean` | リクエストを許可するか |
| `retryAfterSeconds` | `number?` | 超過した窓に応じた待機秒数 (60 または 600) |

## KV binding のセットアップ

`wrangler.toml` に KV namespace を設定します:

```toml
[[kv_namespaces]]
binding = "RATE_LIMIT_KV"
id = "YOUR_KV_NAMESPACE_ID"
```

KV namespace の作成:
```bash
wrangler kv namespace create "RATE_LIMIT_KV"
```

## 設計上の注意

- Cloudflare KV は **eventually consistent** です。高トラフィック下では複数 edge に同時にリクエストが届くと、カウントが若干低く見積もられる場合があります。これはベストエフォートの防御として許容しています。
- キーは `rl:{ip}:{ua_hash}:m:{bucket}` / `rl:{ip}:{ua_hash}:t:{bucket}` 形式。UA ハッシュで NAT 背後の複数ユーザーを軽く識別します。
- TTL は 1 分窓 90 秒、10 分窓 700 秒で設定され、古いエントリは自動削除されます。

## 環境変数 (wrangler.toml)

| 変数名 | デフォルト | 説明 |
|---|---|---|
| `RATE_PER_MINUTE` | `5` | 1 分あたり上限リクエスト数 |
| `RATE_PER_10_MINUTES` | `20` | 10 分あたり上限リクエスト数 |
npm package: @mezzanine-stack/tokens
Description: Mezzanine UI のデザイントークン（CSS カスタムプロパティ）を提供するパッケージです。
Latest version: 0.1.0

# @mezzanine-stack/tokens

Mezzanine UI のデザイントークン（CSS カスタムプロパティ）を提供するパッケージです。

## 提供ファイル

- `@mezzanine-stack/tokens/tokens.core.css`
- `@mezzanine-stack/tokens/tokens.brand.defaults.css`
- `@mezzanine-stack/tokens/tokens.brand.client.css`

## 役割

- `tokens.core.css`: タイポグラフィ、スペーシング、カラーなどの基礎トークン
- `tokens.brand.defaults.css`: デフォルトブランド値
- `tokens.brand.client.css`: 顧客ブランド上書き用レイヤ

## 利用先

- `@mezzanine-stack/css`
- `@mezzanine-stack/ui`
npm package: @mezzanine-stack/ui
Description: Astro ベースの共通 UI コンポーネント群です。見た目の基盤は `@mezzanine-stack/tokens` と `@mezzanine-stack/css` に依存します。
Latest version: 0.1.0

# @mezzanine-stack/ui

Astro ベースの共通 UI コンポーネント群です。見た目の基盤は `@mezzanine-stack/tokens` と `@mezzanine-stack/css` に依存します。

## 設計方針

- Astro コンポーネントを package exports で直接公開
- デザイントークンと共通 CSS を前提に、アプリ側で組み合わせて利用
- `astro` は `peerDependencies` としてホストアプリ側で解決

## 主なコンポーネント

- レイアウト: `Container`, `Section`, `Header`, `Footer`
- フォーム: `Field`, `Input`, `Textarea`, `Select`, `Checkbox`, `Radio`
- ナビゲーション: `Breadcrumbs`, `Pagination`, `Tabs`
- フィードバック: `Alert`, `EmptyState`, `Toaster`, `Modal`, `Tooltip`
- 表示: `Heading`, `Text`, `Tag`, `Card`, `Table`, `Accordion`, `Button`

## 利用例

```astro
---
import Container from "@mezzanine-stack/ui/Container.astro";
import Heading from "@mezzanine-stack/ui/Heading.astro";
---

<Container>
  <Heading level={2}>Hello</Heading>
</Container>
```
npm package: @mezzfi/sdk
Description: 🛠 An SDK for building applications on top of Mezzswap.
Latest version: 3.0.3

# Uniswap SDK

[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![Actions Status](https://github.com/Uniswap/uniswap-sdk/workflows/CI/badge.svg)](https://github.com/Uniswap/uniswap-sdk)
[![npm version](https://img.shields.io/npm/v/@uniswap/sdk/latest.svg)](https://www.npmjs.com/package/@uniswap/sdk/v/latest)
[![npm bundle size (scoped version)](https://img.shields.io/bundlephobia/minzip/@uniswap/sdk/latest.svg)](https://bundlephobia.com/result?p=@uniswap/sdk@latest)

In-depth documentation on this SDK is available at [uniswap.org](https://uniswap.org/docs/v2/SDK/getting-started/).

## Running tests

To run the tests, follow these steps. You must have at least node v10 and [yarn](https://yarnpkg.com/) installed.

First clone the repository:

```sh
git clone https://github.com/Uniswap/uniswap-sdk.git
```

Move into the uniswap-sdk working directory

```sh
cd uniswap-sdk/
```

Install dependencies

```sh
yarn install
```

Run tests

```sh
yarn test
```

You should see output like the following:

```sh
yarn run v1.22.4
$ tsdx test
 PASS  test/constants.test.ts
 PASS  test/pair.test.ts
 PASS  test/fraction.test.ts
 PASS  test/miscellaneous.test.ts
 PASS  test/entities.test.ts
 PASS  test/trade.test.ts

Test Suites: 1 skipped, 6 passed, 6 of 7 total
Tests:       3 skipped, 82 passed, 85 total
Snapshots:   0 total
Time:        5.091s
Ran all test suites.
✨  Done in 6.61s.
```
npm package: @mezzoforte/eslint-config-mezzoforte
Description: Shared ESLint config (for smaller or new projects).
Author: Joonas Kallunki
Latest version: 2.0.3

# eslint-config-mezzoforte

Shared ESLint config (for smaller or new projects).

## Usage

```sh
yarn add -D eslint prettier eslint-plugin-jest @mezzoforte/eslint-config-mezzoforte@latest
```

### `.eslintrc.json`:

```json
{
  "extends": ["@mezzoforte/eslint-config-mezzoforte"],
  "parserOptions": {
    "project": "./tsconfig.json"
  }
}
```

After that you can customize your project specific `"rules":{}`. You might turn
off rules that the project does not need.

IF you need to see the current used rules run:

`npx eslint --ext .js,.jsx,.ts,.tsx --print-config [path-to-one-of-your-source-files]`.

### `prettier.config.js`:

```js
module.exports = require('@mezzoforte/eslint-config-mezzoforte/prettier.config');
```

Add to your `.eslintignore` or create it with:

```txt
prettier.config.js
```

### `package.json` -scripts, for example:

```json
  "lint": "eslint './src/**/*' --ext .js,.jsx,.ts,.tsx",
  "lint:nowarnings": "eslint --quiet './src/**/*' --ext .js,.jsx,.ts,.tsx",
  "lint:fix": "eslint --fix './src/**/*' --ext .js,.jsx,.ts,.tsx",
  "prettier": "prettier --list-different src/",
  "prettier:fix": "prettier --write src/",
```

Multiple dirs for ESLint ex. `'./{src,scripts}/**/*'`

## Husky and git-hooks

```sh
yarn add -D husky@4.3.8 git-format-staged npm-run-all
```

### `.huskyrc.js`-example:

```js
module.exports = {
  hooks: {
    'pre-commit':
      "git-format-staged -f 'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"' '*.js' '*.jsx' '*.ts' '*.tsx'",
    'pre-push': 'npm-run-all lint test',
  },
};
```

## React

If you are developing with React install:

```sh
yarn add -D eslint-config-react-app @typescript-eslint/eslint-plugin@^5.24.0 @typescript-eslint/parser@^5.24.0 babel-eslint@^10.0.0 eslint@^8.15.0 eslint-plugin-flowtype@^5.2.0 eslint-plugin-import@^2.26.0 eslint-plugin-jsx-a11y@^6.5.1 eslint-plugin-react@^7.29.4 eslint-plugin-react-hooks@^4.0.0
```

And then in your `.eslintrc.json`use:

```json
{
  "extends": ["react-app", "@mezzoforte/eslint-config-mezzoforte"]
}
```

## Releases

Update 'package.json' version-field and run `npm login` (creds at 1password)
then `npm publish --access public`
npm package: @mezzoforte/lodash-webpack-plugin
Description: Smaller modular Lodash builds.
Author: John-David Dalton
Latest version: 0.11.5-webpack5

# lodash-webpack-plugin

Create smaller Lodash builds by replacing [feature sets](#feature-sets) of modules
with [noop](https://lodash.com/docs#noop), [identity](https://lodash.com/docs#identity),
or simpler alternatives.

This plugin complements [babel-plugin-lodash](https://www.npmjs.com/package/babel-plugin-lodash)
by shrinking its cherry-picked builds even further!

DISCLAIMER: Using this plugin without enabling the proper feature sets may cause lodash functions to behave in unexpected ways. Methods may appear to work, however they might return incorrect results.

## Install

```shell
$ npm i --save lodash
$ npm i --save-dev lodash-webpack-plugin babel-core babel-loader babel-plugin-lodash babel-preset-env webpack
```

## Example

![demo](https://cloud.githubusercontent.com/assets/4303/15064867/2c5420b0-130e-11e6-8293-5037d359851f.gif)

## Usage

###### webpack.config.js
```js
var LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
var webpack = require('webpack');

module.exports = {
  'module': {
    'rules': [{
      'use': 'babel-loader',
      'test': /\.js$/,
      'exclude': /node_modules/,
      'options': {
        'plugins': ['lodash'],
        'presets': [['env', { 'modules': false, 'targets': { 'node': 4 } }]]
      }
    }]
  },
  'plugins': [
    new LodashModuleReplacementPlugin,
    new webpack.optimize.UglifyJsPlugin
  ]
};
```

Opt-in to features with an options object:
```js
new LodashModuleReplacementPlugin({
  'collections': true,
  'paths': true
});
```

## Feature Sets

The following features are removed by default _(biggest savings first)_:

| Feature | Description |
|:---|:---|
| `shorthands`   | Iteratee shorthands for `_.property`, `_.matches`, & `_.matchesProperty`. |
| `cloning`      | Support “clone” methods & cloning source objects. |
| `currying`     | Support “curry” methods. |
| `caching`      | Caches for methods like `_.cloneDeep`, `_.isEqual`, & `_.uniq`. |
| `collections`  | Support objects in “Collection” methods. |
| `exotics`      | Support objects like buffers, maps, sets, symbols, typed arrays, etc. |
| `guards`       | Guards for host objects, sparse arrays, & other edge cases. |
| `metadata`     | Metadata to reduce wrapping of bound, curried, & partially applied functions.<br>_(requires `currying`)_ |
| `deburring`    | Support deburring letters. |
| `unicode`      | Support Unicode symbols. |
| `chaining`     | Components to support chain sequences. |
| `memoizing`    | Support `_.memoize` & memoization. |
| `coercions`    | Support for coercing values to integers, numbers, & strings. |
| `flattening`   | Support “flatten” methods & flattening rest arguments. |
| `paths`        | Deep property path support for methods like `_.get`, `_.has`, & `_.set`. |
| `placeholders` | Argument placeholder support for “bind”, “curry”, & “partial” methods.<br>_(requires `currying`)_ |
npm package: @mf-framework/cli
Description: [![oclif](https://img.shields.io/badge/cli-oclif-brightgreen.svg)](https://oclif.io) [![Version](https://img.shields.io/npm/v/@mf-framework/cli.svg)](https://npmjs.org/package/@mf-framework/cli) [![Downloads/week](https://img.shields.io/npm/dw/@mf-framewo
Author: marcelovicentegc @marcelovicentegc
Latest version: 0.0.22

# @mf-framework/cli

[![oclif](https://img.shields.io/badge/cli-oclif-brightgreen.svg)](https://oclif.io)
[![Version](https://img.shields.io/npm/v/@mf-framework/cli.svg)](https://npmjs.org/package/@mf-framework/cli)
[![Downloads/week](https://img.shields.io/npm/dw/@mf-framework/cli.svg)](https://npmjs.org/package/@mf-framework/cli)
[![License](https://img.shields.io/npm/l/@mf-framework/cli.svg)](https://github.com/marcelovicentegc/microfrontend-framework/blob/master/package.json)

<!-- toc -->
* [@mf-framework/cli](#mf-frameworkcli)
* [Usage](#usage)
* [Commands](#commands)
<!-- tocstop -->

# Usage

<!-- usage -->
```sh-session
$ npm install -g @mf-framework/cli
$ mf-framework-cli COMMAND
running command...
$ mf-framework-cli (-v|--version|version)
@mf-framework/cli/0.0.21 darwin-arm64 node-v16.13.0
$ mf-framework-cli --help [COMMAND]
USAGE
  $ mf-framework-cli COMMAND
...
```
<!-- usagestop -->

# Commands

<!-- commands -->
* [`mf-framework-cli create`](#mf-framework-cli-create)
* [`mf-framework-cli help [COMMAND]`](#mf-framework-cli-help-command)
* [`mf-framework-cli install [TENANT]`](#mf-framework-cli-install-tenant)
* [`mf-framework-cli publish`](#mf-framework-cli-publish)

## `mf-framework-cli create`

creates a new mf-app

```
USAGE
  $ mf-framework-cli create

OPTIONS
  --poc=nextjs-run-time-integration|nextjs-build-time-integration

EXAMPLE
  $ mf-framework-cli create
```

_See code: [src/commands/create.ts](https://github.com/marcelovicentegc/microfrontend-framework/blob/v0.0.21/src/commands/create.ts)_

## `mf-framework-cli help [COMMAND]`

display help for mf-framework-cli

```
USAGE
  $ mf-framework-cli help [COMMAND]

ARGUMENTS
  COMMAND  command to show help for

OPTIONS
  --all  see all commands in CLI
```

_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v3.2.13/src/commands/help.ts)_

## `mf-framework-cli install [TENANT]`

installs a published mf-app on a tenant

```
USAGE
  $ mf-framework-cli install [TENANT]

ARGUMENTS
  TENANT  (glowing-fiesta|vigilant-octo-sniffle|redesigned-robot) [default: glowing-fiesta] output file

EXAMPLE
  $ mf-framework-cli install
```

_See code: [src/commands/install.ts](https://github.com/marcelovicentegc/microfrontend-framework/blob/v0.0.21/src/commands/install.ts)_

## `mf-framework-cli publish`

publishes a patched version of the mf-app

```
USAGE
  $ mf-framework-cli publish

EXAMPLE
  $ mf-framework-cli publish
```

_See code: [src/commands/publish.ts](https://github.com/marcelovicentegc/microfrontend-framework/blob/v0.0.21/src/commands/publish.ts)_
<!-- commandsstop -->