@camunda8/cli 3.2.0-alpha.2 → 3.2.0-alpha.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/CONTEXT.md +7 -15
- package/EXAMPLES.md +233 -1
- package/README.md +44 -177
- package/dist/command-dispatch.js +1 -1
- package/dist/command-dispatch.js.map +1 -1
- package/dist/command-registry.d.ts +19 -7
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +47 -7
- package/dist/command-registry.js.map +1 -1
- package/dist/commands/deploy.d.ts +13 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +91 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/{deployments.d.ts → commands/helpers/deploy-helpers.d.ts} +49 -12
- package/dist/commands/helpers/deploy-helpers.d.ts.map +1 -0
- package/dist/{deployments.js → commands/helpers/deploy-helpers.js} +16 -97
- package/dist/commands/helpers/deploy-helpers.js.map +1 -0
- package/dist/commands/identity-authorizations.d.ts +0 -13
- package/dist/commands/identity-authorizations.d.ts.map +1 -1
- package/dist/commands/identity-authorizations.js +1 -1
- package/dist/commands/identity-authorizations.js.map +1 -1
- package/dist/commands/identity.d.ts +1 -21
- package/dist/commands/identity.d.ts.map +1 -1
- package/dist/commands/identity.js +7 -8
- package/dist/commands/identity.js.map +1 -1
- package/dist/commands/profiles.d.ts +0 -32
- package/dist/commands/profiles.d.ts.map +1 -1
- package/dist/commands/profiles.js +5 -36
- package/dist/commands/profiles.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +2 -2
- package/dist/commands/watch.js.map +1 -1
- package/dist/default-plugins/bpmn/c8ctl-plugin.js +7374 -137
- package/dist/default-plugins/bpmn/package.json +8 -1
- package/dist/default-plugins/element-template/c8ctl-plugin.js +10194 -248
- package/dist/default-plugins/element-template/package.json +11 -1
- package/dist/default-plugins/feel/c8ctl-plugin.js +14030 -584
- package/dist/default-plugins/feel/package.json +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -9
- package/dist/index.js.map +1 -1
- package/dist/resource-extensions.d.ts.map +1 -0
- package/dist/resource-extensions.js.map +1 -0
- package/dist/vendor/bpmnlint.cjs +25907 -0
- package/package.json +11 -13
- package/dist/commands/resource-extensions.d.ts.map +0 -1
- package/dist/commands/resource-extensions.js.map +0 -1
- package/dist/default-plugins/bpmn/c8ctl-plugin.js.map +0 -1
- package/dist/default-plugins/bpmn/format.js +0 -64
- package/dist/default-plugins/bpmn/format.js.map +0 -1
- package/dist/default-plugins/bpmn/lint.js +0 -323
- package/dist/default-plugins/bpmn/lint.js.map +0 -1
- package/dist/default-plugins/element-template/c8ctl-plugin.js.map +0 -1
- package/dist/default-plugins/element-template/commands/apply.js +0 -337
- package/dist/default-plugins/element-template/commands/apply.js.map +0 -1
- package/dist/default-plugins/element-template/commands/get-properties.js +0 -350
- package/dist/default-plugins/element-template/commands/get-properties.js.map +0 -1
- package/dist/default-plugins/element-template/commands/get.js +0 -107
- package/dist/default-plugins/element-template/commands/get.js.map +0 -1
- package/dist/default-plugins/element-template/commands/info.js +0 -196
- package/dist/default-plugins/element-template/commands/info.js.map +0 -1
- package/dist/default-plugins/element-template/commands/search.js +0 -106
- package/dist/default-plugins/element-template/commands/search.js.map +0 -1
- package/dist/default-plugins/element-template/commands/sync.js +0 -36
- package/dist/default-plugins/element-template/commands/sync.js.map +0 -1
- package/dist/default-plugins/element-template/helpers.js +0 -515
- package/dist/default-plugins/element-template/helpers.js.map +0 -1
- package/dist/default-plugins/element-template/marketplace.js +0 -597
- package/dist/default-plugins/element-template/marketplace.js.map +0 -1
- package/dist/default-plugins/element-template/template-ref.js +0 -243
- package/dist/default-plugins/element-template/template-ref.js.map +0 -1
- package/dist/default-plugins/feel/c8ctl-plugin.js.map +0 -1
- package/dist/default-plugins/hello-world/README.md +0 -161
- package/dist/default-plugins/hello-world/c8ctl-plugin.js +0 -69
- package/dist/default-plugins/hello-world/package.json +0 -8
- package/dist/deployments.d.ts.map +0 -1
- package/dist/deployments.js.map +0 -1
- /package/dist/{commands/resource-extensions.d.ts → resource-extensions.d.ts} +0 -0
- /package/dist/{commands/resource-extensions.js → resource-extensions.js} +0 -0
|
@@ -1,597 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Marketplace OOTB element-template index.
|
|
3
|
-
*
|
|
4
|
-
* Source: GET https://marketplace.cloud.camunda.io/api/v1/ootb-connectors
|
|
5
|
-
* → { [id]: [{ version, ref, engine: { camunda: "^8.x" } }, ...] }
|
|
6
|
-
*
|
|
7
|
-
* Each `ref` is a commit-pinned raw.githubusercontent.com URL → immutable.
|
|
8
|
-
* We download every ref once, inline the templates into a single
|
|
9
|
-
* `templates.json` cache file, and inject `metadata.upstreamRef = <ref>` so
|
|
10
|
-
* subsequent syncs can skip already-cached entries (matches Modeler's
|
|
11
|
-
* approach in `app/lib/template-updater/util.js`).
|
|
12
|
-
*/
|
|
13
|
-
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, writeSync, } from "node:fs";
|
|
14
|
-
import { join } from "node:path";
|
|
15
|
-
import semver from "semver";
|
|
16
|
-
import { isRecord, USER_AGENT } from "./helpers.js";
|
|
17
|
-
const DEFAULT_OOTB_URL = "https://marketplace.cloud.camunda.io/api/v1/ootb-connectors";
|
|
18
|
-
const FETCH_CONCURRENCY = 12;
|
|
19
|
-
const STALE_AFTER_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
20
|
-
const FETCH_TIMEOUT_MS = 30_000; // 30 s per HTTP request
|
|
21
|
-
// Backstop for ghost locks left by PID-recycled crashed syncs. Kept
|
|
22
|
-
// well above realistic sync runtimes so a live but slow sync's lock
|
|
23
|
-
// is never reclaimed.
|
|
24
|
-
const SYNC_LOCK_STALE_AFTER_MS = 60 * 60 * 1000; // 60 minutes
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
26
|
-
// Paths
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
export function getMarketplaceUrl() {
|
|
29
|
-
return process.env.C8CTL_OOTB_ELEMENT_TEMPLATES_URL || DEFAULT_OOTB_URL;
|
|
30
|
-
}
|
|
31
|
-
export function getCacheDir() {
|
|
32
|
-
if (!globalThis.c8ctl?.getUserDataDir) {
|
|
33
|
-
throw new Error("c8ctl runtime is not available; cannot resolve element-template cache dir.");
|
|
34
|
-
}
|
|
35
|
-
return join(globalThis.c8ctl.getUserDataDir(), "element-templates");
|
|
36
|
-
}
|
|
37
|
-
function getCachePath() {
|
|
38
|
-
return join(getCacheDir(), "templates.json");
|
|
39
|
-
}
|
|
40
|
-
function getFetchedAtPath() {
|
|
41
|
-
return join(getCacheDir(), "fetched-at");
|
|
42
|
-
}
|
|
43
|
-
function getSyncLockPath() {
|
|
44
|
-
return join(getCacheDir(), ".sync.lock");
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Read `error.code` if the thrown value carries one. Errors from the
|
|
48
|
-
* `node:fs` and `node:process` APIs all set `code` to a `string`; this
|
|
49
|
-
* narrows safely without an `as NodeJS.ErrnoException` cast.
|
|
50
|
-
*/
|
|
51
|
-
function getErrorCode(error) {
|
|
52
|
-
if (isRecord(error) && typeof error.code === "string") {
|
|
53
|
-
return error.code;
|
|
54
|
-
}
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
function isProcessAlive(pid) {
|
|
58
|
-
try {
|
|
59
|
-
// Signal 0 doesn't deliver a signal — it just tests permission /
|
|
60
|
-
// existence. ESRCH means the PID is gone.
|
|
61
|
-
process.kill(pid, 0);
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
// EPERM means the process exists but we lack permission — still alive.
|
|
66
|
-
return getErrorCode(error) === "EPERM";
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function readLockPayload(path) {
|
|
70
|
-
try {
|
|
71
|
-
const raw = readFileSync(path, "utf-8");
|
|
72
|
-
const parsed = JSON.parse(raw);
|
|
73
|
-
if (isRecord(parsed) &&
|
|
74
|
-
typeof parsed.pid === "number" &&
|
|
75
|
-
typeof parsed.startedAt === "number") {
|
|
76
|
-
return { pid: parsed.pid, startedAt: parsed.startedAt };
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Unreadable / unparsable lock counts as stale.
|
|
81
|
-
}
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
function tryCreateLock(path, payload) {
|
|
85
|
-
try {
|
|
86
|
-
const fd = openSync(path, "wx", 0o644);
|
|
87
|
-
try {
|
|
88
|
-
writeSync(fd, JSON.stringify(payload));
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
closeSync(fd);
|
|
92
|
-
}
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
if (getErrorCode(error) === "EEXIST") {
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
throw error;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Acquire the sync lock or throw with a user-actionable message.
|
|
104
|
-
*
|
|
105
|
-
* The lock is a regular file at `<cacheDir>/.sync.lock` holding
|
|
106
|
-
* `{pid, startedAt}` JSON. We use `openSync("wx")` for atomic create —
|
|
107
|
-
* two concurrent attempts cannot both win on the same filesystem.
|
|
108
|
-
*
|
|
109
|
-
* If an existing lock is from a dead PID or older than
|
|
110
|
-
* `SYNC_LOCK_STALE_AFTER_MS`, we treat it as stale, log, and retry
|
|
111
|
-
* the create once. A persistent EEXIST after that is a real race with
|
|
112
|
-
* another live sync — surface it.
|
|
113
|
-
*/
|
|
114
|
-
function acquireSyncLock(logger) {
|
|
115
|
-
const dir = getCacheDir();
|
|
116
|
-
mkdirSync(dir, { recursive: true });
|
|
117
|
-
const path = getSyncLockPath();
|
|
118
|
-
const payload = {
|
|
119
|
-
pid: process.pid,
|
|
120
|
-
startedAt: Date.now(),
|
|
121
|
-
};
|
|
122
|
-
if (tryCreateLock(path, payload)) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
const existing = readLockPayload(path);
|
|
126
|
-
const age = existing ? Date.now() - existing.startedAt : Infinity;
|
|
127
|
-
const stale = existing === null ||
|
|
128
|
-
!isProcessAlive(existing.pid) ||
|
|
129
|
-
age > SYNC_LOCK_STALE_AFTER_MS;
|
|
130
|
-
if (stale) {
|
|
131
|
-
if (existing) {
|
|
132
|
-
logger.warn(`Removed stale sync lock from pid ${existing.pid} (age ${Math.round(age / 1000)}s).`);
|
|
133
|
-
}
|
|
134
|
-
try {
|
|
135
|
-
unlinkSync(path);
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
// Someone else may have just cleaned it up — fine, we'll retry below.
|
|
139
|
-
}
|
|
140
|
-
if (tryCreateLock(path, payload)) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
const detail = existing
|
|
145
|
-
? `pid ${existing.pid}, started ${new Date(existing.startedAt).toISOString()}`
|
|
146
|
-
: "unknown owner";
|
|
147
|
-
throw new Error(`Another sync is in progress (${detail}). ` +
|
|
148
|
-
`Wait for it to finish or remove ${path} if you're sure no other sync is running.`);
|
|
149
|
-
}
|
|
150
|
-
function releaseSyncLock() {
|
|
151
|
-
try {
|
|
152
|
-
unlinkSync(getSyncLockPath());
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
// Best-effort — the lock may already be gone if a signal handler
|
|
156
|
-
// raced with the normal `finally`.
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Run `body` while the sync lock is held. Installs signal handlers
|
|
161
|
-
* so the lock is released on SIGINT/SIGTERM (otherwise a Ctrl-C
|
|
162
|
-
* during sync would orphan the lockfile, leaving the next run to
|
|
163
|
-
* wait the stale window). Only the lock-release handlers we add are
|
|
164
|
-
* removed in `finally`; any pre-existing listeners are left untouched.
|
|
165
|
-
*/
|
|
166
|
-
async function withSyncLock(logger, body) {
|
|
167
|
-
acquireSyncLock(logger);
|
|
168
|
-
const signals = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
169
|
-
const handlers = new Map();
|
|
170
|
-
for (const sig of signals) {
|
|
171
|
-
const handler = () => {
|
|
172
|
-
releaseSyncLock();
|
|
173
|
-
// Re-raise the signal with the default action so the process
|
|
174
|
-
// actually exits with the expected status. Remove our listener
|
|
175
|
-
// first so we don't recurse.
|
|
176
|
-
process.removeListener(sig, handler);
|
|
177
|
-
process.kill(process.pid, sig);
|
|
178
|
-
};
|
|
179
|
-
handlers.set(sig, handler);
|
|
180
|
-
process.on(sig, handler);
|
|
181
|
-
}
|
|
182
|
-
try {
|
|
183
|
-
return await body();
|
|
184
|
-
}
|
|
185
|
-
finally {
|
|
186
|
-
for (const [sig, handler] of handlers) {
|
|
187
|
-
process.removeListener(sig, handler);
|
|
188
|
-
}
|
|
189
|
-
releaseSyncLock();
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// ---------------------------------------------------------------------------
|
|
193
|
-
// Cache I/O
|
|
194
|
-
// ---------------------------------------------------------------------------
|
|
195
|
-
function isTemplateArray(value) {
|
|
196
|
-
return (Array.isArray(value) &&
|
|
197
|
-
value.every((item) => isRecord(item) && Array.isArray(item.properties)));
|
|
198
|
-
}
|
|
199
|
-
export function loadCache() {
|
|
200
|
-
const path = getCachePath();
|
|
201
|
-
if (!existsSync(path))
|
|
202
|
-
return null;
|
|
203
|
-
let parsed;
|
|
204
|
-
try {
|
|
205
|
-
parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
206
|
-
}
|
|
207
|
-
catch (error) {
|
|
208
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
209
|
-
throw new Error(`Element template cache is corrupt at ${path}: ${message}`);
|
|
210
|
-
}
|
|
211
|
-
if (!Array.isArray(parsed)) {
|
|
212
|
-
throw new Error(`Element template cache is corrupt at ${path}: expected an array`);
|
|
213
|
-
}
|
|
214
|
-
if (!isTemplateArray(parsed)) {
|
|
215
|
-
throw new Error(`Element template cache is corrupt at ${path}: entries must be template objects with a properties array`);
|
|
216
|
-
}
|
|
217
|
-
return parsed;
|
|
218
|
-
}
|
|
219
|
-
function loadFetchedAt() {
|
|
220
|
-
const path = getFetchedAtPath();
|
|
221
|
-
if (!existsSync(path))
|
|
222
|
-
return null;
|
|
223
|
-
const value = readFileSync(path, "utf-8").trim();
|
|
224
|
-
const ms = Number(value);
|
|
225
|
-
return Number.isFinite(ms) ? ms : null;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Write `contents` to `target` via a sibling temp file + atomic
|
|
229
|
-
* `renameSync`. Readers either see the old file or the new file —
|
|
230
|
-
* never a truncated mid-write state. POSIX `rename` is atomic on the
|
|
231
|
-
* same filesystem (which a sibling in the same directory always is).
|
|
232
|
-
*/
|
|
233
|
-
function atomicWriteFileSync(target, contents) {
|
|
234
|
-
const tmp = `${target}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
235
|
-
try {
|
|
236
|
-
writeFileSync(tmp, contents, "utf-8");
|
|
237
|
-
renameSync(tmp, target);
|
|
238
|
-
}
|
|
239
|
-
catch (error) {
|
|
240
|
-
try {
|
|
241
|
-
unlinkSync(tmp);
|
|
242
|
-
}
|
|
243
|
-
catch {
|
|
244
|
-
// Best-effort cleanup — the original error is the one that matters.
|
|
245
|
-
}
|
|
246
|
-
throw error;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
function saveCache(templates) {
|
|
250
|
-
const dir = getCacheDir();
|
|
251
|
-
mkdirSync(dir, { recursive: true });
|
|
252
|
-
atomicWriteFileSync(getCachePath(), `${JSON.stringify(templates, null, 2)}\n`);
|
|
253
|
-
atomicWriteFileSync(getFetchedAtPath(), String(Date.now()));
|
|
254
|
-
}
|
|
255
|
-
export function isCacheStale() {
|
|
256
|
-
const fetchedAt = loadFetchedAt();
|
|
257
|
-
if (fetchedAt === null)
|
|
258
|
-
return true;
|
|
259
|
-
return Date.now() - fetchedAt > STALE_AFTER_MS;
|
|
260
|
-
}
|
|
261
|
-
export function getCacheAgeDays() {
|
|
262
|
-
const fetchedAt = loadFetchedAt();
|
|
263
|
-
if (fetchedAt === null)
|
|
264
|
-
return null;
|
|
265
|
-
return Math.floor((Date.now() - fetchedAt) / (24 * 60 * 60 * 1000));
|
|
266
|
-
}
|
|
267
|
-
export function nudgeIfStale(logger) {
|
|
268
|
-
if (!existsSync(getCachePath()))
|
|
269
|
-
return;
|
|
270
|
-
if (!isCacheStale())
|
|
271
|
-
return;
|
|
272
|
-
const days = getCacheAgeDays();
|
|
273
|
-
const ageText = days === null ? "stale" : `${days} day${days === 1 ? "" : "s"} old`;
|
|
274
|
-
logger.warn(`Element template cache is ${ageText}. ` +
|
|
275
|
-
"Run 'c8ctl element-template sync' to refresh.");
|
|
276
|
-
}
|
|
277
|
-
// ---------------------------------------------------------------------------
|
|
278
|
-
// HTTP
|
|
279
|
-
// ---------------------------------------------------------------------------
|
|
280
|
-
async function fetchJson(url) {
|
|
281
|
-
const response = await fetch(url, {
|
|
282
|
-
headers: { "User-Agent": USER_AGENT },
|
|
283
|
-
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
284
|
-
});
|
|
285
|
-
if (!response.ok) {
|
|
286
|
-
throw new Error(`HTTP ${response.status} ${response.statusText} for ${url}`);
|
|
287
|
-
}
|
|
288
|
-
return response.json();
|
|
289
|
-
}
|
|
290
|
-
async function fetchIndex() {
|
|
291
|
-
const raw = await fetchJson(getMarketplaceUrl());
|
|
292
|
-
if (!isRecord(raw)) {
|
|
293
|
-
throw new Error("Marketplace index is not a JSON object");
|
|
294
|
-
}
|
|
295
|
-
// Trust the upstream shape — schema-validated at the marketplace.
|
|
296
|
-
const result = {};
|
|
297
|
-
for (const [id, value] of Object.entries(raw)) {
|
|
298
|
-
if (!Array.isArray(value))
|
|
299
|
-
continue;
|
|
300
|
-
const entries = [];
|
|
301
|
-
for (const entry of value) {
|
|
302
|
-
if (!isRecord(entry))
|
|
303
|
-
continue;
|
|
304
|
-
entries.push({
|
|
305
|
-
version: typeof entry.version === "number" ? entry.version : undefined,
|
|
306
|
-
ref: typeof entry.ref === "string" ? entry.ref : undefined,
|
|
307
|
-
engine: isRecord(entry.engine)
|
|
308
|
-
? {
|
|
309
|
-
camunda: typeof entry.engine.camunda === "string"
|
|
310
|
-
? entry.engine.camunda
|
|
311
|
-
: undefined,
|
|
312
|
-
}
|
|
313
|
-
: undefined,
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
result[id] = entries;
|
|
317
|
-
}
|
|
318
|
-
return result;
|
|
319
|
-
}
|
|
320
|
-
function isTemplateLike(value) {
|
|
321
|
-
return isRecord(value) && Array.isArray(value.properties);
|
|
322
|
-
}
|
|
323
|
-
async function fetchTemplate(url) {
|
|
324
|
-
const raw = await fetchJson(url);
|
|
325
|
-
if (!isTemplateLike(raw)) {
|
|
326
|
-
throw new Error(`Fetched template at ${url} did not match expected shape`);
|
|
327
|
-
}
|
|
328
|
-
return raw;
|
|
329
|
-
}
|
|
330
|
-
// ---------------------------------------------------------------------------
|
|
331
|
-
// Sync
|
|
332
|
-
// ---------------------------------------------------------------------------
|
|
333
|
-
/**
|
|
334
|
-
* Run `fn` over `items` with at most `concurrency` in flight.
|
|
335
|
-
* Each fn() must handle its own errors — exceptions abort the pool.
|
|
336
|
-
*/
|
|
337
|
-
async function pool(items, concurrency, fn) {
|
|
338
|
-
const queue = items.slice();
|
|
339
|
-
const workers = Array.from({ length: Math.min(concurrency, queue.length) }, async () => {
|
|
340
|
-
while (queue.length > 0) {
|
|
341
|
-
const item = queue.shift();
|
|
342
|
-
if (item === undefined)
|
|
343
|
-
break;
|
|
344
|
-
await fn(item);
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
await Promise.all(workers);
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Flatten the marketplace index `{ id: [{version, ref, engine}] }` into a flat
|
|
351
|
-
* list of `{ id, version, ref, engine }` entries, dropping legacy entries with
|
|
352
|
-
* no `version`.
|
|
353
|
-
*/
|
|
354
|
-
function flattenIndex(index) {
|
|
355
|
-
const entries = [];
|
|
356
|
-
for (const [id, versions] of Object.entries(index)) {
|
|
357
|
-
for (const entry of versions) {
|
|
358
|
-
if (entry.version === undefined || entry.ref === undefined)
|
|
359
|
-
continue;
|
|
360
|
-
entries.push({
|
|
361
|
-
id,
|
|
362
|
-
version: entry.version,
|
|
363
|
-
ref: entry.ref,
|
|
364
|
-
engine: entry.engine,
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return entries;
|
|
369
|
-
}
|
|
370
|
-
/**
|
|
371
|
-
* Sync the cache with the marketplace.
|
|
372
|
-
*
|
|
373
|
-
* - Always re-fetches the index.
|
|
374
|
-
* - Fetches refs that aren't already cached (matches by `metadata.upstreamRef`).
|
|
375
|
-
* - With `prune: true`, drops cached entries whose `upstreamRef` is no longer
|
|
376
|
-
* in the fresh index.
|
|
377
|
-
*
|
|
378
|
-
* Per-template fetch failures are logged + counted but do not abort the run.
|
|
379
|
-
*
|
|
380
|
-
* Returns a summary `{ total, fetched, cached, errors, pruned }`.
|
|
381
|
-
*/
|
|
382
|
-
export async function syncTemplates({ logger, prune = false, }) {
|
|
383
|
-
return withSyncLock(logger, () => syncTemplatesLocked({ logger, prune }));
|
|
384
|
-
}
|
|
385
|
-
async function syncTemplatesLocked({ logger, prune, }) {
|
|
386
|
-
logger.info(`Fetching index from ${getMarketplaceUrl()} ...`);
|
|
387
|
-
const index = await fetchIndex();
|
|
388
|
-
const entries = flattenIndex(index);
|
|
389
|
-
logger.info(`Index has ${entries.length} template versions across ${Object.keys(index).length} connectors.`);
|
|
390
|
-
let existing;
|
|
391
|
-
try {
|
|
392
|
-
existing = loadCache() || [];
|
|
393
|
-
}
|
|
394
|
-
catch (error) {
|
|
395
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
396
|
-
logger.warn(`Corrupt cache — starting fresh: ${message}`);
|
|
397
|
-
existing = [];
|
|
398
|
-
}
|
|
399
|
-
const byUpstreamRef = new Map();
|
|
400
|
-
for (const tpl of existing) {
|
|
401
|
-
const ref = tpl.metadata?.upstreamRef;
|
|
402
|
-
if (ref)
|
|
403
|
-
byUpstreamRef.set(ref, tpl);
|
|
404
|
-
}
|
|
405
|
-
const freshRefs = new Set(entries.map((e) => e.ref));
|
|
406
|
-
const toFetch = entries.filter((e) => !byUpstreamRef.has(e.ref));
|
|
407
|
-
logger.info(`${byUpstreamRef.size > 0
|
|
408
|
-
? `Reusing ${entries.length - toFetch.length} cached, `
|
|
409
|
-
: ""}fetching ${toFetch.length} new...`);
|
|
410
|
-
let fetched = 0;
|
|
411
|
-
let errors = 0;
|
|
412
|
-
let progress = 0;
|
|
413
|
-
const fetchedTemplates = [];
|
|
414
|
-
await pool(toFetch, FETCH_CONCURRENCY, async (entry) => {
|
|
415
|
-
progress += 1;
|
|
416
|
-
const myProgress = progress;
|
|
417
|
-
const label = `${entry.id}@${entry.version}`;
|
|
418
|
-
try {
|
|
419
|
-
const template = await fetchTemplate(entry.ref);
|
|
420
|
-
template.metadata = template.metadata || {};
|
|
421
|
-
template.metadata.upstreamRef = entry.ref;
|
|
422
|
-
fetchedTemplates.push(template);
|
|
423
|
-
fetched += 1;
|
|
424
|
-
logger.info(` [${myProgress}/${toFetch.length}] ${label}`);
|
|
425
|
-
}
|
|
426
|
-
catch (error) {
|
|
427
|
-
errors += 1;
|
|
428
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
429
|
-
logger.warn(` [${myProgress}/${toFetch.length}] ${label} — ${message}`);
|
|
430
|
-
}
|
|
431
|
-
});
|
|
432
|
-
// Build the new cache: keep cached entries that are still in the index,
|
|
433
|
-
// plus everything we just fetched. Sort fetched entries by id+version so
|
|
434
|
-
// cache order (and therefore search result order) is deterministic
|
|
435
|
-
// regardless of network timing.
|
|
436
|
-
fetchedTemplates.sort((a, b) => {
|
|
437
|
-
const idCmp = (a.id ?? "").localeCompare(b.id ?? "");
|
|
438
|
-
if (idCmp !== 0)
|
|
439
|
-
return idCmp;
|
|
440
|
-
return (a.version ?? 0) - (b.version ?? 0);
|
|
441
|
-
});
|
|
442
|
-
const next = [];
|
|
443
|
-
for (const tpl of existing) {
|
|
444
|
-
const ref = tpl.metadata?.upstreamRef;
|
|
445
|
-
if (ref && freshRefs.has(ref)) {
|
|
446
|
-
next.push(tpl);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
next.push(...fetchedTemplates);
|
|
450
|
-
// `pruned` = cached entries whose upstreamRef no longer appears in the
|
|
451
|
-
// fresh index (or that never had one). The "without --prune" branch
|
|
452
|
-
// below preserves these entries; with --prune we drop them, and the
|
|
453
|
-
// summary line reports that count to the user.
|
|
454
|
-
let pruned = 0;
|
|
455
|
-
if (prune) {
|
|
456
|
-
pruned = existing.filter((t) => {
|
|
457
|
-
const ref = t.metadata?.upstreamRef;
|
|
458
|
-
return ref === undefined || !freshRefs.has(ref);
|
|
459
|
-
}).length;
|
|
460
|
-
}
|
|
461
|
-
// Without --prune, keep templates whose upstreamRef vanished from the index
|
|
462
|
-
// (e.g. user wants to retain an older version that was removed upstream).
|
|
463
|
-
if (!prune) {
|
|
464
|
-
for (const tpl of existing) {
|
|
465
|
-
const ref = tpl.metadata?.upstreamRef;
|
|
466
|
-
if (ref && !freshRefs.has(ref) && !next.includes(tpl)) {
|
|
467
|
-
next.push(tpl);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
saveCache(next);
|
|
472
|
-
const summary = {
|
|
473
|
-
total: next.length,
|
|
474
|
-
fetched,
|
|
475
|
-
cached: entries.length - toFetch.length,
|
|
476
|
-
errors,
|
|
477
|
-
pruned,
|
|
478
|
-
};
|
|
479
|
-
logger.info(`Sync complete: ${summary.fetched} fetched, ${summary.cached} cached` +
|
|
480
|
-
`${summary.errors > 0 ? `, ${summary.errors} errors` : ""}` +
|
|
481
|
-
`${prune ? `, ${summary.pruned} pruned` : ""}.`);
|
|
482
|
-
return summary;
|
|
483
|
-
}
|
|
484
|
-
/**
|
|
485
|
-
* Sentinel error message used by all subcommands that need the cache
|
|
486
|
-
* present. Phrased as a directive so callers don't have to invent
|
|
487
|
-
* their own copy.
|
|
488
|
-
*/
|
|
489
|
-
export const CACHE_NOT_FOUND_MESSAGE = "Element template cache not found. Run 'c8ctl element-template sync' to download it first.";
|
|
490
|
-
/**
|
|
491
|
-
* Throw a uniform error when the cache is missing. We deliberately do
|
|
492
|
-
* NOT auto-bootstrap — bootstrap progress goes to stdout via
|
|
493
|
-
* `logger.info`, which would corrupt any pipe the caller has set up
|
|
494
|
-
* (apply | bpmn lint, get > template.json, ...). Sync is one explicit
|
|
495
|
-
* command and the error tells the user to run it.
|
|
496
|
-
*/
|
|
497
|
-
export function requireCachePresent() {
|
|
498
|
-
if (existsSync(getCachePath())) {
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
throw new Error(CACHE_NOT_FOUND_MESSAGE);
|
|
502
|
-
}
|
|
503
|
-
// ---------------------------------------------------------------------------
|
|
504
|
-
// Lookup & search
|
|
505
|
-
// ---------------------------------------------------------------------------
|
|
506
|
-
/**
|
|
507
|
-
* Return all cached templates matching `id`. Empty if none.
|
|
508
|
-
*/
|
|
509
|
-
export function findById(id) {
|
|
510
|
-
const cache = loadCache();
|
|
511
|
-
if (!cache)
|
|
512
|
-
return [];
|
|
513
|
-
return cache.filter((t) => t.id === id);
|
|
514
|
-
}
|
|
515
|
-
/**
|
|
516
|
-
* Pick the template version best matching the BPMN's executionPlatformVersion.
|
|
517
|
-
*
|
|
518
|
-
* - If `version` is given: exact `version` match required.
|
|
519
|
-
* - If `executionPlatformVersion` is given: highest `version` whose
|
|
520
|
-
* `engines.camunda` is satisfied by `coerce(executionPlatformVersion)`.
|
|
521
|
-
* Templates without `engines.camunda` are treated as compatible with any
|
|
522
|
-
* version (legacy fallback).
|
|
523
|
-
* - Otherwise: highest `version`.
|
|
524
|
-
*
|
|
525
|
-
* Returns `null` if no candidate matches.
|
|
526
|
-
*/
|
|
527
|
-
export function pickVersion(templates, { version, executionPlatformVersion } = {}) {
|
|
528
|
-
if (templates.length === 0)
|
|
529
|
-
return null;
|
|
530
|
-
if (version !== undefined) {
|
|
531
|
-
const exact = templates.find((t) => Number(t.version) === Number(version));
|
|
532
|
-
return exact || null;
|
|
533
|
-
}
|
|
534
|
-
let candidates = templates.filter((t) => t.version !== undefined);
|
|
535
|
-
if (executionPlatformVersion) {
|
|
536
|
-
const coerced = semver.coerce(executionPlatformVersion);
|
|
537
|
-
if (coerced) {
|
|
538
|
-
candidates = candidates.filter((t) => {
|
|
539
|
-
const constraint = t.engines?.camunda;
|
|
540
|
-
if (!constraint)
|
|
541
|
-
return true;
|
|
542
|
-
return semver.satisfies(coerced, constraint);
|
|
543
|
-
});
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
if (candidates.length === 0)
|
|
547
|
-
return null;
|
|
548
|
-
return candidates.reduce((best, cur) => Number(cur.version) > Number(best.version) ? cur : best);
|
|
549
|
-
}
|
|
550
|
-
/**
|
|
551
|
-
* Substring search on name + description + keywords (case-insensitive).
|
|
552
|
-
* Mirrors Modeler's discovery path. Deprecated versions are excluded
|
|
553
|
-
* before the per-id latest-version reduction so that if the newest
|
|
554
|
-
* version of a connector is deprecated, the latest non-deprecated
|
|
555
|
-
* version is still discoverable.
|
|
556
|
-
*/
|
|
557
|
-
export function searchTemplates(query, { executionPlatformVersion } = {}) {
|
|
558
|
-
const cache = loadCache() || [];
|
|
559
|
-
const q = query.toLowerCase();
|
|
560
|
-
let matches = cache
|
|
561
|
-
.filter((t) => {
|
|
562
|
-
const name = (t.name || "").toLowerCase();
|
|
563
|
-
const description = (t.description || "").toLowerCase();
|
|
564
|
-
const id = (t.id || "").toLowerCase();
|
|
565
|
-
const keywords = (t.keywords ?? []).map((k) => k.toLowerCase()).join(" ");
|
|
566
|
-
return (name.includes(q) ||
|
|
567
|
-
description.includes(q) ||
|
|
568
|
-
id.includes(q) ||
|
|
569
|
-
keywords.includes(q));
|
|
570
|
-
})
|
|
571
|
-
// Filter deprecated before per-id reduction so the latest
|
|
572
|
-
// non-deprecated version surfaces when the newest is deprecated.
|
|
573
|
-
.filter((t) => !t.deprecated);
|
|
574
|
-
if (executionPlatformVersion) {
|
|
575
|
-
const coerced = semver.coerce(executionPlatformVersion);
|
|
576
|
-
if (coerced) {
|
|
577
|
-
matches = matches.filter((t) => {
|
|
578
|
-
const constraint = t.engines?.camunda;
|
|
579
|
-
if (!constraint)
|
|
580
|
-
return true;
|
|
581
|
-
return semver.satisfies(coerced, constraint);
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
// Reduce to the latest version per id.
|
|
586
|
-
const byId = new Map();
|
|
587
|
-
for (const t of matches) {
|
|
588
|
-
if (t.id === undefined)
|
|
589
|
-
continue;
|
|
590
|
-
const existing = byId.get(t.id);
|
|
591
|
-
if (!existing || Number(t.version || 0) > Number(existing.version || 0)) {
|
|
592
|
-
byId.set(t.id, t);
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
return [...byId.values()];
|
|
596
|
-
}
|
|
597
|
-
//# sourceMappingURL=marketplace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../../default-plugins/element-template/marketplace.ts"],"names":[],"mappings":"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"}
|