@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.
- package/cli/commands/build/helpers.d.ts +25 -0
- package/cli/commands/build/helpers.js +50 -0
- package/cli/commands/build/helpers.ts +95 -0
- package/cli/commands/build/index.d.ts +19 -0
- package/cli/commands/build/index.js +64 -0
- package/cli/commands/build/index.ts +91 -0
- package/cli/commands/init/index.d.ts +3 -1
- package/cli/commands/init/index.js +9 -15
- package/cli/commands/init/index.ts +12 -16
- package/cli/commands/init/repos.js +1 -1
- package/cli/commands/init/repos.ts +1 -2
- package/cli/commands/preview/bff.d.ts +3 -0
- package/cli/commands/preview/bff.js +50 -0
- package/cli/commands/preview/bff.ts +59 -0
- package/cli/commands/preview/catalyst.d.ts +5 -0
- package/cli/commands/preview/catalyst.js +24 -0
- package/cli/commands/preview/catalyst.ts +31 -0
- package/cli/commands/preview/coordinates.d.ts +20 -0
- package/cli/commands/preview/coordinates.js +90 -0
- package/cli/commands/preview/coordinates.ts +146 -0
- package/cli/commands/preview/endpoints.d.ts +10 -0
- package/cli/commands/preview/endpoints.js +500 -0
- package/cli/commands/preview/endpoints.ts +594 -0
- package/cli/commands/preview/eth.d.ts +2 -0
- package/cli/commands/preview/eth.js +6 -0
- package/cli/commands/preview/eth.ts +3 -0
- package/cli/commands/preview/index.d.ts +18 -0
- package/cli/commands/preview/index.js +75 -0
- package/cli/commands/preview/index.ts +88 -0
- package/cli/commands/preview/port.d.ts +1 -0
- package/cli/commands/preview/port.js +21 -0
- package/cli/commands/preview/port.ts +15 -0
- package/cli/commands/preview/project.d.ts +14 -0
- package/cli/commands/preview/project.js +77 -0
- package/cli/commands/preview/project.ts +112 -0
- package/cli/commands/preview/types.d.ts +13 -0
- package/cli/commands/preview/types.js +3 -0
- package/cli/commands/preview/types.ts +19 -0
- package/cli/commands/preview/wire.d.ts +14 -0
- package/cli/commands/preview/wire.js +28 -0
- package/cli/commands/preview/wire.ts +48 -0
- package/cli/commands/preview/ws.d.ts +7 -0
- package/cli/commands/preview/ws.js +16 -0
- package/cli/commands/preview/ws.ts +24 -0
- package/cli/commands/start/index.d.ts +29 -0
- package/cli/commands/start/index.js +121 -0
- package/cli/commands/start/index.ts +132 -0
- package/cli/components/fetch.d.ts +5 -0
- package/cli/components/fetch.js +34 -0
- package/cli/components/fetch.ts +11 -0
- package/cli/components/fs.d.ts +11 -0
- package/cli/components/fs.js +58 -0
- package/cli/components/fs.ts +48 -0
- package/cli/components/index.d.ts +7 -0
- package/cli/components/index.js +13 -0
- package/cli/components/index.ts +14 -0
- package/cli/index.d.ts +2 -0
- package/cli/index.js +8 -8
- package/cli/index.ts +15 -12
- package/cli/utils/args.js +2 -2
- package/cli/utils/args.ts +2 -8
- package/cli/utils/commands.d.ts +2 -1
- package/cli/utils/commands.js +8 -8
- package/cli/utils/commands.ts +11 -11
- package/cli/utils/exec.d.ts +8 -0
- package/cli/utils/exec.js +33 -0
- package/cli/utils/exec.ts +38 -0
- package/cli/utils/fs.d.ts +9 -8
- package/cli/utils/fs.js +7 -47
- package/cli/utils/fs.ts +11 -67
- package/cli/utils/handler.d.ts +6 -0
- package/cli/utils/handler.js +19 -0
- package/cli/utils/handler.ts +23 -0
- package/cli/utils/object.d.ts +9 -0
- package/cli/utils/object.js +45 -0
- package/cli/utils/object.ts +62 -0
- package/cli/utils/out-messages.d.ts +1 -0
- package/cli/utils/out-messages.js +8 -0
- package/cli/utils/out-messages.ts +3 -0
- package/internal/Observable.js +3 -7
- package/internal/provider.js +1 -1
- package/internal/transports/rendererTransport.js +2 -3
- package/messageBus.js +1 -1
- package/observables.js +1 -1
- package/package.json +18 -7
- package/src/internal/Observable.ts +9 -44
- package/src/internal/provider.ts +3 -11
- package/src/internal/transports/rendererTransport.ts +4 -12
- package/src/messageBus.ts +1 -4
- package/src/observables.ts +27 -63
- package/tsconfig.cli.json +10 -1
- package/cli/utils/spinner.d.ts +0 -15
- package/cli/utils/spinner.js +0 -41
- 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
|
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)({
|
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,
|
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
|
}
|
package/cli/utils/commands.d.ts
CHANGED
package/cli/utils/commands.js
CHANGED
@@ -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
|
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 =
|
13
|
-
|
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
|
-
|
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,
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21tYW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBOEI7QUFFOUIsbUNBQWtDO0FBRXJCLFFBQUEsYUFBYSxHQUFHLElBQUEsY0FBTyxFQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQTtBQUV2RCxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQTZCLEVBQXFCLEVBQUU7SUFDeEYsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLHFCQUFhLENBQUMsQ0FBQTtJQUVuRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUM3QyxNQUFNLElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQyxxQkFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRXhDLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sSUFBSSxnQkFBUSxDQUFDLGlEQUFpRCxDQUFDLENBQUE7U0FDdEU7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFBO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLGdCQUFRLENBQUMsNkRBQTZELENBQUMsQ0FBQTtTQUNsRjtRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQyxDQUFDLENBQUE7SUFFRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDOUIsQ0FBQyxDQUFBO0FBckJZLFFBQUEsV0FBVyxlQXFCdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IENsaUNvbXBvbmVudHMgfSBmcm9tICcuLi9jb21wb25lbnRzJ1xuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuL2Vycm9yJ1xuXG5leHBvcnQgY29uc3QgQ09NTUFORFNfUEFUSCA9IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vY29tbWFuZHMnKVxuXG5leHBvcnQgY29uc3QgZ2V0Q29tbWFuZHMgPSBhc3luYyAoeyBmcyB9OiBQaWNrPENsaUNvbXBvbmVudHMsICdmcyc+KTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBjb21tYW5kRGlycyA9IGF3YWl0IGZzLnJlYWRkaXIoQ09NTUFORFNfUEFUSClcblxuICBjb25zdCBjb21tYW5kcyA9IGNvbW1hbmREaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmUoQ09NTUFORFNfUEFUSCwgZGlyKVxuXG4gICAgY29uc3Qgc3RhdERpciA9IGF3YWl0IGZzLnN0YXQocGF0aClcblxuICAgIGlmICghc3RhdERpci5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoJ0RldmVsb3BlcjogQWxsIGNvbW1hbmRzIG11c3QgYmUgaW5zaWRlIGEgZm9sZGVyJylcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0SW5kZXggPSBhd2FpdCBmcy5zdGF0KGAke3BhdGh9L2luZGV4LmpzYClcbiAgICBpZiAoIXN0YXRJbmRleC5pc0ZpbGUoKSkge1xuICAgICAgdGhyb3cgbmV3IENsaUVycm9yKCdEZXZlbG9wZXI6IEFsbCBjb21tYW5kcyBtdXN0IGhhdmUgYW4gXCJpbmRleC5qc1wiIGZpbGUgaW5zaWRlJylcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyXG4gIH0pXG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzKVxufVxuIl19
|
package/cli/utils/commands.ts
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
import { resolve } from 'path'
|
2
|
-
import {
|
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 =
|
14
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
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,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
|
-
|
2
|
-
|
3
|
-
export declare function isDirectoryEmpty(
|
4
|
-
|
5
|
-
|
6
|
-
export declare function
|
7
|
-
|
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.
|
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
|
-
|
11
|
-
const
|
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
|
33
|
-
|
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
|
-
|
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 {
|
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(
|
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,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
|