create-react-ssr-layout
Version:
A useful tool to quickly build a starting express server that uses custom SSR with a custom jsx render engine
130 lines (119 loc) • 3.49 kB
JavaScript
const fs = require('fs/promises');
const dependenciesMap = {
webpack: '',
json: '',
routing: 'react-router-dom',
morgan: '',
dotenv: 'dotenv',
sequelize: 'sequelize pg pg-hstore',
session: 'express-session session-file-store',
axios: 'axios',
bcrypt: 'bcrypt',
eslint: '',
prettier: '',
};
const devDependenciesMap = {
webpack: '@babel/plugin-proposal-class-properties babel-loader webpack webpack-cli',
json: '',
routing: '',
morgan: 'morgan',
dotenv: '',
sequelize: 'sequelize-cli',
session: '',
axios: '',
bcrypt: '',
prettier: 'prettier eslint-config-prettier',
};
const scriptsToPackageJson = async () => {
const packageJson = await fs.readFile('package.json', 'utf-8');
const jsonData = JSON.parse(packageJson);
const devDependencies = [
'npm',
'i',
'-D',
'@babel/node',
'@babel/preset-env',
'@babel/preset-react',
'babel-loader',
'eslint',
'eslint-config-airbnb',
'eslint-config-prettier',
'eslint-plugin-import',
'eslint-plugin-jsx-a11y',
'eslint-plugin-react',
'eslint-plugin-react-hooks',
'morgan',
'sequelize-cli',
'webpack',
'webpack-cli',
];
const dependencies = [
'npm',
'i',
'express',
'react',
'react-dom',
'cookie-parser',
'dotenv',
'jsonwebtoken',
'pg',
'pg-hstore',
'react-dom',
'sequelize',
];
jsonData.scripts.dev = 'babel-node src/server.js';
jsonData.scripts.start = 'webpack -d eval-source-map && babel-node src/server.js';
jsonData.scripts.webpack = 'webpack -wd eval-source-map';
jsonData.scripts['db:reset'] =
'npx sequelize-cli db:drop && npx sequelize-cli db:create && npx sequelize-cli db:migrate && npx sequelize-cli db:seed:all';
jsonData.scripts.launch = 'npm run db:reset && npm run start';
// configure starting scripts and dependenices based on options provided
// options.forEach((option) => {
// devDependencies.push(devDependenciesMap[option]);
// dependencies.push(dependenciesMap[option]);
// if (option === 'webpack') {
// jsonData.scripts.webpack = 'webpack -wd eval-source-map';
// jsonData.scripts.start = 'webpack -d eval-source-map && babel-node src/server.js';
// }
// if (option === 'sequelize') {
// jsonData.scripts[
// 'prep-db'
// ] = `npx sequelize-cli db:drop && npx sequelize-cli db:create && npx sequelize-cli db:migrate && npx sequelize-cli db:seed:all`;
// jsonData.scripts.launch = `npm run prep-db && ${jsonData.scripts.start}`;
// }
// });
jsonData.scripts.deps = [...devDependencies, '&&', ...dependencies]
.filter((dep) => dep !== '')
.join(' ');
await fs.writeFile('package.json', JSON.stringify(jsonData, null, ' '), 'utf-8');
};
function checkPackageJson() {
return fs.readFile('package.json', 'utf-8');
}
const instructions = [
{
command: 'npm start',
description: 'Configure bundles and start the server',
},
{
command: 'npm run dev',
description: 'Start the server',
},
{
command: 'npm run webpack',
description: 'Start webpack in watch mode',
},
{
command: 'npm run db:reset',
description: 'Drop, create, migrate, and seed the database',
},
{
command: 'npm run launch',
description: 'Migrate + Seed + Quick start',
},
{
command: 'npm run deps',
description: 'Install all dependencies',
},
];
module.exports = { scriptsToPackageJson, checkPackageJson, instructions };