@dcl/sdk 7.0.6-3991588905.commit-2387247 → 7.0.6-4006744889.commit-c6aff5f

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.
@@ -1,5 +1,7 @@
1
+ import { CliComponents } from '../../components';
1
2
  interface Options {
2
3
  args: typeof args;
4
+ components: Pick<CliComponents, 'fetch' | 'fs'>;
3
5
  }
4
6
  export declare const args: import("arg").Result<{
5
7
  '--help': BooleanConstructor;
@@ -16,7 +16,7 @@ async function help() { }
16
16
  exports.help = help;
17
17
  async function main(options) {
18
18
  const dir = (0, path_1.resolve)(process.cwd(), options.args['--dir'] || '.');
19
- const isEmpty = await (0, fs_1.isDirectoryEmpty)(dir);
19
+ const isEmpty = await (0, fs_1.isDirectoryEmpty)(options.components, dir);
20
20
  const yes = options.args['--yes'];
21
21
  if (!isEmpty && !yes) {
22
22
  const answer = await (0, prompt_1.confirm)('The folder specified is not empty, continue anyway?');
@@ -25,13 +25,13 @@ async function main(options) {
25
25
  }
26
26
  try {
27
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`));
28
+ const zip = await (0, fs_1.download)(options.components, (0, repos_1.get)(scene), (0, path_1.join)(dir, `${scene}.zip`));
29
29
  await (0, fs_1.extract)(zip, dir);
30
- await (0, fs_1.remove)(zip);
30
+ await options.components.fs.unlink(zip);
31
31
  }
32
32
  catch (e) {
33
33
  throw new error_1.CliError(e.message);
34
34
  }
35
35
  }
36
36
  exports.main = main;
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBb0M7QUFFcEMsNkNBQTRDO0FBQzVDLDJDQUEwQztBQUMxQywrQ0FBNEM7QUFDNUMsdUNBQTRFO0FBRTVFLG1DQUF3QztBQU0zQixRQUFBLElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQztJQUMxQixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUUsT0FBTztJQUNiLE9BQU8sRUFBRSxNQUFNO0NBQ2hCLENBQUMsQ0FBQTtBQUVLLEtBQUssVUFBVSxJQUFJLEtBQUksQ0FBQztBQUEvQixvQkFBK0I7QUFFeEIsS0FBSyxVQUFVLElBQUksQ0FBQyxPQUFnQjtJQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU8sRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtJQUNoRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEscUJBQWdCLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDM0MsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVqQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxnQkFBTyxFQUMxQixxREFBcUQsQ0FDdEQsQ0FBQTtRQUVELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTTtLQUNwQjtJQUVELElBQUk7UUFDRixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQTtRQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsYUFBUSxFQUFDLElBQUEsV0FBTyxFQUFDLEtBQUssQ0FBQyxFQUFFLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLElBQUEsWUFBTyxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUN2QixNQUFNLElBQUEsV0FBTSxFQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQ2xCO0lBQUMsT0FBTyxDQUFNLEVBQUU7UUFDZixNQUFNLElBQUksZ0JBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDOUI7QUFDSCxDQUFDO0FBckJELG9CQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tICdwYXRoJ1xuXG5pbXBvcnQgeyBDbGlFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgZ2V0QXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL2FyZ3MnXG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi4vLi4vdXRpbHMvcHJvbXB0J1xuaW1wb3J0IHsgaXNEaXJlY3RvcnlFbXB0eSwgZG93bmxvYWQsIGV4dHJhY3QsIHJlbW92ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2ZzJ1xuXG5pbXBvcnQgeyBnZXQgYXMgZ2V0UmVwbyB9IGZyb20gJy4vcmVwb3MnXG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgYXJnczogdHlwZW9mIGFyZ3Ncbn1cblxuZXhwb3J0IGNvbnN0IGFyZ3MgPSBnZXRBcmdzKHtcbiAgJy0teWVzJzogQm9vbGVhbixcbiAgJy15JzogJy0teWVzJyxcbiAgJy0tZGlyJzogU3RyaW5nXG59KVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGVscCgpIHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgY29uc3QgZGlyID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLmFyZ3NbJy0tZGlyJ10gfHwgJy4nKVxuICBjb25zdCBpc0VtcHR5ID0gYXdhaXQgaXNEaXJlY3RvcnlFbXB0eShkaXIpXG4gIGNvbnN0IHllcyA9IG9wdGlvbnMuYXJnc1snLS15ZXMnXVxuXG4gIGlmICghaXNFbXB0eSAmJiAheWVzKSB7XG4gICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY29uZmlybShcbiAgICAgICdUaGUgZm9sZGVyIHNwZWNpZmllZCBpcyBub3QgZW1wdHksIGNvbnRpbnVlIGFueXdheT8nXG4gICAgKVxuXG4gICAgaWYgKCFhbnN3ZXIpIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzY2VuZSA9ICdzY2VuZS10ZW1wbGF0ZSdcbiAgICBjb25zdCB6aXAgPSBhd2FpdCBkb3dubG9hZChnZXRSZXBvKHNjZW5lKSwgam9pbihkaXIsIGAke3NjZW5lfS56aXBgKSlcbiAgICBhd2FpdCBleHRyYWN0KHppcCwgZGlyKVxuICAgIGF3YWl0IHJlbW92ZSh6aXApXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihlLm1lc3NhZ2UpXG4gIH1cbn1cbiJdfQ==
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBb0M7QUFFcEMsNkNBQTRDO0FBQzVDLDJDQUEwQztBQUMxQywrQ0FBNEM7QUFFNUMsdUNBQW9FO0FBRXBFLG1DQUF3QztBQU8zQixRQUFBLElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQztJQUMxQixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUUsT0FBTztJQUNiLE9BQU8sRUFBRSxNQUFNO0NBQ2hCLENBQUMsQ0FBQTtBQUVLLEtBQUssVUFBVSxJQUFJLEtBQUksQ0FBQztBQUEvQixvQkFBK0I7QUFFeEIsS0FBSyxVQUFVLElBQUksQ0FBQyxPQUFnQjtJQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU8sRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtJQUNoRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEscUJBQWdCLEVBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUMvRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRWpDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLGdCQUFPLEVBQzFCLHFEQUFxRCxDQUN0RCxDQUFBO1FBRUQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFNO0tBQ3BCO0lBRUQsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFBO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxhQUFRLEVBQ3hCLE9BQU8sQ0FBQyxVQUFVLEVBQ2xCLElBQUEsV0FBTyxFQUFDLEtBQUssQ0FBQyxFQUNkLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssTUFBTSxDQUFDLENBQzFCLENBQUE7UUFDRCxNQUFNLElBQUEsWUFBTyxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUN2QixNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUN4QztJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsTUFBTSxJQUFJLGdCQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0tBQzlCO0FBQ0gsQ0FBQztBQXpCRCxvQkF5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAncGF0aCdcblxuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9lcnJvcidcbmltcG9ydCB7IGdldEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9hcmdzJ1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJy4uLy4uL3V0aWxzL3Byb21wdCdcbmltcG9ydCB7IENsaUNvbXBvbmVudHMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzJ1xuaW1wb3J0IHsgaXNEaXJlY3RvcnlFbXB0eSwgZG93bmxvYWQsIGV4dHJhY3QgfSBmcm9tICcuLi8uLi91dGlscy9mcydcblxuaW1wb3J0IHsgZ2V0IGFzIGdldFJlcG8gfSBmcm9tICcuL3JlcG9zJ1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGFyZ3M6IHR5cGVvZiBhcmdzXG4gIGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZldGNoJyB8ICdmcyc+XG59XG5cbmV4cG9ydCBjb25zdCBhcmdzID0gZ2V0QXJncyh7XG4gICctLXllcyc6IEJvb2xlYW4sXG4gICcteSc6ICctLXllcycsXG4gICctLWRpcic6IFN0cmluZ1xufSlcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlbHAoKSB7fVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFpbihvcHRpb25zOiBPcHRpb25zKSB7XG4gIGNvbnN0IGRpciA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgb3B0aW9ucy5hcmdzWyctLWRpciddIHx8ICcuJylcbiAgY29uc3QgaXNFbXB0eSA9IGF3YWl0IGlzRGlyZWN0b3J5RW1wdHkob3B0aW9ucy5jb21wb25lbnRzLCBkaXIpXG4gIGNvbnN0IHllcyA9IG9wdGlvbnMuYXJnc1snLS15ZXMnXVxuXG4gIGlmICghaXNFbXB0eSAmJiAheWVzKSB7XG4gICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY29uZmlybShcbiAgICAgICdUaGUgZm9sZGVyIHNwZWNpZmllZCBpcyBub3QgZW1wdHksIGNvbnRpbnVlIGFueXdheT8nXG4gICAgKVxuXG4gICAgaWYgKCFhbnN3ZXIpIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzY2VuZSA9ICdzY2VuZS10ZW1wbGF0ZSdcbiAgICBjb25zdCB6aXAgPSBhd2FpdCBkb3dubG9hZChcbiAgICAgIG9wdGlvbnMuY29tcG9uZW50cyxcbiAgICAgIGdldFJlcG8oc2NlbmUpLFxuICAgICAgam9pbihkaXIsIGAke3NjZW5lfS56aXBgKVxuICAgIClcbiAgICBhd2FpdCBleHRyYWN0KHppcCwgZGlyKVxuICAgIGF3YWl0IG9wdGlvbnMuY29tcG9uZW50cy5mcy51bmxpbmsoemlwKVxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoZS5tZXNzYWdlKVxuICB9XG59XG4iXX0=
@@ -3,12 +3,14 @@ import { join, resolve } from 'path'
3
3
  import { CliError } from '../../utils/error'
4
4
  import { getArgs } from '../../utils/args'
5
5
  import { confirm } from '../../utils/prompt'
6
- import { isDirectoryEmpty, download, extract, remove } from '../../utils/fs'
6
+ import { CliComponents } from '../../components'
7
+ import { isDirectoryEmpty, download, extract } from '../../utils/fs'
7
8
 
8
9
  import { get as getRepo } from './repos'
9
10
 
10
11
  interface Options {
11
12
  args: typeof args
13
+ components: Pick<CliComponents, 'fetch' | 'fs'>
12
14
  }
13
15
 
14
16
  export const args = getArgs({
@@ -21,7 +23,7 @@ export async function help() {}
21
23
 
22
24
  export async function main(options: Options) {
23
25
  const dir = resolve(process.cwd(), options.args['--dir'] || '.')
24
- const isEmpty = await isDirectoryEmpty(dir)
26
+ const isEmpty = await isDirectoryEmpty(options.components, dir)
25
27
  const yes = options.args['--yes']
26
28
 
27
29
  if (!isEmpty && !yes) {
@@ -34,9 +36,13 @@ export async function main(options: Options) {
34
36
 
35
37
  try {
36
38
  const scene = 'scene-template'
37
- const zip = await download(getRepo(scene), join(dir, `${scene}.zip`))
39
+ const zip = await download(
40
+ options.components,
41
+ getRepo(scene),
42
+ join(dir, `${scene}.zip`)
43
+ )
38
44
  await extract(zip, dir)
39
- await remove(zip)
45
+ await options.components.fs.unlink(zip)
40
46
  } catch (e: any) {
41
47
  throw new CliError(e.message)
42
48
  }
@@ -0,0 +1,5 @@
1
+ import * as undici from 'undici';
2
+ export type IFetchComponent = {
3
+ fetch(url: string, init?: undici.RequestInit): Promise<undici.Response>;
4
+ };
5
+ export declare function createFetchComponent(): IFetchComponent;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.createFetchComponent = void 0;
27
+ const undici = __importStar(require("undici"));
28
+ function createFetchComponent() {
29
+ return {
30
+ fetch: undici.fetch
31
+ };
32
+ }
33
+ exports.createFetchComponent = createFetchComponent;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmZXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFnQztBQU1oQyxTQUFnQixvQkFBb0I7SUFDbEMsT0FBTztRQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztLQUNwQixDQUFBO0FBQ0gsQ0FBQztBQUpELG9EQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdW5kaWNpIGZyb20gJ3VuZGljaSdcblxuZXhwb3J0IHR5cGUgSUZldGNoQ29tcG9uZW50ID0ge1xuICBmZXRjaCh1cmw6IHN0cmluZywgaW5pdD86IHVuZGljaS5SZXF1ZXN0SW5pdCk6IFByb21pc2U8dW5kaWNpLlJlc3BvbnNlPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmV0Y2hDb21wb25lbnQoKTogSUZldGNoQ29tcG9uZW50IHtcbiAgcmV0dXJuIHtcbiAgICBmZXRjaDogdW5kaWNpLmZldGNoXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import * as undici from 'undici'
2
+
3
+ export type IFetchComponent = {
4
+ fetch(url: string, init?: undici.RequestInit): Promise<undici.Response>
5
+ }
6
+
7
+ export function createFetchComponent(): IFetchComponent {
8
+ return {
9
+ fetch: undici.fetch
10
+ }
11
+ }
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import * as fs from 'fs';
4
+ import * as fsPromises from 'fs/promises';
5
+ export type IFileSystemComponent = Pick<typeof fs, 'createReadStream'> & Pick<typeof fs, 'createWriteStream'> & Pick<typeof fsPromises, 'access' | 'opendir' | 'stat' | 'unlink' | 'mkdir' | 'readdir' | 'readFile' | 'writeFile'> & {
6
+ constants: Pick<typeof fs.constants, 'F_OK' | 'R_OK'>;
7
+ } & {
8
+ existPath(path: string): Promise<boolean>;
9
+ };
10
+ export declare function createFsComponent(): IFileSystemComponent;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.createFsComponent = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const fsPromises = __importStar(require("fs/promises"));
29
+ async function existPath(path) {
30
+ try {
31
+ await fs.promises.access(path, fs.constants.F_OK | fs.constants.R_OK);
32
+ return true;
33
+ }
34
+ catch (error) {
35
+ return false;
36
+ }
37
+ }
38
+ function createFsComponent() {
39
+ return {
40
+ createReadStream: fs.createReadStream,
41
+ createWriteStream: fs.createWriteStream,
42
+ access: fsPromises.access,
43
+ writeFile: fsPromises.writeFile,
44
+ opendir: fsPromises.opendir,
45
+ stat: fsPromises.stat,
46
+ unlink: fsPromises.unlink,
47
+ mkdir: fsPromises.mkdir,
48
+ readdir: fsPromises.readdir,
49
+ readFile: fsPromises.readFile,
50
+ constants: {
51
+ F_OK: fs.constants.F_OK,
52
+ R_OK: fs.constants.R_OK
53
+ },
54
+ existPath
55
+ };
56
+ }
57
+ exports.createFsComponent = createFsComponent;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF3QjtBQUN4Qix3REFBeUM7QUF5QnpDLEtBQUssVUFBVSxTQUFTLENBQUMsSUFBWTtJQUNuQyxJQUFJO1FBQ0YsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyRSxPQUFPLElBQUksQ0FBQTtLQUNaO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLEtBQUssQ0FBQTtLQUNiO0FBQ0gsQ0FBQztBQUtELFNBQWdCLGlCQUFpQjtJQUMvQixPQUFPO1FBQ0wsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQjtRQUNyQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsaUJBQWlCO1FBQ3ZDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtRQUN6QixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7UUFDL0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO1FBQzNCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtRQUNyQixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07UUFDekIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7UUFDN0IsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUN2QixJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1NBQ3hCO1FBQ0QsU0FBUztLQUNWLENBQUE7QUFDSCxDQUFDO0FBbEJELDhDQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJ1xuaW1wb3J0ICogYXMgZnNQcm9taXNlcyBmcm9tICdmcy9wcm9taXNlcydcblxuLyoqXG4gKiBAcHVibGljXG4gKlxuICogVGhpcyBtYXkgYmUgbW92ZWQgdG8gd2VsbC1rbm93bi1jb21wb25lbnRzIGluIHRoZSBmdXR1cmVcbiAqL1xuZXhwb3J0IHR5cGUgSUZpbGVTeXN0ZW1Db21wb25lbnQgPSBQaWNrPHR5cGVvZiBmcywgJ2NyZWF0ZVJlYWRTdHJlYW0nPiAmXG4gIFBpY2s8dHlwZW9mIGZzLCAnY3JlYXRlV3JpdGVTdHJlYW0nPiAmXG4gIFBpY2s8XG4gICAgdHlwZW9mIGZzUHJvbWlzZXMsXG4gICAgfCAnYWNjZXNzJ1xuICAgIHwgJ29wZW5kaXInXG4gICAgfCAnc3RhdCdcbiAgICB8ICd1bmxpbmsnXG4gICAgfCAnbWtkaXInXG4gICAgfCAncmVhZGRpcidcbiAgICB8ICdyZWFkRmlsZSdcbiAgICB8ICd3cml0ZUZpbGUnXG4gID4gJiB7XG4gICAgY29uc3RhbnRzOiBQaWNrPHR5cGVvZiBmcy5jb25zdGFudHMsICdGX09LJyB8ICdSX09LJz5cbiAgfSAmIHtcbiAgICBleGlzdFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPlxuICB9XG5cbmFzeW5jIGZ1bmN0aW9uIGV4aXN0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MocGF0aCwgZnMuY29uc3RhbnRzLkZfT0sgfCBmcy5jb25zdGFudHMuUl9PSylcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnNDb21wb25lbnQoKTogSUZpbGVTeXN0ZW1Db21wb25lbnQge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZVJlYWRTdHJlYW06IGZzLmNyZWF0ZVJlYWRTdHJlYW0sXG4gICAgY3JlYXRlV3JpdGVTdHJlYW06IGZzLmNyZWF0ZVdyaXRlU3RyZWFtLFxuICAgIGFjY2VzczogZnNQcm9taXNlcy5hY2Nlc3MsXG4gICAgd3JpdGVGaWxlOiBmc1Byb21pc2VzLndyaXRlRmlsZSxcbiAgICBvcGVuZGlyOiBmc1Byb21pc2VzLm9wZW5kaXIsXG4gICAgc3RhdDogZnNQcm9taXNlcy5zdGF0LFxuICAgIHVubGluazogZnNQcm9taXNlcy51bmxpbmssXG4gICAgbWtkaXI6IGZzUHJvbWlzZXMubWtkaXIsXG4gICAgcmVhZGRpcjogZnNQcm9taXNlcy5yZWFkZGlyLFxuICAgIHJlYWRGaWxlOiBmc1Byb21pc2VzLnJlYWRGaWxlLFxuICAgIGNvbnN0YW50czoge1xuICAgICAgRl9PSzogZnMuY29uc3RhbnRzLkZfT0ssXG4gICAgICBSX09LOiBmcy5jb25zdGFudHMuUl9PS1xuICAgIH0sXG4gICAgZXhpc3RQYXRoXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,57 @@
1
+ import * as fs from 'fs'
2
+ import * as fsPromises from 'fs/promises'
3
+
4
+ /**
5
+ * @public
6
+ *
7
+ * This may be moved to well-known-components in the future
8
+ */
9
+ export type IFileSystemComponent = Pick<typeof fs, 'createReadStream'> &
10
+ Pick<typeof fs, 'createWriteStream'> &
11
+ Pick<
12
+ typeof fsPromises,
13
+ | 'access'
14
+ | 'opendir'
15
+ | 'stat'
16
+ | 'unlink'
17
+ | 'mkdir'
18
+ | 'readdir'
19
+ | 'readFile'
20
+ | 'writeFile'
21
+ > & {
22
+ constants: Pick<typeof fs.constants, 'F_OK' | 'R_OK'>
23
+ } & {
24
+ existPath(path: string): Promise<boolean>
25
+ }
26
+
27
+ async function existPath(path: string): Promise<boolean> {
28
+ try {
29
+ await fs.promises.access(path, fs.constants.F_OK | fs.constants.R_OK)
30
+ return true
31
+ } catch (error) {
32
+ return false
33
+ }
34
+ }
35
+
36
+ /**
37
+ * @public
38
+ */
39
+ export function createFsComponent(): IFileSystemComponent {
40
+ return {
41
+ createReadStream: fs.createReadStream,
42
+ createWriteStream: fs.createWriteStream,
43
+ access: fsPromises.access,
44
+ writeFile: fsPromises.writeFile,
45
+ opendir: fsPromises.opendir,
46
+ stat: fsPromises.stat,
47
+ unlink: fsPromises.unlink,
48
+ mkdir: fsPromises.mkdir,
49
+ readdir: fsPromises.readdir,
50
+ readFile: fsPromises.readFile,
51
+ constants: {
52
+ F_OK: fs.constants.F_OK,
53
+ R_OK: fs.constants.R_OK
54
+ },
55
+ existPath
56
+ }
57
+ }
@@ -0,0 +1,7 @@
1
+ import { IFetchComponent } from './fetch';
2
+ import { IFileSystemComponent } from './fs';
3
+ export type CliComponents = {
4
+ fs: IFileSystemComponent;
5
+ fetch: IFetchComponent;
6
+ };
7
+ export declare function initComponents(): CliComponents;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initComponents = void 0;
4
+ const fetch_1 = require("./fetch");
5
+ const fs_1 = require("./fs");
6
+ function initComponents() {
7
+ return {
8
+ fs: (0, fs_1.createFsComponent)(),
9
+ fetch: (0, fetch_1.createFetchComponent)()
10
+ };
11
+ }
12
+ exports.initComponents = initComponents;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBK0Q7QUFDL0QsNkJBQThEO0FBTzlELFNBQWdCLGNBQWM7SUFDNUIsT0FBTztRQUNMLEVBQUUsRUFBRSxJQUFBLHNCQUFpQixHQUFFO1FBQ3ZCLEtBQUssRUFBRSxJQUFBLDRCQUFvQixHQUFFO0tBQzlCLENBQUE7QUFDSCxDQUFDO0FBTEQsd0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVGZXRjaENvbXBvbmVudCwgSUZldGNoQ29tcG9uZW50IH0gZnJvbSAnLi9mZXRjaCdcbmltcG9ydCB7IGNyZWF0ZUZzQ29tcG9uZW50LCBJRmlsZVN5c3RlbUNvbXBvbmVudCB9IGZyb20gJy4vZnMnXG5cbmV4cG9ydCB0eXBlIENsaUNvbXBvbmVudHMgPSB7XG4gIGZzOiBJRmlsZVN5c3RlbUNvbXBvbmVudFxuICBmZXRjaDogSUZldGNoQ29tcG9uZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29tcG9uZW50cygpOiBDbGlDb21wb25lbnRzIHtcbiAgcmV0dXJuIHtcbiAgICBmczogY3JlYXRlRnNDb21wb25lbnQoKSxcbiAgICBmZXRjaDogY3JlYXRlRmV0Y2hDb21wb25lbnQoKVxuICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { createFetchComponent, IFetchComponent } from './fetch'
2
+ import { createFsComponent, IFileSystemComponent } from './fs'
3
+
4
+ export type CliComponents = {
5
+ fs: IFileSystemComponent
6
+ fetch: IFetchComponent
7
+ }
8
+
9
+ export function initComponents(): CliComponents {
10
+ return {
11
+ fs: createFsComponent(),
12
+ fetch: createFetchComponent()
13
+ }
14
+ }
package/cli/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { getArgs } from './utils/args';
3
+ import { CliComponents } from './components';
3
4
  export interface Options {
4
5
  args: ReturnType<typeof getArgs>;
6
+ components: CliComponents;
5
7
  }
package/cli/index.js CHANGED
@@ -8,6 +8,7 @@ const args_1 = require("./utils/args");
8
8
  const log_1 = __importDefault(require("./utils/log"));
9
9
  const error_1 = require("./utils/error");
10
10
  const commands_1 = require("./utils/commands");
11
+ const components_1 = require("./components");
11
12
  const listCommandsStr = (commands) => commands
12
13
  .map(($) => `
13
14
  * npx sdk ${$}`)
@@ -34,7 +35,8 @@ const helpMessage = (commands) => `Here is the list of commands: ${listCommandsS
34
35
  (async () => {
35
36
  const command = process.argv[2];
36
37
  const needsHelp = args['--help'];
37
- const commands = await (0, commands_1.getCommands)();
38
+ const components = (0, components_1.initComponents)();
39
+ const commands = await (0, commands_1.getCommands)(components);
38
40
  if (!commands.includes(command)) {
39
41
  if (needsHelp) {
40
42
  log_1.default.info(helpMessage(commands));
@@ -44,8 +46,8 @@ const helpMessage = (commands) => `Here is the list of commands: ${listCommandsS
44
46
  }
45
47
  const cmd = require(`${commands_1.COMMANDS_PATH}/${command}`);
46
48
  if (commandFnsAreValid(cmd)) {
47
- const options = { args: cmd.args };
49
+ const options = { args: cmd.args, components };
48
50
  needsHelp ? await cmd.help(options) : await cmd.main(options);
49
51
  }
50
52
  })().catch(handleError);
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSx1Q0FBc0M7QUFDdEMsc0RBQTZCO0FBQzdCLHlDQUF3QztBQUN4QywrQ0FBNkQ7QUFlN0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFrQixFQUFFLEVBQUUsQ0FDN0MsUUFBUTtLQUNMLEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Y0FDQyxDQUFDLEVBQUUsQ0FDWjtLQUNBLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUViLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLGdCQUFRLENBQUMsRUFBRTtRQUM5QixhQUFHLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUE7S0FDM0U7SUFDRCxhQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pCLENBQUMsQ0FBQTtBQUVELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFnQixFQUFnQyxFQUFFO0lBQzVFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFBO0lBQzFCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDbEIsTUFBTSxJQUFJLGdCQUFRLENBQUM7OztLQUdsQixDQUFDLENBQUE7S0FDSDtJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyxDQUFBO0FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBQSxjQUFPLEdBQUUsQ0FBQTtBQUN0QixNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUN6QyxpQ0FBaUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBRTdEO0FBQUEsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxzQkFBVyxHQUFFLENBQUE7SUFFcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDL0IsSUFBSSxTQUFTLEVBQUU7WUFDYixhQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE9BQU07U0FDUDtRQUNELE1BQU0sSUFBSSxnQkFBUSxDQUFDLFdBQVcsT0FBTyxnQkFBZ0IsV0FBVyxFQUFFLENBQUMsQ0FBQTtLQUNwRTtJQUdELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLHdCQUFhLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUVsRCxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNsQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IGdldEFyZ3MgfSBmcm9tICcuL3V0aWxzL2FyZ3MnXG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJ1xuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgQ09NTUFORFNfUEFUSCwgZ2V0Q29tbWFuZHMgfSBmcm9tICcuL3V0aWxzL2NvbW1hbmRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICBhcmdzOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRBcmdzPlxufVxuXG4vLyBsZWF2aW5nIGFyZ3MgYXMgXCJhbnlcIiBzaW5jZSB3ZSBkb24ndCBrbm93IHlldCBpZiB3ZSB3aWxsIHVzZSB0aGVtXG50eXBlIEZpbGVGbiA9IChvcHRpb25zOiBPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG5cbmludGVyZmFjZSBGaWxlRXhwb3J0cyB7XG4gIGhlbHA/OiBGaWxlRm5cbiAgbWFpbj86IEZpbGVGblxuICBhcmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QXJncz5cbn1cblxuY29uc3QgbGlzdENvbW1hbmRzU3RyID0gKGNvbW1hbmRzOiBzdHJpbmdbXSkgPT5cbiAgY29tbWFuZHNcbiAgICAubWFwKFxuICAgICAgKCQpID0+IGBcbiAgKiBucHggc2RrICR7JH1gXG4gICAgKVxuICAgIC5qb2luKCcnKVxuXG5jb25zdCBoYW5kbGVFcnJvciA9IChlcnI6IENsaUVycm9yKSA9PiB7XG4gIGlmICghKGVyciBpbnN0YW5jZW9mIENsaUVycm9yKSkge1xuICAgIGxvZy53YXJuKGBEZXZlbG9wZXI6IEFsbCBlcnJvcnMgdGhyb3duIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgXCJDbGlFcnJvclwiYClcbiAgfVxuICBsb2cuZmFpbChlcnIubWVzc2FnZSlcbiAgcHJvY2Vzcy5leGl0KDEpXG59XG5cbmNvbnN0IGNvbW1hbmRGbnNBcmVWYWxpZCA9IChmbnM6IEZpbGVFeHBvcnRzKTogZm5zIGlzIFJlcXVpcmVkPEZpbGVFeHBvcnRzPiA9PiB7XG4gIGNvbnN0IHsgaGVscCwgbWFpbiB9ID0gZm5zXG4gIGlmICghaGVscCB8fCAhbWFpbikge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihgQ29tbWFuZCBkb2VzIG5vdCBmb2xsb3cgaW1wbGVtZW50YXRpb24gcnVsZXM6XG4gICAgICAqIFJlcXVpcmVzIGEgXCJoZWxwXCIgZnVuY3Rpb25cbiAgICAgICogUmVxdWlyZXMgYSBcIm1haW5cIiBmdW5jdGlvblxuICAgIGApXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgYXJncyA9IGdldEFyZ3MoKVxuY29uc3QgaGVscE1lc3NhZ2UgPSAoY29tbWFuZHM6IHN0cmluZ1tdKSA9PlxuICBgSGVyZSBpcyB0aGUgbGlzdCBvZiBjb21tYW5kczogJHtsaXN0Q29tbWFuZHNTdHIoY29tbWFuZHMpfWBcblxuOyhhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl1cbiAgY29uc3QgbmVlZHNIZWxwID0gYXJnc1snLS1oZWxwJ11cbiAgY29uc3QgY29tbWFuZHMgPSBhd2FpdCBnZXRDb21tYW5kcygpXG5cbiAgaWYgKCFjb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGlmIChuZWVkc0hlbHApIHtcbiAgICAgIGxvZy5pbmZvKGhlbHBNZXNzYWdlKGNvbW1hbmRzKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoYENvbW1hbmQgJHtjb21tYW5kfSBpcyBpbnZhbGlkLiAke2hlbHBNZXNzYWdlfWApXG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCBjbWQgPSByZXF1aXJlKGAke0NPTU1BTkRTX1BBVEh9LyR7Y29tbWFuZH1gKVxuXG4gIGlmIChjb21tYW5kRm5zQXJlVmFsaWQoY21kKSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IGFyZ3M6IGNtZC5hcmdzIH1cbiAgICBuZWVkc0hlbHAgPyBhd2FpdCBjbWQuaGVscChvcHRpb25zKSA6IGF3YWl0IGNtZC5tYWluKG9wdGlvbnMpXG4gIH1cbn0pKCkuY2F0Y2goaGFuZGxlRXJyb3IpXG4iXX0=
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSx1Q0FBc0M7QUFDdEMsc0RBQTZCO0FBQzdCLHlDQUF3QztBQUN4QywrQ0FBNkQ7QUFDN0QsNkNBQTREO0FBZ0I1RCxNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUM3QyxRQUFRO0tBQ0wsR0FBRyxDQUNGLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztjQUNDLENBQUMsRUFBRSxDQUNaO0tBQ0EsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBRWIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUNwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksZ0JBQVEsQ0FBQyxFQUFFO1FBQzlCLGFBQUcsQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLENBQUMsQ0FBQTtLQUMzRTtJQUNELGFBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQWdCLEVBQWdDLEVBQUU7SUFDNUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUE7SUFDMUIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtRQUNsQixNQUFNLElBQUksZ0JBQVEsQ0FBQzs7O0tBR2xCLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDLENBQUE7QUFFRCxNQUFNLElBQUksR0FBRyxJQUFBLGNBQU8sR0FBRSxDQUFBO0FBQ3RCLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBa0IsRUFBRSxFQUFFLENBQ3pDLGlDQUFpQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FFN0Q7QUFBQSxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ1gsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEMsTUFBTSxVQUFVLEdBQWtCLElBQUEsMkJBQWMsR0FBRSxDQUFBO0lBRWxELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxzQkFBVyxFQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRTlDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQy9CLElBQUksU0FBUyxFQUFFO1lBQ2IsYUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUMvQixPQUFNO1NBQ1A7UUFDRCxNQUFNLElBQUksZ0JBQVEsQ0FBQyxXQUFXLE9BQU8sZ0JBQWdCLFdBQVcsRUFBRSxDQUFDLENBQUE7S0FDcEU7SUFHRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyx3QkFBYSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFFbEQsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMzQixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFBO1FBQzlDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDOUQ7QUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgZ2V0QXJncyB9IGZyb20gJy4vdXRpbHMvYXJncydcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnXG5pbXBvcnQgeyBDbGlFcnJvciB9IGZyb20gJy4vdXRpbHMvZXJyb3InXG5pbXBvcnQgeyBDT01NQU5EU19QQVRILCBnZXRDb21tYW5kcyB9IGZyb20gJy4vdXRpbHMvY29tbWFuZHMnXG5pbXBvcnQgeyBDbGlDb21wb25lbnRzLCBpbml0Q29tcG9uZW50cyB9IGZyb20gJy4vY29tcG9uZW50cydcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgYXJnczogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QXJncz5cbiAgY29tcG9uZW50czogQ2xpQ29tcG9uZW50c1xufVxuXG4vLyBsZWF2aW5nIGFyZ3MgYXMgXCJhbnlcIiBzaW5jZSB3ZSBkb24ndCBrbm93IHlldCBpZiB3ZSB3aWxsIHVzZSB0aGVtXG50eXBlIEZpbGVGbiA9IChvcHRpb25zOiBPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG5cbmludGVyZmFjZSBGaWxlRXhwb3J0cyB7XG4gIGhlbHA/OiBGaWxlRm5cbiAgbWFpbj86IEZpbGVGblxuICBhcmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QXJncz5cbn1cblxuY29uc3QgbGlzdENvbW1hbmRzU3RyID0gKGNvbW1hbmRzOiBzdHJpbmdbXSkgPT5cbiAgY29tbWFuZHNcbiAgICAubWFwKFxuICAgICAgKCQpID0+IGBcbiAgKiBucHggc2RrICR7JH1gXG4gICAgKVxuICAgIC5qb2luKCcnKVxuXG5jb25zdCBoYW5kbGVFcnJvciA9IChlcnI6IENsaUVycm9yKSA9PiB7XG4gIGlmICghKGVyciBpbnN0YW5jZW9mIENsaUVycm9yKSkge1xuICAgIGxvZy53YXJuKGBEZXZlbG9wZXI6IEFsbCBlcnJvcnMgdGhyb3duIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgXCJDbGlFcnJvclwiYClcbiAgfVxuICBsb2cuZmFpbChlcnIubWVzc2FnZSlcbiAgcHJvY2Vzcy5leGl0KDEpXG59XG5cbmNvbnN0IGNvbW1hbmRGbnNBcmVWYWxpZCA9IChmbnM6IEZpbGVFeHBvcnRzKTogZm5zIGlzIFJlcXVpcmVkPEZpbGVFeHBvcnRzPiA9PiB7XG4gIGNvbnN0IHsgaGVscCwgbWFpbiB9ID0gZm5zXG4gIGlmICghaGVscCB8fCAhbWFpbikge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihgQ29tbWFuZCBkb2VzIG5vdCBmb2xsb3cgaW1wbGVtZW50YXRpb24gcnVsZXM6XG4gICAgICAqIFJlcXVpcmVzIGEgXCJoZWxwXCIgZnVuY3Rpb25cbiAgICAgICogUmVxdWlyZXMgYSBcIm1haW5cIiBmdW5jdGlvblxuICAgIGApXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgYXJncyA9IGdldEFyZ3MoKVxuY29uc3QgaGVscE1lc3NhZ2UgPSAoY29tbWFuZHM6IHN0cmluZ1tdKSA9PlxuICBgSGVyZSBpcyB0aGUgbGlzdCBvZiBjb21tYW5kczogJHtsaXN0Q29tbWFuZHNTdHIoY29tbWFuZHMpfWBcblxuOyhhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl1cbiAgY29uc3QgbmVlZHNIZWxwID0gYXJnc1snLS1oZWxwJ11cbiAgY29uc3QgY29tcG9uZW50czogQ2xpQ29tcG9uZW50cyA9IGluaXRDb21wb25lbnRzKClcblxuICBjb25zdCBjb21tYW5kcyA9IGF3YWl0IGdldENvbW1hbmRzKGNvbXBvbmVudHMpXG5cbiAgaWYgKCFjb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGlmIChuZWVkc0hlbHApIHtcbiAgICAgIGxvZy5pbmZvKGhlbHBNZXNzYWdlKGNvbW1hbmRzKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoYENvbW1hbmQgJHtjb21tYW5kfSBpcyBpbnZhbGlkLiAke2hlbHBNZXNzYWdlfWApXG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCBjbWQgPSByZXF1aXJlKGAke0NPTU1BTkRTX1BBVEh9LyR7Y29tbWFuZH1gKVxuXG4gIGlmIChjb21tYW5kRm5zQXJlVmFsaWQoY21kKSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IGFyZ3M6IGNtZC5hcmdzLCBjb21wb25lbnRzIH1cbiAgICBuZWVkc0hlbHAgPyBhd2FpdCBjbWQuaGVscChvcHRpb25zKSA6IGF3YWl0IGNtZC5tYWluKG9wdGlvbnMpXG4gIH1cbn0pKCkuY2F0Y2goaGFuZGxlRXJyb3IpXG4iXX0=
package/cli/index.ts CHANGED
@@ -4,9 +4,11 @@ import { getArgs } from './utils/args'
4
4
  import log from './utils/log'
5
5
  import { CliError } from './utils/error'
6
6
  import { COMMANDS_PATH, getCommands } from './utils/commands'
7
+ import { CliComponents, initComponents } from './components'
7
8
 
8
9
  export interface Options {
9
10
  args: ReturnType<typeof getArgs>
11
+ components: CliComponents
10
12
  }
11
13
 
12
14
  // leaving args as "any" since we don't know yet if we will use them
@@ -52,7 +54,9 @@ const helpMessage = (commands: string[]) =>
52
54
  ;(async () => {
53
55
  const command = process.argv[2]
54
56
  const needsHelp = args['--help']
55
- const commands = await getCommands()
57
+ const components: CliComponents = initComponents()
58
+
59
+ const commands = await getCommands(components)
56
60
 
57
61
  if (!commands.includes(command)) {
58
62
  if (needsHelp) {
@@ -66,7 +70,7 @@ const helpMessage = (commands: string[]) =>
66
70
  const cmd = require(`${COMMANDS_PATH}/${command}`)
67
71
 
68
72
  if (commandFnsAreValid(cmd)) {
69
- const options = { args: cmd.args }
73
+ const options = { args: cmd.args, components }
70
74
  needsHelp ? await cmd.help(options) : await cmd.main(options)
71
75
  }
72
76
  })().catch(handleError)
@@ -1,5 +1,5 @@
1
1
  import { Result } from 'arg';
2
- export declare type Args = {
2
+ export type Args = {
3
3
  [key: string]: string | StringConstructor | NumberConstructor | BooleanConstructor;
4
4
  };
5
5
  export declare const DEFAULT_ARGS: {
@@ -1,2 +1,3 @@
1
+ import { CliComponents } from '../components';
1
2
  export declare const COMMANDS_PATH: string;
2
- export declare const getCommands: () => Promise<string[]>;
3
+ export declare const getCommands: ({ fs }: Pick<CliComponents, 'fs'>) => Promise<string[]>;
@@ -2,18 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getCommands = exports.COMMANDS_PATH = void 0;
4
4
  const path_1 = require("path");
5
- const promises_1 = require("fs/promises");
6
- const fs_1 = require("./fs");
7
5
  const error_1 = require("./error");
8
6
  exports.COMMANDS_PATH = (0, path_1.resolve)(__dirname, '../commands');
9
- const getCommands = async () => {
10
- const commandDirs = await (0, promises_1.readdir)(exports.COMMANDS_PATH);
7
+ const getCommands = async ({ fs }) => {
8
+ const commandDirs = await fs.readdir(exports.COMMANDS_PATH);
11
9
  const commands = commandDirs.map(async (dir) => {
12
10
  const path = `${exports.COMMANDS_PATH}/${dir}`;
13
- if (!(await (0, fs_1.isDirectory)(path))) {
11
+ const statDir = await fs.stat(path);
12
+ if (!statDir.isDirectory()) {
14
13
  throw new error_1.CliError('Developer: All commands must be inside a folder');
15
14
  }
16
- if (!(await (0, fs_1.isFile)(`${path}/index.js`))) {
15
+ const statIndex = await fs.stat(`${path}/index.js`);
16
+ if (!statIndex.isFile()) {
17
17
  throw new error_1.CliError('Developer: All commands must have an "index.js" file inside');
18
18
  }
19
19
  return dir;
@@ -21,4 +21,4 @@ const getCommands = async () => {
21
21
  return Promise.all(commands);
22
22
  };
23
23
  exports.getCommands = getCommands;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21tYW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBOEI7QUFDOUIsMENBQXFDO0FBRXJDLDZCQUEwQztBQUMxQyxtQ0FBa0M7QUFFckIsUUFBQSxhQUFhLEdBQUcsSUFBQSxjQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0FBRXZELE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBdUIsRUFBRTtJQUN2RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsa0JBQU8sRUFBQyxxQkFBYSxDQUFDLENBQUE7SUFFaEQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDN0MsTUFBTSxJQUFJLEdBQUcsR0FBRyxxQkFBYSxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3RDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBQSxnQkFBVyxFQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLGdCQUFRLENBQUMsaURBQWlELENBQUMsQ0FBQTtTQUN0RTtRQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBQSxXQUFNLEVBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUU7WUFDdkMsTUFBTSxJQUFJLGdCQUFRLENBQ2hCLDZEQUE2RCxDQUM5RCxDQUFBO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQzlCLENBQUMsQ0FBQTtBQW5CWSxRQUFBLFdBQVcsZUFtQnZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyByZWFkZGlyIH0gZnJvbSAnZnMvcHJvbWlzZXMnXG5cbmltcG9ydCB7IGlzRGlyZWN0b3J5LCBpc0ZpbGUgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuL2Vycm9yJ1xuXG5leHBvcnQgY29uc3QgQ09NTUFORFNfUEFUSCA9IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vY29tbWFuZHMnKVxuXG5leHBvcnQgY29uc3QgZ2V0Q29tbWFuZHMgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBjb21tYW5kRGlycyA9IGF3YWl0IHJlYWRkaXIoQ09NTUFORFNfUEFUSClcblxuICBjb25zdCBjb21tYW5kcyA9IGNvbW1hbmREaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGAke0NPTU1BTkRTX1BBVEh9LyR7ZGlyfWBcbiAgICBpZiAoIShhd2FpdCBpc0RpcmVjdG9yeShwYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBDbGlFcnJvcignRGV2ZWxvcGVyOiBBbGwgY29tbWFuZHMgbXVzdCBiZSBpbnNpZGUgYSBmb2xkZXInKVxuICAgIH1cblxuICAgIGlmICghKGF3YWl0IGlzRmlsZShgJHtwYXRofS9pbmRleC5qc2ApKSkge1xuICAgICAgdGhyb3cgbmV3IENsaUVycm9yKFxuICAgICAgICAnRGV2ZWxvcGVyOiBBbGwgY29tbWFuZHMgbXVzdCBoYXZlIGFuIFwiaW5kZXguanNcIiBmaWxlIGluc2lkZSdcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyXG4gIH0pXG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzKVxufVxuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21tYW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBOEI7QUFFOUIsbUNBQWtDO0FBRXJCLFFBQUEsYUFBYSxHQUFHLElBQUEsY0FBTyxFQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQTtBQUV2RCxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsRUFDaEMsRUFBRSxFQUN3QixFQUFxQixFQUFFO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxxQkFBYSxDQUFDLENBQUE7SUFFbkQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDN0MsTUFBTSxJQUFJLEdBQUcsR0FBRyxxQkFBYSxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRXRDLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sSUFBSSxnQkFBUSxDQUFDLGlEQUFpRCxDQUFDLENBQUE7U0FDdEU7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFBO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLGdCQUFRLENBQ2hCLDZEQUE2RCxDQUM5RCxDQUFBO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQzlCLENBQUMsQ0FBQTtBQXpCWSxRQUFBLFdBQVcsZUF5QnZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBDbGlDb21wb25lbnRzIH0gZnJvbSAnLi4vY29tcG9uZW50cydcbmltcG9ydCB7IENsaUVycm9yIH0gZnJvbSAnLi9lcnJvcidcblxuZXhwb3J0IGNvbnN0IENPTU1BTkRTX1BBVEggPSByZXNvbHZlKF9fZGlybmFtZSwgJy4uL2NvbW1hbmRzJylcblxuZXhwb3J0IGNvbnN0IGdldENvbW1hbmRzID0gYXN5bmMgKHtcbiAgZnNcbn06IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4pOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGNvbW1hbmREaXJzID0gYXdhaXQgZnMucmVhZGRpcihDT01NQU5EU19QQVRIKVxuXG4gIGNvbnN0IGNvbW1hbmRzID0gY29tbWFuZERpcnMubWFwKGFzeW5jIChkaXIpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYCR7Q09NTUFORFNfUEFUSH0vJHtkaXJ9YFxuXG4gICAgY29uc3Qgc3RhdERpciA9IGF3YWl0IGZzLnN0YXQocGF0aClcblxuICAgIGlmICghc3RhdERpci5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoJ0RldmVsb3BlcjogQWxsIGNvbW1hbmRzIG11c3QgYmUgaW5zaWRlIGEgZm9sZGVyJylcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0SW5kZXggPSBhd2FpdCBmcy5zdGF0KGAke3BhdGh9L2luZGV4LmpzYClcbiAgICBpZiAoIXN0YXRJbmRleC5pc0ZpbGUoKSkge1xuICAgICAgdGhyb3cgbmV3IENsaUVycm9yKFxuICAgICAgICAnRGV2ZWxvcGVyOiBBbGwgY29tbWFuZHMgbXVzdCBoYXZlIGFuIFwiaW5kZXguanNcIiBmaWxlIGluc2lkZSdcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyXG4gIH0pXG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzKVxufVxuIl19
@@ -1,21 +1,25 @@
1
1
  import { resolve } from 'path'
2
- import { readdir } from 'fs/promises'
3
-
4
- import { isDirectory, isFile } from './fs'
2
+ import { CliComponents } from '../components'
5
3
  import { CliError } from './error'
6
4
 
7
5
  export const COMMANDS_PATH = resolve(__dirname, '../commands')
8
6
 
9
- export const getCommands = async (): Promise<string[]> => {
10
- const commandDirs = await readdir(COMMANDS_PATH)
7
+ export const getCommands = async ({
8
+ fs
9
+ }: Pick<CliComponents, 'fs'>): Promise<string[]> => {
10
+ const commandDirs = await fs.readdir(COMMANDS_PATH)
11
11
 
12
12
  const commands = commandDirs.map(async (dir) => {
13
13
  const path = `${COMMANDS_PATH}/${dir}`
14
- if (!(await isDirectory(path))) {
14
+
15
+ const statDir = await fs.stat(path)
16
+
17
+ if (!statDir.isDirectory()) {
15
18
  throw new CliError('Developer: All commands must be inside a folder')
16
19
  }
17
20
 
18
- if (!(await isFile(`${path}/index.js`))) {
21
+ const statIndex = await fs.stat(`${path}/index.js`)
22
+ if (!statIndex.isFile()) {
19
23
  throw new CliError(
20
24
  'Developer: All commands must have an "index.js" file inside'
21
25
  )
package/cli/utils/fs.d.ts CHANGED
@@ -1,9 +1,10 @@
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>;
1
+ import { IFileSystemComponent } from '../components/fs';
2
+ import { IFetchComponent } from '../components/fetch';
3
+ export declare function isDirectoryEmpty(components: {
4
+ fs: IFileSystemComponent;
5
+ }, dir: string): Promise<boolean>;
6
+ export declare function download(components: {
7
+ fs: IFileSystemComponent;
8
+ fetch: IFetchComponent;
9
+ }, url: string, dest: string): Promise<string>;
8
10
  export declare function extract(path: string, dest: string): Promise<string>;
9
- export declare function remove(path: string): Promise<void>;
package/cli/utils/fs.js CHANGED
@@ -3,62 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
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"));
6
+ exports.extract = exports.download = exports.isDirectoryEmpty = void 0;
8
7
  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);
8
+ const path_1 = require("path");
9
+ async function isDirectoryEmpty(components, dir) {
10
+ const files = await components.fs.readdir(dir);
28
11
  return !files.length;
29
12
  }
30
13
  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));
14
+ async function download(components, url, dest) {
15
+ const data = await (await components.fetch.fetch(url)).arrayBuffer();
16
+ await components.fs.writeFile(dest, Buffer.from(data));
52
17
  return dest;
53
18
  }
54
19
  exports.download = download;
55
20
  async function extract(path, dest) {
56
- await (0, extract_zip_1.default)(path, { dir: dest });
57
- return dest;
21
+ const destPath = (0, path_1.resolve)(dest);
22
+ await (0, extract_zip_1.default)(path, { dir: destPath });
23
+ return destPath;
58
24
  }
59
25
  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==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBb0M7QUFDcEMsK0JBQThCO0FBUXZCLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsVUFBd0MsRUFDeEMsR0FBVztJQUVYLE1BQU0sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUE7QUFDdEIsQ0FBQztBQU5ELDRDQU1DO0FBT00sS0FBSyxVQUFVLFFBQVEsQ0FDNUIsVUFBZ0UsRUFDaEUsR0FBVyxFQUNYLElBQVk7SUFJWixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3BFLE1BQU0sVUFBVSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN0RCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFWRCw0QkFVQztBQU9NLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFDOUIsTUFBTSxJQUFBLHFCQUFVLEVBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDekMsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUpELDBCQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGV4dHJhY3RaaXAgZnJvbSAnZXh0cmFjdC16aXAnXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IElGaWxlU3lzdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9mcydcbmltcG9ydCB7IElGZXRjaENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmV0Y2gnXG5cbi8qKlxuICogQ2hlY2sncyBpZiBkaXJlY3RvcnkgaXMgZW1wdHlcbiAqIEBwYXJhbSBkaXIgRGlyZWN0b3J5IHRvIGNoZWNrIGZvciBlbXB0eW5lc3NcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRGlyZWN0b3J5RW1wdHkoXG4gIGNvbXBvbmVudHM6IHsgZnM6IElGaWxlU3lzdGVtQ29tcG9uZW50IH0sXG4gIGRpcjogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBjb21wb25lbnRzLmZzLnJlYWRkaXIoZGlyKVxuICByZXR1cm4gIWZpbGVzLmxlbmd0aFxufVxuXG4vKipcbiAqIERvd25sb2FkIGEgZmlsZVxuICogQHBhcmFtIHVybCBVUkwgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSBkZXN0IFBhdGggdG8gd2hlcmUgdG8gc2F2ZSB0aGUgZmlsZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWQoXG4gIGNvbXBvbmVudHM6IHsgZnM6IElGaWxlU3lzdGVtQ29tcG9uZW50OyBmZXRjaDogSUZldGNoQ29tcG9uZW50IH0sXG4gIHVybDogc3RyaW5nLFxuICBkZXN0OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIHdlIHNob3VsZCByZW1vdmUgdGhpcyBwYWNrYWdlIGFuZCB1c2UgdGhlIG5hdGl2ZSBcImZldGNoXCIgd2hlbiBOb2RlXG4gIC8vIHJlbGVhc2VzIGl0IGFzIHN0YWJsZTogaHR0cHM6Ly9ub2RlanMub3JnL2RvY3MvbGF0ZXN0LXYxOC54L2FwaS9nbG9iYWxzLmh0bWwjZmV0Y2hcbiAgY29uc3QgZGF0YSA9IGF3YWl0IChhd2FpdCBjb21wb25lbnRzLmZldGNoLmZldGNoKHVybCkpLmFycmF5QnVmZmVyKClcbiAgYXdhaXQgY29tcG9uZW50cy5mcy53cml0ZUZpbGUoZGVzdCwgQnVmZmVyLmZyb20oZGF0YSkpXG4gIHJldHVybiBkZXN0XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSAuemlwIGZpbGVcbiAqIEBwYXJhbSB1cmwgUGF0aCBvZiB0aGUgemlwIGZpbGVcbiAqIEBwYXJhbSBkZXN0IFBhdGggdG8gd2hlcmUgdG8gZXh0cmFjdCB0aGUgemlwIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3QocGF0aDogc3RyaW5nLCBkZXN0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXN0UGF0aCA9IHJlc29sdmUoZGVzdClcbiAgYXdhaXQgZXh0cmFjdFppcChwYXRoLCB7IGRpcjogZGVzdFBhdGggfSlcbiAgcmV0dXJuIGRlc3RQYXRoXG59XG4iXX0=
package/cli/utils/fs.ts CHANGED
@@ -1,78 +1,34 @@
1
- import fs from 'fs/promises'
2
1
  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
- }
2
+ import { resolve } from 'path'
3
+ import { IFileSystemComponent } from '../components/fs'
4
+ import { IFetchComponent } from '../components/fetch'
27
5
 
28
6
  /**
29
7
  * Check's if directory is empty
30
8
  * @param dir Directory to check for emptyness
31
9
  */
32
- export async function isDirectoryEmpty(dir: string): Promise<boolean> {
33
- const files = await fs.readdir(dir)
10
+ export async function isDirectoryEmpty(
11
+ components: { fs: IFileSystemComponent },
12
+ dir: string
13
+ ): Promise<boolean> {
14
+ const files = await components.fs.readdir(dir)
34
15
  return !files.length
35
16
  }
36
17
 
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
18
  /**
67
19
  * Download a file
68
20
  * @param url URL of the file
69
21
  * @param dest Path to where to save the file
70
22
  */
71
- export async function download(url: string, dest: string): Promise<string> {
23
+ export async function download(
24
+ components: { fs: IFileSystemComponent; fetch: IFetchComponent },
25
+ url: string,
26
+ dest: string
27
+ ): Promise<string> {
72
28
  // we should remove this package and use the native "fetch" when Node
73
29
  // 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))
30
+ const data = await (await components.fetch.fetch(url)).arrayBuffer()
31
+ await components.fs.writeFile(dest, Buffer.from(data))
76
32
  return dest
77
33
  }
78
34
 
@@ -82,14 +38,7 @@ export async function download(url: string, dest: string): Promise<string> {
82
38
  * @param dest Path to where to extract the zip file
83
39
  */
84
40
  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)
41
+ const destPath = resolve(dest)
42
+ await extractZip(path, { dir: destPath })
43
+ return destPath
95
44
  }
@@ -6,7 +6,7 @@ export interface SendAsyncRequest {
6
6
  method: string;
7
7
  jsonParams: string;
8
8
  }
9
- export declare type RPCSendableMessage = {
9
+ export type RPCSendableMessage = {
10
10
  jsonrpc: '2.0';
11
11
  id: number;
12
12
  method: string;
@@ -15,7 +15,7 @@ export declare type RPCSendableMessage = {
15
15
  export interface MessageDict {
16
16
  [key: string]: string;
17
17
  }
18
- export declare type SendAsyncType = (params: SendAsyncRequest) => Promise<SendAsyncResponse>;
18
+ export type SendAsyncType = (params: SendAsyncRequest) => Promise<SendAsyncResponse>;
19
19
  export declare function getEthereumProvider(sendAsync: SendAsyncType): {
20
20
  send(message: RPCSendableMessage, callback?: ((error: Error | null, result?: any) => void) | undefined): void;
21
21
  sendAsync(message: RPCSendableMessage, callback: (error: Error | null, result?: any) => void): void;
@@ -1,7 +1,7 @@
1
1
  /// <reference types="@dcl/js-runtime" />
2
2
  import { Transport } from '@dcl/ecs';
3
3
  import type { CrdtSendToRendererRequest, CrdtSendToResponse } from '~system/EngineApi';
4
- export declare type EngineApiForTransport = {
4
+ export type EngineApiForTransport = {
5
5
  crdtSendToRenderer(body: CrdtSendToRendererRequest): Promise<CrdtSendToResponse>;
6
6
  };
7
7
  export declare function createRendererTransport(engineApi: EngineApiForTransport): Transport;
package/observables.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Observable } from './internal/Observable';
2
2
  import { QuaternionType, Vector3Type } from '@dcl/ecs';
3
- export declare type InputEventResult = {
3
+ export type InputEventResult = {
4
4
  origin: Vector3Type;
5
5
  direction: Vector3Type;
6
6
  buttonId: number;
@@ -13,15 +13,15 @@ export declare type InputEventResult = {
13
13
  entityId: unknown;
14
14
  };
15
15
  };
16
- export declare type GlobalInputEventResult = InputEventResult & {
16
+ export type GlobalInputEventResult = InputEventResult & {
17
17
  type: 0 | 1;
18
18
  };
19
- export declare type RaycastResponsePayload<T> = {
19
+ export type RaycastResponsePayload<T> = {
20
20
  queryId: string;
21
21
  queryType: string;
22
22
  payload: T;
23
23
  };
24
- export declare type GizmoDragEndEvent = {
24
+ export type GizmoDragEndEvent = {
25
25
  type: 'gizmoDragEnded';
26
26
  transforms: Array<{
27
27
  position: Vector3Type;
@@ -30,13 +30,13 @@ export declare type GizmoDragEndEvent = {
30
30
  entityId: unknown;
31
31
  }>;
32
32
  };
33
- export declare type GizmoSelectedEvent = {
33
+ export type GizmoSelectedEvent = {
34
34
  type: 'gizmoSelected';
35
35
  gizmoType: 'MOVE' | 'ROTATE' | 'SCALE' | 'NONE';
36
36
  entities: string[];
37
37
  };
38
- export declare type IEventNames = keyof IEvents;
39
- export declare type EngineEvent<T extends IEventNames = IEventNames, V = IEvents[T]> = {
38
+ export type IEventNames = keyof IEvents;
39
+ export type EngineEvent<T extends IEventNames = IEventNames, V = IEvents[T]> = {
40
40
  type: T;
41
41
  data: Readonly<V>;
42
42
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
- "version": "7.0.6-3991588905.commit-2387247",
3
+ "version": "7.0.6-4006744889.commit-c6aff5f",
4
4
  "description": "",
5
5
  "main": "./index.js",
6
6
  "typings": "./index.d.ts",
@@ -20,15 +20,21 @@
20
20
  "author": "Decentraland",
21
21
  "license": "Apache-2.0",
22
22
  "dependencies": {
23
- "@dcl/dcl-rollup": "7.0.6-3991588905.commit-2387247",
24
- "@dcl/ecs": "7.0.6-3991588905.commit-2387247",
23
+ "@dcl/dcl-rollup": "7.0.6-4006744889.commit-c6aff5f",
24
+ "@dcl/ecs": "7.0.6-4006744889.commit-c6aff5f",
25
25
  "@dcl/ecs-math": "2.0.1-20221129185242.commit-40495c1",
26
- "@dcl/js-runtime": "7.0.6-3991588905.commit-2387247",
26
+ "@dcl/js-runtime": "7.0.6-4006744889.commit-c6aff5f",
27
27
  "@dcl/kernel": "2.0.0-3766760530.commit-239d2a9",
28
- "@dcl/react-ecs": "7.0.6-3991588905.commit-2387247",
28
+ "@dcl/react-ecs": "7.0.6-4006744889.commit-c6aff5f",
29
29
  "@dcl/unity-renderer": "1.0.68557-20221221195847.commit-f743b85",
30
30
  "arg": "5.0.2",
31
- "ora": "6.1.2"
31
+ "extract-zip": "2.0.1",
32
+ "inquirer": "^8.2.5",
33
+ "ora": "6.1.2",
34
+ "undici": "^5.14.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/inquirer": "^8.2.5"
32
38
  },
33
39
  "minCliVersion": "3.14.1",
34
40
  "typedoc": {
@@ -37,5 +43,5 @@
37
43
  "displayName": "SDK",
38
44
  "tsconfig": "./tsconfig.json"
39
45
  },
40
- "commit": "23872474e21fa2a754898685200f5763211b5f90"
46
+ "commit": "c6aff5f2e439d5af79c1e38d02ff90d3604670f3"
41
47
  }