-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinstaller.js
122 lines (110 loc) · 3.03 KB
/
installer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
const fs = require("fs");
const { html, css, javascript } = require("./models.js");
const init = async (projectFileTree) => {
const projectFolder = Object.keys(projectFileTree)[0];
for (const [subFolder, entryFile] of Object.entries(projectFileTree[projectFolder])) {
switch (extension(entryFile)) {
case "html":
setupFolder(
projectFolder,
entryFile,
html,
projectFileTree
);
break;
case "css":
setupFolder(
`${projectFolder}/${subFolder}`,
entryFile,
css
);
break;
case "js":
setupFolder(
`${projectFolder}/${subFolder}`,
entryFile,
javascript
);
break;
default:
const assetsFolderPath = `${projectFolder}/${subFolder}/${entryFile}`;
await fs.mkdirSync(assetsFolderPath, { recursive: true });
await loadAssets(
process.cwd() + "/" + assetsFolderPath,
{
'based.png': __dirname + '/public/based_squidward.png',
'favicon.ico': __dirname + '/public/favicon.ico'
}
);
await process.exit(0);
}
}
}
const extension = (file) => file.split(".").pop();
const setupFolder = async (path, seedFile, loaderFn, loaderParam) => {
await fs.mkdirSync(path, { recursive: true });
await fs.writeFileSync(`${path}/${seedFile}`, loaderFn(loaderParam));
}
const loadAssets = async (path, assets) => {
for (const file in assets) {
await fs.copyFileSync(assets[file], `${path}/${file}`);
}
}
const getValidName = (input, _default) => {
const FILE_NAME = /^(?!.*(?:\+|\^|\\|\/|\`|\|))[a-zA-z0-9 -]+$/
if (!input) {
return _default;
}
if (!FILE_NAME.exec(input)) {
console.log(`:: Invalid name! Setting (${_default}) as default name`);
return _default;
}
if(extension(input)!==extension(_default)){
return extension(_default) !== _default
? `${input}.${extension(_default)}`
: input
;
}
return input;
}
const banner = `
Welcome to the Based command line interface!!
This utility will walk you through creating a brand new project with the Based Stack.
:: The hottest frontend stack for web development ::
Tip: use \`npm i live-server -g\` to install live-server and stop worrying about refreshing the page :)
Check: https://github.com/eniodev/based for setup details.
Press ^C at any time to exit the cli.
`;
const setupOptions = [
{
question: "Html file name: (index.html)",
default: "index.html"
},
{
question: "Css folder name: (styles)",
default: "styles",
child: {
question: "Css file name: (index.css)",
default: "index.css"
}
},
{
question: "Javascript folder name: (scripts)",
default: "scripts",
child: {
question: "Javascript file name: (index.js)",
default: "index.js"
}
},
{
question: "Pick a name for your images folder: (images)",
default: "images",
parent: "assets"
}
]
module.exports = {
init,
banner,
getValidName,
setupOptions
}