@dcl/sdk 7.0.6-3999809037.commit-0a47a3c → 7.0.6-4009020955.commit-08722f5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/cli/commands/build/helpers.d.ts +25 -0
  2. package/cli/commands/build/helpers.js +50 -0
  3. package/cli/commands/build/helpers.ts +95 -0
  4. package/cli/commands/build/index.d.ts +19 -0
  5. package/cli/commands/build/index.js +64 -0
  6. package/cli/commands/build/index.ts +91 -0
  7. package/cli/commands/init/index.d.ts +3 -1
  8. package/cli/commands/init/index.js +9 -15
  9. package/cli/commands/init/index.ts +12 -16
  10. package/cli/commands/init/repos.js +1 -1
  11. package/cli/commands/init/repos.ts +1 -2
  12. package/cli/commands/preview/bff.d.ts +3 -0
  13. package/cli/commands/preview/bff.js +50 -0
  14. package/cli/commands/preview/bff.ts +59 -0
  15. package/cli/commands/preview/catalyst.d.ts +5 -0
  16. package/cli/commands/preview/catalyst.js +24 -0
  17. package/cli/commands/preview/catalyst.ts +31 -0
  18. package/cli/commands/preview/coordinates.d.ts +20 -0
  19. package/cli/commands/preview/coordinates.js +90 -0
  20. package/cli/commands/preview/coordinates.ts +146 -0
  21. package/cli/commands/preview/endpoints.d.ts +10 -0
  22. package/cli/commands/preview/endpoints.js +500 -0
  23. package/cli/commands/preview/endpoints.ts +594 -0
  24. package/cli/commands/preview/eth.d.ts +2 -0
  25. package/cli/commands/preview/eth.js +6 -0
  26. package/cli/commands/preview/eth.ts +3 -0
  27. package/cli/commands/preview/index.d.ts +18 -0
  28. package/cli/commands/preview/index.js +75 -0
  29. package/cli/commands/preview/index.ts +88 -0
  30. package/cli/commands/preview/port.d.ts +1 -0
  31. package/cli/commands/preview/port.js +21 -0
  32. package/cli/commands/preview/port.ts +15 -0
  33. package/cli/commands/preview/project.d.ts +14 -0
  34. package/cli/commands/preview/project.js +77 -0
  35. package/cli/commands/preview/project.ts +112 -0
  36. package/cli/commands/preview/types.d.ts +13 -0
  37. package/cli/commands/preview/types.js +3 -0
  38. package/cli/commands/preview/types.ts +19 -0
  39. package/cli/commands/preview/wire.d.ts +14 -0
  40. package/cli/commands/preview/wire.js +28 -0
  41. package/cli/commands/preview/wire.ts +48 -0
  42. package/cli/commands/preview/ws.d.ts +7 -0
  43. package/cli/commands/preview/ws.js +16 -0
  44. package/cli/commands/preview/ws.ts +24 -0
  45. package/cli/commands/start/index.d.ts +29 -0
  46. package/cli/commands/start/index.js +121 -0
  47. package/cli/commands/start/index.ts +132 -0
  48. package/cli/components/fetch.d.ts +5 -0
  49. package/cli/components/fetch.js +34 -0
  50. package/cli/components/fetch.ts +11 -0
  51. package/cli/components/fs.d.ts +11 -0
  52. package/cli/components/fs.js +58 -0
  53. package/cli/components/fs.ts +48 -0
  54. package/cli/components/index.d.ts +7 -0
  55. package/cli/components/index.js +13 -0
  56. package/cli/components/index.ts +14 -0
  57. package/cli/index.d.ts +2 -0
  58. package/cli/index.js +8 -8
  59. package/cli/index.ts +15 -12
  60. package/cli/utils/args.js +2 -2
  61. package/cli/utils/args.ts +2 -8
  62. package/cli/utils/commands.d.ts +2 -1
  63. package/cli/utils/commands.js +8 -8
  64. package/cli/utils/commands.ts +11 -11
  65. package/cli/utils/exec.d.ts +8 -0
  66. package/cli/utils/exec.js +33 -0
  67. package/cli/utils/exec.ts +38 -0
  68. package/cli/utils/fs.d.ts +9 -8
  69. package/cli/utils/fs.js +7 -47
  70. package/cli/utils/fs.ts +11 -67
  71. package/cli/utils/handler.d.ts +6 -0
  72. package/cli/utils/handler.js +19 -0
  73. package/cli/utils/handler.ts +23 -0
  74. package/cli/utils/object.d.ts +9 -0
  75. package/cli/utils/object.js +45 -0
  76. package/cli/utils/object.ts +62 -0
  77. package/cli/utils/out-messages.d.ts +1 -0
  78. package/cli/utils/out-messages.js +8 -0
  79. package/cli/utils/out-messages.ts +3 -0
  80. package/internal/Observable.js +3 -7
  81. package/internal/provider.js +1 -1
  82. package/internal/transports/rendererTransport.js +2 -3
  83. package/messageBus.js +1 -1
  84. package/observables.js +1 -1
  85. package/package.json +18 -7
  86. package/src/internal/Observable.ts +9 -44
  87. package/src/internal/provider.ts +3 -11
  88. package/src/internal/transports/rendererTransport.ts +4 -12
  89. package/src/messageBus.ts +1 -4
  90. package/src/observables.ts +27 -63
  91. package/tsconfig.cli.json +10 -1
  92. package/cli/utils/spinner.d.ts +0 -15
  93. package/cli/utils/spinner.js +0 -41
  94. package/cli/utils/spinner.ts +0 -44
package/cli/index.ts CHANGED
@@ -1,12 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ /*
4
+ istanbul ignore file
5
+ Doesn't make sense to test this file
6
+ */
7
+
3
8
  import { getArgs } from './utils/args'
9
+ import { toStringList } from './utils/out-messages'
4
10
  import log from './utils/log'
5
11
  import { CliError } from './utils/error'
6
12
  import { COMMANDS_PATH, getCommands } from './utils/commands'
13
+ import { CliComponents, initComponents } from './components'
7
14
 
8
15
  export interface Options {
9
16
  args: ReturnType<typeof getArgs>
17
+ components: CliComponents
10
18
  }
11
19
 
12
20
  // leaving args as "any" since we don't know yet if we will use them
@@ -18,13 +26,7 @@ interface FileExports {
18
26
  args?: ReturnType<typeof getArgs>
19
27
  }
20
28
 
21
- const listCommandsStr = (commands: string[]) =>
22
- commands
23
- .map(
24
- ($) => `
25
- * npx sdk ${$}`
26
- )
27
- .join('')
29
+ const listCommandsStr = (commands: string[]) => toStringList(commands.map(($) => `npx @dcl/sdk ${$}`))
28
30
 
29
31
  const handleError = (err: CliError) => {
30
32
  if (!(err instanceof CliError)) {
@@ -46,27 +48,28 @@ const commandFnsAreValid = (fns: FileExports): fns is Required<FileExports> => {
46
48
  }
47
49
 
48
50
  const args = getArgs()
49
- const helpMessage = (commands: string[]) =>
50
- `Here is the list of commands: ${listCommandsStr(commands)}`
51
+ const helpMessage = (commands: string[]) => `Here is the list of commands: ${listCommandsStr(commands)}`
51
52
 
52
53
  ;(async () => {
53
54
  const command = process.argv[2]
54
55
  const needsHelp = args['--help']
55
- const commands = await getCommands()
56
+ const components: CliComponents = initComponents()
57
+
58
+ const commands = await getCommands(components)
56
59
 
57
60
  if (!commands.includes(command)) {
58
61
  if (needsHelp) {
59
62
  log.info(helpMessage(commands))
60
63
  return
61
64
  }
62
- throw new CliError(`Command ${command} is invalid. ${helpMessage}`)
65
+ throw new CliError(`Command ${command} is invalid. ${helpMessage(commands)}`)
63
66
  }
64
67
 
65
68
  // eslint-disable-next-line @typescript-eslint/no-var-requires
66
69
  const cmd = require(`${COMMANDS_PATH}/${command}`)
67
70
 
68
71
  if (commandFnsAreValid(cmd)) {
69
- const options = { args: cmd.args }
72
+ const options = { args: cmd.args, components }
70
73
  needsHelp ? await cmd.help(options) : await cmd.main(options)
71
74
  }
72
75
  })().catch(handleError)
package/cli/utils/args.js CHANGED
@@ -10,7 +10,7 @@ exports.DEFAULT_ARGS = {
10
10
  '-h': '--help'
11
11
  };
12
12
  function getArgs(args) {
13
- return (0, arg_1.default)({ ...exports.DEFAULT_ARGS, ...args }, { permissive: true });
13
+ return (0, arg_1.default)(Object.assign(Object.assign({}, exports.DEFAULT_ARGS), args), { permissive: true });
14
14
  }
15
15
  exports.getArgs = getArgs;
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFyZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQWlDO0FBWXBCLFFBQUEsWUFBWSxHQUFHO0lBQzFCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLElBQUksRUFBRSxRQUFRO0NBQ2YsQ0FBQTtBQU1ELFNBQWdCLE9BQU8sQ0FBaUIsSUFBUTtJQUM5QyxPQUFPLElBQUEsYUFBRyxFQUFDLEVBQUUsR0FBRyxvQkFBWSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRkQsMEJBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXJnLCB7IFJlc3VsdCB9IGZyb20gJ2FyZydcblxuZXhwb3J0IHR5cGUgQXJncyA9IHtcbiAgW2tleTogc3RyaW5nXTpcbiAgICB8IHN0cmluZ1xuICAgIHwgU3RyaW5nQ29uc3RydWN0b3JcbiAgICB8IE51bWJlckNvbnN0cnVjdG9yXG4gICAgfCBCb29sZWFuQ29uc3RydWN0b3Jcbn1cblxuLy8gdXBkYXRpbmcgdG8gVFMgNC45IHdpbGwgcHJldmVudCBsb3NpbmcgdHlwZXMgd2hlblxuLy8gZW5mb3JjaW5nIHR5cGUgdG8gYmUgXCJBcmdzXCIgYnkgdXNpbmcgXCJzYXRpc2ZpZXMgQXJnc1wiXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUkdTID0ge1xuICAnLS1oZWxwJzogQm9vbGVhbixcbiAgJy1oJzogJy0taGVscCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFyZ3MoKTogUmVzdWx0PHR5cGVvZiBERUZBVUxUX0FSR1M+XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJnczxUIGV4dGVuZHMgQXJncz4oXG4gIGFyZ3M6IFRcbik6IFJlc3VsdDx0eXBlb2YgREVGQVVMVF9BUkdTICYgVD5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcmdzPFQgZXh0ZW5kcyBBcmdzPihhcmdzPzogVCkge1xuICByZXR1cm4gYXJnKHsgLi4uREVGQVVMVF9BUkdTLCAuLi5hcmdzIH0sIHsgcGVybWlzc2l2ZTogdHJ1ZSB9KVxufVxuIl19
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFyZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQWlDO0FBUXBCLFFBQUEsWUFBWSxHQUFHO0lBQzFCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLElBQUksRUFBRSxRQUFRO0NBQ2YsQ0FBQTtBQUlELFNBQWdCLE9BQU8sQ0FBaUIsSUFBUTtJQUM5QyxPQUFPLElBQUEsYUFBRyxrQ0FBTSxvQkFBWSxHQUFLLElBQUksR0FBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQ2hFLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcmcsIHsgUmVzdWx0IH0gZnJvbSAnYXJnJ1xuXG5leHBvcnQgdHlwZSBBcmdzID0ge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBTdHJpbmdDb25zdHJ1Y3RvciB8IE51bWJlckNvbnN0cnVjdG9yIHwgQm9vbGVhbkNvbnN0cnVjdG9yXG59XG5cbi8vIHVwZGF0aW5nIHRvIFRTIDQuOSB3aWxsIHByZXZlbnQgbG9zaW5nIHR5cGVzIHdoZW5cbi8vIGVuZm9yY2luZyB0eXBlIHRvIGJlIFwiQXJnc1wiIGJ5IHVzaW5nIFwic2F0aXNmaWVzIEFyZ3NcIlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVJHUyA9IHtcbiAgJy0taGVscCc6IEJvb2xlYW4sXG4gICctaCc6ICctLWhlbHAnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcmdzKCk6IFJlc3VsdDx0eXBlb2YgREVGQVVMVF9BUkdTPlxuZXhwb3J0IGZ1bmN0aW9uIGdldEFyZ3M8VCBleHRlbmRzIEFyZ3M+KGFyZ3M6IFQpOiBSZXN1bHQ8dHlwZW9mIERFRkFVTFRfQVJHUyAmIFQ+XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJnczxUIGV4dGVuZHMgQXJncz4oYXJncz86IFQpIHtcbiAgcmV0dXJuIGFyZyh7IC4uLkRFRkFVTFRfQVJHUywgLi4uYXJncyB9LCB7IHBlcm1pc3NpdmU6IHRydWUgfSlcbn1cbiJdfQ==
package/cli/utils/args.ts CHANGED
@@ -1,11 +1,7 @@
1
1
  import arg, { Result } from 'arg'
2
2
 
3
3
  export type Args = {
4
- [key: string]:
5
- | string
6
- | StringConstructor
7
- | NumberConstructor
8
- | BooleanConstructor
4
+ [key: string]: string | StringConstructor | NumberConstructor | BooleanConstructor
9
5
  }
10
6
 
11
7
  // updating to TS 4.9 will prevent losing types when
@@ -16,9 +12,7 @@ export const DEFAULT_ARGS = {
16
12
  }
17
13
 
18
14
  export function getArgs(): Result<typeof DEFAULT_ARGS>
19
- export function getArgs<T extends Args>(
20
- args: T
21
- ): Result<typeof DEFAULT_ARGS & T>
15
+ export function getArgs<T extends Args>(args: T): Result<typeof DEFAULT_ARGS & T>
22
16
  export function getArgs<T extends Args>(args?: T) {
23
17
  return arg({ ...DEFAULT_ARGS, ...args }, { permissive: true })
24
18
  }
@@ -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
- const path = `${exports.COMMANDS_PATH}/${dir}`;
13
- if (!(await (0, fs_1.isDirectory)(path))) {
10
+ const path = (0, path_1.resolve)(exports.COMMANDS_PATH, dir);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21tYW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBOEI7QUFFOUIsbUNBQWtDO0FBRXJCLFFBQUEsYUFBYSxHQUFHLElBQUEsY0FBTyxFQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQTtBQUV2RCxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQTZCLEVBQXFCLEVBQUU7SUFDeEYsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLHFCQUFhLENBQUMsQ0FBQTtJQUVuRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUM3QyxNQUFNLElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQyxxQkFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRXhDLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sSUFBSSxnQkFBUSxDQUFDLGlEQUFpRCxDQUFDLENBQUE7U0FDdEU7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFBO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLGdCQUFRLENBQUMsNkRBQTZELENBQUMsQ0FBQTtTQUNsRjtRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQyxDQUFDLENBQUE7SUFFRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDOUIsQ0FBQyxDQUFBO0FBckJZLFFBQUEsV0FBVyxlQXFCdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IENsaUNvbXBvbmVudHMgfSBmcm9tICcuLi9jb21wb25lbnRzJ1xuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuL2Vycm9yJ1xuXG5leHBvcnQgY29uc3QgQ09NTUFORFNfUEFUSCA9IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vY29tbWFuZHMnKVxuXG5leHBvcnQgY29uc3QgZ2V0Q29tbWFuZHMgPSBhc3luYyAoeyBmcyB9OiBQaWNrPENsaUNvbXBvbmVudHMsICdmcyc+KTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBjb21tYW5kRGlycyA9IGF3YWl0IGZzLnJlYWRkaXIoQ09NTUFORFNfUEFUSClcblxuICBjb25zdCBjb21tYW5kcyA9IGNvbW1hbmREaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmUoQ09NTUFORFNfUEFUSCwgZGlyKVxuXG4gICAgY29uc3Qgc3RhdERpciA9IGF3YWl0IGZzLnN0YXQocGF0aClcblxuICAgIGlmICghc3RhdERpci5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoJ0RldmVsb3BlcjogQWxsIGNvbW1hbmRzIG11c3QgYmUgaW5zaWRlIGEgZm9sZGVyJylcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0SW5kZXggPSBhd2FpdCBmcy5zdGF0KGAke3BhdGh9L2luZGV4LmpzYClcbiAgICBpZiAoIXN0YXRJbmRleC5pc0ZpbGUoKSkge1xuICAgICAgdGhyb3cgbmV3IENsaUVycm9yKCdEZXZlbG9wZXI6IEFsbCBjb21tYW5kcyBtdXN0IGhhdmUgYW4gXCJpbmRleC5qc1wiIGZpbGUgaW5zaWRlJylcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyXG4gIH0pXG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzKVxufVxuIl19
@@ -1,24 +1,24 @@
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 ({ fs }: Pick<CliComponents, 'fs'>): Promise<string[]> => {
8
+ const commandDirs = await fs.readdir(COMMANDS_PATH)
11
9
 
12
10
  const commands = commandDirs.map(async (dir) => {
13
- const path = `${COMMANDS_PATH}/${dir}`
14
- if (!(await isDirectory(path))) {
11
+ const path = resolve(COMMANDS_PATH, dir)
12
+
13
+ const statDir = await fs.stat(path)
14
+
15
+ if (!statDir.isDirectory()) {
15
16
  throw new CliError('Developer: All commands must be inside a folder')
16
17
  }
17
18
 
18
- if (!(await isFile(`${path}/index.js`))) {
19
- throw new CliError(
20
- 'Developer: All commands must have an "index.js" file inside'
21
- )
19
+ const statIndex = await fs.stat(`${path}/index.js`)
20
+ if (!statIndex.isFile()) {
21
+ throw new CliError('Developer: All commands must have an "index.js" file inside')
22
22
  }
23
23
 
24
24
  return dir
@@ -0,0 +1,8 @@
1
+ interface Options {
2
+ env: {
3
+ [key: string]: string;
4
+ };
5
+ silent: boolean;
6
+ }
7
+ export declare function exec(cwd: string, command: string, { env, silent }?: Partial<Options>): Promise<void>;
8
+ export {};
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exec = void 0;
4
+ const child_process_1 = require("child_process");
5
+ function exec(cwd, command, { env, silent } = {}) {
6
+ return new Promise((resolve, reject) => {
7
+ const [cmd, ...rest] = command.split(' ');
8
+ const child = (0, child_process_1.spawn)(cmd, rest, {
9
+ shell: true,
10
+ cwd,
11
+ env: Object.assign(Object.assign(Object.assign({}, process.env), { NODE_ENV: '' }), env)
12
+ });
13
+ if (!silent) {
14
+ child.stdout.pipe(process.stdout);
15
+ child.stderr.pipe(process.stderr);
16
+ }
17
+ child.stdout.on('data', (data) => {
18
+ if (data.toString().indexOf('The compiler is watching file changes...') !== -1) {
19
+ return resolve(undefined);
20
+ }
21
+ });
22
+ child.on('close', (code) => {
23
+ if (code !== 0) {
24
+ const command = `${cmd} ${rest.join(' ')}`;
25
+ reject(new Error(`Command "${command}" exited with code ${code}. Please try running the command manually`));
26
+ return;
27
+ }
28
+ resolve(undefined);
29
+ });
30
+ });
31
+ }
32
+ exports.exec = exec;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXFDO0FBT3JDLFNBQWdCLElBQUksQ0FBQyxHQUFXLEVBQUUsT0FBZSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBdUIsRUFBRTtJQUN2RixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQUssRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO1lBQzdCLEtBQUssRUFBRSxJQUFJO1lBQ1gsR0FBRztZQUNILEdBQUcsZ0RBQU8sT0FBTyxDQUFDLEdBQUcsS0FBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBRTtTQUM5QyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2pDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNsQztRQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUM5RSxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTthQUMxQjtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUNqQyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ2QsTUFBTSxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFBO2dCQUMxQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxPQUFPLHNCQUFzQixJQUFJLDJDQUEyQyxDQUFDLENBQUMsQ0FBQTtnQkFDM0csT0FBTTthQUNQO1lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBOUJELG9CQThCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2VzcydcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBlbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbiAgc2lsZW50OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjKGN3ZDogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcsIHsgZW52LCBzaWxlbnQgfTogUGFydGlhbDxPcHRpb25zPiA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgW2NtZCwgLi4ucmVzdF0gPSBjb21tYW5kLnNwbGl0KCcgJylcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNtZCwgcmVzdCwge1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBjd2QsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIE5PREVfRU5WOiAnJywgLi4uZW52IH1cbiAgICB9KVxuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIGNoaWxkLnN0ZG91dC5waXBlKHByb2Nlc3Muc3Rkb3V0KVxuICAgICAgY2hpbGQuc3RkZXJyLnBpcGUocHJvY2Vzcy5zdGRlcnIpXG4gICAgfVxuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhLnRvU3RyaW5nKCkuaW5kZXhPZignVGhlIGNvbXBpbGVyIGlzIHdhdGNoaW5nIGZpbGUgY2hhbmdlcy4uLicpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNoaWxkLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBgJHtjbWR9ICR7cmVzdC5qb2luKCcgJyl9YFxuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21tYW5kIFwiJHtjb21tYW5kfVwiIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfS4gUGxlYXNlIHRyeSBydW5uaW5nIHRoZSBjb21tYW5kIG1hbnVhbGx5YCkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9KVxuICB9KVxufVxuIl19
@@ -0,0 +1,38 @@
1
+ import { spawn } from 'child_process'
2
+
3
+ interface Options {
4
+ env: { [key: string]: string }
5
+ silent: boolean
6
+ }
7
+
8
+ export function exec(cwd: string, command: string, { env, silent }: Partial<Options> = {}): Promise<void> {
9
+ return new Promise((resolve, reject) => {
10
+ const [cmd, ...rest] = command.split(' ')
11
+ const child = spawn(cmd, rest, {
12
+ shell: true,
13
+ cwd,
14
+ env: { ...process.env, NODE_ENV: '', ...env }
15
+ })
16
+
17
+ if (!silent) {
18
+ child.stdout.pipe(process.stdout)
19
+ child.stderr.pipe(process.stderr)
20
+ }
21
+
22
+ child.stdout.on('data', (data) => {
23
+ if (data.toString().indexOf('The compiler is watching file changes...') !== -1) {
24
+ return resolve(undefined)
25
+ }
26
+ })
27
+
28
+ child.on('close', (code: number) => {
29
+ if (code !== 0) {
30
+ const command = `${cmd} ${rest.join(' ')}`
31
+ reject(new Error(`Command "${command}" exited with code ${code}. Please try running the command manually`))
32
+ return
33
+ }
34
+
35
+ resolve(undefined)
36
+ })
37
+ })
38
+ }
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBb0M7QUFDcEMsK0JBQThCO0FBUXZCLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxVQUF3QyxFQUFFLEdBQVc7SUFDMUYsTUFBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQTtBQUN0QixDQUFDO0FBSEQsNENBR0M7QUFPTSxLQUFLLFVBQVUsUUFBUSxDQUM1QixVQUFnRSxFQUNoRSxHQUFXLEVBQ1gsSUFBWTtJQUlaLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEUsTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3RELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQVZELDRCQVVDO0FBT00sS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWTtJQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFBLGNBQU8sRUFBQyxJQUFJLENBQUMsQ0FBQTtJQUM5QixNQUFNLElBQUEscUJBQVUsRUFBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUN6QyxPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBSkQsMEJBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXh0cmFjdFppcCBmcm9tICdleHRyYWN0LXppcCdcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgSUZpbGVTeXN0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2ZzJ1xuaW1wb3J0IHsgSUZldGNoQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9mZXRjaCdcblxuLyoqXG4gKiBDaGVjaydzIGlmIGRpcmVjdG9yeSBpcyBlbXB0eVxuICogQHBhcmFtIGRpciBEaXJlY3RvcnkgdG8gY2hlY2sgZm9yIGVtcHR5bmVzc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNEaXJlY3RvcnlFbXB0eShjb21wb25lbnRzOiB7IGZzOiBJRmlsZVN5c3RlbUNvbXBvbmVudCB9LCBkaXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGNvbXBvbmVudHMuZnMucmVhZGRpcihkaXIpXG4gIHJldHVybiAhZmlsZXMubGVuZ3RoXG59XG5cbi8qKlxuICogRG93bmxvYWQgYSBmaWxlXG4gKiBAcGFyYW0gdXJsIFVSTCBvZiB0aGUgZmlsZVxuICogQHBhcmFtIGRlc3QgUGF0aCB0byB3aGVyZSB0byBzYXZlIHRoZSBmaWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3dubG9hZChcbiAgY29tcG9uZW50czogeyBmczogSUZpbGVTeXN0ZW1Db21wb25lbnQ7IGZldGNoOiBJRmV0Y2hDb21wb25lbnQgfSxcbiAgdXJsOiBzdHJpbmcsXG4gIGRlc3Q6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gd2Ugc2hvdWxkIHJlbW92ZSB0aGlzIHBhY2thZ2UgYW5kIHVzZSB0aGUgbmF0aXZlIFwiZmV0Y2hcIiB3aGVuIE5vZGVcbiAgLy8gcmVsZWFzZXMgaXQgYXMgc3RhYmxlOiBodHRwczovL25vZGVqcy5vcmcvZG9jcy9sYXRlc3QtdjE4LngvYXBpL2dsb2JhbHMuaHRtbCNmZXRjaFxuICBjb25zdCBkYXRhID0gYXdhaXQgKGF3YWl0IGNvbXBvbmVudHMuZmV0Y2guZmV0Y2godXJsKSkuYXJyYXlCdWZmZXIoKVxuICBhd2FpdCBjb21wb25lbnRzLmZzLndyaXRlRmlsZShkZXN0LCBCdWZmZXIuZnJvbShkYXRhKSlcbiAgcmV0dXJuIGRlc3Rcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIC56aXAgZmlsZVxuICogQHBhcmFtIHVybCBQYXRoIG9mIHRoZSB6aXAgZmlsZVxuICogQHBhcmFtIGRlc3QgUGF0aCB0byB3aGVyZSB0byBleHRyYWN0IHRoZSB6aXAgZmlsZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdChwYXRoOiBzdHJpbmcsIGRlc3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRlc3RQYXRoID0gcmVzb2x2ZShkZXN0KVxuICBhd2FpdCBleHRyYWN0WmlwKHBhdGgsIHsgZGlyOiBkZXN0UGF0aCB9KVxuICByZXR1cm4gZGVzdFBhdGhcbn1cbiJdfQ==
package/cli/utils/fs.ts CHANGED
@@ -1,79 +1,31 @@
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(components: { fs: IFileSystemComponent }, dir: string): Promise<boolean> {
11
+ const files = await components.fs.readdir(dir)
35
12
  return !files.length
36
13
  }
37
14
 
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
15
  /**
68
16
  * Download a file
69
17
  * @param url URL of the file
70
18
  * @param dest Path to where to save the file
71
19
  */
72
- export async function download(url: string, dest: string): Promise<string> {
20
+ export async function download(
21
+ components: { fs: IFileSystemComponent; fetch: IFetchComponent },
22
+ url: string,
23
+ dest: string
24
+ ): Promise<string> {
73
25
  // we should remove this package and use the native "fetch" when Node
74
26
  // 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))
27
+ const data = await (await components.fetch.fetch(url)).arrayBuffer()
28
+ await components.fs.writeFile(dest, Buffer.from(data))
77
29
  return dest
78
30
  }
79
31
 
@@ -87,11 +39,3 @@ export async function extract(path: string, dest: string): Promise<string> {
87
39
  await extractZip(path, { dir: destPath })
88
40
  return destPath
89
41
  }
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
- }
@@ -0,0 +1,6 @@
1
+ import { CliError } from './error';
2
+ type Args = {
3
+ [key: string]: any;
4
+ };
5
+ export declare function main<T extends Args>(handlerFn: (args: T) => Promise<void>, errorFn?: (error: CliError) => Promise<void>): (args: T) => Promise<void>;
6
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.main = void 0;
4
+ const error_1 = require("./error");
5
+ function main(handlerFn, errorFn) {
6
+ return async function handler(args) {
7
+ try {
8
+ await handlerFn(args);
9
+ }
10
+ catch (e) {
11
+ if (typeof errorFn === 'function') {
12
+ await errorFn(e);
13
+ }
14
+ throw new error_1.CliError(e.message);
15
+ }
16
+ };
17
+ }
18
+ exports.main = main;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWtDO0FBSWxDLFNBQWdCLElBQUksQ0FDbEIsU0FBcUMsRUFDckMsT0FBNEM7SUFFNUMsT0FBTyxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQU87UUFDbkMsSUFBSTtZQUNGLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3RCO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFFZixJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRTtnQkFDakMsTUFBTSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDakI7WUFJRCxNQUFNLElBQUksZ0JBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7U0FDOUI7SUFDSCxDQUFDLENBQUE7QUFDSCxDQUFDO0FBbEJELG9CQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaUVycm9yIH0gZnJvbSAnLi9lcnJvcidcblxudHlwZSBBcmdzID0geyBba2V5OiBzdHJpbmddOiBhbnkgfVxuXG5leHBvcnQgZnVuY3Rpb24gbWFpbjxUIGV4dGVuZHMgQXJncz4oXG4gIGhhbmRsZXJGbjogKGFyZ3M6IFQpID0+IFByb21pc2U8dm9pZD4sXG4gIGVycm9yRm4/OiAoZXJyb3I6IENsaUVycm9yKSA9PiBQcm9taXNlPHZvaWQ+XG4pIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoYXJnczogVCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBoYW5kbGVyRm4oYXJncylcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIC8vIGRvIHNvbWUgc3R1ZmYgd2l0aCB0aGUgQ2xpRXJyb3IgY2xhc3MuLi5cbiAgICAgIGlmICh0eXBlb2YgZXJyb3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhd2FpdCBlcnJvckZuKGUpXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNrIHNvbWV0aGluZz9cblxuICAgICAgdGhyb3cgbmV3IENsaUVycm9yKGUubWVzc2FnZSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,23 @@
1
+ import { CliError } from './error'
2
+
3
+ type Args = { [key: string]: any }
4
+
5
+ export function main<T extends Args>(
6
+ handlerFn: (args: T) => Promise<void>,
7
+ errorFn?: (error: CliError) => Promise<void>
8
+ ) {
9
+ return async function handler(args: T) {
10
+ try {
11
+ await handlerFn(args)
12
+ } catch (e: any) {
13
+ // do some stuff with the CliError class...
14
+ if (typeof errorFn === 'function') {
15
+ await errorFn(e)
16
+ }
17
+
18
+ // track something?
19
+
20
+ throw new CliError(e.message)
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,9 @@
1
+ export type Primitive = string | number;
2
+ export type Dict = {
3
+ [key: string]: Dict | Primitive | Primitive[];
4
+ };
5
+ export declare const isPrimitive: (value: any) => value is Primitive;
6
+ export declare const eqPrimitive: (value: Primitive, value2: Primitive) => boolean;
7
+ export declare const isObject: (value: any) => value is Dict;
8
+ export declare const isPrimitiveEqualTo: (val: Primitive, val2: any) => val2 is Primitive;
9
+ export declare const hasPrimitiveKeys: <T extends Dict>(original: Record<string, unknown>, comparator: T) => boolean;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasPrimitiveKeys = exports.isPrimitiveEqualTo = exports.isObject = exports.eqPrimitive = exports.isPrimitive = void 0;
4
+ const isPrimitive = (value) => (typeof value === 'string' && value.length > 0) || (typeof value === 'number' && !Number.isNaN(value));
5
+ exports.isPrimitive = isPrimitive;
6
+ const eqPrimitive = (value, value2) => value === value2;
7
+ exports.eqPrimitive = eqPrimitive;
8
+ const isObject = (value) => typeof value === 'object' && !Array.isArray(value) && value !== null;
9
+ exports.isObject = isObject;
10
+ const isPrimitiveEqualTo = (val, val2) => (0, exports.isPrimitive)(val2) && (0, exports.eqPrimitive)(val, val2);
11
+ exports.isPrimitiveEqualTo = isPrimitiveEqualTo;
12
+ const hasPrimitiveKeys = (original, comparator) => {
13
+ for (const [key, value] of Object.entries(comparator)) {
14
+ const originalValue = original[key];
15
+ if (originalValue === undefined) {
16
+ return false;
17
+ }
18
+ else if ((0, exports.isPrimitive)(value) && !(0, exports.isPrimitiveEqualTo)(value, originalValue)) {
19
+ return false;
20
+ }
21
+ else if (Array.isArray(value)) {
22
+ if (Array.isArray(originalValue)) {
23
+ const set = new Set(value);
24
+ for (const v of originalValue) {
25
+ if (!set.has(v))
26
+ return false;
27
+ }
28
+ }
29
+ else {
30
+ const foundPrimitive = value.some((val) => (0, exports.isPrimitive)(val) && (0, exports.isPrimitiveEqualTo)(val, originalValue));
31
+ if (!foundPrimitive) {
32
+ return false;
33
+ }
34
+ }
35
+ }
36
+ else if ((0, exports.isObject)(value)) {
37
+ if ((0, exports.isObject)(originalValue) && !(0, exports.hasPrimitiveKeys)(originalValue, value)) {
38
+ return false;
39
+ }
40
+ }
41
+ }
42
+ return true;
43
+ };
44
+ exports.hasPrimitiveKeys = hasPrimitiveKeys;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1PLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBVSxFQUFzQixFQUFFLENBQzVELENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFEM0YsUUFBQSxXQUFXLGVBQ2dGO0FBS2pHLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBZ0IsRUFBRSxNQUFpQixFQUFXLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFBO0FBQWhGLFFBQUEsV0FBVyxlQUFxRTtBQUt0RixNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQVUsRUFBaUIsRUFBRSxDQUNwRCxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUE7QUFEekQsUUFBQSxRQUFRLFlBQ2lEO0FBSy9ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFjLEVBQUUsSUFBUyxFQUFxQixFQUFFLENBQ2pGLElBQUEsbUJBQVcsRUFBQyxJQUFJLENBQUMsSUFBSSxJQUFBLG1CQUFXLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO0FBRGhDLFFBQUEsa0JBQWtCLHNCQUNjO0FBVXRDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBaUIsUUFBaUMsRUFBRSxVQUFhLEVBQVcsRUFBRTtJQUM1RyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNyRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbkMsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQy9CLE9BQU8sS0FBSyxDQUFBO1NBQ2I7YUFBTSxJQUFJLElBQUEsbUJBQVcsRUFBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsMEJBQWtCLEVBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFO1lBQzFFLE9BQU8sS0FBSyxDQUFBO1NBQ2I7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDMUIsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFBRSxPQUFPLEtBQUssQ0FBQTtpQkFDOUI7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFBLG1CQUFXLEVBQUMsR0FBRyxDQUFDLElBQUksSUFBQSwwQkFBa0IsRUFBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQTtnQkFDdEcsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDbkIsT0FBTyxLQUFLLENBQUE7aUJBQ2I7YUFDRjtTQUNGO2FBQU0sSUFBSSxJQUFBLGdCQUFRLEVBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxJQUFBLGdCQUFRLEVBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFBLHdCQUFnQixFQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDdEUsT0FBTyxLQUFLLENBQUE7YUFDYjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMsQ0FBQTtBQTNCWSxRQUFBLGdCQUFnQixvQkEyQjVCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyXG5leHBvcnQgdHlwZSBEaWN0ID0geyBba2V5OiBzdHJpbmddOiBEaWN0IHwgUHJpbWl0aXZlIHwgUHJpbWl0aXZlW10gfVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgXCJQcmltaXRpdmVcIlxuICovXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFByaW1pdGl2ZSA9PlxuICAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwKSB8fCAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKHZhbHVlKSlcblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIHBhcmFtZXRlcnMgYXJlIGVxdWFsXG4gKi9cbmV4cG9ydCBjb25zdCBlcVByaW1pdGl2ZSA9ICh2YWx1ZTogUHJpbWl0aXZlLCB2YWx1ZTI6IFByaW1pdGl2ZSk6IGJvb2xlYW4gPT4gdmFsdWUgPT09IHZhbHVlMlxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgSlMgT2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgRGljdCA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbFxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHNlY29uZCBwYXJhbXRlciBpcyBhIFwiUHJpbWl0aXZlXCIgYW5kIGVxdWFsIHRvIGZpcnN0IHBhcmFtZXRlclxuICovXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmVFcXVhbFRvID0gKHZhbDogUHJpbWl0aXZlLCB2YWwyOiBhbnkpOiB2YWwyIGlzIFByaW1pdGl2ZSA9PlxuICBpc1ByaW1pdGl2ZSh2YWwyKSAmJiBlcVByaW1pdGl2ZSh2YWwsIHZhbDIpXG5cbi8qXG4gKiBSZXR1cm5zIHRydWUgaWYgXCJvcmlnaW5hbFwiIGhhcyBhbGwgb2YgdGhlIHByb3BzIGRlc2NyaWJlZCBpbiBcImNvbXBhcmF0b3JcIlxuICogTk9URTogY29tcGFyYXRvciBjYW4gcHJvdmlkZSBhIGxpc3Qgb2YgdmFsaWQgXCJQcmltaXRpdmVzXCIgdG8gbWF0Y2ggdmFsdWVzIGZyb20gXCJvcmlnaW5hbFwiXG4gKiBFWDpcbiAqIG9yaWdpbmFsID0geyBwcm9wMTogXCJzb21lLXZhbFwiIH1cbiAqIGNvbXBhcmF0b3IgPSB7IHByb3AxOiBbMSwgMiwgXCJzb21lLXZhbFwiXSB9XG4gKiB3aWxsIHJldHVybiB0cnVlXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNQcmltaXRpdmVLZXlzID0gPFQgZXh0ZW5kcyBEaWN0PihvcmlnaW5hbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbXBhcmF0b3I6IFQpOiBib29sZWFuID0+IHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcGFyYXRvcikpIHtcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxba2V5XVxuICAgIGlmIChvcmlnaW5hbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpICYmICFpc1ByaW1pdGl2ZUVxdWFsVG8odmFsdWUsIG9yaWdpbmFsVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvcmlnaW5hbFZhbHVlKSkge1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KHZhbHVlKVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2Ygb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAgIGlmICghc2V0Lmhhcyh2KSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZvdW5kUHJpbWl0aXZlID0gdmFsdWUuc29tZSgodmFsKSA9PiBpc1ByaW1pdGl2ZSh2YWwpICYmIGlzUHJpbWl0aXZlRXF1YWxUbyh2YWwsIG9yaWdpbmFsVmFsdWUpKVxuICAgICAgICBpZiAoIWZvdW5kUHJpbWl0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgaWYgKGlzT2JqZWN0KG9yaWdpbmFsVmFsdWUpICYmICFoYXNQcmltaXRpdmVLZXlzKG9yaWdpbmFsVmFsdWUsIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIl19