@camunda8/cli 2.8.0-alpha.9 → 3.0.0

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 (88) hide show
  1. package/EXAMPLES.md +22 -5
  2. package/PLUGIN-HELP.md +26 -0
  3. package/README.md +37 -4
  4. package/dist/command-dispatch.d.ts.map +1 -1
  5. package/dist/command-dispatch.js +2 -1
  6. package/dist/command-dispatch.js.map +1 -1
  7. package/dist/command-registry.d.ts +30 -0
  8. package/dist/command-registry.d.ts.map +1 -1
  9. package/dist/command-registry.js +34 -1
  10. package/dist/command-registry.js.map +1 -1
  11. package/dist/commands/plugins.d.ts +21 -0
  12. package/dist/commands/plugins.d.ts.map +1 -1
  13. package/dist/commands/plugins.js +74 -1
  14. package/dist/commands/plugins.js.map +1 -1
  15. package/dist/commands/resource-extensions.d.ts +12 -0
  16. package/dist/commands/resource-extensions.d.ts.map +1 -1
  17. package/dist/commands/resource-extensions.js +13 -1
  18. package/dist/commands/resource-extensions.js.map +1 -1
  19. package/dist/commands/run.d.ts.map +1 -1
  20. package/dist/commands/run.js +5 -3
  21. package/dist/commands/run.js.map +1 -1
  22. package/dist/commands/watch.d.ts.map +1 -1
  23. package/dist/commands/watch.js +21 -12
  24. package/dist/commands/watch.js.map +1 -1
  25. package/dist/completion.d.ts.map +1 -1
  26. package/dist/completion.js +140 -13
  27. package/dist/completion.js.map +1 -1
  28. package/dist/default-plugins/bpmn/README.md +69 -0
  29. package/dist/default-plugins/bpmn/c8ctl-plugin.js +125 -0
  30. package/dist/default-plugins/bpmn/c8ctl-plugin.js.map +1 -0
  31. package/dist/default-plugins/bpmn/lint.js +259 -0
  32. package/dist/default-plugins/bpmn/lint.js.map +1 -0
  33. package/dist/default-plugins/bpmn/package.json +8 -0
  34. package/dist/default-plugins/cluster/package.json +1 -1
  35. package/dist/default-plugins/element-template/AGENTS.md +65 -0
  36. package/dist/default-plugins/element-template/README.md +331 -0
  37. package/dist/default-plugins/element-template/c8ctl-plugin.js +247 -0
  38. package/dist/default-plugins/element-template/c8ctl-plugin.js.map +1 -0
  39. package/dist/default-plugins/element-template/commands/apply.js +298 -0
  40. package/dist/default-plugins/element-template/commands/apply.js.map +1 -0
  41. package/dist/default-plugins/element-template/commands/get-properties.js +344 -0
  42. package/dist/default-plugins/element-template/commands/get-properties.js.map +1 -0
  43. package/dist/default-plugins/element-template/commands/get.js +107 -0
  44. package/dist/default-plugins/element-template/commands/get.js.map +1 -0
  45. package/dist/default-plugins/element-template/commands/info.js +189 -0
  46. package/dist/default-plugins/element-template/commands/info.js.map +1 -0
  47. package/dist/default-plugins/element-template/commands/search.js +101 -0
  48. package/dist/default-plugins/element-template/commands/search.js.map +1 -0
  49. package/dist/default-plugins/element-template/commands/sync.js +36 -0
  50. package/dist/default-plugins/element-template/commands/sync.js.map +1 -0
  51. package/dist/default-plugins/element-template/docs/design.md +145 -0
  52. package/dist/default-plugins/element-template/helpers.js +404 -0
  53. package/dist/default-plugins/element-template/helpers.js.map +1 -0
  54. package/dist/default-plugins/element-template/marketplace.js +396 -0
  55. package/dist/default-plugins/element-template/marketplace.js.map +1 -0
  56. package/dist/default-plugins/element-template/package.json +8 -0
  57. package/dist/default-plugins/element-template/template-ref.js +232 -0
  58. package/dist/default-plugins/element-template/template-ref.js.map +1 -0
  59. package/dist/default-plugins/element-template/vendor-src/bundle-entry.js +44 -0
  60. package/dist/default-plugins/feel/README.md +163 -0
  61. package/dist/default-plugins/feel/c8ctl-plugin.js +616 -0
  62. package/dist/default-plugins/feel/c8ctl-plugin.js.map +1 -0
  63. package/dist/default-plugins/feel/package.json +8 -0
  64. package/dist/deployments.d.ts +1 -0
  65. package/dist/deployments.d.ts.map +1 -1
  66. package/dist/deployments.js +89 -20
  67. package/dist/deployments.js.map +1 -1
  68. package/dist/help.d.ts.map +1 -1
  69. package/dist/help.js +156 -5
  70. package/dist/help.js.map +1 -1
  71. package/dist/ignore.d.ts +16 -1
  72. package/dist/ignore.d.ts.map +1 -1
  73. package/dist/ignore.js +55 -3
  74. package/dist/ignore.js.map +1 -1
  75. package/dist/index.d.ts +23 -0
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +294 -25
  78. package/dist/index.js.map +1 -1
  79. package/dist/plugin-loader.d.ts +168 -7
  80. package/dist/plugin-loader.d.ts.map +1 -1
  81. package/dist/plugin-loader.js +284 -21
  82. package/dist/plugin-loader.js.map +1 -1
  83. package/dist/runtime.d.ts +10 -0
  84. package/dist/runtime.d.ts.map +1 -1
  85. package/dist/runtime.js +6 -0
  86. package/dist/runtime.js.map +1 -1
  87. package/dist/vendor/bpmn-element-templates.cjs +59639 -0
  88. package/package.json +20 -7
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Helpers for the element-template plugin: --set parsing, file/URL fetching,
3
+ * shared element-template schema types.
4
+ */
5
+ import { existsSync, readFileSync } from "node:fs";
6
+ import { resolve as resolvePath } from "node:path";
7
+ if (!globalThis.c8ctl)
8
+ throw new Error("c8ctl runtime not initialised");
9
+ const c8ctl = globalThis.c8ctl;
10
+ /**
11
+ * User-Agent header sent on every outbound HTTP call this plugin makes
12
+ * (marketplace index/template fetches and ad-hoc template URL loads),
13
+ * so traffic from c8ctl is attributable in upstream logs.
14
+ */
15
+ export const USER_AGENT = `c8ctl-plugin-element-template/${c8ctl.version}`;
16
+ export function isRecord(value) {
17
+ return value != null && typeof value === "object" && !Array.isArray(value);
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // File / URL fetching
21
+ // ---------------------------------------------------------------------------
22
+ export function isUrl(input) {
23
+ return input.startsWith("https://") || input.startsWith("http://");
24
+ }
25
+ /**
26
+ * Rewrite a GitHub blob URL to the raw content URL.
27
+ * https://github.com/<owner>/<repo>/blob/<ref>/<path>
28
+ * → https://raw.githubusercontent.com/<owner>/<repo>/<ref>/<path>
29
+ */
30
+ export function toRawGitHubUrl(url) {
31
+ const match = url.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/blob\/(.+)$/);
32
+ if (match) {
33
+ const [, owner, repo, rest] = match;
34
+ return `https://raw.githubusercontent.com/${owner}/${repo}/${rest}`;
35
+ }
36
+ return url;
37
+ }
38
+ export async function readFileOrUrl(input) {
39
+ if (input.startsWith("http://")) {
40
+ throw new Error(`Insecure template URL rejected: ${input}\n` +
41
+ "Template URLs must use HTTPS to protect credentials and content integrity.");
42
+ }
43
+ if (isUrl(input)) {
44
+ const resolvedUrl = toRawGitHubUrl(input);
45
+ const response = await fetch(resolvedUrl, {
46
+ headers: { "User-Agent": USER_AGENT },
47
+ signal: AbortSignal.timeout(30_000),
48
+ });
49
+ if (!response.ok) {
50
+ throw new Error(`Failed to fetch ${resolvedUrl}: HTTP ${response.status}`);
51
+ }
52
+ return response.text();
53
+ }
54
+ const resolved = resolvePath(input);
55
+ if (!existsSync(resolved)) {
56
+ throw new Error(`File not found: ${input}`);
57
+ }
58
+ return readFileSync(resolved, "utf-8");
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // --set flag: template property mutation
62
+ // ---------------------------------------------------------------------------
63
+ /** Binding type shorthand prefixes for disambiguation. */
64
+ export const BINDING_TYPE_SHORTHANDS = {
65
+ input: "zeebe:input",
66
+ output: "zeebe:output",
67
+ header: "zeebe:taskHeader",
68
+ property: "zeebe:property",
69
+ taskDefinition: "zeebe:taskDefinition",
70
+ };
71
+ /** Get the user-facing binding name for a template property. */
72
+ export function getBindingName(prop) {
73
+ const b = prop.binding;
74
+ if (!b)
75
+ return null;
76
+ if (b.name !== undefined)
77
+ return b.name;
78
+ if (b.key !== undefined)
79
+ return b.key;
80
+ if (b.property !== undefined)
81
+ return b.property;
82
+ // zeebe:output bindings use `source` as the user-facing identifier
83
+ // (the expression that produces the value). Without this fallback,
84
+ // output bindings are invisible to `--set` and `get-properties`.
85
+ if (b.source !== undefined)
86
+ return b.source;
87
+ return null;
88
+ }
89
+ /** Get the shorthand label for a binding type (e.g. "zeebe:taskHeader" → "header"). */
90
+ export function getBindingTypeShorthand(bindingType) {
91
+ const entry = Object.entries(BINDING_TYPE_SHORTHANDS).find(([, v]) => v === bindingType);
92
+ return entry ? entry[0] : bindingType;
93
+ }
94
+ /** Return only the properties that can be targeted by --set. */
95
+ export function getSettableProperties(properties) {
96
+ return properties.filter((p) => p.type !== "Hidden" && getBindingName(p) !== null);
97
+ }
98
+ /**
99
+ * A property is "required" if either `optional: false` or
100
+ * `constraints.notEmpty: true`. The element-template schema accepts both
101
+ * forms; templates in the wild use them interchangeably.
102
+ */
103
+ export function isPropertyRequired(prop) {
104
+ if (prop.optional === false)
105
+ return true;
106
+ if (prop.constraints?.notEmpty === true)
107
+ return true;
108
+ return false;
109
+ }
110
+ /**
111
+ * Render an element-template `condition` object as a human-readable
112
+ * expression. Handles the common forms (`equals`, `oneOf`, `isActive`)
113
+ * and best-effort handles `allMatch`. Returns null for unrecognised
114
+ * shapes so the caller can fall back to a generic "(conditional)"
115
+ * marker.
116
+ *
117
+ * Examples:
118
+ * { property: "method", equals: "POST" } → 'method = "POST"'
119
+ * { property: "method", oneOf: ["POST","PUT"] } → 'method ∈ {"POST", "PUT"}'
120
+ * { property: "auth", isActive: true } → 'auth is active'
121
+ */
122
+ export function formatCondition(condition) {
123
+ if (!condition)
124
+ return null;
125
+ if (Array.isArray(condition.allMatch)) {
126
+ const parts = condition.allMatch
127
+ .map((c) => formatCondition(c))
128
+ .filter((p) => Boolean(p));
129
+ return parts.length > 0 ? parts.join(" AND ") : null;
130
+ }
131
+ if (!condition.property)
132
+ return null;
133
+ if (Object.hasOwn(condition, "equals")) {
134
+ return `${condition.property} = ${formatConditionValue(condition.equals)}`;
135
+ }
136
+ if (Array.isArray(condition.oneOf)) {
137
+ return `${condition.property} ∈ {${condition.oneOf.map(formatConditionValue).join(", ")}}`;
138
+ }
139
+ if (condition.isActive === true)
140
+ return `${condition.property} is active`;
141
+ if (condition.isActive === false)
142
+ return `${condition.property} is inactive`;
143
+ return null;
144
+ }
145
+ function formatConditionValue(value) {
146
+ return JSON.stringify(value);
147
+ }
148
+ /**
149
+ * Build the structured property descriptor used by both text and JSON
150
+ * output of `get-properties`. Surfaces every field an agent or human
151
+ * needs to pick a value without re-reading the raw template.
152
+ */
153
+ export function getPropertyDetail(prop, groupLabelMap) {
154
+ const bindingName = getBindingName(prop);
155
+ const bindingType = prop.binding?.type;
156
+ const detail = {
157
+ // `id` is the schema's stable identifier — optional in the spec
158
+ // (~37% of OOTB properties don't have one) but the only reliable
159
+ // discriminator for properties that share binding name + type
160
+ // (operation-conditional duplicates).
161
+ id: prop.id,
162
+ name: bindingName,
163
+ type: prop.type,
164
+ label: prop.label,
165
+ description: prop.description,
166
+ // Both `groupId` (raw template id, used by --group filtering) and
167
+ // `group` (user-facing label) are exposed so callers can filter
168
+ // by the stable id without giving up the readable display string.
169
+ groupId: prop.group,
170
+ group: prop.group
171
+ ? (groupLabelMap?.get(prop.group) ?? prop.group)
172
+ : undefined,
173
+ bindingType,
174
+ bindingShorthand: bindingType
175
+ ? getBindingTypeShorthand(bindingType)
176
+ : undefined,
177
+ required: isPropertyRequired(prop),
178
+ feel: prop.feel,
179
+ default: prop.value,
180
+ choices: prop.choices?.map((c) => ({ value: c.value, label: c.name })),
181
+ condition: prop.condition ?? undefined,
182
+ conditionText: formatCondition(prop.condition),
183
+ };
184
+ if (prop.constraints?.pattern) {
185
+ detail.pattern = {
186
+ value: prop.constraints.pattern.value,
187
+ message: prop.constraints.pattern.message,
188
+ };
189
+ }
190
+ return detail;
191
+ }
192
+ /**
193
+ * Compile a shell-style glob to a regex. Only `*` is special — every
194
+ * other character matches literally. Used for `show-properties auth*`
195
+ * style positional matching.
196
+ *
197
+ * "auth*" → /^auth.*$/
198
+ * "url" → /^url$/
199
+ * "a.b.*c" → /^a\.b\..*c$/
200
+ */
201
+ export function globToRegex(pattern) {
202
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
203
+ return new RegExp(`^${escaped.replace(/\*/g, ".*")}$`);
204
+ }
205
+ /**
206
+ * Parse a --set key=value string. If key contains a `:` prefix,
207
+ * resolve the binding type shorthand.
208
+ */
209
+ export function parseSetArg(arg) {
210
+ const eqIndex = arg.indexOf("=");
211
+ if (eqIndex === -1) {
212
+ throw new Error(`Invalid --set format: "${arg}". Expected key=value (e.g. --set method=POST)`);
213
+ }
214
+ const key = arg.slice(0, eqIndex);
215
+ const value = arg.slice(eqIndex + 1);
216
+ const colonIndex = key.indexOf(":");
217
+ if (colonIndex !== -1) {
218
+ const prefix = key.slice(0, colonIndex);
219
+ const name = key.slice(colonIndex + 1);
220
+ const bindingType = BINDING_TYPE_SHORTHANDS[prefix];
221
+ if (!bindingType) {
222
+ const valid = Object.keys(BINDING_TYPE_SHORTHANDS).join(", ");
223
+ throw new Error(`Unknown binding type prefix "${prefix}". Valid prefixes: ${valid}`);
224
+ }
225
+ return { bindingTypeFilter: bindingType, name, value };
226
+ }
227
+ return { bindingTypeFilter: null, name: key, value };
228
+ }
229
+ /**
230
+ * Find every template property matching a binding name, optionally
231
+ * filtered by binding type. Returns a non-empty array — the caller
232
+ * applies the value to ALL matches.
233
+ *
234
+ * Multi-match handling:
235
+ * - Same name + SAME binding type → conditional duplicates (template
236
+ * authors use these to vary defaults/labels per operation while
237
+ * all targeting the same `<zeebe:input target="x">`). Apply the
238
+ * value to all; the engine's condition evaluation drops inactive
239
+ * ones at apply time.
240
+ * - Same name + DIFFERENT binding types → genuine ambiguity (e.g.
241
+ * `correlationKey` as both `zeebe:input` and `zeebe:taskHeader`
242
+ * writes to two different BPMN locations). Throw, ask the user
243
+ * to qualify with `<binding-type>:<name>`.
244
+ */
245
+ export function findPropertiesByBindingName(properties, name, bindingTypeFilter) {
246
+ const settable = getSettableProperties(properties);
247
+ const matches = settable.filter((p) => {
248
+ if (getBindingName(p) !== name)
249
+ return false;
250
+ if (bindingTypeFilter && p.binding?.type !== bindingTypeFilter)
251
+ return false;
252
+ return true;
253
+ });
254
+ if (matches.length === 0) {
255
+ const available = [
256
+ ...new Set(settable.map(getBindingName).filter((n) => Boolean(n))),
257
+ ];
258
+ throw new Error(`Unknown property "${name}". Available properties for --set:\n ${available.join(", ")}`);
259
+ }
260
+ // Multi-match across binding types is genuinely ambiguous — different
261
+ // binding types write to different BPMN locations.
262
+ const types = new Set(matches.map((p) => p.binding?.type));
263
+ if (types.size > 1) {
264
+ const qualified = [...types].map((t) => `${getBindingTypeShorthand(t ?? "")}:${name}`);
265
+ throw new Error(`Ambiguous property "${name}" matches ${matches.length} bindings across ${types.size} binding types. ` +
266
+ `Use a qualified name: ${qualified.join(", ")}`);
267
+ }
268
+ return matches;
269
+ }
270
+ export function validateDropdownValue(prop, name, value) {
271
+ if (!prop.choices)
272
+ return;
273
+ const validValues = prop.choices.map((c) => c.value);
274
+ if (!validValues.includes(value)) {
275
+ throw new Error(`Invalid value "${value}" for "${name}". Valid choices: ${validValues.join(", ")}`);
276
+ }
277
+ }
278
+ /**
279
+ * Apply --set overrides to template properties. Mutates the template
280
+ * in place. When a name matches multiple conditional duplicates, the
281
+ * value is set on all of them — the engine's condition evaluation
282
+ * picks the active one at apply time. Returns the list of binding
283
+ * names that were set (deduped) for the post-apply unmet-condition
284
+ * warning check.
285
+ */
286
+ export function applySetOverrides(properties, setArgs) {
287
+ // Track by object reference so qualified sets like `input:foo=...` and
288
+ // `header:foo=...` preserve their binding type through to warnUnmetConditions.
289
+ const setProperties = new Set();
290
+ for (const arg of setArgs) {
291
+ const { bindingTypeFilter, name, value } = parseSetArg(arg);
292
+ const matches = findPropertiesByBindingName(properties, name, bindingTypeFilter);
293
+ for (const prop of matches) {
294
+ if (prop.choices)
295
+ validateDropdownValue(prop, name, value);
296
+ prop.value = value;
297
+ setProperties.add(prop);
298
+ }
299
+ }
300
+ return [...setProperties];
301
+ }
302
+ /**
303
+ * Check which --set bindings actually made it into the output XML.
304
+ * Warn for any that were dropped (unmet condition).
305
+ */
306
+ export function warnUnmetConditions(logger, resultXml, setProperties) {
307
+ for (const prop of setProperties) {
308
+ if (!prop.binding)
309
+ continue;
310
+ const name = getBindingName(prop);
311
+ if (!name)
312
+ continue;
313
+ const bt = prop.binding.type;
314
+ let present = false;
315
+ if (bt === "zeebe:input")
316
+ present = resultXml.includes(`target="${name}"`);
317
+ else if (bt === "zeebe:taskHeader")
318
+ present = resultXml.includes(`key="${name}"`);
319
+ else if (bt === "zeebe:taskDefinition")
320
+ present = true;
321
+ else
322
+ present = resultXml.includes(name);
323
+ if (!present) {
324
+ logger.warn(`Property "${name}" was set but not applied (unmet condition). Check that controlling properties are also set.`);
325
+ }
326
+ }
327
+ }
328
+ // ---------------------------------------------------------------------------
329
+ // Plugin arg parser — extracts --set, --in-place/-i, and positionals
330
+ // ---------------------------------------------------------------------------
331
+ /**
332
+ * Parse plugin args, separating flags from positionals.
333
+ * - `--set foo=bar` (or `--set=foo=bar`) is repeatable, collected into setArgs[]
334
+ * - `--in-place` / `-i` is a boolean
335
+ * - everything else is a positional
336
+ *
337
+ * `--help` / `-h` is handled by the host before args reach here.
338
+ * Unknown flags return { error: '...' } so the caller can warn and exit.
339
+ */
340
+ export function parseArgs(args) {
341
+ const result = {
342
+ inPlace: false,
343
+ setArgs: [],
344
+ positionals: [],
345
+ error: null,
346
+ };
347
+ for (let i = 0; i < args.length; i++) {
348
+ const arg = args[i];
349
+ if (arg === "--") {
350
+ result.positionals.push(...args.slice(i + 1));
351
+ break;
352
+ }
353
+ if (arg === "--in-place" || arg === "-i") {
354
+ result.inPlace = true;
355
+ continue;
356
+ }
357
+ if (arg === "--set") {
358
+ const next = args[i + 1];
359
+ if (next === undefined) {
360
+ result.error = "--set requires a value (e.g. --set method=POST)";
361
+ return result;
362
+ }
363
+ result.setArgs.push(next);
364
+ i++;
365
+ continue;
366
+ }
367
+ if (arg.startsWith("--set=")) {
368
+ result.setArgs.push(arg.slice("--set=".length));
369
+ continue;
370
+ }
371
+ if (arg.startsWith("-")) {
372
+ result.error = `Unknown flag: ${arg}`;
373
+ return result;
374
+ }
375
+ result.positionals.push(arg);
376
+ }
377
+ return result;
378
+ }
379
+ /**
380
+ * Parse JSON template content with explicit error wrapping. Surfaces
381
+ * "expected an object" instead of letting `unknown.properties` blow up
382
+ * downstream.
383
+ */
384
+ function isTemplate(value) {
385
+ return isRecord(value) && Array.isArray(value.properties);
386
+ }
387
+ export function parseTemplateJson(content) {
388
+ const parsed = JSON.parse(content);
389
+ if (!isRecord(parsed)) {
390
+ throw new Error("Element template must be a JSON object");
391
+ }
392
+ if (!Array.isArray(parsed.properties)) {
393
+ throw new Error("Element template is missing a properties array");
394
+ }
395
+ if (!isTemplate(parsed)) {
396
+ throw new Error("Element template did not match the expected shape");
397
+ }
398
+ // We trust the rest of the shape because the source is either the
399
+ // marketplace (commit-pinned, schema-validated upstream) or a
400
+ // file/URL the user owns. Read-time strict validation would block
401
+ // 90% of the workflow without catching meaningful bugs.
402
+ return parsed;
403
+ }
404
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../default-plugins/element-template/helpers.ts"],"names":[],"mappings":"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"}