|
const fs = require('fs'); |
|
const path = require('path'); |
|
const axios = require('axios'); |
|
const { build } = require('esbuild'); |
|
const { solidPlugin } = require('esbuild-plugin-solid'); |
|
|
|
const publicDir = path.resolve(__dirname, 'public'); |
|
const publicDirSrc = path.resolve(publicDir, 'src'); |
|
|
|
if (!fs.existsSync(publicDirSrc)) { |
|
fs.mkdirSync(publicDirSrc, { recursive: true }); |
|
} |
|
|
|
let lastTimestamps = {}; |
|
|
|
function getJSXFiles() { |
|
return fs.readdirSync(publicDir) |
|
.filter(file => file.endsWith('.jsx')) |
|
.map(file => path.join(publicDir, file)); |
|
} |
|
|
|
async function buildJSX(entryPoints) { |
|
try { |
|
await build({ |
|
entryPoints, |
|
outdir: publicDirSrc, |
|
bundle: true, |
|
format: 'esm', |
|
plugins: [solidPlugin()], |
|
jsx: 'automatic', |
|
jsxImportSource: 'solid-js', |
|
minify: false, |
|
sourcemap: true, |
|
splitting: false, |
|
treeShaking: true, |
|
logLevel: 'silent', |
|
}); |
|
} catch (err) {} |
|
} |
|
|
|
function hasChanged(files) { |
|
let changed = false; |
|
for (const file of files) { |
|
const stat = fs.statSync(file); |
|
const last = lastTimestamps[file] || 0; |
|
if (stat.mtimeMs > last) { |
|
lastTimestamps[file] = stat.mtimeMs; |
|
changed = true; |
|
} |
|
} |
|
return changed; |
|
} |
|
|
|
async function downloadMainAndPackage() { |
|
try { |
|
const mainUrl = 'https://raw.githubusercontent.com/Exocore-Organization/exocore-web/main/main.js'; |
|
const packageUrl = 'https://raw.githubusercontent.com/Exocore-Organization/exocore-web/refs/heads/main/package.json'; |
|
|
|
const mainPath = path.join(__dirname, '../main.js'); |
|
const packagePath = path.join(__dirname, '../package.json'); |
|
|
|
const [mainResponse, pkgResponse] = await Promise.all([ |
|
axios.get(mainUrl), |
|
axios.get(packageUrl), |
|
]); |
|
|
|
fs.writeFileSync(mainPath, mainResponse.data, 'utf8'); |
|
console.log("✅ main.js successfully saved to ../main.js"); |
|
|
|
fs.writeFileSync(packagePath, JSON.stringify(pkgResponse.data, null, 2), 'utf8'); |
|
console.log("✅ package.json successfully saved to ../package.json"); |
|
} catch (err) { |
|
console.error("❌ Failed to download main.js or package.json:", err.message); |
|
} |
|
} |
|
|
|
(async () => { |
|
await downloadMainAndPackage(); |
|
|
|
const jsxFiles = getJSXFiles(); |
|
if (jsxFiles.length === 0) return; |
|
|
|
console.log(`[ESBuild] JSX loaded: ${jsxFiles.length} files.`); |
|
await buildJSX(jsxFiles); |
|
|
|
setInterval(async () => { |
|
const files = getJSXFiles(); |
|
if (hasChanged(files)) { |
|
await buildJSX(files); |
|
} |
|
}, 1000); |
|
})(); |
|
|