@eik/cli 3.1.50 → 3.1.52

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 (47) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/classes/alias.js +13 -6
  3. package/classes/integrity.js +8 -2
  4. package/classes/login.js +2 -2
  5. package/classes/meta.js +4 -4
  6. package/classes/ping.js +4 -3
  7. package/classes/publish/map.js +12 -4
  8. package/classes/publish/package/tasks/check-bundle-sizes.js +8 -3
  9. package/classes/publish/package/tasks/check-if-already-published.js +6 -4
  10. package/classes/publish/package/tasks/cleanup.js +4 -3
  11. package/classes/publish/package/tasks/create-temp-directory.js +4 -0
  12. package/classes/publish/package/tasks/create-zip-file.js +18 -3
  13. package/classes/publish/package/tasks/dry-run.js +1 -0
  14. package/classes/publish/package/tasks/save-metafile.js +3 -1
  15. package/classes/publish/package/tasks/task.js +1 -0
  16. package/classes/publish/package/tasks/upload-files.js +18 -7
  17. package/classes/publish/package/tasks/validate-input.js +4 -0
  18. package/classes/version.js +4 -2
  19. package/commands/login.js +2 -2
  20. package/commands/map.js +2 -2
  21. package/commands/publish.js +4 -4
  22. package/index.js +1 -1
  23. package/package.json +17 -18
  24. package/types/classes/alias.d.ts +1 -1
  25. package/types/classes/index.d.ts +1 -1
  26. package/types/classes/integrity.d.ts +4 -4
  27. package/types/classes/ping.d.ts +2 -2
  28. package/types/classes/publish/map.d.ts +2 -2
  29. package/types/classes/publish/package/publish.d.ts +6 -6
  30. package/types/classes/publish/package/tasks/check-if-already-published.d.ts +1 -1
  31. package/types/classes/publish/package/tasks/dry-run.d.ts +2 -1
  32. package/types/classes/publish/package/tasks/save-metafile.d.ts +1 -0
  33. package/types/classes/publish/package/tasks/task.d.ts +1 -0
  34. package/types/classes/publish/package/tasks/upload-files.d.ts +2 -1
  35. package/types/classes/version.d.ts +6 -6
  36. package/types/utils/http/integrity.d.ts +1 -1
  37. package/types/utils/http/request.d.ts +6 -6
  38. package/types/utils/http/versions.d.ts +2 -2
  39. package/types/utils/json/write.d.ts +1 -1
  40. package/utils/command-handler.js +9 -8
  41. package/utils/http/integrity.js +3 -1
  42. package/utils/http/latest-version.js +2 -0
  43. package/utils/http/request.js +5 -4
  44. package/utils/http/versions.js +3 -1
  45. package/utils/json/read.js +3 -8
  46. package/utils/json/write.js +9 -9
  47. package/utils/logger.js +20 -10
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## [3.1.52](https://github.com/eik-lib/cli/compare/v3.1.51...v3.1.52) (2026-05-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Bump @eik/common ([6061bec](https://github.com/eik-lib/cli/commit/6061beccd8101ecf89efde3f8c632be9453a3e49))
7
+ * Bump @eik/service ([ce11d1a](https://github.com/eik-lib/cli/commit/ce11d1a203d2184d67d09fa15dad2afb1da5da93))
8
+ * Bump dependencies ([1285a51](https://github.com/eik-lib/cli/commit/1285a515281fe09114286b554c26740188ff1835))
9
+ * Bump sink-memory ([d60febd](https://github.com/eik-lib/cli/commit/d60febd353ec8855d442af6366944692445280b5))
10
+
11
+ ## [3.1.51](https://github.com/eik-lib/cli/compare/v3.1.50...v3.1.51) (2026-05-28)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * replace ora with picospinner ([784e3c5](https://github.com/eik-lib/cli/commit/784e3c51c677fbe9d542622ce9f5375532b244b6))
17
+ * replace rimraf with native Node ([ee58048](https://github.com/eik-lib/cli/commit/ee58048544dffedfc9f9a359f9fdd56a0130d280))
18
+
1
19
  ## [3.1.50](https://github.com/eik-lib/cli/compare/v3.1.49...v3.1.50) (2026-05-25)
2
20
 
3
21
 
package/classes/alias.js CHANGED
@@ -94,7 +94,7 @@ export default class Alias {
94
94
 
95
95
  return data;
96
96
  } catch (err) {
97
- let status = err.statusCode;
97
+ let status = /** @type {any} */ (err).statusCode;
98
98
 
99
99
  if (status === 409) {
100
100
  this.log.debug("Alias already exists on server, performing update");
@@ -117,31 +117,38 @@ export default class Alias {
117
117
 
118
118
  return data;
119
119
  } catch (error) {
120
- status = error.statusCode;
120
+ status = /** @type {any} */ (error).statusCode;
121
121
  }
122
122
  }
123
123
 
124
124
  switch (status) {
125
125
  case 400:
126
- throw new Error("Client attempted to send an invalid URL parameter");
126
+ throw new Error("Client attempted to send an invalid URL parameter", {
127
+ cause: err,
128
+ });
127
129
  case 401:
128
- throw new Error("Client unauthorized with server");
130
+ throw new Error("Client unauthorized with server", { cause: err });
129
131
  case 404:
130
132
  throw new Error(
131
133
  `The server was unable to locate ${joinUrlPathname(this.type, this.name, this.version)}. Ensure you have the correct package type (eik package-alias vs eik npm-alias), name and that the package version you're trying to alias exists on the server.`,
134
+ { cause: err },
132
135
  );
133
136
  case 409:
134
137
  throw new Error(
135
138
  `${this.type} with name "${this.name}" and version "${this.version}" already exists on server`,
139
+ { cause: err },
136
140
  );
137
141
  case 415:
138
142
  throw new Error(
139
143
  "Client attempted to send an unsupported file format to server",
144
+ { cause: err },
140
145
  );
141
146
  case 502:
142
- throw new Error("Server was unable to write file to storage");
147
+ throw new Error("Server was unable to write file to storage", {
148
+ cause: err,
149
+ });
143
150
  default:
144
- throw new Error("Server failure");
151
+ throw new Error("Server failure", { cause: err });
145
152
  }
146
153
  }
147
154
  }
@@ -64,7 +64,12 @@ export default class Integrity {
64
64
  throw new ValidationError(`Parameter "cwd" is not valid`);
65
65
  }
66
66
  } catch (err) {
67
- throw new Error(`Unable to validate input to command: ${err.message}`);
67
+ throw new Error(
68
+ `Unable to validate input to command: ${/** @type {any} */ (err).message}`,
69
+ {
70
+ cause: err,
71
+ },
72
+ );
68
73
  }
69
74
 
70
75
  this.log.debug("Requesting meta information from asset server");
@@ -95,7 +100,8 @@ export default class Integrity {
95
100
  throw new Error("Server Error");
96
101
  } catch (err) {
97
102
  throw new Error(
98
- `Unable to retrieve meta information for package: ${err.message}`,
103
+ `Unable to retrieve meta information for package: ${/** @type {any} */ (err).message}`,
104
+ { cause: err },
99
105
  );
100
106
  }
101
107
  }
package/classes/login.js CHANGED
@@ -32,7 +32,7 @@ export default class Login {
32
32
  throw new ValidationError('"key" must be a string');
33
33
  }
34
34
  } catch (err) {
35
- this.log.error(err.message);
35
+ this.log.error(/** @type {any} */ (err).message);
36
36
  return false;
37
37
  }
38
38
 
@@ -48,7 +48,7 @@ export default class Login {
48
48
  this.log.info(`Login successful`);
49
49
  return message.token;
50
50
  } catch (err) {
51
- switch (err.statusCode) {
51
+ switch (/** @type {any} */ (err).statusCode) {
52
52
  case 401:
53
53
  this.log.info("Login unsuccessful. Invalid credentials.");
54
54
  return false;
package/classes/meta.js CHANGED
@@ -33,7 +33,7 @@ export default class Meta {
33
33
  try {
34
34
  assert.server(this.server);
35
35
  } catch (err) {
36
- this.log.error(err.message);
36
+ this.log.error(/** @type {any} */ (err).message);
37
37
  return false;
38
38
  }
39
39
 
@@ -48,7 +48,7 @@ export default class Meta {
48
48
 
49
49
  const responses = await Promise.all(typeFetches);
50
50
 
51
- const data = {};
51
+ const data = /** @type {Record<string, any>} */ ({});
52
52
 
53
53
  for (const res of responses) {
54
54
  if (res.ok) {
@@ -61,7 +61,7 @@ export default class Meta {
61
61
  };
62
62
 
63
63
  const vers = new Map(versions);
64
- data[type].versions = Array.from(vers.values());
64
+ data[type].versions = [...vers.values()];
65
65
  for (let i = 0; i < data[type].versions.length; i++) {
66
66
  const { version } = data[type].versions[i];
67
67
  const url = new URL(
@@ -93,7 +93,7 @@ export default class Meta {
93
93
  return data;
94
94
  } catch (err) {
95
95
  this.log.error("Unable to retrieve meta information for package");
96
- this.log.warn(err.message);
96
+ this.log.warn(/** @type {any} */ (err).message);
97
97
  return false;
98
98
  }
99
99
  }
package/classes/ping.js CHANGED
@@ -26,7 +26,7 @@ export default class Ping {
26
26
  try {
27
27
  assert.server(this.server);
28
28
  } catch (err) {
29
- this.log.error(err.message);
29
+ this.log.error(/** @type {any} */ (err).message);
30
30
  return false;
31
31
  }
32
32
 
@@ -44,12 +44,13 @@ export default class Ping {
44
44
  this.log.info(`Ping successful`);
45
45
  return true;
46
46
  } catch (err) {
47
- if (err.code === "ENOTFOUND") {
47
+ const e = /** @type {any} */ (err);
48
+ if (e.code === "ENOTFOUND") {
48
49
  this.log.info("Ping unsuccessful. Server not found.");
49
50
  return false;
50
51
  }
51
52
 
52
- switch (err.statusCode) {
53
+ switch (e.statusCode) {
53
54
  case 404:
54
55
  this.log.info("Ping unsuccessful. Route not found.");
55
56
  return false;
@@ -93,25 +93,33 @@ export default class PublishMap {
93
93
  };
94
94
  } catch (err) {
95
95
  const msg = "Unable to complete upload of import map to server";
96
- switch (err.statusCode) {
96
+ switch (/** @type {any} */ (err).statusCode) {
97
97
  case 400:
98
98
  throw new Error(
99
99
  `${msg}: Client attempted to send an invalid URL parameter`,
100
+ { cause: err },
100
101
  );
101
102
  case 401:
102
- throw new Error(`${msg}: Client unauthorized with server`);
103
+ throw new Error(`${msg}: Client unauthorized with server`, {
104
+ cause: err,
105
+ });
103
106
  case 409:
104
107
  throw new Error(
105
108
  `${msg}: Map with name "${this.name}" and version "${this.version}" already exists on server`,
109
+ { cause: err },
106
110
  );
107
111
  case 415:
108
112
  throw new Error(
109
113
  `${msg}: Client attempted to send an unsupported file format to server`,
114
+ { cause: err },
110
115
  );
111
116
  case 502:
112
- throw new Error(`${msg}: Server was unable to write file to storage`);
117
+ throw new Error(
118
+ `${msg}: Server was unable to write file to storage`,
119
+ { cause: err },
120
+ );
113
121
  default:
114
- throw new Error(`${msg}: Server failed`);
122
+ throw new Error(`${msg}: Server failed`, { cause: err });
115
123
  }
116
124
  }
117
125
  }
@@ -1,6 +1,6 @@
1
1
  import bytes from "bytes";
2
2
  import fs from "fs";
3
- import { gzipSizeSync } from "gzip-size";
3
+ import zlib from "node:zlib";
4
4
  import Task from "./task.js";
5
5
 
6
6
  export default class CheckBundleSizes extends Task {
@@ -12,11 +12,16 @@ export default class CheckBundleSizes extends Task {
12
12
  this.log.debug(
13
13
  ` ==> entrypoint size (${
14
14
  mapping.source.destination
15
- } => ${file}): ${bytes(gzipSizeSync(fs.readFileSync(file, "utf8")))}`,
15
+ } => ${file}): ${bytes(zlib.gzipSync(fs.readFileSync(file)).length)}`,
16
16
  );
17
17
  }
18
18
  } catch (err) {
19
- throw new Error(`Failed to check bundle sizes: ${err.message}`);
19
+ throw new Error(
20
+ `Failed to check bundle sizes: ${/** @type {any} */ (err).message}`,
21
+ {
22
+ cause: err,
23
+ },
24
+ );
20
25
  }
21
26
  }
22
27
  }
@@ -23,7 +23,8 @@ export default class CheckIfAlreadyPublished extends Task {
23
23
  log.debug(` ==> Package version ${version} does not yet exist`);
24
24
  } catch (err) {
25
25
  throw new Error(
26
- `Unable to fetch package metadata from server: ${err.message}`,
26
+ `Unable to fetch package metadata from server: ${/** @type {any} */ (err).message}`,
27
+ { cause: err },
27
28
  );
28
29
  }
29
30
 
@@ -32,7 +33,8 @@ export default class CheckIfAlreadyPublished extends Task {
32
33
  pkgVersions = await versions(server, typeSlug(type), name);
33
34
  } catch (err) {
34
35
  throw new Error(
35
- `Unable to fetch package metadata from server: ${err.message}`,
36
+ `Unable to fetch package metadata from server: ${/** @type {any} */ (err).message}`,
37
+ { cause: err },
36
38
  );
37
39
  }
38
40
 
@@ -58,11 +60,11 @@ export default class CheckIfAlreadyPublished extends Task {
58
60
  localHash = await hashFiles(localFiles);
59
61
  } catch (err) {
60
62
  throw new Error(
61
- `Unable to hash local files for comparison: ${err.message}`,
63
+ `Unable to hash local files for comparison: ${/** @type {any} */ (err).message}`,
64
+ { cause: err },
62
65
  );
63
66
  }
64
67
 
65
- // @ts-expect-error
66
68
  const versionMap = new Map(pkgVersions);
67
69
  for (const v of versionMap.values()) {
68
70
  const same = hashCompare(v.integrity, localHash);
@@ -1,7 +1,6 @@
1
1
  import { join } from "node:path";
2
2
  import { existsSync } from "node:fs";
3
- import { readdir } from "node:fs/promises";
4
- import { rimraf } from "rimraf";
3
+ import { readdir, rm } from "node:fs/promises";
5
4
  import Task from "./task.js";
6
5
 
7
6
  export default class Cleanup extends Task {
@@ -14,7 +13,9 @@ export default class Cleanup extends Task {
14
13
  await Promise.all(
15
14
  dir
16
15
  .filter((file) => file !== "integrity.json")
17
- .map((file) => rimraf(join(path, file))),
16
+ .map((file) =>
17
+ rm(join(path, file), { recursive: true, force: true }),
18
+ ),
18
19
  );
19
20
  }
20
21
  }
@@ -2,6 +2,10 @@ import { mkdirSync } from "fs";
2
2
  import Task from "./task.js";
3
3
 
4
4
  class IOError extends Error {
5
+ /**
6
+ * @param {string} message
7
+ * @param {any} err
8
+ */
5
9
  constructor(message, err) {
6
10
  super(`${message}: ${err.message}`);
7
11
  this.name = this.constructor.name;
@@ -33,7 +33,12 @@ export default class CreateZipFile extends Task {
33
33
  );
34
34
  filesToZip.push(basename(eikPathDest));
35
35
  } catch (err) {
36
- throw new Error(`Failed to zip eik.json file: ${err.message}`);
36
+ throw new Error(
37
+ `Failed to zip eik.json file: ${/** @type {any} */ (err).message}`,
38
+ {
39
+ cause: err,
40
+ },
41
+ );
37
42
  }
38
43
 
39
44
  if (files) {
@@ -49,7 +54,12 @@ export default class CreateZipFile extends Task {
49
54
  filesToZip.push(destination.replace(path, "."));
50
55
  }
51
56
  } catch (err) {
52
- throw new Error(`Failed to copy files for zipping: ${err.message}`);
57
+ throw new Error(
58
+ `Failed to copy files for zipping: ${/** @type {any} */ (err).message}`,
59
+ {
60
+ cause: err,
61
+ },
62
+ );
53
63
  }
54
64
  }
55
65
 
@@ -67,7 +77,12 @@ export default class CreateZipFile extends Task {
67
77
 
68
78
  return zipFile;
69
79
  } catch (err) {
70
- throw new Error(`Unable to create zip file: ${err.message}`);
80
+ throw new Error(
81
+ `Unable to create zip file: ${/** @type {any} */ (err).message}`,
82
+ {
83
+ cause: err,
84
+ },
85
+ );
71
86
  }
72
87
  }
73
88
  }
@@ -2,6 +2,7 @@ import { join } from "path";
2
2
  import Task from "./task.js";
3
3
 
4
4
  export default class DryRun extends Task {
5
+ /** @param {string} zipFile */
5
6
  async process(zipFile) {
6
7
  const { path } = this;
7
8
 
@@ -3,6 +3,7 @@ import write from "../../../../utils/json/write.js";
3
3
  import Task from "./task.js";
4
4
 
5
5
  export default class SaveMetaFile extends Task {
6
+ /** @param {any} response */
6
7
  async process(response) {
7
8
  const { log, cwd } = this;
8
9
  const { out } = this.config;
@@ -13,7 +14,8 @@ export default class SaveMetaFile extends Task {
13
14
  await write(response, { cwd, filename: filepath });
14
15
  } catch (err) {
15
16
  throw new Error(
16
- `Unable to save integrity file [${filepath}]: ${err.message}`,
17
+ `Unable to save integrity file [${filepath}]: ${/** @type {any} */ (err).message}`,
18
+ { cause: err },
17
19
  );
18
20
  }
19
21
  }
@@ -1,6 +1,7 @@
1
1
  import abslog from "abslog";
2
2
 
3
3
  export default class Task {
4
+ /** @param {any} options */
4
5
  constructor(options) {
5
6
  this.cwd = options.cwd;
6
7
  this.log = abslog(options.logger);
@@ -5,6 +5,7 @@ import { joinUrlPathname } from "../../../../utils/url.js";
5
5
  import Task from "./task.js";
6
6
 
7
7
  export default class UploadFiles extends Task {
8
+ /** @param {string} zipFile */
8
9
  async process(zipFile) {
9
10
  const { log } = this;
10
11
  const { server, name, version, type, token } = this.config;
@@ -26,32 +27,42 @@ export default class UploadFiles extends Task {
26
27
 
27
28
  return message;
28
29
  } catch (err) {
30
+ const e = /** @type {any} */ (err);
29
31
  log.error("Unable to upload zip file to server");
30
- switch (err.statusCode) {
32
+ switch (e.statusCode) {
31
33
  case 400:
32
34
  throw new Error(
33
- `${err.statusCode}: Client attempted to send an invalid URL parameter`,
35
+ `${e.statusCode}: Client attempted to send an invalid URL parameter`,
36
+ { cause: err },
34
37
  );
35
38
  case 401:
36
- throw new Error(`${err.statusCode}: Client unauthorized with server`);
39
+ throw new Error(`${e.statusCode}: Client unauthorized with server`, {
40
+ cause: err,
41
+ });
37
42
  case 404:
38
43
  throw new Error(
39
- `${err.statusCode}: Client could not find server route`,
44
+ `${e.statusCode}: Client could not find server route`,
45
+ { cause: err },
40
46
  );
41
47
  case 409:
42
48
  throw new Error(
43
49
  `Package with name "${name}" and version "${version}" already exists on server`,
50
+ { cause: err },
44
51
  );
45
52
  case 415:
46
53
  throw new Error(
47
- `${err.statusCode}: Client attempted to send an unsupported file format to server`,
54
+ `${e.statusCode}: Client attempted to send an unsupported file format to server`,
55
+ { cause: err },
48
56
  );
49
57
  case 502:
50
58
  throw new Error(
51
- `${err.statusCode}: Server was unable to write file to storage, ${err.message}`,
59
+ `${e.statusCode}: Server was unable to write file to storage, ${e.message}`,
60
+ { cause: err },
52
61
  );
53
62
  default:
54
- throw new Error(`${err.statusCode}: Server failed, ${err.message}`);
63
+ throw new Error(`${e.statusCode}: Server failed, ${e.message}`, {
64
+ cause: err,
65
+ });
55
66
  }
56
67
  }
57
68
  }
@@ -2,6 +2,10 @@ import { parse } from "path";
2
2
  import Task from "./task.js";
3
3
 
4
4
  class ValidationError extends Error {
5
+ /**
6
+ * @param {string} message
7
+ * @param {any} [err]
8
+ */
5
9
  constructor(message, err) {
6
10
  let m = message;
7
11
  if (err && err.message) m += `: ${err.message}`;
@@ -102,7 +102,8 @@ export default class Version {
102
102
  integrityHash = await integrity(server, typeSlug(type), name, version);
103
103
  } catch (err) {
104
104
  throw new Error(
105
- `Unable to fetch package metadata from server: ${err.message}`,
105
+ `Unable to fetch package metadata from server: ${/** @type {any} */ (err).message}`,
106
+ { cause: err },
106
107
  );
107
108
  }
108
109
 
@@ -147,7 +148,8 @@ export default class Version {
147
148
  localHash = await hashFiles(localFiles);
148
149
  } catch (err) {
149
150
  throw new Error(
150
- `Unable to hash local files for comparison: ${err.message}`,
151
+ `Unable to hash local files for comparison: ${/** @type {any} */ (err).message}`,
152
+ { cause: err },
151
153
  );
152
154
  }
153
155
 
package/commands/login.js CHANGED
@@ -71,7 +71,7 @@ export const handler = commandHandler(
71
71
 
72
72
  if (rl) rl.close();
73
73
 
74
- spinner.start();
74
+ if (!spinner.running) spinner.start();
75
75
  const token = await new Login({
76
76
  logger,
77
77
  key: k,
@@ -85,7 +85,7 @@ export const handler = commandHandler(
85
85
 
86
86
  const tokens = new Map(meta.tokens);
87
87
  tokens.set(s, token);
88
- meta.tokens = Array.from(tokens);
88
+ meta.tokens = [...tokens];
89
89
 
90
90
  await write(meta, { cwd: homedir, filename: ".eikrc" });
91
91
  }
package/commands/map.js CHANGED
@@ -62,13 +62,13 @@ export const handler = commandHandler(
62
62
  const pkgMeta = await res.json();
63
63
 
64
64
  url = new URL(join("map", name, version), server);
65
- res = await fetch(url);
65
+ await fetch(url);
66
66
 
67
67
  log.info(`Published import map "${name}" at version "${version}"`);
68
68
 
69
69
  const artifact = new Artifact(pkgMeta);
70
70
  const versions = new Map(pkgMeta.versions);
71
- artifact.versions = Array.from(versions.values());
71
+ artifact.versions = [...versions.values()];
72
72
  artifact.format(server);
73
73
 
74
74
  process.stdout.write("\n");
@@ -96,14 +96,14 @@ export const handler = commandHandler(
96
96
  const artifact = new Artifact(pkgMeta);
97
97
  artifact.versions = [pkgVersionMeta];
98
98
 
99
- spinner.text = "";
100
- spinner.stopAndPersist();
99
+ spinner.setText("");
100
+ spinner.stop();
101
101
 
102
102
  artifact.format(server);
103
103
  process.stdout.write("\n");
104
104
  } else {
105
- spinner.text = "";
106
- spinner.stopAndPersist();
105
+ spinner.setText("");
106
+ spinner.stop();
107
107
 
108
108
  process.stdout.write(
109
109
  `:: ${c.bgYellow(
package/index.js CHANGED
@@ -34,7 +34,7 @@ const { version: cliVersion } = JSON.parse(
34
34
  if (
35
35
  process.argv.includes("-v") ||
36
36
  // last position only to avoid conflict with publish command
37
- process.argv[process.argv.length - 1].includes("--version")
37
+ process.argv.at(-1).includes("--version")
38
38
  ) {
39
39
  console.log(cliVersion);
40
40
  process.exit(0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eik/cli",
3
- "version": "3.1.50",
3
+ "version": "3.1.52",
4
4
  "description": "CLI tool for publishing assets to an Eik server",
5
5
  "main": "./classes/index.js",
6
6
  "types": "./types/classes/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "types"
21
21
  ],
22
22
  "scripts": {
23
- "clean": "rimraf .tap node_modules types",
23
+ "clean": "git clean -fdx",
24
24
  "test": "cross-env HTTP_PORT=0 LOG_LEVEL=fatal tap --timeout 180 --jobs=1 --disable-coverage",
25
25
  "test:integration": "cross-env HTTP_PORT=0 LOG_LEVEL=fatal tap --timeout 180 --jobs=1 --disable-coverage test/integration/**/*.test.mjs",
26
26
  "test:unit": "cross-env HTTP_PORT=0 LOG_LEVEL=fatal tap --timeout 180 --jobs=1 --disable-coverage test/*.test.mjs",
@@ -42,14 +42,12 @@
42
42
  "author": "",
43
43
  "license": "MIT",
44
44
  "dependencies": {
45
- "@eik/common": "5.1.22",
45
+ "@eik/common": "5.1.29",
46
46
  "abslog": "2.4.4",
47
47
  "bytes": "3.1.2",
48
48
  "date-fns": "4.3.0",
49
49
  "form-data": "4.0.5",
50
- "gzip-size": "7.0.0",
51
- "ora": "9.4.0",
52
- "rimraf": "6.1.3",
50
+ "picospinner": "3.0.0",
53
51
  "semver": "7.8.1",
54
52
  "tar": "7.5.15",
55
53
  "tinyrainbow": "3.1.0",
@@ -62,22 +60,23 @@
62
60
  }
63
61
  },
64
62
  "devDependencies": {
65
- "@eik/eslint-config": "1.0.25",
66
- "@eik/prettier-config": "1.0.1",
67
- "@eik/semantic-release-config": "1.0.15",
68
- "@eik/service": "5.1.45",
69
- "@eik/sink-memory": "2.0.27",
70
- "@eik/typescript-config": "1.0.0",
63
+ "@eik/eslint-config": "2.0.6",
64
+ "@eik/prettier-config": "1.0.2",
65
+ "@eik/semantic-release-config": "1.0.17",
66
+ "@eik/service": "5.1.53",
67
+ "@eik/sink-memory": "2.0.31",
68
+ "@eik/typescript-config": "1.0.2",
69
+ "@types/node": "25.9.1",
70
+ "@types/semver": "7.7.1",
71
71
  "@types/yargs": "17.0.35",
72
72
  "cross-env": "10.1.0",
73
- "eslint": "9.39.2",
73
+ "eslint": "10.4.0",
74
74
  "fastify": "5.8.5",
75
- "fs-extra": "11.3.3",
76
- "npm-run-all2": "8.0.4",
77
- "prettier": "3.8.1",
75
+ "npm-run-all2": "9.0.1",
76
+ "prettier": "3.8.3",
78
77
  "semantic-release": "25.0.3",
79
78
  "semantic-release-slack-bot": "4.0.2",
80
- "tap": "21.5.0",
81
- "typescript": "5.9.3"
79
+ "tap": "21.7.4",
80
+ "typescript": "6.0.3"
82
81
  }
83
82
  }
@@ -40,7 +40,7 @@ export default class Alias {
40
40
  export type AliasOptions = {
41
41
  logger?: import("abslog").AbstractLoggerOptions;
42
42
  server: string;
43
- type?: "package" | "npm" | "image" | "map";
43
+ type?: "map" | "package" | "npm" | "image" | undefined;
44
44
  name: string;
45
45
  version: string;
46
46
  alias: string;
@@ -32,6 +32,6 @@ declare namespace _default {
32
32
  /**
33
33
  * @param {import('./version.js').VersionOptions} opts
34
34
  */
35
- function version(opts: import("./version.js").VersionOptions): Promise<string>;
35
+ function version(opts: import("./version.js").VersionOptions): Promise<string | null>;
36
36
  }
37
37
  export default _default;
@@ -20,16 +20,16 @@ export default class Integrity {
20
20
  version: string;
21
21
  debug: boolean;
22
22
  cwd: string;
23
- type: "map" | "package" | "npm";
23
+ type: "map" | "package" | "npm" | undefined;
24
24
  run(): Promise<any>;
25
25
  }
26
26
  export type IntegrityOptions = {
27
27
  logger?: import("abslog").AbstractLoggerOptions;
28
28
  server: string;
29
- type?: "package" | "npm" | "map";
29
+ type?: "map" | "package" | "npm" | undefined;
30
30
  name: string;
31
31
  version: string;
32
- cwd?: string;
33
- debug?: boolean;
32
+ cwd?: string | undefined;
33
+ debug?: boolean | undefined;
34
34
  };
35
35
  import abslog from "abslog";
@@ -9,7 +9,7 @@ export default class Ping {
9
9
  */
10
10
  constructor({ logger, server }?: PingOptions);
11
11
  log: abslog.ValidLogger;
12
- server: string;
12
+ server: string | undefined;
13
13
  /**
14
14
  * Run the ping command
15
15
  * @returns {Promise<boolean>}
@@ -17,7 +17,7 @@ export default class Ping {
17
17
  run(): Promise<boolean>;
18
18
  }
19
19
  export type PingOptions = {
20
- server?: string;
20
+ server?: string | undefined;
21
21
  logger?: import("abslog").AbstractLoggerOptions;
22
22
  };
23
23
  import abslog from "abslog";
@@ -31,12 +31,12 @@ export default class PublishMap {
31
31
  * @returns {Promise<PublishMapResult>}
32
32
  */
33
33
  run(): Promise<PublishMapResult>;
34
- absoluteFile: string;
34
+ absoluteFile: string | undefined;
35
35
  }
36
36
  export type PublishMapOptions = {
37
37
  logger?: import("abslog").AbstractLoggerOptions;
38
38
  server: string;
39
- cwd?: string;
39
+ cwd?: string | undefined;
40
40
  token: string;
41
41
  file: string;
42
42
  name: string;
@@ -53,15 +53,15 @@ export default class Publish {
53
53
  }
54
54
  export type PublishOptions = {
55
55
  logger?: import("abslog").AbstractLoggerOptions;
56
- cwd?: string;
56
+ cwd?: string | undefined;
57
57
  token: string;
58
- dryRun?: boolean;
58
+ dryRun?: boolean | undefined;
59
59
  server: string;
60
- type?: "package" | "map" | "npm" | "image";
60
+ type?: "map" | "package" | "npm" | "image" | undefined;
61
61
  name: string;
62
- version?: string;
63
- map?: string[];
64
- out?: string;
62
+ version?: string | undefined;
63
+ map?: string[] | undefined;
64
+ out?: string | undefined;
65
65
  files: Record<string, string>;
66
66
  };
67
67
  export type PublishResult = {
@@ -1,4 +1,4 @@
1
1
  export default class CheckIfAlreadyPublished extends Task {
2
- process(): Promise<string>;
2
+ process(): Promise<string | null>;
3
3
  }
4
4
  import Task from "./task.js";
@@ -1,5 +1,6 @@
1
1
  export default class DryRun extends Task {
2
- process(zipFile: any): Promise<{
2
+ /** @param {string} zipFile */
3
+ process(zipFile: string): Promise<{
3
4
  pathname: any;
4
5
  type: string;
5
6
  }[]>;
@@ -1,4 +1,5 @@
1
1
  export default class SaveMetaFile extends Task {
2
+ /** @param {any} response */
2
3
  process(response: any): Promise<void>;
3
4
  }
4
5
  import Task from "./task.js";
@@ -1,4 +1,5 @@
1
1
  export default class Task {
2
+ /** @param {any} options */
2
3
  constructor(options: any);
3
4
  cwd: any;
4
5
  log: abslog.ValidLogger;
@@ -1,4 +1,5 @@
1
1
  export default class UploadFiles extends Task {
2
- process(zipFile: any): Promise<any>;
2
+ /** @param {string} zipFile */
3
+ process(zipFile: string): Promise<any>;
3
4
  }
4
5
  import Task from "./task.js";
@@ -21,7 +21,7 @@ export default class Version {
21
21
  config: any;
22
22
  configFile: string;
23
23
  path: any;
24
- level: any;
24
+ level: import("semver").ReleaseType;
25
25
  /**
26
26
  * Similar to `npm version`, but updates `eik.json`
27
27
  * @returns {Promise<string | null>} The new version number, or null if the versioning failed
@@ -31,14 +31,14 @@ export default class Version {
31
31
  export type VersionOptions = {
32
32
  logger?: import("abslog").AbstractLoggerOptions;
33
33
  server: string;
34
- type?: "package" | "npm" | "map";
34
+ type?: "map" | "package" | "npm" | undefined;
35
35
  name: string;
36
36
  version: string;
37
- level?: any;
37
+ level?: import("semver").ReleaseType | undefined;
38
38
  cwd: string;
39
- map?: string[];
40
- out?: string;
39
+ map?: string[] | undefined;
40
+ out?: string | undefined;
41
41
  files: string | Record<string, string>;
42
- configFile?: string;
42
+ configFile?: string | undefined;
43
43
  };
44
44
  import abslog from "abslog";
@@ -1,2 +1,2 @@
1
- declare function _default(server: string, type: any, name: string, version: string): Promise<string>;
1
+ declare function _default(server: string, type: string, name: string, version: string): Promise<string | null>;
2
2
  export default _default;
@@ -1,12 +1,12 @@
1
1
  export default request;
2
2
  export type RequestOptions = {
3
- method?: string;
3
+ method?: string | undefined;
4
4
  host: string;
5
5
  pathname: string;
6
6
  data?: unknown;
7
- file?: string;
8
- map?: string;
9
- token?: string;
7
+ file?: string | undefined;
8
+ map?: string | undefined;
9
+ token?: string | undefined;
10
10
  };
11
11
  /**
12
12
  * @typedef {object} RequestOptions
@@ -23,11 +23,11 @@ export type RequestOptions = {
23
23
  *
24
24
  * @param {RequestOptions} options
25
25
  *
26
- * @returns {Promise<{ status:number; message: object | string }>} - Promise that resolves to an object with properties status and message
26
+ * @returns {Promise<{ status:number; message: any }>} - Promise that resolves to an object with properties status and message
27
27
  *
28
28
  * @throws Error
29
29
  */
30
30
  declare function request(options: RequestOptions): Promise<{
31
31
  status: number;
32
- message: object | string;
32
+ message: any;
33
33
  }>;
@@ -1,5 +1,5 @@
1
- declare function _default(server: string, type: any, name: string): Promise<Array<Array<number, {
1
+ declare function _default(server: string, type: string, name: string): Promise<[number, {
2
2
  version: string;
3
3
  integrity: string;
4
- }>>>;
4
+ }][] | null>;
5
5
  export default _default;
@@ -1,4 +1,4 @@
1
- declare function _default(meta: object, location: string | {
1
+ declare function _default(meta: object | undefined, location: string | {
2
2
  cwd: string;
3
3
  filename: string;
4
4
  }): Promise<undefined>;
@@ -1,4 +1,4 @@
1
- import ora from "ora";
1
+ import { Spinner } from "picospinner";
2
2
  import logger from "./logger.js";
3
3
  import { EikCliError } from "./error.js";
4
4
  import { getArgsOrDefaults } from "./defaults.js";
@@ -25,7 +25,8 @@ import { getArgsOrDefaults } from "./defaults.js";
25
25
  */
26
26
  export function commandHandler(opts, handlerFunction) {
27
27
  return async (argv) => {
28
- const spinner = ora({ stream: process.stdout }).start();
28
+ const spinner = new Spinner();
29
+ spinner.start();
29
30
  const log = logger(spinner, argv.debug);
30
31
 
31
32
  try {
@@ -38,8 +39,8 @@ ${JSON.stringify(args, null, 2)}`);
38
39
 
39
40
  await handlerFunction(args, log, spinner);
40
41
 
41
- spinner.text = "";
42
- spinner.stopAndPersist();
42
+ spinner.setText("");
43
+ spinner.stop();
43
44
  } catch (e) {
44
45
  if (e instanceof EikCliError) {
45
46
  log.error(e.message);
@@ -52,8 +53,8 @@ ${JSON.stringify(args, null, 2)}`);
52
53
  }
53
54
  }
54
55
 
55
- spinner.text = "";
56
- spinner.stopAndPersist();
56
+ spinner.setText("");
57
+ spinner.stop();
57
58
  return process.exit(e.exitCode);
58
59
  }
59
60
 
@@ -64,8 +65,8 @@ ${JSON.stringify(args, null, 2)}`);
64
65
  log.debug(error.stack);
65
66
  }
66
67
 
67
- spinner.text = "";
68
- spinner.stopAndPersist();
68
+ spinner.setText("");
69
+ spinner.stop();
69
70
  process.exit(1);
70
71
  }
71
72
  };
@@ -4,10 +4,11 @@ import { join } from "node:path";
4
4
  * Fetches package integrity string by name and version from a given Eik asset server.
5
5
  *
6
6
  * @param {string} server - Eik asset server URL to perform lookup against
7
+ * @param {string} type - Package type (pkg, npm, map)
7
8
  * @param {string} name - Package name to lookup
8
9
  * @param {string} version - Semver major version to lock fetch to
9
10
  *
10
- * @returns {Promise<string>} - Package integrity string
11
+ * @returns {Promise<string|null>} - Package integrity string
11
12
  *
12
13
  * @throws Error
13
14
  */
@@ -30,6 +31,7 @@ export default async (server, type, name, version) => {
30
31
  } catch (err) {
31
32
  throw new Error(
32
33
  "An error occurred while attempting to parse json response from server.",
34
+ { cause: err },
33
35
  );
34
36
  }
35
37
  };
@@ -27,6 +27,7 @@ export default async (server, type, name, major) => {
27
27
  } catch (err) {
28
28
  throw new Error(
29
29
  "An error occurred while attempting to parse json response from server.",
30
+ { cause: err },
30
31
  );
31
32
  }
32
33
 
@@ -36,6 +37,7 @@ export default async (server, type, name, major) => {
36
37
  } catch (err) {
37
38
  throw new Error(
38
39
  "An error occurred while attempting to create an internal versions map. The JSON returned from the server is most likely invalid.",
40
+ { cause: err },
39
41
  );
40
42
  }
41
43
 
@@ -16,7 +16,7 @@ import { readFile } from "node:fs/promises";
16
16
  *
17
17
  * @param {RequestOptions} options
18
18
  *
19
- * @returns {Promise<{ status:number; message: object | string }>} - Promise that resolves to an object with properties status and message
19
+ * @returns {Promise<{ status:number; message: any }>} - Promise that resolves to an object with properties status and message
20
20
  *
21
21
  * @throws Error
22
22
  */
@@ -64,10 +64,11 @@ async function request(options) {
64
64
  }
65
65
  return { message: await res.text(), status: res.status };
66
66
  } catch (err) {
67
- if (!err.statusCode) {
68
- err.statusCode = 500;
67
+ const e = /** @type {any} */ (err);
68
+ if (!e.statusCode) {
69
+ e.statusCode = 500;
69
70
  }
70
- throw err;
71
+ throw e;
71
72
  }
72
73
  }
73
74
 
@@ -4,9 +4,10 @@ import { join } from "path";
4
4
  * Fetches package versions by name from a given Eik asset server.
5
5
  *
6
6
  * @param {string} server - Eik asset server URL to perform lookup against
7
+ * @param {string} type - Package type (pkg, npm, map)
7
8
  * @param {string} name - Package name to lookup
8
9
  *
9
- * @returns {Promise<Array<Array<number,{version:string,integrity:string}>>>}
10
+ * @returns {Promise<[number, {version: string, integrity: string}][]|null>}
10
11
  *
11
12
  * @throws Error
12
13
  */
@@ -30,6 +31,7 @@ export default async (server, type, name) => {
30
31
  } catch (err) {
31
32
  throw new Error(
32
33
  "An error occurred while attempting to parse json response from server.",
34
+ { cause: err },
33
35
  );
34
36
  }
35
37
 
@@ -24,14 +24,9 @@ export default async (location) => {
24
24
  );
25
25
  }
26
26
  let cwd = process.cwd();
27
- let filename = "";
28
- if (typeof location === "string") {
29
- filename = location;
30
- } else {
31
- filename = location.filename;
32
- if (location.cwd) {
33
- cwd = location.cwd;
34
- }
27
+ const filename = typeof location === "string" ? location : location.filename;
28
+ if (typeof location !== "string" && location.cwd) {
29
+ cwd = location.cwd;
35
30
  }
36
31
  const path = isAbsolute(filename) ? filename : join(cwd, filename);
37
32
  try {
@@ -27,20 +27,20 @@ export default async (meta = {}, location) => {
27
27
  );
28
28
  }
29
29
  let cwd = process.cwd();
30
- let filename = "";
31
- if (typeof location === "string") {
32
- filename = location;
33
- } else {
34
- filename = location.filename;
35
- if (location.cwd) {
36
- cwd = location.cwd;
37
- }
30
+ const filename = typeof location === "string" ? location : location.filename;
31
+ if (typeof location !== "string" && location.cwd) {
32
+ cwd = location.cwd;
38
33
  }
39
34
  const path = isAbsolute(filename) ? filename : join(cwd, filename);
40
35
  try {
41
36
  await fs.mkdir(dirname(path), { recursive: true });
42
37
  await fs.writeFile(path, JSON.stringify(meta, null, 2));
43
38
  } catch (err) {
44
- throw new Error(`Error writing to JSON file ["${path}"]: ${err.message}`);
39
+ throw new Error(
40
+ `Error writing to JSON file ["${path}"]: ${/** @type {any} */ (err).message}`,
41
+ {
42
+ cause: err,
43
+ },
44
+ );
45
45
  }
46
46
  };
package/utils/logger.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Creates a logger object that wraps an instance of the "ora" module in order to provide consistent command line logging that includes a spinner
2
+ * Creates a logger object that wraps an instance of the "picospinner" module in order to provide consistent command line logging that includes a spinner
3
3
  *
4
- * @param {object} spinner
4
+ * @param {import('picospinner').Spinner} spinner
5
5
  * @param {boolean} debug
6
6
  */
7
7
  const logger = (spinner, debug = false) => ({
@@ -9,45 +9,55 @@ const logger = (spinner, debug = false) => ({
9
9
  * @param {string} message
10
10
  */
11
11
  fatal(message) {
12
- spinner.fail(message).start();
12
+ spinner.fail(message);
13
+ if (!spinner.running) spinner.start();
13
14
  },
14
15
  /**
15
16
  * @param {string} message
16
17
  */
17
18
  error(message) {
18
- spinner.fail(message).start();
19
+ spinner.fail(message);
20
+ if (!spinner.running) spinner.start();
19
21
  },
20
22
  /**
21
23
  * @param {string} message
22
24
  */
23
25
  warn(message) {
24
- spinner.warn(message).start();
26
+ spinner.warn(message);
27
+ if (!spinner.running) spinner.start();
25
28
  },
26
29
  /**
27
30
  * @param {string} message
28
31
  */
29
32
  info(message) {
30
33
  if (typeof message !== "string") {
31
- spinner.text = "";
32
- spinner.stopAndPersist();
34
+ spinner.setText("");
35
+ spinner.stop();
33
36
 
34
37
  console.log(message);
35
38
  spinner.start();
36
39
  } else {
37
- spinner.succeed(message).start();
40
+ spinner.succeed(message);
41
+ if (!spinner.running) spinner.start();
38
42
  }
39
43
  },
40
44
  /**
41
45
  * @param {string} message
42
46
  */
43
47
  debug(message) {
44
- if (debug) spinner.info(message).start();
48
+ if (debug) {
49
+ spinner.info(message);
50
+ if (!spinner.running) spinner.start();
51
+ }
45
52
  },
46
53
  /**
47
54
  * @param {string} message
48
55
  */
49
56
  trace(message) {
50
- if (debug) spinner.info(message).start();
57
+ if (debug) {
58
+ spinner.info(message);
59
+ if (!spinner.running) spinner.start();
60
+ }
51
61
  },
52
62
  });
53
63