@camunda8/cli 2.8.0-alpha.4 → 2.8.0-alpha.5

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.
@@ -1,14 +1,14 @@
1
1
  /**
2
- * Run command - Deploy and create process instance in one step
2
+ * Run command deploy a BPMN file and start a process instance in one step.
3
+ *
4
+ * Per #288, the body lives directly in the `defineCommand` handler:
5
+ * dry-run preview via the framework's `dryRun()` helper, validation
6
+ * up-front, and `throw` on every error path so the framework's
7
+ * `handleCommandError` wrapper owns process termination.
3
8
  */
4
9
  /**
5
- * Run - deploy and start process instance
10
+ * Side-effectful: deploys a BPMN file and creates a process instance,
11
+ * logging progress inline. Self-rendering, so returns `{ kind: "none" }`.
6
12
  */
7
- export declare function run(path: string, options: {
8
- profile?: string;
9
- variables?: string;
10
- force?: boolean;
11
- }): Promise<void>;
12
- /** Side-effectful: deploys a file and creates a process instance, logging progress inline. */
13
13
  export declare const runCommand: import("../command-framework.ts").CommandHandler<"run", "">;
14
14
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH;;GAEG;AACH,wBAAsB,GAAG,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,GACC,OAAO,CAAC,IAAI,CAAC,CAqEf;AAID,8FAA8F;AAC9F,eAAO,MAAM,UAAU,6DAOrB,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH;;;GAGG;AACH,eAAO,MAAM,UAAU,6DA2ErB,CAAC"}
@@ -1,89 +1,89 @@
1
1
  /**
2
- * Run command - Deploy and create process instance in one step
2
+ * Run command deploy a BPMN file and start a process instance in one step.
3
+ *
4
+ * Per #288, the body lives directly in the `defineCommand` handler:
5
+ * dry-run preview via the framework's `dryRun()` helper, validation
6
+ * up-front, and `throw` on every error path so the framework's
7
+ * `handleCommandError` wrapper owns process termination.
3
8
  */
4
9
  import { readFileSync } from "node:fs";
5
10
  import { basename, extname } from "node:path";
6
11
  import { ProcessDefinitionId, TenantId, } from "@camunda8/orchestration-cluster-api";
7
- import { createClient, emitDryRun } from "../client.js";
8
- import { defineCommand } from "../command-framework.js";
12
+ import { defineCommand, dryRun } from "../command-framework.js";
9
13
  import { resolveTenantId } from "../config.js";
10
- import { handleCommandError } from "../errors.js";
11
- import { getLogger } from "../logger.js";
12
14
  import { DEPLOYABLE_EXTENSIONS } from "./resource-extensions.js";
13
15
  /**
14
- * Extract process ID from BPMN file
16
+ * Extract process ID from BPMN file content.
15
17
  */
16
18
  function extractProcessId(bpmnContent) {
17
19
  const match = bpmnContent.match(/process[^>]+id="([^"]+)"/);
18
20
  return match ? match[1] : null;
19
21
  }
22
+ // ─── defineCommand ───────────────────────────────────────────────────────────
20
23
  /**
21
- * Run - deploy and start process instance
24
+ * Side-effectful: deploys a BPMN file and creates a process instance,
25
+ * logging progress inline. Self-rendering, so returns `{ kind: "none" }`.
22
26
  */
23
- export async function run(path, options) {
24
- if (emitDryRun({
27
+ export const runCommand = defineCommand("run", "", async (ctx, flags) => {
28
+ const path = ctx.resource;
29
+ // Dry-run preview comes first, mirroring the pre-#288 order pinned by
30
+ // `tests/unit/form-topology-run-behaviour.test.ts`. The body shape
31
+ // `{ path, variables }` is part of that contract.
32
+ const dr = dryRun({
25
33
  command: "run",
26
34
  method: "POST",
27
35
  endpoint: "/deployments + /process-instances",
28
- profile: options.profile,
29
- body: { path, variables: options.variables },
30
- }))
31
- return;
32
- const logger = getLogger();
33
- // Validate file extension unless --force is set
36
+ profile: ctx.profile,
37
+ body: { path, variables: flags.variables },
38
+ });
39
+ if (dr)
40
+ return dr;
41
+ // Validate file extension unless --force is set.
34
42
  const ext = extname(path);
35
- if (!options.force && ext && !DEPLOYABLE_EXTENSIONS.includes(ext)) {
43
+ if (!flags.force && ext && !DEPLOYABLE_EXTENSIONS.includes(ext)) {
36
44
  throw new Error(`Unsupported file extension "${ext}". Use --force to deploy any file type.`);
37
45
  }
38
- const client = createClient(options.profile);
39
- const tenantId = resolveTenantId(options.profile);
40
- try {
41
- // Read BPMN file
42
- const content = readFileSync(path, "utf-8");
43
- const processId = extractProcessId(content);
44
- if (!processId) {
45
- throw new Error("Could not extract process ID from BPMN file");
46
+ // Parse --variables up-front, before any I/O. Pre-#288 this happened
47
+ // after the deploy network call, which made the bad-JSON path
48
+ // untestable in unit tests and wasted a deploy round-trip on a
49
+ // user-fixable input error. Validate at the boundary, where it
50
+ // belongs.
51
+ let variables;
52
+ if (flags.variables !== undefined) {
53
+ try {
54
+ variables = JSON.parse(flags.variables);
46
55
  }
47
- logger.info(`Deploying ${path}...`);
48
- // Deploy the BPMN file - convert to File object with proper MIME type
49
- const fileName = basename(path) || "process.bpmn";
50
- const deployResult = await client.createDeployment({
51
- tenantId: TenantId.assumeExists(tenantId),
52
- resources: [
53
- new File([Buffer.from(content)], fileName, { type: "application/xml" }),
54
- ],
55
- });
56
- logger.success("Deployment successful", deployResult.deploymentKey.toString());
57
- // Create process instance
58
- logger.info(`Creating process instance for ${processId}...`);
59
- let variables;
60
- if (options.variables) {
61
- try {
62
- variables = JSON.parse(options.variables);
63
- }
64
- catch (error) {
65
- handleCommandError(logger, "Invalid JSON for variables", error);
66
- }
56
+ catch (error) {
57
+ throw new Error(`Invalid JSON for variables: ${error instanceof Error ? error.message : String(error)}`);
67
58
  }
68
- const createResult = await client.createProcessInstance({
69
- processDefinitionId: ProcessDefinitionId.assumeExists(processId),
70
- tenantId: TenantId.assumeExists(tenantId),
71
- ...(variables !== undefined && { variables }),
72
- });
73
- logger.success("Process instance created", createResult.processInstanceKey);
74
59
  }
75
- catch (error) {
76
- handleCommandError(logger, "Failed to run process", error);
60
+ // Read BPMN file and extract process ID.
61
+ const content = readFileSync(path, "utf-8");
62
+ const processId = extractProcessId(content);
63
+ if (!processId) {
64
+ throw new Error("Could not extract process ID from BPMN file");
77
65
  }
78
- }
79
- // ─── defineCommand wrapper ───────────────────────────────────────────────────
80
- /** Side-effectful: deploys a file and creates a process instance, logging progress inline. */
81
- export const runCommand = defineCommand("run", "", async (ctx, flags) => {
82
- await run(ctx.resource, {
83
- profile: ctx.profile,
84
- variables: flags.variables,
85
- force: flags.force,
66
+ const { client, logger } = ctx;
67
+ const tenantId = resolveTenantId(ctx.profile);
68
+ logger.info(`Deploying ${path}...`);
69
+ // Deploy the BPMN file. Convert to a File object with the correct
70
+ // MIME type so the multipart boundary the SDK builds is well-formed.
71
+ const fileName = basename(path) || "process.bpmn";
72
+ const deployResult = await client.createDeployment({
73
+ tenantId: TenantId.assumeExists(tenantId),
74
+ resources: [
75
+ new File([Buffer.from(content)], fileName, { type: "application/xml" }),
76
+ ],
77
+ });
78
+ logger.success("Deployment successful", deployResult.deploymentKey.toString());
79
+ // Create process instance.
80
+ logger.info(`Creating process instance for ${processId}...`);
81
+ const createResult = await client.createProcessInstance({
82
+ processDefinitionId: ProcessDefinitionId.assumeExists(processId),
83
+ tenantId: TenantId.assumeExists(tenantId),
84
+ ...(variables !== undefined && { variables }),
86
85
  });
86
+ logger.success("Process instance created", createResult.processInstanceKey);
87
87
  return { kind: "none" };
88
88
  });
89
89
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACN,mBAAmB,EACnB,QAAQ,GACR,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE;;GAEG;AACH,SAAS,gBAAgB,CAAC,WAAmB;IAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAE1B,sEAAsE;IACtE,mEAAmE;IACnE,kDAAkD;IAClD,MAAM,EAAE,GAAG,MAAM,CAAC;QACjB,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,mCAAmC;QAC7C,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;KAC1C,CAAC,CAAC;IACH,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,iDAAiD;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACd,+BAA+B,GAAG,yCAAyC,CAC3E,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,8DAA8D;IAC9D,+DAA+D;IAC/D,+DAA+D;IAC/D,WAAW;IACX,IAAI,SAA8C,CAAC;IACnD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC;YACJ,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACd,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvF,CAAC;QACH,CAAC;IACF,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC;IAEpC,kEAAkE;IAClE,qEAAqE;IACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;QAClD,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC;QACzC,SAAS,EAAE;YACV,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;SACvE;KACD,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CACb,uBAAuB,EACvB,YAAY,CAAC,aAAa,CAAC,QAAQ,EAAE,CACrC,CAAC;IAEF,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,KAAK,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC;QACvD,mBAAmB,EAAE,mBAAmB,CAAC,YAAY,CAAC,SAAS,CAAC;QAChE,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC;QACzC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;KAC7C,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAE5E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda8/cli",
3
- "version": "2.8.0-alpha.4",
3
+ "version": "2.8.0-alpha.5",
4
4
  "description": "Camunda 8 CLI - minimal-dependency CLI for Camunda 8 operations",
5
5
  "type": "module",
6
6
  "engines": {