not-node 6.1.5 → 6.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/not-cli.mjs +3 -521
- package/package.json +1 -1
- package/playground/.env +2 -2
- package/playground/nginx/development.conf +4 -12
- package/playground/nginx/production.conf +1 -9
- package/playground/nginx/stage.conf +1 -9
- package/playground/pm2/development.json +6 -6
- package/playground/pm2/production.json +5 -5
- package/playground/pm2/stage.json +5 -5
- package/playground/site/app/front/build/admin.js +1 -45
- package/playground/site/app/front/build/client.js +1 -45
- package/playground/site/app/front/build/guest.js +1 -45
- package/playground/site/app/front/build/root.js +1 -45
- package/playground/site/app/front/build/user.js +1 -45
- package/playground/site/app/front/src/admin/notNodeModule/index.js +25 -0
- package/playground/site/app/front/src/client/notNodeModule/index.js +25 -0
- package/playground/site/app/front/src/common/index.js +0 -15
- package/playground/site/app/front/src/guest/notNodeModule/index.js +25 -0
- package/playground/site/app/front/src/root/notNodeModule/index.js +25 -0
- package/playground/site/app/front/src/user/notNodeModule/index.js +25 -0
- package/playground/site/app/server/config/common.json +83 -117
- package/playground/site/app/server/config/development.json +32 -31
- package/playground/site/app/server/modules/notNodeModule/index.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/const.js +1 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/admin/index.js +29 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/admin/ncNewModel.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/admin/ncTester.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/client/index.js +29 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/client/ncNewModel.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/client/ncTester.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/common/ncNewModelCommon.js +103 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/common/validators.js +44 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/common/ws.client.js +25 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/guest/index.js +29 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/guest/ncNewModel.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/guest/ncTester.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/root/index.js +29 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/root/ncNewModel.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/root/ncTester.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/user/index.js +29 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/user/ncNewModel.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/controllers/user/ncTester.js +11 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/_newModel_data.js +35 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/_tester_data.js +36 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/newModel.create.js +49 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/newModel.delete.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/newModel.get.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/newModel.getRaw.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/newModel.listAll.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/newModel.listAndCount.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/newModel.update.js +40 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/tester.create.js +52 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/tester.delete.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/tester.get.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/tester.getRaw.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/tester.listAll.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/tester.listAndCount.js +8 -0
- package/playground/site/app/server/modules/notNodeModule/src/forms/tester.update.js +41 -0
- package/playground/site/app/server/modules/notNodeModule/src/logics/newModel.js +229 -0
- package/playground/site/app/server/modules/notNodeModule/src/logics/tester.js +229 -0
- package/playground/site/app/server/modules/notNodeModule/src/models/newModel.js +64 -0
- package/playground/site/app/server/modules/notNodeModule/src/models/tester.js +66 -0
- package/playground/site/app/server/modules/notNodeModule/src/routes/newModel.js +124 -0
- package/playground/site/app/server/modules/notNodeModule/src/routes/newModel.manifest.js +213 -0
- package/playground/site/app/server/modules/notNodeModule/src/routes/newModel.ws.js +29 -0
- package/playground/site/app/server/modules/notNodeModule/src/routes/tester.js +92 -0
- package/playground/site/app/server/modules/notNodeModule/src/routes/tester.manifest.js +215 -0
- package/playground/site/app/server/modules/notNodeModule/src/routes/tester.ws.js +29 -0
- package/playground/site/app/server/routes/site.js +71 -59
- package/src/cli/actions/entity.mjs +33 -0
- package/src/cli/actions/env.mjs +1 -0
- package/src/cli/actions/index.mjs +23 -0
- package/src/cli/actions/module.front.mjs +35 -0
- package/src/cli/actions/module.server.mjs +33 -0
- package/src/cli/actions/nginx.mjs +1 -0
- package/src/cli/actions/pm2.mjs +1 -0
- package/src/cli/actions/project.mjs +146 -0
- package/src/cli/lib/args.mjs +72 -0
- package/src/cli/lib/entity.mjs +46 -0
- package/src/cli/lib/fs.mjs +176 -0
- package/src/cli/lib/log.mjs +25 -0
- package/src/cli/lib/messages.mjs +29 -0
- package/src/cli/lib/module.front.mjs +57 -0
- package/src/cli/lib/module.server.mjs +128 -0
- package/src/cli/lib/opts.mjs +33 -0
- package/src/cli/lib/project.mjs +16 -0
- package/src/cli/lib/structures.mjs +37 -0
- package/src/cli/readers/roles.mjs +2 -2
- package/src/cli/renderers/controllersIndex.mjs +1 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import Logger from "./log.mjs";
|
|
2
|
+
|
|
3
|
+
const TEMPLATE_OPTIONS = "__options__";
|
|
4
|
+
const VAR_PREFIX = "__";
|
|
5
|
+
|
|
6
|
+
import * as Readers from "../readers/index.mjs";
|
|
7
|
+
import inquirer from "inquirer";
|
|
8
|
+
|
|
9
|
+
async function readArgs(structure, config) {
|
|
10
|
+
let result = {};
|
|
11
|
+
if (Object.hasOwn(structure, "args")) {
|
|
12
|
+
for (let entry of structure.args) {
|
|
13
|
+
if (!Object.hasOwn(config, entry)) {
|
|
14
|
+
Logger.log(
|
|
15
|
+
`no ${entry} in config, reading data from user input`
|
|
16
|
+
);
|
|
17
|
+
config[entry] = await Readers[entry](inquirer, config);
|
|
18
|
+
}
|
|
19
|
+
result[entry] = config[entry];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//console.log(JSON.stringify(result, null, 4));
|
|
23
|
+
if (Object.hasOwn(structure, "options")) {
|
|
24
|
+
result[TEMPLATE_OPTIONS] = structure.options;
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function isFilename(name, descr) {
|
|
30
|
+
if (descr.type === "file") {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (name.startsWith(VAR_PREFIX) && name.endsWith(VAR_PREFIX)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return name.indexOf(".") > -1;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function isVariable(name) {
|
|
40
|
+
return name.startsWith(VAR_PREFIX) && name.endsWith(VAR_PREFIX);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function getVariableName(name) {
|
|
44
|
+
return name.replace(new RegExp(VAR_PREFIX, "g"), "");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function dirRequiresAbsentModules(subStructure, config) {
|
|
48
|
+
return (
|
|
49
|
+
Object.hasOwn(subStructure, "ifModules") &&
|
|
50
|
+
Array.isArray(subStructure.ifModules) &&
|
|
51
|
+
!subStructure.ifModules.every((entry) => config.modules.includes(entry))
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function dirRequiresNotNullArgs(subStructure, config) {
|
|
56
|
+
return (
|
|
57
|
+
Object.hasOwn(subStructure, "ifArgs") &&
|
|
58
|
+
Array.isArray(subStructure.ifArgs) &&
|
|
59
|
+
!subStructure.ifArgs.every((entry) => {
|
|
60
|
+
return Object.hasOwn(config, entry) && config[entry];
|
|
61
|
+
})
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export {
|
|
66
|
+
readArgs,
|
|
67
|
+
isFilename,
|
|
68
|
+
isVariable,
|
|
69
|
+
getVariableName,
|
|
70
|
+
dirRequiresAbsentModules,
|
|
71
|
+
dirRequiresNotNullArgs,
|
|
72
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { firstLetterToLower } from "../../../src/common.js";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
import * as Readers from "../readers/index.mjs";
|
|
5
|
+
import * as Renderers from "../renderers/index.mjs";
|
|
6
|
+
import { renderFile, createDir } from "./fs.mjs";
|
|
7
|
+
|
|
8
|
+
import Options from "./opts.mjs";
|
|
9
|
+
|
|
10
|
+
async function renderEntityFiles(module_src_dir, data, config) {
|
|
11
|
+
for (let layerName of data.layers) {
|
|
12
|
+
if (Object.hasOwn(Renderers, layerName)) {
|
|
13
|
+
await Renderers[layerName](
|
|
14
|
+
resolve(module_src_dir, `./${layerName}`),
|
|
15
|
+
data,
|
|
16
|
+
config,
|
|
17
|
+
renderFile,
|
|
18
|
+
Options.PATH_TMPL,
|
|
19
|
+
createDir
|
|
20
|
+
);
|
|
21
|
+
} else {
|
|
22
|
+
console.error("No renderer for layer: ", layerName);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function createEntity(modules_dir, config) {
|
|
28
|
+
const ModuleName = await Readers.ModuleName(inquirer);
|
|
29
|
+
const moduleName = firstLetterToLower(ModuleName);
|
|
30
|
+
const moduleDir = resolve(modules_dir, ModuleName);
|
|
31
|
+
const moduleLayers = await Readers.moduleLayers(inquirer);
|
|
32
|
+
const moduleConfig = { ...config, moduleName, ModuleName, moduleLayers };
|
|
33
|
+
console.log();
|
|
34
|
+
const entityData = await Readers.entityData(
|
|
35
|
+
inquirer,
|
|
36
|
+
moduleConfig,
|
|
37
|
+
moduleConfig.moduleLayers
|
|
38
|
+
);
|
|
39
|
+
await renderEntityFiles(
|
|
40
|
+
resolve(moduleDir, "./src"),
|
|
41
|
+
entityData,
|
|
42
|
+
moduleConfig
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { createEntity, renderEntityFiles };
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import Logger from "./log.mjs";
|
|
2
|
+
import {
|
|
3
|
+
readArgs,
|
|
4
|
+
isFilename,
|
|
5
|
+
isVariable,
|
|
6
|
+
dirRequiresAbsentModules,
|
|
7
|
+
dirRequiresNotNullArgs,
|
|
8
|
+
getVariableName,
|
|
9
|
+
} from "./args.mjs";
|
|
10
|
+
|
|
11
|
+
import { ProjectSubStructures } from "./structures.mjs";
|
|
12
|
+
|
|
13
|
+
import { spawn } from "node:child_process";
|
|
14
|
+
import { resolve, join } from "node:path";
|
|
15
|
+
import {
|
|
16
|
+
copyFile,
|
|
17
|
+
constants,
|
|
18
|
+
mkdir,
|
|
19
|
+
writeFile,
|
|
20
|
+
readFile,
|
|
21
|
+
} from "node:fs/promises";
|
|
22
|
+
|
|
23
|
+
import ejs from "ejs";
|
|
24
|
+
|
|
25
|
+
import Options from "./opts.mjs";
|
|
26
|
+
const PATH_TMPL = Options.PATH_TMPL;
|
|
27
|
+
|
|
28
|
+
async function renderFile(input, dest, data) {
|
|
29
|
+
Logger.log("render", dest);
|
|
30
|
+
const renderedFileContent = await ejs.renderFile(input, data, {
|
|
31
|
+
async: true,
|
|
32
|
+
});
|
|
33
|
+
await writeFile(dest, renderedFileContent);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function createFileContent(filePath, structure, config) {
|
|
37
|
+
if (typeof structure == "string") {
|
|
38
|
+
await copyTmplFile(resolve(PATH_TMPL, structure), filePath);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (Object.hasOwn(structure, "tmpl")) {
|
|
42
|
+
const tmplFilePath = resolve(PATH_TMPL, structure.tmpl);
|
|
43
|
+
const data = await readArgs(structure, config);
|
|
44
|
+
await renderFile(tmplFilePath, filePath, data);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function copyTmplFile(from, to) {
|
|
49
|
+
try {
|
|
50
|
+
// console.log("cp", from, to);
|
|
51
|
+
await copyFile(from, to, constants.COPYFILE_EXCL);
|
|
52
|
+
} catch {
|
|
53
|
+
//console.error("The file could not be copied", from, to);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function createDir(dirPath) {
|
|
58
|
+
try {
|
|
59
|
+
//console.log("mkdir", dirPath);
|
|
60
|
+
await mkdir(dirPath, { recursive: true });
|
|
61
|
+
} catch {
|
|
62
|
+
// console.error("Can't create directory", dirPath);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function createDirContent(dest, structure = {}, config = {}) {
|
|
67
|
+
if (typeof structure === "string") {
|
|
68
|
+
//console.log("need to create sub structure", structure);
|
|
69
|
+
await createDirContent(dest, ProjectSubStructures[structure], config);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const dirs = {};
|
|
73
|
+
//creating files first
|
|
74
|
+
for (let entry in structure) {
|
|
75
|
+
const subStructure = structure[entry];
|
|
76
|
+
if (isVariable(entry)) {
|
|
77
|
+
entry = config[getVariableName(entry)];
|
|
78
|
+
}
|
|
79
|
+
if (isFilename(entry, subStructure)) {
|
|
80
|
+
// console.log(dest, entry);
|
|
81
|
+
const filePath = join(dest, entry);
|
|
82
|
+
await createFileContent(filePath, subStructure, config);
|
|
83
|
+
} else {
|
|
84
|
+
dirs[entry] = subStructure;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//then going deeper
|
|
88
|
+
for (let entry in dirs) {
|
|
89
|
+
const subStructure = dirs[entry];
|
|
90
|
+
const directoryPath = join(dest, entry);
|
|
91
|
+
if (dirRequiresAbsentModules(subStructure, config)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (dirRequiresNotNullArgs(subStructure, config)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
await createDir(directoryPath);
|
|
98
|
+
if (Object.hasOwn(subStructure, "content")) {
|
|
99
|
+
await createDirContent(directoryPath, subStructure.content, config);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function makeScriptExecutable(pathToTargetScript) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
console.log(`chmod`, "+x", pathToTargetScript);
|
|
107
|
+
let npmInstall = spawn(`chmod`, ["+x", pathToTargetScript]);
|
|
108
|
+
npmInstall.stderr.on("data", (data) => {
|
|
109
|
+
Logger.error(data.toString());
|
|
110
|
+
});
|
|
111
|
+
npmInstall.on("exit", (code) => {
|
|
112
|
+
if (code == 0) {
|
|
113
|
+
resolve();
|
|
114
|
+
} else {
|
|
115
|
+
reject(`chmod +x ${pathToTargetScript} ${code}`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function installPackages(siteDir) {
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
console.log("installing packages...");
|
|
124
|
+
let npmInstall = spawn(`npm`, ["i"], {
|
|
125
|
+
cwd: siteDir,
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
npmInstall.stderr.on("data", (data) => {
|
|
129
|
+
Logger.error(data.toString());
|
|
130
|
+
});
|
|
131
|
+
npmInstall.on("exit", (code) => {
|
|
132
|
+
if (code == 0) {
|
|
133
|
+
resolve();
|
|
134
|
+
} else {
|
|
135
|
+
reject(`NPM install exited with code ${code}`);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function buildClientSideScripts(siteDir) {
|
|
142
|
+
return new Promise((resolve, reject) => {
|
|
143
|
+
console.log("building client side scripts...");
|
|
144
|
+
let npmInstall = spawn(`npm`, ["run", "build"], {
|
|
145
|
+
cwd: siteDir,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
npmInstall.stderr.on("data", (data) => {
|
|
149
|
+
Logger.error(data.toString());
|
|
150
|
+
});
|
|
151
|
+
npmInstall.on("exit", (code) => {
|
|
152
|
+
if (code == 0) {
|
|
153
|
+
resolve();
|
|
154
|
+
} else {
|
|
155
|
+
reject(`npm run build job exited with code ${code}`);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async function readJSONFile(fname) {
|
|
162
|
+
const rawdata = await readFile(fname);
|
|
163
|
+
return JSON.parse(rawdata);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export {
|
|
167
|
+
createDir,
|
|
168
|
+
copyTmplFile,
|
|
169
|
+
createFileContent,
|
|
170
|
+
renderFile,
|
|
171
|
+
createDirContent,
|
|
172
|
+
makeScriptExecutable,
|
|
173
|
+
buildClientSideScripts,
|
|
174
|
+
installPackages,
|
|
175
|
+
readJSONFile,
|
|
176
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class Logger {
|
|
2
|
+
#silent = true;
|
|
3
|
+
|
|
4
|
+
log() {
|
|
5
|
+
!this.#silent && console.log(...arguments);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
error() {
|
|
9
|
+
!this.#silent && console.error(...arguments);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
debug() {
|
|
13
|
+
!this.#silent && console.debug(...arguments);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
info() {
|
|
17
|
+
!this.#silent && console.info(...arguments);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
setSilent(val) {
|
|
21
|
+
this.#silent = val;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default new Logger();
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function postStartupInstructions(siteDir, config) {
|
|
2
|
+
console.log(
|
|
3
|
+
"Generation of source code, configurations, toolchain and installation of packages successfully finished."
|
|
4
|
+
);
|
|
5
|
+
if (config.nginx) {
|
|
6
|
+
console.log("To enable NGINX reverse proxy:");
|
|
7
|
+
console.log(
|
|
8
|
+
"1. Copy config file for desired envrionment to NGINX directory and enable it"
|
|
9
|
+
);
|
|
10
|
+
for (let env of ["development", "stage", "production"]) {
|
|
11
|
+
console.log(
|
|
12
|
+
`For '${env}' environment exec while in project directory:`
|
|
13
|
+
);
|
|
14
|
+
console.log(
|
|
15
|
+
`$ sudo cp nginx/${env}.conf to /var/nginx/sites-available/${config.hostname[env]}.conf`
|
|
16
|
+
);
|
|
17
|
+
console.log(
|
|
18
|
+
`$ sudo ln -s /var/nginx/sites-available/${config.hostname[env]}.conf /var/nginx/sites-enabled/${config.hostname[env]}.conf`
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
console.log("2. Restart NGINX server");
|
|
22
|
+
console.log("$ sudo systemctl restart nginx");
|
|
23
|
+
}
|
|
24
|
+
console.log(
|
|
25
|
+
`To start server navigate to [project]/site directory (cd '${siteDir}') and run 'npm start'`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { postStartupInstructions };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { firstLetterToLower } from "../../../src/common.js";
|
|
3
|
+
import { createDir, createDirContent, renderFile } from "./fs.mjs";
|
|
4
|
+
import { ProjectSubStructures } from "./structures.mjs";
|
|
5
|
+
import * as Readers from "../readers/index.mjs";
|
|
6
|
+
import * as Renderers from "../renderers/index.mjs";
|
|
7
|
+
import inquirer from "inquirer";
|
|
8
|
+
import Options from "./opts.mjs";
|
|
9
|
+
|
|
10
|
+
async function createFrontModule(modules_dir, config) {
|
|
11
|
+
const ModuleName = await Readers.ModuleName(inquirer);
|
|
12
|
+
const moduleName = firstLetterToLower(ModuleName);
|
|
13
|
+
const targetRoles = await Readers.roles(inquirer);
|
|
14
|
+
for (let role of targetRoles) {
|
|
15
|
+
const targetModuleRoleDir = resolve(modules_dir, role, moduleName);
|
|
16
|
+
console.log("creating directory for role", role);
|
|
17
|
+
await createDir(targetModuleRoleDir);
|
|
18
|
+
await Renderers.controllersIndex(
|
|
19
|
+
targetModuleRoleDir,
|
|
20
|
+
[],
|
|
21
|
+
{ ...config, roles: targetRoles },
|
|
22
|
+
renderFile,
|
|
23
|
+
Options.PATH_TMPL
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function createBootstrapFrontModule(modules_dir, config) {
|
|
29
|
+
await createDir(modules_dir);
|
|
30
|
+
await createDirContent(
|
|
31
|
+
modules_dir,
|
|
32
|
+
ProjectSubStructures["module.front"],
|
|
33
|
+
config
|
|
34
|
+
);
|
|
35
|
+
for (let role of config.roles) {
|
|
36
|
+
await createDir(resolve(modules_dir, role));
|
|
37
|
+
const targetFrontModuleDir = resolve(modules_dir, role, "main");
|
|
38
|
+
await createDir(targetFrontModuleDir);
|
|
39
|
+
if (role === "guest") {
|
|
40
|
+
await Renderers.frontModuleGuestMain(
|
|
41
|
+
targetFrontModuleDir,
|
|
42
|
+
{ ...config, roleName: role },
|
|
43
|
+
renderFile,
|
|
44
|
+
Options.PATH_TMPL
|
|
45
|
+
);
|
|
46
|
+
} else {
|
|
47
|
+
await Renderers.frontModuleRoleMain(
|
|
48
|
+
targetFrontModuleDir,
|
|
49
|
+
{ ...config, roleName: role },
|
|
50
|
+
renderFile,
|
|
51
|
+
Options.PATH_TMPL
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { createBootstrapFrontModule, createFrontModule };
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { firstLetterToLower } from "../../../src/common.js";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
|
|
5
|
+
import * as Readers from "../readers/index.mjs";
|
|
6
|
+
import * as Renderers from "../renderers/index.mjs";
|
|
7
|
+
import Options from "../lib/opts.mjs";
|
|
8
|
+
const PATH_TMPL = Options.PATH_TMPL;
|
|
9
|
+
import { renderFile, createDir, createDirContent } from "./fs.mjs";
|
|
10
|
+
import {
|
|
11
|
+
ProjectSubStructures,
|
|
12
|
+
ApplicationModuleServerControllersCommonStructure,
|
|
13
|
+
} from "./structures.mjs";
|
|
14
|
+
|
|
15
|
+
import { renderEntityFiles } from "./entity.mjs";
|
|
16
|
+
|
|
17
|
+
function entitiesInLayers(layersList = []) {
|
|
18
|
+
return (
|
|
19
|
+
layersList.includes("models") ||
|
|
20
|
+
layersList.includes("routes") ||
|
|
21
|
+
layersList.includes("logics")
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function createLayersDirs(modules_dir, layersList, ModuleName) {
|
|
26
|
+
if (layersList.length) {
|
|
27
|
+
await createDir(resolve(modules_dir, ModuleName, "./src"));
|
|
28
|
+
}
|
|
29
|
+
for (let layer of layersList) {
|
|
30
|
+
await createDir(resolve(modules_dir, ModuleName, "./src", layer));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function renderServerControllersCommons(
|
|
35
|
+
module_src_dir,
|
|
36
|
+
entitiesData,
|
|
37
|
+
config
|
|
38
|
+
) {
|
|
39
|
+
const dirPath = resolve(module_src_dir, `./common`);
|
|
40
|
+
await createDir(dirPath);
|
|
41
|
+
await createDirContent(
|
|
42
|
+
dirPath,
|
|
43
|
+
ApplicationModuleServerControllersCommonStructure,
|
|
44
|
+
{}
|
|
45
|
+
);
|
|
46
|
+
await Renderers.controllersCommons(
|
|
47
|
+
dirPath,
|
|
48
|
+
entitiesData,
|
|
49
|
+
config,
|
|
50
|
+
renderFile,
|
|
51
|
+
PATH_TMPL
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function renderServerContollersIndexes(
|
|
56
|
+
module_src_dir,
|
|
57
|
+
entitiesData,
|
|
58
|
+
config
|
|
59
|
+
) {
|
|
60
|
+
const subDirList = [...config.roles];
|
|
61
|
+
for (let dirName of subDirList) {
|
|
62
|
+
await Renderers.controllersIndex(
|
|
63
|
+
resolve(module_src_dir, `./controllers/${dirName}`),
|
|
64
|
+
entitiesData,
|
|
65
|
+
config,
|
|
66
|
+
renderFile,
|
|
67
|
+
PATH_TMPL,
|
|
68
|
+
createDir
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function createServerModule(modules_dir, config) {
|
|
74
|
+
//read module name
|
|
75
|
+
const ModuleName = await Readers.ModuleName(inquirer);
|
|
76
|
+
const moduleName = firstLetterToLower(ModuleName);
|
|
77
|
+
const moduleDir = resolve(modules_dir, ModuleName);
|
|
78
|
+
const moduleConfig = { ...config, moduleName, ModuleName };
|
|
79
|
+
await createDir(moduleDir);
|
|
80
|
+
//console.log(JSON.stringify(moduleConfig, null, 4));
|
|
81
|
+
await createDirContent(
|
|
82
|
+
moduleDir,
|
|
83
|
+
ProjectSubStructures["module.server"],
|
|
84
|
+
moduleConfig
|
|
85
|
+
);
|
|
86
|
+
const layersList = moduleConfig.moduleLayers;
|
|
87
|
+
await createLayersDirs(modules_dir, layersList, ModuleName);
|
|
88
|
+
//list of entities and its presence thru all selected layers
|
|
89
|
+
let entitiesList = [];
|
|
90
|
+
if (entitiesInLayers(layersList)) {
|
|
91
|
+
//should collect all first, to have full list of items for index files imports
|
|
92
|
+
while (await Readers.isUserNeedCreateEntity(inquirer)) {
|
|
93
|
+
const entityData = await Readers.entityData(
|
|
94
|
+
inquirer,
|
|
95
|
+
config,
|
|
96
|
+
layersList
|
|
97
|
+
);
|
|
98
|
+
entitiesList.push(entityData);
|
|
99
|
+
}
|
|
100
|
+
for (let entityData of entitiesList) {
|
|
101
|
+
await renderEntityFiles(
|
|
102
|
+
resolve(moduleDir, "./src"),
|
|
103
|
+
entityData,
|
|
104
|
+
moduleConfig
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
if (layersList.includes("controllers")) {
|
|
108
|
+
await renderServerContollersIndexes(
|
|
109
|
+
resolve(moduleDir, "./src"),
|
|
110
|
+
entitiesList,
|
|
111
|
+
moduleConfig
|
|
112
|
+
);
|
|
113
|
+
await renderServerControllersCommons(
|
|
114
|
+
resolve(moduleDir, "./src/controllers"),
|
|
115
|
+
entitiesList,
|
|
116
|
+
moduleConfig
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
createLayersDirs,
|
|
124
|
+
entitiesInLayers,
|
|
125
|
+
renderServerControllersCommons,
|
|
126
|
+
createServerModule,
|
|
127
|
+
renderServerContollersIndexes,
|
|
128
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { DEFAULT_PRIMARY_ROLES_SET } from "../const.mjs";
|
|
3
|
+
import * as url from "url";
|
|
4
|
+
const __dirname = url.fileURLToPath(new URL(".", import.meta.url));
|
|
5
|
+
|
|
6
|
+
class Options {
|
|
7
|
+
#DEFAULT_SERVER_MODULES_SUB_PATH = "./site/app/server/modules";
|
|
8
|
+
get DEFAULT_SERVER_MODULES_SUB_PATH() {
|
|
9
|
+
return this.#DEFAULT_SERVER_MODULES_SUB_PATH;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
#DEFAULT_FRONT_MODULES_SUB_PATH = "./site/app/front/src";
|
|
13
|
+
get DEFAULT_FRONT_MODULES_SUB_PATH() {
|
|
14
|
+
return this.#DEFAULT_FRONT_MODULES_SUB_PATH;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#PATH_TMPL = resolve(__dirname, "../../../tmpl/files");
|
|
18
|
+
get PATH_TMPL() {
|
|
19
|
+
return this.#PATH_TMPL;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#roles = DEFAULT_PRIMARY_ROLES_SET;
|
|
23
|
+
get roles() {
|
|
24
|
+
return this.#roles;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
set roles(val) {
|
|
28
|
+
if (Array.isArray(val)) {
|
|
29
|
+
this.#roles = val;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export default new Options();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readJSONFile } from "./fs.mjs";
|
|
2
|
+
|
|
3
|
+
async function loadProjectConfig(siteDir) {
|
|
4
|
+
const fname = `${siteDir}/project.manifest.json`;
|
|
5
|
+
console.log(fname);
|
|
6
|
+
const manifest = await readJSONFile(fname);
|
|
7
|
+
return {
|
|
8
|
+
AppName: manifest.name,
|
|
9
|
+
roles: manifest.targets.server.roles,
|
|
10
|
+
serverModulesDir: manifest.targets.server.modules.serverModulesDir,
|
|
11
|
+
frontModulesDir: manifest.targets.server.modules.frontModulesDir,
|
|
12
|
+
modules: Object.keys(manifest.targets.server.modules.npm),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { loadProjectConfig };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//file system structure
|
|
2
|
+
//directories
|
|
3
|
+
//files and information how to render them from which template and with what args with readers names
|
|
4
|
+
|
|
5
|
+
import ProjectStructure from "../../../tmpl/dirs/project.mjs";
|
|
6
|
+
import ApplicationStructure from "../../../tmpl/dirs/app.mjs";
|
|
7
|
+
import ApplicationServerStructure from "../../../tmpl/dirs/server.mjs";
|
|
8
|
+
import ApplicationFrontStructure from "../../../tmpl/dirs/front.mjs";
|
|
9
|
+
import ApplicationStaticStructure from "../../../tmpl/dirs/static.mjs";
|
|
10
|
+
|
|
11
|
+
import ApplicationModuleServerStructure from "../../../tmpl/dirs/module.server.mjs";
|
|
12
|
+
import ApplicationModuleServerControllersCommonStructure from "../../../tmpl/dirs/module.server.controllers.common.mjs";
|
|
13
|
+
|
|
14
|
+
import ApplicationModuleFrontStructure from "../../../tmpl/dirs/module.front.mjs";
|
|
15
|
+
|
|
16
|
+
const ProjectSubStructures = {
|
|
17
|
+
app: ApplicationStructure,
|
|
18
|
+
server: ApplicationServerStructure,
|
|
19
|
+
front: ApplicationFrontStructure,
|
|
20
|
+
static: ApplicationStaticStructure,
|
|
21
|
+
"module.server": ApplicationModuleServerStructure,
|
|
22
|
+
"module.server.controllers.common":
|
|
23
|
+
ApplicationModuleServerControllersCommonStructure,
|
|
24
|
+
"module.front": ApplicationModuleFrontStructure,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
ProjectStructure,
|
|
29
|
+
ApplicationStructure,
|
|
30
|
+
ApplicationServerStructure,
|
|
31
|
+
ApplicationFrontStructure,
|
|
32
|
+
ApplicationStaticStructure,
|
|
33
|
+
ApplicationModuleServerStructure,
|
|
34
|
+
ApplicationModuleServerControllersCommonStructure,
|
|
35
|
+
ApplicationModuleFrontStructure,
|
|
36
|
+
ProjectSubStructures,
|
|
37
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Options from "../lib/opts.mjs";
|
|
2
2
|
|
|
3
3
|
export default (inquirer) => {
|
|
4
4
|
return inquirer
|
|
@@ -7,7 +7,7 @@ export default (inquirer) => {
|
|
|
7
7
|
type: "checkbox",
|
|
8
8
|
message: "Select primary user roles set",
|
|
9
9
|
name: "roles",
|
|
10
|
-
choices:
|
|
10
|
+
choices: Options.roles.map((role) => {
|
|
11
11
|
return {
|
|
12
12
|
name: role,
|
|
13
13
|
checked: true,
|
|
@@ -11,6 +11,7 @@ export default async (
|
|
|
11
11
|
) => {
|
|
12
12
|
const TMPL_FILE_PATH = resolve(PATH_TMPL, CONTROLLER_INDEX_TMPL);
|
|
13
13
|
const DEST_FILE_PATH = resolve(module_layer_dir, `index.js`);
|
|
14
|
+
console.log("creating", TMPL_FILE_PATH, DEST_FILE_PATH);
|
|
14
15
|
await createFileContent(TMPL_FILE_PATH, DEST_FILE_PATH, {
|
|
15
16
|
...config,
|
|
16
17
|
entities: data,
|