Spaces:
Build error
Build error
| const { execSync } = require('child_process'); | |
| const path = require('path'); | |
| const fs = require('fs'); | |
| const { askQuestion, isDockerRunning, silentExit } = require('./helpers'); | |
| const config = { | |
| localUpdate: process.argv.includes('-l'), | |
| dockerUpdate: process.argv.includes('-d'), | |
| useSingleComposeFile: process.argv.includes('-s'), | |
| }; | |
| // Set the directories | |
| const rootDir = path.resolve(__dirname, '..'); | |
| const directories = [ | |
| rootDir, | |
| path.resolve(rootDir, 'packages', 'data-provider'), | |
| path.resolve(rootDir, 'client'), | |
| path.resolve(rootDir, 'api'), | |
| ]; | |
| async function updateConfigWithWizard() { | |
| if (!config.dockerUpdate && !config.useSingleComposeFile) { | |
| config.dockerUpdate = (await askQuestion('Are you using Docker? (y/n): ')) | |
| .toLowerCase() | |
| .startsWith('y'); | |
| } | |
| if (config.dockerUpdate && !config.useSingleComposeFile) { | |
| config.useSingleComposeFile = !( | |
| await askQuestion('Are you using the default docker-compose file? (y/n): ') | |
| ) | |
| .toLowerCase() | |
| .startsWith('y'); | |
| } | |
| } | |
| async function validateDockerRunning() { | |
| if (!config.dockerUpdate && config.useSingleComposeFile) { | |
| config.dockerUpdate = true; | |
| } | |
| if (config.dockerUpdate && !isDockerRunning()) { | |
| console.red( | |
| 'Error: Docker is not running. You will need to start Docker Desktop or if using linux/mac, run `sudo systemctl start docker`', | |
| ); | |
| silentExit(1); | |
| } | |
| } | |
| function deleteNodeModules(dir) { | |
| const nodeModulesPath = path.join(dir, 'node_modules'); | |
| if (fs.existsSync(nodeModulesPath)) { | |
| console.purple(`Deleting node_modules in ${dir}`); | |
| execSync(`rd /s /q "${nodeModulesPath}"`, { stdio: 'inherit', shell: 'cmd.exe' }); | |
| } | |
| } | |
| (async () => { | |
| const showWizard = !config.localUpdate && !config.dockerUpdate && !config.useSingleComposeFile; | |
| if (showWizard) { | |
| await updateConfigWithWizard(); | |
| } | |
| await validateDockerRunning(); | |
| const { dockerUpdate, useSingleComposeFile: singleCompose } = config; | |
| // Fetch latest repo | |
| console.purple('Fetching the latest repo...'); | |
| execSync('git fetch origin', { stdio: 'inherit' }); | |
| // Switch to main branch | |
| console.purple('Switching to main branch...'); | |
| execSync('git checkout main', { stdio: 'inherit' }); | |
| // Git pull origin main | |
| console.purple('Pulling the latest code from main...'); | |
| execSync('git pull origin main', { stdio: 'inherit' }); | |
| if (dockerUpdate) { | |
| console.purple('Removing previously made Docker container...'); | |
| const downCommand = `docker-compose ${ | |
| singleCompose ? '-f ./docs/dev/single-compose.yml ' : '' | |
| }down --volumes`; | |
| console.orange(downCommand); | |
| execSync(downCommand, { stdio: 'inherit' }); | |
| console.purple('Pruning all LibreChat Docker images...'); | |
| const imageName = singleCompose ? 'librechat_single' : 'librechat'; | |
| try { | |
| execSync(`docker rmi ${imageName}:latest`, { stdio: 'inherit' }); | |
| } catch (e) { | |
| console.purple('Failed to remove Docker image librechat:latest. It might not exist.'); | |
| } | |
| console.purple('Removing all unused dangling Docker images...'); | |
| execSync('docker image prune -f', { stdio: 'inherit' }); | |
| console.purple('Building new LibreChat image...'); | |
| const buildCommand = `docker-compose ${ | |
| singleCompose ? '-f ./docs/dev/single-compose.yml ' : '' | |
| }build`; | |
| console.orange(buildCommand); | |
| execSync(buildCommand, { stdio: 'inherit' }); | |
| } else { | |
| // Delete all node_modules | |
| directories.forEach(deleteNodeModules); | |
| // Run npm cache clean --force | |
| console.purple('Cleaning npm cache...'); | |
| execSync('npm cache clean --force', { stdio: 'inherit' }); | |
| // Install dependencies | |
| console.purple('Installing dependencies...'); | |
| execSync('npm ci', { stdio: 'inherit' }); | |
| // Build client-side code | |
| console.purple('Building frontend...'); | |
| execSync('npm run frontend', { stdio: 'inherit' }); | |
| } | |
| let startCommand = 'npm run backend'; | |
| if (dockerUpdate) { | |
| startCommand = `docker-compose ${singleCompose ? '-f ./docs/dev/single-compose.yml ' : ''}up`; | |
| } | |
| console.green('Your LibreChat app is now up to date! Start the app with the following command:'); | |
| console.purple(startCommand); | |
| console.orange( | |
| 'Note: it\'s also recommended to clear your browser cookies and localStorage for LibreChat to assure a fully clean installation.', | |
| ); | |
| console.orange('Also: Don\'t worry, your data is safe :)'); | |
| })(); | |