@phystack/cli 4.3.40-dev
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/LICENSE.md +19 -0
- package/README.md +24 -0
- package/bin/index.js +2 -0
- package/dist/commands/app/build-apps.js +66 -0
- package/dist/commands/app/build-apps.js.map +1 -0
- package/dist/commands/app/build-container-remote.js +171 -0
- package/dist/commands/app/build-container-remote.js.map +1 -0
- package/dist/commands/app/build-container.js +330 -0
- package/dist/commands/app/build-container.js.map +1 -0
- package/dist/commands/app/build.js +393 -0
- package/dist/commands/app/build.js.map +1 -0
- package/dist/commands/app/create.js +451 -0
- package/dist/commands/app/create.js.map +1 -0
- package/dist/commands/app/deploy.js +176 -0
- package/dist/commands/app/deploy.js.map +1 -0
- package/dist/commands/app/device-picker.js +150 -0
- package/dist/commands/app/device-picker.js.map +1 -0
- package/dist/commands/app/import.js +303 -0
- package/dist/commands/app/import.js.map +1 -0
- package/dist/commands/app/list.js +26 -0
- package/dist/commands/app/list.js.map +1 -0
- package/dist/commands/app/publish.js +327 -0
- package/dist/commands/app/publish.js.map +1 -0
- package/dist/commands/app/settings.js +129 -0
- package/dist/commands/app/settings.js.map +1 -0
- package/dist/commands/app/types.js +13 -0
- package/dist/commands/app/types.js.map +1 -0
- package/dist/commands/app/upload-description.js +139 -0
- package/dist/commands/app/upload-description.js.map +1 -0
- package/dist/commands/app/upload-settings.js +29 -0
- package/dist/commands/app/upload-settings.js.map +1 -0
- package/dist/commands/app/utils.js +86 -0
- package/dist/commands/app/utils.js.map +1 -0
- package/dist/commands/auth/login.js +111 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.js +19 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/descriptor/create.js +143 -0
- package/dist/commands/descriptor/create.js.map +1 -0
- package/dist/commands/descriptor/index.js +36 -0
- package/dist/commands/descriptor/index.js.map +1 -0
- package/dist/commands/descriptor/publish.js +163 -0
- package/dist/commands/descriptor/publish.js.map +1 -0
- package/dist/commands/descriptor/show.js +68 -0
- package/dist/commands/descriptor/show.js.map +1 -0
- package/dist/commands/dev/develop.js +175 -0
- package/dist/commands/dev/develop.js.map +1 -0
- package/dist/commands/dev/forward.js +118 -0
- package/dist/commands/dev/forward.js.map +1 -0
- package/dist/commands/dev/index.js +66 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/dev/list.js +96 -0
- package/dist/commands/dev/list.js.map +1 -0
- package/dist/commands/dev/screen-devtools.js +156 -0
- package/dist/commands/dev/screen-devtools.js.map +1 -0
- package/dist/commands/dev/select.js +118 -0
- package/dist/commands/dev/select.js.map +1 -0
- package/dist/commands/dev/shell.js +171 -0
- package/dist/commands/dev/shell.js.map +1 -0
- package/dist/commands/dev/vnc.js +75 -0
- package/dist/commands/dev/vnc.js.map +1 -0
- package/dist/commands/device/select.js +118 -0
- package/dist/commands/device/select.js.map +1 -0
- package/dist/commands/flash.js +1120 -0
- package/dist/commands/flash.js.map +1 -0
- package/dist/commands/inst/create.js +55 -0
- package/dist/commands/inst/create.js.map +1 -0
- package/dist/commands/inst/index.js +15 -0
- package/dist/commands/inst/index.js.map +1 -0
- package/dist/commands/inst/list.js +26 -0
- package/dist/commands/inst/list.js.map +1 -0
- package/dist/commands/legacydev/debug.js +11 -0
- package/dist/commands/legacydev/debug.js.map +1 -0
- package/dist/commands/legacydev/deploy.js +15 -0
- package/dist/commands/legacydev/deploy.js.map +1 -0
- package/dist/commands/legacydev/dumpTwin.js +27 -0
- package/dist/commands/legacydev/dumpTwin.js.map +1 -0
- package/dist/commands/legacydev/forward.js +104 -0
- package/dist/commands/legacydev/forward.js.map +1 -0
- package/dist/commands/legacydev/index.js +188 -0
- package/dist/commands/legacydev/index.js.map +1 -0
- package/dist/commands/legacydev/invoke.js +29 -0
- package/dist/commands/legacydev/invoke.js.map +1 -0
- package/dist/commands/legacydev/js.js +69 -0
- package/dist/commands/legacydev/js.js.map +1 -0
- package/dist/commands/legacydev/list.js +196 -0
- package/dist/commands/legacydev/list.js.map +1 -0
- package/dist/commands/legacydev/logs.js +60 -0
- package/dist/commands/legacydev/logs.js.map +1 -0
- package/dist/commands/legacydev/modules.js +50 -0
- package/dist/commands/legacydev/modules.js.map +1 -0
- package/dist/commands/legacydev/move.js +23 -0
- package/dist/commands/legacydev/move.js.map +1 -0
- package/dist/commands/legacydev/ota.js +88 -0
- package/dist/commands/legacydev/ota.js.map +1 -0
- package/dist/commands/legacydev/patchTwin.js +21 -0
- package/dist/commands/legacydev/patchTwin.js.map +1 -0
- package/dist/commands/legacydev/pin.js +23 -0
- package/dist/commands/legacydev/pin.js.map +1 -0
- package/dist/commands/legacydev/pub.js +25 -0
- package/dist/commands/legacydev/pub.js.map +1 -0
- package/dist/commands/legacydev/rdp.js +64 -0
- package/dist/commands/legacydev/rdp.js.map +1 -0
- package/dist/commands/legacydev/screen-devtools.js +142 -0
- package/dist/commands/legacydev/screen-devtools.js.map +1 -0
- package/dist/commands/legacydev/settingsShow.js +89 -0
- package/dist/commands/legacydev/settingsShow.js.map +1 -0
- package/dist/commands/legacydev/settingsUpdate.js +114 -0
- package/dist/commands/legacydev/settingsUpdate.js.map +1 -0
- package/dist/commands/legacydev/shell.js +167 -0
- package/dist/commands/legacydev/shell.js.map +1 -0
- package/dist/commands/legacydev/showTwin.js +9 -0
- package/dist/commands/legacydev/showTwin.js.map +1 -0
- package/dist/commands/legacydev/statusLog.js +56 -0
- package/dist/commands/legacydev/statusLog.js.map +1 -0
- package/dist/commands/legacydev/sub.js +39 -0
- package/dist/commands/legacydev/sub.js.map +1 -0
- package/dist/commands/legacydev/vnc.js +61 -0
- package/dist/commands/legacydev/vnc.js.map +1 -0
- package/dist/commands/tenant/index.js +21 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/commands/tenant/list.js +14 -0
- package/dist/commands/tenant/list.js.map +1 -0
- package/dist/commands/tenant/select.js +87 -0
- package/dist/commands/tenant/select.js.map +1 -0
- package/dist/commands/vm/create.js +718 -0
- package/dist/commands/vm/create.js.map +1 -0
- package/dist/commands/vm/index.js +130 -0
- package/dist/commands/vm/index.js.map +1 -0
- package/dist/commands/vm/list.js +124 -0
- package/dist/commands/vm/list.js.map +1 -0
- package/dist/commands/vm/logs.js +66 -0
- package/dist/commands/vm/logs.js.map +1 -0
- package/dist/commands/vm/remove.js +180 -0
- package/dist/commands/vm/remove.js.map +1 -0
- package/dist/commands/vm/shell.js +400 -0
- package/dist/commands/vm/shell.js.map +1 -0
- package/dist/commands/vm/start.js +861 -0
- package/dist/commands/vm/start.js.map +1 -0
- package/dist/commands/vm/stop.js +232 -0
- package/dist/commands/vm/stop.js.map +1 -0
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -0
- package/dist/services/admin-api/admin-api.types.js +3 -0
- package/dist/services/admin-api/admin-api.types.js.map +1 -0
- package/dist/services/admin-api/device-modules.admin-api.service.js +58 -0
- package/dist/services/admin-api/device-modules.admin-api.service.js.map +1 -0
- package/dist/services/admin-api/devices-admin-api.service.js +213 -0
- package/dist/services/admin-api/devices-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/gridapps-admin-api.service.js +59 -0
- package/dist/services/admin-api/gridapps-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/index.js +157 -0
- package/dist/services/admin-api/index.js.map +1 -0
- package/dist/services/admin-api/installations-admin-api.service.js +29 -0
- package/dist/services/admin-api/installations-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/organizations-admin-api.service.js +53 -0
- package/dist/services/admin-api/organizations-admin-api.service.js.map +1 -0
- package/dist/services/auth/device-grant-auth.service.js +224 -0
- package/dist/services/auth/device-grant-auth.service.js.map +1 -0
- package/dist/services/phyhub/index.js +200 -0
- package/dist/services/phyhub/index.js.map +1 -0
- package/dist/services/phyhub/phyhub.types.js +3 -0
- package/dist/services/phyhub/phyhub.types.js.map +1 -0
- package/dist/utils/device-fetcher.js +92 -0
- package/dist/utils/device-fetcher.js.map +1 -0
- package/dist/utils/devices.js +41 -0
- package/dist/utils/devices.js.map +1 -0
- package/dist/utils/docker-credentials.js +720 -0
- package/dist/utils/docker-credentials.js.map +1 -0
- package/dist/utils/emulated-device.js +91 -0
- package/dist/utils/emulated-device.js.map +1 -0
- package/dist/utils/index.js +180 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/modules.js +36 -0
- package/dist/utils/modules.js.map +1 -0
- package/dist/utils/org-selector.js +108 -0
- package/dist/utils/org-selector.js.map +1 -0
- package/dist/utils/proxy.js +31 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/registry-credentials.js +113 -0
- package/dist/utils/registry-credentials.js.map +1 -0
- package/dist/utils/statuses.js +124 -0
- package/dist/utils/statuses.js.map +1 -0
- package/dist/utils/templates.js +197 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/tenant-storage.js +88 -0
- package/dist/utils/tenant-storage.js.map +1 -0
- package/dist/utils/vm.js +434 -0
- package/dist/utils/vm.js.map +1 -0
- package/dist/utils/with-spinner.js +20 -0
- package/dist/utils/with-spinner.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,451 @@
|
|
|
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.initializeProjectApp = void 0;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const inquirer_autocomplete_prompt_1 = __importDefault(require("inquirer-autocomplete-prompt"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
12
|
+
const child_process_1 = __importDefault(require("child_process"));
|
|
13
|
+
const templates_1 = require("../../utils/templates");
|
|
14
|
+
const with_spinner_1 = __importDefault(require("../../utils/with-spinner"));
|
|
15
|
+
const publish_1 = require("./publish");
|
|
16
|
+
const create_1 = __importDefault(require("../inst/create"));
|
|
17
|
+
const settings_1 = __importDefault(require("./settings"));
|
|
18
|
+
const upload_description_1 = require("./upload-description");
|
|
19
|
+
const types_1 = require("./types");
|
|
20
|
+
const utils_1 = require("../../utils");
|
|
21
|
+
const admin_api_1 = require("../../services/admin-api");
|
|
22
|
+
const docker_credentials_1 = require("../../utils/docker-credentials");
|
|
23
|
+
const registry_credentials_1 = require("../../utils/registry-credentials");
|
|
24
|
+
const device_picker_1 = require("./device-picker");
|
|
25
|
+
const org_selector_1 = require("../../utils/org-selector");
|
|
26
|
+
const emulated_device_1 = require("../../utils/emulated-device");
|
|
27
|
+
inquirer_1.default.registerPrompt('autocomplete', inquirer_autocomplete_prompt_1.default);
|
|
28
|
+
const templates = {
|
|
29
|
+
[types_1.ProjectType.Basic]: 'template-screen-html',
|
|
30
|
+
[types_1.ProjectType.React]: 'template-screen-react',
|
|
31
|
+
[types_1.ProjectType.Mobile]: 'template-mobile',
|
|
32
|
+
[types_1.ProjectType.EdgeNode]: 'template-edge',
|
|
33
|
+
};
|
|
34
|
+
const projectTemplates = [
|
|
35
|
+
{
|
|
36
|
+
type: 'list',
|
|
37
|
+
name: 'projectType',
|
|
38
|
+
message: 'What kind of app do you want to create?',
|
|
39
|
+
choices: [
|
|
40
|
+
{
|
|
41
|
+
name: 'Screen Application (React)',
|
|
42
|
+
value: types_1.ProjectType.React,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'Screen Application (HTML/JS)',
|
|
46
|
+
value: types_1.ProjectType.Basic,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Mobile Application (PWA React)',
|
|
50
|
+
value: types_1.ProjectType.Mobile,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Edge Application (Node.js)',
|
|
54
|
+
value: types_1.ProjectType.EdgeNode,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
const projectTypeToAppType = {
|
|
60
|
+
[types_1.ProjectType.Basic]: 'screen',
|
|
61
|
+
[types_1.ProjectType.React]: 'screen',
|
|
62
|
+
[types_1.ProjectType.Mobile]: 'mobile',
|
|
63
|
+
[types_1.ProjectType.EdgeNode]: 'module',
|
|
64
|
+
};
|
|
65
|
+
const initializeProjectApp = async (project, displayName, type) => {
|
|
66
|
+
let organizationName = null;
|
|
67
|
+
let organizationSlug = null;
|
|
68
|
+
let projectName = null; // name with org prefix
|
|
69
|
+
let projectType = type;
|
|
70
|
+
let registry;
|
|
71
|
+
let imageName;
|
|
72
|
+
let dockerUsername;
|
|
73
|
+
let dockerRepoIsPrivate = false;
|
|
74
|
+
let selectedArchitectures = ['arm64', 'amd64']; // Default to both
|
|
75
|
+
let emulateDevice;
|
|
76
|
+
let appDirectory;
|
|
77
|
+
// Setup SIGINT handler for cleanup on Ctrl+C
|
|
78
|
+
const cleanupOnExit = async () => {
|
|
79
|
+
if (appDirectory && fs_extra_1.default.existsSync(appDirectory)) {
|
|
80
|
+
console.log(chalk_1.default.yellow(`\nInterrupted. Cleaning up directory: ${path_1.default.basename(appDirectory)}`));
|
|
81
|
+
try {
|
|
82
|
+
await fs_extra_1.default.remove(appDirectory);
|
|
83
|
+
console.log(chalk_1.default.green(`✓ Cleanup completed`));
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error(chalk_1.default.red(`Failed to clean up: ${err.message}`));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
process.exit(130); // Exit code for SIGINT
|
|
90
|
+
};
|
|
91
|
+
process.on('SIGINT', cleanupOnExit);
|
|
92
|
+
if (project.trim() === '.')
|
|
93
|
+
throw new Error('Project name is invalid');
|
|
94
|
+
const [org, app] = project.split('.');
|
|
95
|
+
if (!app) {
|
|
96
|
+
// Use the shared organization selector that handles tenant persistence
|
|
97
|
+
const organization = await (0, org_selector_1.selectOrganization)('Select the organization where you want to create and publish your app to:');
|
|
98
|
+
if (!organization) {
|
|
99
|
+
throw new Error('No organization selected');
|
|
100
|
+
}
|
|
101
|
+
organizationSlug = organization.slug;
|
|
102
|
+
organizationName = organization.displayName;
|
|
103
|
+
projectName = `${organizationSlug}.${project}`;
|
|
104
|
+
if (!organizationSlug) {
|
|
105
|
+
throw new Error('Organization is invalid');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const organizations = await (0, with_spinner_1.default)((0, admin_api_1.adminApi)().organizations.listOrganizations, 'Fetching organization list. Please wait...');
|
|
110
|
+
const foundOrg = organizations
|
|
111
|
+
.filter(({ organizationName: name }) => name === org)
|
|
112
|
+
.shift();
|
|
113
|
+
organizationSlug = foundOrg?.organizationName;
|
|
114
|
+
organizationName = foundOrg?.displayName;
|
|
115
|
+
if (!organizationSlug)
|
|
116
|
+
throw Error(`Cannot find organization ${org}`);
|
|
117
|
+
projectName = project; // already contains org prefix
|
|
118
|
+
}
|
|
119
|
+
if (!projectType) {
|
|
120
|
+
const res = (await inquirer_1.default.prompt(projectTemplates));
|
|
121
|
+
projectType = res.projectType;
|
|
122
|
+
}
|
|
123
|
+
// For screen applications, let the user select a device if not already saved
|
|
124
|
+
if (projectType === types_1.ProjectType.Basic || projectType === types_1.ProjectType.React) {
|
|
125
|
+
try {
|
|
126
|
+
// Check if we already have a saved emulated device
|
|
127
|
+
const hasDevice = await (0, emulated_device_1.hasEmulatedDevice)();
|
|
128
|
+
if (hasDevice) {
|
|
129
|
+
// Use the saved device
|
|
130
|
+
const savedDevice = await (0, emulated_device_1.getEmulatedDevice)();
|
|
131
|
+
if (savedDevice?.id) {
|
|
132
|
+
console.log(chalk_1.default.gray(`Using saved emulated device: ${chalk_1.default.blue(savedDevice.name)} (${savedDevice.id})`));
|
|
133
|
+
emulateDevice = savedDevice.id;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
// If the saved device is invalid, we'll ask if the user wants to select one
|
|
137
|
+
console.log(chalk_1.default.yellow('Saved device information is invalid'));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// If no device is saved or the saved device is invalid, ask if the user wants to select one
|
|
141
|
+
if (!emulateDevice) {
|
|
142
|
+
// Ask if the user wants to select a device
|
|
143
|
+
const { selectEmulatedDevice } = await inquirer_1.default.prompt([
|
|
144
|
+
{
|
|
145
|
+
type: 'confirm',
|
|
146
|
+
name: 'selectEmulatedDevice',
|
|
147
|
+
message: 'Would you like to select a device for emulation? (optional)',
|
|
148
|
+
default: false,
|
|
149
|
+
},
|
|
150
|
+
]);
|
|
151
|
+
if (selectEmulatedDevice) {
|
|
152
|
+
// User wants to select a device
|
|
153
|
+
console.log(chalk_1.default.dim('Please select a device for emulation:'));
|
|
154
|
+
const device = await (0, device_picker_1.selectDevice)(organizationSlug);
|
|
155
|
+
// Save the selected device for future use
|
|
156
|
+
await (0, emulated_device_1.saveEmulatedDevice)({
|
|
157
|
+
id: device.id,
|
|
158
|
+
name: device.name,
|
|
159
|
+
accessKey: device.accessKey,
|
|
160
|
+
displayName: device.displayName,
|
|
161
|
+
deviceSerial: device.deviceSerial,
|
|
162
|
+
});
|
|
163
|
+
emulateDevice = device.id;
|
|
164
|
+
console.log(chalk_1.default.gray(`Device ID ${chalk_1.default.blue(emulateDevice)} will be used for emulation`));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// User chose not to select a device
|
|
168
|
+
console.log(chalk_1.default.dim('No device selected. You can select one later with "phy dev select"'));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
// This is no longer a fatal error - we can continue without a device
|
|
174
|
+
console.error(chalk_1.default.yellow(`Warning: ${error.message}`));
|
|
175
|
+
console.log(chalk_1.default.dim('Continuing without a device. You can select one later with "phy dev select"'));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
appDirectory = path_1.default.join(process.cwd(), project.toLocaleLowerCase());
|
|
179
|
+
console.log(chalk_1.default.gray(`Creating a new ${projectType} app in ${appDirectory}`));
|
|
180
|
+
const template = templates[projectType];
|
|
181
|
+
if (!template)
|
|
182
|
+
throw new Error('Project template repository not found');
|
|
183
|
+
// For Edge apps, ask which container registry to use
|
|
184
|
+
if (projectType === types_1.ProjectType.EdgeNode) {
|
|
185
|
+
const { registry: inputRegistry } = await inquirer_1.default.prompt([
|
|
186
|
+
{
|
|
187
|
+
type: 'input',
|
|
188
|
+
name: 'registry',
|
|
189
|
+
message: 'Enter container registry for the Edge app:',
|
|
190
|
+
default: 'docker.io',
|
|
191
|
+
},
|
|
192
|
+
]);
|
|
193
|
+
registry = inputRegistry;
|
|
194
|
+
// Extract app name without tenant prefix for default image name
|
|
195
|
+
const appNameWithoutTenant = project.split('.').length > 1 ? project.split('.')[1] : project;
|
|
196
|
+
// Default Docker Hub username/organization to the first part of the project name (before the dot)
|
|
197
|
+
const defaultOrg = organizationSlug;
|
|
198
|
+
if (registry === 'docker.io') {
|
|
199
|
+
const { username } = await inquirer_1.default.prompt([
|
|
200
|
+
{
|
|
201
|
+
type: 'input',
|
|
202
|
+
name: 'username',
|
|
203
|
+
message: 'Enter your Docker Hub username or organization name:',
|
|
204
|
+
default: defaultOrg,
|
|
205
|
+
validate: (input) => {
|
|
206
|
+
if (!input.trim()) {
|
|
207
|
+
return 'Docker Hub username/organization is required for docker.io registry';
|
|
208
|
+
}
|
|
209
|
+
return true;
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
]);
|
|
213
|
+
dockerUsername = username;
|
|
214
|
+
const { imageName: inputImageName } = await inquirer_1.default.prompt([
|
|
215
|
+
{
|
|
216
|
+
type: 'input',
|
|
217
|
+
name: 'imageName',
|
|
218
|
+
message: 'Enter image name for the Docker container (without username/organization prefix):',
|
|
219
|
+
default: appNameWithoutTenant,
|
|
220
|
+
},
|
|
221
|
+
]);
|
|
222
|
+
// Check if registry is already prepended before creating the full imageName
|
|
223
|
+
const registryPrefix = `${registry}/`;
|
|
224
|
+
if (!inputImageName.startsWith(registryPrefix)) {
|
|
225
|
+
imageName = `${registryPrefix}${dockerUsername}/${inputImageName}`;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
imageName = inputImageName; // Use as is
|
|
229
|
+
}
|
|
230
|
+
console.log(chalk_1.default.dim(`Full image name will be: ${chalk_1.default.blue(imageName)}`));
|
|
231
|
+
// Ask if the repository should be private or public (Docker Hub only)
|
|
232
|
+
const { isPrivate } = await inquirer_1.default.prompt([
|
|
233
|
+
{
|
|
234
|
+
type: 'confirm',
|
|
235
|
+
name: 'isPrivate',
|
|
236
|
+
message: 'Should the Docker Hub repository be private?',
|
|
237
|
+
default: true, // Default to private for Docker Hub
|
|
238
|
+
},
|
|
239
|
+
]);
|
|
240
|
+
// Store the privacy setting in package.json docker-credentials
|
|
241
|
+
dockerRepoIsPrivate = isPrivate;
|
|
242
|
+
// Ask which architectures to support
|
|
243
|
+
const { architectures } = await inquirer_1.default.prompt([
|
|
244
|
+
{
|
|
245
|
+
type: 'checkbox',
|
|
246
|
+
name: 'architectures',
|
|
247
|
+
message: 'Which architectures should this Edge app support?',
|
|
248
|
+
choices: [
|
|
249
|
+
{ name: 'ARM64 (arm64/v8)', value: 'arm64', checked: true },
|
|
250
|
+
{ name: 'AMD64 (x86_64)', value: 'amd64', checked: true },
|
|
251
|
+
],
|
|
252
|
+
validate: (answer) => {
|
|
253
|
+
if (answer.length < 1) {
|
|
254
|
+
return 'You must choose at least one architecture.';
|
|
255
|
+
}
|
|
256
|
+
return true;
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
]);
|
|
260
|
+
// Store selected architectures (assign to outer scope variable)
|
|
261
|
+
selectedArchitectures = architectures;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const { imageName: inputImageName } = await inquirer_1.default.prompt([
|
|
265
|
+
{
|
|
266
|
+
type: 'input',
|
|
267
|
+
name: 'imageName',
|
|
268
|
+
message: 'Enter image name for the Docker container ',
|
|
269
|
+
default: appNameWithoutTenant,
|
|
270
|
+
},
|
|
271
|
+
]);
|
|
272
|
+
// Check if registry is already prepended before creating the full imageName
|
|
273
|
+
const registryPrefix = `${registry}/`;
|
|
274
|
+
if (!inputImageName.startsWith(registryPrefix)) {
|
|
275
|
+
imageName = `${registryPrefix}${inputImageName}`;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
imageName = inputImageName; // Use as is
|
|
279
|
+
}
|
|
280
|
+
console.log(chalk_1.default.dim(`Full image name will be: ${chalk_1.default.blue(imageName)}`));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Only clone the repository (without installing dependencies)
|
|
284
|
+
await (0, templates_1.cloneRepo)({
|
|
285
|
+
destinationPath: appDirectory,
|
|
286
|
+
repo: `https://github.com/phystack/${template}.git`,
|
|
287
|
+
projectName,
|
|
288
|
+
displayName,
|
|
289
|
+
registry,
|
|
290
|
+
type: projectTypeToAppType[projectType],
|
|
291
|
+
imageName,
|
|
292
|
+
dockerRepoIsPrivate,
|
|
293
|
+
architectures: selectedArchitectures,
|
|
294
|
+
});
|
|
295
|
+
// Add Docker credentials verification for Edge apps
|
|
296
|
+
if (projectType === types_1.ProjectType.EdgeNode && registry) {
|
|
297
|
+
console.log(chalk_1.default.gray('Verifying Docker registry credentials'));
|
|
298
|
+
// Use the shared setupDockerCredentials function
|
|
299
|
+
const packageFile = path_1.default.join(appDirectory, 'package.json');
|
|
300
|
+
await (0, docker_credentials_1.setupDockerCredentials)(registry, imageName, packageFile, imageName);
|
|
301
|
+
}
|
|
302
|
+
const descFile = fs_extra_1.default.existsSync(`${appDirectory}/DESCRIPTION.md`)
|
|
303
|
+
? `${appDirectory}/DESCRIPTION.md`
|
|
304
|
+
: `${appDirectory}/README.md`;
|
|
305
|
+
await (0, upload_description_1.updateDescription)(descFile, {
|
|
306
|
+
applicationName: displayName,
|
|
307
|
+
author: organizationName,
|
|
308
|
+
});
|
|
309
|
+
console.log(chalk_1.default.green(`✓ App cloned and description uploaded at ${appDirectory}`));
|
|
310
|
+
// Remove SIGINT handler on success
|
|
311
|
+
process.removeListener('SIGINT', cleanupOnExit);
|
|
312
|
+
return {
|
|
313
|
+
appDirectory,
|
|
314
|
+
projectType,
|
|
315
|
+
organizationSlug,
|
|
316
|
+
projectName,
|
|
317
|
+
registry,
|
|
318
|
+
imageName,
|
|
319
|
+
dockerUsername,
|
|
320
|
+
emulateDevice,
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
exports.initializeProjectApp = initializeProjectApp;
|
|
324
|
+
const create = async (project, { type }) => {
|
|
325
|
+
let pname = (0, utils_1.kebabCase)(project || '');
|
|
326
|
+
let displayName = project || pname;
|
|
327
|
+
try {
|
|
328
|
+
while (!pname || pname.trim() === '') {
|
|
329
|
+
const { name } = await inquirer_1.default.prompt([
|
|
330
|
+
{
|
|
331
|
+
name: 'name',
|
|
332
|
+
type: 'input',
|
|
333
|
+
message: 'Enter name for your app:',
|
|
334
|
+
},
|
|
335
|
+
]);
|
|
336
|
+
pname = (0, utils_1.kebabCase)(name);
|
|
337
|
+
displayName = name;
|
|
338
|
+
}
|
|
339
|
+
console.log(chalk_1.default.gray(`Creating app with name: ${chalk_1.default.blue(pname)}`));
|
|
340
|
+
const resultInitApp = await (0, exports.initializeProjectApp)(pname, displayName, type);
|
|
341
|
+
const { appDirectory, projectType, projectName, registry, imageName, dockerUsername, emulateDevice, } = resultInitApp;
|
|
342
|
+
// Update package.json with correct application-type for edge apps
|
|
343
|
+
if (projectType === types_1.ProjectType.EdgeNode) {
|
|
344
|
+
const packageJsonPath = path_1.default.join(appDirectory, 'package.json');
|
|
345
|
+
const packageJson = JSON.parse(fs_extra_1.default.readFileSync(packageJsonPath, 'utf8'));
|
|
346
|
+
packageJson['application-type'] = 'module';
|
|
347
|
+
fs_extra_1.default.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
348
|
+
}
|
|
349
|
+
// Step 1: Register the app immediately after cloning and updating package.json.
|
|
350
|
+
console.log(chalk_1.default.gray(`Registering app ${chalk_1.default.blue(projectName)} in your private marketplace`));
|
|
351
|
+
const registeredApp = await (0, publish_1.registerApp)(undefined, { appDir: appDirectory });
|
|
352
|
+
// If this is an Edge app with a registry, ensure we have push credentials
|
|
353
|
+
if (projectType === types_1.ProjectType.EdgeNode && registry) {
|
|
354
|
+
const storedCredentials = await (0, registry_credentials_1.getRegistryCredentials)(registry);
|
|
355
|
+
if (storedCredentials?.push?.username && storedCredentials?.push?.password) {
|
|
356
|
+
console.log(chalk_1.default.dim('Using stored registry push credentials'));
|
|
357
|
+
try {
|
|
358
|
+
child_process_1.default.execSync(`docker login ${registry} -u ${storedCredentials.push.username} -p ${storedCredentials.push.password}`, {
|
|
359
|
+
stdio: 'pipe', // Prevent password from showing in logs
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
console.log(chalk_1.default.yellow('Warning: Failed to authenticate with Docker registry'));
|
|
364
|
+
console.error(chalk_1.default.dim('Error details:', error.message));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Skip installation creation for edge apps
|
|
369
|
+
if (projectType !== types_1.ProjectType.EdgeNode) {
|
|
370
|
+
console.log(chalk_1.default.gray('Creating a sample installation'));
|
|
371
|
+
const resultInstallation = await (0, create_1.default)({
|
|
372
|
+
appId: registeredApp.id,
|
|
373
|
+
installationName: registeredApp.name,
|
|
374
|
+
organizationId: registeredApp.organizationId,
|
|
375
|
+
projectType,
|
|
376
|
+
});
|
|
377
|
+
const { slug: installationSlug } = resultInstallation;
|
|
378
|
+
console.log(chalk_1.default.gray('Fetching default app settings'));
|
|
379
|
+
const settingsFilePath = `${appDirectory}/src/settings`;
|
|
380
|
+
await (0, settings_1.default)(installationSlug, settingsFilePath);
|
|
381
|
+
}
|
|
382
|
+
// Now install dependencies and build the project.
|
|
383
|
+
console.log(chalk_1.default.gray('Installing template dependencies and building the project. This may take a while...'));
|
|
384
|
+
await (0, templates_1.installRepo)({
|
|
385
|
+
destinationPath: appDirectory,
|
|
386
|
+
projectName,
|
|
387
|
+
displayName,
|
|
388
|
+
registry,
|
|
389
|
+
});
|
|
390
|
+
// Upload the gridapp and create release
|
|
391
|
+
console.log(chalk_1.default.gray('Publishing gridapp'));
|
|
392
|
+
// Run yarn pub in the app directory (uses the app's local CLI, not global)
|
|
393
|
+
await new Promise((resolve, reject) => {
|
|
394
|
+
const pub = child_process_1.default.spawn('yarn', ['pub'], {
|
|
395
|
+
cwd: appDirectory,
|
|
396
|
+
stdio: 'inherit',
|
|
397
|
+
shell: true,
|
|
398
|
+
env: {
|
|
399
|
+
...process.env,
|
|
400
|
+
FORCE_COLOR: '1',
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
pub.on('close', (code) => {
|
|
404
|
+
if (code !== 0) {
|
|
405
|
+
reject(new Error('yarn pub failed'));
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
resolve(null);
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
catch (err) {
|
|
414
|
+
console.error(chalk_1.default.red(`❗️There was an error creating the app:`));
|
|
415
|
+
if (err.response) {
|
|
416
|
+
// Handle API error responses
|
|
417
|
+
console.error(chalk_1.default.red(`Status: ${err.response.status}`));
|
|
418
|
+
console.error(chalk_1.default.red(`Message: ${err.response.data?.message || err.message}`));
|
|
419
|
+
if (err.response.data?.details) {
|
|
420
|
+
console.error(chalk_1.default.dim('Details:', JSON.stringify(err.response.data.details, null, 2)));
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
else if (err.code === 'ENOENT') {
|
|
424
|
+
// Handle file system errors
|
|
425
|
+
console.error(chalk_1.default.red(`File not found: ${err.path}`));
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
// Handle other types of errors
|
|
429
|
+
console.error(chalk_1.default.red(err.message));
|
|
430
|
+
if (err.stack) {
|
|
431
|
+
console.error(chalk_1.default.dim('Stack trace:', err.stack));
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// Clean up any partially created files/directories if needed
|
|
435
|
+
try {
|
|
436
|
+
if (pname && fs_extra_1.default.existsSync(path_1.default.join(process.cwd(), pname.toLowerCase()))) {
|
|
437
|
+
console.log(chalk_1.default.yellow(`Cleaning up directory: ${pname.toLowerCase()}`));
|
|
438
|
+
await fs_extra_1.default.remove(path_1.default.join(process.cwd(), pname.toLowerCase()));
|
|
439
|
+
console.log(chalk_1.default.green(`✓ Cleanup completed`));
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch (cleanupErr) {
|
|
443
|
+
console.error(chalk_1.default.red(`Failed to clean up: ${cleanupErr.message}`));
|
|
444
|
+
}
|
|
445
|
+
// Remove SIGINT handler before exit
|
|
446
|
+
// Note: cleanupOnExit is not accessible here, but process will exit anyway
|
|
447
|
+
process.exit(1);
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
exports.default = create;
|
|
451
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/app/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
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
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
10
|
+
const build_container_remote_1 = __importDefault(require("./build-container-remote"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const isIpAddress = (name) => {
|
|
13
|
+
const ipPattern = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
14
|
+
return ipPattern.test(name);
|
|
15
|
+
};
|
|
16
|
+
exports.default = async (deviceName, options) => {
|
|
17
|
+
console.log('Deploying to device: ', deviceName);
|
|
18
|
+
if (!deviceName) {
|
|
19
|
+
throw new Error('Please provide a device hostname.\nUsage: grid app deploy <device-hostname>');
|
|
20
|
+
}
|
|
21
|
+
// Check if we should use local phygrid-npm
|
|
22
|
+
const useLocalPhygridNpm = process.env.PHYGRID_LOCAL_NPM === 'true';
|
|
23
|
+
if (useLocalPhygridNpm) {
|
|
24
|
+
console.log(chalk_1.default.cyan('Using local phygrid-npm packages for deployment'));
|
|
25
|
+
}
|
|
26
|
+
const deviceHostname = isIpAddress(deviceName) || deviceName.endsWith('.local')
|
|
27
|
+
? deviceName
|
|
28
|
+
: `${deviceName}.local`;
|
|
29
|
+
const sourceDir = process.cwd();
|
|
30
|
+
// Detect project structure - determine if we're in projects/X or directly in a project
|
|
31
|
+
const moduleName = path_1.default.basename(sourceDir);
|
|
32
|
+
const isInProjectsDir = path_1.default.basename(path_1.default.dirname(sourceDir)) === 'projects';
|
|
33
|
+
// Set remoteDir based on whether we're in the projects directory or not
|
|
34
|
+
const remoteDir = isInProjectsDir
|
|
35
|
+
? `~/projects/${moduleName}`
|
|
36
|
+
: `~/${moduleName}`;
|
|
37
|
+
// Determine the root directory and phygrid-npm path
|
|
38
|
+
const rootDir = isInProjectsDir
|
|
39
|
+
? path_1.default.resolve(sourceDir, '../../')
|
|
40
|
+
: path_1.default.resolve(sourceDir, '../');
|
|
41
|
+
const phygridNpmDir = path_1.default.join(rootDir, 'repos/phygrid-npm');
|
|
42
|
+
// Check if phygrid-npm exists when using local packages
|
|
43
|
+
if (useLocalPhygridNpm && !fs_1.default.existsSync(phygridNpmDir)) {
|
|
44
|
+
throw new Error(`Local phygrid-npm directory not found at ${phygridNpmDir}. Cannot deploy with local packages.`);
|
|
45
|
+
}
|
|
46
|
+
// Ensure remote directory structure exists
|
|
47
|
+
if (isInProjectsDir) {
|
|
48
|
+
await runRemoteCommand(deviceHostname, 'mkdir -p ~/projects');
|
|
49
|
+
}
|
|
50
|
+
// Setup rsync source and target paths
|
|
51
|
+
const rsyncSource = '.'; // Current directory
|
|
52
|
+
const rsyncTarget = `dev@${deviceHostname}:${remoteDir}`;
|
|
53
|
+
// Setup rsync process for the main application
|
|
54
|
+
const rsyncProcess = (0, child_process_1.spawn)('rsync', [
|
|
55
|
+
'-avr',
|
|
56
|
+
'--exclude=node_modules',
|
|
57
|
+
'--exclude=dist',
|
|
58
|
+
'--exclude=.git',
|
|
59
|
+
'--delete',
|
|
60
|
+
rsyncSource,
|
|
61
|
+
rsyncTarget,
|
|
62
|
+
]);
|
|
63
|
+
rsyncProcess.stdout.pipe(process.stdout);
|
|
64
|
+
rsyncProcess.stderr.pipe(process.stderr);
|
|
65
|
+
return new Promise((resolve, reject) => {
|
|
66
|
+
rsyncProcess.on('error', async (error) => {
|
|
67
|
+
if (error.code === 'ENOENT') {
|
|
68
|
+
reject(new Error('rsync command not found. Please install rsync.'));
|
|
69
|
+
}
|
|
70
|
+
reject(error);
|
|
71
|
+
});
|
|
72
|
+
rsyncProcess.on('close', async (code) => {
|
|
73
|
+
if (code !== 0) {
|
|
74
|
+
console.log(chalk_1.default.red('\nFailed to connect to the device.'));
|
|
75
|
+
const { needsHelp } = await inquirer_1.default.prompt([
|
|
76
|
+
{
|
|
77
|
+
type: 'confirm',
|
|
78
|
+
name: 'needsHelp',
|
|
79
|
+
message: '\nHave you:\n' +
|
|
80
|
+
'1. Enabled developer mode on the target device?\n' +
|
|
81
|
+
'2. Ensured you are on the same local network as the device?\n' +
|
|
82
|
+
'\nWould you like instructions on how to enable developer mode?',
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
if (needsHelp) {
|
|
86
|
+
console.log(chalk_1.default.cyan('\nTo enable developer mode:\n'));
|
|
87
|
+
console.log('1. Run: phy dev shell <device-name>');
|
|
88
|
+
console.log('2. Select "Advanced" from the menu');
|
|
89
|
+
console.log('3. Choose "Enable Developer Mode"');
|
|
90
|
+
console.log('4. Follow the prompts to set up authentication');
|
|
91
|
+
console.log(chalk_1.default.dim('\nAfter completing these steps, try running this deploy command again.'));
|
|
92
|
+
}
|
|
93
|
+
reject(new Error('Failed to deploy to device'));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// If using local packages, sync the phygrid-npm directory
|
|
97
|
+
if (useLocalPhygridNpm) {
|
|
98
|
+
console.log(chalk_1.default.dim('\nSyncing local phygrid-npm directory...'));
|
|
99
|
+
// Create the repos directory on the remote
|
|
100
|
+
await runRemoteCommand(deviceHostname, 'mkdir -p ~/repos');
|
|
101
|
+
const phygridNpmRsyncProcess = (0, child_process_1.spawn)('rsync', [
|
|
102
|
+
'-avr',
|
|
103
|
+
'--exclude=node_modules',
|
|
104
|
+
'--exclude=dist',
|
|
105
|
+
'--exclude=.git',
|
|
106
|
+
'--delete',
|
|
107
|
+
phygridNpmDir, // Local phygrid-npm directory
|
|
108
|
+
`dev@${deviceHostname}:~/repos/`, // Remote repos directory
|
|
109
|
+
]);
|
|
110
|
+
phygridNpmRsyncProcess.stdout.pipe(process.stdout);
|
|
111
|
+
phygridNpmRsyncProcess.stderr.pipe(process.stderr);
|
|
112
|
+
phygridNpmRsyncProcess.on('error', (error) => {
|
|
113
|
+
console.error(chalk_1.default.red(`Failed to sync phygrid-npm: ${error.message}`));
|
|
114
|
+
reject(error);
|
|
115
|
+
});
|
|
116
|
+
phygridNpmRsyncProcess.on('close', async (syncCode) => {
|
|
117
|
+
if (syncCode !== 0) {
|
|
118
|
+
console.error(chalk_1.default.red('Failed to sync phygrid-npm directory'));
|
|
119
|
+
reject(new Error('Failed to sync phygrid-npm'));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
console.log(chalk_1.default.dim('phygrid-npm sync completed successfully'));
|
|
123
|
+
proceedWithBuild();
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
proceedWithBuild();
|
|
128
|
+
}
|
|
129
|
+
async function proceedWithBuild() {
|
|
130
|
+
try {
|
|
131
|
+
console.log(chalk_1.default.dim('\nRsync completed successfully. Building Docker container...'));
|
|
132
|
+
await (0, build_container_remote_1.default)(moduleName, {
|
|
133
|
+
deviceHostname,
|
|
134
|
+
remoteDir,
|
|
135
|
+
phygridLocalNpm: useLocalPhygridNpm,
|
|
136
|
+
isInProjectsDir,
|
|
137
|
+
});
|
|
138
|
+
console.log(chalk_1.default.green('✓ Deploy completed successfully'));
|
|
139
|
+
resolve(null);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
reject(error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
// Helper function to run remote commands
|
|
149
|
+
async function runRemoteCommand(deviceHostname, command, checkOutput = false) {
|
|
150
|
+
return new Promise((resolve, reject) => {
|
|
151
|
+
let output = '';
|
|
152
|
+
const sshProcess = (0, child_process_1.spawn)('ssh', ['-tt', `dev@${deviceHostname}`, `TERM=xterm-256color ${command}`], {
|
|
153
|
+
stdio: checkOutput
|
|
154
|
+
? ['inherit', 'pipe', 'inherit']
|
|
155
|
+
: ['inherit', 'inherit', 'inherit'],
|
|
156
|
+
});
|
|
157
|
+
if (checkOutput) {
|
|
158
|
+
sshProcess.stdout?.on('data', (data) => {
|
|
159
|
+
output += data.toString();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
sshProcess.on('close', (code) => {
|
|
163
|
+
if (checkOutput) {
|
|
164
|
+
resolve(output.trim());
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
resolve(code === 0);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
sshProcess.on('error', (error) => {
|
|
171
|
+
console.error(chalk_1.default.red(`Failed to execute remote command: ${error.message}`));
|
|
172
|
+
reject(error);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=deploy.js.map
|