mushroom-cli 1.2.2 → 1.2.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.
package/README.md CHANGED
@@ -132,6 +132,18 @@ npx mushroom-cli parameters --no-check-update
132
132
 
133
133
  ## Version
134
134
 
135
+ ### 1.2.4
136
+
137
+ Improvement
138
+
139
+ - gen docs: support to gen HTTP and cURL code snippets for `requestBodyType`: `Binary` and `FormData`
140
+
141
+ ### 1.2.3
142
+
143
+ Improvement
144
+
145
+ - gen ts-driver: separate `import` and `import type` when import mushroomjs
146
+
135
147
  ### 1.2.2
136
148
 
137
149
  New features:
@@ -143,7 +155,7 @@ New features:
143
155
  Improvement/Changes:
144
156
 
145
157
  - gen docs: fix bugs
146
- - gen c#-mongo: fix signarute for RegisterCustomViewMethod method
158
+ - gen c#-mongo: fix signature for RegisterCustomViewMethod method
147
159
  - init netcore:
148
160
  - change: show warning message when replacing content in unexisting file (instead of throwing error)
149
161
 
@@ -4506,8 +4506,13 @@ API.get{{EntityName}}().deleteAsync(arg, count -> {
4506
4506
  const response = await mushroom.{{entityName}}.{{httpMethod}}Async({<span style="display: {{paramDisplay}}">
4507
4507
  params: {{paramModel:html}},</span><span style="display: {{bodyDisplay}}">
4508
4508
  body: {{bodyModel:html}}</span>
4509
- });
4510
- console.log("Kết quả trả về, response: %o", response);
4509
+ });<span style="display: {{responseJsonDisplay}}">
4510
+ console.log("Dữ liệu trả về, response: %o", response);
4511
+ // Kết quả: response.result
4512
+ // Metadata: response.meta</span><span style="display: {{responseBinaryDisplay}}">
4513
+ const blob = response.resultAsBlob();
4514
+ // Hoặc có thể dùng const text = response.resultAsText() để convert blob về string
4515
+ // Lưu ý: dùng response.result sẽ bị lỗi nếu quá trình convert blob về string rồi parse JSON bị lỗi</span>
4511
4516
  } catch (error) {
4512
4517
  console.error("Có lỗi: %o", error);
4513
4518
  }</pre>
@@ -4547,7 +4552,7 @@ catch (Exception ex)
4547
4552
  Code tham khảo:
4548
4553
  <pre data-language="http">POST {{rootUrlPath}}{{entityName}}s/{{httpMethod}}{{queryString}} HTTP/1.1
4549
4554
  Host: <span class="domain">{{domain}}</span>
4550
- Content-Type: application/json
4555
+ Content-Type: {{contentType}}
4551
4556
  X-HTTP-Method-Override: {{httpMethod}}<span style="display: {{tokenDisplay}}">
4552
4557
  Token: your token</span>
4553
4558
 
@@ -4558,17 +4563,24 @@ Token: your token</span>
4558
4563
  <div class="curl-snippet">
4559
4564
  cURL
4560
4565
  <pre data-language="cURL">curl -X POST \
4561
- '<span class="root-url">{{rootUrl}}</span>{{entityName}}s/{{httpMethod}}{{queryString}}' \
4562
- -H 'Content-Type: application/json' \
4566
+ '<span class="root-url">{{rootUrl}}</span>{{entityName}}s/{{httpMethod}}{{queryString}}' \<span style="display: {{contentTypeDisplay}}">
4567
+ -H 'Content-Type: {{contentType}}' \</span>
4563
4568
  -H 'X-HTTP-Method-Override: {{httpMethod}}' \<span style="display: {{tokenDisplay}}">
4564
- -H 'Token: {<span>{</span>TOKEN}}' \</span>
4565
- -d '{{bodyModel:html}}'</pre>
4569
+ -H 'Token: {<span>{</span>TOKEN}}' \</span><span style="display: {{bodyDisplay}}">
4570
+ -d '{{bodyModel:html}}'</span><span style="display: {{formDataDisplay}}">
4571
+ -F "field=value" \
4572
+ -F "file=@/path/to/file.ext"</span><span style="display: {{binaryDisplay}}">
4573
+ -T "/path/to/file.ext"</span></pre>
4566
4574
  Shell
4567
4575
  <pre data-language="cURL">curl --request POST \
4568
- --url '<span class="root-url">{{rootUrl}}</span>{{entityName}}s/{{httpMethod}}{{queryString}}' \
4576
+ --url '<span class="root-url">{{rootUrl}}</span>{{entityName}}s/{{httpMethod}}{{queryString}}' \<span style="display: {{contentTypeDisplay}}">
4577
+ --header 'Content-Type: {{contentType}}' \</span>
4569
4578
  --header 'X-HTTP-Method-Override: {{httpMethod}}' \<span style="display: {{tokenDisplay}}">
4570
- --header 'Token: {<span>{</span>TOKEN}}' \</span>
4571
- --data '{{bodyModel:html}}'</pre>
4579
+ --header 'Token: {<span>{</span>TOKEN}}' \</span><span style="display: {{bodyDisplay}}">
4580
+ --data '{{bodyModel:html}}'</span><span style="display: {{formDataDisplay}}">
4581
+ --form "field=value" \
4582
+ --form "file=@/path/to/file.ext"</span><span style="display: {{binaryDisplay}}">
4583
+ --data-binary "@/path/to/file.ext"</span></pre>
4572
4584
  </div>
4573
4585
  </script>
4574
4586
  <div class="mushroom-docs-template" id="template-codeSnippets-generalAction-Java">
@@ -1626,10 +1626,14 @@ window.codeSnippets = {
1626
1626
  renderTemplate('template-codeSnippets-generalAction-Javascript', {
1627
1627
  entityName: args.entityName,
1628
1628
  httpMethod: getHttpMethod(args.actionName),
1629
+ requestBodyType: args.action?.codeHint?.delegator?.requestBodyType,
1629
1630
  paramDisplay: args.action?.codeHint?.delegator?.param?.fields ? 'inline' : 'none',
1630
- bodyDisplay: args.action?.codeHint?.delegator?.requestBody?.fields ? 'inline' : 'none',
1631
- paramModel: formatHintModel(args.action.codeHint?.delegator?.param?.fields, ' ', { mode: 'model' }).trim(),
1632
- bodyModel: formatHintModel(args.action.codeHint?.delegator?.requestBody?.fields, ' ', { mode: 'model' }).trim(),
1631
+ bodyDisplay: (!args.action?.codeHint?.delegator?.requestBodyType || args.action?.codeHint?.delegator?.requestBodyType === 'JSON') && args.action?.codeHint?.delegator?.requestBody?.fields || args.action?.codeHint?.delegator?.requestBodyType === 'Binary' || args.action?.codeHint?.delegator?.requestBodyType === 'FormData' ? 'inline' : 'none',
1632
+ paramModel: formatHintModel(args.action?.codeHint?.delegator?.param?.fields, ' ', { mode: 'model' }).trim(),
1633
+ bodyModel: args.action?.codeHint?.delegator?.requestBodyType === 'Binary' ? 'file' : args.action?.codeHint?.delegator?.requestBodyType === 'FormData' ? 'formData' : formatHintModel(args.action?.codeHint?.delegator?.requestBody?.fields, ' ', { mode: 'model' }).trim(),
1634
+ isBinaryResponse: args.action?.codeHint?.delegator?.isBinaryResponse,
1635
+ responseBinaryDisplay: args.action?.codeHint?.delegator?.isBinaryResponse ? 'block' : 'none',
1636
+ responseJsonDisplay: args.action?.codeHint?.delegator?.isBinaryResponse ? 'none' : 'block',
1633
1637
  }),
1634
1638
  JavascriptParamModel: (args) =>
1635
1639
  args.action?.codeHint?.delegator?.param?.fields
@@ -1648,7 +1652,7 @@ window.codeSnippets = {
1648
1652
  })
1649
1653
  : '',
1650
1654
  JavascriptResultModel: (args) =>
1651
- args.action?.codeHint?.delegator?.result?.fields
1655
+ args.action?.codeHint?.delegator?.result?.fields && !args.action?.codeHint?.delegator?.isBinaryResponse
1652
1656
  ? renderTemplate('template-codeSnippets-generalAction-JavascriptModel', {
1653
1657
  undefinedModel: formatHintModel(args.action.codeHint.delegator.result.fields, undefined, { mode: 'model_undefined' }),
1654
1658
  valueModel: formatHintModel(args.action.codeHint.delegator.result.fields, undefined, { mode: 'model' }),
@@ -1668,7 +1672,8 @@ window.codeSnippets = {
1668
1672
  entityName: args.entityName,
1669
1673
  queryString: genQueryString(args.action.codeHint?.delegator?.param),
1670
1674
  httpMethod: getHttpMethod(args.actionName),
1671
- bodyModel: formatHintModel(args.action.codeHint?.delegator?.requestBody?.fields, undefined, { mode: 'model', hideComment: true }),
1675
+ contentType: args.action?.codeHint?.delegator?.requestBodyType === 'Binary' ? 'octet/stream' : args.action?.codeHint?.delegator?.requestBodyType === 'FormData' ? 'multipart/form-data' : 'application/json',
1676
+ bodyModel: args.action?.codeHint?.delegator?.requestBodyType === 'Binary' ? 'BINARY' : args.action?.codeHint?.delegator?.requestBodyType === 'FormData' ? 'FORMDATA' : formatHintModel(args.action.codeHint?.delegator?.requestBody?.fields, undefined, { mode: 'model', hideComment: true }),
1672
1677
  tokenDisplay: args.action.grant !== '*' ? 'inline' : 'none',
1673
1678
  }),
1674
1679
  cURL: (args) =>
@@ -1677,7 +1682,12 @@ window.codeSnippets = {
1677
1682
  entityName: args.entityName,
1678
1683
  queryString: genQueryString(args.action.codeHint?.delegator?.param),
1679
1684
  httpMethod: getHttpMethod(args.actionName),
1685
+ contentType: args.action?.codeHint?.delegator?.requestBodyType === 'Binary' ? 'octet/stream' : args.action?.codeHint?.delegator?.requestBodyType === 'FormData' ? '' : 'application/json',
1686
+ contentTypeDisplay: args.action?.codeHint?.delegator?.requestBodyType === 'FormData' ? 'none' : 'inline',
1687
+ formDataDisplay: args.action?.codeHint?.delegator?.requestBodyType === 'FormData' ? 'inline' : 'none',
1688
+ binaryDisplay: args.action?.codeHint?.delegator?.requestBodyType === 'Binary' ? 'inline' : 'none',
1680
1689
  bodyModel: formatHintModel(args.action.codeHint?.delegator?.requestBody?.fields, undefined, { mode: 'model', hideComment: true }),
1690
+ bodyDisplay: !args.action?.codeHint?.delegator?.requestBodyType || args.action?.codeHint?.delegator?.requestBodyType === 'JSON' ? 'inline' : 'none',
1681
1691
  tokenDisplay: args.action.grant !== '*' ? 'inline' : 'none',
1682
1692
  }),
1683
1693
  Java: (args) =>
@@ -48,7 +48,7 @@ const entityFeatureWhitelist = ['vn_text'];
48
48
  const vnTextWhitelist = ['fields', 'channels'];
49
49
  const vnTextChannelWhitelist = ['fields', 'name'];
50
50
  const actionCodeHintWhitelist = ['delegator'];
51
- const actionCodeHintDelegatorWhitelist = ['param', 'requestBody', 'result'];
51
+ const actionCodeHintDelegatorWhitelist = ['param', 'requestBodyType', 'requestBody', 'result', 'isBinaryResponse'];
52
52
  const fieldsOnlyWhitelist = ['fields'];
53
53
  const viewWhitelist = ['grant', 'deny', 'description', 'parameters', 'emptyResult', 'codeHint'];
54
54
  const viewCodeHintWhitelist = ['output'];
@@ -259,7 +259,8 @@ export function genTypescriptDriverString(aliasProject, source) {
259
259
  extensionsCodeLines.push('FileExtension.useFile(mushroom);');
260
260
  }
261
261
  }
262
- let code = `import mushroom, { defineAsyncResource, defineAsyncView, fireEvent, createRestfulAsyncFunction, IdType, IMushroom, Mushroom, MushroomRequest, MushroomRequestSetting, MushroomRestfulRequest, MushroomResponse, MushroomResponseDataType, MushroomResourceBase, MushroomListResource, MushroomCountResource, MushroomFindByIdResource, MushroomCreateResource, MushroomBatchCreateResource, MushroomUpdateResource, MushroomBatchUpdateResource, MushroomPartialUpdateResource, MushroomDeleteResource, MushroomBatchDeleteResource, MushroomExtensibleResource, MushroomViewFunction, MushroomError, IMushroomOfflineResponse, MushroomOfflineResponse, MushroomOfflineResponseState } from "mushroomjs";
262
+ let code = `import mushroom, { defineAsyncResource, defineAsyncView, fireEvent, createRestfulAsyncFunction, Mushroom, MushroomError } from "mushroomjs";
263
+ import type { IdType, IMushroom, MushroomRequest, MushroomRequestSetting, MushroomRestfulRequest, MushroomResponse, MushroomResponseDataType, MushroomResourceBase, MushroomListResource, MushroomCountResource, MushroomFindByIdResource, MushroomCreateResource, MushroomBatchCreateResource, MushroomUpdateResource, MushroomBatchUpdateResource, MushroomPartialUpdateResource, MushroomDeleteResource, MushroomBatchDeleteResource, MushroomExtensibleResource, MushroomViewFunction, IMushroomOfflineResponse, MushroomOfflineResponse, MushroomOfflineResponseState } from "mushroomjs";
263
264
  ${extensionsImportLines.join('\n')}
264
265
  export * from "mushroomjs";
265
266
  export const extensions = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mushroom-cli",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "Mushroom CLI",
5
5
  "main": "dist/mr.js",
6
6
  "type": "module",
@@ -33,30 +33,30 @@
33
33
  "author": "suco2007",
34
34
  "license": "ISC",
35
35
  "dependencies": {
36
- "jsdom": "^26.1.0",
36
+ "jsdom": "^28.1.0",
37
37
  "json5": "^2.2.3",
38
- "minify": "^14.0.0",
38
+ "minify": "^15.0.1",
39
39
  "node-fetch": "^3.3.2",
40
- "open": "^10.1.2",
40
+ "open": "^11.0.0",
41
41
  "readline-sync": "^1.4.10",
42
42
  "targz": "^1.0.1"
43
43
  },
44
44
  "devDependencies": {
45
- "@eslint/js": "^9.34.0",
46
- "@types/jsdom": "^21.1.7",
45
+ "@eslint/js": "^9.39.2",
46
+ "@types/jsdom": "^27.0.0",
47
47
  "@types/minify": "^9.1.4",
48
48
  "@types/node": "^22.15.29",
49
49
  "@types/node-fetch": "^2.6.13",
50
50
  "@types/readline-sync": "^1.4.8",
51
51
  "@types/targz": "^1.0.5",
52
52
  "copyfiles": "^2.4.1",
53
- "eslint": "^9.34.0",
53
+ "eslint": "^9.39.2",
54
54
  "husky": "^9.1.7",
55
- "lint-staged": "^16.1.0",
56
- "only-allow": "^1.2.1",
57
- "prettier": "^3.5.3",
58
- "typescript": "^5.8.3",
59
- "typescript-eslint": "^8.41.0"
55
+ "lint-staged": "^16.2.7",
56
+ "only-allow": "^1.2.2",
57
+ "prettier": "^3.7.4",
58
+ "typescript": "^5.9.3",
59
+ "typescript-eslint": "^8.51.0"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=14.0.0"