Compare commits

...
Sign in to create a new pull request.

1 commit

4 changed files with 52 additions and 19 deletions

View file

@ -9,7 +9,8 @@ import packageJson from "./../package.json";
const isDev = process.env.NODE_ENV === "development";
const root = path.join(__dirname, "..");
const publicPath = isDev ? path.join(root, "public") : path.join(root, ".output/public");
const sourcePublicPath = path.join(root, "public");
const runtimePublicPath = isDev ? sourcePublicPath : path.join(root, ".output/public");
/**
* In charge to unzip data from showroom Bo,
@ -18,6 +19,15 @@ const publicPath = isDev ? path.join(root, "public") : path.join(root, ".output/
export default abstract class UnzipData {
static zipFileToUse: string|null;
private static resolvePublicPath(relativePath: string): string {
const runtimePath = path.join(runtimePublicPath, relativePath) as fs.PathLike;
if (fs.existsSync(runtimePath)) {
return runtimePath as string;
}
return path.join(sourcePublicPath, relativePath);
}
/**
* Init zipFileToUse if not already inited
*/
@ -25,8 +35,11 @@ export default abstract class UnzipData {
if (!UnzipData.zipFileToUse) {
// * Try to locate last zip file and load it.
const zipFile = fs.readdirSync("static/data")
.map(path => { return {path: `static/data/${path}`, "stat": fs.lstatSync(`static/data/${path}`)}; })
.filter(obj => obj.stat.isFile() && obj.path.endsWith(".zip"))
.map((entryPath) => {
const fullPath = path.join("static/data", entryPath);
return { path: fullPath, stat: fs.lstatSync(fullPath) };
})
.filter((entry) => entry.stat.isFile() && entry.path.endsWith(".zip"))
.sort((objA, objB) => objB.stat.mtime.getTime() - objA.stat.mtime.getTime())
.at(0) ?? null;
@ -48,30 +61,26 @@ export default abstract class UnzipData {
const zip = new AdmZip(fs.readFileSync(UnzipData.zipFileToUse));
UnzipData.removeOldExtractedFiles();
zip.extractAllTo(publicPath + "/data");
// * Schemas Copy for production build
if (!isDev) {
fs.cpSync(path.join(root, "public/schemas"), path.join(publicPath, "schemas"), { recursive: true });
}
zip.extractAllTo("public/data");
}
private static removeOldExtractedFiles() {
// * Clear export dir
fs.rmSync(publicPath + "/data/pictures", { recursive: true, force: true });
fs.rmSync(publicPath + "/data/data.json", { recursive: true, force: true });
fs.rmSync("public/data/pictures", { recursive: true, force: true });
fs.rmSync("public/data/data.json", { force: true });
}
/**
* Load json data file that was extracted
*/
public static loadJsonDataFile(): TypeApp | null {
const jsonDataPath = UnzipData.resolvePublicPath("data/data.json");
const jsonSchemaPath = UnzipData.resolvePublicPath("schemas");
const jsonData = fs.readFileSync(
path.join(publicPath, "data/data.json"),
jsonDataPath,
{ encoding: "utf8", flag: "r" }
);
const jsonSchemaPath = path.join(publicPath, "schemas");
if (!UnzipData.validateAgainstJsonSchema(jsonSchemaPath, jsonData)) {
log.warn(`Data for file ${UnzipData.zipFileToUse} is not valid JSON`);

View file

@ -2,8 +2,6 @@ import { resolve } from "path";
import log from "electron-log/main";
import UnzipData from "./electron/UnzipData";
UnzipData.loadZipFileContent();
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
hooks: {
@ -73,7 +71,7 @@ export default defineNuxtConfig({
pinia: "/node_modules/@pinia/nuxt/node_modules/pinia/dist/pinia.mjs"
},
i18n: {
locales: UnzipData.loadJsonDataFile()?.settings.locales,
locales: UnzipData.loadJsonDataFile()?.settings.locales ?? ["fr"],
defaultLocale: "fr",
// * Ajouter aussi la locale dans ce fichier
vueI18n: "./i18n.config.ts"

View file

@ -14,12 +14,13 @@
"static/**/*"
],
"scripts": {
"build": "nuxi build --prerender && electron-builder -w",
"dev": "cross-env NODE_ENV=development nuxt dev",
"data:prepare": "node scripts/prepare-data.mjs",
"build": "npm run data:prepare && nuxi build --prerender && electron-builder -w",
"dev": "npm run data:prepare && cross-env NODE_ENV=development nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"cleanup": "nuxt cleanup",
"typecheck": "nuxt typecheck",
"typecheck": "npm run data:prepare && nuxt typecheck",
"postinstall": "nuxt prepare",
"lint:ts": "npm run typecheck",
"lint:js": "eslint --ext \".js,.ts,.vue\" --ignore-path .gitignore .",

25
scripts/prepare-data.mjs Normal file
View file

@ -0,0 +1,25 @@
import fs from "node:fs";
import path from "node:path";
import AdmZip from "adm-zip";
const root = process.cwd();
const dataDir = path.join(root, "static", "data");
const publicDataDir = path.join(root, "public", "data");
const zipFiles = fs.readdirSync(dataDir, { withFileTypes: true })
.filter((entry) => entry.isFile() && entry.name.endsWith(".zip"))
.map((entry) => path.join(dataDir, entry.name))
.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
const latestZip = zipFiles.at(0);
if (!latestZip) {
throw new Error("No zip data to load in static/data");
}
fs.rmSync(path.join(publicDataDir, "pictures"), { recursive: true, force: true });
fs.rmSync(path.join(publicDataDir, "data.json"), { force: true });
const zip = new AdmZip(latestZip);
zip.extractAllTo(publicDataDir);
console.info(`Prepared data from: ${latestZip}`);