@keshavsoft/kschema-cli 1.11.1 → 1.12.1
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/CHANGELOG.md +5 -1
- package/bin/v12/commands/express/steps/announce.js +3 -0
- package/bin/v12/commands/express/steps/createProject.js +6 -0
- package/bin/v12/commands/express/steps/decideTemplate.js +3 -0
- package/bin/v12/commands/express/steps/locateDestination.js +5 -0
- package/bin/v12/commands/express/steps/locateSource.js +13 -0
- package/bin/v12/commands/express/template/.env +8 -0
- package/bin/v12/commands/express/template/.env.local +7 -0
- package/bin/v12/commands/express/template/.vscode/launch.json +12 -0
- package/bin/v12/commands/express/template/Config/Schemas/BillsTable.json +166 -0
- package/bin/v12/commands/express/template/Config/Schemas/ItemsTable.json +206 -0
- package/bin/v12/commands/express/template/Config/Schemas/LedgerNames.json +50 -0
- package/bin/v12/commands/express/template/Config/Schemas/StockItems.json +45 -0
- package/bin/v12/commands/express/template/Config/api.json +8 -0
- package/bin/v12/commands/express/template/Config/schema.json +8 -0
- package/bin/v12/commands/express/template/Config/ui.json +8 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/build.js +6 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/config.js +12 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/main.js +29 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/publish.js +22 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/repo.js +20 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/schema.js +16 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/utils.js +26 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/Builder/version.js +25 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/buildAndCopy.js +166 -0
- package/bin/v12/commands/express/template/ForFrontEnd/NonSecured/latestVersion.js +38 -0
- package/bin/v12/commands/express/template/ForFrontEnd/Secured/buildProtected.js +108 -0
- package/bin/v12/commands/express/template/ForFrontEnd/Secured/latestVersion.js +38 -0
- package/bin/v12/commands/express/template/app.js +33 -0
- package/bin/v12/commands/express/template/config.json +4 -0
- package/bin/v12/commands/express/template/package.json +18 -0
- package/bin/v12/commands/express.js +23 -0
- package/bin/v12/commands/generateSamples.js +26 -0
- package/bin/v12/commands/init/steps/announce.js +3 -0
- package/bin/v12/commands/init/steps/createProject.js +7 -0
- package/bin/v12/commands/init/steps/decideTemplate.js +3 -0
- package/bin/v12/commands/init/steps/locateDestination.js +5 -0
- package/bin/v12/commands/init/steps/locateSource.js +13 -0
- package/bin/v12/commands/init/template/.vscode/launch.json +12 -0
- package/bin/v12/commands/init/template/Config/Schemas/BillsTable.json +165 -0
- package/bin/v12/commands/init/template/Config/Schemas/ItemsTable.json +200 -0
- package/bin/v12/commands/init/template/Config/Schemas/LedgerNames.json +50 -0
- package/bin/v12/commands/init/template/Config/Schemas/StockItems.json +45 -0
- package/bin/v12/commands/init/template/Config/api.json +8 -0
- package/bin/v12/commands/init/template/Config/schema.json +8 -0
- package/bin/v12/commands/init/template/Config/ui.json +8 -0
- package/bin/v12/commands/init/template/Data/BillsTable.json +165 -0
- package/bin/v12/commands/init/template/Data/ItemsTable.json +200 -0
- package/bin/v12/commands/init/template/Data/LedgerNames.json +6 -0
- package/bin/v12/commands/init/template/Data/StockItems.json +45 -0
- package/bin/v12/commands/init/template/app.js +4 -0
- package/bin/v12/commands/init/template/config.json +4 -0
- package/bin/v12/commands/init/template/package-lock.json +21 -0
- package/bin/v12/commands/init/template/package.json +14 -0
- package/bin/v12/commands/init/template/read.js +8 -0
- package/bin/v12/commands/init/template/write.js +8 -0
- package/bin/v12/commands/init.js +19 -0
- package/bin/v12/commands/template/baseTemplate.js +11 -0
- package/bin/v12/commands/template/basic/.vscode/launch.json +12 -0
- package/bin/v12/commands/template/basic/Config/Schemas/BillsTable.json +165 -0
- package/bin/v12/commands/template/basic/Config/Schemas/ItemsTable.json +200 -0
- package/bin/v12/commands/template/basic/Config/Schemas/LedgerNames.json +50 -0
- package/bin/v12/commands/template/basic/Config/Schemas/StockItems.json +45 -0
- package/bin/v12/commands/template/basic/Config/api.json +8 -0
- package/bin/v12/commands/template/basic/Config/schema.json +8 -0
- package/bin/v12/commands/template/basic/Config/ui.json +8 -0
- package/bin/v12/commands/template/basic/Data/BillsTable.json +165 -0
- package/bin/v12/commands/template/basic/Data/ItemsTable.json +200 -0
- package/bin/v12/commands/template/basic/Data/LedgerNames.json +6 -0
- package/bin/v12/commands/template/basic/Data/StockItems.json +45 -0
- package/bin/v12/commands/template/basic/app.js +4 -0
- package/bin/v12/commands/template/basic/config.json +4 -0
- package/bin/v12/commands/template/basic/package-lock.json +21 -0
- package/bin/v12/commands/template/basic/package.json +14 -0
- package/bin/v12/commands/template/basic/read.js +8 -0
- package/bin/v12/commands/template/basic/write.js +8 -0
- package/bin/v12/commands/template/express/.env +8 -0
- package/bin/v12/commands/template/express/.env.local +7 -0
- package/bin/v12/commands/template/express/.vscode/launch.json +12 -0
- package/bin/v12/commands/template/express/Config/Schemas/BillsTable.json +166 -0
- package/bin/v12/commands/template/express/Config/Schemas/ItemsTable.json +206 -0
- package/bin/v12/commands/template/express/Config/Schemas/LedgerNames.json +50 -0
- package/bin/v12/commands/template/express/Config/Schemas/StockItems.json +45 -0
- package/bin/v12/commands/template/express/Config/api.json +8 -0
- package/bin/v12/commands/template/express/Config/schema.json +8 -0
- package/bin/v12/commands/template/express/Config/ui.json +8 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/build.js +6 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/config.js +12 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/main.js +29 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/publish.js +22 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/repo.js +20 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/schema.js +16 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/utils.js +26 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/Builder/version.js +25 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/buildAndCopy.js +166 -0
- package/bin/v12/commands/template/express/ForFrontEnd/NonSecured/latestVersion.js +38 -0
- package/bin/v12/commands/template/express/ForFrontEnd/Secured/buildProtected.js +108 -0
- package/bin/v12/commands/template/express/ForFrontEnd/Secured/latestVersion.js +38 -0
- package/bin/v12/commands/template/express/app.js +33 -0
- package/bin/v12/commands/template/express/config.json +4 -0
- package/bin/v12/commands/template/express/package.json +18 -0
- package/bin/v12/commands/test.js +36 -0
- package/bin/v12/core/parseInput.js +10 -0
- package/bin/v12/core/resolveCommand.js +16 -0
- package/bin/v12/core/resolveFolderName.js +17 -0
- package/bin/v12/core/showUsage.js +42 -0
- package/bin/v12/start.js +22 -0
- package/index.js +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getNextVersion, createVersionFolder } from "./version.js";
|
|
2
|
+
import { prepareRepo } from "./repo.js";
|
|
3
|
+
import { readSchemas, injectSchema } from "./schema.js";
|
|
4
|
+
import { buildProject } from "./build.js";
|
|
5
|
+
import { publishSchema } from "./publish.js";
|
|
6
|
+
|
|
7
|
+
function processSchema(versionPath, schema) {
|
|
8
|
+
console.log(`\nProcessing ${schema}`);
|
|
9
|
+
injectSchema(schema);
|
|
10
|
+
buildProject();
|
|
11
|
+
publishSchema(versionPath, schema);
|
|
12
|
+
console.log(`Done with ${schema}`);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function main() {
|
|
16
|
+
const version = getNextVersion();
|
|
17
|
+
console.log("Next Version:", version);
|
|
18
|
+
|
|
19
|
+
const versionPath = createVersionFolder(version);
|
|
20
|
+
|
|
21
|
+
prepareRepo();
|
|
22
|
+
|
|
23
|
+
const schemas = readSchemas();
|
|
24
|
+
schemas.forEach(s => processSchema(versionPath, s));
|
|
25
|
+
|
|
26
|
+
console.log("\n✔ All schemas processed successfully");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
main();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { CONFIG } from "./config.js";
|
|
4
|
+
import { ensureDir, copyRecursive } from "./utils.js";
|
|
5
|
+
|
|
6
|
+
export function publishSchema(versionPath, schemaFile) {
|
|
7
|
+
const schemaName = path.parse(schemaFile).name;
|
|
8
|
+
const targetDir = path.join(versionPath, schemaName);
|
|
9
|
+
const unProtectedDir = path.join(targetDir, "UnProtected");
|
|
10
|
+
|
|
11
|
+
ensureDir(unProtectedDir);
|
|
12
|
+
|
|
13
|
+
copyRecursive(
|
|
14
|
+
path.join(CONFIG.COMMON_REPO_PATH, "dist"),
|
|
15
|
+
unProtectedDir
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
fs.copyFileSync(
|
|
19
|
+
path.join(CONFIG.COMMON_REPO_PATH, "Menu", "index.html"),
|
|
20
|
+
path.join(targetDir, "index.html")
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { CONFIG } from "./config.js";
|
|
4
|
+
import { run } from "./utils.js";
|
|
5
|
+
|
|
6
|
+
export function prepareRepo() {
|
|
7
|
+
if (!fs.existsSync(CONFIG.COMMON_REPO_PATH)) {
|
|
8
|
+
console.log(`${CONFIG.COMMON_REPO} not found. Cloning...`);
|
|
9
|
+
run(`git clone ${CONFIG.COMMON_REPO_GIT} ${CONFIG.COMMON_REPO_PATH}`);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (!fs.existsSync(path.join(CONFIG.COMMON_REPO_PATH, "node_modules"))) {
|
|
13
|
+
console.log("Installing dependencies...");
|
|
14
|
+
run("npm install", CONFIG.COMMON_REPO_PATH);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (fs.existsSync(".env")) {
|
|
18
|
+
fs.copyFileSync(".env", path.join(CONFIG.COMMON_REPO_PATH, ".env"));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { CONFIG } from "./config.js";
|
|
4
|
+
|
|
5
|
+
export function readSchemas() {
|
|
6
|
+
const uiJson = fs.readFileSync(CONFIG.SCHEMA_FILE);
|
|
7
|
+
const parsed = JSON.parse(uiJson);
|
|
8
|
+
return parsed.Tables || [];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function injectSchema(schemaFile) {
|
|
12
|
+
fs.copyFileSync(
|
|
13
|
+
path.join(CONFIG.SCHEMA_FOLDER, `${schemaFile}.json`),
|
|
14
|
+
path.join(CONFIG.COMMON_REPO_PATH, "schema.json")
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
|
|
5
|
+
export function run(cmd, cwd = process.cwd()) {
|
|
6
|
+
console.log(`> ${cmd}`);
|
|
7
|
+
execSync(cmd, { stdio: "inherit", cwd });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function ensureDir(dir) {
|
|
11
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function copyRecursive(src, dest) {
|
|
15
|
+
fs.readdirSync(src, { withFileTypes: true }).forEach(entry => {
|
|
16
|
+
const srcPath = path.join(src, entry.name);
|
|
17
|
+
const destPath = path.join(dest, entry.name);
|
|
18
|
+
|
|
19
|
+
if (entry.isDirectory()) {
|
|
20
|
+
ensureDir(destPath);
|
|
21
|
+
copyRecursive(srcPath, destPath);
|
|
22
|
+
} else {
|
|
23
|
+
fs.copyFileSync(srcPath, destPath);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { CONFIG } from "./config.js";
|
|
4
|
+
import { ensureDir } from "./utils.js";
|
|
5
|
+
|
|
6
|
+
export function getNextVersion() {
|
|
7
|
+
let max = 0;
|
|
8
|
+
|
|
9
|
+
if (fs.existsSync(CONFIG.PUBLIC_DIR)) {
|
|
10
|
+
fs.readdirSync(CONFIG.PUBLIC_DIR, { withFileTypes: true })
|
|
11
|
+
.filter(d => d.isDirectory() && d.name.startsWith(CONFIG.VERSION_PREFIX))
|
|
12
|
+
.forEach(d => {
|
|
13
|
+
const n = parseInt(d.name.replace(CONFIG.VERSION_PREFIX, ""), 10);
|
|
14
|
+
if (!isNaN(n) && n > max) max = n;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return `${CONFIG.VERSION_PREFIX}${max + 1}`;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export function createVersionFolder(version) {
|
|
22
|
+
const versionPath = path.join(CONFIG.PUBLIC_DIR, version);
|
|
23
|
+
ensureDir(versionPath);
|
|
24
|
+
return versionPath;
|
|
25
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
|
|
5
|
+
/* ================= CONFIG ================= */
|
|
6
|
+
const CONFIG = {
|
|
7
|
+
PUBLIC_DIR: "Public",
|
|
8
|
+
VERSION_PREFIX: "V",
|
|
9
|
+
SCHEMA_FILE: "ui.json",
|
|
10
|
+
SCHEMA_FOLDER: "Schemas",
|
|
11
|
+
COMMON_REPO: "VoltUiGulpV1",
|
|
12
|
+
COMMON_REPO_GIT: "https://github.com/keshavsoft/VoltUiGulpV1"
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
CONFIG.COMMON_REPO_PATH = path.join("..", CONFIG.COMMON_REPO);
|
|
16
|
+
/* ========================================== */
|
|
17
|
+
|
|
18
|
+
/* ---------- GENERIC ---------- */
|
|
19
|
+
const Utils = {
|
|
20
|
+
run(cmd, cwd = process.cwd()) {
|
|
21
|
+
console.log(`> ${cmd}`);
|
|
22
|
+
execSync(cmd, { stdio: "inherit", cwd });
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
ensureDir(dir) {
|
|
26
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
copyRecursive(src, dest) {
|
|
30
|
+
fs.readdirSync(src, { withFileTypes: true }).forEach(entry => {
|
|
31
|
+
const srcPath = path.join(src, entry.name);
|
|
32
|
+
const destPath = path.join(dest, entry.name);
|
|
33
|
+
|
|
34
|
+
if (entry.isDirectory()) {
|
|
35
|
+
this.ensureDir(destPath);
|
|
36
|
+
this.copyRecursive(srcPath, destPath);
|
|
37
|
+
} else {
|
|
38
|
+
fs.copyFileSync(srcPath, destPath);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/* ---------- VERSION (Release Manager) ---------- */
|
|
45
|
+
const Version = {
|
|
46
|
+
getNext() {
|
|
47
|
+
let max = 0;
|
|
48
|
+
|
|
49
|
+
if (fs.existsSync(CONFIG.PUBLIC_DIR)) {
|
|
50
|
+
fs.readdirSync(CONFIG.PUBLIC_DIR, { withFileTypes: true })
|
|
51
|
+
.filter(d => d.isDirectory() && d.name.startsWith(CONFIG.VERSION_PREFIX))
|
|
52
|
+
.forEach(d => {
|
|
53
|
+
const n = parseInt(d.name.replace(CONFIG.VERSION_PREFIX, ""), 10);
|
|
54
|
+
if (!isNaN(n) && n > max) max = n;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return `${CONFIG.VERSION_PREFIX}${max + 1}`;
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
createFolder(version) {
|
|
62
|
+
const versionPath = path.join(CONFIG.PUBLIC_DIR, version);
|
|
63
|
+
Utils.ensureDir(versionPath);
|
|
64
|
+
return versionPath;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/* ---------- REPO (Installer) ---------- */
|
|
69
|
+
const Repo = {
|
|
70
|
+
ensureCloned() {
|
|
71
|
+
if (!fs.existsSync(CONFIG.COMMON_REPO_PATH)) {
|
|
72
|
+
console.log(`${CONFIG.COMMON_REPO} not found. Cloning...`);
|
|
73
|
+
Utils.run(`git clone ${CONFIG.COMMON_REPO_GIT} ${CONFIG.COMMON_REPO_PATH}`);
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
ensureDependencies() {
|
|
78
|
+
if (!fs.existsSync(path.join(CONFIG.COMMON_REPO_PATH, "node_modules"))) {
|
|
79
|
+
console.log("Installing dependencies...");
|
|
80
|
+
Utils.run("npm install", CONFIG.COMMON_REPO_PATH);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
copyEnv() {
|
|
85
|
+
if (fs.existsSync(".env")) {
|
|
86
|
+
fs.copyFileSync(".env", path.join(CONFIG.COMMON_REPO_PATH, ".env"));
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
prepare() {
|
|
91
|
+
this.ensureCloned();
|
|
92
|
+
this.ensureDependencies();
|
|
93
|
+
this.copyEnv();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/* ---------- SCHEMA (Data Supplier) ---------- */
|
|
98
|
+
const Schema = {
|
|
99
|
+
readAll() {
|
|
100
|
+
const uiJson = fs.readFileSync(CONFIG.SCHEMA_FILE);
|
|
101
|
+
const parsed = JSON.parse(uiJson);
|
|
102
|
+
return parsed.Tables || [];
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
inject(schemaFile) {
|
|
106
|
+
fs.copyFileSync(
|
|
107
|
+
path.join(CONFIG.SCHEMA_FOLDER, `${schemaFile}.json`),
|
|
108
|
+
path.join(CONFIG.COMMON_REPO_PATH, "schema.json")
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
/* ---------- BUILD (Compiler) ---------- */
|
|
114
|
+
const Build = {
|
|
115
|
+
run() {
|
|
116
|
+
Utils.run("npm run NonSec", CONFIG.COMMON_REPO_PATH);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/* ---------- PUBLISH (Deployer) ---------- */
|
|
121
|
+
const Publish = {
|
|
122
|
+
schema(versionPath, schemaFile) {
|
|
123
|
+
const schemaName = path.parse(schemaFile).name;
|
|
124
|
+
const targetDir = path.join(versionPath, schemaName);
|
|
125
|
+
const unProtectedDir = path.join(targetDir, "UnProtected");
|
|
126
|
+
|
|
127
|
+
Utils.ensureDir(unProtectedDir);
|
|
128
|
+
|
|
129
|
+
Utils.copyRecursive(
|
|
130
|
+
path.join(CONFIG.COMMON_REPO_PATH, "dist"),
|
|
131
|
+
unProtectedDir
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
fs.copyFileSync(
|
|
135
|
+
path.join(CONFIG.COMMON_REPO_PATH, "Menu", "index.html"),
|
|
136
|
+
path.join(targetDir, "index.html")
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/* ---------- ORCHESTRATOR (Boss) ---------- */
|
|
142
|
+
const App = {
|
|
143
|
+
processSchema(versionPath, schemaFile) {
|
|
144
|
+
console.log(`\nProcessing ${schemaFile}`);
|
|
145
|
+
Schema.inject(schemaFile);
|
|
146
|
+
Build.run();
|
|
147
|
+
Publish.schema(versionPath, schemaFile);
|
|
148
|
+
console.log(`Done with ${schemaFile}`);
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
run() {
|
|
152
|
+
const version = Version.getNext();
|
|
153
|
+
console.log("Next Version:", version);
|
|
154
|
+
|
|
155
|
+
const versionPath = Version.createFolder(version);
|
|
156
|
+
|
|
157
|
+
Repo.prepare();
|
|
158
|
+
|
|
159
|
+
const schemas = Schema.readAll();
|
|
160
|
+
schemas.forEach(schema => this.processSchema(versionPath, schema));
|
|
161
|
+
|
|
162
|
+
console.log("\n✔ All schemas processed successfully");
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
App.run();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
|
|
3
|
+
const PREFIX = "V";
|
|
4
|
+
const ENV_FILE = ".env";
|
|
5
|
+
|
|
6
|
+
/* -------- STEP 1: GET NEXT VERSION -------- */
|
|
7
|
+
const dirs = fs.readdirSync("./", { withFileTypes: true })
|
|
8
|
+
.filter(d => d.isDirectory() && d.name.startsWith(PREFIX));
|
|
9
|
+
|
|
10
|
+
let max = 0;
|
|
11
|
+
|
|
12
|
+
dirs.forEach(d => {
|
|
13
|
+
const num = parseInt(d.name.replace(PREFIX, ""), 10);
|
|
14
|
+
if (!isNaN(num) && num > max) max = num;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const latestVersion = `${PREFIX}${max}`;
|
|
18
|
+
console.log("Next Version:", latestVersion);
|
|
19
|
+
|
|
20
|
+
/* -------- STEP 2: UPDATE .env -------- */
|
|
21
|
+
let envContent = "";
|
|
22
|
+
|
|
23
|
+
if (fs.existsSync(ENV_FILE)) {
|
|
24
|
+
envContent = fs.readFileSync(ENV_FILE, "utf8")
|
|
25
|
+
.split("\n")
|
|
26
|
+
.map(line =>
|
|
27
|
+
line.startsWith("VERSION=")
|
|
28
|
+
? `VERSION=${latestVersion}`
|
|
29
|
+
: line
|
|
30
|
+
)
|
|
31
|
+
.join("\n");
|
|
32
|
+
} else {
|
|
33
|
+
envContent = `VERSION=${latestVersion}\n`;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
fs.writeFileSync(ENV_FILE, envContent);
|
|
37
|
+
|
|
38
|
+
console.log(".env updated successfully ✔");
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
|
|
6
|
+
/* ================= CONFIG ================= */
|
|
7
|
+
const PUBLIC_DIR = "Public";
|
|
8
|
+
const VERSION_PREFIX = "V";
|
|
9
|
+
const SCHEMA_DIR = "ui.json";
|
|
10
|
+
const COMMON_REPO = "VoltUiGulpV1";
|
|
11
|
+
const COMMON_REPO_GIT = `https://github.com/keshavsoft/${COMMON_REPO}`;
|
|
12
|
+
const COMMON_REPO_PATH = path.join("..", COMMON_REPO);
|
|
13
|
+
/* ========================================== */
|
|
14
|
+
|
|
15
|
+
function run(cmd, cwd = process.cwd()) {
|
|
16
|
+
console.log(`> ${cmd}`);
|
|
17
|
+
execSync(cmd, { stdio: "inherit", cwd });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* ---------- STEP 1: GET NEXT VERSION ---------- */
|
|
21
|
+
let max = 0;
|
|
22
|
+
|
|
23
|
+
if (fs.existsSync(PUBLIC_DIR)) {
|
|
24
|
+
fs.readdirSync(PUBLIC_DIR, { withFileTypes: true })
|
|
25
|
+
.filter(d => d.isDirectory() && d.name.startsWith(VERSION_PREFIX))
|
|
26
|
+
.forEach(d => {
|
|
27
|
+
const n = parseInt(d.name.replace(VERSION_PREFIX, ""), 10);
|
|
28
|
+
if (!isNaN(n) && n > max) max = n;
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const nextVersion = `${VERSION_PREFIX}${max + 1}`;
|
|
33
|
+
console.log("Next Version:", nextVersion);
|
|
34
|
+
|
|
35
|
+
const versionPath = path.join(PUBLIC_DIR, nextVersion);
|
|
36
|
+
fs.mkdirSync(versionPath, { recursive: true });
|
|
37
|
+
|
|
38
|
+
/* ---------- STEP 2: CLONE COMMON REPO ---------- */
|
|
39
|
+
if (!fs.existsSync(COMMON_REPO_PATH)) {
|
|
40
|
+
console.log(`${COMMON_REPO} not found. Cloning...`);
|
|
41
|
+
run(`git clone ${COMMON_REPO_GIT} ${COMMON_REPO_PATH}`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* ---------- STEP 3: INSTALL DEPENDENCIES ---------- */
|
|
45
|
+
if (!fs.existsSync(path.join(COMMON_REPO_PATH, "node_modules"))) {
|
|
46
|
+
console.log("node_modules not found. Running npm install...");
|
|
47
|
+
run("npm install", COMMON_REPO_PATH);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* ---------- STEP 4: COPY .env ---------- */
|
|
51
|
+
if (fs.existsSync(".env")) {
|
|
52
|
+
fs.copyFileSync(".env", path.join(COMMON_REPO_PATH, ".env"));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* ---------- STEP 5: PROCESS SCHEMAS ---------- */
|
|
56
|
+
const uiJson = fs.readFileSync(SCHEMA_DIR);
|
|
57
|
+
const uiJsonParsed = JSON.parse(uiJson);
|
|
58
|
+
|
|
59
|
+
uiJsonParsed.Tables.forEach(schemaFile => {
|
|
60
|
+
const schemaName = path.parse(schemaFile).name;
|
|
61
|
+
console.log(`\nProcessing ${schemaFile}`);
|
|
62
|
+
|
|
63
|
+
/* Copy schema */
|
|
64
|
+
fs.copyFileSync(
|
|
65
|
+
path.join("Schemas", `${schemaFile}.json`),
|
|
66
|
+
path.join(COMMON_REPO_PATH, "schema.json")
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
/* Build */
|
|
70
|
+
run("npm run NonSec", COMMON_REPO_PATH);
|
|
71
|
+
|
|
72
|
+
/* Target dirs */
|
|
73
|
+
const targetDir = path.join(versionPath, schemaName);
|
|
74
|
+
const protectedDir = path.join(targetDir, "UnProtected");
|
|
75
|
+
|
|
76
|
+
fs.mkdirSync(protectedDir, { recursive: true });
|
|
77
|
+
|
|
78
|
+
/* Copy dist */
|
|
79
|
+
copyRecursive(
|
|
80
|
+
path.join(COMMON_REPO_PATH, "dist"),
|
|
81
|
+
protectedDir
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
/* Copy menu */
|
|
85
|
+
fs.copyFileSync(
|
|
86
|
+
path.join(COMMON_REPO_PATH, "Menu", "index.html"),
|
|
87
|
+
path.join(targetDir, "index.html")
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
console.log(`Done with ${schemaFile}`);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
console.log("\n✔ All schemas processed successfully");
|
|
94
|
+
|
|
95
|
+
/* ---------- UTIL ---------- */
|
|
96
|
+
function copyRecursive(src, dest) {
|
|
97
|
+
fs.readdirSync(src, { withFileTypes: true }).forEach(entry => {
|
|
98
|
+
const srcPath = path.join(src, entry.name);
|
|
99
|
+
const destPath = path.join(dest, entry.name);
|
|
100
|
+
|
|
101
|
+
if (entry.isDirectory()) {
|
|
102
|
+
fs.mkdirSync(destPath, { recursive: true });
|
|
103
|
+
copyRecursive(srcPath, destPath);
|
|
104
|
+
} else {
|
|
105
|
+
fs.copyFileSync(srcPath, destPath);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
|
|
3
|
+
const PREFIX = "V";
|
|
4
|
+
const ENV_FILE = ".env";
|
|
5
|
+
|
|
6
|
+
/* -------- STEP 1: GET NEXT VERSION -------- */
|
|
7
|
+
const dirs = fs.readdirSync("./", { withFileTypes: true })
|
|
8
|
+
.filter(d => d.isDirectory() && d.name.startsWith(PREFIX));
|
|
9
|
+
|
|
10
|
+
let max = 0;
|
|
11
|
+
|
|
12
|
+
dirs.forEach(d => {
|
|
13
|
+
const num = parseInt(d.name.replace(PREFIX, ""), 10);
|
|
14
|
+
if (!isNaN(num) && num > max) max = num;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const latestVersion = `${PREFIX}${max}`;
|
|
18
|
+
console.log("Next Version:", latestVersion);
|
|
19
|
+
|
|
20
|
+
/* -------- STEP 2: UPDATE .env -------- */
|
|
21
|
+
let envContent = "";
|
|
22
|
+
|
|
23
|
+
if (fs.existsSync(ENV_FILE)) {
|
|
24
|
+
envContent = fs.readFileSync(ENV_FILE, "utf8")
|
|
25
|
+
.split("\n")
|
|
26
|
+
.map(line =>
|
|
27
|
+
line.startsWith("VERSION=")
|
|
28
|
+
? `VERSION=${latestVersion}`
|
|
29
|
+
: line
|
|
30
|
+
)
|
|
31
|
+
.join("\n");
|
|
32
|
+
} else {
|
|
33
|
+
envContent = `VERSION=${latestVersion}\n`;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
fs.writeFileSync(ENV_FILE, envContent);
|
|
37
|
+
|
|
38
|
+
console.log(".env updated successfully ✔");
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { kschema } from "@keshavsoft/kschema";
|
|
2
|
+
import consfigJson from './config.json' with { type: 'json' };
|
|
3
|
+
|
|
4
|
+
kschema.loadConfig(consfigJson);
|
|
5
|
+
|
|
6
|
+
import express from 'express';
|
|
7
|
+
import http from 'http';
|
|
8
|
+
|
|
9
|
+
const app = express();
|
|
10
|
+
const server = http.createServer(app);
|
|
11
|
+
|
|
12
|
+
var port = normalizePort(process.env.PORT || 3000);
|
|
13
|
+
|
|
14
|
+
app.use(express.static('Public'));
|
|
15
|
+
|
|
16
|
+
function normalizePort(val) {
|
|
17
|
+
var port = parseInt(val, 10);
|
|
18
|
+
|
|
19
|
+
if (isNaN(port)) {
|
|
20
|
+
return val;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (port >= 0) {
|
|
24
|
+
return port;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return false;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
server.listen(port, () => {
|
|
31
|
+
console.log(`Example app listening on port ${port}`);
|
|
32
|
+
console.log(`Open here http://localhost:${port}`);
|
|
33
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "KeshavSoft",
|
|
3
|
+
"version": "1.7.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "app.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
9
|
+
"start": "node --env-file=.env app.js"
|
|
10
|
+
},
|
|
11
|
+
"author": "",
|
|
12
|
+
"license": "ISC",
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@keshavsoft/kschema": "^1.6.1",
|
|
15
|
+
"body-parser": "^2.2.0",
|
|
16
|
+
"express": "^5.1.0"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// commands/test.js
|
|
2
|
+
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
|
|
6
|
+
export default (arg) => {
|
|
7
|
+
const projectPath = arg
|
|
8
|
+
? path.resolve(process.cwd(), arg)
|
|
9
|
+
: process.cwd();
|
|
10
|
+
|
|
11
|
+
// 1. Check folder exists
|
|
12
|
+
if (!fs.existsSync(projectPath)) {
|
|
13
|
+
console.log("Invalid path");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// 2. Check required structure
|
|
18
|
+
const hasConfigJson = fs.existsSync(
|
|
19
|
+
path.join(projectPath, "config.json")
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const hasConfigFolder = fs.existsSync(
|
|
23
|
+
path.join(projectPath, "Config")
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const hasSchemasFolder = fs.existsSync(
|
|
27
|
+
path.join(projectPath, "Config", "Schemas")
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// 3. Final decision
|
|
31
|
+
if (hasConfigJson && hasConfigFolder && hasSchemasFolder) {
|
|
32
|
+
console.log("Already initialized");
|
|
33
|
+
} else {
|
|
34
|
+
console.log("Not initialized");
|
|
35
|
+
}
|
|
36
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import init from "../commands/init.js";
|
|
2
|
+
import test from "../commands/test.js";
|
|
3
|
+
import generateSamples from "../commands/generateSamples.js";
|
|
4
|
+
import express from "../commands/express.js";
|
|
5
|
+
|
|
6
|
+
// resolveCommand.js
|
|
7
|
+
const map = {
|
|
8
|
+
init,
|
|
9
|
+
test,
|
|
10
|
+
"generate-samples": generateSamples,
|
|
11
|
+
express
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default function resolveCommand(cmd) {
|
|
15
|
+
return map[cmd] || null;
|
|
16
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
|
|
3
|
+
export default function resolveFolderName({ name }) {
|
|
4
|
+
const defaultFolerName = `keshavsoft-basic-${Date.now()}`;
|
|
5
|
+
|
|
6
|
+
// case 1: force new → timestamp
|
|
7
|
+
if (name === null) {
|
|
8
|
+
name = defaultFolerName;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// case 2: user provided → strict
|
|
12
|
+
if (fs.existsSync(name)) {
|
|
13
|
+
throw new Error(`Folder already exists: ${name}`);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
return name;
|
|
17
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/*
|
|
2
|
+
KSchema CLI – Entry Flow
|
|
3
|
+
|
|
4
|
+
1. Read user input from terminal (parseInput)
|
|
5
|
+
2. If no command → show usage (first-time user safety)
|
|
6
|
+
3. If help flags → show usage (quick guidance)
|
|
7
|
+
4. Resolve command dynamically (no hardcoding logic)
|
|
8
|
+
5. If command not found → inform + guide back to usage
|
|
9
|
+
6. Execute command with parsed input
|
|
10
|
+
|
|
11
|
+
Goal:
|
|
12
|
+
- Zero confusion for user
|
|
13
|
+
- Single source of truth (showUsage)
|
|
14
|
+
- Easy to extend (just add commands, no core changes)
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export default function showUsage(version) {
|
|
18
|
+
const g = "\x1b[32m";
|
|
19
|
+
const y = "\x1b[33m";
|
|
20
|
+
const c = "\x1b[36m";
|
|
21
|
+
const gray = "\x1b[90m";
|
|
22
|
+
const r = "\x1b[0m";
|
|
23
|
+
|
|
24
|
+
console.log(`
|
|
25
|
+
${c}🚀 KSchema CLI v${version}${r}
|
|
26
|
+
|
|
27
|
+
${y}Usage:${r}
|
|
28
|
+
${g}npx @keshavsoft/kschema-cli${r} <command> [options]
|
|
29
|
+
|
|
30
|
+
${y}Commands:${r}
|
|
31
|
+
${g}init${r} Initialize a new schema setup
|
|
32
|
+
${g}test${r} Run schema validations/tests
|
|
33
|
+
${g}generate-samples${r} Generate sample schema files
|
|
34
|
+
|
|
35
|
+
${y}Examples:${r}
|
|
36
|
+
${gray}npx @keshavsoft/kschema-cli init${r}
|
|
37
|
+
${gray}npx @keshavsoft/kschema-cli test users${r}
|
|
38
|
+
|
|
39
|
+
${y}Tip:${r}
|
|
40
|
+
${gray}npm i -g @keshavsoft/kschema-cli${r}
|
|
41
|
+
`);
|
|
42
|
+
}
|