@interopio/iocd-cli 1.1.2 → 2.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.
- package/README.md +9 -0
- package/assets/mac-build/entitlements.mac.plist +3 -0
- package/changelog.md +31 -0
- package/dist/assets/mac-build/entitlements.mac.plist +3 -0
- package/dist/cli.js +17 -12
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.command.js +3 -2
- package/dist/commands/build.command.js.map +1 -1
- package/dist/commands/doctor.command.js +37 -0
- package/dist/commands/doctor.command.js.map +1 -0
- package/dist/commands/index.js +3 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/schemas/iocd.cli.config.schema.json +54 -1
- package/dist/services/components/components.service.js +2 -1
- package/dist/services/components/components.service.js.map +1 -1
- package/dist/services/config/config.validator.js +2 -0
- package/dist/services/config/config.validator.js.map +1 -1
- package/dist/services/config/entitlements.validator.js +89 -0
- package/dist/services/config/entitlements.validator.js.map +1 -0
- package/dist/services/doctor.service.js +311 -0
- package/dist/services/doctor.service.js.map +1 -0
- package/dist/services/installer/electronForge.js +26 -38
- package/dist/services/installer/electronForge.js.map +1 -1
- package/dist/services/installer/entitlements.service.js +73 -0
- package/dist/services/installer/entitlements.service.js.map +1 -0
- package/dist/services/installer/macOS.helper.js +40 -29
- package/dist/services/installer/macOS.helper.js.map +1 -1
- package/dist/services/installer/zip-maker.js +1 -2
- package/dist/services/installer/zip-maker.js.map +1 -1
- package/dist/templates/ioconnect-desktop/README.md +9 -0
- package/dist/templates/ioconnect-desktop/config/forge.config.js +0 -12
- package/dist/templates/ioconnect-desktop/package.json +7 -7
- package/dist/templates/tests/.agents/skills/iocd-wdio-testing/SKILL.md +0 -1
- package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/authoring.md +25 -8
- package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/configuration.md +35 -12
- package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/models.md +24 -31
- package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/setup.md +16 -3
- package/dist/templates/tests/tests/.gitignore.template +1 -0
- package/dist/templates/tests/tests/README.md +4 -2
- package/dist/templates/tests/tests/tests/common/iocd.ts +60 -40
- package/dist/templates/tests/tests/tests/shared-contexts.spec.ts +22 -17
- package/dist/utils/error.handler.js +10 -4
- package/dist/utils/error.handler.js.map +1 -1
- package/dist/utils/release-metadata.js +88 -0
- package/dist/utils/release-metadata.js.map +1 -0
- package/dist/utils/version-check.js +14 -51
- package/dist/utils/version-check.js.map +1 -1
- package/package.json +40 -7
- package/scripts/generate-schema.js +4 -0
|
@@ -25,16 +25,20 @@ export function createCleanupRegistry() {
|
|
|
25
25
|
async run(): Promise<void> {
|
|
26
26
|
const pending = cleanups.splice(0).reverse();
|
|
27
27
|
let firstError: unknown;
|
|
28
|
+
let failed = false;
|
|
28
29
|
|
|
29
30
|
for (const cleanup of pending) {
|
|
30
31
|
try {
|
|
31
32
|
await cleanup();
|
|
32
33
|
} catch (error) {
|
|
33
|
-
|
|
34
|
+
if (!failed) {
|
|
35
|
+
firstError = error;
|
|
36
|
+
failed = true;
|
|
37
|
+
}
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
|
|
37
|
-
if (
|
|
41
|
+
if (failed) {
|
|
38
42
|
throw firstError;
|
|
39
43
|
}
|
|
40
44
|
},
|
|
@@ -59,67 +63,83 @@ export async function waitForEvent<T>(
|
|
|
59
63
|
|
|
60
64
|
let resolveResult!: (value: T) => void;
|
|
61
65
|
let rejectResult!: (error: Error) => void;
|
|
62
|
-
let
|
|
63
|
-
let cleanupRequested = false;
|
|
66
|
+
let cleanupPromise: Promise<void> | undefined;
|
|
64
67
|
let settled = false;
|
|
65
68
|
|
|
66
69
|
const result = new Promise<T>((resolve, reject) => {
|
|
67
70
|
resolveResult = resolve;
|
|
68
71
|
rejectResult = reject;
|
|
69
72
|
});
|
|
73
|
+
// The trigger can fail or outlast the timeout before the caller awaits result.
|
|
74
|
+
// Observe rejection immediately, without changing what awaiting result throws.
|
|
75
|
+
void result.catch(() => undefined);
|
|
70
76
|
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const cleanup = subscriptionCleanup;
|
|
78
|
-
subscriptionCleanup = undefined;
|
|
79
|
-
await cleanup();
|
|
77
|
+
const cleanupSubscription = (): Promise<void> => {
|
|
78
|
+
cleanupPromise ??= subscription.then(cleanup => cleanup());
|
|
79
|
+
return cleanupPromise;
|
|
80
80
|
};
|
|
81
81
|
|
|
82
|
-
const
|
|
82
|
+
const finish = (outcome: { value: T } | { error: Error }): void => {
|
|
83
83
|
if (settled) {
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
settled = true;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
clearTimeout(timeout);
|
|
89
|
+
void cleanupSubscription().then(
|
|
90
|
+
() => {
|
|
91
|
+
if ("error" in outcome) {
|
|
92
|
+
rejectResult(outcome.error);
|
|
93
|
+
} else {
|
|
94
|
+
resolveResult(outcome.value);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
(error: unknown) => {
|
|
98
|
+
rejectResult("error" in outcome ? outcome.error : toError(error));
|
|
93
99
|
}
|
|
94
|
-
|
|
95
|
-
}
|
|
100
|
+
);
|
|
101
|
+
};
|
|
96
102
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
103
|
+
const timeout = setTimeout(
|
|
104
|
+
() => finish({ error: new Error(timeoutMsg) }),
|
|
105
|
+
timeoutMs
|
|
106
|
+
);
|
|
107
|
+
// Start in a microtask so even a synchronous callback can wait for the returned
|
|
108
|
+
// unsubscribe function. Success must not hide an error from delayed cleanup.
|
|
109
|
+
const subscription = Promise.resolve().then(() =>
|
|
110
|
+
subscribe(value => {
|
|
111
|
+
if (settled) {
|
|
100
112
|
return;
|
|
101
113
|
}
|
|
102
114
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
await unsubscribe();
|
|
108
|
-
resolveResult(value);
|
|
109
|
-
} catch (error) {
|
|
110
|
-
rejectResult(error instanceof Error ? error : new Error(String(error)));
|
|
115
|
+
try {
|
|
116
|
+
if (predicate(value)) {
|
|
117
|
+
finish({ value });
|
|
111
118
|
}
|
|
112
|
-
}
|
|
113
|
-
|
|
119
|
+
} catch (error) {
|
|
120
|
+
finish({ error: toError(error) });
|
|
121
|
+
}
|
|
122
|
+
})
|
|
123
|
+
);
|
|
114
124
|
|
|
115
|
-
|
|
116
|
-
|
|
125
|
+
const unsubscribe: Cleanup = async () => {
|
|
126
|
+
if (!settled) {
|
|
127
|
+
settled = true;
|
|
128
|
+
clearTimeout(timeout);
|
|
129
|
+
rejectResult(new Error("Event wait was cancelled."));
|
|
117
130
|
}
|
|
131
|
+
await cleanupSubscription();
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
await subscription;
|
|
118
136
|
} catch (error) {
|
|
119
|
-
|
|
120
|
-
clearTimeout(timeout);
|
|
121
|
-
rejectResult(error instanceof Error ? error : new Error(String(error)));
|
|
137
|
+
finish({ error: toError(error) });
|
|
122
138
|
}
|
|
123
139
|
|
|
124
140
|
return { result, unsubscribe };
|
|
125
|
-
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function toError(error: unknown): Error {
|
|
144
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
145
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { expect } from "chai";
|
|
2
|
-
import type { IOConnectDesktop } from "@interopio/desktop";
|
|
3
2
|
import { $, browser } from "@wdio/globals";
|
|
4
3
|
import { createCleanupRegistry, waitForEvent } from "./common/iocd";
|
|
5
4
|
|
|
@@ -8,21 +7,19 @@ import { createCleanupRegistry, waitForEvent } from "./common/iocd";
|
|
|
8
7
|
describe("Shared Contexts", () => {
|
|
9
8
|
const contextName = "IOCD.Sample.SelectedClient";
|
|
10
9
|
const clientName = "Ada Lovelace";
|
|
11
|
-
let instances: IOConnectDesktop.AppManager.Instance[] = [];
|
|
12
10
|
let cleanups = createCleanupRegistry();
|
|
13
11
|
|
|
14
12
|
beforeEach(async () => {
|
|
15
13
|
const io = await browser.io();
|
|
16
14
|
cleanups = createCleanupRegistry();
|
|
15
|
+
// Register first so the context is removed after subscriptions and apps.
|
|
16
|
+
cleanups.add(() => io.contexts.destroy(contextName).catch(() => undefined));
|
|
17
17
|
await io.contexts.destroy(contextName).catch(() => undefined);
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
afterEach(async () => {
|
|
21
|
-
|
|
21
|
+
// The registry attempts every cleanup, even when an earlier one fails.
|
|
22
22
|
await cleanups.run();
|
|
23
|
-
await Promise.all(instances.map((instance) => instance.stop().catch(() => undefined)));
|
|
24
|
-
instances = [];
|
|
25
|
-
await io.contexts.destroy(contextName).catch(() => undefined);
|
|
26
23
|
});
|
|
27
24
|
|
|
28
25
|
it("delivers an update from one app instance to another", async () => {
|
|
@@ -30,25 +27,30 @@ describe("Shared Contexts", () => {
|
|
|
30
27
|
const app = io.appManager.application("shared-context-client")!;
|
|
31
28
|
|
|
32
29
|
const publisher = await app.start({}, { title: "Context Publisher" });
|
|
30
|
+
cleanups.add(() => publisher.stop());
|
|
33
31
|
const subscriber = await app.start({}, { title: "Context Subscriber" });
|
|
34
|
-
|
|
32
|
+
cleanups.add(() => subscriber.stop());
|
|
35
33
|
|
|
36
34
|
const publisherWindow = await publisher.getWindow();
|
|
37
35
|
const subscriberWindow = await subscriber.getWindow();
|
|
38
36
|
|
|
39
37
|
// Wait until the receiving app has subscribed before publishing the update.
|
|
40
38
|
await browser.switchById(subscriberWindow.id);
|
|
41
|
-
await browser.waitUntil(
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
await browser.waitUntil(
|
|
40
|
+
async () => (await $("#context-status").getText()) === "Ready",
|
|
41
|
+
{
|
|
42
|
+
timeoutMsg:
|
|
43
|
+
"Expected the subscriber app to initialize its Shared Context subscription",
|
|
44
|
+
}
|
|
45
|
+
);
|
|
44
46
|
|
|
45
47
|
const contextUpdate = await waitForEvent<{ clientName?: string }>(
|
|
46
|
-
|
|
47
|
-
io.contexts.subscribe(contextName,
|
|
48
|
+
listener =>
|
|
49
|
+
io.contexts.subscribe(contextName, data => {
|
|
48
50
|
listener(data as { clientName?: string });
|
|
49
51
|
}),
|
|
50
52
|
{
|
|
51
|
-
predicate:
|
|
53
|
+
predicate: data => data.clientName === clientName,
|
|
52
54
|
timeoutMsg: `Expected the ${contextName} context to select ${clientName}`,
|
|
53
55
|
}
|
|
54
56
|
);
|
|
@@ -62,10 +64,13 @@ describe("Shared Contexts", () => {
|
|
|
62
64
|
|
|
63
65
|
await browser.switchById(subscriberWindow.id);
|
|
64
66
|
const selectedClient = await $("#selected-client");
|
|
65
|
-
await browser.waitUntil(
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
await browser.waitUntil(
|
|
68
|
+
async () => (await selectedClient.getText()) === clientName,
|
|
69
|
+
{
|
|
70
|
+
timeoutMsg: `Expected the subscriber app to receive ${clientName}`,
|
|
71
|
+
}
|
|
72
|
+
);
|
|
68
73
|
|
|
69
74
|
expect(await selectedClient.getText()).to.equal(clientName);
|
|
70
75
|
});
|
|
71
|
-
});
|
|
76
|
+
});
|
|
@@ -102,10 +102,16 @@ class ErrorHandler {
|
|
|
102
102
|
this.logger.flush();
|
|
103
103
|
// Give a small delay to ensure flush completes, then exit
|
|
104
104
|
await (0, delay_1.delay)(100);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
try {
|
|
106
|
+
if ((0, exports.shouldReportErrorToSentry)(error) && config_service_1.ConfigManager.config.sentry) {
|
|
107
|
+
this.sendToSentry(error);
|
|
108
|
+
// Wait a bit to ensure Sentry sends the error before exiting
|
|
109
|
+
await (0, delay_1.delay)(100);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Configuration may itself be the failure being handled. Reporting must
|
|
114
|
+
// never rethrow it into unhandledRejection and prevent process exit.
|
|
109
115
|
}
|
|
110
116
|
process.exit(exitCode);
|
|
111
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.handler.js","sourceRoot":"","sources":["../../src/utils/error.handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"error.handler.js","sourceRoot":"","sources":["../../src/utils/error.handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getReleaseMetadata = getReleaseMetadata;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const semver_1 = require("semver");
|
|
8
|
+
const logger_1 = require("./logger");
|
|
9
|
+
const logger = logger_1.Logger.getInstance("release-metadata");
|
|
10
|
+
const CACHE_TTL = 24 * 60 * 60 * 1000;
|
|
11
|
+
const FAILURE_TTL = 5 * 60 * 1000;
|
|
12
|
+
function isReleaseMetadata(value) {
|
|
13
|
+
if (!value || typeof value !== "object")
|
|
14
|
+
return false;
|
|
15
|
+
const metadata = value;
|
|
16
|
+
return (metadata.name === "@interopio/iocd-cli" &&
|
|
17
|
+
typeof metadata.version === "string" &&
|
|
18
|
+
(0, semver_1.valid)(metadata.version) !== null);
|
|
19
|
+
}
|
|
20
|
+
/** Optional online discovery; never needed for checks against the installed CLI. */
|
|
21
|
+
async function getReleaseMetadata(target, options = {}) {
|
|
22
|
+
const cacheDirectory = options.cacheDirectory ?? (0, node_path_1.join)((0, node_os_1.homedir)(), ".cache", "iocd-cli", "releases");
|
|
23
|
+
const allowStale = options.allowStale ?? true;
|
|
24
|
+
// Accept exact versions and npm tags, not arbitrary URLs or filesystem paths.
|
|
25
|
+
if (target.length > 100 || !/^[a-zA-Z0-9][a-zA-Z0-9.+_-]*$/.test(target))
|
|
26
|
+
return undefined;
|
|
27
|
+
const cachePath = (0, node_path_1.join)(cacheDirectory, `${target}.json`);
|
|
28
|
+
let previous;
|
|
29
|
+
let fetchedAt = 0;
|
|
30
|
+
try {
|
|
31
|
+
const cached = JSON.parse(await (0, promises_1.readFile)(cachePath, "utf8"));
|
|
32
|
+
previous = isReleaseMetadata(cached.metadata) ? cached.metadata : undefined;
|
|
33
|
+
fetchedAt =
|
|
34
|
+
typeof cached.fetchedAt === "number"
|
|
35
|
+
? cached.fetchedAt
|
|
36
|
+
: !cached.failed && typeof cached.checkedAt === "number"
|
|
37
|
+
? cached.checkedAt
|
|
38
|
+
: 0;
|
|
39
|
+
const metadataAge = Date.now() - fetchedAt;
|
|
40
|
+
const metadataIsFresh = metadataAge >= 0 && metadataAge < CACHE_TTL;
|
|
41
|
+
const age = typeof cached.checkedAt === "number"
|
|
42
|
+
? Date.now() - cached.checkedAt
|
|
43
|
+
: Infinity;
|
|
44
|
+
if (age >= 0 &&
|
|
45
|
+
age < (previous && !cached.failed ? CACHE_TTL : FAILURE_TTL))
|
|
46
|
+
return allowStale || metadataIsFresh ? previous : undefined;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// A missing/unreadable cache must not prevent commands from running.
|
|
50
|
+
}
|
|
51
|
+
let metadata;
|
|
52
|
+
try {
|
|
53
|
+
const response = await fetch(`https://registry.npmjs.org/@interopio/iocd-cli/${encodeURIComponent(target)}`, {
|
|
54
|
+
signal: AbortSignal.timeout(1500),
|
|
55
|
+
headers: { Accept: "application/json" },
|
|
56
|
+
});
|
|
57
|
+
if (response.ok) {
|
|
58
|
+
const value = await response.json();
|
|
59
|
+
if (isReleaseMetadata(value)) {
|
|
60
|
+
metadata = {
|
|
61
|
+
name: value.name,
|
|
62
|
+
version: value.version,
|
|
63
|
+
...(value.engines && { engines: value.engines }),
|
|
64
|
+
...(value.iocdCompatibility !== undefined
|
|
65
|
+
? { iocdCompatibility: value.iocdCompatibility }
|
|
66
|
+
: {}),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logger.debug("Release lookup unavailable", error);
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await (0, promises_1.mkdir)(cacheDirectory, { recursive: true });
|
|
76
|
+
await (0, promises_1.writeFile)(cachePath, JSON.stringify({
|
|
77
|
+
checkedAt: Date.now(),
|
|
78
|
+
fetchedAt: metadata ? Date.now() : fetchedAt,
|
|
79
|
+
metadata: metadata ?? previous ?? null,
|
|
80
|
+
failed: !metadata,
|
|
81
|
+
}), "utf8");
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
logger.debug("Could not save the optional release cache.");
|
|
85
|
+
}
|
|
86
|
+
return metadata ?? (allowStale ? previous : undefined);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=release-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-metadata.js","sourceRoot":"","sources":["../../src/utils/release-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,68 +34,31 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.checkForUpdates = checkForUpdates;
|
|
37
|
+
const semver_1 = require("semver");
|
|
37
38
|
const colors_1 = require("./colors");
|
|
38
39
|
const logger_1 = require("./logger");
|
|
39
40
|
const pacakge_json_helper_1 = require("./pacakge.json.helper");
|
|
41
|
+
const release_metadata_1 = require("./release-metadata");
|
|
40
42
|
const clack = __importStar(require("@clack/prompts"));
|
|
41
43
|
const logger = logger_1.Logger.getInstance("version-check");
|
|
42
|
-
/**
|
|
43
|
-
* Compare two semver version strings
|
|
44
|
-
* Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2
|
|
45
|
-
*/
|
|
46
|
-
function compareVersions(v1, v2) {
|
|
47
|
-
const parts1 = v1.replace(/^v/, "").split(".").map(Number);
|
|
48
|
-
const parts2 = v2.replace(/^v/, "").split(".").map(Number);
|
|
49
|
-
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
50
|
-
const p1 = parts1[i] || 0;
|
|
51
|
-
const p2 = parts2[i] || 0;
|
|
52
|
-
if (p1 < p2)
|
|
53
|
-
return -1;
|
|
54
|
-
if (p1 > p2)
|
|
55
|
-
return 1;
|
|
56
|
-
}
|
|
57
|
-
return 0;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Check if a newer version of the CLI is available on npm
|
|
61
|
-
* Logs a warning message if an update is available
|
|
62
|
-
*/
|
|
44
|
+
/** Advisory release discovery is cached; installed compatibility checks are offline. */
|
|
63
45
|
async function checkForUpdates() {
|
|
46
|
+
if (process.env["CI"])
|
|
47
|
+
return;
|
|
64
48
|
try {
|
|
65
|
-
const packageName = "@interopio/iocd-cli";
|
|
66
49
|
const currentVersion = pacakge_json_helper_1.PackageJSONHelper.getCliPackageJson().version;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {
|
|
72
|
-
signal: controller.signal,
|
|
73
|
-
headers: {
|
|
74
|
-
Accept: "application/json",
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
clearTimeout(timeoutId);
|
|
78
|
-
if (!response.ok) {
|
|
79
|
-
logger.debug(`Failed to fetch npm registry: ${response.status}`);
|
|
50
|
+
const latest = await (0, release_metadata_1.getReleaseMetadata)("latest");
|
|
51
|
+
if (!latest ||
|
|
52
|
+
!(0, semver_1.valid)(currentVersion) ||
|
|
53
|
+
!(0, semver_1.gt)(latest.version, currentVersion))
|
|
80
54
|
return;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (compareVersions(currentVersion, latestVersion) < 0) {
|
|
86
|
-
// Current version is older than latest
|
|
87
|
-
clack.log.warn((0, colors_1.yellow)(`A new version of ${packageName} is available: ${latestVersion} (current: ${currentVersion}). Run npm i ${packageName}@latest to update.`));
|
|
88
|
-
logger.debug("A new version of ${packageName} is available: ${latestVersion} (current: ${currentVersion})");
|
|
89
|
-
}
|
|
55
|
+
const guidance = latest.iocdCompatibility
|
|
56
|
+
? `Run iocd doctor --target ${latest.version} before upgrading to review dependency requirements.`
|
|
57
|
+
: "Review the seed-project upgrade documentation before updating the CLI and its dependencies together.";
|
|
58
|
+
clack.log.warn((0, colors_1.yellow)(`A new version of @interopio/iocd-cli is available: ${latest.version} (current: ${currentVersion}). ${guidance}`));
|
|
90
59
|
}
|
|
91
60
|
catch (error) {
|
|
92
|
-
|
|
93
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
94
|
-
logger.debug("Version check timed out");
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
logger.debug(`Version check failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
98
|
-
}
|
|
61
|
+
logger.debug("Optional release check failed", error);
|
|
99
62
|
}
|
|
100
63
|
}
|
|
101
64
|
//# sourceMappingURL=version-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,0CAuBC;AAjCD,mCAAmC;AACnC,qCAAkC;AAClC,qCAAkC;AAClC,+DAA0D;AAC1D,yDAAwD;AACxD,sDAAwC;AAExC,MAAM,MAAM,GAAG,eAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;AAEnD,wFAAwF;AACjF,KAAK,UAAU,eAAe;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,MAAM,cAAc,GAClB,uCAAiB,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,IAAA,qCAAkB,EAAC,QAAQ,CAAC,CAAC;QAClD,IACE,CAAC,MAAM;YACP,CAAC,IAAA,cAAK,EAAC,cAAc,CAAC;YACtB,CAAC,IAAA,WAAE,EAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC;YAEnC,OAAO;QACT,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB;YACvC,CAAC,CAAC,4BAA4B,MAAM,CAAC,OAAO,sDAAsD;YAClG,CAAC,CAAC,sGAAsG,CAAC;QAC3G,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,IAAA,eAAM,EACJ,sDAAsD,MAAM,CAAC,OAAO,cAAc,cAAc,MAAM,QAAQ,EAAE,CACjH,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interopio/iocd-cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "CLI tool for setting up, building and packaging io.Connect Desktop platforms",
|
|
5
5
|
"engines": {
|
|
6
|
-
"node": ">=22.
|
|
6
|
+
"node": ">=22.13.0",
|
|
7
7
|
"npm": ">=9.0.0"
|
|
8
8
|
},
|
|
9
9
|
"main": "dist/commands/index.js",
|
|
@@ -49,19 +49,20 @@
|
|
|
49
49
|
],
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@clack/prompts": "^0.7.0",
|
|
52
|
-
"@electron-forge/maker-base": "^
|
|
52
|
+
"@electron-forge/maker-base": "^8.0.1",
|
|
53
53
|
"@electron/notarize": "^3.1.0",
|
|
54
54
|
"@electron/osx-sign": "^2.2.0",
|
|
55
55
|
"@sentry/node": "^10.17.0",
|
|
56
56
|
"adm-zip": "^0.6.0",
|
|
57
57
|
"commander": "^14.0.0",
|
|
58
|
-
"concurrently": "^10.0.
|
|
58
|
+
"concurrently": "^10.0.6",
|
|
59
59
|
"dotenv": "^17.2.2",
|
|
60
60
|
"fs-extra": "^11.3.1",
|
|
61
61
|
"jsonwebtoken": "^9.0.2",
|
|
62
62
|
"log4js": "^6.9.1",
|
|
63
63
|
"plist": "^3.1.0",
|
|
64
64
|
"proper-lockfile": "^4.1.2",
|
|
65
|
+
"semver": "^7.8.5",
|
|
65
66
|
"undici": "^7.16.0"
|
|
66
67
|
},
|
|
67
68
|
"devDependencies": {
|
|
@@ -76,6 +77,7 @@
|
|
|
76
77
|
"@types/log4js": "^0.0.33",
|
|
77
78
|
"@types/node": "^22.19.17",
|
|
78
79
|
"@types/proper-lockfile": "^4.1.4",
|
|
80
|
+
"@types/semver": "^7.8.0",
|
|
79
81
|
"@typescript-eslint/eslint-plugin": "^8.47.0",
|
|
80
82
|
"@typescript-eslint/parser": "^8.47.0",
|
|
81
83
|
"cross-env": "^10.1.0",
|
|
@@ -91,9 +93,40 @@
|
|
|
91
93
|
"typescript-json-schema": "^0.65.1"
|
|
92
94
|
},
|
|
93
95
|
"peerDependencies": {
|
|
94
|
-
"@electron-forge/core": "^
|
|
96
|
+
"@electron-forge/core": "^8.0.1"
|
|
95
97
|
},
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
+
"iocdCompatibility": {
|
|
99
|
+
"schemaVersion": 1,
|
|
100
|
+
"dependencies": [
|
|
101
|
+
{
|
|
102
|
+
"name": "@electron-forge/core",
|
|
103
|
+
"range": "^8.0.1",
|
|
104
|
+
"required": true,
|
|
105
|
+
"commands": [
|
|
106
|
+
"build"
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"prefix": "@electron-forge/maker-",
|
|
111
|
+
"range": "^8.0.1",
|
|
112
|
+
"commands": [
|
|
113
|
+
"build"
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"prefix": "@electron-forge/publisher-",
|
|
118
|
+
"range": "^8.0.1",
|
|
119
|
+
"commands": [
|
|
120
|
+
"build"
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"prefix": "@electron-forge/plugin-",
|
|
125
|
+
"range": "^8.0.1",
|
|
126
|
+
"commands": [
|
|
127
|
+
"build"
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
]
|
|
98
131
|
}
|
|
99
132
|
}
|
|
@@ -97,6 +97,10 @@ try {
|
|
|
97
97
|
const sourceSchema = JSON.parse(fs.readFileSync(sourceSchemaPath, 'utf8'));
|
|
98
98
|
mergeSchemaPatterns(enhancedSchema, sourceSchema);
|
|
99
99
|
|
|
100
|
+
// TypeScript's number includes fractions and unsafe integers, which signing
|
|
101
|
+
// entitlements cannot represent. Use the source definition for these bounds.
|
|
102
|
+
enhancedSchema.definitions.EntitlementValue = sourceSchema.definitions.EntitlementValue;
|
|
103
|
+
|
|
100
104
|
// Write back the updated schema
|
|
101
105
|
fs.writeFileSync(schemaFile, JSON.stringify(enhancedSchema, null, 2));
|
|
102
106
|
|