|
const packages = [ |
|
'micropip', |
|
'packaging', |
|
'requests', |
|
'beautifulsoup4', |
|
'numpy', |
|
'pandas', |
|
'matplotlib', |
|
'scikit-learn', |
|
'scipy', |
|
'regex', |
|
'seaborn' |
|
]; |
|
|
|
import { loadPyodide } from 'pyodide'; |
|
import { writeFile, readFile, copyFile, readdir, rmdir } from 'fs/promises'; |
|
|
|
async function downloadPackages() { |
|
console.log('Setting up pyodide + micropip'); |
|
|
|
let pyodide; |
|
try { |
|
pyodide = await loadPyodide({ |
|
packageCacheDir: 'static/pyodide' |
|
}); |
|
} catch (err) { |
|
console.error('Failed to load Pyodide:', err); |
|
return; |
|
} |
|
|
|
const packageJson = JSON.parse(await readFile('package.json')); |
|
const pyodideVersion = packageJson.dependencies.pyodide.replace('^', ''); |
|
|
|
try { |
|
const pyodidePackageJson = JSON.parse(await readFile('static/pyodide/package.json')); |
|
const pyodidePackageVersion = pyodidePackageJson.version.replace('^', ''); |
|
|
|
if (pyodideVersion !== pyodidePackageVersion) { |
|
console.log('Pyodide version mismatch, removing static/pyodide directory'); |
|
await rmdir('static/pyodide', { recursive: true }); |
|
} |
|
} catch (e) { |
|
console.log('Pyodide package not found, proceeding with download.'); |
|
} |
|
|
|
try { |
|
console.log('Loading micropip package'); |
|
await pyodide.loadPackage('micropip'); |
|
|
|
const micropip = pyodide.pyimport('micropip'); |
|
console.log('Downloading Pyodide packages:', packages); |
|
|
|
try { |
|
for (const pkg of packages) { |
|
console.log(`Installing package: ${pkg}`); |
|
await micropip.install(pkg); |
|
} |
|
} catch (err) { |
|
console.error('Package installation failed:', err); |
|
return; |
|
} |
|
|
|
console.log('Pyodide packages downloaded, freezing into lock file'); |
|
|
|
try { |
|
const lockFile = await micropip.freeze(); |
|
await writeFile('static/pyodide/pyodide-lock.json', lockFile); |
|
} catch (err) { |
|
console.error('Failed to write lock file:', err); |
|
} |
|
} catch (err) { |
|
console.error('Failed to load or install micropip:', err); |
|
} |
|
} |
|
|
|
async function copyPyodide() { |
|
console.log('Copying Pyodide files into static directory'); |
|
|
|
for await (const entry of await readdir('node_modules/pyodide')) { |
|
await copyFile(`node_modules/pyodide/${entry}`, `static/pyodide/${entry}`); |
|
} |
|
} |
|
|
|
await downloadPackages(); |
|
await copyPyodide(); |
|
|