@eik/cli 3.1.3 → 3.1.5

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 (84) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/classes/alias.js +109 -119
  3. package/classes/index.js +58 -58
  4. package/classes/integrity.js +89 -97
  5. package/classes/login.js +47 -47
  6. package/classes/meta.js +75 -80
  7. package/classes/ping.js +53 -53
  8. package/classes/publish/map.js +90 -92
  9. package/classes/publish/package/index.js +130 -130
  10. package/classes/publish/package/tasks/check-bundle-sizes.js +19 -21
  11. package/classes/publish/package/tasks/check-if-already-published.js +67 -72
  12. package/classes/publish/package/tasks/cleanup.js +17 -17
  13. package/classes/publish/package/tasks/create-temp-directory.js +17 -17
  14. package/classes/publish/package/tasks/create-zip-file.js +60 -65
  15. package/classes/publish/package/tasks/dry-run.js +15 -15
  16. package/classes/publish/package/tasks/save-metafile.js +17 -17
  17. package/classes/publish/package/tasks/task.js +7 -7
  18. package/classes/publish/package/tasks/upload-files.js +52 -56
  19. package/classes/publish/package/tasks/validate-input.js +24 -24
  20. package/classes/version.js +152 -163
  21. package/commands/alias.js +61 -95
  22. package/commands/init.js +89 -109
  23. package/commands/integrity.js +42 -55
  24. package/commands/login.js +80 -101
  25. package/commands/map-alias.js +62 -82
  26. package/commands/map.js +69 -83
  27. package/commands/meta.js +36 -53
  28. package/commands/npm-alias.js +55 -80
  29. package/commands/package-alias.js +58 -90
  30. package/commands/ping.js +19 -30
  31. package/commands/publish.js +117 -127
  32. package/commands/version.js +87 -95
  33. package/formatters/alias.js +60 -63
  34. package/formatters/artifact.js +77 -77
  35. package/formatters/file.js +25 -25
  36. package/formatters/index.js +4 -4
  37. package/formatters/version.js +49 -51
  38. package/index.js +76 -72
  39. package/package.json +5 -4
  40. package/readme.md +1 -1
  41. package/types/classes/alias.d.ts +3 -3
  42. package/types/classes/integrity.d.ts +1 -1
  43. package/types/classes/login.d.ts +1 -1
  44. package/types/classes/meta.d.ts +1 -1
  45. package/types/classes/ping.d.ts +1 -1
  46. package/types/classes/publish/map.d.ts +1 -1
  47. package/types/classes/publish/package/index.d.ts +11 -11
  48. package/types/classes/publish/package/tasks/check-bundle-sizes.d.ts +1 -1
  49. package/types/classes/publish/package/tasks/check-if-already-published.d.ts +1 -1
  50. package/types/classes/publish/package/tasks/cleanup.d.ts +1 -1
  51. package/types/classes/publish/package/tasks/create-temp-directory.d.ts +1 -1
  52. package/types/classes/publish/package/tasks/create-zip-file.d.ts +1 -1
  53. package/types/classes/publish/package/tasks/dry-run.d.ts +1 -1
  54. package/types/classes/publish/package/tasks/save-metafile.d.ts +1 -1
  55. package/types/classes/publish/package/tasks/task.d.ts +1 -1
  56. package/types/classes/publish/package/tasks/upload-files.d.ts +1 -1
  57. package/types/classes/publish/package/tasks/validate-input.d.ts +1 -1
  58. package/types/classes/version.d.ts +3 -3
  59. package/types/utils/defaults.d.ts +22 -0
  60. package/types/utils/error.d.ts +19 -0
  61. package/types/utils/hash/index.d.ts +3 -3
  62. package/types/utils/http/index.d.ts +4 -4
  63. package/types/utils/index.d.ts +5 -5
  64. package/types/utils/json/index.d.ts +3 -3
  65. package/utils/command-handler.js +72 -0
  66. package/utils/defaults.js +79 -0
  67. package/utils/error.js +42 -0
  68. package/utils/hash/file.js +4 -4
  69. package/utils/hash/files.js +9 -9
  70. package/utils/hash/index.js +3 -3
  71. package/utils/http/index.js +4 -4
  72. package/utils/http/integrity.js +18 -18
  73. package/utils/http/latest-version.js +37 -37
  74. package/utils/http/request.js +42 -42
  75. package/utils/http/versions.js +20 -20
  76. package/utils/index.js +6 -5
  77. package/utils/json/index.js +3 -3
  78. package/utils/json/read.js +26 -26
  79. package/utils/json/write-eik.js +17 -17
  80. package/utils/json/write.js +26 -28
  81. package/utils/logger.js +43 -43
  82. package/utils/type-title.js +3 -3
  83. package/utils/url.js +2 -2
  84. package/commands/index.js +0 -27
package/commands/init.js CHANGED
@@ -1,122 +1,102 @@
1
- import { join } from 'path';
2
- import fs from 'fs';
3
- import ora from 'ora';
4
- import { logger } from '../utils/index.js';
1
+ import { join } from "path";
2
+ import fs from "fs";
3
+ import { commandHandler } from "../utils/command-handler.js";
5
4
 
6
- const command = 'init';
5
+ const command = "init";
7
6
 
8
- const aliases = ['i'];
7
+ const aliases = ["i"];
9
8
 
10
- const describe = `Creates an eik.json file and saves it to the current working directory. If package.json exists in the directory its name and version will be used as the default. Override defaults using command line flags.`;
9
+ const describe = "Create an eik.json file";
11
10
 
11
+ /** @type {import('yargs').CommandBuilder} */
12
12
  const builder = (yargs) => {
13
- yargs.example('eik init');
14
- yargs.example('eik init --cwd /path/to/dir');
15
- yargs.example(
16
- 'eik init --server https://assets.myserver.com --version 2.0.0 --name my-app --files "./public"',
17
- );
18
- yargs.example('eik init --debug');
19
-
20
- yargs.options({
21
- server: {
22
- alias: 's',
23
- describe: `Specify asset server field in "eik.json". This the URL to an Eik asset server Eg. --server https://assets.myeikserver.com`,
24
- default: '',
25
- },
26
- version: {
27
- alias: 'v',
28
- describe: `Specify the semver version field in "eik.json". Eg. --version 1.0.0`,
29
- default: '1.0.0',
30
- },
31
- name: {
32
- alias: 'n',
33
- describe: `Specify the app name field in "eik.json".
34
- Eg. --name my-great-app`,
35
- default: '',
36
- },
37
- });
13
+ return yargs
14
+ .options({
15
+ server: {
16
+ alias: "s",
17
+ describe: "Eik server address, if different from configuration file",
18
+ },
19
+ version: {
20
+ alias: "v",
21
+ describe:
22
+ 'Specify the semver version field in "eik.json". Eg. --version 1.0.0',
23
+ default: "1.0.0",
24
+ },
25
+ name: {
26
+ alias: "n",
27
+ describe:
28
+ 'Specify the app name field in "eik.json". Eg. --name my-great-app',
29
+ },
30
+ })
31
+ .example("eik init")
32
+ .example(
33
+ "eik init --server https://assets.myserver.com --version 2.0.0 --name my-app",
34
+ );
38
35
  };
39
36
 
40
- const handler = async (argv) => {
41
- let { name, version } = argv;
42
- const { server, cwd, debug } = argv;
43
- const pathname = join(cwd, './eik.json');
44
-
45
- const spinner = ora({ stream: process.stdout }).start('working...');
46
- const log = logger(spinner, debug);
47
-
48
- try {
49
- log.debug(`Checking for existing ${pathname}`);
50
-
51
- let eikJsonExists = false;
52
- try {
53
- const st = fs.statSync(pathname);
54
- if (st.isFile()) {
55
- eikJsonExists = true;
56
- }
57
- } catch (err) {
58
- // noop
59
- }
60
- if (eikJsonExists) {
61
- throw new Error(
62
- `An "eik.json" file already exists in directory. File will not be written`,
63
- );
64
- }
65
-
66
- if (!name || !version || version === '1.0.0') {
67
- log.debug('Looking for default from package.json');
68
- try {
69
- let packageJson = fs.readFileSync(
70
- join(cwd, 'package.json'),
71
- 'utf-8',
72
- );
73
- packageJson = JSON.parse(packageJson);
74
- if (!name) {
75
- name = packageJson.name;
76
- log.debug(
77
- `Using ${name} from package.json as default name`,
78
- );
79
- }
80
- if (!version || version === '1.0.0') {
81
- version = packageJson.version;
82
- log.debug(
83
- `Using ${version} from package.json as default version`,
84
- );
85
- }
86
- } catch (e) {
87
- // noop
88
- }
89
- } else {
90
- log.debug(`Got ${name} and ${version}, skipping package.json`);
91
- }
92
-
93
- log.debug(`Writing to ${pathname}`);
94
-
95
- const output = JSON.stringify(
96
- {
97
- $schema:
98
- 'https://raw.githubusercontent.com/eik-lib/common/main/lib/schemas/eikjson.schema.json',
99
- name,
100
- version,
101
- server,
102
- files: './public',
103
- 'import-map': [],
104
- },
105
- null,
106
- 2,
107
- );
108
- fs.writeFileSync(pathname, output);
109
-
110
- log.info(`Wrote to ${pathname}
37
+ const handler = commandHandler({ command }, async (argv, log) => {
38
+ let { cwd, server, name, version } = argv;
39
+
40
+ const pathname = join(cwd, "./eik.json");
41
+ log.debug(`Checking for existing ${pathname}`);
42
+
43
+ let eikJsonExists = false;
44
+ try {
45
+ const st = fs.statSync(pathname);
46
+ if (st.isFile()) {
47
+ eikJsonExists = true;
48
+ }
49
+ } catch (err) {
50
+ // noop
51
+ }
52
+ if (eikJsonExists) {
53
+ throw new Error(
54
+ `An "eik.json" file already exists in directory. File will not be written`,
55
+ );
56
+ }
57
+
58
+ if (!name || !version || version === "1.0.0") {
59
+ log.debug("Looking for default from package.json");
60
+ try {
61
+ let packageJson = fs.readFileSync(join(cwd, "package.json"), "utf-8");
62
+ packageJson = JSON.parse(packageJson);
63
+ if (!name) {
64
+ name = packageJson.name;
65
+ log.debug(`Using ${name} from package.json as default name`);
66
+ }
67
+ if (!version || version === "1.0.0") {
68
+ version = packageJson.version;
69
+ log.debug(`Using ${version} from package.json as default version`);
70
+ }
71
+ } catch (e) {
72
+ // noop
73
+ }
74
+ } else {
75
+ log.debug(`Got ${name} and ${version}, skipping package.json`);
76
+ }
77
+
78
+ log.debug(`Writing to ${pathname}`);
79
+
80
+ const output = JSON.stringify(
81
+ {
82
+ $schema:
83
+ "https://raw.githubusercontent.com/eik-lib/common/main/lib/schemas/eikjson.schema.json",
84
+ name,
85
+ version,
86
+ server,
87
+ files: "./public",
88
+ "import-map": [],
89
+ },
90
+ null,
91
+ 2,
92
+ );
93
+ fs.writeFileSync(pathname, output);
94
+
95
+ log.info(`Wrote to ${pathname}
111
96
 
112
97
  ${output}
113
98
 
114
99
  Read more about configuring Eik on https://eik.dev/docs/reference/eik-json`);
115
- } catch (err) {
116
- log.warn(err.message);
117
- }
118
- spinner.text = '';
119
- spinner.stopAndPersist();
120
- };
100
+ });
121
101
 
122
102
  export { command, aliases, describe, builder, handler };
@@ -1,62 +1,49 @@
1
- import { join } from 'path';
2
- import ora from 'ora';
3
- import Integrity from '../classes/integrity.js';
4
- import { logger, getDefaults } from '../utils/index.js';
5
- import json from '../utils/json/index.js';
1
+ import { join } from "path";
2
+ import Integrity from "../classes/integrity.js";
3
+ import json from "../utils/json/index.js";
4
+ import { commandHandler } from "../utils/command-handler.js";
6
5
 
7
- export const command = 'integrity [name] [version]';
6
+ export const command = "integrity [name] [version]";
8
7
 
9
- export const aliases = ['int'];
8
+ export const aliases = ["int"];
10
9
 
11
- export const describe = `Retrieve file integrity information for package name and version defined in eik.json, then populate integrity.json file with this information`;
10
+ export const describe = "Get file integrity information";
12
11
 
12
+ /** @type {import('yargs').CommandBuilder} */
13
13
  export const builder = (yargs) => {
14
- const defaults = getDefaults(yargs.argv.config || yargs.argv.cwd);
15
-
16
- yargs.options({
17
- server: {
18
- alias: 's',
19
- describe: 'Specify location of asset server.',
20
- // @ts-expect-error
21
- default: defaults.server,
22
- },
23
- });
24
-
25
- yargs.example(`eik integrity`);
26
- yargs.example(`eik integrity --debug`);
14
+ return yargs
15
+ .options({
16
+ server: {
17
+ alias: "s",
18
+ describe: "Eik server address, if different from configuration file",
19
+ },
20
+ })
21
+ .example("eik integrity")
22
+ .example("eik integrity --server https://assets.myserver.com");
27
23
  };
28
24
 
29
- export const handler = async (argv) => {
30
- const spinner = ora({ stream: process.stdout }).start('working...');
31
- let integrity = false;
32
- const { debug, cwd, config } = argv;
33
- const l = logger(spinner, debug);
34
- // @ts-expect-error
35
- const { name, version, server, out, type } = getDefaults(config || cwd);
36
-
37
- try {
38
- integrity = await new Integrity({
39
- logger: l,
40
- name,
41
- version,
42
- server,
43
- debug,
44
- cwd,
45
- type,
46
- }).run();
47
-
48
- if (integrity) {
49
- const filename = join(out, 'integrity.json');
50
- await json.write(integrity, { cwd, filename });
51
- spinner.succeed(
52
- `integrity information for package "${name}" (v${version}) saved to "${filename}"`,
53
- );
54
- process.stdout.write('\n');
55
- }
56
- } catch (err) {
57
- spinner.text = '';
58
- spinner.stopAndPersist();
59
- l.warn(err.message);
60
- process.exit(1);
61
- }
62
- };
25
+ export const handler = commandHandler(
26
+ { command, options: ["server"] },
27
+ async (argv, log, spinner) => {
28
+ const { name, version, server, out, type, cwd, debug } = argv;
29
+
30
+ const integrity = await new Integrity({
31
+ logger: log,
32
+ name,
33
+ version,
34
+ server,
35
+ debug,
36
+ cwd,
37
+ type,
38
+ }).run();
39
+
40
+ if (integrity) {
41
+ const filename = join(out, "integrity.json");
42
+ await json.write(integrity, { cwd, filename });
43
+ spinner.succeed(
44
+ `integrity information for package "${name}" (v${version}) saved to "${filename}"`,
45
+ );
46
+ process.stdout.write("\n");
47
+ }
48
+ },
49
+ );
package/commands/login.js CHANGED
@@ -1,111 +1,90 @@
1
- import os from 'os';
2
- import readline from 'readline';
3
- import ora from 'ora';
4
- import Login from '../classes/login.js';
5
- import { logger, getDefaults } from '../utils/index.js';
6
- import json from '../utils/json/index.js';
1
+ import os from "os";
2
+ import readline from "readline";
3
+ import Login from "../classes/login.js";
4
+ import json from "../utils/json/index.js";
5
+ import { commandHandler } from "../utils/command-handler.js";
7
6
 
8
7
  const homedir = os.homedir();
9
8
 
10
- export const command = 'login';
9
+ export const command = "login";
11
10
 
12
11
  export const aliases = [];
13
12
 
14
- export const describe = `Authenticate against an Eik server and save the returned token to an .eikrc file in the users home directory. You can specify key and server values to authenticate against using the --key and --server flags which will then bypass login prompts. It is possible to be authenticated against multiple asset servers simultaneously. Simply call "eik login" multiple times.`;
13
+ export const describe = "Log in to an Eik server";
15
14
 
15
+ /** @type {import('yargs').CommandBuilder} */
16
16
  export const builder = (yargs) => {
17
- yargs.example('eik login --server https://assets.myserver.com');
18
- yargs.example(
19
- 'eik login --server https://assets.myserver.com --key ######',
20
- );
21
- yargs.example('eik login --server https://assets.myserver.com --debug');
22
-
23
- const defaults = getDefaults(yargs.argv.config || yargs.argv.cwd);
24
-
25
- yargs.options({
26
- server: {
27
- alias: 's',
28
- describe: `Eik server address. Specify location of the Eik asset server to authenticate against. If an eik.json file is present in the current working directory, the files server value will be used as default. If no eik.json file is present in the current working directory and this flag is not specified, a prompt will be presented to ask for the server address to be input. Eg. --server https://assets.myeikserver.com`,
29
- type: 'string',
30
- default: defaults.server,
31
- },
32
- key: {
33
- alias: 'k',
34
- describe: `Login access key. This is a passkey for a given user account and needs to be configured on the server. If this flag is not specifed, a prompt will be used to ask for the key to be input. Eg. --key ########`,
35
- type: 'string',
36
- default: '',
37
- },
38
- });
17
+ return yargs
18
+ .options({
19
+ server: {
20
+ alias: "s",
21
+ describe: "Eik server address, if different from configuration file",
22
+ type: "string",
23
+ },
24
+ key: {
25
+ alias: "k",
26
+ describe: "Login access key",
27
+ type: "string",
28
+ },
29
+ })
30
+ .example("eik login --server https://assets.myserver.com")
31
+ .example("eik login --server https://assets.myserver.com --key yourkey");
39
32
  };
40
33
 
41
- export const handler = async (argv) => {
42
- let success = false;
43
- const { debug, key, server } = argv;
44
- let k = key;
45
- let s = server;
46
- let rl = null;
47
-
48
- if (!s || !k) {
49
- rl = readline.createInterface({
50
- input: process.stdin,
51
- output: process.stdout,
52
- });
53
- }
54
-
55
- if (!s) {
56
- await new Promise((resolve) => {
57
- rl?.question('Enter Eik server address > ', (input) => {
58
- s = input;
59
- // @ts-expect-error
60
- resolve();
61
- });
62
- });
63
- }
64
-
65
- if (!k) {
66
- await new Promise((resolve) => {
67
- rl?.question(`Enter login key for ${s} > `, (input) => {
68
- k = input;
69
- // @ts-expect-error
70
- resolve();
71
- });
72
- });
73
- }
74
-
75
- if (rl) rl.close();
76
-
77
- const spinner = ora({ stream: process.stdout }).start('working...');
78
-
79
- try {
80
- const token = await new Login({
81
- logger: logger(spinner, debug),
82
- key: k,
83
- server: s,
84
- }).run();
85
-
86
- if (token) {
87
- const meta = /** @type {{ tokens: any }} */ (
88
- await json.read({ cwd: homedir, filename: '.eikrc' })
89
- );
90
-
91
- const tokens = new Map(meta.tokens);
92
- tokens.set(s, token);
93
- meta.tokens = Array.from(tokens);
94
-
95
- await json.write(meta, { cwd: homedir, filename: '.eikrc' });
96
- success = true;
97
- }
98
- } catch (err) {
99
- // @ts-expect-error
100
- logger.warn(err.message);
101
- }
102
-
103
- if (success) {
104
- spinner.text = '';
105
- spinner.stopAndPersist();
106
- } else {
107
- spinner.text = '';
108
- spinner.stopAndPersist();
109
- process.exit(1);
110
- }
111
- };
34
+ export const handler = commandHandler(
35
+ { command, options: ["server"] },
36
+ async (argv, logger) => {
37
+ const { key, server } = argv;
38
+
39
+ let k = key;
40
+ let s = server;
41
+ let rl = null;
42
+
43
+ if (!s || !k) {
44
+ rl = readline.createInterface({
45
+ input: process.stdin,
46
+ output: process.stdout,
47
+ });
48
+ }
49
+
50
+ if (!s) {
51
+ await new Promise((resolve) => {
52
+ rl?.question("Enter Eik server address > ", (input) => {
53
+ s = input;
54
+ // @ts-expect-error
55
+ resolve();
56
+ });
57
+ });
58
+ }
59
+
60
+ if (!k) {
61
+ await new Promise((resolve) => {
62
+ rl?.question(`Enter login key for ${s} > `, (input) => {
63
+ k = input;
64
+ // @ts-expect-error
65
+ resolve();
66
+ });
67
+ });
68
+ }
69
+
70
+ if (rl) rl.close();
71
+
72
+ const token = await new Login({
73
+ logger,
74
+ key: k,
75
+ server: s,
76
+ }).run();
77
+
78
+ if (token) {
79
+ const meta = /** @type {{ tokens: any }} */ (
80
+ await json.read({ cwd: homedir, filename: ".eikrc" })
81
+ );
82
+
83
+ const tokens = new Map(meta.tokens);
84
+ tokens.set(s, token);
85
+ meta.tokens = Array.from(tokens);
86
+
87
+ await json.write(meta, { cwd: homedir, filename: ".eikrc" });
88
+ }
89
+ },
90
+ );