memserver
Version:
in-memory database/ORM and http mock server you can run in-browser and node environments. Built for large frontend teams, fast tests and rapid prototyping
138 lines (108 loc) • 5.13 kB
JavaScript
require('babel-register')({
presets: ['env']
});
const fs = require('fs');
const child_process = require('child_process');
const chalk = require('chalk');
const { dasherize } = require('ember-cli-string-utils');
const { pluralize, singularize } = require('i')();
const CLI = {
default(commandHandler) {
!process.argv[2] ? commandHandler() : null;
},
command(commandName, commandHandler) {
if (Array.isArray(commandName)) {
return commandName.includes(process.argv[2]) ? commandHandler() : null;
}
commandName === process.argv[2] ? commandHandler() : null;
}
};
CLI.default(printCommands);
CLI.command('help', printCommands);
CLI.command(['init', 'new'], generateInitialFolderStructure);
CLI.command(['generate', 'g'], generateModelFiles);
CLI.command(['console', 'c'], openConsole);
CLI.command(['watch', 's', 'serve', 'server'], () => {
buildMemServerDist();
fs.watch(`${process.cwd()}/memserver`, { recursive: true }, () => buildMemServerDist());
});
CLI.command(['build', 'rollup'], buildMemServerDist);
function printCommands() {
console.log(`${chalk.cyan('[MemServer CLI] Usage:')} memserver ${chalk.yellow('<command (Default: help)>')}
memserver init | new # Sets up the initial memserver folder structure
memserver generate model ${chalk.yellow('[ModelName]')} # Generates the initial files for a MemServer Model ${chalk.cyan('[alias: "memserver g model"]')}
memserver console # Starts a MemServer console in node.js ${chalk.cyan('[alias: "memserver c"]')}
memserver serve | server ${chalk.yellow('[outputFile]')} # Builds an ES5 javascript bundle with all your memserver code continuosly on watch ${chalk.cyan('[alias: "memserver s"]')}
memserver build | rollup ${chalk.yellow('[outputFile]')} # Builds an ES5 javascript bundle with all your memserver code
`);
}
function generateInitialFolderStructure() {
let memServerDirectory = getMemServerDirectory();
if (!memServerDirectory) {
memServerDirectory = './memserver';
fs.mkdirSync(memServerDirectory);
}
if (!fs.existsSync(`${memServerDirectory}/server.js`)) {
fs.writeFileSync(`${memServerDirectory}/server.js`, `export default function(Models) {
}`);
console.log(chalk.cyan('[MemServer CLI] /memserver/server.js created'));
}
if (!fs.existsSync(`${memServerDirectory}/initializer.js`)) {
fs.writeFileSync(`${memServerDirectory}/initializer.js`, `export default function(Models) {
}`);
console.log(chalk.cyan('[MemServer CLI] /memserver/initializer.js created'));
}
createFixtureAndModelFoldersIfNeeded(memServerDirectory);
}
function createFixtureAndModelFoldersIfNeeded(memServerDirectory) {
if (!fs.existsSync(`${memServerDirectory}/fixtures`)) {
fs.mkdirSync(`${memServerDirectory}/fixtures`);
console.log(chalk.cyan('[MemServer CLI] /memserver/fixtures folder created'));
}
if (!fs.existsSync(`${memServerDirectory}/models`)) {
fs.mkdirSync(`${memServerDirectory}/models`);
console.log(chalk.cyan('[MemServer CLI] /memserver/models folder created'));
}
}
function generateModelFiles() {
const memServerDirectory = getMemServerDirectory();
if (!process.argv[3] || !process.argv[4]) {
throw new Error(chalk.red('[MemServer CLI] Please put a modelName to the memserver generate. Example: $ memserver generate model user'));
} else if (!memServerDirectory) {
throw new Error(chalk.red('[MemServer CLI] cannot find /memserver folder. Did you run $ memserver init ?'));
}
createFixtureAndModelFoldersIfNeeded(memServerDirectory);
const modelFileName = dasherize(singularize(process.argv[4]));
const fixtureFileName = dasherize(pluralize(process.argv[4]));
if (!fs.existsSync(`${memServerDirectory}/models/${modelFileName}.js`)) {
fs.writeFileSync(`${memServerDirectory}/models/${modelFileName}.js`, `import Model from 'memserver/model';
export default Model({
});`);
console.log(chalk.cyan(`[MemServer CLI] /memserver/models/${modelFileName}.js created`));
}
if (!fs.existsSync(`${memServerDirectory}/fixtures/${fixtureFileName}.js`)) {
fs.writeFileSync(`${memServerDirectory}/fixtures/${fixtureFileName}.js`, `export default [
];`);
console.log(chalk.cyan(`[MemServer CLI] /memserver/fixtures/${fixtureFileName}.js created`));
}
}
function openConsole() {
const MemServer = require('./lib/index.js');
const repl = require('repl');
console.log(chalk.cyan('[MemServer CLI]'), 'Starting MemServer node.js console - Remember to MemServer.start() ;)');
repl.start('> ');
}
function buildMemServerDist() {
const outputFile = process.argv[3] || 'memserver.dist.js';
const rollup = child_process.spawnSync('rollup', ['-c', '-o', outputFile]); // NOTE: check if this gets the right rollup.config.js file?
console.log(rollup.stderr.toString());
console.log(chalk.cyan('[MemServer CLI]'), ` NEW BUILD: ${outputFile}`);
}
function getMemServerDirectory() {
const cwd = process.cwd();
if (cwd.includes('memserver')) {
const targetIndex = cwd.lastIndexOf('memserver') + 9;
return cwd.slice(0, targetIndex);
}
}