@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
@@ -0,0 +1,29 @@
1
+ import { CliComponents } from '../../components';
2
+ interface Options {
3
+ args: typeof args;
4
+ components: Pick<CliComponents, 'fetch' | 'fs'>;
5
+ }
6
+ export declare const args: import("arg").Result<{
7
+ '--help': BooleanConstructor;
8
+ '-h': string;
9
+ } & {
10
+ '--dir': StringConstructor;
11
+ '--help': BooleanConstructor;
12
+ '--port': StringConstructor;
13
+ '--no-debug': BooleanConstructor;
14
+ '--no-browser': BooleanConstructor;
15
+ '--no-watch': BooleanConstructor;
16
+ '--ci': BooleanConstructor;
17
+ '--skip-install': BooleanConstructor;
18
+ '--web3': BooleanConstructor;
19
+ '-h': string;
20
+ '-p': string;
21
+ '-d': string;
22
+ '-b': string;
23
+ '-w': string;
24
+ '--skip-build': BooleanConstructor;
25
+ '--desktop-client': BooleanConstructor;
26
+ }>;
27
+ export declare function help(): string;
28
+ export declare const main: (args: Options) => Promise<void>;
29
+ export {};
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.main = exports.help = exports.args = void 0;
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = require("path");
9
+ const open_1 = __importDefault(require("open"));
10
+ const build_1 = require("../build");
11
+ const preview_1 = require("../preview");
12
+ const port_1 = require("../preview/port");
13
+ const args_1 = require("../../utils/args");
14
+ const handler_1 = require("../../utils/handler");
15
+ exports.args = (0, args_1.getArgs)({
16
+ '--dir': String,
17
+ '--help': Boolean,
18
+ '--port': String,
19
+ '--no-debug': Boolean,
20
+ '--no-browser': Boolean,
21
+ '--no-watch': Boolean,
22
+ '--ci': Boolean,
23
+ '--skip-install': Boolean,
24
+ '--web3': Boolean,
25
+ '-h': '--help',
26
+ '-p': '--port',
27
+ '-d': '--no-debug',
28
+ '-b': '--no-browser',
29
+ '-w': '--no-watch',
30
+ '--skip-build': Boolean,
31
+ '--desktop-client': Boolean
32
+ });
33
+ function help() {
34
+ return `
35
+ Usage: dcl start [options]
36
+
37
+ Options:
38
+
39
+ -h, --help Displays complete help
40
+ -p, --port [port] Select a custom port for the development server
41
+ -d, --no-debug Disable debugging panel
42
+ -b, --no-browser Do not open a new browser window
43
+ -w, --no-watch Do not open watch for filesystem changes
44
+ -c, --ci Run the parcel previewer on a remote unix server
45
+ --web3 Connects preview to browser wallet to use the associated avatar and account
46
+ --skip-build Skip build and only serve the files in preview mode
47
+ --desktop-client Show URL to launch preview in the desktop client (BETA)
48
+
49
+ Examples:
50
+
51
+ - Start a local development server for a Decentraland Scene at port 3500
52
+
53
+ $ dcl start -p 3500
54
+
55
+ - Start a local development server for a Decentraland Scene at a docker container
56
+
57
+ $ dcl start --ci
58
+ `;
59
+ }
60
+ exports.help = help;
61
+ exports.main = (0, handler_1.main)(async function main(options) {
62
+ const dir = (0, path_1.resolve)(process.cwd(), options.args['--dir'] || '.');
63
+ const isCi = exports.args['--ci'] || process.env.CI || false;
64
+ const debug = !exports.args['--no-debug'] && !isCi;
65
+ const openBrowser = !exports.args['--no-browser'] && !isCi;
66
+ const skipBuild = exports.args['--skip-build'];
67
+ const watch = !exports.args['--no-watch'] && !isCi && !skipBuild;
68
+ const enableWeb3 = exports.args['--web3'];
69
+ const port = parseInt(exports.args['--port'], 10) || (await (0, port_1.previewPort)());
70
+ const baseCoords = { x: 0, y: 0 };
71
+ const hasPortableExperience = false;
72
+ const comps = { components: options.components };
73
+ if (!skipBuild) {
74
+ await (0, build_1.main)(Object.assign({ args: { '--dir': dir, '--watch': watch } }, comps));
75
+ }
76
+ await (0, preview_1.main)(Object.assign({ args: { '--dir': dir, '--port': port } }, comps));
77
+ const ifaces = os_1.default.networkInterfaces();
78
+ const availableURLs = [];
79
+ console.log(`\nPreview server is now running!`);
80
+ console.log('Available on:\n');
81
+ Object.keys(ifaces).forEach((dev) => {
82
+ ;
83
+ (ifaces[dev] || []).forEach((details) => {
84
+ if (details.family === 'IPv4') {
85
+ let addr = `http://${details.address}:${port}?position=${baseCoords.x}%2C${baseCoords.y}&ENABLE_ECS7`;
86
+ if (debug) {
87
+ addr = `${addr}&SCENE_DEBUG_PANEL`;
88
+ }
89
+ if (enableWeb3 || hasPortableExperience) {
90
+ addr = `${addr}&ENABLE_WEB3`;
91
+ }
92
+ availableURLs.push(addr);
93
+ }
94
+ });
95
+ });
96
+ const sortedURLs = availableURLs.sort((a, _b) => {
97
+ return a.toLowerCase().includes('localhost') || a.includes('127.0.0.1') || a.includes('0.0.0.0') ? -1 : 1;
98
+ });
99
+ for (const addr of sortedURLs) {
100
+ console.log(` ${addr}`);
101
+ }
102
+ if (exports.args['--desktop-client']) {
103
+ console.log('\n Desktop client:\n');
104
+ for (const addr of sortedURLs) {
105
+ const searchParams = new URLSearchParams();
106
+ searchParams.append('PREVIEW-MODE', addr);
107
+ console.log(` dcl://${searchParams.toString()}&`);
108
+ }
109
+ }
110
+ console.log('\n Details:\n');
111
+ console.log('\nPress CTRL+C to exit\n');
112
+ if (openBrowser && sortedURLs.length && !exports.args['--desktop-client']) {
113
+ try {
114
+ await (0, open_1.default)(sortedURLs[0]);
115
+ }
116
+ catch (_) {
117
+ console.log('Unable to open browser automatically.');
118
+ }
119
+ }
120
+ });
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBbUI7QUFDbkIsK0JBQThCO0FBQzlCLGdEQUF1QjtBQUd2QixvQ0FBd0M7QUFDeEMsd0NBQTRDO0FBQzVDLDBDQUE2QztBQUM3QywyQ0FBMEM7QUFDMUMsaURBQXFEO0FBTXhDLFFBQUEsSUFBSSxHQUFHLElBQUEsY0FBTyxFQUFDO0lBQzFCLE9BQU8sRUFBRSxNQUFNO0lBQ2YsUUFBUSxFQUFFLE9BQU87SUFDakIsUUFBUSxFQUFFLE1BQU07SUFDaEIsWUFBWSxFQUFFLE9BQU87SUFDckIsY0FBYyxFQUFFLE9BQU87SUFDdkIsWUFBWSxFQUFFLE9BQU87SUFDckIsTUFBTSxFQUFFLE9BQU87SUFDZixnQkFBZ0IsRUFBRSxPQUFPO0lBQ3pCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLFFBQVE7SUFDZCxJQUFJLEVBQUUsWUFBWTtJQUNsQixJQUFJLEVBQUUsY0FBYztJQUNwQixJQUFJLEVBQUUsWUFBWTtJQUNsQixjQUFjLEVBQUUsT0FBTztJQUN2QixrQkFBa0IsRUFBRSxPQUFPO0NBQzVCLENBQUMsQ0FBQTtBQUVGLFNBQWdCLElBQUk7SUFDbEIsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0JSLENBQUE7QUFDRCxDQUFDO0FBMUJELG9CQTBCQztBQUVZLFFBQUEsSUFBSSxHQUFHLElBQUEsY0FBTyxFQUFDLEtBQUssVUFBVSxJQUFJLENBQUMsT0FBZ0I7SUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBQSxjQUFPLEVBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUE7SUFDaEUsTUFBTSxJQUFJLEdBQUcsWUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FB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LENBQUMsQ0FBQTtJQUVGLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0tBQzNCO0lBRUQsSUFBSSxZQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRTtRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDcEMsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUU7WUFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQTtZQUMxQyxZQUFZLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtTQUNyRDtLQUNGO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUd2QyxJQUFJLFdBQVcsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7UUFDakUsSUFBSTtZQUNGLE1BQU0sSUFBQSxjQUFJLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDMUI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtTQUNyRDtLQUNGO0FBQ0gsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3MgZnJvbSAnb3MnXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCBvcGVuIGZyb20gJ29wZW4nXG5cbmltcG9ydCB7IENsaUNvbXBvbmVudHMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzJ1xuaW1wb3J0IHsgbWFpbiBhcyBidWlsZCB9IGZyb20gJy4uL2J1aWxkJ1xuaW1wb3J0IHsgbWFpbiBhcyBwcmV2aWV3IH0gZnJvbSAnLi4vcHJldmlldydcbmltcG9ydCB7IHByZXZpZXdQb3J0IH0gZnJvbSAnLi4vcHJldmlldy9wb3J0J1xuaW1wb3J0IHsgZ2V0QXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL2FyZ3MnXG5pbXBvcnQgeyBtYWluIGFzIGhhbmRsZXIgfSBmcm9tICcuLi8uLi91dGlscy9oYW5kbGVyJ1xuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBhcmdzOiB0eXBlb2YgYXJnc1xuICBjb21wb25lbnRzOiBQaWNrPENsaUNvbXBvbmVudHMsICdmZXRjaCcgfCAnZnMnPlxufVxuXG5leHBvcnQgY29uc3QgYXJncyA9IGdldEFyZ3Moe1xuICAnLS1kaXInOiBTdHJpbmcsXG4gICctLWhlbHAnOiBCb29sZWFuLFxuICAnLS1wb3J0JzogU3RyaW5nLFxuICAnLS1uby1kZWJ1Zyc6IEJvb2xlYW4sXG4gICctLW5vLWJyb3dzZXInOiBCb29sZWFuLFxuICAnLS1uby13YXRjaCc6IEJvb2xlYW4sXG4gICctLWNpJzogQm9vbGVhbixcbiAgJy0tc2tpcC1pbnN0YWxsJzogQm9vbGVhbixcbiAgJy0td2ViMyc6IEJvb2xlYW4sXG4gICctaCc6ICctLWhlbHAnLFxuICAnLXAnOiAnLS1wb3J0JyxcbiAgJy1kJzogJy0tbm8tZGVidWcnLFxuICAnLWInOiAnLS1uby1icm93c2VyJyxcbiAgJy13JzogJy0tbm8td2F0Y2gnLFxuICAnLS1za2lwLWJ1aWxkJzogQm9vbGVhbixcbiAgJy0tZGVza3RvcC1jbGllbnQnOiBCb29sZWFuXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gaGVscCgpIHtcbiAgcmV0dXJuIGBcbiAgVXNhZ2U6IGRjbCBzdGFydCBbb3B0aW9uc11cblxuICAgIE9wdGlvbnM6XG5cbiAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgRGlzcGxheXMgY29tcGxldGUgaGVscFxuICAgICAgLXAsIC0tcG9ydCAgICAgICAgW3BvcnRdICBTZWxlY3QgYSBjdXN0b20gcG9ydCBmb3IgdGhlIGRldmVsb3BtZW50IHNlcnZlclxuICAgICAgLWQsIC0tbm8tZGVidWcgICAgICAgICAgICBEaXNhYmxlIGRlYnVnZ2luZyBwYW5lbFxuICAgICAgLWIsIC0tbm8tYnJvd3NlciAgICAgICAgICBEbyBub3Qgb3BlbiBhIG5ldyBicm93c2VyIHdpbmRvd1xuICAgICAgLXcsIC0tbm8td2F0Y2ggICAgICAgICAgICBEbyBub3Qgb3BlbiB3YXRjaCBmb3IgZmlsZXN5c3RlbSBjaGFuZ2VzXG4gICAgICAtYywgLS1jaSAgICAgICAgICAgICAgICAgIFJ1biB0aGUgcGFyY2VsIHByZXZpZXdlciBvbiBhIHJlbW90ZSB1bml4IHNlcnZlclxuICAgICAgLS13ZWIzICAgICAgICAgICAgICAgICAgICBDb25uZWN0cyBwcmV2aWV3IHRvIGJyb3dzZXIgd2FsbGV0IHRvIHVzZSB0aGUgYXNzb2NpYXRlZCBhdmF0YXIgYW5kIGFjY291bnRcbiAgICAgIC0tc2tpcC1idWlsZCAgICAgICAgICAgICAgU2tpcCBidWlsZCBhbmQgb25seSBzZXJ2ZSB0aGUgZmlsZXMgaW4gcHJldmlldyBtb2RlXG4gICAgICAtLWRlc2t0b3AtY2xpZW50ICAgICAgICAgIFNob3cgVVJMIHRvIGxhdW5jaCBwcmV2aWV3IGluIHRoZSBkZXNrdG9wIGNsaWVudCAoQkVUQSlcblxuICAgIEV4YW1wbGVzOlxuXG4gICAgLSBTdGFydCBhIGxvY2FsIGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBEZWNlbnRyYWxhbmQgU2NlbmUgYXQgcG9ydCAzNTAwXG5cbiAgICAgICQgZGNsIHN0YXJ0IC1wIDM1MDBcblxuICAgIC0gU3RhcnQgYSBsb2NhbCBkZXZlbG9wbWVudCBzZXJ2ZXIgZm9yIGEgRGVjZW50cmFsYW5kIFNjZW5lIGF0IGEgZG9ja2VyIGNvbnRhaW5lclxuXG4gICAgICAkIGRjbCBzdGFydCAtLWNpXG5gXG59XG5cbmV4cG9ydCBjb25zdCBtYWluID0gaGFuZGxlcihhc3luYyBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgY29uc3QgZGlyID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLmFyZ3NbJy0tZGlyJ10gfHwgJy4nKVxuICBjb25zdCBpc0NpID0gYXJnc1snLS1jaSddIHx8IHByb2Nlc3MuZW52LkNJIHx8IGZhbHNlXG4gIGNvbnN0IGRlYnVnID0gIWFyZ3NbJy0tbm8tZGVidWcnXSAmJiAhaXNDaVxuICBjb25zdCBvcGVuQnJvd3NlciA9ICFhcmdzWyctLW5vLWJyb3dzZXInXSAmJiAhaXNDaVxuICBjb25zdCBza2lwQnVpbGQgPSBhcmdzWyctLXNraXAtYnVpbGQnXVxuICBjb25zdCB3YXRjaCA9ICFhcmdzWyctLW5vLXdhdGNoJ10gJiYgIWlzQ2kgJiYgIXNraXBCdWlsZFxuICBjb25zdCBlbmFibGVXZWIzID0gYXJnc1snLS13ZWIzJ11cbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KGFyZ3NbJy0tcG9ydCddISwgMTApIHx8IChhd2FpdCBwcmV2aWV3UG9ydCgpKVxuICBjb25zdCBiYXNlQ29vcmRzID0geyB4OiAwLCB5OiAwIH1cbiAgY29uc3QgaGFzUG9ydGFibGVFeHBlcmllbmNlID0gZmFsc2VcblxuICBjb25zdCBjb21wcyA9IHsgY29tcG9uZW50czogb3B0aW9ucy5jb21wb25lbnRzIH1cbiAgaWYgKCFza2lwQnVpbGQpIHtcbiAgICBhd2FpdCBidWlsZCh7IGFyZ3M6IHsgJy0tZGlyJzogZGlyLCAnLS13YXRjaCc6IHdhdGNoIH0sIC4uLmNvbXBzIH0pXG4gIH1cbiAgYXdhaXQgcHJldmlldyh7IGFyZ3M6IHsgJy0tZGlyJzogZGlyLCAnLS1wb3J0JzogcG9ydCB9LCAuLi5jb21wcyB9KVxuXG4gIGNvbnN0IGlmYWNlcyA9IG9zLm5ldHdvcmtJbnRlcmZhY2VzKClcbiAgY29uc3QgYXZhaWxhYmxlVVJMczogc3RyaW5nW10gPSBbXVxuXG4gIGNvbnNvbGUubG9nKGBcXG5QcmV2aWV3IHNlcnZlciBpcyBub3cgcnVubmluZyFgKVxuICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIG9uOlxcbicpXG5cbiAgT2JqZWN0LmtleXMoaWZhY2VzKS5mb3JFYWNoKChkZXYpID0+IHtcbiAgICA7KGlmYWNlc1tkZXZdIHx8IFtdKS5mb3JFYWNoKChkZXRhaWxzKSA9PiB7XG4gICAgICBpZiAoZGV0YWlscy5mYW1pbHkgPT09ICdJUHY0Jykge1xuICAgICAgICBsZXQgYWRkciA9IGBodHRwOi8vJHtkZXRhaWxzLmFkZHJlc3N9OiR7cG9ydH0/cG9zaXRpb249JHtiYXNlQ29vcmRzLnh9JTJDJHtiYXNlQ29vcmRzLnl9JkVOQUJMRV9FQ1M3YFxuICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICBhZGRyID0gYCR7YWRkcn0mU0NFTkVfREVCVUdfUEFORUxgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuYWJsZVdlYjMgfHwgaGFzUG9ydGFibGVFeHBlcmllbmNlKSB7XG4gICAgICAgICAgYWRkciA9IGAke2FkZHJ9JkVOQUJMRV9XRUIzYFxuICAgICAgICB9XG5cbiAgICAgICAgYXZhaWxhYmxlVVJMcy5wdXNoKGFkZHIpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICAvLyBQdXNoIGxvY2FsaG9zdCBhbmQgMTI3LjAuMC4xIGF0IHRvcFxuICBjb25zdCBzb3J0ZWRVUkxzID0gYXZhaWxhYmxlVVJMcy5zb3J0KChhLCBfYikgPT4ge1xuICAgIHJldHVybiBhLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpIHx8IGEuaW5jbHVkZXMoJzEyNy4wLjAuMScpIHx8IGEuaW5jbHVkZXMoJzAuMC4wLjAnKSA/IC0xIDogMVxuICB9KVxuXG4gIGZvciAoY29uc3QgYWRkciBvZiBzb3J0ZWRVUkxzKSB7XG4gICAgY29uc29sZS5sb2coYCAgICAke2FkZHJ9YClcbiAgfVxuXG4gIGlmIChhcmdzWyctLWRlc2t0b3AtY2xpZW50J10pIHtcbiAgICBjb25zb2xlLmxvZygnXFxuICBEZXNrdG9wIGNsaWVudDpcXG4nKVxuICAgIGZvciAoY29uc3QgYWRkciBvZiBzb3J0ZWRVUkxzKSB7XG4gICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoJ1BSRVZJRVctTU9ERScsIGFkZHIpXG4gICAgICBjb25zb2xlLmxvZyhgICAgIGRjbDovLyR7c2VhcmNoUGFyYW1zLnRvU3RyaW5nKCl9JmApXG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coJ1xcbiAgRGV0YWlsczpcXG4nKVxuICBjb25zb2xlLmxvZygnXFxuUHJlc3MgQ1RSTCtDIHRvIGV4aXRcXG4nKVxuXG4gIC8vIE9wZW4gcHJlZmVyYWJseSBsb2NhbGhvc3QvMTI3LjAuMC4xXG4gIGlmIChvcGVuQnJvd3NlciAmJiBzb3J0ZWRVUkxzLmxlbmd0aCAmJiAhYXJnc1snLS1kZXNrdG9wLWNsaWVudCddKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG9wZW4oc29ydGVkVVJMc1swXSlcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIG9wZW4gYnJvd3NlciBhdXRvbWF0aWNhbGx5LicpXG4gICAgfVxuICB9XG59KVxuIl19
@@ -0,0 +1,132 @@
1
+ import os from 'os'
2
+ import { resolve } from 'path'
3
+ import open from 'open'
4
+
5
+ import { CliComponents } from '../../components'
6
+ import { main as build } from '../build'
7
+ import { main as preview } from '../preview'
8
+ import { previewPort } from '../preview/port'
9
+ import { getArgs } from '../../utils/args'
10
+ import { main as handler } from '../../utils/handler'
11
+ interface Options {
12
+ args: typeof args
13
+ components: Pick<CliComponents, 'fetch' | 'fs'>
14
+ }
15
+
16
+ export const args = getArgs({
17
+ '--dir': String,
18
+ '--help': Boolean,
19
+ '--port': String,
20
+ '--no-debug': Boolean,
21
+ '--no-browser': Boolean,
22
+ '--no-watch': Boolean,
23
+ '--ci': Boolean,
24
+ '--skip-install': Boolean,
25
+ '--web3': Boolean,
26
+ '-h': '--help',
27
+ '-p': '--port',
28
+ '-d': '--no-debug',
29
+ '-b': '--no-browser',
30
+ '-w': '--no-watch',
31
+ '--skip-build': Boolean,
32
+ '--desktop-client': Boolean
33
+ })
34
+
35
+ export function help() {
36
+ return `
37
+ Usage: dcl start [options]
38
+
39
+ Options:
40
+
41
+ -h, --help Displays complete help
42
+ -p, --port [port] Select a custom port for the development server
43
+ -d, --no-debug Disable debugging panel
44
+ -b, --no-browser Do not open a new browser window
45
+ -w, --no-watch Do not open watch for filesystem changes
46
+ -c, --ci Run the parcel previewer on a remote unix server
47
+ --web3 Connects preview to browser wallet to use the associated avatar and account
48
+ --skip-build Skip build and only serve the files in preview mode
49
+ --desktop-client Show URL to launch preview in the desktop client (BETA)
50
+
51
+ Examples:
52
+
53
+ - Start a local development server for a Decentraland Scene at port 3500
54
+
55
+ $ dcl start -p 3500
56
+
57
+ - Start a local development server for a Decentraland Scene at a docker container
58
+
59
+ $ dcl start --ci
60
+ `
61
+ }
62
+
63
+ export const main = handler(async function main(options: Options) {
64
+ const dir = resolve(process.cwd(), options.args['--dir'] || '.')
65
+ const isCi = args['--ci'] || process.env.CI || false
66
+ const debug = !args['--no-debug'] && !isCi
67
+ const openBrowser = !args['--no-browser'] && !isCi
68
+ const skipBuild = args['--skip-build']
69
+ const watch = !args['--no-watch'] && !isCi && !skipBuild
70
+ const enableWeb3 = args['--web3']
71
+ const port = parseInt(args['--port']!, 10) || (await previewPort())
72
+ const baseCoords = { x: 0, y: 0 }
73
+ const hasPortableExperience = false
74
+
75
+ const comps = { components: options.components }
76
+ if (!skipBuild) {
77
+ await build({ args: { '--dir': dir, '--watch': watch }, ...comps })
78
+ }
79
+ await preview({ args: { '--dir': dir, '--port': port }, ...comps })
80
+
81
+ const ifaces = os.networkInterfaces()
82
+ const availableURLs: string[] = []
83
+
84
+ console.log(`\nPreview server is now running!`)
85
+ console.log('Available on:\n')
86
+
87
+ Object.keys(ifaces).forEach((dev) => {
88
+ ;(ifaces[dev] || []).forEach((details) => {
89
+ if (details.family === 'IPv4') {
90
+ let addr = `http://${details.address}:${port}?position=${baseCoords.x}%2C${baseCoords.y}&ENABLE_ECS7`
91
+ if (debug) {
92
+ addr = `${addr}&SCENE_DEBUG_PANEL`
93
+ }
94
+ if (enableWeb3 || hasPortableExperience) {
95
+ addr = `${addr}&ENABLE_WEB3`
96
+ }
97
+
98
+ availableURLs.push(addr)
99
+ }
100
+ })
101
+ })
102
+
103
+ // Push localhost and 127.0.0.1 at top
104
+ const sortedURLs = availableURLs.sort((a, _b) => {
105
+ return a.toLowerCase().includes('localhost') || a.includes('127.0.0.1') || a.includes('0.0.0.0') ? -1 : 1
106
+ })
107
+
108
+ for (const addr of sortedURLs) {
109
+ console.log(` ${addr}`)
110
+ }
111
+
112
+ if (args['--desktop-client']) {
113
+ console.log('\n Desktop client:\n')
114
+ for (const addr of sortedURLs) {
115
+ const searchParams = new URLSearchParams()
116
+ searchParams.append('PREVIEW-MODE', addr)
117
+ console.log(` dcl://${searchParams.toString()}&`)
118
+ }
119
+ }
120
+
121
+ console.log('\n Details:\n')
122
+ console.log('\nPress CTRL+C to exit\n')
123
+
124
+ // Open preferably localhost/127.0.0.1
125
+ if (openBrowser && sortedURLs.length && !args['--desktop-client']) {
126
+ try {
127
+ await open(sortedURLs[0])
128
+ } catch (_) {
129
+ console.log('Unable to open browser automatically.')
130
+ }
131
+ }
132
+ })
@@ -0,0 +1,5 @@
1
+ import * as undici from 'undici';
2
+ export type IFetchComponent = {
3
+ fetch(url: string, init?: undici.RequestInit): Promise<undici.Response>;
4
+ };
5
+ export declare function createFetchComponent(): IFetchComponent;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.createFetchComponent = void 0;
27
+ const undici = __importStar(require("undici"));
28
+ function createFetchComponent() {
29
+ return {
30
+ fetch: undici.fetch
31
+ };
32
+ }
33
+ exports.createFetchComponent = createFetchComponent;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmZXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFnQztBQU1oQyxTQUFnQixvQkFBb0I7SUFDbEMsT0FBTztRQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztLQUNwQixDQUFBO0FBQ0gsQ0FBQztBQUpELG9EQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdW5kaWNpIGZyb20gJ3VuZGljaSdcblxuZXhwb3J0IHR5cGUgSUZldGNoQ29tcG9uZW50ID0ge1xuICBmZXRjaCh1cmw6IHN0cmluZywgaW5pdD86IHVuZGljaS5SZXF1ZXN0SW5pdCk6IFByb21pc2U8dW5kaWNpLlJlc3BvbnNlPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmV0Y2hDb21wb25lbnQoKTogSUZldGNoQ29tcG9uZW50IHtcbiAgcmV0dXJuIHtcbiAgICBmZXRjaDogdW5kaWNpLmZldGNoXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import * as undici from 'undici'
2
+
3
+ export type IFetchComponent = {
4
+ fetch(url: string, init?: undici.RequestInit): Promise<undici.Response>
5
+ }
6
+
7
+ export function createFetchComponent(): IFetchComponent {
8
+ return {
9
+ fetch: undici.fetch
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import * as fs from 'fs';
4
+ import * as fsPromises from 'fs/promises';
5
+ export type IFileSystemComponent = Pick<typeof fs, 'createReadStream'> & Pick<typeof fs, 'createWriteStream'> & Pick<typeof fsPromises, 'access' | 'opendir' | 'stat' | 'unlink' | 'mkdir' | 'readFile' | 'writeFile'> & {
6
+ constants: Pick<typeof fs.constants, 'F_OK' | 'R_OK'>;
7
+ } & {
8
+ existPath(path: string): Promise<boolean>;
9
+ readdir(path: string): Promise<string[]>;
10
+ };
11
+ export declare function createFsComponent(): IFileSystemComponent;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.createFsComponent = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const fsPromises = __importStar(require("fs/promises"));
29
+ async function existPath(path) {
30
+ try {
31
+ await fs.promises.access(path, fs.constants.F_OK | fs.constants.R_OK);
32
+ return true;
33
+ }
34
+ catch (error) {
35
+ return false;
36
+ }
37
+ }
38
+ function createFsComponent() {
39
+ return {
40
+ createReadStream: fs.createReadStream,
41
+ createWriteStream: fs.createWriteStream,
42
+ access: fsPromises.access,
43
+ writeFile: fsPromises.writeFile,
44
+ opendir: fsPromises.opendir,
45
+ stat: fsPromises.stat,
46
+ unlink: fsPromises.unlink,
47
+ mkdir: fsPromises.mkdir,
48
+ readdir: fsPromises.readdir,
49
+ readFile: fsPromises.readFile,
50
+ constants: {
51
+ F_OK: fs.constants.F_OK,
52
+ R_OK: fs.constants.R_OK
53
+ },
54
+ existPath
55
+ };
56
+ }
57
+ exports.createFsComponent = createFsComponent;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF3QjtBQUN4Qix3REFBeUM7QUFnQnpDLEtBQUssVUFBVSxTQUFTLENBQUMsSUFBWTtJQUNuQyxJQUFJO1FBQ0YsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyRSxPQUFPLElBQUksQ0FBQTtLQUNaO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLEtBQUssQ0FBQTtLQUNiO0FBQ0gsQ0FBQztBQUtELFNBQWdCLGlCQUFpQjtJQUMvQixPQUFPO1FBQ0wsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQjtRQUNyQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsaUJBQWlCO1FBQ3ZDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtRQUN6QixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7UUFDL0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO1FBQzNCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtRQUNyQixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07UUFDekIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7UUFDN0IsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUN2QixJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1NBQ3hCO1FBQ0QsU0FBUztLQUNWLENBQUE7QUFDSCxDQUFDO0FBbEJELDhDQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJ1xuaW1wb3J0ICogYXMgZnNQcm9taXNlcyBmcm9tICdmcy9wcm9taXNlcydcblxuLyoqXG4gKiBAcHVibGljXG4gKlxuICogVGhpcyBtYXkgYmUgbW92ZWQgdG8gd2VsbC1rbm93bi1jb21wb25lbnRzIGluIHRoZSBmdXR1cmVcbiAqL1xuZXhwb3J0IHR5cGUgSUZpbGVTeXN0ZW1Db21wb25lbnQgPSBQaWNrPHR5cGVvZiBmcywgJ2NyZWF0ZVJlYWRTdHJlYW0nPiAmXG4gIFBpY2s8dHlwZW9mIGZzLCAnY3JlYXRlV3JpdGVTdHJlYW0nPiAmXG4gIFBpY2s8dHlwZW9mIGZzUHJvbWlzZXMsICdhY2Nlc3MnIHwgJ29wZW5kaXInIHwgJ3N0YXQnIHwgJ3VubGluaycgfCAnbWtkaXInIHwgJ3JlYWRGaWxlJyB8ICd3cml0ZUZpbGUnPiAmIHtcbiAgICBjb25zdGFudHM6IFBpY2s8dHlwZW9mIGZzLmNvbnN0YW50cywgJ0ZfT0snIHwgJ1JfT0snPlxuICB9ICYge1xuICAgIGV4aXN0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+XG4gICAgcmVhZGRpcihwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPlxuICB9XG5cbmFzeW5jIGZ1bmN0aW9uIGV4aXN0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MocGF0aCwgZnMuY29uc3RhbnRzLkZfT0sgfCBmcy5jb25zdGFudHMuUl9PSylcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnNDb21wb25lbnQoKTogSUZpbGVTeXN0ZW1Db21wb25lbnQge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZVJlYWRTdHJlYW06IGZzLmNyZWF0ZVJlYWRTdHJlYW0sXG4gICAgY3JlYXRlV3JpdGVTdHJlYW06IGZzLmNyZWF0ZVdyaXRlU3RyZWFtLFxuICAgIGFjY2VzczogZnNQcm9taXNlcy5hY2Nlc3MsXG4gICAgd3JpdGVGaWxlOiBmc1Byb21pc2VzLndyaXRlRmlsZSxcbiAgICBvcGVuZGlyOiBmc1Byb21pc2VzLm9wZW5kaXIsXG4gICAgc3RhdDogZnNQcm9taXNlcy5zdGF0LFxuICAgIHVubGluazogZnNQcm9taXNlcy51bmxpbmssXG4gICAgbWtkaXI6IGZzUHJvbWlzZXMubWtkaXIsXG4gICAgcmVhZGRpcjogZnNQcm9taXNlcy5yZWFkZGlyLFxuICAgIHJlYWRGaWxlOiBmc1Byb21pc2VzLnJlYWRGaWxlLFxuICAgIGNvbnN0YW50czoge1xuICAgICAgRl9PSzogZnMuY29uc3RhbnRzLkZfT0ssXG4gICAgICBSX09LOiBmcy5jb25zdGFudHMuUl9PS1xuICAgIH0sXG4gICAgZXhpc3RQYXRoXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,48 @@
1
+ import * as fs from 'fs'
2
+ import * as fsPromises from 'fs/promises'
3
+
4
+ /**
5
+ * @public
6
+ *
7
+ * This may be moved to well-known-components in the future
8
+ */
9
+ export type IFileSystemComponent = Pick<typeof fs, 'createReadStream'> &
10
+ Pick<typeof fs, 'createWriteStream'> &
11
+ Pick<typeof fsPromises, 'access' | 'opendir' | 'stat' | 'unlink' | 'mkdir' | 'readFile' | 'writeFile'> & {
12
+ constants: Pick<typeof fs.constants, 'F_OK' | 'R_OK'>
13
+ } & {
14
+ existPath(path: string): Promise<boolean>
15
+ readdir(path: string): Promise<string[]>
16
+ }
17
+
18
+ async function existPath(path: string): Promise<boolean> {
19
+ try {
20
+ await fs.promises.access(path, fs.constants.F_OK | fs.constants.R_OK)
21
+ return true
22
+ } catch (error) {
23
+ return false
24
+ }
25
+ }
26
+
27
+ /**
28
+ * @public
29
+ */
30
+ export function createFsComponent(): IFileSystemComponent {
31
+ return {
32
+ createReadStream: fs.createReadStream,
33
+ createWriteStream: fs.createWriteStream,
34
+ access: fsPromises.access,
35
+ writeFile: fsPromises.writeFile,
36
+ opendir: fsPromises.opendir,
37
+ stat: fsPromises.stat,
38
+ unlink: fsPromises.unlink,
39
+ mkdir: fsPromises.mkdir,
40
+ readdir: fsPromises.readdir,
41
+ readFile: fsPromises.readFile,
42
+ constants: {
43
+ F_OK: fs.constants.F_OK,
44
+ R_OK: fs.constants.R_OK
45
+ },
46
+ existPath
47
+ }
48
+ }
@@ -0,0 +1,7 @@
1
+ import { IFetchComponent } from './fetch';
2
+ import { IFileSystemComponent } from './fs';
3
+ export type CliComponents = {
4
+ fs: IFileSystemComponent;
5
+ fetch: IFetchComponent;
6
+ };
7
+ export declare function initComponents(): CliComponents;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initComponents = void 0;
4
+ const fetch_1 = require("./fetch");
5
+ const fs_1 = require("./fs");
6
+ function initComponents() {
7
+ return {
8
+ fs: (0, fs_1.createFsComponent)(),
9
+ fetch: (0, fetch_1.createFetchComponent)()
10
+ };
11
+ }
12
+ exports.initComponents = initComponents;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBK0Q7QUFDL0QsNkJBQThEO0FBTzlELFNBQWdCLGNBQWM7SUFDNUIsT0FBTztRQUNMLEVBQUUsRUFBRSxJQUFBLHNCQUFpQixHQUFFO1FBQ3ZCLEtBQUssRUFBRSxJQUFBLDRCQUFvQixHQUFFO0tBQzlCLENBQUE7QUFDSCxDQUFDO0FBTEQsd0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVGZXRjaENvbXBvbmVudCwgSUZldGNoQ29tcG9uZW50IH0gZnJvbSAnLi9mZXRjaCdcbmltcG9ydCB7IGNyZWF0ZUZzQ29tcG9uZW50LCBJRmlsZVN5c3RlbUNvbXBvbmVudCB9IGZyb20gJy4vZnMnXG5cbmV4cG9ydCB0eXBlIENsaUNvbXBvbmVudHMgPSB7XG4gIGZzOiBJRmlsZVN5c3RlbUNvbXBvbmVudFxuICBmZXRjaDogSUZldGNoQ29tcG9uZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29tcG9uZW50cygpOiBDbGlDb21wb25lbnRzIHtcbiAgcmV0dXJuIHtcbiAgICBmczogY3JlYXRlRnNDb21wb25lbnQoKSxcbiAgICBmZXRjaDogY3JlYXRlRmV0Y2hDb21wb25lbnQoKVxuICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { createFetchComponent, IFetchComponent } from './fetch'
2
+ import { createFsComponent, IFileSystemComponent } from './fs'
3
+
4
+ export type CliComponents = {
5
+ fs: IFileSystemComponent
6
+ fetch: IFetchComponent
7
+ }
8
+
9
+ export function initComponents(): CliComponents {
10
+ return {
11
+ fs: createFsComponent(),
12
+ fetch: createFetchComponent()
13
+ }
14
+ }
package/cli/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { getArgs } from './utils/args';
3
+ import { CliComponents } from './components';
3
4
  export interface Options {
4
5
  args: ReturnType<typeof getArgs>;
6
+ components: CliComponents;
5
7
  }
package/cli/index.js CHANGED
@@ -5,13 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const args_1 = require("./utils/args");
8
+ const out_messages_1 = require("./utils/out-messages");
8
9
  const log_1 = __importDefault(require("./utils/log"));
9
10
  const error_1 = require("./utils/error");
10
11
  const commands_1 = require("./utils/commands");
11
- const listCommandsStr = (commands) => commands
12
- .map(($) => `
13
- * npx sdk ${$}`)
14
- .join('');
12
+ const components_1 = require("./components");
13
+ const listCommandsStr = (commands) => (0, out_messages_1.toStringList)(commands.map(($) => `npx @dcl/sdk ${$}`));
15
14
  const handleError = (err) => {
16
15
  if (!(err instanceof error_1.CliError)) {
17
16
  log_1.default.warn(`Developer: All errors thrown must be an instance of "CliError"`);
@@ -34,18 +33,19 @@ const helpMessage = (commands) => `Here is the list of commands: ${listCommandsS
34
33
  (async () => {
35
34
  const command = process.argv[2];
36
35
  const needsHelp = args['--help'];
37
- const commands = await (0, commands_1.getCommands)();
36
+ const components = (0, components_1.initComponents)();
37
+ const commands = await (0, commands_1.getCommands)(components);
38
38
  if (!commands.includes(command)) {
39
39
  if (needsHelp) {
40
40
  log_1.default.info(helpMessage(commands));
41
41
  return;
42
42
  }
43
- throw new error_1.CliError(`Command ${command} is invalid. ${helpMessage}`);
43
+ throw new error_1.CliError(`Command ${command} is invalid. ${helpMessage(commands)}`);
44
44
  }
45
45
  const cmd = require(`${commands_1.COMMANDS_PATH}/${command}`);
46
46
  if (commandFnsAreValid(cmd)) {
47
- const options = { args: cmd.args };
47
+ const options = { args: cmd.args, components };
48
48
  needsHelp ? await cmd.help(options) : await cmd.main(options);
49
49
  }
50
50
  })().catch(handleError);
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSx1Q0FBc0M7QUFDdEMsc0RBQTZCO0FBQzdCLHlDQUF3QztBQUN4QywrQ0FBNkQ7QUFlN0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFrQixFQUFFLEVBQUUsQ0FDN0MsUUFBUTtLQUNMLEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Y0FDQyxDQUFDLEVBQUUsQ0FDWjtLQUNBLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUViLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLGdCQUFRLENBQUMsRUFBRTtRQUM5QixhQUFHLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUE7S0FDM0U7SUFDRCxhQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pCLENBQUMsQ0FBQTtBQUVELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFnQixFQUFnQyxFQUFFO0lBQzVFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFBO0lBQzFCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDbEIsTUFBTSxJQUFJLGdCQUFRLENBQUM7OztLQUdsQixDQUFDLENBQUE7S0FDSDtJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyxDQUFBO0FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBQSxjQUFPLEdBQUUsQ0FBQTtBQUN0QixNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUN6QyxpQ0FBaUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBRTdEO0FBQUEsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxzQkFBVyxHQUFFLENBQUE7SUFFcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDL0IsSUFBSSxTQUFTLEVBQUU7WUFDYixhQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE9BQU07U0FDUDtRQUNELE1BQU0sSUFBSSxnQkFBUSxDQUFDLFdBQVcsT0FBTyxnQkFBZ0IsV0FBVyxFQUFFLENBQUMsQ0FBQTtLQUNwRTtJQUdELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLHdCQUFhLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUVsRCxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNsQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IGdldEFyZ3MgfSBmcm9tICcuL3V0aWxzL2FyZ3MnXG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJ1xuaW1wb3J0IHsgQ2xpRXJyb3IgfSBmcm9tICcuL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgQ09NTUFORFNfUEFUSCwgZ2V0Q29tbWFuZHMgfSBmcm9tICcuL3V0aWxzL2NvbW1hbmRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICBhcmdzOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRBcmdzPlxufVxuXG4vLyBsZWF2aW5nIGFyZ3MgYXMgXCJhbnlcIiBzaW5jZSB3ZSBkb24ndCBrbm93IHlldCBpZiB3ZSB3aWxsIHVzZSB0aGVtXG50eXBlIEZpbGVGbiA9IChvcHRpb25zOiBPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG5cbmludGVyZmFjZSBGaWxlRXhwb3J0cyB7XG4gIGhlbHA/OiBGaWxlRm5cbiAgbWFpbj86IEZpbGVGblxuICBhcmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QXJncz5cbn1cblxuY29uc3QgbGlzdENvbW1hbmRzU3RyID0gKGNvbW1hbmRzOiBzdHJpbmdbXSkgPT5cbiAgY29tbWFuZHNcbiAgICAubWFwKFxuICAgICAgKCQpID0+IGBcbiAgKiBucHggc2RrICR7JH1gXG4gICAgKVxuICAgIC5qb2luKCcnKVxuXG5jb25zdCBoYW5kbGVFcnJvciA9IChlcnI6IENsaUVycm9yKSA9PiB7XG4gIGlmICghKGVyciBpbnN0YW5jZW9mIENsaUVycm9yKSkge1xuICAgIGxvZy53YXJuKGBEZXZlbG9wZXI6IEFsbCBlcnJvcnMgdGhyb3duIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgXCJDbGlFcnJvclwiYClcbiAgfVxuICBsb2cuZmFpbChlcnIubWVzc2FnZSlcbiAgcHJvY2Vzcy5leGl0KDEpXG59XG5cbmNvbnN0IGNvbW1hbmRGbnNBcmVWYWxpZCA9IChmbnM6IEZpbGVFeHBvcnRzKTogZm5zIGlzIFJlcXVpcmVkPEZpbGVFeHBvcnRzPiA9PiB7XG4gIGNvbnN0IHsgaGVscCwgbWFpbiB9ID0gZm5zXG4gIGlmICghaGVscCB8fCAhbWFpbikge1xuICAgIHRocm93IG5ldyBDbGlFcnJvcihgQ29tbWFuZCBkb2VzIG5vdCBmb2xsb3cgaW1wbGVtZW50YXRpb24gcnVsZXM6XG4gICAgICAqIFJlcXVpcmVzIGEgXCJoZWxwXCIgZnVuY3Rpb25cbiAgICAgICogUmVxdWlyZXMgYSBcIm1haW5cIiBmdW5jdGlvblxuICAgIGApXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgYXJncyA9IGdldEFyZ3MoKVxuY29uc3QgaGVscE1lc3NhZ2UgPSAoY29tbWFuZHM6IHN0cmluZ1tdKSA9PlxuICBgSGVyZSBpcyB0aGUgbGlzdCBvZiBjb21tYW5kczogJHtsaXN0Q29tbWFuZHNTdHIoY29tbWFuZHMpfWBcblxuOyhhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl1cbiAgY29uc3QgbmVlZHNIZWxwID0gYXJnc1snLS1oZWxwJ11cbiAgY29uc3QgY29tbWFuZHMgPSBhd2FpdCBnZXRDb21tYW5kcygpXG5cbiAgaWYgKCFjb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGlmIChuZWVkc0hlbHApIHtcbiAgICAgIGxvZy5pbmZvKGhlbHBNZXNzYWdlKGNvbW1hbmRzKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoYENvbW1hbmQgJHtjb21tYW5kfSBpcyBpbnZhbGlkLiAke2hlbHBNZXNzYWdlfWApXG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCBjbWQgPSByZXF1aXJlKGAke0NPTU1BTkRTX1BBVEh9LyR7Y29tbWFuZH1gKVxuXG4gIGlmIChjb21tYW5kRm5zQXJlVmFsaWQoY21kKSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IGFyZ3M6IGNtZC5hcmdzIH1cbiAgICBuZWVkc0hlbHAgPyBhd2FpdCBjbWQuaGVscChvcHRpb25zKSA6IGF3YWl0IGNtZC5tYWluKG9wdGlvbnMpXG4gIH1cbn0pKCkuY2F0Y2goaGFuZGxlRXJyb3IpXG4iXX0=
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFPQSx1Q0FBc0M7QUFDdEMsdURBQW1EO0FBQ25ELHNEQUE2QjtBQUM3Qix5Q0FBd0M7QUFDeEMsK0NBQTZEO0FBQzdELDZDQUE0RDtBQWdCNUQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFBLDJCQUFZLEVBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUV0RyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3BDLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxnQkFBUSxDQUFDLEVBQUU7UUFDOUIsYUFBRyxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFBO0tBQzNFO0lBQ0QsYUFBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqQixDQUFDLENBQUE7QUFFRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBZ0IsRUFBZ0MsRUFBRTtJQUM1RSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQTtJQUMxQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2xCLE1BQU0sSUFBSSxnQkFBUSxDQUFDOzs7S0FHbEIsQ0FBQyxDQUFBO0tBQ0g7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMsQ0FBQTtBQUVELE1BQU0sSUFBSSxHQUFHLElBQUEsY0FBTyxHQUFFLENBQUE7QUFDdEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxRQUFrQixFQUFFLEVBQUUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBRXZHO0FBQUEsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2hDLE1BQU0sVUFBVSxHQUFrQixJQUFBLDJCQUFjLEdBQUUsQ0FBQTtJQUVsRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsc0JBQVcsRUFBQyxVQUFVLENBQUMsQ0FBQTtJQUU5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMvQixJQUFJLFNBQVMsRUFBRTtZQUNiLGFBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDL0IsT0FBTTtTQUNQO1FBQ0QsTUFBTSxJQUFJLGdCQUFRLENBQUMsV0FBVyxPQUFPLGdCQUFnQixXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0tBQzlFO0lBR0QsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsd0JBQWEsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBRWxELElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDM0IsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQTtRQUM5QyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qXG4gIGlzdGFuYnVsIGlnbm9yZSBmaWxlXG4gIERvZXNuJ3QgbWFrZSBzZW5zZSB0byB0ZXN0IHRoaXMgZmlsZVxuKi9cblxuaW1wb3J0IHsgZ2V0QXJncyB9IGZyb20gJy4vdXRpbHMvYXJncydcbmltcG9ydCB7IHRvU3RyaW5nTGlzdCB9IGZyb20gJy4vdXRpbHMvb3V0LW1lc3NhZ2VzJ1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZydcbmltcG9ydCB7IENsaUVycm9yIH0gZnJvbSAnLi91dGlscy9lcnJvcidcbmltcG9ydCB7IENPTU1BTkRTX1BBVEgsIGdldENvbW1hbmRzIH0gZnJvbSAnLi91dGlscy9jb21tYW5kcydcbmltcG9ydCB7IENsaUNvbXBvbmVudHMsIGluaXRDb21wb25lbnRzIH0gZnJvbSAnLi9jb21wb25lbnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICBhcmdzOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRBcmdzPlxuICBjb21wb25lbnRzOiBDbGlDb21wb25lbnRzXG59XG5cbi8vIGxlYXZpbmcgYXJncyBhcyBcImFueVwiIHNpbmNlIHdlIGRvbid0IGtub3cgeWV0IGlmIHdlIHdpbGwgdXNlIHRoZW1cbnR5cGUgRmlsZUZuID0gKG9wdGlvbnM6IE9wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cblxuaW50ZXJmYWNlIEZpbGVFeHBvcnRzIHtcbiAgaGVscD86IEZpbGVGblxuICBtYWluPzogRmlsZUZuXG4gIGFyZ3M/OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRBcmdzPlxufVxuXG5jb25zdCBsaXN0Q29tbWFuZHNTdHIgPSAoY29tbWFuZHM6IHN0cmluZ1tdKSA9PiB0b1N0cmluZ0xpc3QoY29tbWFuZHMubWFwKCgkKSA9PiBgbnB4IEBkY2wvc2RrICR7JH1gKSlcblxuY29uc3QgaGFuZGxlRXJyb3IgPSAoZXJyOiBDbGlFcnJvcikgPT4ge1xuICBpZiAoIShlcnIgaW5zdGFuY2VvZiBDbGlFcnJvcikpIHtcbiAgICBsb2cud2FybihgRGV2ZWxvcGVyOiBBbGwgZXJyb3JzIHRocm93biBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFwiQ2xpRXJyb3JcImApXG4gIH1cbiAgbG9nLmZhaWwoZXJyLm1lc3NhZ2UpXG4gIHByb2Nlc3MuZXhpdCgxKVxufVxuXG5jb25zdCBjb21tYW5kRm5zQXJlVmFsaWQgPSAoZm5zOiBGaWxlRXhwb3J0cyk6IGZucyBpcyBSZXF1aXJlZDxGaWxlRXhwb3J0cz4gPT4ge1xuICBjb25zdCB7IGhlbHAsIG1haW4gfSA9IGZuc1xuICBpZiAoIWhlbHAgfHwgIW1haW4pIHtcbiAgICB0aHJvdyBuZXcgQ2xpRXJyb3IoYENvbW1hbmQgZG9lcyBub3QgZm9sbG93IGltcGxlbWVudGF0aW9uIHJ1bGVzOlxuICAgICAgKiBSZXF1aXJlcyBhIFwiaGVscFwiIGZ1bmN0aW9uXG4gICAgICAqIFJlcXVpcmVzIGEgXCJtYWluXCIgZnVuY3Rpb25cbiAgICBgKVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IGFyZ3MgPSBnZXRBcmdzKClcbmNvbnN0IGhlbHBNZXNzYWdlID0gKGNvbW1hbmRzOiBzdHJpbmdbXSkgPT4gYEhlcmUgaXMgdGhlIGxpc3Qgb2YgY29tbWFuZHM6ICR7bGlzdENvbW1hbmRzU3RyKGNvbW1hbmRzKX1gXG5cbjsoYXN5bmMgKCkgPT4ge1xuICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5hcmd2WzJdXG4gIGNvbnN0IG5lZWRzSGVscCA9IGFyZ3NbJy0taGVscCddXG4gIGNvbnN0IGNvbXBvbmVudHM6IENsaUNvbXBvbmVudHMgPSBpbml0Q29tcG9uZW50cygpXG5cbiAgY29uc3QgY29tbWFuZHMgPSBhd2FpdCBnZXRDb21tYW5kcyhjb21wb25lbnRzKVxuXG4gIGlmICghY29tbWFuZHMuaW5jbHVkZXMoY29tbWFuZCkpIHtcbiAgICBpZiAobmVlZHNIZWxwKSB7XG4gICAgICBsb2cuaW5mbyhoZWxwTWVzc2FnZShjb21tYW5kcykpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhyb3cgbmV3IENsaUVycm9yKGBDb21tYW5kICR7Y29tbWFuZH0gaXMgaW52YWxpZC4gJHtoZWxwTWVzc2FnZShjb21tYW5kcyl9YClcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gIGNvbnN0IGNtZCA9IHJlcXVpcmUoYCR7Q09NTUFORFNfUEFUSH0vJHtjb21tYW5kfWApXG5cbiAgaWYgKGNvbW1hbmRGbnNBcmVWYWxpZChjbWQpKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgYXJnczogY21kLmFyZ3MsIGNvbXBvbmVudHMgfVxuICAgIG5lZWRzSGVscCA/IGF3YWl0IGNtZC5oZWxwKG9wdGlvbnMpIDogYXdhaXQgY21kLm1haW4ob3B0aW9ucylcbiAgfVxufSkoKS5jYXRjaChoYW5kbGVFcnJvcilcbiJdfQ==