@dcl/sdk 7.0.6-4197739270.commit-db87ed8 → 7.0.6-4218076982.commit-7ba834d
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/package.json +6 -30
- package/cli/commands/build/helpers.d.ts +0 -21
- package/cli/commands/build/helpers.js +0 -50
- package/cli/commands/build/helpers.ts +0 -89
- package/cli/commands/build/index.d.ts +0 -19
- package/cli/commands/build/index.js +0 -69
- package/cli/commands/build/index.ts +0 -91
- package/cli/commands/init/index.d.ts +0 -17
- package/cli/commands/init/index.js +0 -51
- package/cli/commands/init/index.ts +0 -67
- package/cli/commands/init/repos.d.ts +0 -9
- package/cli/commands/init/repos.js +0 -12
- package/cli/commands/init/repos.ts +0 -17
- package/cli/commands/preview/bff.d.ts +0 -3
- package/cli/commands/preview/bff.js +0 -54
- package/cli/commands/preview/bff.ts +0 -63
- package/cli/commands/preview/catalyst.d.ts +0 -5
- package/cli/commands/preview/catalyst.js +0 -24
- package/cli/commands/preview/catalyst.ts +0 -31
- package/cli/commands/preview/coordinates.d.ts +0 -20
- package/cli/commands/preview/coordinates.js +0 -90
- package/cli/commands/preview/coordinates.ts +0 -146
- package/cli/commands/preview/endpoints.d.ts +0 -10
- package/cli/commands/preview/endpoints.js +0 -455
- package/cli/commands/preview/endpoints.ts +0 -568
- package/cli/commands/preview/eth.d.ts +0 -2
- package/cli/commands/preview/eth.js +0 -6
- package/cli/commands/preview/eth.ts +0 -3
- package/cli/commands/preview/index.d.ts +0 -20
- package/cli/commands/preview/index.js +0 -100
- package/cli/commands/preview/index.ts +0 -98
- package/cli/commands/preview/port.d.ts +0 -1
- package/cli/commands/preview/port.js +0 -21
- package/cli/commands/preview/port.ts +0 -15
- package/cli/commands/preview/project.d.ts +0 -14
- package/cli/commands/preview/project.js +0 -77
- package/cli/commands/preview/project.ts +0 -112
- package/cli/commands/preview/types.d.ts +0 -18
- package/cli/commands/preview/types.js +0 -3
- package/cli/commands/preview/types.ts +0 -26
- package/cli/commands/preview/wire.d.ts +0 -2
- package/cli/commands/preview/wire.js +0 -66
- package/cli/commands/preview/wire.ts +0 -70
- package/cli/commands/preview/ws.d.ts +0 -7
- package/cli/commands/preview/ws.js +0 -16
- package/cli/commands/preview/ws.ts +0 -24
- package/cli/commands/start/index.d.ts +0 -29
- package/cli/commands/start/index.js +0 -126
- package/cli/commands/start/index.ts +0 -145
- package/cli/components/fetch.d.ts +0 -5
- package/cli/components/fetch.js +0 -34
- package/cli/components/fetch.ts +0 -11
- package/cli/components/fs.d.ts +0 -12
- package/cli/components/fs.js +0 -69
- package/cli/components/fs.ts +0 -62
- package/cli/components/index.d.ts +0 -7
- package/cli/components/index.js +0 -13
- package/cli/components/index.ts +0 -14
- package/cli/index.d.ts +0 -7
- package/cli/index.js +0 -76
- package/cli/index.ts +0 -85
- package/cli/utils/args.d.ts +0 -10
- package/cli/utils/args.js +0 -16
- package/cli/utils/args.ts +0 -18
- package/cli/utils/commands.d.ts +0 -3
- package/cli/utils/commands.js +0 -24
- package/cli/utils/commands.ts +0 -28
- package/cli/utils/dcl-ignore.d.ts +0 -4
- package/cli/utils/dcl-ignore.js +0 -44
- package/cli/utils/dcl-ignore.ts +0 -45
- package/cli/utils/error.d.ts +0 -2
- package/cli/utils/error.js +0 -7
- package/cli/utils/error.ts +0 -1
- package/cli/utils/exec.d.ts +0 -8
- package/cli/utils/exec.js +0 -32
- package/cli/utils/exec.ts +0 -42
- package/cli/utils/fs.d.ts +0 -10
- package/cli/utils/fs.js +0 -26
- package/cli/utils/fs.ts +0 -41
- package/cli/utils/log.d.ts +0 -5
- package/cli/utils/log.js +0 -29
- package/cli/utils/log.ts +0 -39
- package/cli/utils/object.d.ts +0 -9
- package/cli/utils/object.js +0 -45
- package/cli/utils/object.ts +0 -62
- package/cli/utils/out-messages.d.ts +0 -1
- package/cli/utils/out-messages.js +0 -8
- package/cli/utils/out-messages.ts +0 -3
@@ -1,70 +0,0 @@
|
|
1
|
-
import path from 'path'
|
2
|
-
import chokidar from 'chokidar'
|
3
|
-
import { sdk } from '@dcl/schemas'
|
4
|
-
import { WebSocket } from 'ws'
|
5
|
-
import { setupBffAndComms } from './bff'
|
6
|
-
import { Router } from '@well-known-components/http-server'
|
7
|
-
import { setupEcs6Endpoints } from './endpoints'
|
8
|
-
import { PreviewComponents } from './types'
|
9
|
-
import { upgradeWebSocketResponse } from '@well-known-components/http-server/dist/ws'
|
10
|
-
import { getDCLIgnorePatterns } from '../../utils/dcl-ignore'
|
11
|
-
|
12
|
-
export async function wire(components: PreviewComponents, dir: string, watch: boolean = false) {
|
13
|
-
const router = new Router<PreviewComponents>()
|
14
|
-
|
15
|
-
const sceneUpdateClients = new Set<WebSocket>()
|
16
|
-
|
17
|
-
router.get('/', async (ctx, next) => {
|
18
|
-
if (ctx.request.headers.get('upgrade') === 'websocket') {
|
19
|
-
return upgradeWebSocketResponse((ws) => initWsConnection(ws as any as WebSocket, sceneUpdateClients))
|
20
|
-
}
|
21
|
-
|
22
|
-
return next()
|
23
|
-
})
|
24
|
-
|
25
|
-
setupBffAndComms(components, router)
|
26
|
-
setupEcs6Endpoints(components, dir, router)
|
27
|
-
|
28
|
-
components.server.setContext(components)
|
29
|
-
components.server.use(router.allowedMethods())
|
30
|
-
components.server.use(router.middleware())
|
31
|
-
|
32
|
-
if (watch) {
|
33
|
-
const { clients } = components.ws.ws
|
34
|
-
const ignored = await getDCLIgnorePatterns(components, dir)
|
35
|
-
|
36
|
-
chokidar
|
37
|
-
.watch(path.resolve(dir), {
|
38
|
-
ignored,
|
39
|
-
ignoreInitial: false,
|
40
|
-
cwd: dir
|
41
|
-
})
|
42
|
-
.on('all', async (_, _file) => {
|
43
|
-
// TODO: accumulate changes in an array and debounce
|
44
|
-
return updateScene(dir, clients)
|
45
|
-
})
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
const initWsConnection = (ws: WebSocket, clients: Set<WebSocket>) => {
|
50
|
-
if (ws.readyState === ws.OPEN) {
|
51
|
-
clients.add(ws)
|
52
|
-
} else {
|
53
|
-
ws.on('open', () => clients.add(ws))
|
54
|
-
}
|
55
|
-
ws.on('close', () => clients.delete(ws))
|
56
|
-
}
|
57
|
-
|
58
|
-
const updateScene = (dir: string, clients: Set<WebSocket>): void => {
|
59
|
-
for (const client of clients) {
|
60
|
-
if (client.readyState === WebSocket.OPEN) {
|
61
|
-
const message: sdk.SceneUpdate = {
|
62
|
-
type: sdk.SCENE_UPDATE,
|
63
|
-
payload: { sceneId: 'b64-' + Buffer.from(dir).toString('base64'), sceneType: sdk.ProjectType.SCENE }
|
64
|
-
}
|
65
|
-
|
66
|
-
client.send(sdk.UPDATE)
|
67
|
-
client.send(JSON.stringify(message))
|
68
|
-
}
|
69
|
-
}
|
70
|
-
}
|
@@ -1,7 +0,0 @@
|
|
1
|
-
import { WebSocketServer } from 'ws';
|
2
|
-
import { PreviewComponents } from './types';
|
3
|
-
import { IBaseComponent } from '@well-known-components/interfaces';
|
4
|
-
export type WebSocketComponent = IBaseComponent & {
|
5
|
-
ws: WebSocketServer;
|
6
|
-
};
|
7
|
-
export declare function createWsComponent(_: Pick<PreviewComponents, 'logs'>): Promise<WebSocketComponent>;
|
@@ -1,16 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.createWsComponent = void 0;
|
4
|
-
const ws_1 = require("ws");
|
5
|
-
async function createWsComponent(_) {
|
6
|
-
const ws = new ws_1.WebSocketServer({ noServer: true });
|
7
|
-
async function stop() {
|
8
|
-
ws.close();
|
9
|
-
}
|
10
|
-
return {
|
11
|
-
stop,
|
12
|
-
ws
|
13
|
-
};
|
14
|
-
}
|
15
|
-
exports.createWsComponent = createWsComponent;
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQkFBb0M7QUFZN0IsS0FBSyxVQUFVLGlCQUFpQixDQUFDLENBQWtDO0lBQ3hFLE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRWxELEtBQUssVUFBVSxJQUFJO1FBQ2pCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNaLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSTtRQUNKLEVBQUU7S0FDSCxDQUFBO0FBQ0gsQ0FBQztBQVhELDhDQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSAnd3MnXG5pbXBvcnQgeyBQcmV2aWV3Q29tcG9uZW50cyB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBJQmFzZUNvbXBvbmVudCB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaW50ZXJmYWNlcydcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29tcG9uZW50ID0gSUJhc2VDb21wb25lbnQgJiB7XG4gIHdzOiBXZWJTb2NrZXRTZXJ2ZXJcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgd3Mtc2VydmVyIGNvbXBvbmVudFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV3NDb21wb25lbnQoXzogUGljazxQcmV2aWV3Q29tcG9uZW50cywgJ2xvZ3MnPik6IFByb21pc2U8V2ViU29ja2V0Q29tcG9uZW50PiB7XG4gIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7IG5vU2VydmVyOiB0cnVlIH0pXG5cbiAgYXN5bmMgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB3cy5jbG9zZSgpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0b3AsXG4gICAgd3NcbiAgfVxufVxuIl19
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import { WebSocketServer } from 'ws'
|
2
|
-
import { PreviewComponents } from './types'
|
3
|
-
import { IBaseComponent } from '@well-known-components/interfaces'
|
4
|
-
|
5
|
-
export type WebSocketComponent = IBaseComponent & {
|
6
|
-
ws: WebSocketServer
|
7
|
-
}
|
8
|
-
|
9
|
-
/**
|
10
|
-
* Creates a ws-server component
|
11
|
-
* @public
|
12
|
-
*/
|
13
|
-
export async function createWsComponent(_: Pick<PreviewComponents, 'logs'>): Promise<WebSocketComponent> {
|
14
|
-
const ws = new WebSocketServer({ noServer: true })
|
15
|
-
|
16
|
-
async function stop() {
|
17
|
-
ws.close()
|
18
|
-
}
|
19
|
-
|
20
|
-
return {
|
21
|
-
stop,
|
22
|
-
ws
|
23
|
-
}
|
24
|
-
}
|
@@ -1,29 +0,0 @@
|
|
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 function main(options: Options): Promise<void>;
|
29
|
-
export {};
|
@@ -1,126 +0,0 @@
|
|
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 helpers_1 = require("../build/helpers");
|
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
|
-
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'];
|
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, helpers_1.npmRun)(dir, 'build');
|
75
|
-
}
|
76
|
-
if (watch) {
|
77
|
-
await (0, build_1.main)(Object.assign({ args: { '--dir': dir, '--watch': watch } }, comps));
|
78
|
-
}
|
79
|
-
const server = await (0, preview_1.main)(Object.assign({ args: { '--dir': dir, '--port': port, '--watch': watch } }, comps));
|
80
|
-
const networkInterfaces = os_1.default.networkInterfaces();
|
81
|
-
const availableURLs = [];
|
82
|
-
console.log(`\nPreview server is now running!`);
|
83
|
-
console.log('Available on:\n');
|
84
|
-
Object.keys(networkInterfaces).forEach((dev) => {
|
85
|
-
;
|
86
|
-
(networkInterfaces[dev] || []).forEach((details) => {
|
87
|
-
if (details.family === 'IPv4') {
|
88
|
-
let addr = `http://${details.address}:${port}?position=${baseCoords.x}%2C${baseCoords.y}&ENABLE_ECS7`;
|
89
|
-
if (debug) {
|
90
|
-
addr = `${addr}&SCENE_DEBUG_PANEL`;
|
91
|
-
}
|
92
|
-
if (enableWeb3 || hasPortableExperience) {
|
93
|
-
addr = `${addr}&ENABLE_WEB3`;
|
94
|
-
}
|
95
|
-
availableURLs.push(addr);
|
96
|
-
}
|
97
|
-
});
|
98
|
-
});
|
99
|
-
const sortedURLs = availableURLs.sort((a, _b) => {
|
100
|
-
return a.toLowerCase().includes('localhost') || a.includes('127.0.0.1') || a.includes('0.0.0.0') ? -1 : 1;
|
101
|
-
});
|
102
|
-
for (const addr of sortedURLs) {
|
103
|
-
console.log(` ${addr}`);
|
104
|
-
}
|
105
|
-
if (exports.args['--desktop-client']) {
|
106
|
-
console.log('\n Desktop client:\n');
|
107
|
-
for (const addr of sortedURLs) {
|
108
|
-
const searchParams = new URLSearchParams();
|
109
|
-
searchParams.append('PREVIEW-MODE', addr);
|
110
|
-
console.log(` dcl://${searchParams.toString()}&`);
|
111
|
-
}
|
112
|
-
}
|
113
|
-
console.log('\n Details:\n');
|
114
|
-
console.log('\nPress CTRL+C to exit\n');
|
115
|
-
if (openBrowser && sortedURLs.length && !exports.args['--desktop-client']) {
|
116
|
-
try {
|
117
|
-
await (0, open_1.default)(sortedURLs[0]);
|
118
|
-
}
|
119
|
-
catch (_) {
|
120
|
-
console.log('Unable to open browser automatically.');
|
121
|
-
}
|
122
|
-
}
|
123
|
-
await server.components.signaler.programClosed;
|
124
|
-
}
|
125
|
-
exports.main = main;
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBbUI7QUFDbkIsK0JBQThCO0FBQzlCLGdEQUF1QjtBQUd2QixvQ0FBd0M7QUFDeEMsd0NBQTRDO0FBQzVDLDBDQUE2QztBQUM3QywyQ0FBMEM7QUFDMUMsOENBQXlDO0FBTzVCLFFBQUEsSUFBSSxHQUFHLElBQUEsY0FBTyxFQUFDO0lBQzFCLE9BQU8sRUFBRSxNQUFNO0lBQ2YsUUFBUSxFQUFFLE9BQU87SUFDakIsUUFBUSxFQUFFLE1BQU07SUFDaEIsWUFBWSxFQUFFLE9BQU87SUFDckIsY0FBYyxFQUFFLE9BQU87SUFDdkIsWUFBWSxFQUFFLE9BQU87SUFDckIsTUFBTSxFQUFFLE9BQU87SUFDZixnQkFBZ0IsRUFBRSxPQUFPO0lBQ3pCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLFFBQVE7SUFDZCxJQUFJLEVBQUUsWUFBWTtJQUNsQixJQUFJLEVBQUUsY0FBYztJQUNwQixJQUFJLEVBQUUsWUFBWTtJQUNsQixjQUFjLEVBQUUsT0FBTztJQUN2QixrQkFBa0IsRUFBRSxPQUFPO0NBQzVCLENBQUMsQ0FBQTtBQUVGLFNBQWdCLElBQUk7SUFDbEIsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0JSLENBQUE7QUFDRCxDQUFDO0FBMUJELG9CQTBCQztBQUVNLEtBQUssVUFBVSxJQUFJLENBQUMsT0FBZ0I7SUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBQSxjQUFPLEVBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUE7SUFDaEUsTUFBTSxJQUFJLEdBQUcsWUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FB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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDM0csQ0FBQyxDQUFDLENBQUE7SUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRTtRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTtLQUMzQjtJQUVELElBQUksWUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7UUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ3BDLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFO1lBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUE7WUFDMUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUE7U0FDckQ7S0FDRjtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFHdkMsSUFBSSxXQUFXLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1FBQ2pFLElBQUk7WUFDRixNQUFNLElBQUEsY0FBSSxFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQzFCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUE7U0FDckQ7S0FDRjtJQUdELE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFBO0FBQ2hELENBQUM7QUFqRkQsb0JBaUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gJ29zJ1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgb3BlbiBmcm9tICdvcGVuJ1xuXG5pbXBvcnQgeyBDbGlDb21wb25lbnRzIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cydcbmltcG9ydCB7IG1haW4gYXMgYnVpbGQgfSBmcm9tICcuLi9idWlsZCdcbmltcG9ydCB7IG1haW4gYXMgcHJldmlldyB9IGZyb20gJy4uL3ByZXZpZXcnXG5pbXBvcnQgeyBwcmV2aWV3UG9ydCB9IGZyb20gJy4uL3ByZXZpZXcvcG9ydCdcbmltcG9ydCB7IGdldEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9hcmdzJ1xuaW1wb3J0IHsgbnBtUnVuIH0gZnJvbSAnLi4vYnVpbGQvaGVscGVycydcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBhcmdzOiB0eXBlb2YgYXJnc1xuICBjb21wb25lbnRzOiBQaWNrPENsaUNvbXBvbmVudHMsICdmZXRjaCcgfCAnZnMnPlxufVxuXG5leHBvcnQgY29uc3QgYXJncyA9IGdldEFyZ3Moe1xuICAnLS1kaXInOiBTdHJpbmcsXG4gICctLWhlbHAnOiBCb29sZWFuLFxuICAnLS1wb3J0JzogU3RyaW5nLFxuICAnLS1uby1kZWJ1Zyc6IEJvb2xlYW4sXG4gICctLW5vLWJyb3dzZXInOiBCb29sZWFuLFxuICAnLS1uby13YXRjaCc6IEJvb2xlYW4sXG4gICctLWNpJzogQm9vbGVhbixcbiAgJy0tc2tpcC1pbnN0YWxsJzogQm9vbGVhbixcbiAgJy0td2ViMyc6IEJvb2xlYW4sXG4gICctaCc6ICctLWhlbHAnLFxuICAnLXAnOiAnLS1wb3J0JyxcbiAgJy1kJzogJy0tbm8tZGVidWcnLFxuICAnLWInOiAnLS1uby1icm93c2VyJyxcbiAgJy13JzogJy0tbm8td2F0Y2gnLFxuICAnLS1za2lwLWJ1aWxkJzogQm9vbGVhbixcbiAgJy0tZGVza3RvcC1jbGllbnQnOiBCb29sZWFuXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gaGVscCgpIHtcbiAgcmV0dXJuIGBcbiAgVXNhZ2U6IGRjbCBzdGFydCBbb3B0aW9uc11cblxuICAgIE9wdGlvbnM6XG5cbiAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgRGlzcGxheXMgY29tcGxldGUgaGVscFxuICAgICAgLXAsIC0tcG9ydCAgICAgICAgW3BvcnRdICBTZWxlY3QgYSBjdXN0b20gcG9ydCBmb3IgdGhlIGRldmVsb3BtZW50IHNlcnZlclxuICAgICAgLWQsIC0tbm8tZGVidWcgICAgICAgICAgICBEaXNhYmxlIGRlYnVnZ2luZyBwYW5lbFxuICAgICAgLWIsIC0tbm8tYnJvd3NlciAgICAgICAgICBEbyBub3Qgb3BlbiBhIG5ldyBicm93c2VyIHdpbmRvd1xuICAgICAgLXcsIC0tbm8td2F0Y2ggICAgICAgICAgICBEbyBub3Qgb3BlbiB3YXRjaCBmb3IgZmlsZXN5c3RlbSBjaGFuZ2VzXG4gICAgICAtYywgLS1jaSAgICAgICAgICAgICAgICAgIFJ1biB0aGUgcGFyY2VsIHByZXZpZXdlciBvbiBhIHJlbW90ZSB1bml4IHNlcnZlclxuICAgICAgLS13ZWIzICAgICAgICAgICAgICAgICAgICBDb25uZWN0cyBwcmV2aWV3IHRvIGJyb3dzZXIgd2FsbGV0IHRvIHVzZSB0aGUgYXNzb2NpYXRlZCBhdmF0YXIgYW5kIGFjY291bnRcbiAgICAgIC0tc2tpcC1idWlsZCAgICAgICAgICAgICAgU2tpcCBidWlsZCBhbmQgb25seSBzZXJ2ZSB0aGUgZmlsZXMgaW4gcHJldmlldyBtb2RlXG4gICAgICAtLWRlc2t0b3AtY2xpZW50ICAgICAgICAgIFNob3cgVVJMIHRvIGxhdW5jaCBwcmV2aWV3IGluIHRoZSBkZXNrdG9wIGNsaWVudCAoQkVUQSlcblxuICAgIEV4YW1wbGVzOlxuXG4gICAgLSBTdGFydCBhIGxvY2FsIGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBEZWNlbnRyYWxhbmQgU2NlbmUgYXQgcG9ydCAzNTAwXG5cbiAgICAgICQgZGNsIHN0YXJ0IC1wIDM1MDBcblxuICAgIC0gU3RhcnQgYSBsb2NhbCBkZXZlbG9wbWVudCBzZXJ2ZXIgZm9yIGEgRGVjZW50cmFsYW5kIFNjZW5lIGF0IGEgZG9ja2VyIGNvbnRhaW5lclxuXG4gICAgICAkIGRjbCBzdGFydCAtLWNpXG5gXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgY29uc3QgZGlyID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLmFyZ3NbJy0tZGlyJ10gfHwgJy4nKVxuICBjb25zdCBpc0NpID0gYXJnc1snLS1jaSddIHx8IHByb2Nlc3MuZW52LkNJIHx8IGZhbHNlXG4gIGNvbnN0IGRlYnVnID0gIWFyZ3NbJy0tbm8tZGVidWcnXSAmJiAhaXNDaVxuICBjb25zdCBvcGVuQnJvd3NlciA9ICFhcmdzWyctLW5vLWJyb3dzZXInXSAmJiAhaXNDaVxuICBjb25zdCBza2lwQnVpbGQgPSBhcmdzWyctLXNraXAtYnVpbGQnXVxuICBjb25zdCB3YXRjaCA9ICFhcmdzWyctLW5vLXdhdGNoJ11cbiAgY29uc3QgZW5hYmxlV2ViMyA9IGFyZ3NbJy0td2ViMyddXG4gIGNvbnN0IHBvcnQgPSBwYXJzZUludChhcmdzWyctLXBvcnQnXSEsIDEwKSB8fCAoYXdhaXQgcHJldmlld1BvcnQoKSlcbiAgY29uc3QgYmFzZUNvb3JkcyA9IHsgeDogMCwgeTogMCB9XG4gIGNvbnN0IGhhc1BvcnRhYmxlRXhwZXJpZW5jZSA9IGZhbHNlXG5cbiAgY29uc3QgY29tcHMgPSB7IGNvbXBvbmVudHM6IG9wdGlvbnMuY29tcG9uZW50cyB9XG5cbiAgLy8gZmlyc3QgcnVuIGBucG0gcnVuIGJ1aWxkYCwgdGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCAtLXNraXAtYnVpbGRcbiAgaWYgKCFza2lwQnVpbGQpIHtcbiAgICBhd2FpdCBucG1SdW4oZGlyLCAnYnVpbGQnKVxuICB9XG5cbiAgLy8gdGhlbiBzdGFydCB0aGUgZW1iZWRkZWQgY29tcGlsZXIsIHRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggLS1uby13YXRjaFxuICBpZiAod2F0Y2gpIHtcbiAgICBhd2FpdCBidWlsZCh7IGFyZ3M6IHsgJy0tZGlyJzogZGlyLCAnLS13YXRjaCc6IHdhdGNoIH0sIC4uLmNvbXBzIH0pXG4gIH1cblxuICAvLyBhZnRlciB0aGUgd2F0Y2hlciBpcyBydW5uaW5nLCBzdGFydCB0aGUgc2VydmVyXG4gIGNvbnN0IHNlcnZlciA9IGF3YWl0IHByZXZpZXcoeyBhcmdzOiB7ICctLWRpcic6IGRpciwgJy0tcG9ydCc6IHBvcnQsICctLXdhdGNoJzogd2F0Y2ggfSwgLi4uY29tcHMgfSlcblxuICBjb25zdCBuZXR3b3JrSW50ZXJmYWNlcyA9IG9zLm5ldHdvcmtJbnRlcmZhY2VzKClcbiAgY29uc3QgYXZhaWxhYmxlVVJMczogc3RyaW5nW10gPSBbXVxuXG4gIGNvbnNvbGUubG9nKGBcXG5QcmV2aWV3IHNlcnZlciBpcyBub3cgcnVubmluZyFgKVxuICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIG9uOlxcbicpXG5cbiAgT2JqZWN0LmtleXMobmV0d29ya0ludGVyZmFjZXMpLmZvckVhY2goKGRldikgPT4ge1xuICAgIDsobmV0d29ya0ludGVyZmFjZXNbZGV2XSB8fCBbXSkuZm9yRWFjaCgoZGV0YWlscykgPT4ge1xuICAgICAgaWYgKGRldGFpbHMuZmFtaWx5ID09PSAnSVB2NCcpIHtcbiAgICAgICAgbGV0IGFkZHIgPSBgaHR0cDovLyR7ZGV0YWlscy5hZGRyZXNzfToke3BvcnR9P3Bvc2l0aW9uPSR7YmFzZUNvb3Jkcy54fSUyQyR7YmFzZUNvb3Jkcy55fSZFTkFCTEVfRUNTN2BcbiAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgYWRkciA9IGAke2FkZHJ9JlNDRU5FX0RFQlVHX1BBTkVMYFxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmFibGVXZWIzIHx8IGhhc1BvcnRhYmxlRXhwZXJpZW5jZSkge1xuICAgICAgICAgIGFkZHIgPSBgJHthZGRyfSZFTkFCTEVfV0VCM2BcbiAgICAgICAgfVxuXG4gICAgICAgIGF2YWlsYWJsZVVSTHMucHVzaChhZGRyKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgLy8gUHVzaCBsb2NhbGhvc3QgYW5kIDEyNy4wLjAuMSBhdCB0b3BcbiAgY29uc3Qgc29ydGVkVVJMcyA9IGF2YWlsYWJsZVVSTHMuc29ydCgoYSwgX2IpID0+IHtcbiAgICByZXR1cm4gYS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdsb2NhbGhvc3QnKSB8fCBhLmluY2x1ZGVzKCcxMjcuMC4wLjEnKSB8fCBhLmluY2x1ZGVzKCcwLjAuMC4wJykgPyAtMSA6IDFcbiAgfSlcblxuICBmb3IgKGNvbnN0IGFkZHIgb2Ygc29ydGVkVVJMcykge1xuICAgIGNvbnNvbGUubG9nKGAgICAgJHthZGRyfWApXG4gIH1cblxuICBpZiAoYXJnc1snLS1kZXNrdG9wLWNsaWVudCddKSB7XG4gICAgY29uc29sZS5sb2coJ1xcbiAgRGVza3RvcCBjbGllbnQ6XFxuJylcbiAgICBmb3IgKGNvbnN0IGFkZHIgb2Ygc29ydGVkVVJMcykge1xuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKCdQUkVWSUVXLU1PREUnLCBhZGRyKVxuICAgICAgY29uc29sZS5sb2coYCAgICBkY2w6Ly8ke3NlYXJjaFBhcmFtcy50b1N0cmluZygpfSZgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdcXG4gIERldGFpbHM6XFxuJylcbiAgY29uc29sZS5sb2coJ1xcblByZXNzIENUUkwrQyB0byBleGl0XFxuJylcblxuICAvLyBPcGVuIHByZWZlcmFibHkgbG9jYWxob3N0LzEyNy4wLjAuMVxuICBpZiAob3BlbkJyb3dzZXIgJiYgc29ydGVkVVJMcy5sZW5ndGggJiYgIWFyZ3NbJy0tZGVza3RvcC1jbGllbnQnXSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvcGVuKHNvcnRlZFVSTHNbMF0pXG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBvcGVuIGJyb3dzZXIgYXV0b21hdGljYWxseS4nKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMgc2lnbmFsIGlzIHJlc29sdmVkIGJ5OiAod2tjKXByb2dyYW0uc3RvcCgpLCBTSUdURVJNLCBTSUdIVVBcbiAgYXdhaXQgc2VydmVyLmNvbXBvbmVudHMuc2lnbmFsZXIucHJvZ3JhbUNsb3NlZFxufVxuIl19
|
@@ -1,145 +0,0 @@
|
|
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 { npmRun } from '../build/helpers'
|
11
|
-
|
12
|
-
interface Options {
|
13
|
-
args: typeof args
|
14
|
-
components: Pick<CliComponents, 'fetch' | 'fs'>
|
15
|
-
}
|
16
|
-
|
17
|
-
export const args = getArgs({
|
18
|
-
'--dir': String,
|
19
|
-
'--help': Boolean,
|
20
|
-
'--port': String,
|
21
|
-
'--no-debug': Boolean,
|
22
|
-
'--no-browser': Boolean,
|
23
|
-
'--no-watch': Boolean,
|
24
|
-
'--ci': Boolean,
|
25
|
-
'--skip-install': Boolean,
|
26
|
-
'--web3': Boolean,
|
27
|
-
'-h': '--help',
|
28
|
-
'-p': '--port',
|
29
|
-
'-d': '--no-debug',
|
30
|
-
'-b': '--no-browser',
|
31
|
-
'-w': '--no-watch',
|
32
|
-
'--skip-build': Boolean,
|
33
|
-
'--desktop-client': Boolean
|
34
|
-
})
|
35
|
-
|
36
|
-
export function help() {
|
37
|
-
return `
|
38
|
-
Usage: dcl start [options]
|
39
|
-
|
40
|
-
Options:
|
41
|
-
|
42
|
-
-h, --help Displays complete help
|
43
|
-
-p, --port [port] Select a custom port for the development server
|
44
|
-
-d, --no-debug Disable debugging panel
|
45
|
-
-b, --no-browser Do not open a new browser window
|
46
|
-
-w, --no-watch Do not open watch for filesystem changes
|
47
|
-
-c, --ci Run the parcel previewer on a remote unix server
|
48
|
-
--web3 Connects preview to browser wallet to use the associated avatar and account
|
49
|
-
--skip-build Skip build and only serve the files in preview mode
|
50
|
-
--desktop-client Show URL to launch preview in the desktop client (BETA)
|
51
|
-
|
52
|
-
Examples:
|
53
|
-
|
54
|
-
- Start a local development server for a Decentraland Scene at port 3500
|
55
|
-
|
56
|
-
$ dcl start -p 3500
|
57
|
-
|
58
|
-
- Start a local development server for a Decentraland Scene at a docker container
|
59
|
-
|
60
|
-
$ dcl start --ci
|
61
|
-
`
|
62
|
-
}
|
63
|
-
|
64
|
-
export async function main(options: Options) {
|
65
|
-
const dir = resolve(process.cwd(), options.args['--dir'] || '.')
|
66
|
-
const isCi = args['--ci'] || process.env.CI || false
|
67
|
-
const debug = !args['--no-debug'] && !isCi
|
68
|
-
const openBrowser = !args['--no-browser'] && !isCi
|
69
|
-
const skipBuild = args['--skip-build']
|
70
|
-
const watch = !args['--no-watch']
|
71
|
-
const enableWeb3 = args['--web3']
|
72
|
-
const port = parseInt(args['--port']!, 10) || (await previewPort())
|
73
|
-
const baseCoords = { x: 0, y: 0 }
|
74
|
-
const hasPortableExperience = false
|
75
|
-
|
76
|
-
const comps = { components: options.components }
|
77
|
-
|
78
|
-
// first run `npm run build`, this can be disabled with --skip-build
|
79
|
-
if (!skipBuild) {
|
80
|
-
await npmRun(dir, 'build')
|
81
|
-
}
|
82
|
-
|
83
|
-
// then start the embedded compiler, this can be disabled with --no-watch
|
84
|
-
if (watch) {
|
85
|
-
await build({ args: { '--dir': dir, '--watch': watch }, ...comps })
|
86
|
-
}
|
87
|
-
|
88
|
-
// after the watcher is running, start the server
|
89
|
-
const server = await preview({ args: { '--dir': dir, '--port': port, '--watch': watch }, ...comps })
|
90
|
-
|
91
|
-
const networkInterfaces = os.networkInterfaces()
|
92
|
-
const availableURLs: string[] = []
|
93
|
-
|
94
|
-
console.log(`\nPreview server is now running!`)
|
95
|
-
console.log('Available on:\n')
|
96
|
-
|
97
|
-
Object.keys(networkInterfaces).forEach((dev) => {
|
98
|
-
;(networkInterfaces[dev] || []).forEach((details) => {
|
99
|
-
if (details.family === 'IPv4') {
|
100
|
-
let addr = `http://${details.address}:${port}?position=${baseCoords.x}%2C${baseCoords.y}&ENABLE_ECS7`
|
101
|
-
if (debug) {
|
102
|
-
addr = `${addr}&SCENE_DEBUG_PANEL`
|
103
|
-
}
|
104
|
-
if (enableWeb3 || hasPortableExperience) {
|
105
|
-
addr = `${addr}&ENABLE_WEB3`
|
106
|
-
}
|
107
|
-
|
108
|
-
availableURLs.push(addr)
|
109
|
-
}
|
110
|
-
})
|
111
|
-
})
|
112
|
-
|
113
|
-
// Push localhost and 127.0.0.1 at top
|
114
|
-
const sortedURLs = availableURLs.sort((a, _b) => {
|
115
|
-
return a.toLowerCase().includes('localhost') || a.includes('127.0.0.1') || a.includes('0.0.0.0') ? -1 : 1
|
116
|
-
})
|
117
|
-
|
118
|
-
for (const addr of sortedURLs) {
|
119
|
-
console.log(` ${addr}`)
|
120
|
-
}
|
121
|
-
|
122
|
-
if (args['--desktop-client']) {
|
123
|
-
console.log('\n Desktop client:\n')
|
124
|
-
for (const addr of sortedURLs) {
|
125
|
-
const searchParams = new URLSearchParams()
|
126
|
-
searchParams.append('PREVIEW-MODE', addr)
|
127
|
-
console.log(` dcl://${searchParams.toString()}&`)
|
128
|
-
}
|
129
|
-
}
|
130
|
-
|
131
|
-
console.log('\n Details:\n')
|
132
|
-
console.log('\nPress CTRL+C to exit\n')
|
133
|
-
|
134
|
-
// Open preferably localhost/127.0.0.1
|
135
|
-
if (openBrowser && sortedURLs.length && !args['--desktop-client']) {
|
136
|
-
try {
|
137
|
-
await open(sortedURLs[0])
|
138
|
-
} catch (_) {
|
139
|
-
console.log('Unable to open browser automatically.')
|
140
|
-
}
|
141
|
-
}
|
142
|
-
|
143
|
-
// this signal is resolved by: (wkc)program.stop(), SIGTERM, SIGHUP
|
144
|
-
await server.components.signaler.programClosed
|
145
|
-
}
|
package/cli/components/fetch.js
DELETED
@@ -1,34 +0,0 @@
|
|
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==
|
package/cli/components/fetch.ts
DELETED
package/cli/components/fs.d.ts
DELETED
@@ -1,12 +0,0 @@
|
|
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' | 'rename' | 'rmdir'> & {
|
6
|
-
constants: Pick<typeof fs.constants, 'F_OK' | 'R_OK'>;
|
7
|
-
} & {
|
8
|
-
fileExists(path: string): Promise<boolean>;
|
9
|
-
directoryExists(path: string): Promise<boolean>;
|
10
|
-
readdir(path: string): Promise<string[]>;
|
11
|
-
};
|
12
|
-
export declare function createFsComponent(): IFileSystemComponent;
|
package/cli/components/fs.js
DELETED
@@ -1,69 +0,0 @@
|
|
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 fileExists(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
|
-
async function directoryExists(path) {
|
39
|
-
try {
|
40
|
-
return (await fs.promises.lstat(path)).isDirectory();
|
41
|
-
}
|
42
|
-
catch (error) {
|
43
|
-
return false;
|
44
|
-
}
|
45
|
-
}
|
46
|
-
function createFsComponent() {
|
47
|
-
return {
|
48
|
-
createReadStream: fs.createReadStream,
|
49
|
-
createWriteStream: fs.createWriteStream,
|
50
|
-
access: fsPromises.access,
|
51
|
-
writeFile: fsPromises.writeFile,
|
52
|
-
opendir: fsPromises.opendir,
|
53
|
-
stat: fsPromises.stat,
|
54
|
-
unlink: fsPromises.unlink,
|
55
|
-
mkdir: fsPromises.mkdir,
|
56
|
-
rmdir: fsPromises.rmdir,
|
57
|
-
readdir: fsPromises.readdir,
|
58
|
-
readFile: fsPromises.readFile,
|
59
|
-
constants: {
|
60
|
-
F_OK: fs.constants.F_OK,
|
61
|
-
R_OK: fs.constants.R_OK
|
62
|
-
},
|
63
|
-
rename: fsPromises.rename,
|
64
|
-
fileExists,
|
65
|
-
directoryExists
|
66
|
-
};
|
67
|
-
}
|
68
|
-
exports.createFsComponent = createFsComponent;
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF3QjtBQUN4Qix3REFBeUM7QUFvQnpDLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNwQyxJQUFJO1FBQ0YsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyRSxPQUFPLElBQUksQ0FBQTtLQUNaO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLEtBQUssQ0FBQTtLQUNiO0FBQ0gsQ0FBQztBQUNELEtBQUssVUFBVSxlQUFlLENBQUMsSUFBWTtJQUN6QyxJQUFJO1FBQ0YsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtLQUNyRDtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxLQUFLLENBQUE7S0FDYjtBQUNILENBQUM7QUFLRCxTQUFnQixpQkFBaUI7SUFDL0IsT0FBTztRQUNMLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0I7UUFDckMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLGlCQUFpQjtRQUN2QyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07UUFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQy9CLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1FBQ3pCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztRQUN2QixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO1FBQzNCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtRQUM3QixTQUFTLEVBQUU7WUFDVCxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1lBQ3ZCLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUk7U0FDeEI7UUFDRCxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07UUFDekIsVUFBVTtRQUNWLGVBQWU7S0FDaEIsQ0FBQTtBQUNILENBQUM7QUFyQkQsOENBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgKiBhcyBmc1Byb21pc2VzIGZyb20gJ2ZzL3Byb21pc2VzJ1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqXG4gKiBUaGlzIG1heSBiZSBtb3ZlZCB0byB3ZWxsLWtub3duLWNvbXBvbmVudHMgaW4gdGhlIGZ1dHVyZVxuICovXG5leHBvcnQgdHlwZSBJRmlsZVN5c3RlbUNvbXBvbmVudCA9IFBpY2s8dHlwZW9mIGZzLCAnY3JlYXRlUmVhZFN0cmVhbSc+ICZcbiAgUGljazx0eXBlb2YgZnMsICdjcmVhdGVXcml0ZVN0cmVhbSc+ICZcbiAgUGljazxcbiAgICB0eXBlb2YgZnNQcm9taXNlcyxcbiAgICAnYWNjZXNzJyB8ICdvcGVuZGlyJyB8ICdzdGF0JyB8ICd1bmxpbmsnIHwgJ21rZGlyJyB8ICdyZWFkRmlsZScgfCAnd3JpdGVGaWxlJyB8ICdyZW5hbWUnIHwgJ3JtZGlyJ1xuICA+ICYge1xuICAgIGNvbnN0YW50czogUGljazx0eXBlb2YgZnMuY29uc3RhbnRzLCAnRl9PSycgfCAnUl9PSyc+XG4gIH0gJiB7XG4gICAgZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+XG4gICAgZGlyZWN0b3J5RXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj5cbiAgICByZWFkZGlyKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+XG4gIH1cblxuYXN5bmMgZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MocGF0aCwgZnMuY29uc3RhbnRzLkZfT0sgfCBmcy5jb25zdGFudHMuUl9PSylcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5hc3luYyBmdW5jdGlvbiBkaXJlY3RvcnlFeGlzdHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChwYXRoKSkuaXNEaXJlY3RvcnkoKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnNDb21wb25lbnQoKTogSUZpbGVTeXN0ZW1Db21wb25lbnQge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZVJlYWRTdHJlYW06IGZzLmNyZWF0ZVJlYWRTdHJlYW0sXG4gICAgY3JlYXRlV3JpdGVTdHJlYW06IGZzLmNyZWF0ZVdyaXRlU3RyZWFtLFxuICAgIGFjY2VzczogZnNQcm9taXNlcy5hY2Nlc3MsXG4gICAgd3JpdGVGaWxlOiBmc1Byb21pc2VzLndyaXRlRmlsZSxcbiAgICBvcGVuZGlyOiBmc1Byb21pc2VzLm9wZW5kaXIsXG4gICAgc3RhdDogZnNQcm9taXNlcy5zdGF0LFxuICAgIHVubGluazogZnNQcm9taXNlcy51bmxpbmssXG4gICAgbWtkaXI6IGZzUHJvbWlzZXMubWtkaXIsXG4gICAgcm1kaXI6IGZzUHJvbWlzZXMucm1kaXIsXG4gICAgcmVhZGRpcjogZnNQcm9taXNlcy5yZWFkZGlyLFxuICAgIHJlYWRGaWxlOiBmc1Byb21pc2VzLnJlYWRGaWxlLFxuICAgIGNvbnN0YW50czoge1xuICAgICAgRl9PSzogZnMuY29uc3RhbnRzLkZfT0ssXG4gICAgICBSX09LOiBmcy5jb25zdGFudHMuUl9PS1xuICAgIH0sXG4gICAgcmVuYW1lOiBmc1Byb21pc2VzLnJlbmFtZSxcbiAgICBmaWxlRXhpc3RzLFxuICAgIGRpcmVjdG9yeUV4aXN0c1xuICB9XG59XG4iXX0=
|
package/cli/components/fs.ts
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
import * as fs from 'fs'
|
2
|
-
import * as fsPromises from 'fs/promises'
|
3
|
-
|
4
|
-
/**
|
5
|
-
* @public
|
6
|
-
*
|
7
|
-
* This may be moved to well-known-components in the future
|
8
|
-
*/
|
9
|
-
export type IFileSystemComponent = Pick<typeof fs, 'createReadStream'> &
|
10
|
-
Pick<typeof fs, 'createWriteStream'> &
|
11
|
-
Pick<
|
12
|
-
typeof fsPromises,
|
13
|
-
'access' | 'opendir' | 'stat' | 'unlink' | 'mkdir' | 'readFile' | 'writeFile' | 'rename' | 'rmdir'
|
14
|
-
> & {
|
15
|
-
constants: Pick<typeof fs.constants, 'F_OK' | 'R_OK'>
|
16
|
-
} & {
|
17
|
-
fileExists(path: string): Promise<boolean>
|
18
|
-
directoryExists(path: string): Promise<boolean>
|
19
|
-
readdir(path: string): Promise<string[]>
|
20
|
-
}
|
21
|
-
|
22
|
-
async function fileExists(path: string): Promise<boolean> {
|
23
|
-
try {
|
24
|
-
await fs.promises.access(path, fs.constants.F_OK | fs.constants.R_OK)
|
25
|
-
return true
|
26
|
-
} catch (error) {
|
27
|
-
return false
|
28
|
-
}
|
29
|
-
}
|
30
|
-
async function directoryExists(path: string): Promise<boolean> {
|
31
|
-
try {
|
32
|
-
return (await fs.promises.lstat(path)).isDirectory()
|
33
|
-
} catch (error) {
|
34
|
-
return false
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
/**
|
39
|
-
* @public
|
40
|
-
*/
|
41
|
-
export function createFsComponent(): IFileSystemComponent {
|
42
|
-
return {
|
43
|
-
createReadStream: fs.createReadStream,
|
44
|
-
createWriteStream: fs.createWriteStream,
|
45
|
-
access: fsPromises.access,
|
46
|
-
writeFile: fsPromises.writeFile,
|
47
|
-
opendir: fsPromises.opendir,
|
48
|
-
stat: fsPromises.stat,
|
49
|
-
unlink: fsPromises.unlink,
|
50
|
-
mkdir: fsPromises.mkdir,
|
51
|
-
rmdir: fsPromises.rmdir,
|
52
|
-
readdir: fsPromises.readdir,
|
53
|
-
readFile: fsPromises.readFile,
|
54
|
-
constants: {
|
55
|
-
F_OK: fs.constants.F_OK,
|
56
|
-
R_OK: fs.constants.R_OK
|
57
|
-
},
|
58
|
-
rename: fsPromises.rename,
|
59
|
-
fileExists,
|
60
|
-
directoryExists
|
61
|
-
}
|
62
|
-
}
|