ModuleBuilder/src/index.js

104 lines
2.7 KiB
JavaScript

import ModuleRepos from './modules.js';
import Parcel from 'parcel-bundler';
import { rmSync, mkdirSync, readFileSync, writeFileSync, copyFileSync } from 'fs';
import { createHash } from 'crypto';
import { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
const clonesDir = `${__dirname.replace('/src', '')}/clones`;
const distDir = `${__dirname.replace('/src', '')}/dist`;
const modulesDir = `${distDir}/module`;
const resetDir = (dir) => {
rmSync(dir, { recursive: true, force: true });
mkdirSync(dir);
};
resetDir(clonesDir);
resetDir(distDir);
resetDir(modulesDir);
import { exec } from 'child_process';
const parcelOptions = {
minify: true,
watch: false,
sourceMaps: false,
outDir: modulesDir,
logLevel: 0
};
let moduleJson = [];
for (const repo of ModuleRepos) {
// console.log(repo);
console.time(repo.slice(0, 2).join(' @ ')+`${repo[2] ? ` ${repo[2]}` : ''}`);
const url = `https://github.com/${repo[0]}.git`;
const commitHash = repo[1];
const name = repo[0];
const moduleDir = repo[2] || '';
const cloneDir = `${clonesDir}/${name}`;
await new Promise((res) => exec(`git clone ${url} ${cloneDir}`, res));
process.chdir(cloneDir);
const lastHash = await new Promise((res) => exec(`git rev-parse HEAD`, (err, stdout) => res(stdout.trim())));
await new Promise((res) => exec(`git checkout ${commitHash}`, res));
const manifest = JSON.parse(readFileSync(`${cloneDir}${moduleDir}/goosemodModule.json`));
// console.log(manifest);
const outFile = `${manifest.name}.js`;
const bundler = new Parcel(`${cloneDir}${moduleDir}/${manifest.main}`, Object.assign(parcelOptions, {
outFile
}));
const bundle = await bundler.bundle();
const outPath = `${modulesDir}/${outFile}`;
let jsCode = readFileSync(outPath, 'utf8');
jsCode = `${jsCode};parcelRequire('${bundle.entryAsset.basename}').default`; // Make eval return the index module's default export
// console.log(jsCode);
writeFileSync(outPath, jsCode);
const jsHash = createHash('sha512').update(jsCode).digest('hex');
moduleJson.push({
name: manifest.name,
description: manifest.description,
version: manifest.version,
tags: manifest.tags,
authors: manifest.authors,
hash: jsHash
});
console.timeEnd(repo.slice(0, 2).join(' @ ')+`${repo[2] ? ` ${repo[2]}` : ''}`);
// console.log(lastHash);
if (lastHash !== commitHash) {
console.log('[Warning] Commit hash in modules does not match latest commit in repo');
}
}
writeFileSync(`${distDir}/modules.json`, JSON.stringify(moduleJson));
copyFileSync(`${__dirname.replace('/src', '')}/_headers`, `${distDir}/_headers`);