Files
pihkaal-me/modules/content-assets.ts
Pihkaal de654124d0
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
fix: repair build
2026-02-13 14:48:46 +01:00

90 lines
2.6 KiB
TypeScript

import { defineNuxtModule, useLogger } from "@nuxt/kit";
import { copyFile, mkdir, readdir, readFile } from "fs/promises";
import { join } from "path";
import { createHash } from "crypto";
import { existsSync, watch } from "fs";
export default defineNuxtModule({
meta: {
name: "content-assets",
configKey: "contentAssets",
},
defaults: {},
async setup(_, nuxt) {
const logger = useLogger("content-assets");
const contentDir = join(nuxt.options.rootDir, "content");
const publicDir = join(
nuxt.options.rootDir,
"public/nds/images/projects/pokemons",
);
const getFileChecksum = async (filePath: string): Promise<string> => {
const content = await readFile(filePath);
return createHash("sha256").update(content).digest("hex");
};
const copyWebpFiles = async () => {
try {
const projectsDir = join(contentDir, "projects");
if (!existsSync(projectsDir)) {
logger.info("No projects directory found");
return;
}
if (!existsSync(publicDir)) {
await mkdir(publicDir, { recursive: true });
}
const entries = await readdir(projectsDir, { withFileTypes: true });
for (const entry of entries) {
if (!entry.isDirectory()) continue;
const projectName = entry.name;
const sourcePath = join(projectsDir, projectName, "index.webp");
const destPath = join(publicDir, `${projectName}.webp`);
if (!existsSync(sourcePath)) {
continue;
}
// only copy if destination doesn't exist, or if not the same as source
let shouldCopy = true;
if (existsSync(destPath)) {
const sourceChecksum = await getFileChecksum(sourcePath);
const destChecksum = await getFileChecksum(destPath);
if (sourceChecksum === destChecksum) {
shouldCopy = false;
}
}
if (shouldCopy) {
await copyFile(sourcePath, destPath);
logger.success(
`Copied: ${projectName}/index.webp -> ${projectName}.webp`,
);
}
}
} catch (error) {
logger.error("Error copying files:", error);
}
};
await copyWebpFiles();
if (nuxt.options.dev) {
nuxt.hook("ready", () => {
watch(contentDir, { recursive: true }, async (_, filePath) => {
// NOTE: only match /PROJECT_NAME/index.webp
if (filePath?.endsWith("/index.webp")) {
logger.info(`Detected change: ${filePath}`);
await copyWebpFiles();
}
});
});
}
},
});