diff --git a/install.js b/install.js new file mode 100644 index 000000000..608c17835 --- /dev/null +++ b/install.js @@ -0,0 +1,64 @@ +const { execSync, spawn, spawnSync } = require('child_process'); +const { existsSync } = require('fs'); +const readline = require('readline'); + +const isVersionGreaterThan = (version, targetMajor) => Number(version.split('.')[0]) >= targetMajor; + +const trimV = (version) => version.startsWith('v') ? version.slice(1) : version; + +const question = async (query) => new Promise((resolve) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + rl.question(query, (answer) => { + rl.close(); + resolve(answer); + }); +}); + +const confirm = async (query) => { + const answer = await question(`${query} (Y/n) `); + return answer === '' || ['y', 'yes', 'yep', 'yeah'].includes(answer); +}; + +const directory = 'logto'; + +(async () => { + if (existsSync(directory)) { + throw new Error(`\`${directory}\` already exists in the current directory.`); + } + + const nodeVersion = execSync('node -v', { encoding: 'utf-8' }); + + if (!isVersionGreaterThan(trimV(nodeVersion), 16)) { + throw new Error('Logto requires NodeJS >= 16.0.0.'); + } + + const pgOutput = execSync('postgres --version', { encoding: 'utf-8' }); + const pgArray = pgOutput.split(' '); + const pgVersion = pgArray[pgArray.length - 1]; + + if (!isVersionGreaterThan(trimV(pgVersion), 18)) { + const answer = await confirm('Logto requires PostgreSQL >= 14.0.0 but cannot find in the current environment.\nDo you have a remote PostgreSQL instance ready?'); + if (!answer) { + process.exit(1); + } + } + + + spawnSync( + 'sh', + ['-c', 'curl -L https://github.com/logto-io/logto/releases/latest/download/logto.tar.gz | tar -xz'], + { stdio: 'inherit' }, + ); + + const startCommand = `cd ${directory} && npm start`; + const answer = await confirm('Would you like to start Logto now?'); + + if (answer) { + spawn('sh', ['-c', startCommand], { stdio: 'inherit' }); + } else { + console.log(`You can use \`${startCommand}\` to start Logto. Happy hacking!`); + } +})(); diff --git a/package.json b/package.json index 478dc6a14..b4743a09f 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "prepare": "if test \"$NODE_ENV\" != \"production\" && test \"$CI\" != \"true\" ; then husky install ; fi", "prepack": "lerna run --stream prepack", "dev": "lerna run --stream prepack && lerna --scope=@logto/{core,ui,console} exec -- pnpm dev", - "start": "cd packages/core && node . --from-root" + "start": "cd packages/core && NODE_ENV=production node . --from-root" }, "devDependencies": { "@commitlint/cli": "^16.0.0",