104 lines
2.9 KiB
JavaScript
104 lines
2.9 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Import icons from dump/named_icons.csv into the icons table.
|
|
* Uses DB_* env vars (from .env or environment). Icons are assigned to ICON_GROUP_ID.
|
|
*
|
|
* Run from project root: node dump/import-named-icons.js
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const { Client } = require('pg');
|
|
const { ulid } = require('ulid');
|
|
|
|
// Load .env from project root
|
|
const envPath = path.join(__dirname, '..', '.env');
|
|
if (fs.existsSync(envPath)) {
|
|
const content = fs.readFileSync(envPath, 'utf8');
|
|
content.split('\n').forEach((line) => {
|
|
const trimmed = line.replace(/^\s+|\s+$/, '').replace(/#.*$/, '').trim();
|
|
if (!trimmed || !/^[A-Za-z_][A-Za-z0-9_]*=/.test(trimmed)) return;
|
|
const eq = trimmed.indexOf('=');
|
|
const key = trimmed.slice(0, eq);
|
|
const value = trimmed.slice(eq + 1).replace(/^["']|["']$/g, '');
|
|
if (!process.env[key]) process.env[key] = value;
|
|
});
|
|
}
|
|
|
|
const DB_HOST = process.env.DB_HOST || 'localhost';
|
|
const DB_PORT = process.env.DB_PORT || '5432';
|
|
const DB_NAME = process.env.DB_NAME || 'dmenu';
|
|
const DB_USER = process.env.DB_USER || 'postgres';
|
|
const DB_PASS = process.env.DB_PASS || '';
|
|
const ICON_GROUP_ID = process.env.ICON_GROUP_ID || '01KD7DG4VCTWZRSA54M3PEJ6NW';
|
|
|
|
const csvPath = path.join(__dirname, 'named_icons.csv');
|
|
|
|
function parseCsvLine(line) {
|
|
const parts = line.split(',');
|
|
if (parts.length < 3) return null;
|
|
const index = parts[0].trim();
|
|
const url = parts[parts.length - 1].trim();
|
|
const name = parts.slice(1, -1).join(',').trim();
|
|
return { index, name, url };
|
|
}
|
|
|
|
async function main() {
|
|
if (!fs.existsSync(csvPath)) {
|
|
console.error('Error: named_icons.csv not found at', csvPath);
|
|
process.exit(1);
|
|
}
|
|
|
|
const csvContent = fs.readFileSync(csvPath, 'utf8');
|
|
const lines = csvContent.split('\n').filter((l) => l.trim());
|
|
const header = lines[0];
|
|
const dataLines = lines.slice(1);
|
|
|
|
const rows = [];
|
|
for (const line of dataLines) {
|
|
const row = parseCsvLine(line);
|
|
if (row && row.url) rows.push(row);
|
|
}
|
|
|
|
if (rows.length === 0) {
|
|
console.error('Error: No valid rows found in named_icons.csv');
|
|
process.exit(1);
|
|
}
|
|
|
|
const client = new Client({
|
|
host: DB_HOST,
|
|
port: parseInt(DB_PORT, 10),
|
|
database: DB_NAME,
|
|
user: DB_USER,
|
|
password: DB_PASS,
|
|
});
|
|
|
|
try {
|
|
await client.connect();
|
|
} catch (err) {
|
|
console.error('Database connection failed:', err.message);
|
|
process.exit(1);
|
|
}
|
|
|
|
const now = new Date().toISOString();
|
|
let inserted = 0;
|
|
|
|
for (const row of rows) {
|
|
const id = ulid();
|
|
await client.query(
|
|
`INSERT INTO icons (id, created_at, updated_at, deleted_at, url, group_id)
|
|
VALUES ($1, $2::timestamptz, $3::timestamptz, NULL, $4, $5)`,
|
|
[id, now, now, row.url, ICON_GROUP_ID]
|
|
);
|
|
inserted++;
|
|
}
|
|
|
|
await client.end();
|
|
console.log(`Done. Inserted ${inserted} icons.`);
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|