mushroom-cli 1.1.0-alpha.9 → 1.2.0-alpha.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.
@@ -175,7 +175,7 @@ function genDatabaseDocs(args, projectName, project, alias, source) {
175
175
  const aliasProject = ((project.dbDocs || {}).alias || {})[alias];
176
176
 
177
177
  if (!aliasProject) {
178
- throw new Error(`Not found gen db-docs configuration. Please run 'npx mr config ${projectName} gen db-docs OUTPUT_FILE.html${alias === "default" ? "" : " alias " + alias}' first`);
178
+ throw new Error(`Not found gen db-docs configuration. Please run 'npx mushroom-cli config ${projectName} gen db-docs OUTPUT_FILE.html${alias === "default" ? "" : " alias " + alias}' first`);
179
179
  }
180
180
 
181
181
  const entities = common.getEntities(source, aliasProject.allowRoles, true);
@@ -63,7 +63,8 @@ async function genJavascriptDriverTarball(args, projectName, project, alias, sou
63
63
 
64
64
  if (fs.existsSync(dirPath)) {
65
65
  console.log("Clean up tarball folder");
66
- fs.rmdirSync(dirPath, { recursive: true });
66
+ // fs.rmdirSync(dirPath, { recursive: true });
67
+ fs.rmSync(dirPath, { recursive: true });
67
68
  }
68
69
 
69
70
  const tarballFileName = path.join(path.dirname(aliasProject.output), tarballName + ".tar.gz");
@@ -92,7 +93,8 @@ async function genJavascriptDriverTarball(args, projectName, project, alias, sou
92
93
  await compressAsync(dirPath, tarballFileName, tarballName);
93
94
 
94
95
  console.log("Generated tarball file");
95
- fs.rmdirSync(dirPath, { recursive: true });
96
+ // fs.rmdirSync(dirPath, { recursive: true });
97
+ fs.rmSync(dirPath, { recursive: true });
96
98
  console.log("Cleaned up tarball folder");
97
99
  }
98
100
 
@@ -36,23 +36,34 @@ function genJavascriptDriverString(aliasProject, source) {
36
36
 
37
37
  if (Array.isArray(aliasProject.features)) {
38
38
  if (aliasProject.features.includes("auth")) {
39
- extensionsImportLines.push('import * as AuthExtension from "mushroomjs-auth";');
39
+ extensionsImportLines.push('//import * as AuthExtension from "mushroomjs-auth";');
40
+ extensionsImportLines.push('var AuthExtension = require("mushroomjs-auth");');
40
41
  extensionsExportLines.push('Auth: AuthExtension');
41
- extensionsCodeLines.push("AuthExtension.useAuth(AuthExtension.AuthLocalStorage);");
42
+ extensionsCodeLines.push("AuthExtension.useAuth(AuthExtension.AuthLocalStorage, mushroom_1.default);");
42
43
  }
43
44
  if (aliasProject.features.includes("file")) {
44
- extensionsImportLines.push('import * as FileExtension from "mushroomjs-file";');
45
+ extensionsImportLines.push('//import * as FileExtension from "mushroomjs-file";');
46
+ extensionsImportLines.push('var FileExtension = require("mushroomjs-file");');
45
47
  extensionsExportLines.push('File: FileExtension');
46
- extensionsCodeLines.push("FileExtension.useFile();");
48
+ extensionsCodeLines.push("FileExtension.useFile(mushroom_1.default);");
47
49
  }
48
50
  }
49
51
 
50
- let code = `import mushroom, {defineAsyncResource} from "mushroomjs";
51
- export * from "mushroomjs";
52
+ let code = `//import mushroom, {defineAsyncResource} from "mushroomjs";
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ var mushroom_1 = require("mushroomjs");
55
+ var mushroom = mushroom_1.default;
56
+ var defineAsyncResource = mushroom_1.defineAsyncResource;
57
+
58
+ //export * from "mushroomjs";
59
+ for (var m in mushroom_1) exports[m] = mushroom_1[m];
60
+
52
61
  ${extensionsImportLines.join("\n")}
53
- export const extensions = {
62
+ //export const extensions = {
63
+ var extensions = {
54
64
  ${extensionsExportLines.join(",\n ")}
55
65
  };
66
+ exports.extensions = extensions;
56
67
 
57
68
  "use strict";
58
69
 
@@ -69,7 +80,8 @@ export const extensions = {
69
80
  continue;
70
81
 
71
82
  actions[actionName] = {
72
- clientCache: (actionName === "findById" || actionName === "findMany") && isAllowCache(entity.actions[actionName], true) ? true : undefined
83
+ clientCache: (actionName === "findById" || actionName === "findMany") && isAllowCache(entity.actions[actionName], true) ? true : undefined,
84
+ includeTotal: actionName === "findMany" && entity.actions[actionName].some(a => a.includeTotal) ? true: undefined
73
85
  };
74
86
  }
75
87
 
@@ -88,7 +100,8 @@ mushroom.$using(${JSON.stringify(common.getRootUrl(source))});
88
100
 
89
101
  ${extensionsCodeLines.join('\n')}
90
102
 
91
- export default mushroom;`;
103
+ //export default mushroom;
104
+ exports.default = mushroom;`;
92
105
 
93
106
  return code;
94
107
  }
@@ -97,7 +110,7 @@ function genJavascriptDriver(args, projectName, project, alias, source) {
97
110
  const aliasProject = ((project.jsDriver || {}).alias || {})[alias];
98
111
 
99
112
  if (!aliasProject) {
100
- throw new Error(`Not found gen js-driver configuration. Please run 'npx mr config gen ${projectName} js-driver OUTPUT_FILE.js${alias === "default" ? "" : " alias " + alias}' first`);
113
+ throw new Error(`Not found gen js-driver configuration. Please run 'npx mushroom-cli config gen ${projectName} js-driver OUTPUT_FILE.js${alias === "default" ? "" : " alias " + alias}' first`);
101
114
  }
102
115
 
103
116
  let code = genJavascriptDriverString(aliasProject, source);
@@ -38,7 +38,7 @@ function toTypeScriptClassName(str) {
38
38
  return "_";
39
39
  const name = toVietnameseNonTongue(str).replace(/\W/g, "_");
40
40
  const c = name.charAt(0);
41
- return ('0' <= c && c <= '9' ? '_' : "") + c.toUpperCase() + name.substr(1);
41
+ return ('0' <= c && c <= '9' ? '_' : "") + c.toUpperCase() + name.substring(1);
42
42
  }
43
43
 
44
44
  function getCSharpTypeFromMushroomType(type) {
@@ -63,26 +63,27 @@ function getCSharpTypeFromMushroomType(type) {
63
63
  return "UNKNOWN_TYPE_" + type;
64
64
  }
65
65
 
66
- function generateTypescriptClass(objectDefination, indent) {
66
+ function generateTypescriptClass(objectDefination, indent, options) {
67
67
  if (!indent) indent = "";
68
68
  let code = "{\n";
69
69
  for (let fieldName in objectDefination) {
70
+ const optionalMark = options?.checkRequired && objectDefination[fieldName].required ? "" : "?";
70
71
  if (objectDefination[fieldName].type == "object") {
71
- code += `${indent} ${fieldName}?: ${generateTypescriptClass(objectDefination[fieldName].fields, indent + " ")},
72
+ code += `${indent} ${fieldName}${optionalMark}: ${generateTypescriptClass(objectDefination[fieldName].fields, indent + " ")},
72
73
  `;
73
74
  }
74
75
  else if (objectDefination[fieldName].type == "array") {
75
76
  if (objectDefination[fieldName].items.type == "object") {
76
- code += `${indent} ${fieldName}?: ${generateTypescriptClass(objectDefination[fieldName].items.fields, indent + " ")}[],
77
+ code += `${indent} ${fieldName}${optionalMark}: ${generateTypescriptClass(objectDefination[fieldName].items.fields, indent + " ")}[],
77
78
  `;
78
79
  }
79
80
  else {
80
- code += `${indent} ${fieldName}?: ${getCSharpTypeFromMushroomType(objectDefination[fieldName].items.type)}[],
81
+ code += `${indent} ${fieldName}${optionalMark}: ${getCSharpTypeFromMushroomType(objectDefination[fieldName].items.type)}[],
81
82
  `;
82
83
  }
83
84
  }
84
85
  else {
85
- code += `${indent} ${fieldName}?: ${getCSharpTypeFromMushroomType(objectDefination[fieldName].type)},
86
+ code += `${indent} ${fieldName}${optionalMark}: ${getCSharpTypeFromMushroomType(objectDefination[fieldName].type)},
86
87
  `;
87
88
  }
88
89
  }
@@ -92,7 +93,7 @@ function generateTypescriptClass(objectDefination, indent) {
92
93
 
93
94
  function generateTypescriptClassFromViewParameters(parameters) {
94
95
  if (Array.isArray(parameters)){
95
- return '{\n' + parameters.map(p => ` ${p.field}?: ${getCSharpTypeFromMushroomType(p.type || "string")}${p.isArray ? "[]" : ""}`).join(',\n') + '\n}';
96
+ return '{\n' + parameters.map(p => ` ${p.field}${p.validation?.required ? "" : "?"}: ${getCSharpTypeFromMushroomType(p.type || "string")}${p.isArray ? "[]" : ""}`).join(',\n') + '\n}';
96
97
  }
97
98
  return '{}';
98
99
  }
@@ -114,19 +115,19 @@ function genTypescriptDriverString(aliasProject, source) {
114
115
  extensionsImportLines.push('import * as AuthExtension from "mushroomjs-auth";');
115
116
  extensionsExportLines.push('File: FileExtension');
116
117
  extensionsTypes.push("AuthExtension.IMushroomAuth & ");
117
- extensionsCodeLines.push("AuthExtension.useAuth(AuthExtension.AuthLocalStorage);");
118
+ extensionsCodeLines.push("AuthExtension.useAuth(AuthExtension.AuthLocalStorage, mushroom);");
118
119
  }
119
120
  if (aliasProject.features.includes("file")) {
120
121
  extensionsImportLines.push('import * as FileExtension from "mushroomjs-file";');
121
122
  extensionsExportLines.push('Auth: AuthExtension');
122
123
  extensionsTypes.push("FileExtension.IMushroomFile & ");
123
- extensionsCodeLines.push("FileExtension.useFile();");
124
+ extensionsCodeLines.push("FileExtension.useFile(mushroom);");
124
125
  }
125
126
  }
126
127
 
127
128
  let code = `import mushroom, { defineAsyncResource, defineAsyncView, fireEvent, createRestfulAsyncFunction, IdType, IMushroom, Mushroom, MushroomRequest, MushroomRequestSetting, MushroomRestfulRequest, MushroomResponse, MushroomResourceBase, MushroomListResource, MushroomFindByIdResource, MushroomCreateResource, MushroomBatchCreateResource, MushroomUpdateResource, MushroomBatchUpdateResource, MushroomPartialUpdateResource, MushroomDeleteResource, MushroomBatchDeleteResource, MushroomExtensibleResource, MushroomViewFunction, MushroomError } from "mushroomjs";
128
- export * from "mushroomjs";
129
129
  ${extensionsImportLines.join("\n")}
130
+ export * from "mushroomjs";
130
131
  export const extensions = {
131
132
  ${extensionsExportLines.join(",\n ")}
132
133
  };
@@ -154,7 +155,8 @@ export type IdValue = ${source.idType == "AutoIncInt" || source.idType == "AutoI
154
155
  continue;
155
156
 
156
157
  actions[actionName] = {
157
- clientCache: (actionName === "findById" || actionName === "findMany") && isAllowCache(entity.actions[actionName], true) ? true : undefined
158
+ clientCache: (actionName === "findById" || actionName === "findMany") && isAllowCache(entity.actions[actionName], true) ? true : undefined,
159
+ includeTotal: actionName === "findMany" && entity.actions[actionName].some(a => a.includeTotal) ? true: undefined
158
160
  };
159
161
 
160
162
  switch (actionName) {
@@ -196,7 +198,7 @@ export type IdValue = ${source.idType == "AutoIncInt" || source.idType == "AutoI
196
198
  }
197
199
  default: {
198
200
  if (actionName.indexOf("_raw_http_method_") === 0) {
199
- customMethodCode += ` ${actionName.substr("_raw_http_method_".length)}Async: (rawRequest: MushroomRequest) => Promise<MushroomResponse<any>>,
201
+ customMethodCode += ` ${actionName.substring("_raw_http_method_".length)}Async: (rawRequest: MushroomRequest) => Promise<MushroomResponse<any>>,
200
202
  `;
201
203
  break;
202
204
  }
@@ -226,13 +228,17 @@ ${customMethodCode}}
226
228
  views[viewName] = { clientCache: true };
227
229
 
228
230
  const viewParameterTypes = viewRoles.map(view => {
229
- const type = `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Parameters`;
230
- code += `export interface ${type} ${generateTypescriptClassFromViewParameters(view.parameters)};
231
+ const inputType = `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Parameters`;
232
+ const outputType = view.codeHint?.output ? `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Result` : 'any';
233
+ code += `export interface ${inputType} ${generateTypescriptClassFromViewParameters(view.parameters)};
231
234
  `;
232
- return `MushroomViewFunction<any, ${type}>`;
235
+ if (view.codeHint?.output)
236
+ code += `export interface ${outputType} ${generateTypescriptClass(view.codeHint.output.fields, undefined, {checkRequired: true})};
237
+ `;
238
+ return `MushroomViewFunction<${outputType}, ${inputType}>`;
233
239
  });
234
240
  viewCode += `
235
- ${viewName}Async: ${viewParameterTypes.join(' & ')},`;
241
+ ${viewName}Async: ${viewParameterTypes.join(' | ')},`;
236
242
  }
237
243
 
238
244
  if (viewCode) {
@@ -255,7 +261,9 @@ ${customMethodCode}}
255
261
  code += `
256
262
  mushroom.$using(${JSON.stringify(common.getRootUrl(source))});
257
263
 
264
+ (function(){
258
265
  ${extensionsCodeLines.join('\n')}
266
+ })();
259
267
 
260
268
  export interface IApi extends IMushroom {
261
269
  ${iApiClassBody}};
@@ -281,19 +289,19 @@ function genDtsString(aliasProject, source) {
281
289
  if (Array.isArray(aliasProject.features)) {
282
290
  if (aliasProject.features.includes("auth")) {
283
291
  extensionsImportLines.push('import * as AuthExtension from "mushroomjs-auth";');
284
- extensionsExportLines.push('Auth: typeof AuthExtension');
292
+ extensionsExportLines.push('Auth: AuthExtension');
285
293
  extensionsTypes.push("AuthExtension.IMushroomAuth & ");
286
294
  }
287
295
  if (aliasProject.features.includes("file")) {
288
296
  extensionsImportLines.push('import * as FileExtension from "mushroomjs-file";');
289
- extensionsExportLines.push('File: typeof FileExtension');
297
+ extensionsExportLines.push('File: FileExtension');
290
298
  extensionsTypes.push("FileExtension.IMushroomFile & ");
291
299
  }
292
300
  }
293
301
 
294
302
  let code = `import { IdType, IMushroom, Mushroom, MushroomRequest, MushroomRequestSetting, MushroomRestfulRequest, MushroomResponse, MushroomResourceBase, MushroomListResource, MushroomFindByIdResource, MushroomCreateResource, MushroomBatchCreateResource, MushroomUpdateResource, MushroomBatchUpdateResource, MushroomPartialUpdateResource, MushroomDeleteResource, MushroomBatchDeleteResource, MushroomExtensibleResource, MushroomViewFunction, MushroomError } from "mushroomjs";
295
- export * from "mushroomjs";
296
303
  ${extensionsImportLines.join("\n")}
304
+ export * from "mushroomjs";
297
305
  export declare const extensions = {
298
306
  ${extensionsExportLines.join(",\n ")}
299
307
  };
@@ -363,7 +371,7 @@ export declare type IdValue = ${source.idType == "AutoIncInt" || source.idType =
363
371
  }
364
372
  default: {
365
373
  if (actionName.indexOf("_raw_http_method_") === 0) {
366
- customMethodCode += ` ${actionName.substr("_raw_http_method_".length)}Async: (rawRequest: MushroomRequest) => Promise<MushroomResponse<any>>,
374
+ customMethodCode += ` ${actionName.substring("_raw_http_method_".length)}Async: (rawRequest: MushroomRequest) => Promise<MushroomResponse<any>>,
367
375
  `;
368
376
  break;
369
377
  }
@@ -393,13 +401,17 @@ ${customMethodCode}}
393
401
  views[viewName] = { clientCache: true };
394
402
 
395
403
  const viewParameterTypes = viewRoles.map(view => {
396
- const type = `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Parameters`;
397
- code += `export interface ${type} ${generateTypescriptClassFromViewParameters(view.parameters)};
404
+ const inputType = `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Parameters`;
405
+ const outputType = view.codeHint?.output ? `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Result` : 'any';
406
+ code += `export interface ${inputType} ${generateTypescriptClassFromViewParameters(view.parameters)};
407
+ `;
408
+ if (view.codeHint?.output)
409
+ code += `export interface ${outputType} ${generateTypescriptClass(view.codeHint.output.fields, undefined, {checkRequired: true})};
398
410
  `;
399
- return `MushroomViewFunction<any, ${type}>`;
411
+ return `MushroomViewFunction<${outputType}, ${inputType}>`;
400
412
  });
401
413
  viewCode += `
402
- ${viewName}Async: ${viewParameterTypes.join(' & ')},`;
414
+ ${viewName}Async: ${viewParameterTypes.join(' | ')},`;
403
415
  }
404
416
 
405
417
  if (viewCode) {
@@ -430,7 +442,7 @@ function genTypescriptDriver(args, projectName, project, alias, source) {
430
442
  const aliasProject = ((project.tsDriver || {}).alias || {})[alias];
431
443
 
432
444
  if (!aliasProject) {
433
- throw new Error(`Not found gen ts-driver configuration. Please run 'npx mr config gen ${projectName} ts-driver OUTPUT_FILE.ts${alias === "default" ? "" : " alias " + alias}' first`);
445
+ throw new Error(`Not found gen ts-driver configuration. Please run 'npx mushroom-cli config gen ${projectName} ts-driver OUTPUT_FILE.ts${alias === "default" ? "" : " alias " + alias}' first`);
434
446
  }
435
447
 
436
448
  const code = genTypescriptDriverString(aliasProject, source);
package/gen.js CHANGED
@@ -24,8 +24,8 @@ async function gen(args) {
24
24
 
25
25
  const atIndex = projectName.indexOf("@");
26
26
  if (atIndex !== -1) {
27
- alias = projectName.substr(atIndex + 1);
28
- projectName = projectName.substr(0, atIndex);
27
+ alias = projectName.substring(atIndex + 1);
28
+ projectName = projectName.substring(0, atIndex);
29
29
  if (!projectName) {
30
30
  help(args);
31
31
  return;
package/help.js CHANGED
@@ -10,46 +10,46 @@ function help(key, wrong) {
10
10
  }
11
11
  else
12
12
  console.log(`Init a mushroom json file
13
- npx mr init json ./api/SampleProject.json [silent]
13
+ npx mushroom-cli init json ./api/SampleProject.json [silent]
14
14
 
15
15
  Init a dotnet core project which pre-install Mushroom Server
16
- npx mr init netcore projectName [features file,auth,mail]
16
+ npx mushroom-cli init netcore
17
17
 
18
18
  Add the mushroom json file into mushroom-config.json
19
- npx mr config add ./api/yourProjectName.json
19
+ npx mushroom-cli config add ./api/yourProjectName.json
20
20
 
21
21
  Config gen docs api
22
- npx mr config gen projectName docs ./wwwroot/docs.html [alias aliasName] [features file,auth,mail,driver] [roles Admin,User-Contributor]
22
+ npx mushroom-cli config gen projectName docs ./wwwroot/docs.html [alias aliasName] [features file,auth,mail,driver] [roles Admin,User-Contributor]
23
23
 
24
24
  Generate docs api (html format)
25
- npx mr gen projectName[@aliasName] docs [tmp]
25
+ npx mushroom-cli gen projectName[@aliasName] docs [tmp]
26
26
 
27
27
  Config gen database docs
28
- npx mr config gen projectName db-docs ./wwwroot/db-docs.html [alias aliasName] [features file,auth,mail]
28
+ npx mushroom-cli config gen projectName db-docs ./wwwroot/db-docs.html [alias aliasName] [features file,auth,mail]
29
29
 
30
30
  Generate database docs (html format)
31
- npx mr gen projectName[@aliasName] db-docs [tmp]
31
+ npx mushroom-cli gen projectName[@aliasName] db-docs [tmp]
32
32
 
33
33
  Config gen javascript driver
34
- npx mr config gen projectName js-driver ./src/api/mushroom.api.js [alias aliasName] [roles Admin,User-Contributor] [tarball tarballName]
34
+ npx mushroom-cli config gen projectName js-driver ./src/api/mushroom.api.js [alias aliasName] [roles Admin,User-Contributor] [tarball tarballName]
35
35
 
36
36
  Generate javascript driver
37
- npx mr gen projectName[@aliasName] js-driver
37
+ npx mushroom-cli gen projectName[@aliasName] js-driver
38
38
 
39
39
  Config gen entities for Mushroom project in CSharp and using MongoDb
40
- npx mr config gen projectName c#-mongo ./API/Generated.cs [alias aliasName]
40
+ npx mushroom-cli config gen projectName c#-mongo ./API/Generated.cs [alias aliasName]
41
41
 
42
42
  Generate entities for Mushroom project in CSharp and using MongoDb
43
- npx mr gen projectName[@aliasName] c#-mongo
43
+ npx mushroom-cli gen projectName[@aliasName] c#-mongo
44
44
 
45
45
  Config gen entities for CSharp project which calls Mushroom API
46
- npx mr config gen projectName c#-driver ./API/Generated.cs [roles Admin,User-Contributor] [alias aliasName]
46
+ npx mushroom-cli config gen projectName c#-driver ./API/Generated.cs [roles Admin,User-Contributor] [alias aliasName]
47
47
 
48
48
  Generate entities for CSharp project which calls Mushroom API
49
- npx mr gen projectName[@aliasName] c#-driver
49
+ npx mushroom-cli gen projectName[@aliasName] c#-driver
50
50
 
51
51
  Disable checking for update:
52
- npx mr parameters --no-check-update`);
52
+ npx mushroom-cli parameters --no-check-update`);
53
53
  }
54
54
 
55
55
  module.exports = help;
@@ -0,0 +1,106 @@
1
+ const fs = require("fs");
2
+ const fetch = require('node-fetch');
3
+ const readlineSync = require("readline-sync");
4
+ const help = require("../help.js");
5
+ const common = require("../common.js");
6
+
7
+ function initJson(args) {
8
+ const path = args[2];
9
+ if (!path) {
10
+ help(args);
11
+ return;
12
+ }
13
+
14
+ if (fs.existsSync(path)){
15
+ console.error(`File ${path} is already existed`);
16
+ return;
17
+ }
18
+
19
+ if (args[3] === "silent") {
20
+ console.log("Fetch http://api.siten.vn/gen/template/default.json");
21
+ fetch("http://api.siten.vn/gen/template/default.json").then(res => res.text()).then(text => {
22
+ common.ensureFolder(path);
23
+
24
+ fs.writeFile(path, text, err => {
25
+ if (err)
26
+ throw err;
27
+ console.log(`Initialized json at ${path}`);
28
+ });
29
+ });
30
+ return;
31
+ }
32
+
33
+ console.log("Fetch http://api.siten.vn/gen/template/template-def.json");
34
+ fetch("http://api.siten.vn/gen/template/template-def.json").then(res => res.json()).then(templateConfig => {
35
+ const info = {};
36
+ templateConfig.fields.forEach(field => {
37
+ while (true)
38
+ {
39
+ let question = `${field.required ? "[Required] " : ""}${field.label || field.name}`;
40
+ if (Array.isArray(field.list)) {
41
+ question += "\n";
42
+ let i = 1;
43
+ field.list.forEach(item => { question += "\t" + i++ + ". " + item + "\n"; });
44
+ question += "Please choose";
45
+ }
46
+ if (field.defaultValue !== undefined) {
47
+ question += ` (default: '${field.defaultValue}')`;
48
+ }
49
+ question += ": ";
50
+ let choice = readlineSync.question(question);
51
+ if (choice === "") {
52
+ if (field.defaultValue != undefined)
53
+ choice = field.defaultValue;
54
+ }
55
+ else if (Array.isArray(field.list)) {
56
+ if (choice !== null && choice !== "" && !isNaN(choice))
57
+ choice = field.list[choice - 1];
58
+ else
59
+ choice = undefined;
60
+ if (choice === undefined) {
61
+ console.warn("Invalid input");
62
+ continue;
63
+ }
64
+ }
65
+
66
+ if (choice === "" || choice === undefined || choice == null) {
67
+ choice = "";
68
+
69
+ if (field.required) {
70
+ console.warn("Required input value");
71
+ continue;
72
+ }
73
+ }
74
+
75
+ if (choice !== "" && field.pattern) {
76
+ const re = new RegExp(field.pattern, field.patternFlags);
77
+ if (!re.test(choice)) {
78
+ console.warn("Input doesn't match with pattern " + field.pattern);
79
+ continue;
80
+ }
81
+ }
82
+
83
+ info[field.name] = choice;
84
+ break;
85
+ }
86
+ });
87
+ //console.log(info);
88
+
89
+ console.log(`Fetch ${templateConfig.templateUrl}`);
90
+ fetch(templateConfig.templateUrl).then(res => res.text()).then(json => {
91
+ json = json.replace(/\"\$\{([\w]+)\}\"/g, (s0, s1) => JSON.stringify(info[s1]));
92
+ json = json.replace(/\$\{([\w]+)\}/g, (s0, s1) => JSON.stringify(info[s1]).replace(/^\"|\"$/g, ""));
93
+
94
+ common.ensureFolder(path);
95
+ //console.log(json);
96
+
97
+ fs.writeFile(path, json, err => {
98
+ if (err)
99
+ throw err;
100
+ console.log(`Initialized json at ${path}`);
101
+ });
102
+ });
103
+ })
104
+ }
105
+
106
+ module.exports = initJson;
@@ -0,0 +1,32 @@
1
+ const fs = require("fs");
2
+ const { spawn } = require("child_process");
3
+ const common = require("../common.js");
4
+
5
+
6
+ function fetchFromGit() {
7
+ return new Promise((resolve, reject) => {
8
+ const git = spawn("git", ["clone", "https://tfs.siten.vn/tfs/Siten/CodeBase/_git/Mushroom", "-b", "full_extensions", "--single-branch"]);
9
+ git.stdout.on('data', (data) => {
10
+ console.log(`GIT: ${data}`);
11
+ });
12
+
13
+ git.stderr.on('data', (data) => {
14
+ console.error(`GIT: ${data}`);
15
+ });
16
+
17
+ git.on('close', (code) => {
18
+ if (code) {
19
+ reject(new Error(`GIT exited with code ${code}`));
20
+ return;
21
+ }
22
+ resolve();
23
+ });
24
+ })
25
+ }
26
+
27
+ async function initNetCore(args) {
28
+ await fetchFromGit();
29
+ common.processTemplate("Mushroom", "mushroom-template.json");
30
+ }
31
+
32
+ module.exports = initNetCore;
package/init.js CHANGED
@@ -1,120 +1,16 @@
1
- const fs = require("fs");
2
- const fetch = require('node-fetch');
3
- const readlineSync = require("readline-sync");
4
1
  const help = require("./help.js");
5
- const common = require("./common.js");
6
2
 
7
- function initJson(args) {
8
- const path = args[2];
9
- if (!path) {
10
- help(args);
11
- return;
12
- }
13
-
14
- if (fs.existsSync(path)){
15
- console.error(`File ${path} is already existed`);
16
- return;
17
- }
18
-
19
- if (args[3] === "silent") {
20
- console.log("Fetch http://api.siten.vn/gen/template/default.json");
21
- fetch("http://api.siten.vn/gen/template/default.json").then(res => res.text()).then(text => {
22
- common.ensureFolder(path);
23
-
24
- fs.writeFile(path, text, err => {
25
- if (err)
26
- throw err;
27
- console.log(`Initialized json at ${path}`);
28
- });
29
- });
30
- return;
31
- }
32
-
33
- console.log("Fetch http://api.siten.vn/gen/template/template-def.json");
34
- fetch("http://api.siten.vn/gen/template/template-def.json").then(res => res.json()).then(templateConfig => {
35
- const info = {};
36
- templateConfig.fields.forEach(field => {
37
- while (true)
38
- {
39
- let question = `${field.required ? "[Required] " : ""}${field.label || field.name}`;
40
- if (Array.isArray(field.list)) {
41
- question += "\n";
42
- let i = 1;
43
- field.list.forEach(item => { question += "\t" + i++ + ". " + item + "\n"; });
44
- question += "Please choose";
45
- }
46
- if (field.defaultValue !== undefined) {
47
- question += ` (default: '${field.defaultValue}')`;
48
- }
49
- question += ": ";
50
- let choice = readlineSync.question(question);
51
- if (choice === "") {
52
- if (field.defaultValue != undefined)
53
- choice = field.defaultValue;
54
- }
55
- else if (Array.isArray(field.list)) {
56
- if (choice !== null && choice !== "" && !isNaN(choice))
57
- choice = field.list[choice - 1];
58
- else
59
- choice = undefined;
60
- if (choice === undefined) {
61
- console.warn("Invalid input");
62
- continue;
63
- }
64
- }
65
-
66
- if (choice === "" || choice === undefined || choice == null) {
67
- choice = "";
68
-
69
- if (field.required) {
70
- console.warn("Required input value");
71
- continue;
72
- }
73
- }
74
-
75
- if (choice !== "" && field.pattern) {
76
- const re = new RegExp(field.pattern, field.patternFlags);
77
- if (!re.test(choice)) {
78
- console.warn("Input doesn't match with pattern " + field.pattern);
79
- continue;
80
- }
81
- }
82
-
83
- info[field.name] = choice;
84
- break;
85
- }
86
- });
87
- //console.log(info);
88
-
89
- console.log(`Fetch ${templateConfig.templateUrl}`);
90
- fetch(templateConfig.templateUrl).then(res => res.text()).then(json => {
91
- json = json.replace(/\"\$\{([\w]+)\}\"/g, (s0, s1) => JSON.stringify(info[s1]));
92
- json = json.replace(/\$\{([\w]+)\}/g, (s0, s1) => JSON.stringify(info[s1]).replace(/^\"|\"$/g, ""));
93
-
94
- common.ensureFolder(path);
95
- //console.log(json);
96
-
97
- fs.writeFile(path, json, err => {
98
- if (err)
99
- throw err;
100
- console.log(`Initialized json at ${path}`);
101
- });
102
- });
103
- })
104
- }
105
-
106
- function initNetCore(args) {
107
- console.log("init netcore is comming soon");
108
- }
3
+ const initJson = require("./init/init-json");
4
+ const initNetCore = require("./init/init-netcore");
109
5
 
110
- function init(args) {
6
+ async function init(args) {
111
7
  const configCommand = args[1];
112
8
  switch(configCommand) {
113
9
  case "json":
114
10
  initJson(args);
115
11
  break;
116
12
  case "netcore":
117
- initNetCore(args);
13
+ await initNetCore(args);
118
14
  break;
119
15
  case "":
120
16
  case undefined:
@@ -41,9 +41,9 @@ function transformViewNode(view) {
41
41
 
42
42
  function mergeApiProject(totalProject, fragmentProject, options) {
43
43
  if (totalProject.name != null && fragmentProject.name != null && fragmentProject.name != totalProject.name)
44
- throw new Error(`Unable merge project '${fragmentProject.name}' into '${totalProject.name}`);
44
+ throw new Error(`Unable merge project '${fragmentProject.name}' into '${totalProject.name}'`);
45
45
  if (totalProject.version != null && fragmentProject.version != null && fragmentProject.version != totalProject.version)
46
- throw new Error(`Unable merge project '${fragmentProject.version}' into '${totalProject.version}`);
46
+ throw new Error(`Unable merge project '${fragmentProject.version}' into '${totalProject.version}'`);
47
47
 
48
48
  if (fragmentProject.environmentVariables != null) {
49
49
  totalProject.environmentVariables = totalProject.environmentVariables || {};
@@ -205,7 +205,7 @@ function processMasterFile(basePath, master) {
205
205
  action.defaultSortings = action.sorting.split(',').map(f => {
206
206
  const c = f.charAt(0);
207
207
  return {
208
- field: c === "+" || c === "-" ? f.substr(1) : f,
208
+ field: c === "+" || c === "-" ? f.substring(1) : f,
209
209
  type: c === "-" ? "Desc" : "Asc"
210
210
  }
211
211
  });
@@ -216,7 +216,7 @@ function processMasterFile(basePath, master) {
216
216
  action.allowSortings = action.allowSorting.split(',').map(f => {
217
217
  const c = f.charAt(0);
218
218
  return {
219
- field: c === "+" || c === "-" ? f.substr(1) : f,
219
+ field: c === "+" || c === "-" ? f.substring(1) : f,
220
220
  type: c === "-" ? "Desc" : c === "+" ? "Asc" : "Both"
221
221
  }
222
222
  });