# ImportGuard

Shopifyの商品CSVを投入する前に、現行エクスポートと投入予定ファイルをブラウザ内で比較するローカル診断ツールです。ファイルをサーバーへ送らず、Shopifyへの接続や書き込みも行いません。

## 公開版

公開版もCSVをブラウザ内だけで処理します。診断対象のCSVをImportGuardのサーバーへ送信する機能はありません。

**公開URL:** Cloudflare Pagesへの移行完了後に更新します。

公開用ファイルは次のコマンドで`dist/`へ生成します。テスト、実装計画、進捗記録は公開物へ含めません。

ImportGuardはCSV投入前の無料診断を担当し、仕入先データから商品CSV自体を作る必要がある利用者にはCatalogBridgeの受付条件と[ココナラの相談窓口](https://coconala.com/services/4393943)を案内します。有料化を検証する場合は、詳細診断の単発販売または制作会社向け複数案件利用を候補とし、無料版のCSVを外部送信しない性質は維持します。

```powershell
npm run build
```

## 使い方

Node.jsまたはPythonで静的HTTPサーバーを起動します。

```powershell
cd products/import-guard
npx --yes serve .
```

依存を追加したくない場合は、Python標準機能でも起動できます。

```powershell
cd products/import-guard
python -m http.server 4173
```

表示されたURLをブラウザで開き、次の順で操作します。

1. Shopifyからエクスポートした現行の商品CSVを選ぶ。
2. 投入予定の商品CSVを選ぶ。
3. Shopifyで選ぶ予定の「一致するhandleの商品を上書き」設定を合わせる。
4. 「投入前診断を実行」を押す。
5. CriticalとWarningを確認し、必要ならMarkdownレポートを保存する。

「サンプルで試す」では、空欄上書き、option変更、新規商品を含む架空データを読み込みます。

## 検出する内容

- 上書きONで、既存の非空値が空欄になる列
- 同一SKUでのoption値変更（variant ID再生成リスク）
- SKU・価格・重量等のvariant関連列に対してOption1 name/value列が不足するケース
- 重複SKU、handle欠損、variantを一意に対応付けできないケース
- Shopify標準の追加画像行はvariant比較から除外
- 必須ヘッダー欠損、別名列の競合、比較元のない列
- 上書きOFFで無視される既存handle
- ImportGuardが意味を確認していない列
- 投入CSVに現れない現行商品（「CSVでは一括削除されない」と区別）

## 対応範囲と制約

- Shopifyの商品CSVだけが対象です。在庫CSV、顧客CSV、注文CSVは対象外です。
- 従来の `Handle` / `Variant SKU` 等と、新しい `URL handle` / `SKU` 等の主要列名に対応します。
- 15MBを超えるファイルはShopifyの上限に合わせて拒否します。
- ブラウザ停止を避けるため、20,000データ行・100列・1セル200,000文字を診断上限とします。
- 構文エラーと検出事項は表示件数を制限し、上限到達時は停止対象として案内します。
- Metafieldや地域別価格等は存在を表示しますが、値の意味までは診断しません。
- 現行CSV取得後に店舗側が変更された場合、その差は検出できません。
- 実際のインポート挙動を再現するものではなく、安全や復旧を保証しません。

診断後も、商品データをバックアップし、開発ストアまたは少量の商品でインポートを試してください。

## 根拠にした公式仕様

- [Shopify: Importing products using a CSV file](https://help.shopify.com/en/manual/products/import-export/import-products)
  - 上書きONでは、CSVに含まれる非必須列の空欄が既存値を空欄にする。
  - CSVに含まれない非必須列は既存値が維持される。
  - SKU列を含めOption列を欠く場合、variant optionが削除される例がある。
  - option値変更は既存variant IDを削除し、新しいIDを作る。
  - 商品CSVは商品の一括削除には使えない。
  - 商品CSVは15MB以下。
- [Shopify: Exporting products](https://help.shopify.com/en/manual/products/import-export/export-products)
  - 編集前に商品CSVをエクスポートできる。
  - 並び替えたCSVの再投入は画像との対応を壊す可能性がある。

仕様は変更される可能性があります。実際の利用前に公式仕様を再確認してください。

## 開発・検証

```powershell
npm test
npm run check
npm run build
```

外部ライブラリは使用していません。CSV解析・診断ロジックは `src/core.mjs`、DOM操作は `src/app.mjs` に分離しています。
