1 | #! /usr/bin/env node
|
2 | const fs = require('fs');
|
3 | const child_process = require('child_process');
|
4 | const chalk = require('chalk');
|
5 | const { dasherize } = require('ember-cli-string-utils');
|
6 | const { pluralize, singularize } = require('i')();
|
7 |
|
8 | const CLI = {
|
9 | default(commandHandler) {
|
10 | !process.argv[2] ? commandHandler() : null;
|
11 | },
|
12 | command(commandName, commandHandler) {
|
13 | if (Array.isArray(commandName)) {
|
14 | return commandName.includes(process.argv[2]) ? commandHandler() : null;
|
15 | }
|
16 |
|
17 | commandName === process.argv[2] ? commandHandler() : null;
|
18 | }
|
19 | };
|
20 |
|
21 | CLI.default(printCommands);
|
22 | CLI.command('help', printCommands);
|
23 | CLI.command(['init', 'new'], generateInitialFolderStructure);
|
24 | CLI.command(['generate', 'g'], generateModelFiles);
|
25 | CLI.command(['console', 'c'], openConsole);
|
26 | CLI.command(['watch', 's', 'serve', 'server'], () => {
|
27 | buildMemServerDist();
|
28 | fs.watch(`${process.cwd()}/memserver`, { recursive: true }, () => buildMemServerDist());
|
29 | });
|
30 | CLI.command(['build', 'rollup'], buildMemServerDist);
|
31 | CLI.command(['version', 'v'], () => {
|
32 | console.log(chalk.cyan('[MemServer CLI]'), require('./package.json').version);
|
33 | });
|
34 |
|
35 | function printCommands() {
|
36 | console.log(`${chalk.cyan('[MemServer CLI] Usage:')} memserver ${chalk.yellow('<command (Default: help)>')}
|
37 |
|
38 | memserver init | new # Sets up the initial memserver folder structure
|
39 | memserver generate model ${chalk.yellow('[ModelName]')} # Generates the initial files for a MemServer Model ${chalk.cyan('[alias: "memserver g model"]')}
|
40 | memserver console # Starts a MemServer console in node.js ${chalk.cyan('[alias: "memserver c"]')}
|
41 | memserver serve | server ${chalk.yellow('[outputFile]')} # Builds an ES5 javascript bundle with all your memserver code continuosly on watch ${chalk.cyan('[alias: "memserver s"]')}
|
42 | memserver build | rollup ${chalk.yellow('[outputFile]')} # Builds an ES5 javascript bundle with all your memserver code
|
43 | memserver version | v # Displays memserver version
|
44 | `);
|
45 | }
|
46 |
|
47 | function generateInitialFolderStructure() {
|
48 | let memServerDirectory = getMemServerDirectory();
|
49 |
|
50 | if (!memServerDirectory) {
|
51 | memServerDirectory = './memserver';
|
52 | fs.mkdirSync(memServerDirectory);
|
53 | }
|
54 |
|
55 | if (!fs.existsSync(`${memServerDirectory}/server.js`)) {
|
56 | fs.writeFileSync(`${memServerDirectory}/server.js`, `export default function(Models) {
|
57 | }`);
|
58 | console.log(chalk.cyan('[MemServer CLI] /memserver/server.js created'));
|
59 | }
|
60 |
|
61 | if (!fs.existsSync(`${memServerDirectory}/initializer.js`)) {
|
62 | fs.writeFileSync(`${memServerDirectory}/initializer.js`, `export default function(Models) {
|
63 | }`);
|
64 | console.log(chalk.cyan('[MemServer CLI] /memserver/initializer.js created'));
|
65 |
|
66 | }
|
67 |
|
68 |
|
69 | createFixtureAndModelFoldersIfNeeded(memServerDirectory);
|
70 | }
|
71 |
|
72 | function createFixtureAndModelFoldersIfNeeded(memServerDirectory) {
|
73 | if (!fs.existsSync(`${memServerDirectory}/fixtures`)) {
|
74 | fs.mkdirSync(`${memServerDirectory}/fixtures`);
|
75 | console.log(chalk.cyan('[MemServer CLI] /memserver/fixtures folder created'));
|
76 | }
|
77 |
|
78 | if (!fs.existsSync(`${memServerDirectory}/models`)) {
|
79 | fs.mkdirSync(`${memServerDirectory}/models`);
|
80 | console.log(chalk.cyan('[MemServer CLI] /memserver/models folder created'));
|
81 | }
|
82 | }
|
83 |
|
84 | function generateModelFiles() {
|
85 | const memServerDirectory = getMemServerDirectory();
|
86 |
|
87 | if (!process.argv[3] || !process.argv[4]) {
|
88 | throw new Error(chalk.red('[MemServer CLI] Please put a modelName to the memserver generate. Example: $ memserver generate model user'));
|
89 | } else if (!memServerDirectory) {
|
90 | throw new Error(chalk.red('[MemServer CLI] cannot find /memserver folder. Did you run $ memserver init ?'));
|
91 | }
|
92 |
|
93 | createFixtureAndModelFoldersIfNeeded(memServerDirectory);
|
94 |
|
95 | const modelFileName = dasherize(singularize(process.argv[4]));
|
96 | const fixtureFileName = dasherize(pluralize(process.argv[4]));
|
97 |
|
98 | if (!fs.existsSync(`${memServerDirectory}/models/${modelFileName}.js`)) {
|
99 | fs.writeFileSync(`${memServerDirectory}/models/${modelFileName}.js`, `import Model from 'memserver/model';
|
100 |
|
101 | export default Model({
|
102 |
|
103 | });`);
|
104 | console.log(chalk.cyan(`[MemServer CLI] /memserver/models/${modelFileName}.js created`));
|
105 | }
|
106 |
|
107 | if (!fs.existsSync(`${memServerDirectory}/fixtures/${fixtureFileName}.js`)) {
|
108 | fs.writeFileSync(`${memServerDirectory}/fixtures/${fixtureFileName}.js`, `export default [
|
109 | ];`);
|
110 | console.log(chalk.cyan(`[MemServer CLI] /memserver/fixtures/${fixtureFileName}.js created`));
|
111 | }
|
112 | }
|
113 |
|
114 | function openConsole() {
|
115 | if (process.cwd().includes('memserver')) {
|
116 | throw new Error(chalk.red('[MemServer CLI] You are in the memserver directory, go to the root of your project to start memserver console.'));
|
117 | }
|
118 |
|
119 | const MemServer = require('./lib/index.js');
|
120 | const repl = require('repl');
|
121 |
|
122 | console.log(chalk.cyan('[MemServer CLI]'), 'Starting MemServer node.js console - Remember to MemServer.start() ;)');
|
123 | repl.start('> ');
|
124 | }
|
125 |
|
126 | function buildMemServerDist() {
|
127 | const outputFile = process.argv[3] || 'memserver.dist.js';
|
128 | const rollup = child_process.spawnSync('rollup', [
|
129 | '--config', `${require.resolve('memserver')}/../../rollup.config.js`, '-o', outputFile
|
130 | ]);
|
131 |
|
132 | console.log(rollup.stderr.toString());
|
133 | console.log(chalk.cyan('[MemServer CLI]'), ` NEW BUILD: ${outputFile}`);
|
134 | }
|
135 |
|
136 | function getMemServerDirectory() {
|
137 | const cwd = process.cwd();
|
138 |
|
139 | if (cwd.includes('memserver')) {
|
140 | const targetIndex = cwd.lastIndexOf('memserver') + 9;
|
141 |
|
142 | return cwd.slice(0, targetIndex);
|
143 | } else if (fs.readdirSync('.').includes('memserver')) {
|
144 | return `${cwd}/memserver`;
|
145 | }
|
146 | }
|