@phystack/cli 4.4.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/LICENSE.md +19 -0
  2. package/README.md +24 -0
  3. package/bin/index.js +2 -0
  4. package/dist/commands/app/build-apps.js +66 -0
  5. package/dist/commands/app/build-apps.js.map +1 -0
  6. package/dist/commands/app/build-container-remote.js +171 -0
  7. package/dist/commands/app/build-container-remote.js.map +1 -0
  8. package/dist/commands/app/build-container.js +322 -0
  9. package/dist/commands/app/build-container.js.map +1 -0
  10. package/dist/commands/app/build.js +375 -0
  11. package/dist/commands/app/build.js.map +1 -0
  12. package/dist/commands/app/create.js +409 -0
  13. package/dist/commands/app/create.js.map +1 -0
  14. package/dist/commands/app/deploy.js +176 -0
  15. package/dist/commands/app/deploy.js.map +1 -0
  16. package/dist/commands/app/device-picker.js +150 -0
  17. package/dist/commands/app/device-picker.js.map +1 -0
  18. package/dist/commands/app/import.js +303 -0
  19. package/dist/commands/app/import.js.map +1 -0
  20. package/dist/commands/app/list.js +26 -0
  21. package/dist/commands/app/list.js.map +1 -0
  22. package/dist/commands/app/publish.js +327 -0
  23. package/dist/commands/app/publish.js.map +1 -0
  24. package/dist/commands/app/settings.js +129 -0
  25. package/dist/commands/app/settings.js.map +1 -0
  26. package/dist/commands/app/types.js +13 -0
  27. package/dist/commands/app/types.js.map +1 -0
  28. package/dist/commands/app/upload-description.js +139 -0
  29. package/dist/commands/app/upload-description.js.map +1 -0
  30. package/dist/commands/app/upload-settings.js +29 -0
  31. package/dist/commands/app/upload-settings.js.map +1 -0
  32. package/dist/commands/app/utils.js +86 -0
  33. package/dist/commands/app/utils.js.map +1 -0
  34. package/dist/commands/auth/login.js +111 -0
  35. package/dist/commands/auth/login.js.map +1 -0
  36. package/dist/commands/auth/logout.js +19 -0
  37. package/dist/commands/auth/logout.js.map +1 -0
  38. package/dist/commands/descriptor/create.js +143 -0
  39. package/dist/commands/descriptor/create.js.map +1 -0
  40. package/dist/commands/descriptor/index.js +36 -0
  41. package/dist/commands/descriptor/index.js.map +1 -0
  42. package/dist/commands/descriptor/publish.js +163 -0
  43. package/dist/commands/descriptor/publish.js.map +1 -0
  44. package/dist/commands/descriptor/show.js +68 -0
  45. package/dist/commands/descriptor/show.js.map +1 -0
  46. package/dist/commands/dev/develop.js +175 -0
  47. package/dist/commands/dev/develop.js.map +1 -0
  48. package/dist/commands/dev/forward.js +118 -0
  49. package/dist/commands/dev/forward.js.map +1 -0
  50. package/dist/commands/dev/index.js +66 -0
  51. package/dist/commands/dev/index.js.map +1 -0
  52. package/dist/commands/dev/list.js +96 -0
  53. package/dist/commands/dev/list.js.map +1 -0
  54. package/dist/commands/dev/screen-devtools.js +156 -0
  55. package/dist/commands/dev/screen-devtools.js.map +1 -0
  56. package/dist/commands/dev/select.js +118 -0
  57. package/dist/commands/dev/select.js.map +1 -0
  58. package/dist/commands/dev/shell.js +171 -0
  59. package/dist/commands/dev/shell.js.map +1 -0
  60. package/dist/commands/dev/vnc.js +75 -0
  61. package/dist/commands/dev/vnc.js.map +1 -0
  62. package/dist/commands/device/select.js +118 -0
  63. package/dist/commands/device/select.js.map +1 -0
  64. package/dist/commands/flash.js +1120 -0
  65. package/dist/commands/flash.js.map +1 -0
  66. package/dist/commands/inst/create.js +55 -0
  67. package/dist/commands/inst/create.js.map +1 -0
  68. package/dist/commands/inst/index.js +15 -0
  69. package/dist/commands/inst/index.js.map +1 -0
  70. package/dist/commands/inst/list.js +26 -0
  71. package/dist/commands/inst/list.js.map +1 -0
  72. package/dist/commands/legacydev/debug.js +11 -0
  73. package/dist/commands/legacydev/debug.js.map +1 -0
  74. package/dist/commands/legacydev/deploy.js +15 -0
  75. package/dist/commands/legacydev/deploy.js.map +1 -0
  76. package/dist/commands/legacydev/dumpTwin.js +27 -0
  77. package/dist/commands/legacydev/dumpTwin.js.map +1 -0
  78. package/dist/commands/legacydev/forward.js +104 -0
  79. package/dist/commands/legacydev/forward.js.map +1 -0
  80. package/dist/commands/legacydev/index.js +188 -0
  81. package/dist/commands/legacydev/index.js.map +1 -0
  82. package/dist/commands/legacydev/invoke.js +29 -0
  83. package/dist/commands/legacydev/invoke.js.map +1 -0
  84. package/dist/commands/legacydev/js.js +69 -0
  85. package/dist/commands/legacydev/js.js.map +1 -0
  86. package/dist/commands/legacydev/list.js +196 -0
  87. package/dist/commands/legacydev/list.js.map +1 -0
  88. package/dist/commands/legacydev/logs.js +60 -0
  89. package/dist/commands/legacydev/logs.js.map +1 -0
  90. package/dist/commands/legacydev/modules.js +50 -0
  91. package/dist/commands/legacydev/modules.js.map +1 -0
  92. package/dist/commands/legacydev/move.js +23 -0
  93. package/dist/commands/legacydev/move.js.map +1 -0
  94. package/dist/commands/legacydev/ota.js +88 -0
  95. package/dist/commands/legacydev/ota.js.map +1 -0
  96. package/dist/commands/legacydev/patchTwin.js +21 -0
  97. package/dist/commands/legacydev/patchTwin.js.map +1 -0
  98. package/dist/commands/legacydev/pin.js +23 -0
  99. package/dist/commands/legacydev/pin.js.map +1 -0
  100. package/dist/commands/legacydev/pub.js +25 -0
  101. package/dist/commands/legacydev/pub.js.map +1 -0
  102. package/dist/commands/legacydev/rdp.js +64 -0
  103. package/dist/commands/legacydev/rdp.js.map +1 -0
  104. package/dist/commands/legacydev/screen-devtools.js +142 -0
  105. package/dist/commands/legacydev/screen-devtools.js.map +1 -0
  106. package/dist/commands/legacydev/settingsShow.js +89 -0
  107. package/dist/commands/legacydev/settingsShow.js.map +1 -0
  108. package/dist/commands/legacydev/settingsUpdate.js +114 -0
  109. package/dist/commands/legacydev/settingsUpdate.js.map +1 -0
  110. package/dist/commands/legacydev/shell.js +167 -0
  111. package/dist/commands/legacydev/shell.js.map +1 -0
  112. package/dist/commands/legacydev/showTwin.js +9 -0
  113. package/dist/commands/legacydev/showTwin.js.map +1 -0
  114. package/dist/commands/legacydev/statusLog.js +56 -0
  115. package/dist/commands/legacydev/statusLog.js.map +1 -0
  116. package/dist/commands/legacydev/sub.js +39 -0
  117. package/dist/commands/legacydev/sub.js.map +1 -0
  118. package/dist/commands/legacydev/vnc.js +61 -0
  119. package/dist/commands/legacydev/vnc.js.map +1 -0
  120. package/dist/commands/tenant/index.js +21 -0
  121. package/dist/commands/tenant/index.js.map +1 -0
  122. package/dist/commands/tenant/list.js +14 -0
  123. package/dist/commands/tenant/list.js.map +1 -0
  124. package/dist/commands/tenant/select.js +87 -0
  125. package/dist/commands/tenant/select.js.map +1 -0
  126. package/dist/commands/vm/create.js +718 -0
  127. package/dist/commands/vm/create.js.map +1 -0
  128. package/dist/commands/vm/index.js +130 -0
  129. package/dist/commands/vm/index.js.map +1 -0
  130. package/dist/commands/vm/list.js +124 -0
  131. package/dist/commands/vm/list.js.map +1 -0
  132. package/dist/commands/vm/logs.js +66 -0
  133. package/dist/commands/vm/logs.js.map +1 -0
  134. package/dist/commands/vm/remove.js +180 -0
  135. package/dist/commands/vm/remove.js.map +1 -0
  136. package/dist/commands/vm/shell.js +400 -0
  137. package/dist/commands/vm/shell.js.map +1 -0
  138. package/dist/commands/vm/start.js +861 -0
  139. package/dist/commands/vm/start.js.map +1 -0
  140. package/dist/commands/vm/stop.js +232 -0
  141. package/dist/commands/vm/stop.js.map +1 -0
  142. package/dist/index.js +158 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/services/admin-api/admin-api.types.js +3 -0
  145. package/dist/services/admin-api/admin-api.types.js.map +1 -0
  146. package/dist/services/admin-api/device-modules.admin-api.service.js +58 -0
  147. package/dist/services/admin-api/device-modules.admin-api.service.js.map +1 -0
  148. package/dist/services/admin-api/devices-admin-api.service.js +213 -0
  149. package/dist/services/admin-api/devices-admin-api.service.js.map +1 -0
  150. package/dist/services/admin-api/gridapps-admin-api.service.js +59 -0
  151. package/dist/services/admin-api/gridapps-admin-api.service.js.map +1 -0
  152. package/dist/services/admin-api/index.js +157 -0
  153. package/dist/services/admin-api/index.js.map +1 -0
  154. package/dist/services/admin-api/installations-admin-api.service.js +29 -0
  155. package/dist/services/admin-api/installations-admin-api.service.js.map +1 -0
  156. package/dist/services/admin-api/organizations-admin-api.service.js +53 -0
  157. package/dist/services/admin-api/organizations-admin-api.service.js.map +1 -0
  158. package/dist/services/auth/device-grant-auth.service.js +224 -0
  159. package/dist/services/auth/device-grant-auth.service.js.map +1 -0
  160. package/dist/services/phyhub/index.js +200 -0
  161. package/dist/services/phyhub/index.js.map +1 -0
  162. package/dist/services/phyhub/phyhub.types.js +3 -0
  163. package/dist/services/phyhub/phyhub.types.js.map +1 -0
  164. package/dist/utils/device-fetcher.js +92 -0
  165. package/dist/utils/device-fetcher.js.map +1 -0
  166. package/dist/utils/devices.js +41 -0
  167. package/dist/utils/devices.js.map +1 -0
  168. package/dist/utils/docker-credentials.js +546 -0
  169. package/dist/utils/docker-credentials.js.map +1 -0
  170. package/dist/utils/emulated-device.js +91 -0
  171. package/dist/utils/emulated-device.js.map +1 -0
  172. package/dist/utils/index.js +180 -0
  173. package/dist/utils/index.js.map +1 -0
  174. package/dist/utils/modules.js +36 -0
  175. package/dist/utils/modules.js.map +1 -0
  176. package/dist/utils/org-selector.js +108 -0
  177. package/dist/utils/org-selector.js.map +1 -0
  178. package/dist/utils/proxy.js +31 -0
  179. package/dist/utils/proxy.js.map +1 -0
  180. package/dist/utils/registry-credentials.js +113 -0
  181. package/dist/utils/registry-credentials.js.map +1 -0
  182. package/dist/utils/statuses.js +124 -0
  183. package/dist/utils/statuses.js.map +1 -0
  184. package/dist/utils/templates.js +189 -0
  185. package/dist/utils/templates.js.map +1 -0
  186. package/dist/utils/tenant-storage.js +88 -0
  187. package/dist/utils/tenant-storage.js.map +1 -0
  188. package/dist/utils/vm.js +434 -0
  189. package/dist/utils/vm.js.map +1 -0
  190. package/dist/utils/with-spinner.js +20 -0
  191. package/dist/utils/with-spinner.js.map +1 -0
  192. package/package.json +103 -0
package/LICENSE.md ADDED
@@ -0,0 +1,19 @@
1
+ MIT License
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # Phygrid Grid CLI (phy)
2
+
3
+ The [phy cli](https://developer.omborigrid.com/#/cli/setup) is a supplementary tool for Phygrid development and device management.
4
+ Phygrid Console: [console.omborigrid.com](https://console.omborigrid.com/)
5
+
6
+ ## 📦 Install
7
+
8
+ ```bash
9
+ npm i -g @phystack/cli
10
+ ```
11
+
12
+ ## 🔨 Instructions
13
+
14
+ Explore other commands using the `--help` command
15
+
16
+ ```bash
17
+ phy --help
18
+ phy -h
19
+ ```
20
+
21
+ ## 🔗 Links
22
+ - [Phygrid Website](https://phygrid.com/)
23
+ - [CLI Setup](https://developer.omborigrid.com/#/cli/setup)
24
+ - [Other Commands](https://developer.omborigrid.com/#/cli/reference)
package/bin/index.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/index.js');
@@ -0,0 +1,66 @@
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 fs_extra_1 = __importDefault(require("fs-extra"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const cross_spawn_1 = __importDefault(require("cross-spawn"));
10
+ const execCommand = (cmd, cwd, args = []) => {
11
+ const result = cross_spawn_1.default.sync(cmd, args, {
12
+ cwd,
13
+ stdio: ['inherit', 'inherit'],
14
+ shell: true,
15
+ });
16
+ const stderrStr = result.stderr?.toString() || '';
17
+ if (result.status !== 0 ||
18
+ stderrStr.indexOf('UnhandledPromiseRejectionWarning') !== -1) {
19
+ throw new Error(`Error running: ${cmd}: ${stderrStr}`);
20
+ }
21
+ };
22
+ exports.default = async () => {
23
+ try {
24
+ const cwd = process.cwd();
25
+ const gridAppsPath = path_1.default.join(cwd, 'public', 'gridapps');
26
+ const gridSettingsPath = path_1.default.join(cwd, 'grid-settings');
27
+ if (!fs_extra_1.default.existsSync(gridSettingsPath)) {
28
+ throw new Error(`Grid settings not found: ${gridSettingsPath}`);
29
+ }
30
+ fs_extra_1.default.ensureDirSync(gridAppsPath);
31
+ console.log(`Created dir: ${gridAppsPath}`);
32
+ // eslint-disable-next-line
33
+ const { general: generalSettings } = require(gridSettingsPath);
34
+ // example release value: GridApp v1.1.0
35
+ const packageVersion = generalSettings.release.split('v')[1];
36
+ try {
37
+ // download pre-built version of app-container
38
+ fs_extra_1.default.mkdirSync(`${gridAppsPath}/app-container`);
39
+ execCommand(`curl https://app.omborigrid.com/app-container/${packageVersion}/app-container.tar | tar xf - -C app-container`, gridAppsPath);
40
+ }
41
+ catch (e) {
42
+ const packageNameProviderPart = `ga-${generalSettings.provider}`;
43
+ const packageName = `@ombori/${packageNameProviderPart}@<=${packageVersion}`;
44
+ console.log(`Downloading package: ${packageName}`);
45
+ execCommand(`npm pack "${packageName}"`, gridAppsPath);
46
+ execCommand(`tar xf ombori-${packageNameProviderPart}*.tgz && rm ombori-${packageNameProviderPart}*.tgz`, gridAppsPath);
47
+ console.log(`Building package: ${packageName}`);
48
+ execCommand(`yarn && yarn build`, path_1.default.join(gridAppsPath, 'package'));
49
+ execCommand(`rm -rf ${generalSettings.provider}`, gridAppsPath); // remove directory if exists
50
+ execCommand(`mv package/build ${generalSettings.provider}`, gridAppsPath);
51
+ execCommand(`rm -rf package`, gridAppsPath);
52
+ }
53
+ // copy all grid apps that were part of grid settings to output dir
54
+ const gridAppDirs = fs_extra_1.default
55
+ .readdirSync(gridSettingsPath)
56
+ .filter((file) => fs_extra_1.default.statSync(path_1.default.join(gridSettingsPath, file)).isDirectory());
57
+ console.log(`Found grid app directories: ${gridAppDirs}, will be copied to output dir`);
58
+ await Promise.all(gridAppDirs.map((dir) => fs_extra_1.default.copy(path_1.default.join(gridSettingsPath, dir), path_1.default.join(gridAppsPath, dir))));
59
+ console.log(chalk_1.default.green(`✓ Build apps successful`));
60
+ }
61
+ catch (err) {
62
+ console.error(chalk_1.default.red(`❗️There was an error: ${err.message}`));
63
+ throw err;
64
+ }
65
+ };
66
+ //# sourceMappingURL=build-apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-apps.js","sourceRoot":"","sources":["../../../src/commands/app/build-apps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
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.findArchs = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const child_process_1 = require("child_process");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const crypto_1 = __importDefault(require("crypto"));
12
+ const DEFAULT_REGISTRY = 'docker.io';
13
+ // Function to generate a random short unique ID
14
+ const generateShortId = () => {
15
+ return crypto_1.default.randomBytes(4).toString('hex');
16
+ };
17
+ const runRemoteCommand = async (deviceHostname, command, checkOutput = false) => {
18
+ return new Promise((resolve, reject) => {
19
+ let output = '';
20
+ const sshProcess = (0, child_process_1.spawn)('ssh', ['-tt', `dev@${deviceHostname}`, `TERM=xterm-256color ${command}`], {
21
+ stdio: checkOutput
22
+ ? ['inherit', 'pipe', 'inherit']
23
+ : ['inherit', 'inherit', 'inherit'],
24
+ });
25
+ if (checkOutput) {
26
+ sshProcess.stdout?.on('data', (data) => {
27
+ output += data.toString();
28
+ });
29
+ }
30
+ sshProcess.on('close', (code) => {
31
+ if (checkOutput) {
32
+ resolve(output.trim());
33
+ }
34
+ else {
35
+ resolve(code === 0);
36
+ }
37
+ });
38
+ sshProcess.on('error', (error) => {
39
+ console.error(chalk_1.default.red(`Failed to execute remote command: ${error.message}`));
40
+ reject(error);
41
+ });
42
+ });
43
+ };
44
+ const getSystemArch = async (deviceHostname) => {
45
+ const arch = (await runRemoteCommand(deviceHostname, 'uname -m', true));
46
+ // Map common architecture names to our standard names
47
+ switch (arch) {
48
+ case 'x86_64':
49
+ return 'amd64';
50
+ case 'aarch64':
51
+ return 'arm64';
52
+ default:
53
+ throw new Error(`Unsupported architecture: ${arch}`);
54
+ }
55
+ };
56
+ const findArchs = (dir, currentArch) => {
57
+ const result = {};
58
+ // Check for architecture-specific Dockerfile
59
+ const specificDockerfile = `Dockerfile.${currentArch}`;
60
+ const hasSpecificDockerfile = fs_1.default.existsSync(path_1.default.join(dir, specificDockerfile));
61
+ // Check for generic Dockerfile
62
+ const hasGenericDockerfile = fs_1.default.existsSync(path_1.default.join(dir, 'Dockerfile'));
63
+ if (!hasSpecificDockerfile && !hasGenericDockerfile) {
64
+ throw new Error(`No Dockerfile found for architecture ${currentArch}. ` +
65
+ `Expected either 'Dockerfile.${currentArch}' or 'Dockerfile'`);
66
+ }
67
+ // If we have a specific Dockerfile for this architecture, use it
68
+ if (hasSpecificDockerfile) {
69
+ result[currentArch] = specificDockerfile;
70
+ }
71
+ // Otherwise use the generic Dockerfile if it exists
72
+ else if (hasGenericDockerfile) {
73
+ result[currentArch] = 'Dockerfile';
74
+ }
75
+ return result;
76
+ };
77
+ exports.findArchs = findArchs;
78
+ async function build({ tag, dir, arch, dockerfile, deviceHostname, remoteDir, phygridLocalNpm = false, isInProjectsDir = false }) {
79
+ // Convert ~ to /home/dev for remote paths
80
+ const fullRemoteDir = remoteDir.replace('~', '/home/dev');
81
+ console.log(chalk_1.default.dim('Checking for yarn installation...'));
82
+ await runRemoteCommand(deviceHostname, 'which yarn || sudo npm install -g yarn');
83
+ console.log(chalk_1.default.dim('Installing dependencies...'));
84
+ await runRemoteCommand(deviceHostname, `cd ${fullRemoteDir} && yarn install`);
85
+ console.log(chalk_1.default.dim('Building application...'));
86
+ await runRemoteCommand(deviceHostname, `cd ${fullRemoteDir} && yarn devbuild`);
87
+ const platform = arch === 'arm64' ? 'linux/arm64/v8' : 'linux/amd64';
88
+ console.log(chalk_1.default.dim(`Building Docker container for ${platform}...`));
89
+ // Add the build arg for PHYGRID_LOCAL_NPM if enabled
90
+ const buildArgs = phygridLocalNpm
91
+ ? `--build-arg PHYGRID_LOCAL_NPM=true`
92
+ : '';
93
+ await runRemoteCommand(deviceHostname, `cd ${fullRemoteDir} && sudo docker buildx build ${buildArgs} --platform ${platform} --load --rm -f "${dockerfile}" -t ${tag} .`);
94
+ return true;
95
+ }
96
+ async function buildContainer({ name, version, registry, deviceHostname, remoteDir, customImageName, phygridLocalNpm = false, isInProjectsDir = false }) {
97
+ const currentArch = await getSystemArch(deviceHostname);
98
+ const archs = (0, exports.findArchs)(process.cwd(), currentArch);
99
+ console.log(chalk_1.default.dim(`Building ${chalk_1.default.blueBright(name)} for architecture ${chalk_1.default.greenBright(currentArch)}`));
100
+ // Use the custom image name if provided, otherwise construct it
101
+ const tag = customImageName || `${name}:${version}-${currentArch}`;
102
+ await build({
103
+ dir: process.cwd(),
104
+ tag,
105
+ arch: currentArch,
106
+ dockerfile: archs[currentArch],
107
+ deviceHostname,
108
+ remoteDir,
109
+ phygridLocalNpm,
110
+ isInProjectsDir
111
+ });
112
+ console.log(chalk_1.default.dim(`Build done ${tag}`));
113
+ return tag;
114
+ }
115
+ async function createLocalTwin(deviceHostname, image, createOptions) {
116
+ const twinConfig = {
117
+ type: 'Edge',
118
+ properties: {
119
+ desired: {
120
+ image,
121
+ createOptions,
122
+ },
123
+ },
124
+ };
125
+ const twinConfigJson = JSON.stringify(twinConfig).replace(/'/g, "\\'");
126
+ const command = `phyctl local create -t '${twinConfigJson}'`;
127
+ console.log(chalk_1.default.dim('Creating local twin...'));
128
+ await runRemoteCommand(deviceHostname, command);
129
+ }
130
+ exports.default = async (moduleName, { deviceHostname, remoteDir, phygridLocalNpm = false, isInProjectsDir = false }) => {
131
+ const cwd = process.cwd();
132
+ const packageFile = path_1.default.join(cwd, 'package.json');
133
+ const settingsFile = path_1.default.join(cwd, 'settings.json');
134
+ if (!fs_1.default.existsSync(packageFile)) {
135
+ throw new Error('Run this command from a module repository');
136
+ }
137
+ if (!fs_1.default.existsSync(settingsFile)) {
138
+ throw new Error('settings.json file is required');
139
+ }
140
+ const info = JSON.parse(fs_1.default.readFileSync(packageFile).toString());
141
+ const createOptions = JSON.parse(fs_1.default.readFileSync(settingsFile).toString());
142
+ const { name } = info;
143
+ const dockerCredentials = info['docker-credentials'];
144
+ const registry = dockerCredentials?.registry || info['container-registry'] || DEFAULT_REGISTRY;
145
+ const version = generateShortId();
146
+ // Check if a custom image name is specified in docker-credentials
147
+ let customImageName = null;
148
+ if (dockerCredentials?.image) {
149
+ customImageName = dockerCredentials.image;
150
+ console.log(chalk_1.default.dim(`Using custom image name from docker-credentials: ${chalk_1.default.blue(customImageName)}`));
151
+ }
152
+ // Log if using local phygrid-npm
153
+ if (phygridLocalNpm) {
154
+ console.log(chalk_1.default.cyan('Using local phygrid-npm packages for Docker build'));
155
+ }
156
+ console.log(chalk_1.default.dim(`Building ${name}...`));
157
+ const imageName = await buildContainer({
158
+ name,
159
+ version,
160
+ registry,
161
+ deviceHostname,
162
+ remoteDir,
163
+ customImageName,
164
+ phygridLocalNpm,
165
+ isInProjectsDir
166
+ });
167
+ // Create local twin with the built image
168
+ await createLocalTwin(deviceHostname, imageName, createOptions);
169
+ return imageName;
170
+ };
171
+ //# sourceMappingURL=build-container-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-container-remote.js","sourceRoot":"","sources":["../../../src/commands/app/build-container-remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,322 @@
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.findArchs = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const child_process_1 = __importDefault(require("child_process"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const docker_credentials_1 = require("../../utils/docker-credentials");
12
+ const registry_credentials_1 = require("../../utils/registry-credentials");
13
+ const DEFAULT_REGISTRY = 'docker.io';
14
+ const ALL_ARCHS = ['arm64', 'amd64'];
15
+ const findArchs = (dir, filter) => {
16
+ const result = fs_extra_1.default
17
+ .readdirSync(dir)
18
+ .filter((filename) => /^Dockerfile./.test(filename))
19
+ .reduce((res, filename) => {
20
+ const arch = filename.split('.').pop();
21
+ res[arch] = filename;
22
+ return res;
23
+ }, {});
24
+ // Check if more than one platform-specific Dockerfile is found
25
+ const hasGlobalDockerfile = fs_extra_1.default.existsSync(path_1.default.join(dir, 'Dockerfile'));
26
+ if (filter === 'all' && !hasGlobalDockerfile) {
27
+ const specificArchFiles = Object.keys(result);
28
+ if (specificArchFiles.length > 1) {
29
+ console.error(chalk_1.default.red('❌ Multiple architecture-specific Dockerfiles found. Multi-arch builds require a unified Dockerfile.'));
30
+ process.exit(1);
31
+ }
32
+ }
33
+ if (hasGlobalDockerfile) {
34
+ for (const arch of ALL_ARCHS) {
35
+ if (!result[arch]) {
36
+ result[arch] = 'Dockerfile';
37
+ }
38
+ }
39
+ console.log(chalk_1.default.dim('Using global Dockerfile for multi-arch build.'));
40
+ }
41
+ // Remove all filtered architectures
42
+ if (filter !== 'all') {
43
+ Object.keys(result)
44
+ .filter((arch) => arch !== filter)
45
+ .forEach((arch) => delete result[arch]);
46
+ }
47
+ return result;
48
+ };
49
+ exports.findArchs = findArchs;
50
+ function setupBuildxBuilder() {
51
+ const builderName = 'phygrid-multiplatform';
52
+ try {
53
+ // Check if our builder already exists
54
+ const result = child_process_1.default.execSync('docker buildx ls', { encoding: 'utf8' });
55
+ if (result.includes(builderName)) {
56
+ console.log(chalk_1.default.dim(`Using existing buildx builder: ${builderName}`));
57
+ // Make sure it's active
58
+ child_process_1.default.execSync(`docker buildx use ${builderName}`, { stdio: 'pipe' });
59
+ return;
60
+ }
61
+ }
62
+ catch (error) {
63
+ // Builder list failed, continue to create
64
+ }
65
+ console.log(chalk_1.default.dim('Setting up Docker buildx for multi-platform builds...'));
66
+ // Check if running in CI environment
67
+ const isCI = process.env.CI || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI;
68
+ if (isCI) {
69
+ console.log(chalk_1.default.dim('CI environment detected, setting up QEMU and buildx...'));
70
+ // Set up QEMU for cross-platform emulation
71
+ try {
72
+ console.log(chalk_1.default.dim('Setting up QEMU for cross-platform builds...'));
73
+ child_process_1.default.execSync('docker run --rm --privileged multiarch/qemu-user-static --reset -p yes', {
74
+ stdio: 'inherit',
75
+ });
76
+ console.log(chalk_1.default.green('✓ QEMU set up successfully'));
77
+ }
78
+ catch (error) {
79
+ console.log(chalk_1.default.yellow('Warning: QEMU setup failed, cross-platform builds may not work'));
80
+ }
81
+ }
82
+ // Create and use a new buildx builder instance
83
+ try {
84
+ console.log(chalk_1.default.dim(`Creating buildx builder: ${builderName}...`));
85
+ child_process_1.default.execSync(`docker buildx create --name ${builderName} --use --bootstrap`, {
86
+ stdio: 'inherit',
87
+ });
88
+ console.log(chalk_1.default.green(`✓ Buildx builder '${builderName}' created and activated`));
89
+ }
90
+ catch (error) {
91
+ console.log(chalk_1.default.yellow('Warning: Failed to create buildx builder, trying default...'));
92
+ // Try to use the default builder
93
+ try {
94
+ child_process_1.default.execSync('docker buildx use default', { stdio: 'pipe' });
95
+ }
96
+ catch (e) {
97
+ throw new Error('Failed to set up Docker buildx for multi-platform builds');
98
+ }
99
+ }
100
+ }
101
+ function build({ tag, dir, archs, dockerfiles, registry, pushCredentials, shouldPush = false }) {
102
+ // Extract base image name without version tag for cache-from
103
+ const baseImage = tag.split(':')[0];
104
+ const cacheImage = `${baseImage}:latest`;
105
+ // Check if latest tag exists in registry for caching
106
+ let cacheFromArg = '';
107
+ try {
108
+ child_process_1.default.execSync(`docker manifest inspect ${cacheImage}`, { stdio: 'pipe' });
109
+ cacheFromArg = `--cache-from=${cacheImage}`;
110
+ console.log(chalk_1.default.dim(`Using cache from: ${cacheImage}`));
111
+ }
112
+ catch (e) {
113
+ // Cache image doesn't exist, skip cache-from arg
114
+ console.log(chalk_1.default.dim(`No cache image found: ${cacheImage}`));
115
+ }
116
+ // Build platforms string for all architectures
117
+ const platforms = archs
118
+ .map((arch) => (arch === 'arm64' ? 'linux/arm64/v8' : 'linux/amd64'))
119
+ .join(',');
120
+ const platformArg = `--platform=${platforms}`;
121
+ // Use first Dockerfile in the list (should be the same for multiarch builds)
122
+ const dockerfile = dockerfiles[0];
123
+ // Check if building for multiple platforms
124
+ const isMultiPlatform = archs.length > 1;
125
+ // Set up buildx for multi-platform builds if needed
126
+ if (isMultiPlatform || shouldPush) {
127
+ setupBuildxBuilder();
128
+ }
129
+ // Determine output strategy
130
+ let outputArg = '';
131
+ let cmdExplanation = '';
132
+ if (shouldPush) {
133
+ // Push to registry for publish command
134
+ outputArg = '--push';
135
+ cmdExplanation = 'Pushing image to registry...';
136
+ // Login to Docker registry with push credentials (only needed when pushing)
137
+ if (pushCredentials && pushCredentials.username && pushCredentials.password) {
138
+ console.log(chalk_1.default.dim(`Logging in to registry ${registry} with push credentials...`));
139
+ try {
140
+ child_process_1.default.execSync(`docker login ${registry} -u ${pushCredentials.username} -p ${pushCredentials.password}`, { stdio: 'pipe' });
141
+ console.log(chalk_1.default.green('✓ Logged in to registry for pushing'));
142
+ }
143
+ catch (error) {
144
+ console.error(chalk_1.default.red(`Failed to login to registry: ${error.message}`));
145
+ // Continue with build as Docker might use cached credentials
146
+ }
147
+ }
148
+ }
149
+ else if (isMultiPlatform) {
150
+ // Multi-platform builds cannot be loaded into daemon
151
+ console.log(chalk_1.default.yellow('⚠️ Multi-platform builds cannot be loaded into Docker daemon'));
152
+ console.log(chalk_1.default.yellow(' Build will be skipped. Use "yarn publish" to build and push multi-platform images'));
153
+ return true;
154
+ }
155
+ else {
156
+ // Single platform: load into daemon
157
+ outputArg = '--load';
158
+ cmdExplanation = 'Loading image into Docker daemon...';
159
+ console.log(chalk_1.default.dim(cmdExplanation));
160
+ }
161
+ // When pushing, also tag as latest for better cache hits on subsequent builds
162
+ const baseImageName = tag.split(':')[0];
163
+ const versionTag = tag.split(':')[1] || 'latest';
164
+ const latestTag = `${baseImageName}:latest`;
165
+ const tagsArg = shouldPush ? `-t ${tag} -t ${latestTag}` : `-t ${tag}`;
166
+ const buildCmd = `docker buildx build ${platformArg} ${cacheFromArg} --build-arg BUILDKIT_INLINE_CACHE=1 ${outputArg} --rm -f "${dir}/${dockerfile}" ${tagsArg} "${dir}"`;
167
+ console.log(`$ ${buildCmd}`);
168
+ child_process_1.default.execSync(buildCmd, {
169
+ stdio: 'inherit',
170
+ });
171
+ if (shouldPush) {
172
+ console.log(chalk_1.default.green(`✓ Image pushed to registry (tagged as ${versionTag} and latest)`));
173
+ }
174
+ else {
175
+ console.log(chalk_1.default.green(`✓ Image loaded into Docker daemon`));
176
+ }
177
+ return true;
178
+ }
179
+ async function buildModule({ name, version, registry, arch: selectedArch = 'all', customImageName = null, pushCredentials = null, shouldPush = false, }) {
180
+ const dir = process.cwd();
181
+ const archsMap = (0, exports.findArchs)(dir, selectedArch);
182
+ const archs = Object.keys(archsMap);
183
+ const dockerfiles = archs.map((arch) => archsMap[arch] || 'Dockerfile');
184
+ // If there are platform-specific Dockerfiles and no global Dockerfile,
185
+ // only use the architectures for which we have specific Dockerfiles
186
+ const hasGlobalDockerfile = fs_extra_1.default.existsSync(path_1.default.join(dir, 'Dockerfile'));
187
+ const hasSpecificDockerfiles = archs.some((arch) => archsMap[arch] !== 'Dockerfile');
188
+ let archsToBuild = archs;
189
+ if (hasSpecificDockerfiles && !hasGlobalDockerfile) {
190
+ // Only build for architectures that have specific Dockerfiles
191
+ archsToBuild = archs.filter((arch) => archsMap[arch] !== 'Dockerfile');
192
+ console.log(chalk_1.default.dim(`Found platform-specific Dockerfiles, building only for: ${chalk_1.default.greenBright(archsToBuild.join(' '))}`));
193
+ }
194
+ console.log(chalk_1.default.dim(`Building ${chalk_1.default.blueBright(name)} for architectures ${chalk_1.default.greenBright(archsToBuild.join(' '))}`));
195
+ // Use the custom image name if provided, otherwise construct it
196
+ // Ensure the tag always has a version
197
+ let tag;
198
+ if (customImageName) {
199
+ // Check if customImageName already has a version tag
200
+ if (customImageName.includes(':')) {
201
+ tag = customImageName;
202
+ }
203
+ else {
204
+ // Add version tag if missing
205
+ tag = `${customImageName}:${version}`;
206
+ }
207
+ }
208
+ else {
209
+ tag = `${registry}/${name}:${version}`;
210
+ }
211
+ console.log(chalk_1.default.dim(`Using image tag: ${chalk_1.default.blue(tag)}`));
212
+ // Check if all Dockerfiles are the same
213
+ const uniqueDockerfiles = new Set(archsToBuild.map((arch) => archsMap[arch]));
214
+ if (uniqueDockerfiles.size > 1) {
215
+ console.error(chalk_1.default.red('❌ Different Dockerfiles found for architectures. Multi-arch builds require a unified Dockerfile.'));
216
+ process.exit(1);
217
+ }
218
+ // Build all architectures in a single command
219
+ build({
220
+ dir,
221
+ tag,
222
+ archs: archsToBuild,
223
+ dockerfiles: archsToBuild.map((arch) => archsMap[arch]),
224
+ registry,
225
+ pushCredentials,
226
+ shouldPush,
227
+ });
228
+ console.log(chalk_1.default.dim('Build done'));
229
+ }
230
+ exports.default = async (moduleName, options = {}) => {
231
+ const { arch, shouldPush = false } = options;
232
+ const cwd = process.cwd();
233
+ const packageFile = path_1.default.join(cwd, 'package.json');
234
+ if (!fs_extra_1.default.existsSync(packageFile))
235
+ throw new Error('Run this command from a module repository');
236
+ const info = JSON.parse(fs_extra_1.default.readFileSync(packageFile).toString());
237
+ let { name, version } = info;
238
+ const dockerCredentials = info['docker-credentials'];
239
+ const registry = dockerCredentials?.registry || info['container-registry'] || DEFAULT_REGISTRY;
240
+ // Check if a custom image name is specified in docker-credentials
241
+ let customImageName = null;
242
+ if (dockerCredentials?.image) {
243
+ customImageName = dockerCredentials.image;
244
+ console.log(chalk_1.default.dim(`Using custom image name from docker-credentials: ${chalk_1.default.blue(customImageName)}`));
245
+ }
246
+ if (moduleName) {
247
+ const [modName, modVersion] = moduleName.split('@');
248
+ name = modName || name;
249
+ version = modVersion || version;
250
+ }
251
+ // Set up Docker registry authentication based on whether we're pushing
252
+ let pushCredentials = null;
253
+ if (shouldPush) {
254
+ // Only authenticate with registry when pushing
255
+ // First check environment variables
256
+ const envPushUsername = process.env.PHYGRID_REGISTRY_PUSH_USERNAME;
257
+ const envPushPassword = process.env.PHYGRID_REGISTRY_PUSH_PASSWORD;
258
+ if (envPushUsername && envPushPassword) {
259
+ console.log(chalk_1.default.dim('Using push credentials from environment variables'));
260
+ pushCredentials = {
261
+ username: envPushUsername,
262
+ password: envPushPassword,
263
+ };
264
+ }
265
+ else {
266
+ // Check if credentials exist in registry credentials store
267
+ const storedCredentials = await (0, registry_credentials_1.getRegistryCredentials)(registry);
268
+ // If stored credentials exist, use them
269
+ if (storedCredentials &&
270
+ storedCredentials.push &&
271
+ storedCredentials.push.username &&
272
+ storedCredentials.push.password) {
273
+ console.log(chalk_1.default.dim('Using stored push credentials'));
274
+ pushCredentials = {
275
+ username: storedCredentials.push.username,
276
+ password: storedCredentials.push.password,
277
+ };
278
+ }
279
+ else {
280
+ // If no stored credentials, verify new ones
281
+ console.log(chalk_1.default.dim('No stored credentials found. Verifying Docker registry credentials...'));
282
+ const verifiedCredentials = await (0, docker_credentials_1.setupDockerCredentials)(registry, name, packageFile, customImageName);
283
+ pushCredentials = {
284
+ username: verifiedCredentials.pushUsername,
285
+ password: verifiedCredentials.pushPassword,
286
+ };
287
+ }
288
+ }
289
+ }
290
+ // If a custom image name is provided, use it directly
291
+ if (customImageName) {
292
+ // Extract name and version from the custom image
293
+ const parts = customImageName.split(':');
294
+ const customTag = parts.length > 1 ? parts[1] : version;
295
+ const customName = parts[0].split('/').pop();
296
+ // Ensure the custom image name has a version tag
297
+ if (!customImageName.includes(':')) {
298
+ customImageName = `${customImageName}:${version}`;
299
+ console.log(chalk_1.default.dim(`Adding version tag to custom image name: ${chalk_1.default.blue(customImageName)}`));
300
+ }
301
+ await buildModule({
302
+ name: customName,
303
+ version: customTag,
304
+ registry,
305
+ arch,
306
+ customImageName,
307
+ pushCredentials,
308
+ shouldPush,
309
+ });
310
+ }
311
+ else {
312
+ await buildModule({
313
+ name,
314
+ version,
315
+ registry,
316
+ arch,
317
+ pushCredentials,
318
+ shouldPush,
319
+ });
320
+ }
321
+ };
322
+ //# sourceMappingURL=build-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-container.js","sourceRoot":"","sources":["../../../src/commands/app/build-container.ts"],"names":[],"mappings":"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"}