@dcl/sdk 7.0.6-3840920714.commit-b9858ac → 7.0.6-3849904041.commit-fa1984a

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.
@@ -0,0 +1,14 @@
1
+ interface Options {
2
+ args: typeof args;
3
+ }
4
+ export declare const args: import("arg").Result<{
5
+ '--help': BooleanConstructor;
6
+ '-h': string;
7
+ } & {
8
+ '--yes': BooleanConstructor;
9
+ '-y': string;
10
+ '--dir': StringConstructor;
11
+ }>;
12
+ export declare function help(): Promise<void>;
13
+ export declare function main(options: Options): Promise<void>;
14
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.main = exports.help = exports.args = void 0;
4
+ const path_1 = require("path");
5
+ const error_1 = require("../../utils/error");
6
+ const args_1 = require("../../utils/args");
7
+ const prompt_1 = require("../../utils/prompt");
8
+ const fs_1 = require("../../utils/fs");
9
+ const repos_1 = require("./repos");
10
+ exports.args = (0, args_1.getArgs)({
11
+ '--yes': Boolean,
12
+ '-y': '--yes',
13
+ '--dir': String
14
+ });
15
+ async function help() { }
16
+ exports.help = help;
17
+ async function main(options) {
18
+ const dir = (0, path_1.resolve)(process.cwd(), options.args['--dir'] || '.');
19
+ const isEmpty = await (0, fs_1.isDirectoryEmpty)(dir);
20
+ const yes = options.args['--yes'];
21
+ if (!isEmpty && !yes) {
22
+ const answer = await (0, prompt_1.confirm)('The folder specified is not empty, continue anyway?');
23
+ if (!answer)
24
+ return;
25
+ }
26
+ try {
27
+ const scene = 'scene-template';
28
+ const zip = await (0, fs_1.download)((0, repos_1.get)(scene), (0, path_1.join)(dir, `${scene}.zip`));
29
+ await (0, fs_1.extract)(zip, dir);
30
+ await (0, fs_1.remove)(zip);
31
+ }
32
+ catch (e) {
33
+ throw new error_1.CliError(e.message);
34
+ }
35
+ }
36
+ exports.main = main;
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBb0M7QUFFcEMsNkNBQTRDO0FBQzVDLDJDQUEwQztBQUMxQywrQ0FBNEM7QUFDNUMsdUNBQTRFO0FBRTVFLG1DQUF3QztBQU0zQixRQUFBLElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQztJQUMxQixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUUsT0FBTztJQUNiLE9BQU8sRUFBRSxNQUFNO0NBQ2hCLENBQUMsQ0FBQTtBQUVLLEtBQUssVUFBVSxJQUFJLEtBQUksQ0FBQztBQUEvQixvQkFBK0I7QUFFeEIsS0FBSyxVQUFVLElBQUksQ0FBQyxPQUFnQjtJQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU8sRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtJQUNoRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEscUJBQWdCLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDM0MsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVqQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxnQkFBTyxFQUMxQixxREFBcUQsQ0FDdEQsQ0FBQTtRQUVELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTTtLQUNwQjtJQUVELElBQUk7UUFDRixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQTtRQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsYUFBUSxFQUFDLElBQUEsV0FBTyxFQUFDLEtBQUssQ0FBQyxFQUFFLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLElBQUEsWUFBTyxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUN2QixNQUFNLElBQUEsV0FBTSxFQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQ2xCO0lBQUMsT0FBTyxDQUFNLEVBQUU7UUFDZixNQUFNLElBQUksZ0JBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDOUI7QUFDSCxDQUFDO0FBckJELG9CQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tICdwYXRoJ1xuXG5pbXBvcnQgeyBDbGlFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgZ2V0QXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL2FyZ3MnXG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi4vLi4vdXRpbHMvcHJvbXB0J1xuaW1wb3J0IHsgaXNEaXJlY3RvcnlFbXB0eSwgZG93bmxvYWQsIGV4dHJhY3QsIHJlbW92ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2ZzJ1xuXG5pbXBvcnQgeyBnZXQgYXMgZ2V0UmVwbyB9IGZyb20gJy4vcmVwb3MnXG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgYXJnczogdHlwZW9mIGFyZ3Ncbn1cblxuZXhwb3J0IGNvbnN0IGFyZ3MgPSBnZXRBcmdzKHtcbiAgJy0teWVzJzogQm9vbGVhbixcbiAgJy15JzogJy0teWVzJyxcbiAgJy0tZGlyJzogU3RyaW5nXG59KVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGVscCgpIHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgY29uc3QgZGlyID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLmFyZ3NbJy0tZGlyJ10gfHwgJy4nKVxuICBjb25zdCBpc0VtcHR5ID0gYXdhaXQgaXNEaXJlY3RvcnlFbXB0eShkaXIpXG4gIGNvbnN0IHllcyA9IG9wdGlvbnMuYXJnc1snLS15ZXMnXVxuXG4gIGlmICghaXNFbXB0eSAmJiAheWVzKSB7XG4gICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY29uZmlybShcbiAgICAgICdUaGUgZm9sZGVyIHNwZWNpZmllZCBpcyBub3QgZW1wdHksIGNvbnRpbnVlIGFueXdheT8nXG4gICAgKVxuXG4gICAgaWYgKCFhbnN3ZXIpIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzY2VuZSA9ICdzY2VuZS10ZW1wbGF0ZSdcbiAgICBjb25zdCB6aXAgPSBhd2FpdCBkb3dubG9hZChnZXRSZXBvKHNjZW5lKSwgam9pbihkaXIsIGAke3NjZW5lfS56aXBgKSlcbiAgICBhd2FpdCBleHRyYWN0KHppcCwgZGlyKVxuICAgIGF3YWl0IHJlbW92ZSh6aXApXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihlLm1lc3NhZ2UpXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,43 @@
1
+ import { join, resolve } from 'path'
2
+
3
+ import { CliError } from '../../utils/error'
4
+ import { getArgs } from '../../utils/args'
5
+ import { confirm } from '../../utils/prompt'
6
+ import { isDirectoryEmpty, download, extract, remove } from '../../utils/fs'
7
+
8
+ import { get as getRepo } from './repos'
9
+
10
+ interface Options {
11
+ args: typeof args
12
+ }
13
+
14
+ export const args = getArgs({
15
+ '--yes': Boolean,
16
+ '-y': '--yes',
17
+ '--dir': String
18
+ })
19
+
20
+ export async function help() {}
21
+
22
+ export async function main(options: Options) {
23
+ const dir = resolve(process.cwd(), options.args['--dir'] || '.')
24
+ const isEmpty = await isDirectoryEmpty(dir)
25
+ const yes = options.args['--yes']
26
+
27
+ if (!isEmpty && !yes) {
28
+ const answer = await confirm(
29
+ 'The folder specified is not empty, continue anyway?'
30
+ )
31
+
32
+ if (!answer) return
33
+ }
34
+
35
+ try {
36
+ const scene = 'scene-template'
37
+ const zip = await download(getRepo(scene), join(dir, `${scene}.zip`))
38
+ await extract(zip, dir)
39
+ await remove(zip)
40
+ } catch (e: any) {
41
+ throw new CliError(e.message)
42
+ }
43
+ }
@@ -0,0 +1,4 @@
1
+ export declare const REPOS: {
2
+ 'scene-template': string;
3
+ };
4
+ export declare const get: (repo: keyof typeof REPOS) => string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.get = exports.REPOS = void 0;
4
+ exports.REPOS = {
5
+ 'scene-template': 'https://github.com/decentraland/sdk7-scene-template/archive/refs/heads/main.zip'
6
+ };
7
+ const get = (repo) => exports.REPOS[repo];
8
+ exports.get = get;
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZXBvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLEtBQUssR0FBRztJQUNuQixnQkFBZ0IsRUFDZCxpRkFBaUY7Q0FDcEYsQ0FBQTtBQUVNLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBd0IsRUFBRSxFQUFFLENBQUMsYUFBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQS9DLFFBQUEsR0FBRyxPQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBSRVBPUyA9IHtcbiAgJ3NjZW5lLXRlbXBsYXRlJzpcbiAgICAnaHR0cHM6Ly9naXRodWIuY29tL2RlY2VudHJhbGFuZC9zZGs3LXNjZW5lLXRlbXBsYXRlL2FyY2hpdmUvcmVmcy9oZWFkcy9tYWluLnppcCdcbn1cblxuZXhwb3J0IGNvbnN0IGdldCA9IChyZXBvOiBrZXlvZiB0eXBlb2YgUkVQT1MpID0+IFJFUE9TW3JlcG9dXG4iXX0=
@@ -0,0 +1,6 @@
1
+ export const REPOS = {
2
+ 'scene-template':
3
+ 'https://github.com/decentraland/sdk7-scene-template/archive/refs/heads/main.zip'
4
+ }
5
+
6
+ export const get = (repo: keyof typeof REPOS) => REPOS[repo]
package/cli/index.d.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ import { getArgs } from './utils/args';
3
+ export interface Options {
4
+ args: ReturnType<typeof getArgs>;
5
+ }
package/cli/index.js CHANGED
@@ -4,53 +4,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- const arg_1 = __importDefault(require("arg"));
8
- const fs_1 = require("fs");
9
- const path_1 = require("path");
10
- const error_1 = require("./error");
11
- const JS_EXT = '.js';
12
- const COMMANDS_PATH = (0, path_1.resolve)(__dirname, './commands');
13
- const isJSFile = (file) => file.slice(-3) === JS_EXT;
14
- const commands = new Set((0, fs_1.readdirSync)(COMMANDS_PATH)
15
- .filter((fileName) => isJSFile(fileName))
16
- .map((fileName) => fileName.slice(0, -3)));
17
- const listCommandsStr = () => Array.from(commands)
7
+ const args_1 = require("./utils/args");
8
+ const log_1 = __importDefault(require("./utils/log"));
9
+ const error_1 = require("./utils/error");
10
+ const commands_1 = require("./utils/commands");
11
+ const listCommandsStr = (commands) => commands
18
12
  .map(($) => `
19
13
  * npx sdk ${$}`)
20
14
  .join('');
21
15
  const handleError = (err) => {
22
- const error = err instanceof error_1.CliError ? err.message : err;
23
- console.error(error);
16
+ if (!(err instanceof error_1.CliError)) {
17
+ log_1.default.warn(`Developer: All errors thrown must be an instance of "CliError"`);
18
+ }
19
+ log_1.default.fail(err.message);
24
20
  process.exit(1);
25
21
  };
26
- const validCommandFns = (fns) => {
27
- const { help, default: _def } = fns;
28
- if (!help || !_def) {
29
- throw new error_1.CliError(`
30
- Command does not follow implementation rules:
31
- * Requires a "help" function
32
- * Requires a "default" function
22
+ const commandFnsAreValid = (fns) => {
23
+ const { help, main } = fns;
24
+ if (!help || !main) {
25
+ throw new error_1.CliError(`Command does not follow implementation rules:
26
+ * Requires a "help" function
27
+ * Requires a "main" function
33
28
  `);
34
29
  }
35
30
  return true;
36
31
  };
37
- const args = (0, arg_1.default)({
38
- '--help': Boolean,
39
- '-h': '--help'
40
- });
32
+ const args = (0, args_1.getArgs)();
33
+ const helpMessage = (commands) => `Here is the list of commands: ${listCommandsStr(commands)}`;
41
34
  (async () => {
42
35
  const command = process.argv[2];
43
36
  const needsHelp = args['--help'];
44
- if (!commands.has(command)) {
37
+ const commands = await (0, commands_1.getCommands)();
38
+ if (!commands.includes(command)) {
45
39
  if (needsHelp) {
46
- console.log('TODO: help message');
40
+ log_1.default.info(helpMessage(commands));
47
41
  return;
48
42
  }
49
- throw new error_1.CliError(`Invalid command. Possible are: ${listCommandsStr()}`);
43
+ throw new error_1.CliError(`Command ${command} is invalid. ${helpMessage}`);
50
44
  }
51
- const fns = require((0, path_1.resolve)(COMMANDS_PATH, command + JS_EXT));
52
- if (validCommandFns(fns)) {
53
- needsHelp ? await fns.help() : await fns.default();
45
+ const cmd = require(`${commands_1.COMMANDS_PATH}/${command}`);
46
+ if (commandFnsAreValid(cmd)) {
47
+ const options = { args: cmd.args };
48
+ needsHelp ? await cmd.help(options) : await cmd.main(options);
54
49
  }
55
50
  })().catch(handleError);
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSw4Q0FBcUI7QUFDckIsMkJBQWdDO0FBQ2hDLCtCQUE4QjtBQUU5QixtQ0FBa0M7QUFVbEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFBO0FBQ3BCLE1BQU0sYUFBYSxHQUFHLElBQUEsY0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQTtBQUV0RCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQTtBQUVyRSxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FDdEIsSUFBQSxnQkFBVyxFQUFDLGFBQWEsQ0FBQztLQUN2QixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN4QyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDNUMsQ0FBQTtBQUVELE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRSxDQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUNqQixHQUFHLENBQ0YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2NBQ0MsQ0FBQyxFQUFFLENBQ1o7S0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFFYixNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVUsRUFBRSxFQUFFO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsWUFBWSxnQkFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUE7SUFDekQsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pCLENBQUMsQ0FBQTtBQUVELE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBWSxFQUE0QixFQUFFO0lBQ2pFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQTtJQUNuQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2xCLE1BQU0sSUFBSSxnQkFBUSxDQUFDOzs7O0tBSWxCLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDLENBQUE7QUFFRCxNQUFNLElBQUksR0FBRyxJQUFBLGFBQUcsRUFBQztJQUNmLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLElBQUksRUFBRSxRQUFRO0NBQ2YsQ0FBQyxDQUVEO0FBQUEsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRWhDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzFCLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1lBQ2pDLE9BQU07U0FDUDtRQUNELE1BQU0sSUFBSSxnQkFBUSxDQUFDLGtDQUFrQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDMUU7SUFHRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBQSxjQUFPLEVBQUMsYUFBYSxFQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBRTdELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFBO0tBQ25EO0FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCBhcmcgZnJvbSAnYXJnJ1xuaW1wb3J0IHsgcmVhZGRpclN5bmMgfSBmcm9tICdmcydcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJ1xuXG5pbXBvcnQgeyBDbGlFcnJvciB9IGZyb20gJy4vZXJyb3InXG5cbi8vIGxlYXZpbmcgYXJncyBhcyBcImFueVwiIHNpbmNlIHdlIGRvbid0IGtub3cgeWV0IGlmIHdlIHdpbGwgdXNlIHRoZW1cbnR5cGUgRmlsZUZuID0gKC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTx2b2lkPlxuXG5pbnRlcmZhY2UgRmlsZUZucyB7XG4gIGhlbHA/OiBGaWxlRm5cbiAgZGVmYXVsdD86IEZpbGVGblxufVxuXG5jb25zdCBKU19FWFQgPSAnLmpzJ1xuY29uc3QgQ09NTUFORFNfUEFUSCA9IHJlc29sdmUoX19kaXJuYW1lLCAnLi9jb21tYW5kcycpXG5cbmNvbnN0IGlzSlNGaWxlID0gKGZpbGU6IHN0cmluZyk6IGJvb2xlYW4gPT4gZmlsZS5zbGljZSgtMykgPT09IEpTX0VYVFxuXG5jb25zdCBjb21tYW5kcyA9IG5ldyBTZXQoXG4gIHJlYWRkaXJTeW5jKENPTU1BTkRTX1BBVEgpXG4gICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGlzSlNGaWxlKGZpbGVOYW1lKSlcbiAgICAubWFwKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuc2xpY2UoMCwgLTMpKVxuKVxuXG5jb25zdCBsaXN0Q29tbWFuZHNTdHIgPSAoKSA9PlxuICBBcnJheS5mcm9tKGNvbW1hbmRzKVxuICAgIC5tYXAoXG4gICAgICAoJCkgPT4gYFxuICAqIG5weCBzZGsgJHskfWBcbiAgICApXG4gICAgLmpvaW4oJycpXG5cbmNvbnN0IGhhbmRsZUVycm9yID0gKGVycjogRXJyb3IpID0+IHtcbiAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBDbGlFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyXG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gIHByb2Nlc3MuZXhpdCgxKVxufVxuXG5jb25zdCB2YWxpZENvbW1hbmRGbnMgPSAoZm5zOiBGaWxlRm5zKTogZm5zIGlzIFJlcXVpcmVkPEZpbGVGbnM+ID0+IHtcbiAgY29uc3QgeyBoZWxwLCBkZWZhdWx0OiBfZGVmIH0gPSBmbnNcbiAgaWYgKCFoZWxwIHx8ICFfZGVmKSB7XG4gICAgdGhyb3cgbmV3IENsaUVycm9yKGBcbiAgICAgIENvbW1hbmQgZG9lcyBub3QgZm9sbG93IGltcGxlbWVudGF0aW9uIHJ1bGVzOlxuICAgICAgICAqIFJlcXVpcmVzIGEgXCJoZWxwXCIgZnVuY3Rpb25cbiAgICAgICAgKiBSZXF1aXJlcyBhIFwiZGVmYXVsdFwiIGZ1bmN0aW9uXG4gICAgYClcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBhcmdzID0gYXJnKHtcbiAgJy0taGVscCc6IEJvb2xlYW4sXG4gICctaCc6ICctLWhlbHAnXG59KVxuXG47KGFzeW5jICgpID0+IHtcbiAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MuYXJndlsyXVxuICBjb25zdCBuZWVkc0hlbHAgPSBhcmdzWyctLWhlbHAnXVxuXG4gIGlmICghY29tbWFuZHMuaGFzKGNvbW1hbmQpKSB7XG4gICAgaWYgKG5lZWRzSGVscCkge1xuICAgICAgY29uc29sZS5sb2coJ1RPRE86IGhlbHAgbWVzc2FnZScpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhyb3cgbmV3IENsaUVycm9yKGBJbnZhbGlkIGNvbW1hbmQuIFBvc3NpYmxlIGFyZTogJHtsaXN0Q29tbWFuZHNTdHIoKX1gKVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgY29uc3QgZm5zID0gcmVxdWlyZShyZXNvbHZlKENPTU1BTkRTX1BBVEgsIGNvbW1hbmQgKyBKU19FWFQpKVxuXG4gIGlmICh2YWxpZENvbW1hbmRGbnMoZm5zKSkge1xuICAgIG5lZWRzSGVscCA/IGF3YWl0IGZucy5oZWxwKCkgOiBhd2FpdCBmbnMuZGVmYXVsdCgpXG4gIH1cbn0pKCkuY2F0Y2goaGFuZGxlRXJyb3IpXG4iXX0=
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSx1Q0FBc0M7QUFDdEMsc0RBQTZCO0FBQzdCLHlDQUF3QztBQUN4QywrQ0FBNkQ7QUFlN0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFrQixFQUFFLEVBQUUsQ0FDN0MsUUFBUTtLQUNMLEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Y0FDQyxDQUFDLEVBQUUsQ0FDWjtLQUNBLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUViLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLGdCQUFRLENBQUMsRUFBRTtRQUM5QixhQUFHLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUE7S0FDM0U7SUFDRCxhQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pCLENBQUMsQ0FBQTtBQUVELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFnQixFQUFnQyxFQUFFO0lBQzVFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFBO0lBQzFCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDbEIsTUFBTSxJQUFJLGdCQUFRLENBQUM7OztLQUdsQixDQUFDLENBQUE7S0FDSDtJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyxDQUFBO0FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBQSxjQUFPLEdBQUUsQ0FBQTtBQUN0QixNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUN6QyxpQ0FBaUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBRTdEO0FBQUEsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxzQkFBVyxHQUFFLENBQUE7SUFFcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDL0IsSUFBSSxTQUFTLEVBQUU7WUFDYixhQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE9BQU07U0FDUDtRQUNELE1BQU0sSUFBSSxnQkFBUSxDQUFDLFdBQVcsT0FBTyxnQkFBZ0IsV0FBVyxFQUFFLENBQUMsQ0FBQTtLQUNwRTtJQUdELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLHdCQUFhLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUVsRCxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNsQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IGdldEFyZ3MgfSBmcm9tICcuL3V0aWxzL2FyZ3MnXG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJ1xuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgQ09NTUFORFNfUEFUSCwgZ2V0Q29tbWFuZHMgfSBmcm9tICcuL3V0aWxzL2NvbW1hbmRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICBhcmdzOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRBcmdzPlxufVxuXG4vLyBsZWF2aW5nIGFyZ3MgYXMgXCJhbnlcIiBzaW5jZSB3ZSBkb24ndCBrbm93IHlldCBpZiB3ZSB3aWxsIHVzZSB0aGVtXG50eXBlIEZpbGVGbiA9IChvcHRpb25zOiBPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG5cbmludGVyZmFjZSBGaWxlRXhwb3J0cyB7XG4gIGhlbHA/OiBGaWxlRm5cbiAgbWFpbj86IEZpbGVGblxuICBhcmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QXJncz5cbn1cblxuY29uc3QgbGlzdENvbW1hbmRzU3RyID0gKGNvbW1hbmRzOiBzdHJpbmdbXSkgPT5cbiAgY29tbWFuZHNcbiAgICAubWFwKFxuICAgICAgKCQpID0+IGBcbiAgKiBucHggc2RrICR7JH1gXG4gICAgKVxuICAgIC5qb2luKCcnKVxuXG5jb25zdCBoYW5kbGVFcnJvciA9IChlcnI6IENsaUVycm9yKSA9PiB7XG4gIGlmICghKGVyciBpbnN0YW5jZW9mIENsaUVycm9yKSkge1xuICAgIGxvZy53YXJuKGBEZXZlbG9wZXI6IEFsbCBlcnJvcnMgdGhyb3duIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgXCJDbGlFcnJvclwiYClcbiAgfVxuICBsb2cuZmFpbChlcnIubWVzc2FnZSlcbiAgcHJvY2Vzcy5leGl0KDEpXG59XG5cbmNvbnN0IGNvbW1hbmRGbnNBcmVWYWxpZCA9IChmbnM6IEZpbGVFeHBvcnRzKTogZm5zIGlzIFJlcXVpcmVkPEZpbGVFeHBvcnRzPiA9PiB7XG4gIGNvbnN0IHsgaGVscCwgbWFpbiB9ID0gZm5zXG4gIGlmICghaGVscCB8fCAhbWFpbikge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihgQ29tbWFuZCBkb2VzIG5vdCBmb2xsb3cgaW1wbGVtZW50YXRpb24gcnVsZXM6XG4gICAgICAqIFJlcXVpcmVzIGEgXCJoZWxwXCIgZnVuY3Rpb25cbiAgICAgICogUmVxdWlyZXMgYSBcIm1haW5cIiBmdW5jdGlvblxuICAgIGApXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgYXJncyA9IGdldEFyZ3MoKVxuY29uc3QgaGVscE1lc3NhZ2UgPSAoY29tbWFuZHM6IHN0cmluZ1tdKSA9PlxuICBgSGVyZSBpcyB0aGUgbGlzdCBvZiBjb21tYW5kczogJHtsaXN0Q29tbWFuZHNTdHIoY29tbWFuZHMpfWBcblxuOyhhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl1cbiAgY29uc3QgbmVlZHNIZWxwID0gYXJnc1snLS1oZWxwJ11cbiAgY29uc3QgY29tbWFuZHMgPSBhd2FpdCBnZXRDb21tYW5kcygpXG5cbiAgaWYgKCFjb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGlmIChuZWVkc0hlbHApIHtcbiAgICAgIGxvZy5pbmZvKGhlbHBNZXNzYWdlKGNvbW1hbmRzKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoYENvbW1hbmQgJHtjb21tYW5kfSBpcyBpbnZhbGlkLiAke2hlbHBNZXNzYWdlfWApXG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCBjbWQgPSByZXF1aXJlKGAke0NPTU1BTkRTX1BBVEh9LyR7Y29tbWFuZH1gKVxuXG4gIGlmIChjb21tYW5kRm5zQXJlVmFsaWQoY21kKSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IGFyZ3M6IGNtZC5hcmdzIH1cbiAgICBuZWVkc0hlbHAgPyBhd2FpdCBjbWQuaGVscChvcHRpb25zKSA6IGF3YWl0IGNtZC5tYWluKG9wdGlvbnMpXG4gIH1cbn0pKCkuY2F0Y2goaGFuZGxlRXJyb3IpXG4iXX0=
package/cli/index.ts CHANGED
@@ -1,77 +1,72 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import arg from 'arg'
4
- import { readdirSync } from 'fs'
5
- import { resolve } from 'path'
3
+ import { getArgs } from './utils/args'
4
+ import log from './utils/log'
5
+ import { CliError } from './utils/error'
6
+ import { COMMANDS_PATH, getCommands } from './utils/commands'
6
7
 
7
- import { CliError } from './error'
8
+ export interface Options {
9
+ args: ReturnType<typeof getArgs>
10
+ }
8
11
 
9
12
  // leaving args as "any" since we don't know yet if we will use them
10
- type FileFn = (...args: any) => Promise<void>
13
+ type FileFn = (options: Options) => Promise<void>
11
14
 
12
- interface FileFns {
15
+ interface FileExports {
13
16
  help?: FileFn
14
- default?: FileFn
17
+ main?: FileFn
18
+ args?: ReturnType<typeof getArgs>
15
19
  }
16
20
 
17
- const JS_EXT = '.js'
18
- const COMMANDS_PATH = resolve(__dirname, './commands')
19
-
20
- const isJSFile = (file: string): boolean => file.slice(-3) === JS_EXT
21
-
22
- const commands = new Set(
23
- readdirSync(COMMANDS_PATH)
24
- .filter((fileName) => isJSFile(fileName))
25
- .map((fileName) => fileName.slice(0, -3))
26
- )
27
-
28
- const listCommandsStr = () =>
29
- Array.from(commands)
21
+ const listCommandsStr = (commands: string[]) =>
22
+ commands
30
23
  .map(
31
24
  ($) => `
32
25
  * npx sdk ${$}`
33
26
  )
34
27
  .join('')
35
28
 
36
- const handleError = (err: Error) => {
37
- const error = err instanceof CliError ? err.message : err
38
- console.error(error)
29
+ const handleError = (err: CliError) => {
30
+ if (!(err instanceof CliError)) {
31
+ log.warn(`Developer: All errors thrown must be an instance of "CliError"`)
32
+ }
33
+ log.fail(err.message)
39
34
  process.exit(1)
40
35
  }
41
36
 
42
- const validCommandFns = (fns: FileFns): fns is Required<FileFns> => {
43
- const { help, default: _def } = fns
44
- if (!help || !_def) {
45
- throw new CliError(`
46
- Command does not follow implementation rules:
47
- * Requires a "help" function
48
- * Requires a "default" function
37
+ const commandFnsAreValid = (fns: FileExports): fns is Required<FileExports> => {
38
+ const { help, main } = fns
39
+ if (!help || !main) {
40
+ throw new CliError(`Command does not follow implementation rules:
41
+ * Requires a "help" function
42
+ * Requires a "main" function
49
43
  `)
50
44
  }
51
45
  return true
52
46
  }
53
47
 
54
- const args = arg({
55
- '--help': Boolean,
56
- '-h': '--help'
57
- })
48
+ const args = getArgs()
49
+ const helpMessage = (commands: string[]) =>
50
+ `Here is the list of commands: ${listCommandsStr(commands)}`
58
51
 
59
52
  ;(async () => {
60
53
  const command = process.argv[2]
61
54
  const needsHelp = args['--help']
55
+ const commands = await getCommands()
62
56
 
63
- if (!commands.has(command)) {
57
+ if (!commands.includes(command)) {
64
58
  if (needsHelp) {
65
- console.log('TODO: help message')
59
+ log.info(helpMessage(commands))
66
60
  return
67
61
  }
68
- throw new CliError(`Invalid command. Possible are: ${listCommandsStr()}`)
62
+ throw new CliError(`Command ${command} is invalid. ${helpMessage}`)
69
63
  }
70
64
 
71
65
  // eslint-disable-next-line @typescript-eslint/no-var-requires
72
- const fns = require(resolve(COMMANDS_PATH, command + JS_EXT))
66
+ const cmd = require(`${COMMANDS_PATH}/${command}`)
73
67
 
74
- if (validCommandFns(fns)) {
75
- needsHelp ? await fns.help() : await fns.default()
68
+ if (commandFnsAreValid(cmd)) {
69
+ const options = { args: cmd.args }
70
+ needsHelp ? await cmd.help(options) : await cmd.main(options)
76
71
  }
77
72
  })().catch(handleError)
@@ -0,0 +1,10 @@
1
+ import { Result } from 'arg';
2
+ export declare type Args = {
3
+ [key: string]: string | StringConstructor | NumberConstructor | BooleanConstructor;
4
+ };
5
+ export declare const DEFAULT_ARGS: {
6
+ '--help': BooleanConstructor;
7
+ '-h': string;
8
+ };
9
+ export declare function getArgs(): Result<typeof DEFAULT_ARGS>;
10
+ export declare function getArgs<T extends Args>(args: T): Result<typeof DEFAULT_ARGS & T>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getArgs = exports.DEFAULT_ARGS = void 0;
7
+ const arg_1 = __importDefault(require("arg"));
8
+ exports.DEFAULT_ARGS = {
9
+ '--help': Boolean,
10
+ '-h': '--help'
11
+ };
12
+ function getArgs(args) {
13
+ return (0, arg_1.default)({ ...exports.DEFAULT_ARGS, ...args }, { permissive: true });
14
+ }
15
+ exports.getArgs = getArgs;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFyZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQWlDO0FBWXBCLFFBQUEsWUFBWSxHQUFHO0lBQzFCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLElBQUksRUFBRSxRQUFRO0NBQ2YsQ0FBQTtBQU1ELFNBQWdCLE9BQU8sQ0FBaUIsSUFBUTtJQUM5QyxPQUFPLElBQUEsYUFBRyxFQUFDLEVBQUUsR0FBRyxvQkFBWSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRkQsMEJBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXJnLCB7IFJlc3VsdCB9IGZyb20gJ2FyZydcblxuZXhwb3J0IHR5cGUgQXJncyA9IHtcbiAgW2tleTogc3RyaW5nXTpcbiAgICB8IHN0cmluZ1xuICAgIHwgU3RyaW5nQ29uc3RydWN0b3JcbiAgICB8IE51bWJlckNvbnN0cnVjdG9yXG4gICAgfCBCb29sZWFuQ29uc3RydWN0b3Jcbn1cblxuLy8gdXBkYXRpbmcgdG8gVFMgNC45IHdpbGwgcHJldmVudCBsb3NpbmcgdHlwZXMgd2hlblxuLy8gZW5mb3JjaW5nIHR5cGUgdG8gYmUgXCJBcmdzXCIgYnkgdXNpbmcgXCJzYXRpc2ZpZXMgQXJnc1wiXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUkdTID0ge1xuICAnLS1oZWxwJzogQm9vbGVhbixcbiAgJy1oJzogJy0taGVscCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFyZ3MoKTogUmVzdWx0PHR5cGVvZiBERUZBVUxUX0FSR1M+XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJnczxUIGV4dGVuZHMgQXJncz4oXG4gIGFyZ3M6IFRcbik6IFJlc3VsdDx0eXBlb2YgREVGQVVMVF9BUkdTICYgVD5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcmdzPFQgZXh0ZW5kcyBBcmdzPihhcmdzPzogVCkge1xuICByZXR1cm4gYXJnKHsgLi4uREVGQVVMVF9BUkdTLCAuLi5hcmdzIH0sIHsgcGVybWlzc2l2ZTogdHJ1ZSB9KVxufVxuIl19
@@ -0,0 +1,24 @@
1
+ import arg, { Result } from 'arg'
2
+
3
+ export type Args = {
4
+ [key: string]:
5
+ | string
6
+ | StringConstructor
7
+ | NumberConstructor
8
+ | BooleanConstructor
9
+ }
10
+
11
+ // updating to TS 4.9 will prevent losing types when
12
+ // enforcing type to be "Args" by using "satisfies Args"
13
+ export const DEFAULT_ARGS = {
14
+ '--help': Boolean,
15
+ '-h': '--help'
16
+ }
17
+
18
+ export function getArgs(): Result<typeof DEFAULT_ARGS>
19
+ export function getArgs<T extends Args>(
20
+ args: T
21
+ ): Result<typeof DEFAULT_ARGS & T>
22
+ export function getArgs<T extends Args>(args?: T) {
23
+ return arg({ ...DEFAULT_ARGS, ...args }, { permissive: true })
24
+ }
@@ -0,0 +1,2 @@
1
+ export declare const COMMANDS_PATH: string;
2
+ export declare const getCommands: () => Promise<string[]>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCommands = exports.COMMANDS_PATH = void 0;
4
+ const path_1 = require("path");
5
+ const promises_1 = require("fs/promises");
6
+ const fs_1 = require("./fs");
7
+ const error_1 = require("./error");
8
+ exports.COMMANDS_PATH = (0, path_1.resolve)(__dirname, '../commands');
9
+ const getCommands = async () => {
10
+ const commandDirs = await (0, promises_1.readdir)(exports.COMMANDS_PATH);
11
+ const commands = commandDirs.map(async (dir) => {
12
+ const path = `${exports.COMMANDS_PATH}/${dir}`;
13
+ if (!(await (0, fs_1.isDirectory)(path))) {
14
+ throw new error_1.CliError('Developer: All commands must be inside a folder');
15
+ }
16
+ if (!(await (0, fs_1.isFile)(`${path}/index.js`))) {
17
+ throw new error_1.CliError('Developer: All commands must have an "index.js" file inside');
18
+ }
19
+ return dir;
20
+ });
21
+ return Promise.all(commands);
22
+ };
23
+ exports.getCommands = getCommands;
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21tYW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBOEI7QUFDOUIsMENBQXFDO0FBRXJDLDZCQUEwQztBQUMxQyxtQ0FBa0M7QUFFckIsUUFBQSxhQUFhLEdBQUcsSUFBQSxjQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0FBRXZELE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBdUIsRUFBRTtJQUN2RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsa0JBQU8sRUFBQyxxQkFBYSxDQUFDLENBQUE7SUFFaEQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDN0MsTUFBTSxJQUFJLEdBQUcsR0FBRyxxQkFBYSxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3RDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBQSxnQkFBVyxFQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLGdCQUFRLENBQUMsaURBQWlELENBQUMsQ0FBQTtTQUN0RTtRQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBQSxXQUFNLEVBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUU7WUFDdkMsTUFBTSxJQUFJLGdCQUFRLENBQ2hCLDZEQUE2RCxDQUM5RCxDQUFBO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQzlCLENBQUMsQ0FBQTtBQW5CWSxRQUFBLFdBQVcsZUFtQnZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyByZWFkZGlyIH0gZnJvbSAnZnMvcHJvbWlzZXMnXG5cbmltcG9ydCB7IGlzRGlyZWN0b3J5LCBpc0ZpbGUgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuL2Vycm9yJ1xuXG5leHBvcnQgY29uc3QgQ09NTUFORFNfUEFUSCA9IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vY29tbWFuZHMnKVxuXG5leHBvcnQgY29uc3QgZ2V0Q29tbWFuZHMgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBjb21tYW5kRGlycyA9IGF3YWl0IHJlYWRkaXIoQ09NTUFORFNfUEFUSClcblxuICBjb25zdCBjb21tYW5kcyA9IGNvbW1hbmREaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGAke0NPTU1BTkRTX1BBVEh9LyR7ZGlyfWBcbiAgICBpZiAoIShhd2FpdCBpc0RpcmVjdG9yeShwYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBDbGlFcnJvcignRGV2ZWxvcGVyOiBBbGwgY29tbWFuZHMgbXVzdCBiZSBpbnNpZGUgYSBmb2xkZXInKVxuICAgIH1cblxuICAgIGlmICghKGF3YWl0IGlzRmlsZShgJHtwYXRofS9pbmRleC5qc2ApKSkge1xuICAgICAgdGhyb3cgbmV3IENsaUVycm9yKFxuICAgICAgICAnRGV2ZWxvcGVyOiBBbGwgY29tbWFuZHMgbXVzdCBoYXZlIGFuIFwiaW5kZXguanNcIiBmaWxlIGluc2lkZSdcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyXG4gIH0pXG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzKVxufVxuIl19
@@ -0,0 +1,28 @@
1
+ import { resolve } from 'path'
2
+ import { readdir } from 'fs/promises'
3
+
4
+ import { isDirectory, isFile } from './fs'
5
+ import { CliError } from './error'
6
+
7
+ export const COMMANDS_PATH = resolve(__dirname, '../commands')
8
+
9
+ export const getCommands = async (): Promise<string[]> => {
10
+ const commandDirs = await readdir(COMMANDS_PATH)
11
+
12
+ const commands = commandDirs.map(async (dir) => {
13
+ const path = `${COMMANDS_PATH}/${dir}`
14
+ if (!(await isDirectory(path))) {
15
+ throw new CliError('Developer: All commands must be inside a folder')
16
+ }
17
+
18
+ if (!(await isFile(`${path}/index.js`))) {
19
+ throw new CliError(
20
+ 'Developer: All commands must have an "index.js" file inside'
21
+ )
22
+ }
23
+
24
+ return dir
25
+ })
26
+
27
+ return Promise.all(commands)
28
+ }
File without changes
File without changes
File without changes
@@ -0,0 +1,9 @@
1
+ export declare function createDirIfNotExists(path: string): Promise<void>;
2
+ export declare function ensureFolder(path: string | string[]): Promise<void>;
3
+ export declare function isDirectoryEmpty(dir: string): Promise<boolean>;
4
+ export declare function isDirectory(path: string): Promise<boolean>;
5
+ export declare function isFile(path: string): Promise<boolean>;
6
+ export declare function exists(path: string): Promise<boolean>;
7
+ export declare function download(url: string, dest: string): Promise<string>;
8
+ export declare function extract(path: string, dest: string): Promise<string>;
9
+ export declare function remove(path: string): Promise<void>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.remove = exports.extract = exports.download = exports.exists = exports.isFile = exports.isDirectory = exports.isDirectoryEmpty = exports.ensureFolder = exports.createDirIfNotExists = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const extract_zip_1 = __importDefault(require("extract-zip"));
9
+ const undici_1 = require("undici");
10
+ const _this = exports;
11
+ async function createDirIfNotExists(path) {
12
+ if (!path || (await _this.exists(path)))
13
+ return;
14
+ await promises_1.default.mkdir(path);
15
+ }
16
+ exports.createDirIfNotExists = createDirIfNotExists;
17
+ async function ensureFolder(path) {
18
+ if (!Array.isArray(path))
19
+ return _this.createDirIfNotExists(path);
20
+ if (path.length <= 1)
21
+ return _this.createDirIfNotExists(path[0]);
22
+ await _this.createDirIfNotExists(path[0]);
23
+ await _this.ensureFolder(path.slice(1));
24
+ }
25
+ exports.ensureFolder = ensureFolder;
26
+ async function isDirectoryEmpty(dir) {
27
+ const files = await promises_1.default.readdir(dir);
28
+ return !files.length;
29
+ }
30
+ exports.isDirectoryEmpty = isDirectoryEmpty;
31
+ async function isDirectory(path) {
32
+ return (await _this.exists(path)) && (await promises_1.default.lstat(path)).isDirectory();
33
+ }
34
+ exports.isDirectory = isDirectory;
35
+ async function isFile(path) {
36
+ return (await _this.exists(path)) && (await promises_1.default.lstat(path)).isFile();
37
+ }
38
+ exports.isFile = isFile;
39
+ async function exists(path) {
40
+ try {
41
+ await promises_1.default.access(path);
42
+ return true;
43
+ }
44
+ catch (_) {
45
+ return false;
46
+ }
47
+ }
48
+ exports.exists = exists;
49
+ async function download(url, dest) {
50
+ const data = await (await (0, undici_1.fetch)(url)).arrayBuffer();
51
+ await promises_1.default.writeFile(dest, Buffer.from(data));
52
+ return dest;
53
+ }
54
+ exports.download = download;
55
+ async function extract(path, dest) {
56
+ await (0, extract_zip_1.default)(path, { dir: dest });
57
+ return dest;
58
+ }
59
+ exports.extract = extract;
60
+ async function remove(path) {
61
+ await promises_1.default.rm(path);
62
+ }
63
+ exports.remove = remove;
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNEI7QUFDNUIsOERBQW9DO0FBQ3BDLG1DQUE4QjtBQUU5QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUE7QUFNZCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsSUFBWTtJQUNyRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTTtJQUMvQyxNQUFNLGtCQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFIRCxvREFHQztBQU1NLEtBQUssVUFBVSxZQUFZLENBQUMsSUFBdUI7SUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakUsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVoRSxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN6QyxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3pDLENBQUM7QUFORCxvQ0FNQztBQU1NLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXO0lBQ2hELE1BQU0sS0FBSyxHQUFHLE1BQU0sa0JBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUE7QUFDdEIsQ0FBQztBQUhELDRDQUdDO0FBTU0sS0FBSyxVQUFVLFdBQVcsQ0FBQyxJQUFZO0lBQzVDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sa0JBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUMzRSxDQUFDO0FBRkQsa0NBRUM7QUFNTSxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQVk7SUFDdkMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxrQkFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0FBQ3RFLENBQUM7QUFGRCx3QkFFQztBQU1NLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBWTtJQUN2QyxJQUFJO1FBQ0YsTUFBTSxrQkFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQixPQUFPLElBQUksQ0FBQTtLQUNaO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLEtBQUssQ0FBQTtLQUNiO0FBQ0gsQ0FBQztBQVBELHdCQU9DO0FBT00sS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFXLEVBQUUsSUFBWTtJQUd0RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFBLGNBQUssRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ25ELE1BQU0sa0JBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUMzQyxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFORCw0QkFNQztBQU9NLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDdEQsTUFBTSxJQUFBLHFCQUFVLEVBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDckMsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBSEQsMEJBR0M7QUFNTSxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQVk7SUFDdkMsTUFBTSxrQkFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNuQixDQUFDO0FBRkQsd0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnZnMvcHJvbWlzZXMnXG5pbXBvcnQgZXh0cmFjdFppcCBmcm9tICdleHRyYWN0LXppcCdcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJ1xuXG5jb25zdCBfdGhpcyA9IGV4cG9ydHNcblxuLyoqXG4gKiBDcmVhdGUncyBhIGRpcmVjdG9yeSBpZiBub3QgZXhpc3RzXG4gKiBAcGFyYW0gcGF0aCBOZXcgZGlyZWN0b3J5IHBhdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURpcklmTm90RXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXBhdGggfHwgKGF3YWl0IF90aGlzLmV4aXN0cyhwYXRoKSkpIHJldHVyblxuICBhd2FpdCBmcy5ta2RpcihwYXRoKVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZvbGRlciBleGlzdHMgYW5kIGNyZWF0ZXMgaXQgaWYgbmVjZXNzYXJ5LlxuICogQHBhcmFtIHBhdGggT25lIG9yIG11bHRpcGxlIHBhdGhzIHRvIGJlIGNoZWNrZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVGb2xkZXIocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSByZXR1cm4gX3RoaXMuY3JlYXRlRGlySWZOb3RFeGlzdHMocGF0aClcbiAgaWYgKHBhdGgubGVuZ3RoIDw9IDEpIHJldHVybiBfdGhpcy5jcmVhdGVEaXJJZk5vdEV4aXN0cyhwYXRoWzBdKVxuXG4gIGF3YWl0IF90aGlzLmNyZWF0ZURpcklmTm90RXhpc3RzKHBhdGhbMF0pXG4gIGF3YWl0IF90aGlzLmVuc3VyZUZvbGRlcihwYXRoLnNsaWNlKDEpKVxufVxuXG4vKipcbiAqIENoZWNrJ3MgaWYgZGlyZWN0b3J5IGlzIGVtcHR5XG4gKiBAcGFyYW0gZGlyIERpcmVjdG9yeSB0byBjaGVjayBmb3IgZW1wdHluZXNzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeUVtcHR5KGRpcjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIHJldHVybiAhZmlsZXMubGVuZ3RoXG59XG5cbi8qKlxuICogQ2hlY2sncyBpZiBwYXRoIGlzIGEgZGlyZWN0b3J5XG4gKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHNvbWUgZmlsZS9kaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRGlyZWN0b3J5KHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gKGF3YWl0IF90aGlzLmV4aXN0cyhwYXRoKSkgJiYgKGF3YWl0IGZzLmxzdGF0KHBhdGgpKS5pc0RpcmVjdG9yeSgpXG59XG5cbi8qKlxuICogQ2hlY2sncyBpZiBwYXRoIGlzIGEgZmlsZVxuICogQHBhcmFtIHBhdGggUGF0aCB0byBzb21lIGZpbGUvZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0ZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiAoYXdhaXQgX3RoaXMuZXhpc3RzKHBhdGgpKSAmJiAoYXdhaXQgZnMubHN0YXQocGF0aCkpLmlzRmlsZSgpXG59XG5cbi8qKlxuICogQ2hlY2sncyBpZiBkaXJlY3RvcnkgZXhpc3RzXG4gKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGNoZWNrIGZvciBleGlzdGVuY2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGF0aClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBEb3dubG9hZCBhIGZpbGVcbiAqIEBwYXJhbSB1cmwgVVJMIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0gZGVzdCBQYXRoIHRvIHdoZXJlIHRvIHNhdmUgdGhlIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkKHVybDogc3RyaW5nLCBkZXN0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgcGFja2FnZSBhbmQgdXNlIHRoZSBuYXRpdmUgXCJmZXRjaFwiIHdoZW4gTm9kZVxuICAvLyByZWxlYXNlcyBpdCBhcyBzdGFibGU6IGh0dHBzOi8vbm9kZWpzLm9yZy9kb2NzL2xhdGVzdC12MTgueC9hcGkvZ2xvYmFscy5odG1sI2ZldGNoXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCAoYXdhaXQgZmV0Y2godXJsKSkuYXJyYXlCdWZmZXIoKVxuICBhd2FpdCBmcy53cml0ZUZpbGUoZGVzdCwgQnVmZmVyLmZyb20oZGF0YSkpXG4gIHJldHVybiBkZXN0XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSAuemlwIGZpbGVcbiAqIEBwYXJhbSB1cmwgUGF0aCBvZiB0aGUgemlwIGZpbGVcbiAqIEBwYXJhbSBkZXN0IFBhdGggdG8gd2hlcmUgdG8gZXh0cmFjdCB0aGUgemlwIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3QocGF0aDogc3RyaW5nLCBkZXN0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBhd2FpdCBleHRyYWN0WmlwKHBhdGgsIHsgZGlyOiBkZXN0IH0pXG4gIHJldHVybiBkZXN0XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGZpbGVcbiAqIEBwYXJhbSB1cmwgUGF0aCB0byB0aGUgZmlsZSB0byBkZWxldGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucm0ocGF0aClcbn1cbiJdfQ==
@@ -0,0 +1,95 @@
1
+ import fs from 'fs/promises'
2
+ import extractZip from 'extract-zip'
3
+ import { fetch } from 'undici'
4
+
5
+ const _this = exports
6
+
7
+ /**
8
+ * Create's a directory if not exists
9
+ * @param path New directory path
10
+ */
11
+ export async function createDirIfNotExists(path: string): Promise<void> {
12
+ if (!path || (await _this.exists(path))) return
13
+ await fs.mkdir(path)
14
+ }
15
+
16
+ /**
17
+ * Checks if a folder exists and creates it if necessary.
18
+ * @param path One or multiple paths to be checked.
19
+ */
20
+ export async function ensureFolder(path: string | string[]): Promise<void> {
21
+ if (!Array.isArray(path)) return _this.createDirIfNotExists(path)
22
+ if (path.length <= 1) return _this.createDirIfNotExists(path[0])
23
+
24
+ await _this.createDirIfNotExists(path[0])
25
+ await _this.ensureFolder(path.slice(1))
26
+ }
27
+
28
+ /**
29
+ * Check's if directory is empty
30
+ * @param dir Directory to check for emptyness
31
+ */
32
+ export async function isDirectoryEmpty(dir: string): Promise<boolean> {
33
+ const files = await fs.readdir(dir)
34
+ return !files.length
35
+ }
36
+
37
+ /**
38
+ * Check's if path is a directory
39
+ * @param path Path to some file/directory
40
+ */
41
+ export async function isDirectory(path: string): Promise<boolean> {
42
+ return (await _this.exists(path)) && (await fs.lstat(path)).isDirectory()
43
+ }
44
+
45
+ /**
46
+ * Check's if path is a file
47
+ * @param path Path to some file/directory
48
+ */
49
+ export async function isFile(path: string): Promise<boolean> {
50
+ return (await _this.exists(path)) && (await fs.lstat(path)).isFile()
51
+ }
52
+
53
+ /**
54
+ * Check's if directory exists
55
+ * @param path Path to check for existence
56
+ */
57
+ export async function exists(path: string): Promise<boolean> {
58
+ try {
59
+ await fs.access(path)
60
+ return true
61
+ } catch (_) {
62
+ return false
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Download a file
68
+ * @param url URL of the file
69
+ * @param dest Path to where to save the file
70
+ */
71
+ export async function download(url: string, dest: string): Promise<string> {
72
+ // we should remove this package and use the native "fetch" when Node
73
+ // releases it as stable: https://nodejs.org/docs/latest-v18.x/api/globals.html#fetch
74
+ const data = await (await fetch(url)).arrayBuffer()
75
+ await fs.writeFile(dest, Buffer.from(data))
76
+ return dest
77
+ }
78
+
79
+ /**
80
+ * Extracts a .zip file
81
+ * @param url Path of the zip file
82
+ * @param dest Path to where to extract the zip file
83
+ */
84
+ export async function extract(path: string, dest: string): Promise<string> {
85
+ await extractZip(path, { dir: dest })
86
+ return dest
87
+ }
88
+
89
+ /**
90
+ * Removes a file
91
+ * @param url Path to the file to delete
92
+ */
93
+ export async function remove(path: string): Promise<void> {
94
+ await fs.rm(path)
95
+ }
@@ -0,0 +1,13 @@
1
+ export declare function raw(message: string): void;
2
+ export declare function fail(message: string): void;
3
+ export declare function warn(message: string): void;
4
+ export declare function info(message: string): void;
5
+ export declare function succeed(message: string): void;
6
+ declare const _default: {
7
+ raw: typeof raw;
8
+ fail: typeof fail;
9
+ warn: typeof warn;
10
+ info: typeof info;
11
+ succeed: typeof succeed;
12
+ };
13
+ export default _default;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.succeed = exports.info = exports.warn = exports.fail = exports.raw = void 0;
4
+ function raw(message) {
5
+ console.log(message);
6
+ }
7
+ exports.raw = raw;
8
+ function fail(message) {
9
+ console.log(`🔴 ${message}`);
10
+ }
11
+ exports.fail = fail;
12
+ function warn(message) {
13
+ console.log(`🟠 ${message}`);
14
+ }
15
+ exports.warn = warn;
16
+ function info(message) {
17
+ console.log(`🔵 ${message}`);
18
+ }
19
+ exports.info = info;
20
+ function succeed(message) {
21
+ console.log(`🟢 ${message}`);
22
+ }
23
+ exports.succeed = succeed;
24
+ exports.default = {
25
+ raw,
26
+ fail,
27
+ warn,
28
+ info,
29
+ succeed
30
+ };
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLFNBQWdCLEdBQUcsQ0FBQyxPQUFlO0lBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdEIsQ0FBQztBQUZELGtCQUVDO0FBRUQsU0FBZ0IsSUFBSSxDQUFDLE9BQWU7SUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUZELG9CQUVDO0FBRUQsU0FBZ0IsSUFBSSxDQUFDLE9BQWU7SUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUZELG9CQUVDO0FBRUQsU0FBZ0IsSUFBSSxDQUFDLE9BQWU7SUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUZELG9CQUVDO0FBRUQsU0FBZ0IsT0FBTyxDQUFDLE9BQWU7SUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUZELDBCQUVDO0FBRUQsa0JBQWU7SUFDYixHQUFHO0lBQ0gsSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osT0FBTztDQUNSLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcmF3KG1lc3NhZ2U6IHN0cmluZykge1xuICBjb25zb2xlLmxvZyhtZXNzYWdlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmFpbChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgY29uc29sZS5sb2coYPCflLQgJHttZXNzYWdlfWApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICBjb25zb2xlLmxvZyhg8J+foCAke21lc3NhZ2V9YClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XG4gIGNvbnNvbGUubG9nKGDwn5S1ICR7bWVzc2FnZX1gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VlZChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgY29uc29sZS5sb2coYPCfn6IgJHttZXNzYWdlfWApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcmF3LFxuICBmYWlsLFxuICB3YXJuLFxuICBpbmZvLFxuICBzdWNjZWVkXG59XG4iXX0=
@@ -0,0 +1,27 @@
1
+ export function raw(message: string) {
2
+ console.log(message)
3
+ }
4
+
5
+ export function fail(message: string) {
6
+ console.log(`🔴 ${message}`)
7
+ }
8
+
9
+ export function warn(message: string) {
10
+ console.log(`🟠 ${message}`)
11
+ }
12
+
13
+ export function info(message: string) {
14
+ console.log(`🔵 ${message}`)
15
+ }
16
+
17
+ export function succeed(message: string) {
18
+ console.log(`🟢 ${message}`)
19
+ }
20
+
21
+ export default {
22
+ raw,
23
+ fail,
24
+ warn,
25
+ info,
26
+ succeed
27
+ }
@@ -0,0 +1 @@
1
+ export declare function confirm(message: string): Promise<boolean>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.confirm = void 0;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ async function confirm(message) {
9
+ const { answer } = await inquirer_1.default.prompt({
10
+ name: 'answer',
11
+ message,
12
+ type: 'confirm'
13
+ });
14
+ return answer;
15
+ }
16
+ exports.confirm = confirm;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHJvbXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdEQUErQjtBQUV4QixLQUFLLFVBQVUsT0FBTyxDQUFDLE9BQWU7SUFDM0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sa0JBQVEsQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPO1FBQ1AsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQyxDQUFBO0lBRUYsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBUkQsMEJBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW5xdWlyZXIgZnJvbSAnaW5xdWlyZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25maXJtKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGFuc3dlciB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KHtcbiAgICBuYW1lOiAnYW5zd2VyJyxcbiAgICBtZXNzYWdlLFxuICAgIHR5cGU6ICdjb25maXJtJ1xuICB9KVxuXG4gIHJldHVybiBhbnN3ZXJcbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import inquirer from 'inquirer'
2
+
3
+ export async function confirm(message: string): Promise<boolean> {
4
+ const { answer } = await inquirer.prompt({
5
+ name: 'answer',
6
+ message,
7
+ type: 'confirm'
8
+ })
9
+
10
+ return answer
11
+ }
@@ -0,0 +1,15 @@
1
+ import { Ora } from 'ora';
2
+ import log from './log';
3
+ declare class Spinner {
4
+ spinner: Ora | typeof log;
5
+ constructor();
6
+ private log;
7
+ start(message: string): void;
8
+ stop(): void;
9
+ fail(message: string): void;
10
+ warn(message: string): void;
11
+ info(message: string): void;
12
+ succeed(message: string): void;
13
+ }
14
+ declare const spinner: Spinner;
15
+ export default spinner;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ora_1 = __importDefault(require("ora"));
7
+ const log_1 = __importDefault(require("./log"));
8
+ class Spinner {
9
+ constructor() {
10
+ if (!process.stdout.isTTY && process.env.DEBUG) {
11
+ this.spinner = log_1.default;
12
+ return;
13
+ }
14
+ this.spinner = (0, ora_1.default)();
15
+ }
16
+ log(method, message) {
17
+ const fn = this.spinner[method] || log_1.default.raw;
18
+ fn(message);
19
+ }
20
+ start(message) {
21
+ this.log('start', message);
22
+ }
23
+ stop() {
24
+ this.log('stop', '');
25
+ }
26
+ fail(message) {
27
+ this.log('fail', message);
28
+ }
29
+ warn(message) {
30
+ this.log('warn', message);
31
+ }
32
+ info(message) {
33
+ this.log('info', message);
34
+ }
35
+ succeed(message) {
36
+ this.log('succeed', message);
37
+ }
38
+ }
39
+ const spinner = new Spinner();
40
+ exports.default = spinner;
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNwaW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBOEI7QUFFOUIsZ0RBQXVCO0FBRXZCLE1BQU0sT0FBTztJQUdYO1FBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBRyxDQUFBO1lBQ2xCLE9BQU07U0FDUDtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSxhQUFHLEdBQUUsQ0FBQTtJQUN0QixDQUFDO0lBRU8sR0FBRyxDQUFDLE1BQWlCLEVBQUUsT0FBZTtRQUM1QyxNQUFNLEVBQUUsR0FBSSxJQUFJLENBQUMsT0FBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGFBQUcsQ0FBQyxHQUFHLENBQUE7UUFDbkQsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2IsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDdEIsQ0FBQztJQUNELElBQUksQ0FBQyxPQUFlO1FBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFDRCxJQUFJLENBQUMsT0FBZTtRQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMzQixDQUFDO0lBQ0QsSUFBSSxDQUFDLE9BQWU7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDM0IsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFlO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzlCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFN0Isa0JBQWUsT0FBTyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9yYSwgeyBPcmEgfSBmcm9tICdvcmEnXG5cbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnXG5cbmNsYXNzIFNwaW5uZXIge1xuICBzcGlubmVyOiBPcmEgfCB0eXBlb2YgbG9nXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCFwcm9jZXNzLnN0ZG91dC5pc1RUWSAmJiBwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgdGhpcy5zcGlubmVyID0gbG9nXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnNwaW5uZXIgPSBvcmEoKVxuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWV0aG9kOiBrZXlvZiBPcmEsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGNvbnN0IGZuID0gKHRoaXMuc3Bpbm5lciBhcyBhbnkpW21ldGhvZF0gfHwgbG9nLnJhd1xuICAgIGZuKG1lc3NhZ2UpXG4gIH1cblxuICBzdGFydChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvZygnc3RhcnQnLCBtZXNzYWdlKVxuICB9XG4gIHN0b3AoKSB7XG4gICAgdGhpcy5sb2coJ3N0b3AnLCAnJylcbiAgfVxuICBmYWlsKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMubG9nKCdmYWlsJywgbWVzc2FnZSlcbiAgfVxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMubG9nKCd3YXJuJywgbWVzc2FnZSlcbiAgfVxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSlcbiAgfVxuICBzdWNjZWVkKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMubG9nKCdzdWNjZWVkJywgbWVzc2FnZSlcbiAgfVxufVxuXG5jb25zdCBzcGlubmVyID0gbmV3IFNwaW5uZXIoKVxuXG5leHBvcnQgZGVmYXVsdCBzcGlubmVyXG4iXX0=
@@ -0,0 +1,44 @@
1
+ import ora, { Ora } from 'ora'
2
+
3
+ import log from './log'
4
+
5
+ class Spinner {
6
+ spinner: Ora | typeof log
7
+
8
+ constructor() {
9
+ if (!process.stdout.isTTY && process.env.DEBUG) {
10
+ this.spinner = log
11
+ return
12
+ }
13
+
14
+ this.spinner = ora()
15
+ }
16
+
17
+ private log(method: keyof Ora, message: string) {
18
+ const fn = (this.spinner as any)[method] || log.raw
19
+ fn(message)
20
+ }
21
+
22
+ start(message: string) {
23
+ this.log('start', message)
24
+ }
25
+ stop() {
26
+ this.log('stop', '')
27
+ }
28
+ fail(message: string) {
29
+ this.log('fail', message)
30
+ }
31
+ warn(message: string) {
32
+ this.log('warn', message)
33
+ }
34
+ info(message: string) {
35
+ this.log('info', message)
36
+ }
37
+ succeed(message: string) {
38
+ this.log('succeed', message)
39
+ }
40
+ }
41
+
42
+ const spinner = new Spinner()
43
+
44
+ export default spinner
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
- "version": "7.0.6-3840920714.commit-b9858ac",
3
+ "version": "7.0.6-3849904041.commit-fa1984a",
4
4
  "description": "",
5
5
  "main": "./index.js",
6
6
  "typings": "./index.d.ts",
@@ -20,14 +20,15 @@
20
20
  "author": "Decentraland",
21
21
  "license": "Apache-2.0",
22
22
  "dependencies": {
23
- "@dcl/dcl-rollup": "7.0.6-3840920714.commit-b9858ac",
24
- "@dcl/ecs": "7.0.6-3840920714.commit-b9858ac",
23
+ "@dcl/dcl-rollup": "7.0.6-3849904041.commit-fa1984a",
24
+ "@dcl/ecs": "7.0.6-3849904041.commit-fa1984a",
25
25
  "@dcl/ecs-math": "2.0.1-20221129185242.commit-40495c1",
26
- "@dcl/js-runtime": "7.0.6-3840920714.commit-b9858ac",
26
+ "@dcl/js-runtime": "7.0.6-3849904041.commit-fa1984a",
27
27
  "@dcl/kernel": "2.0.0-3766760530.commit-239d2a9",
28
- "@dcl/react-ecs": "7.0.6-3840920714.commit-b9858ac",
28
+ "@dcl/react-ecs": "7.0.6-3849904041.commit-fa1984a",
29
29
  "@dcl/unity-renderer": "1.0.68557-20221221195847.commit-f743b85",
30
- "arg": "5.0.2"
30
+ "arg": "5.0.2",
31
+ "ora": "6.1.2"
31
32
  },
32
33
  "minCliVersion": "3.14.1",
33
34
  "typedoc": {
@@ -36,5 +37,5 @@
36
37
  "displayName": "SDK",
37
38
  "tsconfig": "./tsconfig.json"
38
39
  },
39
- "commit": "b9858ac2ae7bdf38f3e109699c69cf24e95d7508"
40
+ "commit": "fa1984abd150e8fef64f425b04a94fe2da914e2d"
40
41
  }
File without changes
@@ -1,3 +0,0 @@
1
- "use strict";
2
- console.log('init');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zb2xlLmxvZygnaW5pdCcpXG4iXX0=
@@ -1 +0,0 @@
1
- console.log('init')