UNPKG

6.06 kBJavaScriptView Raw
1// eject A17 Boilerplate tasks into the working directory
2// so they can be independently changed, updated, replaced
3// without being tied to the A17 Boilerplate
4//
5// inspired by https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/scripts/eject.js
6
7const fs = require('fs');
8const path = require('path');
9const chalk = require('chalk');
10const os = require('os');
11const readlineSync = require('readline-sync');
12const utils = require('../utils');
13const data = utils.getManifest();
14
15const green = chalk.green;
16const cyan = chalk.cyan;
17const red = chalk.red;
18
19const rootDir = process.cwd();
20const baseDir = path.resolve(process.cwd(), data.paths.source);
21const targetDir = path.resolve(process.cwd(), data.paths.source, 'a17-boilerplate');
22const scssTargetDir = path.resolve(process.cwd(), data.paths.source, data.paths.styles, 'a17-boilerplate');
23const nodeModulesDir = path.resolve(__dirname, '../');
24const taskPath = path.resolve(targetDir, 'bin/a17-bp.js').replace(process.cwd(), '.');
25
26let ejectedTasks = false;
27let ejectedScss = false;
28
29console.log();
30console.log(red('Eject A17 Boilerplate tasks'));
31console.log();
32
33let answer = readlineSync.question('Are you sure? (y/n) ');
34let consent = false;
35if(answer === 'y') {
36 consent = true;
37}
38
39if (consent && fs.existsSync(targetDir)) {
40 console.log();
41 console.log(red("Looks like the a17-boilerplate folder already exists in the app root. This task would overwrite it and so is aborting to stop any damage happening. No files were changed or updated."));
42 console.log();
43 consent = false;
44}
45
46if (consent) {
47 ejectedTasks = true;
48 console.log(cyan('Ejecting A17 Boilerplate'));
49 console.log('');
50
51 console.log(cyan('Copying files'));
52 utils.mkdir(targetDir);
53 utils.mkdir(path.resolve(targetDir, 'config'));
54 utils.copyDir(
55 path.resolve(nodeModulesDir, 'bin'),
56 path.resolve(targetDir, 'bin')
57 );
58 utils.copyDir(
59 path.resolve(nodeModulesDir, 'tasks'),
60 path.resolve(targetDir, 'tasks')
61 );
62 utils.copyFile(
63 path.resolve(nodeModulesDir, 'utils.js'),
64 path.resolve(targetDir, 'utils.js')
65 );
66 utils.copyFile(
67 path.resolve(nodeModulesDir, 'webpack.config.js'),
68 path.resolve(targetDir, 'webpack.config.js')
69 );
70 utils.copyFile(
71 path.resolve(nodeModulesDir, 'config/manifest.json'),
72 path.resolve(targetDir, 'config/manifest.json')
73 );
74 fs.unlinkSync(path.resolve(targetDir, 'tasks/init.js'));
75
76 console.log('');
77 console.log(cyan('Updating dependencies'));
78 const pathToBpPackageJson = path.resolve(nodeModulesDir, 'package.json');
79 const pathToAppPackageJson = path.resolve(rootDir, 'package.json');
80 const bpPackage = require(pathToBpPackageJson);
81 const appPackage = require(pathToAppPackageJson);
82
83 const bpPackageName = bpPackage.name || '@area17/a17-boilerplate';
84
85 if (appPackage.devDependencies) {
86 if (appPackage.devDependencies[bpPackageName]) {
87 console.log(` Removing ${cyan(bpPackageName)} from devDependencies`);
88 delete appPackage.devDependencies[bpPackageName];
89 }
90 }
91
92 appPackage.dependencies = appPackage.dependencies || {};
93
94 if (appPackage.dependencies[bpPackageName]) {
95 console.log(` Removing ${cyan(bpPackageName)} from dependencies`);
96 delete appPackage.dependencies[bpPackageName];
97 }
98 Object.keys(bpPackage.dependencies).forEach(key => {
99 console.log(` Adding ${cyan(key)} to dependencies`);
100 appPackage.dependencies[key] = bpPackage.dependencies[key];
101 });
102 // Sort the deps
103 const unsortedDependencies = appPackage.dependencies;
104 appPackage.dependencies = {};
105 Object.keys(unsortedDependencies)
106 .sort()
107 .forEach(key => {
108 appPackage.dependencies[key] = unsortedDependencies[key];
109 });
110
111 console.log('');
112 console.log(cyan('Updating the scripts'));
113 let scriptName = 'eject';
114 if (appPackage.scripts[scriptName] && appPackage.scripts[scriptName] === 'a17-bp eject') {
115 console.log(` Removing ${cyan(scriptName)}`);
116 delete appPackage.scripts[scriptName];
117 }
118
119 scriptName = 'init';
120 if (appPackage.scripts[scriptName] && appPackage.scripts[scriptName] === 'a17-bp init') {
121 console.log(` Removing ${cyan(scriptName)}`);
122 delete appPackage.scripts[scriptName];
123 }
124
125 Object.keys(appPackage.scripts).forEach(key => {
126 if (appPackage.scripts[key].indexOf('a17-bp') == 0) {
127 appPackage.scripts[key] = appPackage.scripts[key].replace('a17-bp', 'node ' + taskPath);
128 console.log(` Updating ${cyan(key)}`);
129 }
130 });
131
132 console.log('');
133 console.log(cyan('Writing package.json'));
134 fs.writeFileSync(
135 path.resolve(rootDir, 'package.json'),
136 JSON.stringify(appPackage, null, 2) + os.EOL
137 );
138}
139
140console.log();
141console.log(red('Eject A17 Boilerplate SCSS'));
142console.log();
143answer = readlineSync.question('Are you sure? (y/n) ');
144consent = false;
145if(answer === 'y') {
146 consent = true;
147}
148
149if (consent && fs.existsSync(scssTargetDir)) {
150 console.log();
151 console.log(red("Looks like the a17-boilerplate folder already exists in the scss folder. This task would overwrite it and so is aborting to stop any damage happening. No files were changed or updated."));
152 console.log();
153 consent = false;
154}
155
156
157if (consent) {
158 ejectedScss = true;
159 console.log('');
160 console.log(cyan('Ejecting SCSS'));
161
162 utils.mkdir(scssTargetDir);
163 utils.copyDir(
164 path.resolve(nodeModulesDir, 'scss'),
165 path.resolve(scssTargetDir)
166 );
167}
168
169if (ejectedTasks || ejectedScss) {
170 console.log('');
171 console.log(green('Ejected successfully!'));
172 console.log();
173}
174if (ejectedTasks) {
175 console.log(cyan('Written tasks to: ' + targetDir));
176}
177if (ejectedScss) {
178 console.log(cyan('Written SCSS to: ' + scssTargetDir));
179 console.log();
180 console.log(red('!! SCSS update required !!'));
181 console.log();
182 console.log('Your app.scss (or equivalent) may need the following line updating:');
183 console.log(cyan('@import \'~@area17/a17-boilerplate/scss/a17-boilerplate\';'));
184 console.log('to:');
185 console.log(green('@import \'a17-boilerplate/a17-boilerplate\';'));
186}
187if (ejectedTasks || ejectedScss) {
188 console.log();
189}