UNPKG

dnssweeper-cli

Version:

CLI tool for detecting and analyzing unused DNS records

92 lines 3.51 kB
"use strict"; /** * CSVパーサー - Cloudflare形式のDNSレコードCSVを解析 */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseDNSRecordsFromCSV = parseDNSRecordsFromCSV; exports.validateDNSRecord = validateDNSRecord; const papaparse_1 = __importDefault(require("papaparse")); const fs_1 = require("fs"); /** * CSVファイルからDNSレコードを読み込む * @param filePath - CSVファイルのパス * @returns DNSレコードの配列 */ async function parseDNSRecordsFromCSV(filePath) { try { // ファイルの存在確認 await fs_1.promises.access(filePath); // ファイル読み込み const csvContent = await fs_1.promises.readFile(filePath, 'utf-8'); // Papa Parseで解析 const parseResult = papaparse_1.default.parse(csvContent, { header: true, skipEmptyLines: true, transformHeader: (header) => header.trim(), transform: (value) => value.trim(), }); if (parseResult.errors.length > 0) { throw new Error(`CSV解析エラー: ${parseResult.errors.map(e => e.message).join(', ')}`); } // DNSRecordに変換 const records = parseResult.data.map((row, index) => { try { return { name: row.Name || '', type: row.Type || '', content: row.Content || '', ttl: parseInt(row.TTL) || 300, proxied: row.Proxied === 'true' || row.Proxied === true, created: row.Created || '', modified: row.Modified || '', }; } catch (error) { throw new Error(`行${index + 2}の変換エラー: ${error instanceof Error ? error.message : String(error)}`); } }); // 基本的なバリデーション const validRecords = records.filter((record, index) => { if (!record.name || !record.type) { console.warn(`警告: 行${index + 2}は必須フィールドが不足しています(Name: ${record.name}, Type: ${record.type})`); return false; } return true; }); return validRecords; } catch (error) { if (error instanceof Error) { throw new Error(`CSVファイル読み込みエラー: ${error.message}`); } throw new Error(`CSVファイル読み込みエラー: ${String(error)}`); } } /** * DNSレコードのバリデーション * @param record - 検証するDNSレコード * @returns バリデーション結果 */ function validateDNSRecord(record) { const errors = []; if (!record.name) { errors.push('Name フィールドが必須です'); } if (!record.type) { errors.push('Type フィールドが必須です'); } if (!['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'SRV', 'PTR', 'NS'].includes(record.type)) { errors.push(`サポートされていないDNSレコードタイプ: ${record.type}`); } if (record.ttl < 1 || record.ttl > 86400) { errors.push(`TTL値が範囲外です: ${record.ttl} (1-86400)`); } return { isValid: errors.length === 0, errors, }; } //# sourceMappingURL=csvParser.js.map