@dcl/sdk 7.0.6-3999809037.commit-0a47a3c → 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,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,53 +3,17 @@ 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
8
  const path_1 = require("path");
10
- const undici_1 = require("undici");
11
- const _this = exports;
12
- async function createDirIfNotExists(path) {
13
- if (!path || (await _this.exists(path)))
14
- return;
15
- await promises_1.default.mkdir(path);
16
- }
17
- exports.createDirIfNotExists = createDirIfNotExists;
18
- async function ensureFolder(path) {
19
- if (!Array.isArray(path))
20
- return _this.createDirIfNotExists(path);
21
- if (path.length <= 1)
22
- return _this.createDirIfNotExists(path[0]);
23
- await _this.createDirIfNotExists(path[0]);
24
- await _this.ensureFolder(path.slice(1));
25
- }
26
- exports.ensureFolder = ensureFolder;
27
- async function isDirectoryEmpty(dir) {
28
- const files = await promises_1.default.readdir(dir);
9
+ async function isDirectoryEmpty(components, dir) {
10
+ const files = await components.fs.readdir(dir);
29
11
  return !files.length;
30
12
  }
31
13
  exports.isDirectoryEmpty = isDirectoryEmpty;
32
- async function isDirectory(path) {
33
- return (await _this.exists(path)) && (await promises_1.default.lstat(path)).isDirectory();
34
- }
35
- exports.isDirectory = isDirectory;
36
- async function isFile(path) {
37
- return (await _this.exists(path)) && (await promises_1.default.lstat(path)).isFile();
38
- }
39
- exports.isFile = isFile;
40
- async function exists(path) {
41
- try {
42
- await promises_1.default.access(path);
43
- return true;
44
- }
45
- catch (_) {
46
- return false;
47
- }
48
- }
49
- exports.exists = exists;
50
- async function download(url, dest) {
51
- const data = await (await (0, undici_1.fetch)(url)).arrayBuffer();
52
- 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));
53
17
  return dest;
54
18
  }
55
19
  exports.download = download;
@@ -59,8 +23,4 @@ async function extract(path, dest) {
59
23
  return destPath;
60
24
  }
61
25
  exports.extract = extract;
62
- async function remove(path) {
63
- await promises_1.default.rm(path);
64
- }
65
- exports.remove = remove;
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNEI7QUFDNUIsOERBQW9DO0FBQ3BDLCtCQUE4QjtBQUM5QixtQ0FBOEI7QUFFOUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFBO0FBTWQsS0FBSyxVQUFVLG9CQUFvQixDQUFDLElBQVk7SUFDckQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU07SUFDL0MsTUFBTSxrQkFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN0QixDQUFDO0FBSEQsb0RBR0M7QUFNTSxLQUFLLFVBQVUsWUFBWSxDQUFDLElBQXVCO0lBQ3hELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFaEUsTUFBTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekMsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN6QyxDQUFDO0FBTkQsb0NBTUM7QUFNTSxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsR0FBVztJQUNoRCxNQUFNLEtBQUssR0FBRyxNQUFNLGtCQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFBO0FBQ3RCLENBQUM7QUFIRCw0Q0FHQztBQU1NLEtBQUssVUFBVSxXQUFXLENBQUMsSUFBWTtJQUM1QyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLGtCQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDM0UsQ0FBQztBQUZELGtDQUVDO0FBTU0sS0FBSyxVQUFVLE1BQU0sQ0FBQyxJQUFZO0lBQ3ZDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sa0JBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtBQUN0RSxDQUFDO0FBRkQsd0JBRUM7QUFNTSxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQVk7SUFDdkMsSUFBSTtRQUNGLE1BQU0sa0JBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckIsT0FBTyxJQUFJLENBQUE7S0FDWjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxLQUFLLENBQUE7S0FDYjtBQUNILENBQUM7QUFQRCx3QkFPQztBQU9NLEtBQUssVUFBVSxRQUFRLENBQUMsR0FBVyxFQUFFLElBQVk7SUFHdEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBQSxjQUFLLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRCxNQUFNLGtCQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDM0MsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBTkQsNEJBTUM7QUFPTSxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZO0lBQ3RELE1BQU0sUUFBUSxHQUFHLElBQUEsY0FBTyxFQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlCLE1BQU0sSUFBQSxxQkFBVSxFQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3pDLE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFKRCwwQkFJQztBQU1NLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBWTtJQUN2QyxNQUFNLGtCQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ25CLENBQUM7QUFGRCx3QkFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcy9wcm9taXNlcydcbmltcG9ydCBleHRyYWN0WmlwIGZyb20gJ2V4dHJhY3QtemlwJ1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3VuZGljaSdcblxuY29uc3QgX3RoaXMgPSBleHBvcnRzXG5cbi8qKlxuICogQ3JlYXRlJ3MgYSBkaXJlY3RvcnkgaWYgbm90IGV4aXN0c1xuICogQHBhcmFtIHBhdGggTmV3IGRpcmVjdG9yeSBwYXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEaXJJZk5vdEV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFwYXRoIHx8IChhd2FpdCBfdGhpcy5leGlzdHMocGF0aCkpKSByZXR1cm5cbiAgYXdhaXQgZnMubWtkaXIocGF0aClcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmb2xkZXIgZXhpc3RzIGFuZCBjcmVhdGVzIGl0IGlmIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSBwYXRoIE9uZSBvciBtdWx0aXBsZSBwYXRocyB0byBiZSBjaGVja2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRm9sZGVyKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkgcmV0dXJuIF90aGlzLmNyZWF0ZURpcklmTm90RXhpc3RzKHBhdGgpXG4gIGlmIChwYXRoLmxlbmd0aCA8PSAxKSByZXR1cm4gX3RoaXMuY3JlYXRlRGlySWZOb3RFeGlzdHMocGF0aFswXSlcblxuICBhd2FpdCBfdGhpcy5jcmVhdGVEaXJJZk5vdEV4aXN0cyhwYXRoWzBdKVxuICBhd2FpdCBfdGhpcy5lbnN1cmVGb2xkZXIocGF0aC5zbGljZSgxKSlcbn1cblxuLyoqXG4gKiBDaGVjaydzIGlmIGRpcmVjdG9yeSBpcyBlbXB0eVxuICogQHBhcmFtIGRpciBEaXJlY3RvcnkgdG8gY2hlY2sgZm9yIGVtcHR5bmVzc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNEaXJlY3RvcnlFbXB0eShkaXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKVxuICByZXR1cm4gIWZpbGVzLmxlbmd0aFxufVxuXG4vKipcbiAqIENoZWNrJ3MgaWYgcGF0aCBpcyBhIGRpcmVjdG9yeVxuICogQHBhcmFtIHBhdGggUGF0aCB0byBzb21lIGZpbGUvZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIChhd2FpdCBfdGhpcy5leGlzdHMocGF0aCkpICYmIChhd2FpdCBmcy5sc3RhdChwYXRoKSkuaXNEaXJlY3RvcnkoKVxufVxuXG4vKipcbiAqIENoZWNrJ3MgaWYgcGF0aCBpcyBhIGZpbGVcbiAqIEBwYXJhbSBwYXRoIFBhdGggdG8gc29tZSBmaWxlL2RpcmVjdG9yeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNGaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gKGF3YWl0IF90aGlzLmV4aXN0cyhwYXRoKSkgJiYgKGF3YWl0IGZzLmxzdGF0KHBhdGgpKS5pc0ZpbGUoKVxufVxuXG4vKipcbiAqIENoZWNrJ3MgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICogQHBhcmFtIHBhdGggUGF0aCB0byBjaGVjayBmb3IgZXhpc3RlbmNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuYWNjZXNzKHBhdGgpXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogRG93bmxvYWQgYSBmaWxlXG4gKiBAcGFyYW0gdXJsIFVSTCBvZiB0aGUgZmlsZVxuICogQHBhcmFtIGRlc3QgUGF0aCB0byB3aGVyZSB0byBzYXZlIHRoZSBmaWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3dubG9hZCh1cmw6IHN0cmluZywgZGVzdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gd2Ugc2hvdWxkIHJlbW92ZSB0aGlzIHBhY2thZ2UgYW5kIHVzZSB0aGUgbmF0aXZlIFwiZmV0Y2hcIiB3aGVuIE5vZGVcbiAgLy8gcmVsZWFzZXMgaXQgYXMgc3RhYmxlOiBodHRwczovL25vZGVqcy5vcmcvZG9jcy9sYXRlc3QtdjE4LngvYXBpL2dsb2JhbHMuaHRtbCNmZXRjaFxuICBjb25zdCBkYXRhID0gYXdhaXQgKGF3YWl0IGZldGNoKHVybCkpLmFycmF5QnVmZmVyKClcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGRlc3QsIEJ1ZmZlci5mcm9tKGRhdGEpKVxuICByZXR1cm4gZGVzdFxufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgLnppcCBmaWxlXG4gKiBAcGFyYW0gdXJsIFBhdGggb2YgdGhlIHppcCBmaWxlXG4gKiBAcGFyYW0gZGVzdCBQYXRoIHRvIHdoZXJlIHRvIGV4dHJhY3QgdGhlIHppcCBmaWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0KHBhdGg6IHN0cmluZywgZGVzdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGVzdFBhdGggPSByZXNvbHZlKGRlc3QpXG4gIGF3YWl0IGV4dHJhY3RaaXAocGF0aCwgeyBkaXI6IGRlc3RQYXRoIH0pXG4gIHJldHVybiBkZXN0UGF0aFxufVxuXG4vKipcbiAqIFJlbW92ZXMgYSBmaWxlXG4gKiBAcGFyYW0gdXJsIFBhdGggdG8gdGhlIGZpbGUgdG8gZGVsZXRlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmUocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnJtKHBhdGgpXG59XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBb0M7QUFDcEMsK0JBQThCO0FBUXZCLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsVUFBd0MsRUFDeEMsR0FBVztJQUVYLE1BQU0sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUE7QUFDdEIsQ0FBQztBQU5ELDRDQU1DO0FBT00sS0FBSyxVQUFVLFFBQVEsQ0FDNUIsVUFBZ0UsRUFDaEUsR0FBVyxFQUNYLElBQVk7SUFJWixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3BFLE1BQU0sVUFBVSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN0RCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFWRCw0QkFVQztBQU9NLEtBQUssVUFBVSxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFDOUIsTUFBTSxJQUFBLHFCQUFVLEVBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDekMsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUpELDBCQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGV4dHJhY3RaaXAgZnJvbSAnZXh0cmFjdC16aXAnXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IElGaWxlU3lzdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9mcydcbmltcG9ydCB7IElGZXRjaENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmV0Y2gnXG5cbi8qKlxuICogQ2hlY2sncyBpZiBkaXJlY3RvcnkgaXMgZW1wdHlcbiAqIEBwYXJhbSBkaXIgRGlyZWN0b3J5IHRvIGNoZWNrIGZvciBlbXB0eW5lc3NcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRGlyZWN0b3J5RW1wdHkoXG4gIGNvbXBvbmVudHM6IHsgZnM6IElGaWxlU3lzdGVtQ29tcG9uZW50IH0sXG4gIGRpcjogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBjb21wb25lbnRzLmZzLnJlYWRkaXIoZGlyKVxuICByZXR1cm4gIWZpbGVzLmxlbmd0aFxufVxuXG4vKipcbiAqIERvd25sb2FkIGEgZmlsZVxuICogQHBhcmFtIHVybCBVUkwgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSBkZXN0IFBhdGggdG8gd2hlcmUgdG8gc2F2ZSB0aGUgZmlsZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWQoXG4gIGNvbXBvbmVudHM6IHsgZnM6IElGaWxlU3lzdGVtQ29tcG9uZW50OyBmZXRjaDogSUZldGNoQ29tcG9uZW50IH0sXG4gIHVybDogc3RyaW5nLFxuICBkZXN0OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIHdlIHNob3VsZCByZW1vdmUgdGhpcyBwYWNrYWdlIGFuZCB1c2UgdGhlIG5hdGl2ZSBcImZldGNoXCIgd2hlbiBOb2RlXG4gIC8vIHJlbGVhc2VzIGl0IGFzIHN0YWJsZTogaHR0cHM6Ly9ub2RlanMub3JnL2RvY3MvbGF0ZXN0LXYxOC54L2FwaS9nbG9iYWxzLmh0bWwjZmV0Y2hcbiAgY29uc3QgZGF0YSA9IGF3YWl0IChhd2FpdCBjb21wb25lbnRzLmZldGNoLmZldGNoKHVybCkpLmFycmF5QnVmZmVyKClcbiAgYXdhaXQgY29tcG9uZW50cy5mcy53cml0ZUZpbGUoZGVzdCwgQnVmZmVyLmZyb20oZGF0YSkpXG4gIHJldHVybiBkZXN0XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSAuemlwIGZpbGVcbiAqIEBwYXJhbSB1cmwgUGF0aCBvZiB0aGUgemlwIGZpbGVcbiAqIEBwYXJhbSBkZXN0IFBhdGggdG8gd2hlcmUgdG8gZXh0cmFjdCB0aGUgemlwIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3QocGF0aDogc3RyaW5nLCBkZXN0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXN0UGF0aCA9IHJlc29sdmUoZGVzdClcbiAgYXdhaXQgZXh0cmFjdFppcChwYXRoLCB7IGRpcjogZGVzdFBhdGggfSlcbiAgcmV0dXJuIGRlc3RQYXRoXG59XG4iXX0=
package/cli/utils/fs.ts CHANGED
@@ -1,79 +1,34 @@
1
- import fs from 'fs/promises'
2
1
  import extractZip from 'extract-zip'
3
2
  import { resolve } from 'path'
4
- import { fetch } from 'undici'
5
-
6
- const _this = exports
7
-
8
- /**
9
- * Create's a directory if not exists
10
- * @param path New directory path
11
- */
12
- export async function createDirIfNotExists(path: string): Promise<void> {
13
- if (!path || (await _this.exists(path))) return
14
- await fs.mkdir(path)
15
- }
16
-
17
- /**
18
- * Checks if a folder exists and creates it if necessary.
19
- * @param path One or multiple paths to be checked.
20
- */
21
- export async function ensureFolder(path: string | string[]): Promise<void> {
22
- if (!Array.isArray(path)) return _this.createDirIfNotExists(path)
23
- if (path.length <= 1) return _this.createDirIfNotExists(path[0])
24
-
25
- await _this.createDirIfNotExists(path[0])
26
- await _this.ensureFolder(path.slice(1))
27
- }
3
+ import { IFileSystemComponent } from '../components/fs'
4
+ import { IFetchComponent } from '../components/fetch'
28
5
 
29
6
  /**
30
7
  * Check's if directory is empty
31
8
  * @param dir Directory to check for emptyness
32
9
  */
33
- export async function isDirectoryEmpty(dir: string): Promise<boolean> {
34
- 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)
35
15
  return !files.length
36
16
  }
37
17
 
38
- /**
39
- * Check's if path is a directory
40
- * @param path Path to some file/directory
41
- */
42
- export async function isDirectory(path: string): Promise<boolean> {
43
- return (await _this.exists(path)) && (await fs.lstat(path)).isDirectory()
44
- }
45
-
46
- /**
47
- * Check's if path is a file
48
- * @param path Path to some file/directory
49
- */
50
- export async function isFile(path: string): Promise<boolean> {
51
- return (await _this.exists(path)) && (await fs.lstat(path)).isFile()
52
- }
53
-
54
- /**
55
- * Check's if directory exists
56
- * @param path Path to check for existence
57
- */
58
- export async function exists(path: string): Promise<boolean> {
59
- try {
60
- await fs.access(path)
61
- return true
62
- } catch (_) {
63
- return false
64
- }
65
- }
66
-
67
18
  /**
68
19
  * Download a file
69
20
  * @param url URL of the file
70
21
  * @param dest Path to where to save the file
71
22
  */
72
- 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> {
73
28
  // we should remove this package and use the native "fetch" when Node
74
29
  // releases it as stable: https://nodejs.org/docs/latest-v18.x/api/globals.html#fetch
75
- const data = await (await fetch(url)).arrayBuffer()
76
- 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))
77
32
  return dest
78
33
  }
79
34
 
@@ -87,11 +42,3 @@ export async function extract(path: string, dest: string): Promise<string> {
87
42
  await extractZip(path, { dir: destPath })
88
43
  return destPath
89
44
  }
90
-
91
- /**
92
- * Removes a file
93
- * @param url Path to the file to delete
94
- */
95
- export async function remove(path: string): Promise<void> {
96
- await fs.rm(path)
97
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
- "version": "7.0.6-3999809037.commit-0a47a3c",
3
+ "version": "7.0.6-4006744889.commit-c6aff5f",
4
4
  "description": "",
5
5
  "main": "./index.js",
6
6
  "typings": "./index.d.ts",
@@ -20,12 +20,12 @@
20
20
  "author": "Decentraland",
21
21
  "license": "Apache-2.0",
22
22
  "dependencies": {
23
- "@dcl/dcl-rollup": "7.0.6-3999809037.commit-0a47a3c",
24
- "@dcl/ecs": "7.0.6-3999809037.commit-0a47a3c",
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-3999809037.commit-0a47a3c",
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-3999809037.commit-0a47a3c",
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
31
  "extract-zip": "2.0.1",
@@ -43,5 +43,5 @@
43
43
  "displayName": "SDK",
44
44
  "tsconfig": "./tsconfig.json"
45
45
  },
46
- "commit": "0a47a3c6e7e075d98d04c5ceab1eb8185c70bd9c"
46
+ "commit": "c6aff5f2e439d5af79c1e38d02ff90d3604670f3"
47
47
  }