Oh MyUtils

.envエディター - 環境ファイルの解析、検証、比較&変換 オンライン

.envファイルを解析、検証、比較、変換。構文チェック、サイドバイサイド比較、.env/JSON/YAML/Docker Compose間のフォーマット変換 — 100%クライアントサイド処理。

.envの内容

よくある質問

.envファイルエディターとは?

.envファイルエディターは、開発者が.env(dotenv)ファイルを解析、検証、編集、ソート、比較、変換できるオンラインツールです。構文検証、アルファベット順ソート、2つの.envファイルのサイドバイサイド比較、.env/JSON/YAML/Docker Compose間のフォーマット変換を提供し、すべて100%ブラウザ上で実行されます。

この.envエディターの使い方は?

1. 編集タブ:.envファイルの内容を貼り付けます。ツールが即座に検証します。2. 比較タブ:2つの.envファイルをサイドバイサイドパネルに貼り付けます。3. 変換タブ:サポートされている形式でコンテンツを貼り付け、出力形式を選択します。

データは安全ですか?

データは100%安全で、ブラウザから離れることはありません。すべての処理は完全にクライアントサイドJavaScriptで行われます。

どのような検証チェックを行いますか?

バリデーターは以下を確認します:(1) 無効な変数名。(2) セパレーター欠落。(3) 重複キー。(4) 空の値。(5) 閉じられていない引用符。各問題には行番号が含まれます。

.envファイルの比較はどのように機能しますか?

比較ツールは2つの.envファイルを分析し、各変数を4つのグループに分類します:ファイルAのみ(赤)、ファイルBのみ(緑)、異なる値(黄)、同一(グレー)。

どのフォーマット間で変換できますか?

.env、JSON、YAML、Docker Compose environment間の双方向変換をサポートしています。コンバーターは入力形式を自動検出します。

.envファイルをアルファベット順にソートできますか?

はい、ソート機能はすべての変数をキー名でアルファベット順(A-ZまたはZ-A)に並べ替えます。コメントは保持され、次の変数に紐づけられます。

コード例

// .env File Parser, Validator, and Converter

function parseEnv(content) {
  const lines = content.split('\n');
  const entries = [];
  const errors = [];
  const warnings = [];
  const seen = new Map();

  for (let i = 0; i < lines.length; i++) {
    const lineNum = i + 1;
    const raw = lines[i];
    const trimmed = raw.trim();

    if (!trimmed || trimmed.startsWith('#')) continue;

    const eqIdx = trimmed.indexOf('=');
    if (eqIdx === -1) {
      errors.push({ line: lineNum, message: "Missing '=' separator" });
      continue;
    }

    const key = trimmed.slice(0, eqIdx).trim();
    let value = trimmed.slice(eqIdx + 1);

    if (!key) {
      errors.push({ line: lineNum, message: 'Empty key name' });
      continue;
    }
    if (!/^[A-Za-z_]\w*$/.test(key)) {
      errors.push({ line: lineNum, message: `Invalid name "${key}"` });
      continue;
    }

    // Handle quoted values
    if (value.startsWith('"') && value.endsWith('"')) {
      value = value.slice(1, -1).replace(/\\n/g, '\n');
    } else if (value.startsWith("'") && value.endsWith("'")) {
      value = value.slice(1, -1);
    } else {
      const commentIdx = value.indexOf(' #');
      if (commentIdx !== -1) value = value.slice(0, commentIdx);
      value = value.trim();
    }

    if (seen.has(key)) {
      warnings.push({ line: lineNum, message: `Duplicate key "${key}"` });
    }
    seen.set(key, lineNum);
    entries.push({ key, value, line: lineNum });
  }

  return { entries, errors, warnings };
}

function envToJson(entries, indent = 2) {
  const obj = {};
  for (const { key, value } of entries) obj[key] = value;
  return JSON.stringify(obj, null, indent);
}

function diffEnv(entriesA, entriesB) {
  const mapA = new Map(entriesA.map(e => [e.key, e.value]));
  const mapB = new Map(entriesB.map(e => [e.key, e.value]));
  const onlyInA = [], onlyInB = [], different = [], identical = [];

  for (const [key, valA] of mapA) {
    if (!mapB.has(key)) onlyInA.push(key);
    else if (mapB.get(key) !== valA) different.push({ key, valueA: valA, valueB: mapB.get(key) });
    else identical.push(key);
  }
  for (const key of mapB.keys()) {
    if (!mapA.has(key)) onlyInB.push(key);
  }
  return { onlyInA, onlyInB, different, identical };
}

// Usage
const result = parseEnv('DB_HOST=localhost\nDB_PORT=5432\nAPI_KEY=sk_live_abc');
console.log('Entries:', result.entries.length);
console.log('JSON:', envToJson(result.entries));

関連ツール