cloudcc-cli 2.3.0 → 2.3.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.
Files changed (96) hide show
  1. package/.cloudcc-cache.json +4 -52
  2. package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +15 -1
  3. package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +82 -8
  4. package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +13 -0
  5. package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +234 -77
  6. package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +37 -216
  7. package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +9 -6
  8. package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +99 -5
  9. package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +15 -0
  10. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +29 -7
  11. package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +60 -0
  12. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +216 -0
  13. package/.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/351/241/265/351/235/242.md +228 -0
  14. package/README.md +11 -0
  15. package/bin/index.js +3 -0
  16. package/package.json +2 -2
  17. package/src/application/delete.js +59 -0
  18. package/src/application/get.js +31 -5
  19. package/src/application/index.js +1 -0
  20. package/src/classes/delete.js +43 -0
  21. package/src/classes/detail.js +14 -7
  22. package/src/classes/index.js +1 -0
  23. package/src/customPage/create.js +74 -12
  24. package/src/customPage/delete.js +2 -2
  25. package/src/customPage/get.js +1 -1
  26. package/src/customSetting/create.js +27 -0
  27. package/src/customSetting/delete.js +26 -0
  28. package/src/customSetting/detail.js +24 -0
  29. package/src/customSetting/get.js +25 -0
  30. package/src/customSetting/index.js +4 -0
  31. package/src/fields/delete.js +52 -0
  32. package/src/fields/index.js +1 -0
  33. package/src/menu/create-page.js +16 -25
  34. package/src/menu/create.js +9 -3
  35. package/src/menu/delete.js +59 -0
  36. package/src/menu/get.js +56 -0
  37. package/src/menu/index.js +2 -0
  38. package/src/object/delete.js +51 -0
  39. package/src/object/index.js +1 -0
  40. package/src/plugin/detail.js +14 -6
  41. package/src/plugin/publish1.js +3 -3
  42. package/src/recordType/get.js +1 -1
  43. package/src/scheduleJob/delete.js +26 -0
  44. package/src/scheduleJob/detail.js +23 -0
  45. package/src/scheduleJob/get.js +26 -0
  46. package/src/scheduleJob/index.js +10 -0
  47. package/src/staticResource/count.js +25 -0
  48. package/src/staticResource/delete.js +26 -0
  49. package/src/staticResource/detail.js +24 -0
  50. package/src/staticResource/doc.js +106 -0
  51. package/src/staticResource/get.js +25 -0
  52. package/src/staticResource/index.js +12 -0
  53. package/src/timer/delete.js +43 -0
  54. package/src/timer/index.js +1 -0
  55. package/src/triggers/delete.js +46 -0
  56. package/src/triggers/index.js +1 -0
  57. package/test/application.cli.test.js +49 -8
  58. package/test/classes.cli.test.js +9 -3
  59. package/test/customSetting.cli.test.js +84 -0
  60. package/test/fields.cli.test.js +18 -3
  61. package/test/menu.cli.test.js +34 -4
  62. package/test/object.cli.test.js +17 -1
  63. package/test/scheduleJob.cli.test.js +52 -0
  64. package/test/staticResource.cli.test.js +78 -0
  65. package/test/timer.cli.test.js +8 -2
  66. package/test/trigger.cli.test.js +8 -2
  67. package/build/component-cc-test-001.common.js +0 -831
  68. package/build/component-cc-test-001.common.js.map +0 -1
  69. package/build/component-cc-test-001.css +0 -1
  70. package/build/component-cc-test-001.umd.js +0 -874
  71. package/build/component-cc-test-001.umd.js.map +0 -1
  72. package/build/component-cc-test-001.umd.min.js +0 -8
  73. package/build/component-cc-test-001.umd.min.js.map +0 -1
  74. package/build/demo.html +0 -1
  75. package/classes/CCdd/CCdd.java +0 -22
  76. package/classes/CCdd/CCddTest.java +0 -11
  77. package/classes/CCdd/config.json +0 -1
  78. package/core.zip +0 -0
  79. package/plugins/cc-test-001/cc-test-001.vue +0 -32
  80. package/plugins/cc-test-001/components/HelloWorld.vue +0 -11
  81. package/plugins/cc-test-001/config.json +0 -6
  82. package/schedule/CCdd/CCdd.java +0 -11
  83. package/schedule/CCdd/config.json +0 -1
  84. package/target/ccopenapi-0.0.4-classes.jar +0 -0
  85. package/target/ccopenapi-0.0.4.jar +0 -0
  86. package/target/classes/CCdd/CCdd.class +0 -0
  87. package/target/classes/CCdd/CCddTest.class +0 -0
  88. package/target/classes/CCdd/config.json +0 -1
  89. package/target/maven-archiver/pom.properties +0 -3
  90. package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -20
  91. package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
  92. /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}/CloudCC/350/207/252/345/256/232/344/271/211/347/273/204/344/273/266/344/275/277/347/224/250/350/257/264/346/230/216.md" +0 -0
  93. /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}/cloudcc/345/256/232/346/227/266/344/275/234/344/270/232.md" +0 -0
  94. /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}/cloudcc/345/256/232/346/227/266/347/261/273.md" +0 -0
  95. /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}//350/207/252/345/256/232/344/271/211/347/261/273.md" +0 -0
  96. /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}//350/247/246/345/217/221/345/231/250/347/261/273.md" +0 -0
@@ -1,6 +1,7 @@
1
1
  const cc = {}
2
2
  cc.get = require("./get")
3
3
  cc.create = require("./create")
4
+ cc.delete = require("./delete")
4
5
  function main(action, argvs) {
5
6
  cc[action](argvs)
6
7
  }
@@ -10,7 +10,14 @@ const BaseUrl = "https://developer.apis.cloudcc.cn";
10
10
  * - 如果提供了 pluginId,从线上查询
11
11
  * - 如果都没有,返回错误
12
12
  */
13
- async function detail(argvs) {
13
+ function outputResult(result, isMcp) {
14
+ if (!isMcp) {
15
+ console.log(JSON.stringify(result));
16
+ }
17
+ return result;
18
+ }
19
+
20
+ async function detail(argvs, isMcp = false) {
14
21
  const pluginName = argvs[2];
15
22
  const pluginId = argvs[3];
16
23
  const projectPath = argvs[4] || process.cwd();
@@ -30,7 +37,7 @@ async function detail(argvs) {
30
37
  const configContent = JSON.parse(fs.readFileSync(configPath, 'utf8'));
31
38
  const vueContent = fs.readFileSync(vueFilePath, 'utf8');
32
39
 
33
- return {
40
+ return outputResult({
34
41
  name: pluginName,
35
42
  component: configContent.component || `component-${pluginName}`,
36
43
  compName: configContent.compName || pluginName,
@@ -40,7 +47,7 @@ async function detail(argvs) {
40
47
  config: configContent,
41
48
  published: !!configContent.id,
42
49
  fromLocal: true
43
- };
50
+ }, isMcp);
44
51
  } catch (e) {
45
52
  throw new Error(`Failed to read plugin files: ${e.message}`);
46
53
  }
@@ -72,10 +79,11 @@ async function detail(argvs) {
72
79
  header
73
80
  );
74
81
  if (res && res.returnCode == 200 && res.data) {
75
- return {
76
- ...res.data,
82
+ const { compContentJs, compContentVue, ...safeData } = res.data;
83
+ return outputResult({
84
+ ...safeData,
77
85
  fromLocal: false
78
- };
86
+ }, isMcp);
79
87
  } else {
80
88
  throw new Error('Get Plugin Details Failed: ' + (res?.returnInfo || 'Unknown error'));
81
89
  }
@@ -108,9 +108,9 @@ class Builder {
108
108
 
109
109
  if (!data.style) {
110
110
  data.style = {
111
- unit: "px",
112
- width: 72,
113
- height: 38,
111
+ unit: "%",
112
+ width: 100,
113
+ height: 100,
114
114
  top: 0,
115
115
  left: 0,
116
116
  rotate: 0,
@@ -2,7 +2,7 @@ const { postClass } = require("../../utils/http")
2
2
  const { getPackageJson } = require("../../utils/config")
3
3
 
4
4
  async function get(path, prefix, isMcp = false) {
5
- let config = await getPackageJson();
5
+ let config = await getPackageJson(path || process.cwd());
6
6
  let res = await postClass(config.apiSvc + "/api/batch/getRecordType", { prefix: prefix }, config.accessToken)
7
7
  if (!isMcp) {
8
8
  console.log(JSON.stringify(res.data.recordTypeList))
@@ -0,0 +1,26 @@
1
+ const chalk = require("chalk");
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const { postClass } = require("../../utils/http");
4
+
5
+ async function remove(jobId, projectPath = process.cwd()) {
6
+ if (!jobId) {
7
+ throw new Error("Delete Schedule Job Failed: job id is required");
8
+ }
9
+ const config = await getPackageJson(projectPath);
10
+ console.error();
11
+ console.error(chalk.green(`Deleting schedule job (${jobId}), please wait...`));
12
+ console.error();
13
+ const res = await postClass(
14
+ config.setupSvc + "/api/schedulAbleprg/delete",
15
+ { id: jobId },
16
+ config.accessToken
17
+ );
18
+ if (res && res.result) {
19
+ console.error(chalk.green("Success! Schedule job deleted."));
20
+ console.error();
21
+ return res;
22
+ }
23
+ throw new Error("Delete Schedule Job Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
24
+ }
25
+
26
+ module.exports = remove;
@@ -0,0 +1,23 @@
1
+ const { getPackageJson } = require("../../utils/config");
2
+ const { postClass } = require("../../utils/http");
3
+
4
+ async function detail(jobId, projectPath = process.cwd(), isMcp = false) {
5
+ if (!jobId) {
6
+ throw new Error("Schedule Job detail requires job id");
7
+ }
8
+ const config = await getPackageJson(projectPath);
9
+ const res = await postClass(
10
+ config.setupSvc + "/api/schedulAbleprg/edit",
11
+ { id: jobId },
12
+ config.accessToken
13
+ );
14
+ if (res && res.result) {
15
+ if (!isMcp) {
16
+ console.log(JSON.stringify(res.data || {}));
17
+ }
18
+ return res.data || {};
19
+ }
20
+ throw new Error("Get Schedule Job Detail Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
21
+ }
22
+
23
+ module.exports = detail;
@@ -0,0 +1,26 @@
1
+ const { getPackageJson } = require("../../utils/config");
2
+ const { postClass } = require("../../utils/http");
3
+
4
+ async function get(projectPath = process.cwd(), encodedCondJson, isMcp = false) {
5
+ let body = {};
6
+ if (encodedCondJson) {
7
+ body = JSON.parse(decodeURI(encodedCondJson));
8
+ }
9
+ const config = await getPackageJson(projectPath);
10
+ const res = await postClass(
11
+ config.setupSvc + "/api/schedulAbleprg/list",
12
+ body,
13
+ config.accessToken
14
+ );
15
+
16
+ if (res && res.result) {
17
+ const list = Array.isArray(res.data) ? res.data : [];
18
+ if (!isMcp) {
19
+ console.log(JSON.stringify(list));
20
+ }
21
+ return list;
22
+ }
23
+ throw new Error("Get Schedule Job Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
24
+ }
25
+
26
+ module.exports = get;
@@ -0,0 +1,10 @@
1
+ const cc = {};
2
+ cc.get = require("./get");
3
+ cc.detail = require("./detail");
4
+ cc.delete = require("./delete");
5
+
6
+ function main(action, argvs) {
7
+ cc[action](argvs[2], argvs[3]);
8
+ }
9
+
10
+ module.exports = main;
@@ -0,0 +1,25 @@
1
+ const { getPackageJson } = require("../../utils/config");
2
+ const { postClass } = require("../../utils/http");
3
+
4
+ async function count(projectPath = process.cwd(), encodedCondJson, isMcp = false) {
5
+ let body = {};
6
+ if (encodedCondJson) {
7
+ body = JSON.parse(decodeURI(encodedCondJson));
8
+ }
9
+ const config = await getPackageJson(projectPath);
10
+ const res = await postClass(
11
+ config.setupSvc + "/api/staticResource/countStaticResource",
12
+ body,
13
+ config.accessToken
14
+ );
15
+ if (res && res.result) {
16
+ const data = res.data || {};
17
+ if (!isMcp) {
18
+ console.log(JSON.stringify(data));
19
+ }
20
+ return data;
21
+ }
22
+ throw new Error("Count Static Resource Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
23
+ }
24
+
25
+ module.exports = count;
@@ -0,0 +1,26 @@
1
+ const chalk = require("chalk");
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const { postClass } = require("../../utils/http");
4
+
5
+ async function remove(projectPath = process.cwd(), id) {
6
+ if (!id) {
7
+ throw new Error("Delete Static Resource Failed: id is required");
8
+ }
9
+ const config = await getPackageJson(projectPath);
10
+ console.error();
11
+ console.error(chalk.green(`Deleting static resource (${id}), please wait...`));
12
+ console.error();
13
+ const res = await postClass(
14
+ config.setupSvc + "/api/staticResource/deleteStaticResource",
15
+ { id },
16
+ config.accessToken
17
+ );
18
+ if (res && res.result) {
19
+ console.error(chalk.green("Success! Static resource deleted."));
20
+ console.error();
21
+ return res;
22
+ }
23
+ throw new Error("Delete Static Resource Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
24
+ }
25
+
26
+ module.exports = remove;
@@ -0,0 +1,24 @@
1
+ const { getPackageJson } = require("../../utils/config");
2
+ const { postClass } = require("../../utils/http");
3
+
4
+ async function detail(projectPath = process.cwd(), id, isMcp = false) {
5
+ if (!id) {
6
+ throw new Error("Static Resource detail requires id");
7
+ }
8
+ const config = await getPackageJson(projectPath);
9
+ const res = await postClass(
10
+ config.setupSvc + "/api/staticResource/detailStaticResource",
11
+ { id },
12
+ config.accessToken
13
+ );
14
+ if (res && res.result) {
15
+ const data = res.data || {};
16
+ if (!isMcp) {
17
+ console.log(JSON.stringify(data));
18
+ }
19
+ return data;
20
+ }
21
+ throw new Error("Get Static Resource Detail Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
22
+ }
23
+
24
+ module.exports = detail;
@@ -0,0 +1,106 @@
1
+ /**
2
+ * staticResource 文档统一入口(全量一次性输出)
3
+ */
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+
7
+ function generateFullMarkdownDoc() {
8
+ const lines = [
9
+ "# CloudCC 静态资源(Static Resource)操作指南",
10
+ "",
11
+ "直接查看:`cc doc staticResource`",
12
+ "",
13
+ "> 静态资源用于在平台侧保存并复用静态文件(如图片、JS、CSS、压缩包等)。",
14
+ "> 本文档包含页面操作要点 + 相关接口速查(附录自动引入)。",
15
+ "",
16
+ "---",
17
+ "",
18
+ "## 1. 常见操作流程",
19
+ "",
20
+ "### 1.1 查询列表",
21
+ "",
22
+ "- 在静态资源列表页查看已有资源",
23
+ "- 可按 `label`(标签/名称)筛选(部分页面当前固定传空)",
24
+ "",
25
+ "### 1.2 新建静态资源(上传)",
26
+ "",
27
+ "核心字段:",
28
+ "- `label`:标签/名称(必填)",
29
+ "- `file`:上传文件(新建必传)",
30
+ "- `name`:文件名(通常取上传文件名)",
31
+ "- `type`:文件后缀(通常从文件名提取)",
32
+ "- `desc`:描述(可选)",
33
+ "",
34
+ "### 1.3 编辑静态资源",
35
+ "",
36
+ "- 编辑时需要传 `id`",
37
+ "- 若不重新上传文件,`file` 通常传空字符串 `\"\"`(以接口契约为准)",
38
+ "",
39
+ "### 1.4 查看详情",
40
+ "",
41
+ "- 通过资源 `id` 打开查看弹窗/详情接口",
42
+ "",
43
+ "### 1.5 删除静态资源",
44
+ "",
45
+ "- 通过资源 `id` 删除",
46
+ "- 删除前建议确认是否被页面、脚本或组件引用",
47
+ "",
48
+ "### 1.6 上传前容量校验",
49
+ "",
50
+ "- 上传前可先调用容量统计接口,获取当前占用大小",
51
+ "- 前端通常据此判断总大小是否超限(常见阈值约 15MB,具体以产品为准)",
52
+ "",
53
+ "---",
54
+ "",
55
+ "## 2. 接口与动作映射",
56
+ "",
57
+ "- **列表**:`POST /staticResource/listStaticResource`",
58
+ "- **详情**:`POST /staticResource/detailStaticResource`(`id`)",
59
+ "- **新建/编辑**:`POST /staticResource/saveStaticResource`(`FormData`)",
60
+ "- **删除**:`POST /staticResource/deleteStaticResource`(`id`)",
61
+ "- **容量统计**:`POST /staticResource/countStaticResource`",
62
+ "",
63
+ "---",
64
+ "",
65
+ "## 3. Checklist",
66
+ "",
67
+ "- [ ] 上传前已通过容量统计确认大小不会超限",
68
+ "- [ ] `label` 清晰可检索,避免重复命名",
69
+ "- [ ] 编辑不换文件时,确认 `file` 参数是否应传空字符串",
70
+ "- [ ] 删除前确认没有被页面/脚本/组件引用",
71
+ "",
72
+ ];
73
+
74
+ const base = lines.join("\n");
75
+ const apiPath = path.join(__dirname, "..", "..", "cloudcc-cli-dev", "STATIC-RESOURCE-API.md");
76
+ let apiContent = "";
77
+ try {
78
+ apiContent = fs.readFileSync(apiPath, "utf8");
79
+ } catch (e) {
80
+ apiContent = `# 静态资源(Static Resource)接口文档\n\n(未找到文件:${apiPath})\n`;
81
+ }
82
+
83
+ return [
84
+ base,
85
+ "",
86
+ "---",
87
+ "",
88
+ "## 附录:静态资源接口速查",
89
+ "",
90
+ "> 来源:`cloudcc-cli-dev/STATIC-RESOURCE-API.md`",
91
+ "",
92
+ apiContent.trim(),
93
+ "",
94
+ ].join("\n");
95
+ }
96
+
97
+ function doc() {
98
+ const content = generateFullMarkdownDoc();
99
+ console.log(content);
100
+ return content;
101
+ }
102
+
103
+ doc.getEditGuide = doc;
104
+
105
+ module.exports = doc;
106
+
@@ -0,0 +1,25 @@
1
+ const { getPackageJson } = require("../../utils/config");
2
+ const { postClass } = require("../../utils/http");
3
+
4
+ async function get(projectPath = process.cwd(), encodedCondJson, isMcp = false) {
5
+ let body = {};
6
+ if (encodedCondJson) {
7
+ body = JSON.parse(decodeURI(encodedCondJson));
8
+ }
9
+ const config = await getPackageJson(projectPath);
10
+ const res = await postClass(
11
+ config.setupSvc + "/api/staticResource/listStaticResource",
12
+ body,
13
+ config.accessToken
14
+ );
15
+ if (res && res.result) {
16
+ const list = res?.data?.objList || res?.data?.list || [];
17
+ if (!isMcp) {
18
+ console.log(JSON.stringify(list));
19
+ }
20
+ return list;
21
+ }
22
+ throw new Error("Get Static Resource Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
23
+ }
24
+
25
+ module.exports = get;
@@ -0,0 +1,12 @@
1
+ const cc = {};
2
+ cc.doc = require("./doc");
3
+ cc.get = require("./get");
4
+ cc.detail = require("./detail");
5
+ cc.delete = require("./delete");
6
+ cc.count = require("./count");
7
+ function StaticResource(action, argvs) {
8
+ cc[action](argvs[2], argvs[3]);
9
+ }
10
+
11
+ module.exports = StaticResource;
12
+
@@ -0,0 +1,43 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const chalk = require("chalk");
4
+ const { getPackageJson } = require("../../utils/config");
5
+ const { postClass } = require("../../utils/http");
6
+
7
+ async function remove(nameOrId, projectPath = process.cwd()) {
8
+ let scheduleId = nameOrId;
9
+ const schedulePath = path.join(projectPath, `schedule/${nameOrId}/`);
10
+ const configPath = path.join(schedulePath, "config.json");
11
+
12
+ if (fs.existsSync(configPath)) {
13
+ const configContent = JSON.parse(fs.readFileSync(configPath, "utf8"));
14
+ if (configContent.id) {
15
+ scheduleId = configContent.id;
16
+ }
17
+ }
18
+
19
+ if (!scheduleId) {
20
+ throw new Error("Delete Schedule Failed: schedule name or id is required");
21
+ }
22
+
23
+ const config = await getPackageJson(projectPath);
24
+ console.error();
25
+ console.error(chalk.green(`Deleting schedule (${scheduleId}), please wait...`));
26
+ console.error();
27
+
28
+ const res = await postClass(
29
+ config.setupSvc + "/api/ccPeak/delete",
30
+ { id: scheduleId },
31
+ config.accessToken
32
+ );
33
+
34
+ if (res && res.result) {
35
+ console.error(chalk.green("Success! Schedule deleted."));
36
+ console.error();
37
+ return res;
38
+ }
39
+ const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
40
+ throw new Error("Delete Schedule Failed: " + msg);
41
+ }
42
+
43
+ module.exports = remove;
@@ -5,6 +5,7 @@ cc.pull = require("./pull")
5
5
  cc.get = require("./get")
6
6
  cc.pullList = require("./pullList")
7
7
  cc.detail = require("./detail")
8
+ cc.delete = require("./delete")
8
9
  function Timer(action, argvs) {
9
10
  cc[action](argvs[2], argvs[3])
10
11
  }
@@ -0,0 +1,46 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const chalk = require("chalk");
4
+ const { getPackageJson } = require("../../utils/config");
5
+ const { postClass } = require("../../utils/http");
6
+
7
+ async function remove(argvs) {
8
+ const namePathOrId = argvs[2];
9
+ const projectPath = argvs[3] || process.cwd();
10
+
11
+ if (!namePathOrId) {
12
+ throw new Error("Delete Trigger Failed: trigger namePath or id is required");
13
+ }
14
+
15
+ let triggerId = namePathOrId;
16
+ const triggerPath = path.join(projectPath, `triggers/${namePathOrId}/`);
17
+ const configPath = path.join(triggerPath, "config.json");
18
+
19
+ if (fs.existsSync(configPath)) {
20
+ const configContent = JSON.parse(fs.readFileSync(configPath, "utf8"));
21
+ if (configContent.id) {
22
+ triggerId = configContent.id;
23
+ }
24
+ }
25
+
26
+ const config = await getPackageJson(projectPath);
27
+ console.error();
28
+ console.error(chalk.green(`Deleting trigger (${triggerId}), please wait...`));
29
+ console.error();
30
+
31
+ const res = await postClass(
32
+ config.setupSvc + "/api/triggerSetup/deleteTrigger",
33
+ { id: triggerId },
34
+ config.accessToken
35
+ );
36
+
37
+ if (res && res.result) {
38
+ console.error(chalk.green("Success! Trigger deleted."));
39
+ console.error();
40
+ return res;
41
+ }
42
+ const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
43
+ throw new Error("Delete Trigger Failed: " + msg);
44
+ }
45
+
46
+ module.exports = remove;
@@ -6,6 +6,7 @@ cc.get = require("./get")
6
6
  cc.pullList = require("./pullList")
7
7
  cc.detail = require("./detail")
8
8
  cc.doc = require("./doc")
9
+ cc.delete = require("./delete")
9
10
  function Classes(action, argvs) {
10
11
  if (action === "detail") {
11
12
  cc[action](argvs[2], argvs[3]);
@@ -16,15 +16,56 @@ async function runCc(args) {
16
16
  return execAsync(cmd, { cwd: repoRoot });
17
17
  }
18
18
 
19
- test("应用管理流程:创建 application", async () => {
20
- const appName = `TestApp${Date.now()}`;
21
- const appCode = `test_app_${Date.now()}`;
19
+ async function wait(ms) {
20
+ return new Promise((resolve) => setTimeout(resolve, ms));
21
+ }
22
+
23
+ test("应用管理流程:create -> get -> delete", async (t) => {
24
+ const suffix = Date.now();
25
+ const appName = `TestApp${suffix}`;
26
+ const appCode = `test_app_${suffix}`;
27
+ let appId = null;
28
+
29
+ await t.test("1) 创建 application", async () => {
30
+ const { stdout, stderr } = await runCc(["create", "application", repoRoot, appName, appCode]);
31
+ const out = `${stdout}\n${stderr}`.trim();
32
+ assert.match(out, /Success|成功/i, "create application 应输出成功信息");
33
+ console.error(`\n[application-test] 已创建应用: ${appName} (code=${appCode})`);
34
+ });
22
35
 
23
- const { stdout, stderr } = await runCc(["create", "application", repoRoot, appName, appCode]);
24
- const out = `${stdout}\n${stderr}`.trim();
36
+ await t.test("2) get application 列表并找到刚创建应用", async () => {
37
+ let hit = null;
38
+ for (let i = 0; i < 3; i += 1) {
39
+ const { stdout } = await runCc(["get", "application", repoRoot]);
40
+ const list = JSON.parse(stdout.trim());
41
+ assert.ok(Array.isArray(list), "get application 应返回数组");
42
+ hit = list.find((item) =>
43
+ item.appName === appName ||
44
+ item.appLabel === appName ||
45
+ item.app_label === appName ||
46
+ item.appCode === appCode
47
+ );
48
+ if (hit) {
49
+ break;
50
+ }
51
+ await wait(1500);
52
+ }
53
+ if (!hit) {
54
+ console.error("[application-test] 未在列表中定位到刚创建应用,跳过删除步骤");
55
+ return;
56
+ }
57
+ appId = hit.id;
58
+ assert.ok(appId, "命中应用应包含 id");
59
+ });
25
60
 
26
- // src/application/create.js 成功时会输出 `Success!`
27
- assert.match(out, /Success|成功/i, "create application 应输出成功信息");
28
- console.error(`\n[application-test] 已创建应用: ${appName} (code=${appCode})`);
61
+ await t.test("3) 删除 application", async () => {
62
+ if (!appId) {
63
+ console.error("[application-test] appId,跳过 delete application");
64
+ return;
65
+ }
66
+ const { stdout, stderr } = await runCc(["delete", "application", repoRoot, appId]);
67
+ const out = `${stdout}\n${stderr}`.trim();
68
+ assert.match(out, /Success|成功/i, "delete application 应输出成功信息");
69
+ });
29
70
  });
30
71
 
@@ -17,7 +17,7 @@ async function runCc(args) {
17
17
  return execAsync(cmd, { cwd: repoRoot });
18
18
  }
19
19
 
20
- test("类管理流程:创建→doc→发布→拉取→线上详情→列表→批量拉取前2个→清空classes文件夹", async (t) => {
20
+ test("类管理流程:创建→doc→发布→拉取→线上详情→列表→批量拉取→delete→清空classes文件夹", async (t) => {
21
21
  const className = `CCbbbbbbFlow${Date.now()}`;
22
22
  const classDir = path.join(repoRoot, "classes", className);
23
23
  const configPath = path.join(classDir, "config.json");
@@ -42,7 +42,7 @@ test("类管理流程:创建→doc→发布→拉取→线上详情→列表
42
42
 
43
43
  t.test("2) 获取 doc(classes overview)", async () => {
44
44
  const { stdout } = await runCc(["doc", "classes", "overview"]);
45
- assert.match(stdout, /CloudCC 类编辑知识库/);
45
+ assert.match(stdout, /CloudCC 自定义类开发指南|CloudCC 类编辑知识库/);
46
46
  });
47
47
 
48
48
  t.test("3) 发布类(publish,写回 config.id)", async () => {
@@ -109,7 +109,13 @@ test("类管理流程:创建→doc→发布→拉取→线上详情→列表
109
109
  assert.ok(afterCount >= beforeCount, "pullList 之后 classes 目录应存在/可用");
110
110
  });
111
111
 
112
- t.test("8) 清空 classes 文件夹", async () => {
112
+ t.test("8) 删除当前创建类(delete classes", async () => {
113
+ const { stdout, stderr } = await runCc(["delete", "classes", className, repoRoot]);
114
+ const out = `${stdout}\n${stderr}`.trim();
115
+ assert.match(out, /Success|成功/i, "delete classes 应输出成功信息");
116
+ });
117
+
118
+ t.test("9) 清空 classes 文件夹", async () => {
113
119
  if (fs.existsSync(classesRoot)) {
114
120
  fs.rmSync(classesRoot, { recursive: true, force: true });
115
121
  }