@dxos/cli 0.1.41 → 0.1.45-next.45667d4
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/README.md +219 -30
- package/config/config-default.yml +1 -1
- package/dist/src/base-command.d.ts +5 -1
- package/dist/src/base-command.d.ts.map +1 -1
- package/dist/src/base-command.js +62 -31
- package/dist/src/base-command.js.map +1 -1
- package/dist/src/commands/app/app.test.d.ts +2 -0
- package/dist/src/commands/app/app.test.d.ts.map +1 -0
- package/dist/src/commands/app/app.test.js +25 -0
- package/dist/src/commands/app/app.test.js.map +1 -0
- package/dist/src/commands/app/create.d.ts +2 -1
- package/dist/src/commands/app/create.d.ts.map +1 -1
- package/dist/src/commands/app/create.js +10 -10
- package/dist/src/commands/app/create.js.map +1 -1
- package/dist/src/commands/app/list.js +1 -1
- package/dist/src/commands/app/list.js.map +1 -1
- package/dist/src/commands/app/open.d.ts +17 -0
- package/dist/src/commands/app/open.d.ts.map +1 -0
- package/dist/src/commands/app/open.js +84 -0
- package/dist/src/commands/app/open.js.map +1 -0
- package/dist/src/commands/app/publish.d.ts +2 -1
- package/dist/src/commands/app/publish.d.ts.map +1 -1
- package/dist/src/commands/app/publish.js +9 -9
- package/dist/src/commands/app/publish.js.map +1 -1
- package/dist/src/commands/config/index.js +1 -1
- package/dist/src/commands/config/index.js.map +1 -1
- package/dist/src/commands/daemon/list.d.ts +7 -0
- package/dist/src/commands/daemon/list.d.ts.map +1 -0
- package/dist/src/commands/daemon/list.js +19 -0
- package/dist/src/commands/daemon/list.js.map +1 -0
- package/dist/src/commands/daemon/restart.d.ts +7 -0
- package/dist/src/commands/daemon/restart.d.ts.map +1 -0
- package/dist/src/commands/daemon/restart.js +19 -0
- package/dist/src/commands/daemon/restart.js.map +1 -0
- package/dist/src/commands/daemon/run.d.ts +13 -0
- package/dist/src/commands/daemon/run.d.ts.map +1 -0
- package/dist/src/commands/daemon/run.js +33 -0
- package/dist/src/commands/daemon/run.js.map +1 -0
- package/dist/src/commands/daemon/start.d.ts +7 -0
- package/dist/src/commands/daemon/start.d.ts.map +1 -0
- package/dist/src/commands/daemon/start.js +19 -0
- package/dist/src/commands/daemon/start.js.map +1 -0
- package/dist/src/commands/daemon/stop.d.ts +7 -0
- package/dist/src/commands/daemon/stop.d.ts.map +1 -0
- package/dist/src/commands/daemon/stop.js +19 -0
- package/dist/src/commands/daemon/stop.js.map +1 -0
- package/dist/src/commands/halo/create.js +2 -2
- package/dist/src/commands/halo/create.js.map +1 -1
- package/dist/src/commands/halo/credential/add.js +2 -2
- package/dist/src/commands/halo/credential/add.js.map +1 -1
- package/dist/src/commands/halo/credential/list.d.ts +2 -1
- package/dist/src/commands/halo/credential/list.d.ts.map +1 -1
- package/dist/src/commands/halo/credential/list.js +3 -3
- package/dist/src/commands/halo/credential/list.js.map +1 -1
- package/dist/src/commands/halo/index.js +2 -2
- package/dist/src/commands/halo/index.js.map +1 -1
- package/dist/src/commands/halo/join.d.ts +2 -1
- package/dist/src/commands/halo/join.d.ts.map +1 -1
- package/dist/src/commands/halo/join.js +27 -45
- package/dist/src/commands/halo/join.js.map +1 -1
- package/dist/src/commands/halo/share.d.ts +6 -0
- package/dist/src/commands/halo/share.d.ts.map +1 -1
- package/dist/src/commands/halo/share.js +30 -33
- package/dist/src/commands/halo/share.js.map +1 -1
- package/dist/src/commands/kube/auth.js +3 -3
- package/dist/src/commands/kube/auth.js.map +1 -1
- package/dist/src/commands/kube/deploy.d.ts +2 -1
- package/dist/src/commands/kube/deploy.d.ts.map +1 -1
- package/dist/src/commands/kube/deploy.js +7 -7
- package/dist/src/commands/kube/deploy.js.map +1 -1
- package/dist/src/commands/reset/index.d.ts.map +1 -1
- package/dist/src/commands/reset/index.js +5 -2
- package/dist/src/commands/reset/index.js.map +1 -1
- package/dist/src/commands/shell/index.js +1 -1
- package/dist/src/commands/shell/index.js.map +1 -1
- package/dist/src/commands/space/create.js +2 -2
- package/dist/src/commands/space/create.js.map +1 -1
- package/dist/src/commands/space/index.js +1 -1
- package/dist/src/commands/space/index.js.map +1 -1
- package/dist/src/commands/space/invite.d.ts.map +1 -1
- package/dist/src/commands/space/invite.js +21 -26
- package/dist/src/commands/space/invite.js.map +1 -1
- package/dist/src/commands/space/join.d.ts +2 -1
- package/dist/src/commands/space/join.d.ts.map +1 -1
- package/dist/src/commands/space/join.js +31 -17
- package/dist/src/commands/space/join.js.map +1 -1
- package/dist/src/commands/space/list.d.ts +6 -5
- package/dist/src/commands/space/list.d.ts.map +1 -1
- package/dist/src/commands/space/list.js +2 -2
- package/dist/src/commands/space/list.js.map +1 -1
- package/dist/src/commands/space/members.d.ts +7 -6
- package/dist/src/commands/space/members.d.ts.map +1 -1
- package/dist/src/commands/space/members.js +9 -4
- package/dist/src/commands/space/members.js.map +1 -1
- package/dist/src/commands/tunnel/list.js +1 -1
- package/dist/src/commands/tunnel/list.js.map +1 -1
- package/dist/src/commands/tunnel/set.d.ts +2 -1
- package/dist/src/commands/tunnel/set.d.ts.map +1 -1
- package/dist/src/commands/tunnel/set.js +5 -5
- package/dist/src/commands/tunnel/set.js.map +1 -1
- package/dist/src/daemon/daemon.d.ts +15 -0
- package/dist/src/daemon/daemon.d.ts.map +1 -0
- package/dist/src/daemon/daemon.js +6 -0
- package/dist/src/daemon/daemon.js.map +1 -0
- package/dist/src/daemon/forever/forever-daemon.d.ts +15 -0
- package/dist/src/daemon/forever/forever-daemon.d.ts.map +1 -0
- package/dist/src/daemon/forever/forever-daemon.js +83 -0
- package/dist/src/daemon/forever/forever-daemon.js.map +1 -0
- package/dist/src/daemon/forever/index.d.ts +2 -0
- package/dist/src/daemon/forever/index.d.ts.map +1 -0
- package/dist/src/daemon/forever/index.js +21 -0
- package/dist/src/daemon/forever/index.js.map +1 -0
- package/dist/src/daemon/index.d.ts +5 -0
- package/dist/src/daemon/index.d.ts.map +1 -0
- package/dist/src/daemon/index.js +24 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/pm2/index.d.ts +2 -0
- package/dist/src/daemon/pm2/index.d.ts.map +1 -0
- package/dist/src/daemon/pm2/index.js +21 -0
- package/dist/src/daemon/pm2/index.js.map +1 -0
- package/dist/src/daemon/pm2/pm2-daemon.d.ts +21 -0
- package/dist/src/daemon/pm2/pm2-daemon.d.ts.map +1 -0
- package/dist/src/daemon/pm2/pm2-daemon.js +107 -0
- package/dist/src/daemon/pm2/pm2-daemon.js.map +1 -0
- package/dist/src/daemon/run-services.d.ts +7 -0
- package/dist/src/daemon/run-services.d.ts.map +1 -0
- package/dist/src/daemon/run-services.js +99 -0
- package/dist/src/daemon/run-services.js.map +1 -0
- package/dist/src/daemon/util.d.ts +8 -0
- package/dist/src/daemon/util.d.ts.map +1 -0
- package/dist/src/daemon/util.js +38 -0
- package/dist/src/daemon/util.js.map +1 -0
- package/dist/src/util/credential.js +1 -1
- package/dist/src/util/exec.d.ts +1 -1
- package/dist/src/util/exec.d.ts.map +1 -1
- package/dist/src/util/exec.js +1 -1
- package/dist/src/util/index.d.ts +2 -0
- package/dist/src/util/index.d.ts.map +1 -1
- package/dist/src/util/index.js +2 -0
- package/dist/src/util/index.js.map +1 -1
- package/dist/src/util/invitation.d.ts +18 -0
- package/dist/src/util/invitation.d.ts.map +1 -0
- package/dist/src/util/invitation.js +69 -0
- package/dist/src/util/invitation.js.map +1 -0
- package/dist/src/util/print.js +17 -17
- package/dist/src/util/provider/digital-ocean.js +2 -2
- package/dist/src/util/provider/provider.d.ts +1 -1
- package/dist/src/util/provider/provider.d.ts.map +1 -1
- package/dist/src/util/provider/provider.js +5 -5
- package/dist/src/util/publish/build.js +2 -2
- package/dist/src/util/publish/common.d.ts +3 -3
- package/dist/src/util/publish/common.d.ts.map +1 -1
- package/dist/src/util/publish/common.js +11 -11
- package/dist/src/util/publish/config.js +3 -3
- package/dist/src/util/publish/ipfs-upload.js +3 -3
- package/dist/src/util/publish/publish.js +1 -1
- package/dist/src/util/publish/publisher-rpc-peer.js +3 -3
- package/dist/src/util/supervisor/supervisor-rpc-peer.js +3 -3
- package/dist/src/util/telemetry.d.ts +1 -1
- package/dist/src/util/telemetry.d.ts.map +1 -1
- package/dist/src/util/telemetry.js +2 -2
- package/dist/src/util/telemetryrc.json +2 -2
- package/dist/src/util/test-util.d.ts +2 -0
- package/dist/src/util/test-util.d.ts.map +1 -0
- package/dist/src/util/test-util.js +21 -0
- package/dist/src/util/test-util.js.map +1 -0
- package/dist/src/util/util.js +3 -3
- package/oclif.manifest.json +458 -2
- package/package.json +23 -18
- package/dist/src/commands/app/publish-workflow.test.d.ts +0 -2
- package/dist/src/commands/app/publish-workflow.test.d.ts.map +0 -1
- package/dist/src/commands/app/publish-workflow.test.js +0 -56
- package/dist/src/commands/app/publish-workflow.test.js.map +0 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2023 DXOS.org
|
|
4
|
+
//
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.acceptInvitation = exports.hostInvitation = void 0;
|
|
10
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
11
|
+
const async_1 = require("@dxos/async");
|
|
12
|
+
const client_1 = require("@dxos/client");
|
|
13
|
+
const hostInvitation = async ({ observable, callbacks, peersNumber = 1, }) => {
|
|
14
|
+
const invitationEvent = new async_1.Event();
|
|
15
|
+
const done = invitationEvent.waitForCount(peersNumber);
|
|
16
|
+
const unsubscribeHandle = observable.subscribe(async (invitation) => {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
switch (invitation.state) {
|
|
19
|
+
case client_1.Invitation.State.CONNECTING: {
|
|
20
|
+
await ((_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onConnecting) === null || _a === void 0 ? void 0 : _a.call(callbacks, invitation));
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
case client_1.Invitation.State.SUCCESS: {
|
|
24
|
+
await ((_b = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onSuccess) === null || _b === void 0 ? void 0 : _b.call(callbacks, invitation));
|
|
25
|
+
invitationEvent.emit(invitation);
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}, (err) => {
|
|
30
|
+
throw err;
|
|
31
|
+
});
|
|
32
|
+
const invitation = await done;
|
|
33
|
+
unsubscribeHandle.unsubscribe();
|
|
34
|
+
return invitation;
|
|
35
|
+
};
|
|
36
|
+
exports.hostInvitation = hostInvitation;
|
|
37
|
+
const acceptInvitation = async ({ observable, callbacks, }) => {
|
|
38
|
+
const done = new async_1.Trigger();
|
|
39
|
+
const unsubscribeHandle = observable.subscribe(async (invitation) => {
|
|
40
|
+
var _a, _b, _c, _d;
|
|
41
|
+
switch (invitation.state) {
|
|
42
|
+
case client_1.Invitation.State.CONNECTING: {
|
|
43
|
+
await ((_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onConnecting) === null || _a === void 0 ? void 0 : _a.call(callbacks, invitation));
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case client_1.Invitation.State.READY_FOR_AUTHENTICATION: {
|
|
47
|
+
const callbackResult = await ((_b = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onReadyForAuth) === null || _b === void 0 ? void 0 : _b.call(callbacks, invitation));
|
|
48
|
+
if (invitation.authMethod === client_1.Invitation.AuthMethod.SHARED_SECRET) {
|
|
49
|
+
const code = (_c = invitation.authCode) !== null && _c !== void 0 ? _c : callbackResult;
|
|
50
|
+
(0, node_assert_1.default)(code, 'No code provided');
|
|
51
|
+
await observable.authenticate(code);
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case client_1.Invitation.State.SUCCESS: {
|
|
56
|
+
await ((_d = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onSuccess) === null || _d === void 0 ? void 0 : _d.call(callbacks, invitation));
|
|
57
|
+
done.wake(invitation);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}, (err) => {
|
|
62
|
+
throw err;
|
|
63
|
+
});
|
|
64
|
+
const invitation = await done.wait();
|
|
65
|
+
unsubscribeHandle.unsubscribe();
|
|
66
|
+
return invitation;
|
|
67
|
+
};
|
|
68
|
+
exports.acceptInvitation = acceptInvitation;
|
|
69
|
+
//# sourceMappingURL=invitation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invitation.js","sourceRoot":"","sources":["../../../src/util/invitation.ts"],"names":[],"mappings":"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"}
|
package/dist/src/util/print.js
CHANGED
|
@@ -12,20 +12,20 @@ const util_1 = require("./util");
|
|
|
12
12
|
const mapSpaces = (spaces, truncateKeys = false) => {
|
|
13
13
|
return spaces.map((space) => ({
|
|
14
14
|
key: (0, util_1.maybeTruncateKey)(space.key, truncateKeys),
|
|
15
|
-
name: space.properties.name
|
|
15
|
+
name: space.properties.name,
|
|
16
16
|
}));
|
|
17
17
|
};
|
|
18
18
|
exports.mapSpaces = mapSpaces;
|
|
19
19
|
const printSpaces = (spaces, flags = {}) => {
|
|
20
20
|
core_1.ux.table((0, exports.mapSpaces)(spaces, true), {
|
|
21
21
|
key: {
|
|
22
|
-
header: 'Space key'
|
|
22
|
+
header: 'Space key',
|
|
23
23
|
},
|
|
24
24
|
name: {
|
|
25
|
-
header: 'Name'
|
|
26
|
-
}
|
|
25
|
+
header: 'Name',
|
|
26
|
+
},
|
|
27
27
|
}, {
|
|
28
|
-
...flags
|
|
28
|
+
...flags,
|
|
29
29
|
});
|
|
30
30
|
};
|
|
31
31
|
exports.printSpaces = printSpaces;
|
|
@@ -38,7 +38,7 @@ const mapMembers = (members, truncateKeys = false) => {
|
|
|
38
38
|
var _a;
|
|
39
39
|
return ({
|
|
40
40
|
key: (0, util_1.maybeTruncateKey)(member.identity.identityKey, truncateKeys),
|
|
41
|
-
name: (_a = member.identity.profile) === null || _a === void 0 ? void 0 : _a.displayName
|
|
41
|
+
name: (_a = member.identity.profile) === null || _a === void 0 ? void 0 : _a.displayName,
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
44
|
};
|
|
@@ -46,13 +46,13 @@ exports.mapMembers = mapMembers;
|
|
|
46
46
|
const printMembers = (members, flags = {}) => {
|
|
47
47
|
core_1.ux.table((0, exports.mapMembers)(members, true), {
|
|
48
48
|
key: {
|
|
49
|
-
header: 'Identity key'
|
|
49
|
+
header: 'Identity key',
|
|
50
50
|
},
|
|
51
51
|
name: {
|
|
52
|
-
header: 'Display name'
|
|
53
|
-
}
|
|
52
|
+
header: 'Display name',
|
|
53
|
+
},
|
|
54
54
|
}, {
|
|
55
|
-
...flags
|
|
55
|
+
...flags,
|
|
56
56
|
});
|
|
57
57
|
};
|
|
58
58
|
exports.printMembers = printMembers;
|
|
@@ -64,26 +64,26 @@ const mapCredentials = (credentials, truncateKeys = false) => {
|
|
|
64
64
|
id: (0, util_1.maybeTruncateKey)(credential.id, truncateKeys),
|
|
65
65
|
issuer: (0, util_1.maybeTruncateKey)(credential.issuer, truncateKeys),
|
|
66
66
|
subject: (0, util_1.maybeTruncateKey)(credential.subject.id, truncateKeys),
|
|
67
|
-
type: credential.subject.assertion['@type']
|
|
67
|
+
type: credential.subject.assertion['@type'],
|
|
68
68
|
}));
|
|
69
69
|
};
|
|
70
70
|
exports.mapCredentials = mapCredentials;
|
|
71
71
|
const printCredentials = (credentials, flags = {}) => {
|
|
72
72
|
core_1.ux.table((0, exports.mapCredentials)(credentials, true), {
|
|
73
73
|
id: {
|
|
74
|
-
header: 'Id'
|
|
74
|
+
header: 'Id',
|
|
75
75
|
},
|
|
76
76
|
issuer: {
|
|
77
|
-
header: 'Issuer'
|
|
77
|
+
header: 'Issuer',
|
|
78
78
|
},
|
|
79
79
|
subject: {
|
|
80
|
-
header: 'Subject'
|
|
80
|
+
header: 'Subject',
|
|
81
81
|
},
|
|
82
82
|
type: {
|
|
83
|
-
header: 'Type'
|
|
84
|
-
}
|
|
83
|
+
header: 'Type',
|
|
84
|
+
},
|
|
85
85
|
}, {
|
|
86
|
-
...flags
|
|
86
|
+
...flags,
|
|
87
87
|
});
|
|
88
88
|
};
|
|
89
89
|
exports.printCredentials = printCredentials;
|
|
@@ -104,7 +104,7 @@ class DigitalOceanProvider {
|
|
|
104
104
|
image: 'ubuntu-22-10-x64',
|
|
105
105
|
ssh_keys: sshKeys,
|
|
106
106
|
user_data: cloudConfigScript,
|
|
107
|
-
tags: [provider_1.KUBE_TAG]
|
|
107
|
+
tags: [provider_1.KUBE_TAG],
|
|
108
108
|
};
|
|
109
109
|
const result = await this._session.droplets.create(createParameters);
|
|
110
110
|
const droplet = await (0, async_1.waitForCondition)(async () => {
|
|
@@ -118,7 +118,7 @@ class DigitalOceanProvider {
|
|
|
118
118
|
return {
|
|
119
119
|
hostname: droplet.name,
|
|
120
120
|
createdAt: droplet.created_at,
|
|
121
|
-
ipAddress
|
|
121
|
+
ipAddress,
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/util/provider/provider.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,SAAS,CAAC;AAE/B,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/util/provider/provider.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,SAAS,CAAC;AAE/B,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,QAAQ,UAAW,IAAI,EAAE;;;GAKrC,CAAC;AAEF,eAAO,MAAM,UAAU,UAAW,IAAI,EAAE,qBAevC,CAAC"}
|
|
@@ -10,20 +10,20 @@ exports.DEFAULT_PROVIDER = 'digitalocean';
|
|
|
10
10
|
const mapKubes = (kubes) => {
|
|
11
11
|
return kubes.map((kube) => ({
|
|
12
12
|
key: kube.hostname,
|
|
13
|
-
ipAddress: kube.ipAddress
|
|
13
|
+
ipAddress: kube.ipAddress,
|
|
14
14
|
}));
|
|
15
15
|
};
|
|
16
16
|
exports.mapKubes = mapKubes;
|
|
17
17
|
const printKubes = (kubes, flags = {}) => {
|
|
18
18
|
core_1.ux.table((0, exports.mapKubes)(kubes), {
|
|
19
19
|
key: {
|
|
20
|
-
header: 'Hostname'
|
|
20
|
+
header: 'Hostname',
|
|
21
21
|
},
|
|
22
22
|
ipAddress: {
|
|
23
|
-
header: 'IP Address'
|
|
24
|
-
}
|
|
23
|
+
header: 'IP Address',
|
|
24
|
+
},
|
|
25
25
|
}, {
|
|
26
|
-
...flags
|
|
26
|
+
...flags,
|
|
27
27
|
});
|
|
28
28
|
};
|
|
29
29
|
exports.printKubes = printKubes;
|
|
@@ -18,9 +18,9 @@ const build = ({ verbose }, { log, module }) => {
|
|
|
18
18
|
env: {
|
|
19
19
|
...process.env,
|
|
20
20
|
...((_a = module.build.env) !== null && _a !== void 0 ? _a : {}),
|
|
21
|
-
CONFIG_DYNAMIC: 'true'
|
|
21
|
+
CONFIG_DYNAMIC: 'true',
|
|
22
22
|
},
|
|
23
|
-
stdio: verbose ? 'inherit' : undefined
|
|
23
|
+
stdio: verbose ? 'inherit' : undefined,
|
|
24
24
|
});
|
|
25
25
|
if (error || status !== 0) {
|
|
26
26
|
log(`Module ${chalk_1.default.bold(module.name)} build failed${verbose ? ` with status: ${status}.${error ? '\n' + error : ''}` : '. Re-run with --verbose for more details.'}`);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ConfigProto } from '@dxos/config';
|
|
2
2
|
import { TunnelResponse } from '@dxos/protocols/proto/dxos/service/publisher';
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
3
|
+
export type PackageModule = NonNullable<NonNullable<ConfigProto['package']>['modules']>[0];
|
|
4
|
+
export type PackageRepo = NonNullable<NonNullable<ConfigProto['package']>['repos']>[0];
|
|
5
|
+
export type Logger = (message?: string, ...args: any[]) => void;
|
|
6
6
|
export declare const mapModules: (modules: PackageModule[]) => {
|
|
7
7
|
key: string | undefined;
|
|
8
8
|
bundle: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/util/publish/common.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAE9E,
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/util/publish/common.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAE9E,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAEhE,eAAO,MAAM,UAAU,YAAa,aAAa,EAAE;;;GAKlD,CAAC;AAEF,eAAO,MAAM,UAAU,YAAa,cAAc,EAAE;;;;GAMnD,CAAC;AAEF,eAAO,MAAM,YAAY,YAAa,aAAa,EAAE,qBAepD,CAAC;AAEF,eAAO,MAAM,YAAY,YAAa,cAAc,EAAE,qBAkBrD,CAAC"}
|
|
@@ -9,7 +9,7 @@ const ipfs_http_client_1 = require("ipfs-http-client");
|
|
|
9
9
|
const mapModules = (modules) => {
|
|
10
10
|
return modules.map((mod) => ({
|
|
11
11
|
key: mod.name,
|
|
12
|
-
bundle: ipfs_http_client_1.CID.decode(mod.bundle).toString()
|
|
12
|
+
bundle: ipfs_http_client_1.CID.decode(mod.bundle).toString(),
|
|
13
13
|
}));
|
|
14
14
|
};
|
|
15
15
|
exports.mapModules = mapModules;
|
|
@@ -17,36 +17,36 @@ const mapTunnels = (tunnels) => {
|
|
|
17
17
|
return tunnels.map((tunnel) => ({
|
|
18
18
|
key: tunnel.name,
|
|
19
19
|
enabled: tunnel.enabled,
|
|
20
|
-
url: tunnel.url
|
|
20
|
+
url: tunnel.url,
|
|
21
21
|
}));
|
|
22
22
|
};
|
|
23
23
|
exports.mapTunnels = mapTunnels;
|
|
24
24
|
const printModules = (modules, flags = {}) => {
|
|
25
25
|
core_1.ux.table((0, exports.mapModules)(modules), {
|
|
26
26
|
key: {
|
|
27
|
-
header: 'Name'
|
|
27
|
+
header: 'Name',
|
|
28
28
|
},
|
|
29
29
|
bundle: {
|
|
30
|
-
header: 'Bundle'
|
|
31
|
-
}
|
|
30
|
+
header: 'Bundle',
|
|
31
|
+
},
|
|
32
32
|
}, {
|
|
33
|
-
...flags
|
|
33
|
+
...flags,
|
|
34
34
|
});
|
|
35
35
|
};
|
|
36
36
|
exports.printModules = printModules;
|
|
37
37
|
const printTunnels = (tunnels, flags = {}) => {
|
|
38
38
|
core_1.ux.table((0, exports.mapTunnels)(tunnels), {
|
|
39
39
|
key: {
|
|
40
|
-
header: 'App'
|
|
40
|
+
header: 'App',
|
|
41
41
|
},
|
|
42
42
|
enabled: {
|
|
43
|
-
header: 'Enabled'
|
|
43
|
+
header: 'Enabled',
|
|
44
44
|
},
|
|
45
45
|
url: {
|
|
46
|
-
header: 'URL'
|
|
47
|
-
}
|
|
46
|
+
header: 'URL',
|
|
47
|
+
},
|
|
48
48
|
}, {
|
|
49
|
-
...flags
|
|
49
|
+
...flags,
|
|
50
50
|
});
|
|
51
51
|
};
|
|
52
52
|
exports.printTunnels = printTunnels;
|
|
@@ -26,9 +26,9 @@ const loadConfig = async (configPath = EXTENSION_CONFIG_FILENAME) => {
|
|
|
26
26
|
version: 1,
|
|
27
27
|
package: {
|
|
28
28
|
modules: dxConfig.package.modules.map((module) => (0, lodash_defaultsdeep_1.default)(module, {
|
|
29
|
-
build: { command: DEFAULT_BUILD_COMMAND }
|
|
30
|
-
}))
|
|
31
|
-
}
|
|
29
|
+
build: { command: DEFAULT_BUILD_COMMAND },
|
|
30
|
+
})),
|
|
31
|
+
},
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
34
|
exports.loadConfig = loadConfig;
|
|
@@ -18,7 +18,7 @@ const uploadToIPFS = async (path, config, options) => {
|
|
|
18
18
|
(0, node_assert_1.default)(ipfsServer, 'Invalid IPFS Server.');
|
|
19
19
|
const ipfsClient = (0, ipfs_http_client_1.create)({
|
|
20
20
|
url: ipfsServer,
|
|
21
|
-
timeout: timeout || '1m'
|
|
21
|
+
timeout: timeout || '1m',
|
|
22
22
|
});
|
|
23
23
|
if (!fs_1.default.existsSync(path)) {
|
|
24
24
|
throw new Error('Incorrect path to definitons. File or directory does not exist');
|
|
@@ -28,7 +28,7 @@ const uploadToIPFS = async (path, config, options) => {
|
|
|
28
28
|
for await (const file of ipfsClient.addAll((0, ipfs_http_client_1.globSource)(path, '**/*'), {
|
|
29
29
|
progress,
|
|
30
30
|
pin,
|
|
31
|
-
wrapWithDirectory: true
|
|
31
|
+
wrapWithDirectory: true,
|
|
32
32
|
})) {
|
|
33
33
|
const fullPath = (0, path_1.join)(path, file.path);
|
|
34
34
|
if (!fs_1.default.lstatSync(fullPath).isDirectory()) {
|
|
@@ -43,7 +43,7 @@ const uploadToIPFS = async (path, config, options) => {
|
|
|
43
43
|
path: fullPath,
|
|
44
44
|
cid: file.cid.toString(),
|
|
45
45
|
localSize: localContent.length,
|
|
46
|
-
remoteSize: remoteContent.length
|
|
46
|
+
remoteSize: remoteContent.length,
|
|
47
47
|
}, { file: "packages/devtools/cli/src/util/publish/ipfs-upload.ts", line: 52, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -43,7 +43,7 @@ const publish = async ({ verbose, timeout, path, pin }, { log, config, module })
|
|
|
43
43
|
const cid = await (0, ipfs_upload_1.uploadToIPFS)(publishFolder, config, {
|
|
44
44
|
timeout: timeout || '10m',
|
|
45
45
|
pin,
|
|
46
|
-
progress: verbose ? (bytes) => bar.update(bytes) : undefined
|
|
46
|
+
progress: verbose ? (bytes) => bar.update(bytes) : undefined,
|
|
47
47
|
});
|
|
48
48
|
verbose && bar.update(total);
|
|
49
49
|
verbose && bar.stop();
|
|
@@ -49,7 +49,7 @@ class PublisherRpcPeer {
|
|
|
49
49
|
};
|
|
50
50
|
this._rpc = (0, rpc_1.createProtoRpcPeer)({
|
|
51
51
|
requested: {
|
|
52
|
-
Publisher: protocols_1.schema.getService('dxos.service.publisher.Publisher')
|
|
52
|
+
Publisher: protocols_1.schema.getService('dxos.service.publisher.Publisher'),
|
|
53
53
|
},
|
|
54
54
|
exposed: {},
|
|
55
55
|
handlers: {},
|
|
@@ -68,8 +68,8 @@ class PublisherRpcPeer {
|
|
|
68
68
|
cb(msg.data);
|
|
69
69
|
}
|
|
70
70
|
};
|
|
71
|
-
}
|
|
72
|
-
}
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
75
|
get rpc() {
|
|
@@ -50,7 +50,7 @@ class SupervisorRpcPeer {
|
|
|
50
50
|
};
|
|
51
51
|
this._rpc = (0, rpc_1.createProtoRpcPeer)({
|
|
52
52
|
requested: {
|
|
53
|
-
Supervisor: protocols_1.schema.getService('dxos.service.supervisor.Supervisor')
|
|
53
|
+
Supervisor: protocols_1.schema.getService('dxos.service.supervisor.Supervisor'),
|
|
54
54
|
},
|
|
55
55
|
exposed: {},
|
|
56
56
|
handlers: {},
|
|
@@ -69,8 +69,8 @@ class SupervisorRpcPeer {
|
|
|
69
69
|
cb(msg.data);
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
|
-
}
|
|
73
|
-
}
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
76
|
get rpc() {
|
|
@@ -3,7 +3,7 @@ export declare const DX_RELEASE: string;
|
|
|
3
3
|
export declare const SENTRY_DESTINATION: string;
|
|
4
4
|
export declare const TELEMETRY_API_KEY: string;
|
|
5
5
|
export declare const IPDATA_API_KEY: string;
|
|
6
|
-
export
|
|
6
|
+
export type TelemetryContext = {
|
|
7
7
|
mode: 'disabled' | 'basic' | 'full';
|
|
8
8
|
installationId?: string;
|
|
9
9
|
group?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc,QAA0C,CAAC;AACtE,eAAO,MAAM,UAAU,QAAsC,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8C,CAAC;AAC9E,eAAO,MAAM,iBAAiB,QAA6C,CAAC;AAC5E,eAAO,MAAM,cAAc,QAA0C,CAAC;AAEtE,
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc,QAA0C,CAAC;AACtE,eAAO,MAAM,UAAU,QAAsC,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8C,CAAC;AAC9E,eAAO,MAAM,iBAAiB,QAA6C,CAAC;AAC5E,eAAO,MAAM,cAAc,QAA0C,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAaF,eAAO,MAAM,gBAAgB,cAAqB,MAAM,kBAiBvD,CAAC;AAEF,eAAO,MAAM,mBAAmB,cAAqB,MAAM,KAAG,QAAQ,gBAAgB,CAarF,CAAC"}
|
|
@@ -29,7 +29,7 @@ const DEFAULTS = {
|
|
|
29
29
|
runtime: `node ${process.version}`,
|
|
30
30
|
os: node_os_1.default.platform(),
|
|
31
31
|
arch: node_os_1.default.arch(),
|
|
32
|
-
ci: process.env.CI === 'true'
|
|
32
|
+
ci: process.env.CI === 'true',
|
|
33
33
|
};
|
|
34
34
|
const disableTelemetry = async (configDir) => {
|
|
35
35
|
if (!exports.TELEMETRY_API_KEY) {
|
|
@@ -43,7 +43,7 @@ const disableTelemetry = async (configDir) => {
|
|
|
43
43
|
(0, telemetry_1.init)({ apiKey: exports.TELEMETRY_API_KEY, batchSize: 1, enable: true });
|
|
44
44
|
(0, telemetry_1.event)({
|
|
45
45
|
installationId,
|
|
46
|
-
name: 'cli.telemetry.disable'
|
|
46
|
+
name: 'cli.telemetry.disable',
|
|
47
47
|
});
|
|
48
48
|
await (0, promises_1.writeFile)(path, '', 'utf-8');
|
|
49
49
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"DX_ENVIRONMENT": "
|
|
3
|
-
"DX_RELEASE": "@dxos/cli@0.1.
|
|
2
|
+
"DX_ENVIRONMENT": "staging",
|
|
3
|
+
"DX_RELEASE": "@dxos/cli@0.1.45-next.45667d4",
|
|
4
4
|
"SENTRY_DESTINATION": "https://2647916221e643869965e78469479aa4@o4504012000067584.ingest.sentry.io/4504012027265029",
|
|
5
5
|
"TELEMETRY_API_KEY": "B00QG6PtJJrJ0VVFe0H5a6bcUUShKyZM",
|
|
6
6
|
"IPDATA_API_KEY": "ccc5f0cd66dd34a7c31c2ddc61c2bbca2db73892a993982bb3a5f0e2"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-util.d.ts","sourceRoot":"","sources":["../../../src/util/test-util.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,UAAU,YAAmB,MAAM,OAAO,MAAM,oBAQ5D,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2023 DXOS.org
|
|
4
|
+
//
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.runCommand = void 0;
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const exec_1 = require("./exec");
|
|
12
|
+
const runCommand = async (command, cwd) => {
|
|
13
|
+
const bin = node_path_1.default.join(__dirname, '../../bin/run');
|
|
14
|
+
return await (0, exec_1.exec)(`
|
|
15
|
+
mkdir -p ${cwd} &&
|
|
16
|
+
cd ${cwd} &&
|
|
17
|
+
${bin} ${command}
|
|
18
|
+
`);
|
|
19
|
+
};
|
|
20
|
+
exports.runCommand = runCommand;
|
|
21
|
+
//# sourceMappingURL=test-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-util.js","sourceRoot":"","sources":["../../../src/util/test-util.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;AAEF,0DAA6B;AAE7B,iCAA8B;AAEvB,MAAM,UAAU,GAAG,KAAK,EAAE,OAAe,EAAE,GAAW,EAAE,EAAE;IAC/D,MAAM,GAAG,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAElD,OAAO,MAAM,IAAA,WAAI,EAAC;eACL,GAAG;SACT,GAAG;MACN,GAAG,IAAI,OAAO;GACjB,CAAC,CAAC;AACL,CAAC,CAAC;AARW,QAAA,UAAU,cAQrB"}
|
package/dist/src/util/util.js
CHANGED
|
@@ -20,9 +20,9 @@ const selectSpace = async (spaces) => {
|
|
|
20
20
|
message: 'Select a space:',
|
|
21
21
|
choices: spaces.map((space) => ({
|
|
22
22
|
name: `[${(0, debug_1.truncateKey)(space.key)}] ${space.properties.name}`,
|
|
23
|
-
value: space.key
|
|
24
|
-
}))
|
|
25
|
-
}
|
|
23
|
+
value: space.key,
|
|
24
|
+
})),
|
|
25
|
+
},
|
|
26
26
|
]);
|
|
27
27
|
return key;
|
|
28
28
|
};
|