mushroom-cli 1.1.0 → 1.2.0-alpha.2

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/README.md CHANGED
@@ -70,6 +70,10 @@ Generate entities for CSharp project which calls Mushroom API
70
70
 
71
71
  npx mushroom-cli gen projectName[@aliasName] c#-driver
72
72
 
73
+ ## Merge
74
+
75
+ npx mushroom-cli merge output-path.json
76
+
73
77
  ## Update
74
78
 
75
79
  Update ts code
@@ -84,6 +88,22 @@ Disable checking for update:
84
88
 
85
89
  ## Version
86
90
 
91
+ ### 1.2.0-alpha.2
92
+
93
+ New features:
94
+
95
+ * Support merge command
96
+
97
+ Fixed bugs:
98
+
99
+ * Generate wrong required field for view parameter
100
+
101
+ ### 1.2.0-alpha.1
102
+
103
+ New features:
104
+
105
+ * Support type for View result
106
+
87
107
  ### 1.1.0
88
108
 
89
109
  Support MushroomServer 0.2.25.4 or later
@@ -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 && p.validation.defaultValue === undefined ? "" : "?"}: ${getCSharpTypeFromMushroomType(p.type || "string")}${p.isArray ? "[]" : ""}`).join(',\n') + '\n}';
96
97
  }
97
98
  return '{}';
98
99
  }
@@ -227,13 +228,17 @@ ${customMethodCode}}
227
228
  views[viewName] = { clientCache: true };
228
229
 
229
230
  const viewParameterTypes = viewRoles.map(view => {
230
- const type = `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Parameters`;
231
- 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)};
232
234
  `;
233
- 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}>`;
234
239
  });
235
240
  viewCode += `
236
- ${viewName}Async: ${viewParameterTypes.join(' & ')},`;
241
+ ${viewName}Async: ${viewParameterTypes.join(' | ')},`;
237
242
  }
238
243
 
239
244
  if (viewCode) {
@@ -396,13 +401,17 @@ ${customMethodCode}}
396
401
  views[viewName] = { clientCache: true };
397
402
 
398
403
  const viewParameterTypes = viewRoles.map(view => {
399
- const type = `${typescriptClassName}$ViewsResource_${viewName}View_${view.grant === "*" ? "" : toTypeScriptClassName(view.grant)}Parameters`;
400
- 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})};
401
410
  `;
402
- return `MushroomViewFunction<any, ${type}>`;
411
+ return `MushroomViewFunction<${outputType}, ${inputType}>`;
403
412
  });
404
413
  viewCode += `
405
- ${viewName}Async: ${viewParameterTypes.join(' & ')},`;
414
+ ${viewName}Async: ${viewParameterTypes.join(' | ')},`;
406
415
  }
407
416
 
408
417
  if (viewCode) {
package/merge.js ADDED
@@ -0,0 +1,84 @@
1
+ const fs = require("fs");
2
+ const path = require('path');
3
+ const JSON5 = require("json5");
4
+ const common = require("./common.js");
5
+ const help = require("./help.js");
6
+
7
+ const masterFile = require("./master-file/master-file");
8
+
9
+ async function merge(args) {
10
+ let projectName = args[1];
11
+ const output = args[2];
12
+
13
+ if (!projectName || !output) {
14
+ help(args);
15
+ return;
16
+ }
17
+
18
+ let alias = "default";
19
+ const atIndex = projectName.indexOf("@");
20
+ if (atIndex !== -1) {
21
+ alias = projectName.substring(atIndex + 1);
22
+ projectName = projectName.substring(0, atIndex);
23
+ if (!projectName) {
24
+ help(args);
25
+ return;
26
+ }
27
+
28
+ if (!alias)
29
+ alias = "default";
30
+ }
31
+
32
+ let mushroomConfig;
33
+ try {
34
+ const mushroomConfigContent = fs.readFileSync("./mushroom-config.json").toString();
35
+ mushroomConfig = JSON.parse(mushroomConfigContent);
36
+ }
37
+ catch (e) {
38
+ console.error("mushroom-config.json not found or unable to parse");
39
+ throw e;
40
+ }
41
+
42
+ if (!mushroomConfig || typeof mushroomConfig !== "object")
43
+ throw new Error(`Invalid configuration. Please re-check file mushroom-config.json`);
44
+
45
+ if (!mushroomConfig || !mushroomConfig.projects || !mushroomConfig.projects[projectName])
46
+ throw new Error(`Project not found (${projectName})`);
47
+
48
+ const project = mushroomConfig.projects[projectName];
49
+ if (!project.src)
50
+ throw new Error("Project source (src) not found");
51
+
52
+ var source;
53
+ try {
54
+ const sourceContent = fs.readFileSync(project.src).toString();
55
+ source = JSON5.parse(sourceContent);
56
+ }
57
+ catch(e) {
58
+ console.error(project.src + " not found or unable to parse");
59
+ throw e;
60
+ }
61
+
62
+ if (!source || typeof source !== "object")
63
+ throw new Error(`Invalid api project configuration. Please re-check file ${project.src}`);
64
+
65
+ if (Array.isArray(source.fragments)) {
66
+ console.log("Process master file: " + project.src);
67
+ source = masterFile.processMasterFile(path.dirname(project.src), source);
68
+ }
69
+
70
+ if (!source || typeof source !== "object") {
71
+ throw new Error(`${!source}\t${typeof source}\tInvalid api project configuration. Please re-check file ${project.src}`);
72
+ }
73
+
74
+ if (source.name !== projectName) {
75
+ throw new Error(`Project name is mismatched (${projectName} & ${source.name})`);
76
+ }
77
+
78
+ common.ensureFolder(output);
79
+
80
+ fs.writeFileSync(output, JSON.stringify(source));
81
+ console.log(`Merged ${projectName}@${alias} then saved to ${output}`);
82
+ }
83
+
84
+ module.exports = merge;
package/mr.js CHANGED
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const init = require("./init.js");
4
- const config = require("./config.js");
5
- const gen = require("./gen.js");
6
- const update = require("./update.js");
7
- const help = require("./help.js");
3
+ const init = require("./init");
4
+ const config = require("./config");
5
+ const gen = require("./gen");
6
+ const merge = require("./merge");
7
+ const update = require("./update");
8
+ const help = require("./help");
8
9
 
9
10
  const pkg = require("./package.json");
10
11
  const checkUpdate = require("./check-update");
@@ -41,6 +42,9 @@ async function run(args) {
41
42
  case "gen":
42
43
  await gen(args);
43
44
  break;
45
+ case "merge":
46
+ merge(args);
47
+ break;
44
48
  case "update":
45
49
  await update(args);
46
50
  break;
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "mushroom-cli",
3
- "version": "1.1.0",
3
+ "version": "1.2.0-alpha.2",
4
4
  "description": "Mushroom CLI",
5
5
  "main": "mr.js",
6
6
  "scripts": {
7
- "release": "npm publish --access public"
7
+ "release": "npm publish --access public --tag alpha"
8
8
  },
9
9
  "keywords": [
10
10
  "Mushroom",