@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.
Files changed (49) hide show
  1. package/README.md +9 -0
  2. package/assets/mac-build/entitlements.mac.plist +3 -0
  3. package/changelog.md +31 -0
  4. package/dist/assets/mac-build/entitlements.mac.plist +3 -0
  5. package/dist/cli.js +17 -12
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/build.command.js +3 -2
  8. package/dist/commands/build.command.js.map +1 -1
  9. package/dist/commands/doctor.command.js +37 -0
  10. package/dist/commands/doctor.command.js.map +1 -0
  11. package/dist/commands/index.js +3 -1
  12. package/dist/commands/index.js.map +1 -1
  13. package/dist/schemas/iocd.cli.config.schema.json +54 -1
  14. package/dist/services/components/components.service.js +2 -1
  15. package/dist/services/components/components.service.js.map +1 -1
  16. package/dist/services/config/config.validator.js +2 -0
  17. package/dist/services/config/config.validator.js.map +1 -1
  18. package/dist/services/config/entitlements.validator.js +89 -0
  19. package/dist/services/config/entitlements.validator.js.map +1 -0
  20. package/dist/services/doctor.service.js +311 -0
  21. package/dist/services/doctor.service.js.map +1 -0
  22. package/dist/services/installer/electronForge.js +26 -38
  23. package/dist/services/installer/electronForge.js.map +1 -1
  24. package/dist/services/installer/entitlements.service.js +73 -0
  25. package/dist/services/installer/entitlements.service.js.map +1 -0
  26. package/dist/services/installer/macOS.helper.js +40 -29
  27. package/dist/services/installer/macOS.helper.js.map +1 -1
  28. package/dist/services/installer/zip-maker.js +1 -2
  29. package/dist/services/installer/zip-maker.js.map +1 -1
  30. package/dist/templates/ioconnect-desktop/README.md +9 -0
  31. package/dist/templates/ioconnect-desktop/config/forge.config.js +0 -12
  32. package/dist/templates/ioconnect-desktop/package.json +7 -7
  33. package/dist/templates/tests/.agents/skills/iocd-wdio-testing/SKILL.md +0 -1
  34. package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/authoring.md +25 -8
  35. package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/configuration.md +35 -12
  36. package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/models.md +24 -31
  37. package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/setup.md +16 -3
  38. package/dist/templates/tests/tests/.gitignore.template +1 -0
  39. package/dist/templates/tests/tests/README.md +4 -2
  40. package/dist/templates/tests/tests/tests/common/iocd.ts +60 -40
  41. package/dist/templates/tests/tests/tests/shared-contexts.spec.ts +22 -17
  42. package/dist/utils/error.handler.js +10 -4
  43. package/dist/utils/error.handler.js.map +1 -1
  44. package/dist/utils/release-metadata.js +88 -0
  45. package/dist/utils/release-metadata.js.map +1 -0
  46. package/dist/utils/version-check.js +14 -51
  47. package/dist/utils/version-check.js.map +1 -1
  48. package/package.json +40 -7
  49. 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
- firstError ??= error;
34
+ if (!failed) {
35
+ firstError = error;
36
+ failed = true;
37
+ }
34
38
  }
35
39
  }
36
40
 
37
- if (firstError) {
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 subscriptionCleanup: Cleanup | undefined;
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 unsubscribe: Cleanup = async () => {
72
- if (!subscriptionCleanup) {
73
- cleanupRequested = true;
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 timeout = setTimeout(() => {
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
- void (async () => {
89
- try {
90
- await unsubscribe();
91
- } finally {
92
- rejectResult(new Error(timeoutMsg));
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
- })().catch(() => undefined);
95
- }, timeoutMs);
100
+ );
101
+ };
96
102
 
97
- try {
98
- subscriptionCleanup = await subscribe((value) => {
99
- if (settled || !predicate(value)) {
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
- settled = true;
104
- clearTimeout(timeout);
105
- void (async () => {
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
- if (cleanupRequested) {
116
- await unsubscribe();
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
- settled = true;
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
- const io = await browser.io();
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
- instances = [publisher, subscriber];
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(async () => (await $("#context-status").getText()) === "Ready", {
42
- timeoutMsg: "Expected the subscriber app to initialize its Shared Context subscription",
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
- (listener) =>
47
- io.contexts.subscribe(contextName, (data) => {
48
+ listener =>
49
+ io.contexts.subscribe(contextName, data => {
48
50
  listener(data as { clientName?: string });
49
51
  }),
50
52
  {
51
- predicate: (data) => data.clientName === clientName,
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(async () => (await selectedClient.getText()) === clientName, {
66
- timeoutMsg: `Expected the subscriber app to receive ${clientName}`,
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
- if (config_service_1.ConfigManager.config.sentry && (0, exports.shouldReportErrorToSentry)(error)) {
106
- this.sendToSentry(error);
107
- // Wait a bit to ensure Sentry sends the error before exiting
108
- await (0, delay_1.delay)(100);
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
- logger.debug(`Checking for updates... Current version: ${currentVersion}`);
68
- // Fetch latest version from npm registry with a short timeout
69
- const controller = new AbortController();
70
- const timeoutId = setTimeout(() => controller.abort(), 3000); // 3 second timeout
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
- const data = (await response.json());
83
- const latestVersion = data.version;
84
- logger.debug(`Latest version on npm: ${latestVersion}`);
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
- // Silently fail - don't block CLI execution for version check failures
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":"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"}
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": "1.1.2",
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.0.0",
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": "^7.11.2",
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.3",
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": "^7.11.2"
96
+ "@electron-forge/core": "^8.0.1"
95
97
  },
96
- "overrides": {
97
- "tar": ">=7.5.7"
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