express-fix-any-js 1.3.3 → 1.3.4

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.
Files changed (42) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +77 -77
  3. package/bin/cli.js +11 -11
  4. package/bin/core/getLatestVersion.js +12 -12
  5. package/bin/core/loadRunner.js +8 -8
  6. package/bin/v2/EndPointsJs/UpdateJs/checkLines.json +17 -17
  7. package/bin/v2/EndPointsJs/UpdateJs/common/AlterFile/buildUpdatedContent.js +18 -18
  8. package/bin/v2/EndPointsJs/UpdateJs/common/AlterFile/checkDuplicate.js +20 -20
  9. package/bin/v2/EndPointsJs/UpdateJs/common/AlterFile/findInsertIndex.js +29 -29
  10. package/bin/v2/EndPointsJs/UpdateJs/common/AlterFile/index.js +50 -50
  11. package/bin/v2/EndPointsJs/UpdateJs/common/readFile.js +7 -7
  12. package/bin/v2/EndPointsJs/UpdateJs/common/writeFile.js +9 -9
  13. package/bin/v2/EndPointsJs/UpdateJs/index.js +33 -33
  14. package/bin/v2/EndPointsJs/UpdateJs/validations/validateAppJsPath.js +10 -10
  15. package/bin/v2/EndPointsJs/UpdateJs/validations/validateEndpoint.js +8 -8
  16. package/bin/v2/EndPointsJs/index.js +11 -11
  17. package/bin/v2/UpdateJs/checkLines.json +17 -17
  18. package/bin/v2/UpdateJs/common/AlterFile/buildUpdatedContent.js +18 -18
  19. package/bin/v2/UpdateJs/common/AlterFile/checkDuplicate.js +20 -20
  20. package/bin/v2/UpdateJs/common/AlterFile/findInsertIndex.js +29 -29
  21. package/bin/v2/UpdateJs/common/AlterFile/index.js +49 -49
  22. package/bin/v2/UpdateJs/common/readFile.js +7 -7
  23. package/bin/v2/UpdateJs/common/writeFile.js +9 -9
  24. package/bin/v2/UpdateJs/index.js +30 -30
  25. package/bin/v2/core/createFolder.js +33 -33
  26. package/bin/v2/core/parseInput.js +12 -12
  27. package/bin/v2/core/showUsage.js +49 -49
  28. package/bin/v2/start.js +17 -17
  29. package/bin/v3/UpdateJs/checkLines.json +17 -17
  30. package/bin/v3/UpdateJs/common/AlterFile/buildUpdatedContent.js +18 -18
  31. package/bin/v3/UpdateJs/common/AlterFile/checkDuplicate.js +20 -20
  32. package/bin/v3/UpdateJs/common/AlterFile/findInsertIndex.js +29 -29
  33. package/bin/v3/UpdateJs/common/AlterFile/index.js +55 -55
  34. package/bin/v3/UpdateJs/common/readFile.js +7 -7
  35. package/bin/v3/UpdateJs/common/writeFile.js +9 -9
  36. package/bin/v3/UpdateJs/index.js +30 -30
  37. package/bin/v3/core/createFolder.js +33 -33
  38. package/bin/v3/core/parseInput.js +12 -12
  39. package/bin/v3/core/showUsage.js +49 -49
  40. package/bin/v3/start.js +17 -17
  41. package/index.js +10 -10
  42. package/package.json +34 -34
@@ -1,11 +1,11 @@
1
- // v2/AppJs/validations/validateAppJsPath.js
2
-
3
- import fs from "fs";
4
-
5
- const validateAppJsPath = ({ jsFilePath }) => {
6
- if (!fs.existsSync(jsFilePath)) {
7
- throw new Error(`${jsFilePath} file not found`);
8
- };
9
- };
10
-
1
+ // v2/AppJs/validations/validateAppJsPath.js
2
+
3
+ import fs from "fs";
4
+
5
+ const validateAppJsPath = ({ jsFilePath }) => {
6
+ if (!fs.existsSync(jsFilePath)) {
7
+ throw new Error(`${jsFilePath} file not found`);
8
+ };
9
+ };
10
+
11
11
  export default validateAppJsPath;
@@ -1,9 +1,9 @@
1
- // v2/AppJs/validations/validateEndpoint.js
2
-
3
- const validateEndpoint = ({ endpoint }) => {
4
- if (!endpoint || endpoint.trim() === "") {
5
- throw new Error("endpoint should not be empty");
6
- };
7
- };
8
-
1
+ // v2/AppJs/validations/validateEndpoint.js
2
+
3
+ const validateEndpoint = ({ endpoint }) => {
4
+ if (!endpoint || endpoint.trim() === "") {
5
+ throw new Error("endpoint should not be empty");
6
+ };
7
+ };
8
+
9
9
  export default validateEndpoint;
@@ -1,12 +1,12 @@
1
- import updateJs from "./UpdateJs/index.js";
2
-
3
- export default ({ actionName, inJsFilePath, inCheckLines, showLog }) => {
4
- const fromUpdate = updateJs({
5
- inJsFilePath,
6
- actionName,
7
- inCheckLines,
8
- showLog
9
- });
10
-
11
- return true;
1
+ import updateJs from "./UpdateJs/index.js";
2
+
3
+ export default ({ actionName, inJsFilePath, inCheckLines, showLog }) => {
4
+ const fromUpdate = updateJs({
5
+ inJsFilePath,
6
+ actionName,
7
+ inCheckLines,
8
+ showLog
9
+ });
10
+
11
+ return true;
12
12
  };
@@ -1,18 +1,18 @@
1
- {
2
- "importLines": {
3
- "toInsertLine": "import funcFrom${endpoint} from './${endpoint}/controller.js';",
4
- "duplicationCheck": "from './${endpoint}/controller.js'",
5
- "insertAfter": [
6
- "import funcFrom",
7
- "import express"
8
- ]
9
- },
10
- "useLines": {
11
- "toInsertLine": "router.post('/${endpoint}', express.json(), (req, res) => funcFrom${endpoint}({ req, res, inTablePath: tablePath }));",
12
- "duplicationCheck": "router.use('/${endpoint}'",
13
- "insertAfter": [
14
- "router.",
15
- "const router = "
16
- ]
17
- }
1
+ {
2
+ "importLines": {
3
+ "toInsertLine": "import funcFrom${endpoint} from './${endpoint}/controller.js';",
4
+ "duplicationCheck": "from './${endpoint}/controller.js'",
5
+ "insertAfter": [
6
+ "import funcFrom",
7
+ "import express"
8
+ ]
9
+ },
10
+ "useLines": {
11
+ "toInsertLine": "router.post('/${endpoint}', express.json(), (req, res) => funcFrom${endpoint}({ req, res, inTablePath: tablePath }));",
12
+ "duplicationCheck": "router.use('/${endpoint}'",
13
+ "insertAfter": [
14
+ "router.",
15
+ "const router = "
16
+ ]
17
+ }
18
18
  }
@@ -1,19 +1,19 @@
1
- const startFunc = ({
2
- content,
3
- insertInfo,
4
- toInsertLine,
5
- insertAfter
6
- }) => {
7
- const before = content.slice(0, insertInfo.index);
8
-
9
- const isFirstInsert =
10
- insertInfo.matchedPattern === insertAfter[insertAfter.length - 1];
11
-
12
- return before +
13
- (isFirstInsert ? "\n" : "") +
14
- toInsertLine +
15
- "\n" +
16
- content.slice(insertInfo.index);
17
- };
18
-
1
+ const startFunc = ({
2
+ content,
3
+ insertInfo,
4
+ toInsertLine,
5
+ insertAfter
6
+ }) => {
7
+ const before = content.slice(0, insertInfo.index);
8
+
9
+ const isFirstInsert =
10
+ insertInfo.matchedPattern === insertAfter[insertAfter.length - 1];
11
+
12
+ return before +
13
+ (isFirstInsert ? "\n" : "") +
14
+ toInsertLine +
15
+ "\n" +
16
+ content.slice(insertInfo.index);
17
+ };
18
+
19
19
  export default startFunc;
@@ -1,21 +1,21 @@
1
- const checkUseDuplicate = ({
2
- inContent,
3
- inFilePath,
4
- inSearchText
5
- }) => {
6
- const lines = inContent.split("\n");
7
-
8
- const lineIndex = lines.findIndex(line =>
9
- line.includes(inSearchText)
10
- );
11
-
12
- return {
13
- found: lineIndex !== -1,
14
- filePath: inFilePath,
15
- lineNumber: lineIndex !== -1
16
- ? lineIndex + 1
17
- : null
18
- };
19
- };
20
-
1
+ const checkUseDuplicate = ({
2
+ inContent,
3
+ inFilePath,
4
+ inSearchText
5
+ }) => {
6
+ const lines = inContent.split("\n");
7
+
8
+ const lineIndex = lines.findIndex(line =>
9
+ line.includes(inSearchText)
10
+ );
11
+
12
+ return {
13
+ found: lineIndex !== -1,
14
+ filePath: inFilePath,
15
+ lineNumber: lineIndex !== -1
16
+ ? lineIndex + 1
17
+ : null
18
+ };
19
+ };
20
+
21
21
  export default checkUseDuplicate;
@@ -1,30 +1,30 @@
1
- const findInsertIndex = ({
2
- inContent,
3
- inPatterns = []
4
- }) => {
5
- const lines = inContent.split("\n");
6
-
7
- let lineNumber = -1;
8
- let matchedPattern = null;
9
-
10
- lines.forEach((line, index) => {
11
- const pattern = inPatterns.find(item => line.includes(item));
12
-
13
- if (pattern) {
14
- lineNumber = index;
15
- matchedPattern = pattern;
16
- };
17
- });
18
-
19
- return {
20
- index: lineNumber === -1
21
- ? -1
22
- : lines
23
- .slice(0, lineNumber + 1)
24
- .join("\n")
25
- .length + 1,
26
- matchedPattern
27
- };
28
- };
29
-
1
+ const findInsertIndex = ({
2
+ inContent,
3
+ inPatterns = []
4
+ }) => {
5
+ const lines = inContent.split("\n");
6
+
7
+ let lineNumber = -1;
8
+ let matchedPattern = null;
9
+
10
+ lines.forEach((line, index) => {
11
+ const pattern = inPatterns.find(item => line.includes(item));
12
+
13
+ if (pattern) {
14
+ lineNumber = index;
15
+ matchedPattern = pattern;
16
+ };
17
+ });
18
+
19
+ return {
20
+ index: lineNumber === -1
21
+ ? -1
22
+ : lines
23
+ .slice(0, lineNumber + 1)
24
+ .join("\n")
25
+ .length + 1,
26
+ matchedPattern
27
+ };
28
+ };
29
+
30
30
  export default findInsertIndex;
@@ -1,50 +1,50 @@
1
- import readFile from "../readFile.js";
2
- import checkDuplicate from "./checkDuplicate.js";
3
- import findInsertIndex from "./findInsertIndex.js";
4
- import writeFile from "../writeFile.js";
5
-
6
- import buildUpdatedContent from "./buildUpdatedContent.js";
7
-
8
- const validateDuplicate = ({ content, jsFilePath, duplicationCheck }) => {
9
- return checkDuplicate({
10
- inContent: content,
11
- inFilePath: jsFilePath,
12
- inSearchText: duplicationCheck
13
- });
14
- };
15
-
16
- const locateInsertPoint = ({ content, insertAfter }) => {
17
- return findInsertIndex({
18
- inContent: content,
19
- inPatterns: insertAfter
20
- });
21
- };
22
-
23
- const alterFile = ({
24
- jsFilePath,
25
- toInsertLine,
26
- duplicationCheck,
27
- insertAfter = [],
28
- showLog = false
29
- }) => {
30
- const content = readFile(jsFilePath);
31
-
32
- const duplicateInfo = validateDuplicate({ content, jsFilePath, duplicationCheck });
33
-
34
- // const index = locateInsertPoint({ content, importInsertAfter });
35
- const insertInfo = locateInsertPoint({
36
- content,
37
- insertAfter
38
- });
39
-
40
- const updated = buildUpdatedContent({
41
- content,
42
- insertInfo,
43
- toInsertLine,
44
- insertAfter
45
- });
46
-
47
- writeFile(jsFilePath, updated);
48
- };
49
-
1
+ import readFile from "../readFile.js";
2
+ import checkDuplicate from "./checkDuplicate.js";
3
+ import findInsertIndex from "./findInsertIndex.js";
4
+ import writeFile from "../writeFile.js";
5
+
6
+ import buildUpdatedContent from "./buildUpdatedContent.js";
7
+
8
+ const validateDuplicate = ({ content, jsFilePath, duplicationCheck }) => {
9
+ return checkDuplicate({
10
+ inContent: content,
11
+ inFilePath: jsFilePath,
12
+ inSearchText: duplicationCheck
13
+ });
14
+ };
15
+
16
+ const locateInsertPoint = ({ content, insertAfter }) => {
17
+ return findInsertIndex({
18
+ inContent: content,
19
+ inPatterns: insertAfter
20
+ });
21
+ };
22
+
23
+ const alterFile = ({
24
+ jsFilePath,
25
+ toInsertLine,
26
+ duplicationCheck,
27
+ insertAfter = [],
28
+ showLog = false
29
+ }) => {
30
+ const content = readFile(jsFilePath);
31
+
32
+ const duplicateInfo = validateDuplicate({ content, jsFilePath, duplicationCheck });
33
+
34
+ // const index = locateInsertPoint({ content, importInsertAfter });
35
+ const insertInfo = locateInsertPoint({
36
+ content,
37
+ insertAfter
38
+ });
39
+
40
+ const updated = buildUpdatedContent({
41
+ content,
42
+ insertInfo,
43
+ toInsertLine,
44
+ insertAfter
45
+ });
46
+
47
+ writeFile(jsFilePath, updated);
48
+ };
49
+
50
50
  export default alterFile;
@@ -1,8 +1,8 @@
1
- import fs from "fs";
2
-
3
- const readFile = (inAppJsPath) => {
4
- const localPath = inAppJsPath;
5
- return fs.readFileSync(localPath, "utf-8");
6
- };
7
-
1
+ import fs from "fs";
2
+
3
+ const readFile = (inAppJsPath) => {
4
+ const localPath = inAppJsPath;
5
+ return fs.readFileSync(localPath, "utf-8");
6
+ };
7
+
8
8
  export default readFile;
@@ -1,10 +1,10 @@
1
- import fs from "fs";
2
-
3
- const writeFile = (inAppJsPath, inContent) => {
4
- const localPath = inAppJsPath;
5
- const localContent = inContent;
6
-
7
- fs.writeFileSync(localPath, localContent);
8
- };
9
-
1
+ import fs from "fs";
2
+
3
+ const writeFile = (inAppJsPath, inContent) => {
4
+ const localPath = inAppJsPath;
5
+ const localContent = inContent;
6
+
7
+ fs.writeFileSync(localPath, localContent);
8
+ };
9
+
10
10
  export default writeFile;
@@ -1,31 +1,31 @@
1
- // v2/AppJs/index.js
2
-
3
- import checkLines from "./checkLines.json" with {type: "json"};
4
- import alterFile from "./common/AlterFile/index.js";
5
-
6
- const updateAppJs = ({ inJsFilePath, inCheckLines,
7
- showLog = false }) => {
8
-
9
- const localCheckLines = inCheckLines || checkLines;
10
- // console.log("bbbbbbbbbbbb : ", localCheckLines);
11
-
12
- alterFile({
13
- jsFilePath: inJsFilePath,
14
- toInsertLine: localCheckLines.importLines.toInsertLine,
15
- duplicationCheck: localCheckLines.importLines.duplicationCheck,
16
- insertAfter: localCheckLines.importLines.insertAfter,
17
- showLog
18
- });
19
-
20
- alterFile({
21
- jsFilePath: inJsFilePath,
22
- toInsertLine: localCheckLines.useLines.toInsertLine,
23
- duplicationCheck: localCheckLines.useLines.duplicationCheck,
24
- insertAfter: localCheckLines.useLines.insertAfter,
25
- showLog
26
- });
27
-
28
- return false;
29
- };
30
-
1
+ // v2/AppJs/index.js
2
+
3
+ import checkLines from "./checkLines.json" with {type: "json"};
4
+ import alterFile from "./common/AlterFile/index.js";
5
+
6
+ const updateAppJs = ({ inJsFilePath, inCheckLines,
7
+ showLog = false }) => {
8
+
9
+ const localCheckLines = inCheckLines || checkLines;
10
+ // console.log("bbbbbbbbbbbb : ", localCheckLines);
11
+
12
+ alterFile({
13
+ jsFilePath: inJsFilePath,
14
+ toInsertLine: localCheckLines.importLines.toInsertLine,
15
+ duplicationCheck: localCheckLines.importLines.duplicationCheck,
16
+ insertAfter: localCheckLines.importLines.insertAfter,
17
+ showLog
18
+ });
19
+
20
+ alterFile({
21
+ jsFilePath: inJsFilePath,
22
+ toInsertLine: localCheckLines.useLines.toInsertLine,
23
+ duplicationCheck: localCheckLines.useLines.duplicationCheck,
24
+ insertAfter: localCheckLines.useLines.insertAfter,
25
+ showLog
26
+ });
27
+
28
+ return false;
29
+ };
30
+
31
31
  export default updateAppJs;
@@ -1,34 +1,34 @@
1
- import fs from "fs";
2
-
3
- export const createFolder = ({ source, destination, checkBeforeCreate = false, isAnnounce = true }) => {
4
- if (checkBeforeCreate) {
5
- return createFolderWithCheck({ source, destination, isAnnounce });
6
- } else {
7
- return createOnly({ source, destination });
8
- };
9
- };
10
-
11
- const createOnly = ({ source, destination }) => {
12
- fs.mkdirSync(destination, { recursive: true });
13
-
14
- fs.cpSync(source, destination, { recursive: true });
15
-
16
- return {
17
- KTF: true
18
- };
19
- };
20
-
21
- const createFolderWithCheck = ({ source, destination, isAnnounce }) => {
22
- if (fs.existsSync(destination)) {
23
- if (isAnnounce) console.log("Folder already exists :", destination);
24
-
25
- return {
26
- KTF: false,
27
- KReason: "Folder already exists"
28
- };
29
- };
30
-
31
- if (isAnnounce) console.log("Folder created :", destination);
32
-
33
- return createOnly({ source, destination });
1
+ import fs from "fs";
2
+
3
+ export const createFolder = ({ source, destination, checkBeforeCreate = false, isAnnounce = true }) => {
4
+ if (checkBeforeCreate) {
5
+ return createFolderWithCheck({ source, destination, isAnnounce });
6
+ } else {
7
+ return createOnly({ source, destination });
8
+ };
9
+ };
10
+
11
+ const createOnly = ({ source, destination }) => {
12
+ fs.mkdirSync(destination, { recursive: true });
13
+
14
+ fs.cpSync(source, destination, { recursive: true });
15
+
16
+ return {
17
+ KTF: true
18
+ };
19
+ };
20
+
21
+ const createFolderWithCheck = ({ source, destination, isAnnounce }) => {
22
+ if (fs.existsSync(destination)) {
23
+ if (isAnnounce) console.log("Folder already exists :", destination);
24
+
25
+ return {
26
+ KTF: false,
27
+ KReason: "Folder already exists"
28
+ };
29
+ };
30
+
31
+ if (isAnnounce) console.log("Folder created :", destination);
32
+
33
+ return createOnly({ source, destination });
34
34
  };
@@ -1,13 +1,13 @@
1
- export default function parseInput({ jsFilePath,
2
- inCheckLines = {}, showLog }) {
3
-
4
- const [...args] = process.argv.slice(2);
5
-
6
- return {
7
- showLog: args[1] === undefined
8
- ? showLog
9
- : args[1] === "true",
10
- inJsFilePath: jsFilePath || process.cwd(),
11
- inCheckLines
12
- };
1
+ export default function parseInput({ jsFilePath,
2
+ inCheckLines = {}, showLog }) {
3
+
4
+ const [...args] = process.argv.slice(2);
5
+
6
+ return {
7
+ showLog: args[1] === undefined
8
+ ? showLog
9
+ : args[1] === "true",
10
+ inJsFilePath: jsFilePath || process.cwd(),
11
+ inCheckLines
12
+ };
13
13
  };
@@ -1,50 +1,50 @@
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 Api Generator v${version}${r}
26
-
27
- ${y}Usage:${r}
28
- ${g}npx @keshavsoft/kschema-api-gen${r} <command> [options]
29
-
30
- ${y}Commands:${r}
31
- ${g}StartEndPoint${r} Initialize a new folder and files
32
- ${g}AddSubRoute${r} Initialize a new folder and files
33
- ${g}AddTableName${r} Initialize a new folder and files for TableName
34
- ${g}ShowAll${r} Initialize a new folder and files for action
35
-
36
- ${g}CreateApi${r} Creates new end point and hooks to app.js
37
- ${g}InsertApi${r} Creates new InsertApi end point and hooks to app.js
38
-
39
- ${y}Examples:${r}
40
- ${gray}npx @keshavsoft/kschema-api-gen StartEndPoint${r}
41
- ${gray}npx @keshavsoft/kschema-api-gen AddSubRoute${r}
42
- ${gray}npx @keshavsoft/kschema-api-gen AddTableName${r}
43
- ${gray}npx @keshavsoft/kschema-api-gen ShowAll${r}
44
- ${gray}npx @keshavsoft/kschema-api-gen CreateApi Api/V1/journals/ShowAll${r}
45
- ${gray}npx @keshavsoft/kschema-api-gen InsertApi Api/V1/journals/Insert${r}
46
-
47
- ${y}Tip:${r}
48
- ${gray}npm i -g @keshavsoft/kschema-api-gen${r}
49
- `);
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 Api Generator v${version}${r}
26
+
27
+ ${y}Usage:${r}
28
+ ${g}npx @keshavsoft/kschema-api-gen${r} <command> [options]
29
+
30
+ ${y}Commands:${r}
31
+ ${g}StartEndPoint${r} Initialize a new folder and files
32
+ ${g}AddSubRoute${r} Initialize a new folder and files
33
+ ${g}AddTableName${r} Initialize a new folder and files for TableName
34
+ ${g}ShowAll${r} Initialize a new folder and files for action
35
+
36
+ ${g}CreateApi${r} Creates new end point and hooks to app.js
37
+ ${g}InsertApi${r} Creates new InsertApi end point and hooks to app.js
38
+
39
+ ${y}Examples:${r}
40
+ ${gray}npx @keshavsoft/kschema-api-gen StartEndPoint${r}
41
+ ${gray}npx @keshavsoft/kschema-api-gen AddSubRoute${r}
42
+ ${gray}npx @keshavsoft/kschema-api-gen AddTableName${r}
43
+ ${gray}npx @keshavsoft/kschema-api-gen ShowAll${r}
44
+ ${gray}npx @keshavsoft/kschema-api-gen CreateApi Api/V1/journals/ShowAll${r}
45
+ ${gray}npx @keshavsoft/kschema-api-gen InsertApi Api/V1/journals/Insert${r}
46
+
47
+ ${y}Tip:${r}
48
+ ${gray}npm i -g @keshavsoft/kschema-api-gen${r}
49
+ `);
50
50
  }