UNPKG

@nlabs/lex

Version:
113 lines (112 loc) 14.7 kB
/** * Copyright (c) 2018-Present, Nitrogen Labs, Inc. * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms. */ import { execa } from 'execa'; import { renameSync, writeFileSync } from 'fs'; import { resolve as pathResolve } from 'path'; import { LexConfig } from '../../LexConfig.js'; import { createSpinner, getPackageJson, setPackageJson } from '../../utils/app.js'; import { getDirName } from '../../utils/file.js'; import { log } from '../../utils/log.js'; export const init = async (appName, packageName, cmd, callback = ()=>({}))=>{ const { cliName = 'Lex', install, packageManager: cmdPackageManager, quiet, typescript } = cmd; const cwd = process.cwd(); // Spinner const spinner = createSpinner(quiet); // Download app module into temporary directory log(`${cliName} is downloading the app module...`, 'info', quiet); spinner.start('Downloading app...'); const tmpPath = pathResolve(cwd, './.lexTmp'); const appPath = pathResolve(cwd, `./${appName}`); const dirName = getDirName(); const dnpPath = pathResolve(dirName, '../../../node_modules/download-npm-package/bin/cli.js'); // Get custom configuration await LexConfig.parseConfig(cmd); const { packageManager: configPackageManager, useTypescript: configTypescript } = LexConfig.config; const packageManager = cmdPackageManager || configPackageManager || ''; const useTypescript = typescript !== undefined ? typescript : configTypescript || false; let appModule = packageName; // Use base app module based on config if (!appModule) { if (useTypescript) { appModule = '@nlabs/arkhamjs-example-ts-react'; } else { appModule = '@nlabs/arkhamjs-example-flow-react'; } } try { await execa(dnpPath, [ appModule, tmpPath ], {}); // Stop spinner and update status spinner.succeed('Successfully downloaded app!'); } catch (error) { console.log('error', error); log(`\n${cliName} Error: There was an error downloading ${appModule}. Make sure the package exists and there is a network connection.`, 'error', quiet); // Stop spinner and kill process spinner.fail('Downloaded of app failed.'); // Kill process callback(1); return 1; } // Move into configured directory try { renameSync(`${tmpPath}/${appModule}`, appPath); } catch (_error) { log(`\n${cliName} Error: There was an error copying ${appModule} to the current working directory.`, 'error', quiet); callback(1); return 1; } // Configure package.json const packagePath = `${appPath}/package.json`; const packageJson = getPackageJson(packagePath); packageJson.name = appName; packageJson.description = `${cliName} created app`; packageJson.version = '0.1.0'; delete packageJson.keywords; delete packageJson.author; delete packageJson.contributors; delete packageJson.repository; delete packageJson.homepage; delete packageJson.bugs; try { // Update package.json setPackageJson(packageJson, packagePath); // Update README const readmePath = `${appPath}/README.md`; writeFileSync(readmePath, `# ${appName}`); } catch (error) { log(`\n${cliName} Error: ${error.message}`, 'error', quiet); callback(1); return 1; } if (install) { spinner.start('Installing dependencies...'); // Change to the app directory process.chdir(appPath); // Install dependencies try { await execa(packageManager, [ 'install' ], { encoding: 'utf8', stdio: 'inherit' }); // Stop spinner spinner.succeed('Successfully installed dependencies!'); } catch (error) { // Display error message log(`\n${cliName} Error: ${error.message}`, 'error', quiet); // Stop spinner spinner.fail('Failed to install dependencies.'); // Kill process callback(1); return 1; } } // Kill process callback(0); return 0; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9pbml0L2luaXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7cmVuYW1lU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NyZWF0ZVNwaW5uZXIsIGdldFBhY2thZ2VKc29uLCBzZXRQYWNrYWdlSnNvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7Z2V0RGlyTmFtZX0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJbml0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluc3RhbGw/OiBib29sZWFuO1xuICByZWFkb25seSBwYWNrYWdlTWFuYWdlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSB0eXBlc2NyaXB0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgSW5pdENhbGxiYWNrID0gKHN0YXR1czogbnVtYmVyKT0+IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBpbml0ID0gYXN5bmMgKFxuICBhcHBOYW1lOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGNtZDogSW5pdE9wdGlvbnMsXG4gIGNhbGxiYWNrOiBJbml0Q2FsbGJhY2sgPSAoKSA9PiAoe30pXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7Y2xpTmFtZSA9ICdMZXgnLCBpbnN0YWxsLCBwYWNrYWdlTWFuYWdlcjogY21kUGFja2FnZU1hbmFnZXIsIHF1aWV0LCB0eXBlc2NyaXB0fSA9IGNtZDtcbiAgY29uc3QgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIFNwaW5uZXJcbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIC8vIERvd25sb2FkIGFwcCBtb2R1bGUgaW50byB0ZW1wb3JhcnkgZGlyZWN0b3J5XG4gIGxvZyhgJHtjbGlOYW1lfSBpcyBkb3dubG9hZGluZyB0aGUgYXBwIG1vZHVsZS4uLmAsICdpbmZvJywgcXVpZXQpO1xuICBzcGlubmVyLnN0YXJ0KCdEb3dubG9hZGluZyBhcHAuLi4nKTtcbiAgY29uc3QgdG1wUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoY3dkLCAnLi8ubGV4VG1wJyk7XG4gIGNvbnN0IGFwcFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGN3ZCwgYC4vJHthcHBOYW1lfWApO1xuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZSgpO1xuICBjb25zdCBkbnBQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShkaXJOYW1lLCAnLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Rvd25sb2FkLW5wbS1wYWNrYWdlL2Jpbi9jbGkuanMnKTtcblxuICAvLyBHZXQgY3VzdG9tIGNvbmZpZ3VyYXRpb25cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG4gIGNvbnN0IHtwYWNrYWdlTWFuYWdlcjogY29uZmlnUGFja2FnZU1hbmFnZXIsIHVzZVR5cGVzY3JpcHQ6IGNvbmZpZ1R5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3QgcGFja2FnZU1hbmFnZXI6IHN0cmluZyA9IGNtZFBhY2thZ2VNYW5hZ2VyIHx8IGNvbmZpZ1BhY2thZ2VNYW5hZ2VyIHx8ICcnO1xuICBjb25zdCB1c2VUeXBlc2NyaXB0OiBib29sZWFuID0gdHlwZXNjcmlwdCAhPT0gdW5kZWZpbmVkID8gdHlwZXNjcmlwdCA6IGNvbmZpZ1R5cGVzY3JpcHQgfHwgZmFsc2U7XG5cbiAgbGV0IGFwcE1vZHVsZTogc3RyaW5nID0gcGFja2FnZU5hbWU7XG5cbiAgLy8gVXNlIGJhc2UgYXBwIG1vZHVsZSBiYXNlZCBvbiBjb25maWdcbiAgaWYoIWFwcE1vZHVsZSkge1xuICAgIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICAgIGFwcE1vZHVsZSA9ICdAbmxhYnMvYXJraGFtanMtZXhhbXBsZS10cy1yZWFjdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcE1vZHVsZSA9ICdAbmxhYnMvYXJraGFtanMtZXhhbXBsZS1mbG93LXJlYWN0JztcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNhKGRucFBhdGgsIFthcHBNb2R1bGUsIHRtcFBhdGhdLCB7fSk7XG5cbiAgICAvLyBTdG9wIHNwaW5uZXIgYW5kIHVwZGF0ZSBzdGF0dXNcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBkb3dubG9hZGVkIGFwcCEnKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGNvbnNvbGUubG9nKCdlcnJvcicsIGVycm9yKTtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciBkb3dubG9hZGluZyAke2FwcE1vZHVsZX0uIE1ha2Ugc3VyZSB0aGUgcGFja2FnZSBleGlzdHMgYW5kIHRoZXJlIGlzIGEgbmV0d29yayBjb25uZWN0aW9uLmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIC8vIFN0b3Agc3Bpbm5lciBhbmQga2lsbCBwcm9jZXNzXG4gICAgc3Bpbm5lci5mYWlsKCdEb3dubG9hZGVkIG9mIGFwcCBmYWlsZWQuJyk7XG5cbiAgICAvLyBLaWxsIHByb2Nlc3NcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIE1vdmUgaW50byBjb25maWd1cmVkIGRpcmVjdG9yeVxuICB0cnkge1xuICAgIHJlbmFtZVN5bmMoYCR7dG1wUGF0aH0vJHthcHBNb2R1bGV9YCwgYXBwUGF0aCk7XG4gIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3IgY29weWluZyAke2FwcE1vZHVsZX0gdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gQ29uZmlndXJlIHBhY2thZ2UuanNvblxuICBjb25zdCBwYWNrYWdlUGF0aDogc3RyaW5nID0gYCR7YXBwUGF0aH0vcGFja2FnZS5qc29uYDtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBnZXRQYWNrYWdlSnNvbihwYWNrYWdlUGF0aCk7XG4gIHBhY2thZ2VKc29uLm5hbWUgPSBhcHBOYW1lO1xuICBwYWNrYWdlSnNvbi5kZXNjcmlwdGlvbiA9IGAke2NsaU5hbWV9IGNyZWF0ZWQgYXBwYDtcbiAgcGFja2FnZUpzb24udmVyc2lvbiA9ICcwLjEuMCc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5rZXl3b3JkcztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLmF1dGhvcjtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLmNvbnRyaWJ1dG9ycztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnJlcG9zaXRvcnk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5ob21lcGFnZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLmJ1Z3M7XG5cbiAgdHJ5IHtcbiAgICAvLyBVcGRhdGUgcGFja2FnZS5qc29uXG4gICAgc2V0UGFja2FnZUpzb24ocGFja2FnZUpzb24sIHBhY2thZ2VQYXRoKTtcblxuICAgIC8vIFVwZGF0ZSBSRUFETUVcbiAgICBjb25zdCByZWFkbWVQYXRoOiBzdHJpbmcgPSBgJHthcHBQYXRofS9SRUFETUUubWRgO1xuICAgIHdyaXRlRmlsZVN5bmMocmVhZG1lUGF0aCwgYCMgJHthcHBOYW1lfWApO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYoaW5zdGFsbCkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0luc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uJyk7XG5cbiAgICAvLyBDaGFuZ2UgdG8gdGhlIGFwcCBkaXJlY3RvcnlcbiAgICBwcm9jZXNzLmNoZGlyKGFwcFBhdGgpO1xuXG4gICAgLy8gSW5zdGFsbCBkZXBlbmRlbmNpZXNcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY2EocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdG9wIHNwaW5uZXJcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCBkZXBlbmRlbmNpZXMhJyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgLy8gRGlzcGxheSBlcnJvciBtZXNzYWdlXG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgIC8vIFN0b3Agc3Bpbm5lclxuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gaW5zdGFsbCBkZXBlbmRlbmNpZXMuJyk7XG5cbiAgICAgIC8vIEtpbGwgcHJvY2Vzc1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICAvLyBLaWxsIHByb2Nlc3NcbiAgY2FsbGJhY2soMCk7XG4gIHJldHVybiAwO1xufTsiXSwibmFtZXMiOlsiZXhlY2EiLCJyZW5hbWVTeW5jIiwid3JpdGVGaWxlU3luYyIsInJlc29sdmUiLCJwYXRoUmVzb2x2ZSIsIkxleENvbmZpZyIsImNyZWF0ZVNwaW5uZXIiLCJnZXRQYWNrYWdlSnNvbiIsInNldFBhY2thZ2VKc29uIiwiZ2V0RGlyTmFtZSIsImxvZyIsImluaXQiLCJhcHBOYW1lIiwicGFja2FnZU5hbWUiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJpbnN0YWxsIiwicGFja2FnZU1hbmFnZXIiLCJjbWRQYWNrYWdlTWFuYWdlciIsInF1aWV0IiwidHlwZXNjcmlwdCIsImN3ZCIsInByb2Nlc3MiLCJzcGlubmVyIiwic3RhcnQiLCJ0bXBQYXRoIiwiYXBwUGF0aCIsImRpck5hbWUiLCJkbnBQYXRoIiwicGFyc2VDb25maWciLCJjb25maWdQYWNrYWdlTWFuYWdlciIsInVzZVR5cGVzY3JpcHQiLCJjb25maWdUeXBlc2NyaXB0IiwiY29uZmlnIiwidW5kZWZpbmVkIiwiYXBwTW9kdWxlIiwic3VjY2VlZCIsImVycm9yIiwiY29uc29sZSIsImZhaWwiLCJfZXJyb3IiLCJwYWNrYWdlUGF0aCIsInBhY2thZ2VKc29uIiwibmFtZSIsImRlc2NyaXB0aW9uIiwidmVyc2lvbiIsImtleXdvcmRzIiwiYXV0aG9yIiwiY29udHJpYnV0b3JzIiwicmVwb3NpdG9yeSIsImhvbWVwYWdlIiwiYnVncyIsInJlYWRtZVBhdGgiLCJtZXNzYWdlIiwiY2hkaXIiLCJlbmNvZGluZyIsInN0ZGlvIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxLQUFLLFFBQU8sUUFBUTtBQUM1QixTQUFRQyxVQUFVLEVBQUVDLGFBQWEsUUFBTyxLQUFLO0FBQzdDLFNBQVFDLFdBQVdDLFdBQVcsUUFBTyxPQUFPO0FBRTVDLFNBQVFDLFNBQVMsUUFBTyxxQkFBcUI7QUFDN0MsU0FBUUMsYUFBYSxFQUFFQyxjQUFjLEVBQUVD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