@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.
- package/CHANGELOG.md +18 -0
- package/classes/alias.js +13 -6
- package/classes/integrity.js +8 -2
- package/classes/login.js +2 -2
- package/classes/meta.js +4 -4
- package/classes/ping.js +4 -3
- package/classes/publish/map.js +12 -4
- package/classes/publish/package/tasks/check-bundle-sizes.js +8 -3
- package/classes/publish/package/tasks/check-if-already-published.js +6 -4
- package/classes/publish/package/tasks/cleanup.js +4 -3
- package/classes/publish/package/tasks/create-temp-directory.js +4 -0
- package/classes/publish/package/tasks/create-zip-file.js +18 -3
- package/classes/publish/package/tasks/dry-run.js +1 -0
- package/classes/publish/package/tasks/save-metafile.js +3 -1
- package/classes/publish/package/tasks/task.js +1 -0
- package/classes/publish/package/tasks/upload-files.js +18 -7
- package/classes/publish/package/tasks/validate-input.js +4 -0
- package/classes/version.js +4 -2
- package/commands/login.js +2 -2
- package/commands/map.js +2 -2
- package/commands/publish.js +4 -4
- package/index.js +1 -1
- package/package.json +17 -18
- package/types/classes/alias.d.ts +1 -1
- package/types/classes/index.d.ts +1 -1
- package/types/classes/integrity.d.ts +4 -4
- package/types/classes/ping.d.ts +2 -2
- package/types/classes/publish/map.d.ts +2 -2
- package/types/classes/publish/package/publish.d.ts +6 -6
- package/types/classes/publish/package/tasks/check-if-already-published.d.ts +1 -1
- package/types/classes/publish/package/tasks/dry-run.d.ts +2 -1
- package/types/classes/publish/package/tasks/save-metafile.d.ts +1 -0
- package/types/classes/publish/package/tasks/task.d.ts +1 -0
- package/types/classes/publish/package/tasks/upload-files.d.ts +2 -1
- package/types/classes/version.d.ts +6 -6
- package/types/utils/http/integrity.d.ts +1 -1
- package/types/utils/http/request.d.ts +6 -6
- package/types/utils/http/versions.d.ts +2 -2
- package/types/utils/json/write.d.ts +1 -1
- package/utils/command-handler.js +9 -8
- package/utils/http/integrity.js +3 -1
- package/utils/http/latest-version.js +2 -0
- package/utils/http/request.js +5 -4
- package/utils/http/versions.js +3 -1
- package/utils/json/read.js +3 -8
- package/utils/json/write.js +9 -9
- 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
|
}
|
package/classes/integrity.js
CHANGED
|
@@ -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(
|
|
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 =
|
|
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
|
-
|
|
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 (
|
|
53
|
+
switch (e.statusCode) {
|
|
53
54
|
case 404:
|
|
54
55
|
this.log.info("Ping unsuccessful. Route not found.");
|
|
55
56
|
return false;
|
package/classes/publish/map.js
CHANGED
|
@@ -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(
|
|
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
|
|
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(
|
|
15
|
+
} => ${file}): ${bytes(zlib.gzipSync(fs.readFileSync(file)).length)}`,
|
|
16
16
|
);
|
|
17
17
|
}
|
|
18
18
|
} catch (err) {
|
|
19
|
-
throw new Error(
|
|
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) =>
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
}
|
|
@@ -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
|
}
|
|
@@ -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 (
|
|
32
|
+
switch (e.statusCode) {
|
|
31
33
|
case 400:
|
|
32
34
|
throw new Error(
|
|
33
|
-
`${
|
|
35
|
+
`${e.statusCode}: Client attempted to send an invalid URL parameter`,
|
|
36
|
+
{ cause: err },
|
|
34
37
|
);
|
|
35
38
|
case 401:
|
|
36
|
-
throw new Error(`${
|
|
39
|
+
throw new Error(`${e.statusCode}: Client unauthorized with server`, {
|
|
40
|
+
cause: err,
|
|
41
|
+
});
|
|
37
42
|
case 404:
|
|
38
43
|
throw new Error(
|
|
39
|
-
`${
|
|
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
|
-
`${
|
|
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
|
-
`${
|
|
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(`${
|
|
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}`;
|
package/classes/version.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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 =
|
|
71
|
+
artifact.versions = [...versions.values()];
|
|
72
72
|
artifact.format(server);
|
|
73
73
|
|
|
74
74
|
process.stdout.write("\n");
|
package/commands/publish.js
CHANGED
|
@@ -96,14 +96,14 @@ export const handler = commandHandler(
|
|
|
96
96
|
const artifact = new Artifact(pkgMeta);
|
|
97
97
|
artifact.versions = [pkgVersionMeta];
|
|
98
98
|
|
|
99
|
-
spinner.
|
|
100
|
-
spinner.
|
|
99
|
+
spinner.setText("");
|
|
100
|
+
spinner.stop();
|
|
101
101
|
|
|
102
102
|
artifact.format(server);
|
|
103
103
|
process.stdout.write("\n");
|
|
104
104
|
} else {
|
|
105
|
-
spinner.
|
|
106
|
-
spinner.
|
|
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
|
|
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.
|
|
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": "
|
|
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.
|
|
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
|
-
"
|
|
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": "
|
|
66
|
-
"@eik/prettier-config": "1.0.
|
|
67
|
-
"@eik/semantic-release-config": "1.0.
|
|
68
|
-
"@eik/service": "5.1.
|
|
69
|
-
"@eik/sink-memory": "2.0.
|
|
70
|
-
"@eik/typescript-config": "1.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": "
|
|
73
|
+
"eslint": "10.4.0",
|
|
74
74
|
"fastify": "5.8.5",
|
|
75
|
-
"
|
|
76
|
-
"
|
|
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.
|
|
81
|
-
"typescript": "
|
|
79
|
+
"tap": "21.7.4",
|
|
80
|
+
"typescript": "6.0.3"
|
|
82
81
|
}
|
|
83
82
|
}
|
package/types/classes/alias.d.ts
CHANGED
|
@@ -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" |
|
|
43
|
+
type?: "map" | "package" | "npm" | "image" | undefined;
|
|
44
44
|
name: string;
|
|
45
45
|
version: string;
|
|
46
46
|
alias: string;
|
package/types/classes/index.d.ts
CHANGED
|
@@ -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" |
|
|
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";
|
package/types/classes/ping.d.ts
CHANGED
|
@@ -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?: "
|
|
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 = {
|
|
@@ -21,7 +21,7 @@ export default class Version {
|
|
|
21
21
|
config: any;
|
|
22
22
|
configFile: string;
|
|
23
23
|
path: any;
|
|
24
|
-
level:
|
|
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" |
|
|
34
|
+
type?: "map" | "package" | "npm" | undefined;
|
|
35
35
|
name: string;
|
|
36
36
|
version: string;
|
|
37
|
-
level?:
|
|
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:
|
|
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:
|
|
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:
|
|
32
|
+
message: any;
|
|
33
33
|
}>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
declare function _default(server: string, type:
|
|
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;
|
package/utils/command-handler.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
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 =
|
|
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.
|
|
42
|
-
spinner.
|
|
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.
|
|
56
|
-
spinner.
|
|
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.
|
|
68
|
-
spinner.
|
|
68
|
+
spinner.setText("");
|
|
69
|
+
spinner.stop();
|
|
69
70
|
process.exit(1);
|
|
70
71
|
}
|
|
71
72
|
};
|
package/utils/http/integrity.js
CHANGED
|
@@ -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
|
|
package/utils/http/request.js
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
68
|
-
|
|
67
|
+
const e = /** @type {any} */ (err);
|
|
68
|
+
if (!e.statusCode) {
|
|
69
|
+
e.statusCode = 500;
|
|
69
70
|
}
|
|
70
|
-
throw
|
|
71
|
+
throw e;
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
|
package/utils/http/versions.js
CHANGED
|
@@ -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<
|
|
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
|
|
package/utils/json/read.js
CHANGED
|
@@ -24,14 +24,9 @@ export default async (location) => {
|
|
|
24
24
|
);
|
|
25
25
|
}
|
|
26
26
|
let cwd = process.cwd();
|
|
27
|
-
|
|
28
|
-
if (typeof location
|
|
29
|
-
|
|
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 {
|
package/utils/json/write.js
CHANGED
|
@@ -27,20 +27,20 @@ export default async (meta = {}, location) => {
|
|
|
27
27
|
);
|
|
28
28
|
}
|
|
29
29
|
let cwd = process.cwd();
|
|
30
|
-
|
|
31
|
-
if (typeof location
|
|
32
|
-
|
|
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(
|
|
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 "
|
|
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 {
|
|
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)
|
|
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)
|
|
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)
|
|
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.
|
|
32
|
-
spinner.
|
|
34
|
+
spinner.setText("");
|
|
35
|
+
spinner.stop();
|
|
33
36
|
|
|
34
37
|
console.log(message);
|
|
35
38
|
spinner.start();
|
|
36
39
|
} else {
|
|
37
|
-
spinner.succeed(message)
|
|
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)
|
|
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)
|
|
57
|
+
if (debug) {
|
|
58
|
+
spinner.info(message);
|
|
59
|
+
if (!spinner.running) spinner.start();
|
|
60
|
+
}
|
|
51
61
|
},
|
|
52
62
|
});
|
|
53
63
|
|