Compare commits

...

76 Commits

Author SHA1 Message Date
3f9288e9d3 v22.1.1 2025-06-19 09:32:56 +00:00
0efa745628 Merge pull request #2957 from balena-io/truncate-error-message
Deploy: Limit the submitted error_message of images that fail to build to 300K characters
2025-06-19 09:31:58 +00:00
bddad252f7 Deploy: Limit the submitted error_message of images that fail to build to 1000 characters
Change-type: patch
See: https://balena.fibery.io/Work/Project/re-pitching-API-Limit-size-of-large-fields-975
2025-06-19 11:28:38 +03:00
a1a0e4f028 Deduplicate dependencies 2025-06-17 23:47:57 +03:00
de74baa2ff v22.1.0 2025-06-09 20:05:12 +00:00
6c12f755c5 Merge pull request #2955 from balena-io/node-22
Node 22
2025-06-09 17:04:26 -03:00
f80b8e63b1 Add support for node 22
Change-type: minor
2025-06-07 11:14:48 -03:00
b32514f5af Bump etcher-sdk to v10.0.0
Update balena-device-init from 8.1.3 to 8.1.1
Update etcher-sdk from 9.1.4 to 10.0.0
Update resin-cli-form from 3.0.0 to 4.0.0
Update resin-cli-visuals from 2.0.1 to 3.0.0

Change-type: patch
2025-06-07 11:13:55 -03:00
935f8d2549 v22.0.6 2025-06-02 12:27:13 +00:00
b2de857ef1 Merge pull request #2952 from balena-io/remove-request
Remove request
2025-06-02 08:26:26 -04:00
78f1471bf4 Deduplicate dependencies 2025-05-30 08:23:23 -04:00
d47abf072d Remove request dependency
Change-type: patch
2025-05-30 08:16:08 -04:00
8502c4db4b Replace request usage with got
Change-type: patch
2025-05-30 08:16:08 -04:00
dd2c5c40d7 v22.0.5 2025-05-29 15:47:35 +00:00
d23b253ac5 Merge pull request #2951 from balena-io/bump-etcher-sdk
Bump etcher-sdk to v9.1.4
2025-05-29 12:46:43 -03:00
0b0e24c9b2 Bump etcher-sdk to v9.1.4
Update etcher-sdk from 9.1.0 to 9.1.4

Change-type: patch
2025-05-29 10:54:45 -03:00
f9656cbe91 v22.0.4 2025-05-29 13:19:04 +00:00
e174f7db4c Merge pull request #2949 from balena-io/use-got-instead-of-request-legacy-deploy
Use got instead of request legacy deploy
2025-05-29 13:18:10 +00:00
a7a408a5c7 tests: Replace request with got
Change-type: patch
2025-05-29 09:35:57 -03:00
e5877c7de9 deploy-legacy: Replace request with got
Change-type: patch
2025-05-29 09:35:57 -03:00
ecb8b3ae6b v22.0.3 2025-05-29 12:09:59 +00:00
fd20516f69 Merge pull request #2950 from balena-io/bump-sentry-v9
Bump sentry to v9
2025-05-29 12:09:11 +00:00
5ccee0e4f1 Bump sentry to v9
Change-type: patch
2025-05-28 20:29:40 -03:00
7bb13a551c v22.0.2 2025-05-28 19:32:18 +00:00
19d287aefc Merge pull request #2948 from balena-io/build-nologs
fix: allow balena build to work with --nologs
2025-05-28 16:31:28 -03:00
8d10c1af2a Fix balena build to work with --nologs
Change-type: patch
2025-05-28 15:36:56 -03:00
ebfabdba6a v22.0.1 2025-05-28 17:00:48 +00:00
b0cbe43708 Merge pull request #2947 from balena-io/nock-14
Update `nock` to 14.0.4 & Move DeviceAPI off `request`
2025-05-28 13:59:58 -03:00
b7f1469912 Deduplicate dependencies 2025-05-28 12:08:37 -04:00
3396ba5a97 DeviceAPI: Move away from request in favor of BalenaSdk request
Change-type: patch
2025-05-28 12:08:37 -04:00
78ffff83bc Update nock to 14.0.4
Change-type: patch
2025-05-28 08:35:40 -04:00
ae13d584a3 v22.0.0 2025-05-26 13:53:39 +00:00
14f12d17eb Merge pull request #2912 from balena-io/native-build-2
Build standalone without pkg
2025-05-26 10:52:55 -03:00
45eb0ad4b1 Add migration guide to v22
Change-type: patch
2025-05-24 08:17:07 -03:00
21fd8a3307 Build standalone without pkg
Change-type: major
2025-05-23 18:52:51 -03:00
b545bd00ad v21.1.14 2025-05-21 15:39:23 +00:00
3eda7938f9 Merge pull request #2946 from balena-io/bump-balena-preload-2
Bump balena-preload to 18.0.4
2025-05-21 12:38:05 -03:00
2bccabfc38 Bump balena-preload to 18.0.4
Update balena-preload from 18.0.3 to 18.0.4

Change-type: patch
2025-05-21 11:41:07 -03:00
1b42d08567 v21.1.13 2025-05-21 13:46:34 +00:00
55b69be987 Merge pull request #2944 from balena-io/bump-balena-preload
Bump balena-preload to 18.0.3
2025-05-21 13:45:38 +00:00
7c8ce1b1a9 Bump balena-preload to 18.0.3
Update balena-preload from 18.0.1 to 18.0.3

Change-type: patch
2025-05-21 09:58:51 -03:00
31ddacec4c v21.1.12 2025-05-16 18:54:51 +00:00
dad26328b9 Merge pull request #2935 from balena-io/fix-build-secrets-serialization
Fix build secrets serialization
2025-05-16 14:54:04 -04:00
98197eef47 Dedupe dependencies 2025-05-15 19:13:36 -04:00
0f8ce47ec6 Update @balena/compose dependency to fix error with build secrets.
See https://github.com/balena-io-modules/balena-compose/pull/79

Change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
2025-05-15 19:03:04 -04:00
33d3be326a v21.1.11 2025-05-06 15:25:00 +00:00
3eb397de1b Merge pull request #2611 from balena-io/lmb/fix-typos
Fix typos in the help messages
2025-05-06 15:24:01 +00:00
457b81a597 Deduplicate dependencies 2025-05-06 10:57:39 -04:00
8eb1777437 Fix typos in os configure and config generate help messages
Change-type: patch
2025-05-06 09:08:01 -04:00
bbc08dcfc5 v21.1.10 2025-05-05 17:13:26 +00:00
48cee061f4 Merge pull request #2937 from balena-io/fix-windows-signing
patch: fix windows signing
2025-05-05 17:12:40 +00:00
37e96e5d67 patch: fix windows signing 2025-05-05 13:38:05 -03:00
a5c865b7f9 v21.1.9 2025-04-07 12:53:22 +00:00
3fb3dd5819 Merge pull request #2929 from balena-io/update-balena-config-json
Update balena-config-json to rely on the balena-image-fs helpers
2025-04-07 15:52:21 +03:00
daf5c518fb Deduplicate dependencies 2025-04-04 10:38:24 +03:00
4fcedd0607 Update balena-config-json to rely on the balena-image-fs helpers
Update balena-config-json from 4.2.2 to 4.2.7
Update balena-image-fs from 7.5.0 to 7.5.2

Change-type: patch
2025-04-04 10:23:39 +03:00
42d9cbb48d v21.1.8 2025-04-03 16:10:05 +00:00
408efa91c1 Merge pull request #2933 from balena-io/renovate/actions-download-artifact-4.1.x
Update actions/download-artifact action to v4.1.9
2025-04-03 16:09:08 +00:00
a2209ffe56 Update actions/download-artifact action to v4.1.9
Update actions/download-artifact from 4.1.8 to 4.1.9

Change-type: patch
2025-04-03 15:50:05 +00:00
3f27db811b v21.1.7 2025-04-03 15:12:16 +00:00
839a3050fb Merge pull request #2932 from balena-io/renovate/actions-upload-artifact-digest
Update actions/upload-artifact digest to ea165f8
2025-04-03 15:11:18 +00:00
c8ea9cfcdb Update actions/upload-artifact digest to ea165f8
Update actions/upload-artifact

Change-type: patch
2025-04-03 14:50:26 +00:00
776115ef5d v21.1.6 2025-04-03 14:12:08 +00:00
f031ec1dea Merge pull request #2931 from balena-io/renovate/actions-setup-node-digest
Update actions/setup-node digest to cdca736
2025-04-03 14:11:10 +00:00
fe42438090 Update actions/setup-node digest to cdca736
Update actions/setup-node

Change-type: patch
2025-04-03 13:50:06 +00:00
b616fbdd79 v21.1.5 2025-04-03 13:28:12 +00:00
81edfbbae1 Merge pull request #2930 from balena-io/bump_dockerode_cachefrom
Update dockerode/docker-modem dependencies for cachefrom fix
2025-04-03 09:27:11 -04:00
663e83c3b8 Dedupe dependencies 2025-04-02 18:50:31 -04:00
b650f8ff6d Update dockerode/docker-modem dependencies for fixes
Change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
2025-04-02 18:47:43 -04:00
58234f17e1 v21.1.4 2025-04-02 09:16:30 +00:00
77905f4a74 Merge pull request #2928 from balena-io/comment_sig_file
Add comment with example of signature file in a flasher image
2025-04-02 09:15:23 +00:00
30076fabe6 Dedupe dependencies 2025-04-01 18:25:20 -04:00
28703bb5ae Add comment with secure boot signature file example for preload
Change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
2025-04-01 18:25:16 -04:00
37b3c6abe9 v21.1.3 2025-03-28 16:57:03 +00:00
b4e473e4d4 Merge pull request #2927 from balena-io/fix-ob-device-detail
Fix device detail for open balena
2025-03-28 16:55:56 +00:00
0d4e411777 Fix device detail for open balena
Change-type: patch
2025-03-28 13:29:52 -03:00
54 changed files with 2772 additions and 4974 deletions

View File

@ -67,7 +67,7 @@ fixed it.
- **Cloud backend: openBalena or balenaCloud?** If unsure, it will be balenaCloud - **Cloud backend: openBalena or balenaCloud?** If unsure, it will be balenaCloud
- **Operating system version:** e.g. Windows 10, Ubuntu 18.04, macOS 10.14.5 - **Operating system version:** e.g. Windows 10, Ubuntu 18.04, macOS 10.14.5
- **32/64 bit OS and processor:** e.g. 32-bit Windows on 64-bit Intel processor - **32/64 bit OS and processor:** e.g. 32-bit Windows on 64-bit Intel processor
- **Install method:** npm or zip package or executable installer - **Install method:** npm or standalone package or executable installer
- **If npm install, Node.js and npm version:** e.g. Node v8.16.0 and npm v6.4.1 - **If npm install, Node.js and npm version:** e.g. Node v8.16.0 and npm v6.4.1
# Additional References # Additional References

View File

@ -18,7 +18,7 @@ inputs:
default: 'accounts+apple@balena.io' default: 'accounts+apple@balena.io'
NODE_VERSION: NODE_VERSION:
type: string type: string
default: '20.x' default: '22.x'
VERBOSE: VERBOSE:
type: string type: string
default: 'true' default: 'true'
@ -28,7 +28,7 @@ runs:
using: 'composite' using: 'composite'
steps: steps:
- name: Download custom source artifact - name: Download custom source artifact
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
with: with:
name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }} name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}
path: ${{ runner.temp }} path: ${{ runner.temp }}
@ -39,7 +39,7 @@ runs:
run: tar -xf ${{ runner.temp }}/custom.tgz run: tar -xf ${{ runner.temp }}/custom.tgz
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4 uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with: with:
node-version: ${{ inputs.NODE_VERSION }} node-version: ${{ inputs.NODE_VERSION }}
cache: npm cache: npm
@ -48,7 +48,7 @@ runs:
if: runner.os == 'macOS' if: runner.os == 'macOS'
uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4 uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4
with: with:
python-version: "3.11" python-version: '3.11'
- name: Install additional tools - name: Install additional tools
if: runner.os == 'Windows' if: runner.os == 'Windows'
@ -112,8 +112,8 @@ runs:
PATH="/c/Program Files/DigiCert/DigiCert One Signing Manager Tools:${PATH}" PATH="/c/Program Files/DigiCert/DigiCert One Signing Manager Tools:${PATH}"
smksp_registrar.exe list smksp_registrar.exe list
smctl.exe keypair ls smctl.exe keypair ls
smctl.exe windows certsync
/c/Windows/System32/certutil.exe -csp "DigiCert Signing Manager KSP" -key -user /c/Windows/System32/certutil.exe -csp "DigiCert Signing Manager KSP" -key -user
smksp_cert_sync.exe
# (signtool.exe) https://github.com/actions/runner-images/blob/main/images/win/Windows2019-Readme.md#installed-windows-sdks # (signtool.exe) https://github.com/actions/runner-images/blob/main/images/win/Windows2019-Readme.md#installed-windows-sdks
PATH="/c/Program Files (x86)/Windows Kits/10/bin/${runner_arch}:${PATH}" PATH="/c/Program Files (x86)/Windows Kits/10/bin/${runner_arch}:${PATH}"
@ -135,9 +135,11 @@ runs:
XCODE_APP_LOADER_TEAM_ID: ${{ inputs.XCODE_APP_LOADER_TEAM_ID }} XCODE_APP_LOADER_TEAM_ID: ${{ inputs.XCODE_APP_LOADER_TEAM_ID }}
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with: with:
name: gh-release-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ strategy.job-index }} name: gh-release-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ strategy.job-index }}
path: dist path: |
dist
!dist/balena
retention-days: 1 retention-days: 1
if-no-files-found: error if-no-files-found: error

View File

@ -15,7 +15,7 @@ inputs:
# --- custom environment # --- custom environment
NODE_VERSION: NODE_VERSION:
type: string type: string
default: '20.x' default: '22.x'
VERBOSE: VERBOSE:
type: string type: string
default: "true" default: "true"
@ -26,7 +26,7 @@ runs:
steps: steps:
# https://github.com/actions/setup-node#caching-global-packages-data # https://github.com/actions/setup-node#caching-global-packages-data
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4 uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with: with:
node-version: ${{ inputs.NODE_VERSION }} node-version: ${{ inputs.NODE_VERSION }}
cache: npm cache: npm
@ -58,7 +58,7 @@ runs:
run: tar --exclude-vcs -acf ${{ runner.temp }}/custom.tgz . run: tar --exclude-vcs -acf ${{ runner.temp }}/custom.tgz .
- name: Upload custom artifact - name: Upload custom artifact
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with: with:
name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }} name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}
path: ${{ runner.temp }}/custom.tgz path: ${{ runner.temp }}/custom.tgz

View File

@ -2,7 +2,7 @@ module.exports = {
reporter: 'spec', reporter: 'spec',
require: 'ts-node/register/transpile-only', require: 'ts-node/register/transpile-only',
file: './tests/config-tests', file: './tests/config-tests',
timeout: 12000, timeout: 48000,
// To test only, say, 'push.spec.ts', do it as follows so that // To test only, say, 'push.spec.ts', do it as follows so that
// requests are authenticated: // requests are authenticated:
// spec: ['tests/auth/*.spec.ts', 'tests/**/deploy.spec.ts'], // spec: ['tests/auth/*.spec.ts', 'tests/**/deploy.spec.ts'],

View File

@ -1,3 +1,584 @@
- commits:
- subject: "Deploy: Limit the submitted error_message of images that fail to build
to 1000 characters"
hash: bddad252f7cb412a3d417be1d7bd7e4ed9726b8e
body: ""
footer:
Change-type: patch
change-type: patch
See: https://balena.fibery.io/Work/Project/re-pitching-API-Limit-size-of-large-fields-975
see: https://balena.fibery.io/Work/Project/re-pitching-API-Limit-size-of-large-fields-975
author: Thodoris Greasidis
nested: []
version: 22.1.1
title: ""
date: 2025-06-19T09:32:52.976Z
- commits:
- subject: Add support for node 22
hash: f80b8e63b1e5b22dd95b034fe14da0a7e3ab4986
body: ""
footer:
Change-type: minor
change-type: minor
author: Otavio Jacobi
nested: []
- subject: Bump etcher-sdk to v10.0.0
hash: b32514f5afb4fdd12e4a9dca5e2a1d53e727b434
body: |
Update balena-device-init from 8.1.3 to 8.1.1
Update etcher-sdk from 9.1.4 to 10.0.0
Update resin-cli-form from 3.0.0 to 4.0.0
Update resin-cli-visuals from 2.0.1 to 3.0.0
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested:
- commits:
- subject: Drop support to node18 and add support to node 22 & 24
hash: 95e577823f642a6c0e500aa29fc150b7807d84f7
body: ""
footer:
Change-type: major
change-type: major
author: Otavio Jacobi
nested: []
version: etcher-sdk-10.0.0
title: ""
date: 2025-06-02T09:12:32.868Z
version: 22.1.0
title: ""
date: 2025-06-09T20:05:08.020Z
- commits:
- subject: Remove `request` dependency
hash: d47abf072ddf1f6529f3d4a14e07436def58df61
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Replace `request` usage with `got`
hash: 8502c4db4bb211a70c682dbc1b85df56f01f2d93
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 22.0.6
title: ""
date: 2025-06-02T12:27:11.068Z
- commits:
- subject: Bump etcher-sdk to v9.1.4
hash: 0b0e24c9b29ef4bcb6a577ca85708171cc2421c7
body: |
Update etcher-sdk from 9.1.0 to 9.1.4
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested:
- commits:
- subject: Run `npm audit fix` which should only do non-breaking changes
hash: 22aaacc0744e41989706c968c4efc8767d30b7a8
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: etcher-sdk-9.1.4
title: ""
date: 2025-05-29T08:57:28.785Z
- commits:
- subject: Embed config.json with a fixed timestamp to enable consistent checksums
hash: 83e67a4089ec39023c39fe79fe59021237797c85
body: >
Previously the timestamp was changing each time which meant the
checksum would be different every time even if the rest of the
contents
were identical. Changing this to a fixed timestamp avoids that
change
such that only the contents matter.
footer:
Change-type: patch
change-type: patch
author: Pagan Gazzard
nested: []
version: etcher-sdk-9.1.3
title: ""
date: 2025-02-17T12:48:33.911Z
- commits:
- subject: Update dependency unzip-stream to v0.3.2 [SECURITY]
hash: c243e56e4189bee7391943a3325a3c1465c62fd1
body: |
Update unzip-stream from 0.3.1 to 0.3.2
footer:
Change-type: patch
change-type: patch
author: Self-hosted Renovate Bot
nested: []
version: etcher-sdk-9.1.2
title: ""
date: 2024-10-09T08:52:13.524Z
- commits:
- subject: "patch: add EXLOCK flag for windows"
hash: 915feeeceff83249f87a6a0a1656986791206136
body: |
Signed-off-by: Talha Can Havadar <havadartalha@gmail.com>
run prettier for changed files
footer:
Signed-off-by: Talha Can Havadar <havadartalha@gmail.com>
signed-off-by: Talha Can Havadar <havadartalha@gmail.com>
author: Talha Can Havadar
nested: []
version: etcher-sdk-9.1.1
title: ""
date: 2024-10-09T08:24:06.706Z
version: 22.0.5
title: ""
date: 2025-05-29T15:47:31.891Z
- commits:
- subject: "tests: Replace request with got"
hash: a7a408a5c7dcf06b770e8df85e250bfed5a09f75
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
- subject: "deploy-legacy: Replace request with got"
hash: e5877c7de917e377082328ee8ab0b502593c9719
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: 22.0.4
title: ""
date: 2025-05-29T13:19:01.228Z
- commits:
- subject: Bump sentry to v9
hash: 5ccee0e4f1ce3bae6963630963cbd72c9c738f77
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: 22.0.3
title: ""
date: 2025-05-29T12:09:56.743Z
- commits:
- subject: Fix balena build to work with --nologs
hash: 8d10c1af2a8eddfa146e2d23161c079127eb5546
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: 22.0.2
title: ""
date: 2025-05-28T19:32:15.230Z
- commits:
- subject: "DeviceAPI: Move away from `request` in favor of BalenaSdk request"
hash: 3396ba5a971d2ae16552576d65dff953031f01ee
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
- subject: Update `nock` to 14.0.4
hash: 78ffff83bca1d87dff19909d39d3d18815754a0e
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 22.0.1
title: ""
date: 2025-05-28T17:00:45.889Z
- commits:
- subject: Add migration guide to v22
hash: 45eb0ad4b145d1eed2c30bcd1f9bc9e1a9a2d719
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
- subject: Build standalone without pkg
hash: 21fd8a3307e2e7efd63b1ea261b2ff9f579e8370
body: ""
footer:
Change-type: major
change-type: major
author: Otavio Jacobi
nested: []
version: 22.0.0
title: ""
date: 2025-05-26T13:53:36.409Z
- commits:
- subject: Bump balena-preload to 18.0.4
hash: 2bccabfc38f887e2d4fcbcbe87b25a03d38e75c3
body: |
Update balena-preload from 18.0.3 to 18.0.4
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested:
- commits:
- subject: Fix balena-preload pip deps
hash: edd39729cfdc630c95ee4b5c1dffdba3b459224d
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: balena-preload-18.0.4
title: ""
date: 2025-05-21T14:25:07.587Z
version: 21.1.14
title: ""
date: 2025-05-21T15:39:18.832Z
- commits:
- subject: Bump balena-preload to 18.0.3
hash: 7c8ce1b1a93420c126e88b98d64366b1affaa439
body: |
Update balena-preload from 18.0.1 to 18.0.3
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested:
- commits:
- subject: Update dependency sh to v1.14.3
hash: a1ad075baee7833286d10466683e0ccba6d4a6a1
body: |
Update sh from 1.12.14 to 1.14.3
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: balena-preload-18.0.3
title: ""
date: 2025-03-19T16:54:44.864Z
- commits:
- subject: Update alpine Docker tag to v3.21
hash: 61081cd3caab334a91a09822144fe4a5be3a47ca
body: |
Update alpine from 3.12 to 3.21
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: balena-preload-18.0.2
title: ""
date: 2025-03-19T15:55:26.306Z
version: 21.1.13
title: ""
date: 2025-05-21T13:46:30.149Z
- commits:
- subject: Update @balena/compose dependency to fix error with build secrets.
hash: 0f8ce47ec6523e447315bc9103267371fd028bf4
body: |
See https://github.com/balena-io-modules/balena-compose/pull/79
footer:
Change-type: patch
change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
signed-off-by: Ken Bannister <kb2ma@runbox.com>
author: Ken Bannister
nested: []
version: 21.1.12
title: ""
date: 2025-05-16T18:54:49.177Z
- commits:
- subject: Fix typos in `os configure` and `config generate` help messages
hash: 8eb1777437aa4c34c437ebbf81c2cf0dee0cc460
body: ""
footer:
Change-type: patch
change-type: patch
author: myarmolinsky
nested: []
version: 21.1.11
title: ""
date: 2025-05-06T15:24:58.111Z
- commits:
- subject: "patch: fix windows signing"
hash: 37e96e5d670d466910ad7164d5b26faf1ef41df7
body: ""
footer: {}
author: Edwin Joassart
nested: []
version: 21.1.10
title: ""
date: 2025-05-05T17:13:23.657Z
- commits:
- subject: Update balena-config-json to rely on the balena-image-fs helpers
hash: 4fcedd0607624ddbd26917e3be5fcbd39d96d2f6
body: |
Update balena-config-json from 4.2.2 to 4.2.7
Update balena-image-fs from 7.5.0 to 7.5.2
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested:
- commits:
- subject: Fix getBootPartition always warning that the boot partitions were not
found
hash: d91290d9c4b502652c50a34482ff68448eb0a4c2
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-config-json-4.2.7
title: ""
date: 2025-04-02T14:14:31.495Z
- commits:
- subject: "write: Allow undefined as a value for the deprecated type parameter"
hash: 9d5a44175e7f46f2f3963d794d48d3de8f49300f
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: Use the balena-image-fs findPartition() helper to find the boot
partition
hash: 49282ed9bd121d89c8d6fee5095917876cd6f501
body: |
Update balena-image-fs from 7.4.0 to 7.5.0
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested:
- commits:
- subject: Add function to find a partition by name/label
hash: 4e9b1cfb2739b738dd12bda7d1623e08ad208b46
body: ""
footer:
Change-type: minor
change-type: minor
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
signed-off-by: Ken Bannister <kb2ma@runbox.com>
author: Ken Bannister
nested: []
version: balena-image-fs-7.5.0
title: ""
date: 2025-03-26T12:35:30.365Z
- commits:
- subject: bump ext2fs to 4.2.4
hash: 300cc6d5cdd12ce0c47986efe98702511a03f4a5
body: ""
footer:
Change-type: patch
change-type: patch
Signed-off-by: Ryan Cooke<ryan@balena.io>
signed-off-by: Ryan Cooke<ryan@balena.io>
author: Ryan Cooke
nested: []
version: balena-image-fs-7.4.1
title: ""
date: 2025-02-21T10:21:04.380Z
version: balena-config-json-4.2.6
title: ""
date: 2025-04-01T01:09:16.169Z
- commits:
- subject: Update @balena/lint to 9.1.4
hash: 0ff1aa1ed8803b622948214493e1f9ec88cfe910
body: |
Update @balena/lint from 6.2.2 to 9.1.4
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-config-json-4.2.5
title: ""
date: 2025-03-26T11:41:52.400Z
- commits:
- subject: Switch use ts-mocha instead of manually compiling the tests
hash: c6e46d393d8670781cf9f94512e8ef05a4236111
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: Update TypeScript to 5.8.2
hash: b8a8183bc14c24a63f5bc5dd60d8906f6d97a00d
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-config-json-4.2.4
title: ""
date: 2025-03-26T09:09:13.516Z
- commits:
- subject: Update chai to v5
hash: 7fe83ffc781eb66ac3535749f7fdf56d458eb959
body: |
Update @types/chai from 4.3.20 to 5.2.0
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: balena-config-json-4.2.3
title: ""
date: 2025-03-26T08:40:58.555Z
- commits:
- subject: Update dependency jsdoc-to-markdown to v9
hash: f22a0a1dae022035e5357c147f681f8b7c703fe3
body: |
Update jsdoc-to-markdown from 8.0.3 to 9.1.1
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: balena-image-fs-7.5.2
title: ""
date: 2025-04-02T10:40:31.219Z
- commits:
- subject: Update @balena/lint to v9
hash: 4da5fa44a43047cdb4f96c37a73a0f0674c9327b
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: Remove the no longer needed gpt detection helper
hash: 0973da43aa321e4e2dad4b83c5beb965b8da7044
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: Update TypeScript to 5.8.2
hash: 1580e7d577e0183c2b5d4f9ce3d0b8f519e4dff3
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: Drop the package-lock.json
hash: 400ba55caa4c4af8098e2b164cd184651c283230
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-image-fs-7.5.1
title: ""
date: 2025-03-26T17:51:35.381Z
version: 21.1.9
title: ""
date: 2025-04-07T12:53:16.860Z
- commits:
- subject: Update actions/download-artifact action to v4.1.9
hash: a2209ffe5677388faf7b9bbccace5343265df51f
body: |
Update actions/download-artifact from 4.1.8 to 4.1.9
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: 21.1.8
title: ""
date: 2025-04-03T16:10:02.341Z
- commits:
- subject: Update actions/upload-artifact digest to ea165f8
hash: c8ea9cfcdbaa9a8abf221132a7d1ff29a966e515
body: |
Update actions/upload-artifact
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: 21.1.7
title: ""
date: 2025-04-03T15:12:14.222Z
- commits:
- subject: Update actions/setup-node digest to cdca736
hash: fe4243809033735a6439f39a1a33dfd00039d656
body: |
Update actions/setup-node
footer:
Change-type: patch
change-type: patch
author: balena-renovate[bot]
nested: []
version: 21.1.6
title: ""
date: 2025-04-03T14:12:06.042Z
- commits:
- subject: Update dockerode/docker-modem dependencies for fixes
hash: b650f8ff6d01d2144886253f93aa1d1867f51980
body: ""
footer:
Change-type: patch
change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
signed-off-by: Ken Bannister <kb2ma@runbox.com>
author: Ken Bannister
nested: []
version: 21.1.5
title: ""
date: 2025-04-03T13:28:08.855Z
- commits:
- subject: Add comment with secure boot signature file example for preload
hash: 28703bb5ae13539ab4c1c597e6a53a5292a7edde
body: ""
footer:
Change-type: patch
change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
signed-off-by: Ken Bannister <kb2ma@runbox.com>
author: Ken Bannister
nested: []
version: 21.1.4
title: ""
date: 2025-04-02T09:16:27.791Z
- commits:
- subject: Fix device detail for open balena
hash: 0d4e411777dd53d83c475da3653ab94176e07d7d
body: ""
footer:
Change-type: patch
change-type: patch
author: Otavio Jacobi
nested: []
version: 21.1.3
title: ""
date: 2025-03-28T16:57:00.250Z
- commits: - commits:
- subject: Deny preload for an image with secure boot enabled - subject: Deny preload for an image with secure boot enabled
hash: 7f2daeebb0973a59682ba4300e1b00bce6f6aead hash: 7f2daeebb0973a59682ba4300e1b00bce6f6aead

View File

@ -4,6 +4,199 @@ All notable changes to this project will be documented in this file
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY! automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
## 22.1.1 - 2025-06-19
* Deploy: Limit the submitted error_message of images that fail to build to 1000 characters [Thodoris Greasidis]
## 22.1.0 - 2025-06-09
* Add support for node 22 [Otavio Jacobi]
<details>
<summary> Bump etcher-sdk to v10.0.0 [Otavio Jacobi] </summary>
> ### etcher-sdk-10.0.0 - 2025-06-02
>
> * Drop support to node18 and add support to node 22 & 24 [Otavio Jacobi]
>
</details>
## 22.0.6 - 2025-06-02
* Remove `request` dependency [myarmolinsky]
* Replace `request` usage with `got` [myarmolinsky]
## 22.0.5 - 2025-05-29
<details>
<summary> Bump etcher-sdk to v9.1.4 [Otavio Jacobi] </summary>
> ### etcher-sdk-9.1.4 - 2025-05-29
>
> * Run `npm audit fix` which should only do non-breaking changes [Otavio Jacobi]
>
> ### etcher-sdk-9.1.3 - 2025-02-17
>
> * Embed config.json with a fixed timestamp to enable consistent checksums [Pagan Gazzard]
>
> ### etcher-sdk-9.1.2 - 2024-10-09
>
> * Update dependency unzip-stream to v0.3.2 [SECURITY] [Self-hosted Renovate Bot]
>
> ### etcher-sdk-9.1.1 - 2024-10-09
>
> * patch: add EXLOCK flag for windows [Talha Can Havadar]
>
</details>
## 22.0.4 - 2025-05-29
* tests: Replace request with got [Otavio Jacobi]
* deploy-legacy: Replace request with got [Otavio Jacobi]
## 22.0.3 - 2025-05-29
* Bump sentry to v9 [Otavio Jacobi]
## 22.0.2 - 2025-05-28
* Fix balena build to work with --nologs [Otavio Jacobi]
## 22.0.1 - 2025-05-28
* DeviceAPI: Move away from `request` in favor of BalenaSdk request [myarmolinsky]
* Update `nock` to 14.0.4 [myarmolinsky]
## 22.0.0 - 2025-05-26
* Add migration guide to v22 [Otavio Jacobi]
* Build standalone without pkg [Otavio Jacobi]
## 21.1.14 - 2025-05-21
<details>
<summary> Bump balena-preload to 18.0.4 [Otavio Jacobi] </summary>
> ### balena-preload-18.0.4 - 2025-05-21
>
> * Fix balena-preload pip deps [Otavio Jacobi]
>
</details>
## 21.1.13 - 2025-05-21
<details>
<summary> Bump balena-preload to 18.0.3 [Otavio Jacobi] </summary>
> ### balena-preload-18.0.3 - 2025-03-19
>
> * Update dependency sh to v1.14.3 [balena-renovate[bot]]
>
> ### balena-preload-18.0.2 - 2025-03-19
>
> * Update alpine Docker tag to v3.21 [balena-renovate[bot]]
>
</details>
## 21.1.12 - 2025-05-16
* Update @balena/compose dependency to fix error with build secrets. [Ken Bannister]
## 21.1.11 - 2025-05-06
* Fix typos in `os configure` and `config generate` help messages [myarmolinsky]
## 21.1.10 - 2025-05-05
* patch: fix windows signing [Edwin Joassart]
## 21.1.9 - 2025-04-07
<details>
<summary> Update balena-config-json to rely on the balena-image-fs helpers [Thodoris Greasidis] </summary>
> ### balena-config-json-4.2.7 - 2025-04-02
>
> * Fix getBootPartition always warning that the boot partitions were not found [Thodoris Greasidis]
>
> ### balena-config-json-4.2.6 - 2025-04-01
>
> * write: Allow undefined as a value for the deprecated type parameter [Thodoris Greasidis]
>
> <details>
> <summary> Use the balena-image-fs findPartition() helper to find the boot partition [Thodoris Greasidis] </summary>
>
>> #### balena-image-fs-7.5.0 - 2025-03-26
>>
>> * Add function to find a partition by name/label [Ken Bannister]
>>
>> #### balena-image-fs-7.4.1 - 2025-02-21
>>
>> * bump ext2fs to 4.2.4 [Ryan Cooke]
>>
>
> </details>
>
>
> ### balena-config-json-4.2.5 - 2025-03-26
>
> * Update @balena/lint to 9.1.4 [Thodoris Greasidis]
>
> ### balena-config-json-4.2.4 - 2025-03-26
>
> * Switch use ts-mocha instead of manually compiling the tests [Thodoris Greasidis]
> * Update TypeScript to 5.8.2 [Thodoris Greasidis]
>
> ### balena-config-json-4.2.3 - 2025-03-26
>
> * Update chai to v5 [balena-renovate[bot]]
>
> ### balena-image-fs-7.5.2 - 2025-04-02
>
> * Update dependency jsdoc-to-markdown to v9 [balena-renovate[bot]]
>
> ### balena-image-fs-7.5.1 - 2025-03-26
>
> * Update @balena/lint to v9 [Thodoris Greasidis]
> * Remove the no longer needed gpt detection helper [Thodoris Greasidis]
> * Update TypeScript to 5.8.2 [Thodoris Greasidis]
> * Drop the package-lock.json [Thodoris Greasidis]
>
</details>
## 21.1.8 - 2025-04-03
* Update actions/download-artifact action to v4.1.9 [balena-renovate[bot]]
## 21.1.7 - 2025-04-03
* Update actions/upload-artifact digest to ea165f8 [balena-renovate[bot]]
## 21.1.6 - 2025-04-03
* Update actions/setup-node digest to cdca736 [balena-renovate[bot]]
## 21.1.5 - 2025-04-03
* Update dockerode/docker-modem dependencies for fixes [Ken Bannister]
## 21.1.4 - 2025-04-02
* Add comment with secure boot signature file example for preload [Ken Bannister]
## 21.1.3 - 2025-03-28
* Fix device detail for open balena [Otavio Jacobi]
## 21.1.2 - 2025-03-27 ## 21.1.2 - 2025-03-27
* Deny preload for an image with secure boot enabled [Ken Bannister] * Deny preload for an image with secure boot enabled [Ken Bannister]

View File

@ -14,7 +14,7 @@ The balena CLI is an open source project and your contribution is welcome!
In order to ease development: In order to ease development:
* `npm run build:fast` skips some of the build steps for interactive testing, or * `npm run build:fast` skips some of the build steps for interactive testing, or
* `npm run test:source` skips testing the standalone zip packages (which is rather slow) * `npm run test:source` skips testing the standalone packages (which is rather slow)
* `./bin/balena-dev` uses `ts-node/register` to transpile on the fly. * `./bin/balena-dev` uses `ts-node/register` to transpile on the fly.
Before opening a PR, test your changes with `npm test`. Keep compatibility in mind, as the CLI is Before opening a PR, test your changes with `npm test`. Keep compatibility in mind, as the CLI is

View File

@ -8,8 +8,8 @@ There are 3 options to choose from to install balena's CLI:
* [Executable Installer](#executable-installer): the easiest method on Windows and macOS, using the * [Executable Installer](#executable-installer): the easiest method on Windows and macOS, using the
traditional graphical desktop application installers. traditional graphical desktop application installers.
* [Standalone Zip Package](#standalone-zip-package): these are plain zip files with the balena CLI * [Standalone tar.gz Package](#standalone-targz-package): these are plain tar.gz files with the balena CLI
executable in them: extract and run. Available for all platforms: Linux, Windows, macOS. bundled within. Available for all platforms: Linux, Windows, macOS.
Recommended also for scripted installation in CI (continuous integration) environments. Recommended also for scripted installation in CI (continuous integration) environments.
* [NPM Installation](#npm-installation): recommended for Node.js developers who may be interested * [NPM Installation](#npm-installation): recommended for Node.js developers who may be interested
in integrating the balena CLI in their existing projects or workflow. in integrating the balena CLI in their existing projects or workflow.
@ -30,9 +30,9 @@ instructions:
> If you would like to use WSL, follow the [installations instructions for > If you would like to use WSL, follow the [installations instructions for
> Linux](./INSTALL-LINUX.md) rather than Windows, as WSL consists of a Linux environment. > Linux](./INSTALL-LINUX.md) rather than Windows, as WSL consists of a Linux environment.
If you had previously installed the CLI using a standalone zip package, it may be a good idea to If you had previously installed the CLI using a standalone tar package, it may be a good idea to
check your system's `PATH` environment variable for duplicate entries, as the terminal will use the check your system's `PATH` environment variable for duplicate entries, as the terminal will use the
entry that comes first. Check the [Standalone Zip Package](#standalone-zip-package) instructions entry that comes first. Check the [Standalone tar.gz Package](#standalone-targz-package) instructions
for how to modify the PATH variable. for how to modify the PATH variable.
By default, the CLI is installed to the following folders: By default, the CLI is installed to the following folders:
@ -42,18 +42,17 @@ OS | Folders
Windows: | `C:\Program Files\balena-cli\` Windows: | `C:\Program Files\balena-cli\`
macOS: | `/usr/local/src/balena-cli/` <br> `/usr/local/bin/balena` macOS: | `/usr/local/src/balena-cli/` <br> `/usr/local/bin/balena`
## Standalone Zip Package ## Standalone tar.gz Package
1. Download the latest zip file from the [releases page](https://github.com/balena-io/balena-cli/releases). 1. Download the latest tar.gz file from the [releases page](https://github.com/balena-io/balena-cli/releases).
Look for a file name that ends with the word "standalone", for example: Look for a file name that ends with the word "standalone", for example:
`balena-cli-vX.Y.Z-linux-x64-standalone.zip`_also for the Windows Subsystem for Linux_ `balena-cli-vX.Y.Z-linux-x64-standalone.tar.gz`_also for the Windows Subsystem for Linux_
`balena-cli-vX.Y.Z-macOS-x64-standalone.zip` `balena-cli-vX.Y.Z-macOS-x64-standalone.tar.gz`
`balena-cli-vX.Y.Z-windows-x64-standalone.zip` `balena-cli-vX.Y.Z-windows-x64-standalone.tar.gz`
2. Extract the zip file contents to any folder you choose. The extracted contents will include a 2. Extract the tar.gz file contents to any folder you choose. The extracted contents will be a `balena` folder containing a `bin` subdirectory.
`balena-cli` folder.
3. Add the `balena-cli` folder to the system's `PATH` environment variable. 3. Add the `balena/bin` folder to the system's `PATH` environment variable.
See instructions for: See instructions for:
[Linux](https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix) | [Linux](https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix) |
[macOS](https://www.architectryan.com/2012/10/02/add-to-the-path-on-mac-os-x-mountain-lion/#.Uydjga1dXDg) | [macOS](https://www.architectryan.com/2012/10/02/add-to-the-path-on-mac-os-x-mountain-lion/#.Uydjga1dXDg) |
@ -61,14 +60,14 @@ macOS: | `/usr/local/src/balena-cli/` <br> `/usr/local/bin/balena`
> * If you are using macOS 10.15 or later (Catalina, Big Sur), [check this known issue and > * If you are using macOS 10.15 or later (Catalina, Big Sur), [check this known issue and
> workaround](https://github.com/balena-io/balena-cli/issues/2244). > workaround](https://github.com/balena-io/balena-cli/issues/2244).
> * **Linux Alpine** and **Busybox:** the standalone zip package is not currently compatible with > * **Linux Alpine** and **Busybox:** the standalone tar.gz package is not currently compatible with
> these "compact" Linux distributions, because of the alternative C libraries they ship with. > these "compact" Linux distributions, because of the alternative C libraries they ship with.
> For these, consider the [NPM Installation](#npm-installation) option. > For these, consider the [NPM Installation](#npm-installation) option.
> * Note that moving the `balena` executable out of the extracted `balena-cli` folder on its own > * Note that moving the `balena/bin/balena` executable out of the extracted `balena` folder on its own
> (e.g. moving it to `/usr/local/bin/balena`) will **not** work, as it depends on the other > (e.g. moving it to `/usr/local/bin/balena`) will **not** work, as it depends on the other
> folders and files also present in the `balena-cli` folder. > folders and files also present in the `balena` folder.
To update the CLI to a new version, download a new release zip file and replace the previous To update the CLI to a new version, download a new release tar.gz file and replace the previous
installation folder. To uninstall, simply delete the folder and edit the PATH environment variable installation folder. To uninstall, simply delete the folder and edit the PATH environment variable
as described above. as described above.
@ -78,8 +77,8 @@ If you are a Node.js developer, you may wish to install the balena CLI via [npm]
The npm installation involves building native (platform-specific) binary modules, which require The npm installation involves building native (platform-specific) binary modules, which require
some development tools to be installed first, as follows. some development tools to be installed first, as follows.
> **The balena CLI currently requires Node.js version ^20.6.0** > **The balena CLI currently requires Node.js version >=20.6.0**
> **Versions 21 and later are not yet fully supported.** > **Versions 23 and later are not yet fully supported.**
### Install development tools ### Install development tools
@ -89,7 +88,7 @@ some development tools to be installed first, as follows.
$ sudo apt-get update && sudo apt-get -y install curl python3 git make g++ $ sudo apt-get update && sudo apt-get -y install curl python3 git make g++
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
$ . ~/.bashrc $ . ~/.bashrc
$ nvm install 20 $ nvm install 22
``` ```
The `curl` command line above uses The `curl` command line above uses
@ -106,7 +105,7 @@ recommended.
```sh ```sh
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
$ . ~/.bashrc $ . ~/.bashrc
$ nvm install 20 $ nvm install 22
``` ```
#### **Windows** (not WSL) #### **Windows** (not WSL)
@ -114,7 +113,7 @@ $ nvm install 20
Install: Install:
* If you'd like the ability to switch between Node.js versions, install * If you'd like the ability to switch between Node.js versions, install
- Node.js v20 from the [Nodejs.org releases page](https://nodejs.org/en/download/releases/). - Node.js v22 from the [Nodejs.org releases page](https://nodejs.org/en/download/releases/).
[nvm-windows](https://github.com/coreybutler/nvm-windows#node-version-manager-nvm-for-windows) [nvm-windows](https://github.com/coreybutler/nvm-windows#node-version-manager-nvm-for-windows)
instead. instead.
* The [MSYS2 shell](https://www.msys2.org/), which provides `git`, `make`, `g++` and more: * The [MSYS2 shell](https://www.msys2.org/), which provides `git`, `make`, `g++` and more:

View File

@ -8,15 +8,15 @@ method.
Selected operating system: **Linux** Selected operating system: **Linux**
1. Download the latest zip file from the [latest release 1. Download the latest tar.gz file from the [latest release
page](https://github.com/balena-io/balena-cli/releases/latest). Look for a file name that ends page](https://github.com/balena-io/balena-cli/releases/latest). Look for a file name that ends
with "-standalone.zip", for example: with "-standalone.tar.gz", for example:
`balena-cli-vX.Y.Z-linux-x64-standalone.zip` `balena-cli-vX.Y.Z-linux-x64-standalone.tar.gz`
2. Extract the zip file contents to any folder you choose, for example `/home/james`. 2. Extract the tar.gz file contents to any folder you choose, for example `/home/james`.
The extracted contents will include a `balena-cli` folder. The extracted contents will include a `balena/bin` folder.
3. Add that folder (e.g. `/home/james/balena-cli`) to the `PATH` environment variable. 3. Add that folder (e.g. `/home/james/balena/bin`) to the `PATH` environment variable.
Check this [StackOverflow Check this [StackOverflow
post](https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix) post](https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix)
for instructions. Close and reopen the terminal window so that the changes to `PATH` for instructions. Close and reopen the terminal window so that the changes to `PATH`
@ -27,7 +27,7 @@ Selected operating system: **Linux**
* `balena version` - should print the CLI's version * `balena version` - should print the CLI's version
* `balena help` - should print a list of available commands * `balena help` - should print a list of available commands
To update the balena CLI to a new version, download a new release zip file and replace the previous To update the balena CLI to a new version, download a new release tar.gz file and replace the previous
installation folder. To uninstall, simply delete the folder and edit the PATH environment variable installation folder. To uninstall, simply delete the folder and edit the PATH environment variable
as described above. as described above.

45
MIGRATIONS.md Normal file
View File

@ -0,0 +1,45 @@
## Migrating to balena CLI v22
This guide outlines the changes introduced in balena CLI v22 and provides instructions for when and how to migrate.
---
### For Installer Users (Windows .exe, macOS .pkg)
If you are using the Windows executable (.exe) or macOS package (.pkg) installers, **no changes** are required for this update. You can continue to use the installers as before.
---
### For npm Installation Users
If you installed balena CLI via npm, **no changes** are required for this update. Your existing installation and update process remains the same.
---
### For Standalone Installation Users
Users of the standalone balena CLI will need to make the following adjustments:
1. **Archive Format Change**: The distribution archive format has changed from `.zip` to `.tar.gz`. You will need to use the `tar` command instead of `unzip` to extract the CLI.
* **Previous command (v21.x.x and older):**
```bash
unzip balena-cli-v21.1.12-linux-x64-standalone.zip
```
* **New command (v22.0.0 and newer):**
```bash
tar -xzf balena-cli-v22.0.0-linux-x64-standalone.tar.gz
```
2. **Executable Path Change**: The path to the balena CLI executable within the extracted folder has been updated.
* **Previous path (v21.x.x and older):**
```
balena-cli/balena
```
* **New path (v22.0.0 and newer):**
```
balena/bin/balena
```
Please update your scripts and any aliases to reflect these changes if you are using the standalone version.

View File

@ -20,6 +20,8 @@ GitHub](https://github.com/balena-io/balena-cli/), and your contribution is also
Check the [balena CLI installation instructions on Check the [balena CLI installation instructions on
GitHub](https://github.com/balena-io/balena-cli/blob/master/INSTALL.md). GitHub](https://github.com/balena-io/balena-cli/blob/master/INSTALL.md).
Note for v22 Migration: If you are upgrading to balena CLI v22 from a previous standalone installation, please [see the v22 Migration Guide](https://github.com/balena-io/balena-cli/blob/master/MIGRATIONS.md) for installation changes.
## Choosing a shell (command prompt/terminal) ## Choosing a shell (command prompt/terminal)
On **Windows,** the standard Command Prompt (`cmd.exe`) and On **Windows,** the standard Command Prompt (`cmd.exe`) and

View File

@ -115,7 +115,7 @@ If nothing seems to help, consider also using a different client-side terminal a
## "Docker seems to be unavailable" error when using Windows Subsystem for Linux (WSL) ## "Docker seems to be unavailable" error when using Windows Subsystem for Linux (WSL)
When running on WSL, the recommendation is to install a CLI release for Linux, like the standalone When running on WSL, the recommendation is to install a CLI release for Linux, like the standalone
zip package for Linux. However, commands like "balena build" will, by default, attempt to reach the tar.gz package for Linux. However, commands like "balena build" will, by default, attempt to reach the
Docker daemon at the Unix socket path `/var/run/docker.sock`, while Docker Desktop for Windows uses Docker daemon at the Unix socket path `/var/run/docker.sock`, while Docker Desktop for Windows uses
a Windows named pipe at `//./pipe/docker_engine` (which the Linux CLI on WSL cannot use). A a Windows named pipe at `//./pipe/docker_engine` (which the Linux CLI on WSL cannot use). A
solution is: solution is:

View File

@ -15,29 +15,17 @@
* limitations under the License. * limitations under the License.
*/ */
import type { JsonVersions } from '../src/commands/version/index';
import { run as oclifRun } from '@oclif/core'; import { run as oclifRun } from '@oclif/core';
import * as archiver from 'archiver';
import { exec, execFile } from 'child_process'; import { exec, execFile } from 'child_process';
import * as filehound from 'filehound';
import type { Stats } from 'fs'; import type { Stats } from 'fs';
import * as fs from 'fs-extra'; import * as fs from 'fs-extra';
import * as klaw from 'klaw'; import * as klaw from 'klaw';
import * as path from 'path'; import * as path from 'path';
import * as rimraf from 'rimraf'; import * as rimraf from 'rimraf';
import * as semver from 'semver';
import { promisify } from 'util'; import { promisify } from 'util';
import { notarize } from '@electron/notarize'; import { notarize } from '@electron/notarize';
import { stripIndent } from '../build/utils/lazy'; import { loadPackageJson, ROOT, whichSpawn } from './utils';
import {
diffLines,
loadPackageJson,
ROOT,
StdOutTap,
whichSpawn,
} from './utils';
const execFileAsync = promisify(execFile); const execFileAsync = promisify(execFile);
const execAsync = promisify(exec); const execAsync = promisify(exec);
@ -55,12 +43,6 @@ interface PathByPlatform {
[platform: string]: string; [platform: string]: string;
} }
const standaloneZips: PathByPlatform = {
linux: dPath(`balena-cli-${version}-linux-${arch}-standalone.zip`),
darwin: dPath(`balena-cli-${version}-macOS-${arch}-standalone.zip`),
win32: dPath(`balena-cli-${version}-windows-${arch}-standalone.zip`),
};
const getOclifInstallersOriginalNames = async (): Promise<PathByPlatform> => { const getOclifInstallersOriginalNames = async (): Promise<PathByPlatform> => {
const { stdout } = await execAsync('git rev-parse --short HEAD'); const { stdout } = await execAsync('git rev-parse --short HEAD');
const sha = stdout.trim(); const sha = stdout.trim();
@ -75,260 +57,28 @@ const renamedOclifInstallers: PathByPlatform = {
win32: dPath(`balena-cli-${version}-windows-${arch}-installer.exe`), win32: dPath(`balena-cli-${version}-windows-${arch}-installer.exe`),
}; };
export const finalReleaseAssets: { [platform: string]: string[] } = { const getOclifStandaloneOriginalNames = async (): Promise<PathByPlatform> => {
win32: [standaloneZips['win32'], renamedOclifInstallers['win32']], const { stdout } = await execAsync('git rev-parse --short HEAD');
darwin: [standaloneZips['darwin'], renamedOclifInstallers['darwin']], const sha = stdout.trim();
linux: [standaloneZips['linux']], return {
linux: dPath(`balena-${version}-${sha}-linux-${arch}.tar.gz`),
darwin: dPath(`balena-${version}-${sha}-darwin-${arch}.tar.gz`),
win32: dPath(`balena-${version}-${sha}-win32-${arch}.tar.gz`),
};
}; };
/** const renamedOclifStandalone: PathByPlatform = {
* Given the output of `pkg` as a string (containing warning messages), linux: dPath(`balena-cli-${version}-linux-${arch}-standalone.tar.gz`),
* diff it against previously saved output of known "safe" warnings. darwin: dPath(`balena-cli-${version}-macOS-${arch}-standalone.tar.gz`),
* Throw an error if the diff is not empty. win32: dPath(`balena-cli-${version}-windows-${arch}-standalone.tar.gz`),
*/ };
async function diffPkgOutput(pkgOut: string) {
const { monochrome } = await import('../tests/helpers');
const relSavedPath = path.join(
'tests',
'test-data',
'pkg',
`expected-warnings-${process.platform}-${arch}.txt`,
);
const absSavedPath = path.join(ROOT, relSavedPath);
const ignoreStartsWith = [
'> pkg@',
'> Fetching base Node.js binaries',
' fetched-',
'prebuild-install WARN install No prebuilt binaries found',
];
const modulesRE =
process.platform === 'win32'
? /(?<=[ '])([A-Z]:)?\\.+?\\node_modules(?=\\)/
: /(?<=[ '])\/.+?\/node_modules(?=\/)/;
const buildRE =
process.platform === 'win32'
? /(?<=[ '])([A-Z]:)?\\.+\\build(?=\\)/
: /(?<=[ '])\/.+\/build(?=\/)/;
const cleanLines = (chunks: string | string[]) => {
const lines = typeof chunks === 'string' ? chunks.split('\n') : chunks;
return lines
.map((line: string) => monochrome(line)) // remove ASCII colors
.filter((line: string) => !/^\s*$/.test(line)) // blank lines
.filter((line: string) =>
ignoreStartsWith.every((i) => !line.startsWith(i)),
)
.map((line: string) => {
// replace absolute paths with relative paths
let replaced = line.replace(modulesRE, 'node_modules');
if (replaced === line) {
replaced = line.replace(buildRE, 'build');
}
return replaced;
});
};
pkgOut = cleanLines(pkgOut).join('\n');
const { readFile } = (await import('fs')).promises;
const expectedOut = cleanLines(await readFile(absSavedPath, 'utf8')).join(
'\n',
);
if (expectedOut !== pkgOut) {
const sep =
'================================================================================';
const diff = diffLines(expectedOut, pkgOut);
const msg = `pkg output does not match expected output from "${relSavedPath}"
Diff:
${sep}
${diff}
${sep}
Check whether the new or changed pkg warnings are safe to ignore, then update
"${relSavedPath}"
and share the result of your investigation as comments on the pull request.
Hint: the fix is often a matter of updating the 'pkg.scripts' or 'pkg.assets'
sections in the CLI's 'package.json' file, or a matter of updating the
'buildPkg' function in 'automation/build-bin.ts'. Sometimes it requires
patching dependencies: See for example 'patches/all/open+7.0.2.patch'.
${sep}
`;
throw new Error(msg);
}
}
/**
* Call `pkg.exec` to generate the standalone zip file, capturing its warning
* messages (stdout and stderr) in order to call diffPkgOutput().
*/
async function execPkg(...args: any[]) {
const { exec: pkgExec } = await import('@yao-pkg/pkg');
const outTap = new StdOutTap(true);
try {
outTap.tap();
await (pkgExec as any)(...args);
} catch (err) {
outTap.untap();
console.log(outTap.stdoutBuf.join(''));
console.error(outTap.stderrBuf.join(''));
throw err;
}
outTap.untap();
await diffPkgOutput(outTap.allBuf.join(''));
}
/**
* Use the 'pkg' module to create a single large executable file with
* the contents of 'node_modules' and the CLI's javascript code.
* Also copy a number of native modules (binary '.node' files) that are
* compiled during 'npm install' to the 'build-bin' folder, alongside
* the single large executable file created by pkg. (This is necessary
* because of a pkg limitation that does not allow binary executables
* to be directly executed from inside another binary executable.)
*/
async function buildPkg() {
// https://github.com/vercel/pkg#targets
let targets = `linux-${arch}`;
if (process.platform === 'darwin') {
targets = `macos-${arch}`;
}
// TBC: not yet possible to build for Windows arm64 on x64 nodes
if (process.platform === 'win32') {
targets = `win-x64`;
}
const args = [
'--targets',
targets,
'--output',
'build-bin/balena',
'package.json',
];
console.log('=======================================================');
console.log(`execPkg ${args.join(' ')}`);
console.log(`cwd="${process.cwd()}" ROOT="${ROOT}"`);
console.log('=======================================================');
await execPkg(args);
const paths: Array<[string, string[], string[]]> = [
// [platform, [source path], [destination path]]
['*', ['open', 'xdg-open'], ['xdg-open']],
['darwin', ['denymount', 'bin', 'denymount'], ['denymount']],
];
await Promise.all(
paths.map(([platform, source, dest]) => {
if (platform === '*' || platform === process.platform) {
// eg copy from node_modules/open/xdg-open to build-bin/xdg-open
return fs.copy(
path.join(ROOT, 'node_modules', ...source),
path.join(ROOT, 'build-bin', ...dest),
);
}
}),
);
const nativeExtensionPaths: string[] = await filehound
.create()
.paths(path.join(ROOT, 'node_modules'))
.ext(['node', 'dll'])
.find();
console.log(`\nCopying to build-bin:\n${nativeExtensionPaths.join('\n')}`);
await Promise.all(
nativeExtensionPaths.map((extPath) =>
fs.copy(
extPath,
extPath.replace(
path.join(ROOT, 'node_modules'),
path.join(ROOT, 'build-bin'),
),
),
),
);
}
/**
* Run some basic tests on the built pkg executable.
* TODO: test more than just `balena version -j`; integrate with the
* existing mocha/chai CLI command testing.
*/
async function testPkg() {
const pkgBalenaPath = path.join(
ROOT,
'build-bin',
process.platform === 'win32' ? 'balena.exe' : 'balena',
);
console.log(`Testing standalone package "${pkgBalenaPath}"...`);
// Run `balena version -j`, parse its stdout as JSON, and check that the
// reported Node.js major version matches semver.major(process.version)
let { stdout, stderr } = await execFileAsync(pkgBalenaPath, [
'version',
'-j',
]);
const { filterCliOutputForTests } = await import('../tests/helpers');
const filtered = filterCliOutputForTests({
err: stderr.split(/\r?\n/),
out: stdout.split(/\r?\n/),
});
stdout = filtered.out.join('\n');
stderr = filtered.err.join('\n');
let pkgNodeVersion = '';
let pkgNodeMajorVersion = 0;
try {
const balenaVersions: JsonVersions = JSON.parse(stdout);
pkgNodeVersion = balenaVersions['Node.js'];
pkgNodeMajorVersion = semver.major(pkgNodeVersion);
} catch (err) {
throw new Error(stripIndent`
Error parsing JSON output of "balena version -j": ${err}
Original output: "${stdout}"`);
}
if (semver.major(process.version) !== pkgNodeMajorVersion) {
throw new Error(
`Mismatched major version: built-in pkg Node version="${pkgNodeVersion}" vs process.version="${process.version}"`,
);
}
if (filtered.err.length > 0) {
const err = filtered.err.join('\n');
throw new Error(`"${pkgBalenaPath}": non-empty stderr "${err}"`);
}
console.log('Success! (standalone package test successful)');
}
/**
* Create the zip file for the standalone 'pkg' bundle previously created
* by the buildPkg() function in 'build-bin.ts'.
*/
async function zipPkg() {
const outputFile = standaloneZips[process.platform];
if (!outputFile) {
throw new Error(
`Standalone installer unavailable for platform "${process.platform}"`,
);
}
await fs.mkdirp(path.dirname(outputFile));
await new Promise<void>((resolve, reject) => {
console.log(`Zipping standalone package to "${outputFile}"...`);
const archive = archiver('zip', {
zlib: { level: 7 },
});
archive.directory(path.join(ROOT, 'build-bin'), 'balena-cli');
const outputStream = fs.createWriteStream(outputFile);
outputStream.on('close', resolve);
outputStream.on('error', reject);
archive.on('error', reject);
archive.on('warning', console.warn);
archive.pipe(outputStream);
archive.finalize().catch(reject);
});
}
export async function signFilesForNotarization() { export async function signFilesForNotarization() {
console.log('Signing files for notarization'); console.log('Signing files for notarization');
if (process.platform !== 'darwin') { // If signFilesForNotarization is called on the test CI environment (which will not set CSC_LINK)
// then we skip the signing process.
if (process.platform !== 'darwin' || !process.env.CSC_LINK) {
console.log('Skipping signing for notarization');
return; return;
} }
console.log('Deleting unneeded zip files...'); console.log('Deleting unneeded zip files...');
@ -416,20 +166,39 @@ export async function signFilesForNotarization() {
]); ]);
} }
export async function buildStandaloneZip() { export async function buildStandalone() {
console.log(`Building standalone zip package for CLI ${version}`); console.log(`Building standalone tarball for CLI ${version}`);
fs.rmSync('./tmp', { recursive: true, force: true });
fs.rmSync('./dist', { recursive: true, force: true });
fs.mkdirSync('./dist');
try { try {
await buildPkg(); let packOpts = ['-r', ROOT, '--no-xz'];
await testPkg(); if (process.platform === 'darwin') {
await zipPkg(); packOpts = packOpts.concat('--targets', `darwin-${arch}`);
console.log(`Standalone zip package build completed`); } else if (process.platform === 'win32') {
packOpts = packOpts.concat('--targets', 'win32-x64');
} else if (process.platform === 'linux') {
packOpts = packOpts.concat('--targets', `linux-${arch}`);
}
console.log(`Building oclif installer for CLI ${version}`);
const packCmd = `pack:tarballs`;
console.log('=======================================================');
console.log(`oclif ${packCmd} ${packOpts.join(' ')}`);
console.log(`cwd="${process.cwd()}" ROOT="${ROOT}"`);
console.log('=======================================================');
const oclifPath = path.join(ROOT, 'node_modules', 'oclif');
await oclifRun([packCmd].concat(...packOpts), oclifPath);
await renameStandalone();
console.log(`Standalone tarball package build completed`);
} catch (error) { } catch (error) {
console.error(`Error creating or testing standalone zip package`); console.error(`Error creating or testing standalone tarball package`);
throw error; throw error;
} }
} }
async function renameInstallerFiles() { async function renameInstallers() {
const oclifInstallers = await getOclifInstallersOriginalNames(); const oclifInstallers = await getOclifInstallersOriginalNames();
if (await fs.pathExists(oclifInstallers[process.platform])) { if (await fs.pathExists(oclifInstallers[process.platform])) {
await fs.rename( await fs.rename(
@ -439,6 +208,16 @@ async function renameInstallerFiles() {
} }
} }
async function renameStandalone() {
const oclifStandalone = await getOclifStandaloneOriginalNames();
if (await fs.pathExists(oclifStandalone[process.platform])) {
await fs.rename(
oclifStandalone[process.platform],
renamedOclifStandalone[process.platform],
);
}
}
/** /**
* If the CSC_LINK and CSC_KEY_PASSWORD env vars are set, digitally sign the * If the CSC_LINK and CSC_KEY_PASSWORD env vars are set, digitally sign the
* executable installer using Microsoft SignTool.exe (Sign Tool) * executable installer using Microsoft SignTool.exe (Sign Tool)
@ -446,7 +225,7 @@ async function renameInstallerFiles() {
*/ */
async function signWindowsInstaller() { async function signWindowsInstaller() {
if (process.env.SM_CODE_SIGNING_CERT_SHA1_HASH) { if (process.env.SM_CODE_SIGNING_CERT_SHA1_HASH) {
const exeName = renamedOclifInstallers[process.platform]; const exeName = (await getOclifInstallersOriginalNames())[process.platform];
console.log(`Signing installer "${exeName}"`); console.log(`Signing installer "${exeName}"`);
// trust ... // trust ...
await execFileAsync('signtool.exe', [ await execFileAsync('signtool.exe', [
@ -480,12 +259,14 @@ async function notarizeMacInstaller(): Promise<void> {
const appleId = const appleId =
process.env.XCODE_APP_LOADER_EMAIL || 'accounts+apple@balena.io'; process.env.XCODE_APP_LOADER_EMAIL || 'accounts+apple@balena.io';
const appleIdPassword = process.env.XCODE_APP_LOADER_PASSWORD; const appleIdPassword = process.env.XCODE_APP_LOADER_PASSWORD;
const appPath = (await getOclifInstallersOriginalNames())[process.platform];
console.log(`Notarizing file "${appPath}"`);
if (appleIdPassword && teamId) { if (appleIdPassword && teamId) {
await notarize({ await notarize({
tool: 'notarytool', tool: 'notarytool',
teamId, teamId,
appPath: renamedOclifInstallers.darwin, appPath,
appleId, appleId,
appleIdPassword, appleIdPassword,
}); });
@ -525,7 +306,6 @@ export async function buildOclifInstaller() {
console.log('======================================================='); console.log('=======================================================');
const oclifPath = path.join(ROOT, 'node_modules', 'oclif'); const oclifPath = path.join(ROOT, 'node_modules', 'oclif');
await oclifRun([packCmd].concat(...packOpts), oclifPath); await oclifRun([packCmd].concat(...packOpts), oclifPath);
await renameInstallerFiles();
// The Windows installer is explicitly signed here (oclif doesn't do it). // The Windows installer is explicitly signed here (oclif doesn't do it).
// The macOS installer is automatically signed by oclif (which runs the // The macOS installer is automatically signed by oclif (which runs the
// `pkgbuild` tool), using the certificate name given in package.json // `pkgbuild` tool), using the certificate name given in package.json
@ -537,6 +317,7 @@ export async function buildOclifInstaller() {
await notarizeMacInstaller(); // Notarize await notarizeMacInstaller(); // Notarize
console.log('Package notarized.'); console.log('Package notarized.');
} }
await renameInstallers();
console.log(`oclif installer build completed`); console.log(`oclif installer build completed`);
} }
} }
@ -572,4 +353,5 @@ export async function testShrinkwrap(): Promise<void> {
if (process.platform !== 'win32') { if (process.platform !== 'win32') {
await whichSpawn(path.resolve(__dirname, 'test-lock-deduplicated.sh')); await whichSpawn(path.resolve(__dirname, 'test-lock-deduplicated.sh'));
} }
await Promise.resolve();
} }

View File

@ -19,7 +19,7 @@ import * as _ from 'lodash';
import { import {
buildOclifInstaller, buildOclifInstaller,
buildStandaloneZip, buildStandalone,
catchUncommitted, catchUncommitted,
signFilesForNotarization, signFilesForNotarization,
testShrinkwrap, testShrinkwrap,
@ -36,7 +36,7 @@ process.env.DEBUG = ['0', 'no', 'false', '', undefined].includes(
* Trivial command-line parser. Check whether the command-line argument is one * Trivial command-line parser. Check whether the command-line argument is one
* of the following strings, then call the appropriate functions: * of the following strings, then call the appropriate functions:
* 'build:installer' (to build a native oclif installer) * 'build:installer' (to build a native oclif installer)
* 'build:standalone' (to build a standalone pkg package) * 'build:standalone' (to build a standalone package)
* *
* @param args Arguments to parse (default is process.argv.slice(2)) * @param args Arguments to parse (default is process.argv.slice(2))
*/ */
@ -49,7 +49,7 @@ async function parse(args?: string[]) {
} }
const commands: { [cmd: string]: () => void | Promise<void> } = { const commands: { [cmd: string]: () => void | Promise<void> } = {
'build:installer': buildOclifInstaller, 'build:installer': buildOclifInstaller,
'build:standalone': buildStandaloneZip, 'build:standalone': buildStandalone,
'sign:binaries': signFilesForNotarization, 'sign:binaries': signFilesForNotarization,
'catch-uncommitted': catchUncommitted, 'catch-uncommitted': catchUncommitted,
'test-shrinkwrap': testShrinkwrap, 'test-shrinkwrap': testShrinkwrap,

View File

@ -18,73 +18,10 @@
import { spawn } from 'child_process'; import { spawn } from 'child_process';
import * as path from 'path'; import * as path from 'path';
import * as fs from 'fs'; import * as fs from 'fs';
import { diffTrimmedLines } from 'diff';
import * as whichMod from 'which'; import * as whichMod from 'which';
export const ROOT = path.join(__dirname, '..'); export const ROOT = path.join(__dirname, '..');
/** Tap and buffer this process' stdout and stderr */
export class StdOutTap {
public stdoutBuf: string[] = [];
public stderrBuf: string[] = [];
public allBuf: string[] = []; // both stdout and stderr
protected origStdoutWrite: typeof process.stdout.write;
protected origStderrWrite: typeof process.stdout.write;
constructor(protected printDots = false) {}
tap() {
this.origStdoutWrite = process.stdout.write;
this.origStderrWrite = process.stderr.write;
process.stdout.write = (chunk: string, ...args: any[]): boolean => {
this.stdoutBuf.push(chunk);
this.allBuf.push(chunk);
const str = this.printDots ? '.' : chunk;
return this.origStdoutWrite.call(process.stdout, str, ...args);
};
process.stderr.write = (chunk: string, ...args: any[]): boolean => {
this.stderrBuf.push(chunk);
this.allBuf.push(chunk);
const str = this.printDots ? '.' : chunk;
return this.origStderrWrite.call(process.stderr, str, ...args);
};
}
untap() {
process.stdout.write = this.origStdoutWrite;
process.stderr.write = this.origStderrWrite;
if (this.printDots) {
console.error('');
}
}
}
/**
* Diff strings by line, using the 'diff' npm package:
* https://www.npmjs.com/package/diff
*/
export function diffLines(str1: string, str2: string): string {
const diffObjs = diffTrimmedLines(str1, str2);
const prefix = (chunk: string, char: string) =>
chunk
.split('\n')
.map((line: string) => `${char} ${line}`)
.join('\n');
const diffStr = diffObjs
.map((part: any) => {
return part.added
? prefix(part.value, '+')
: part.removed
? prefix(part.value, '-')
: prefix(part.value, ' ');
})
.join('\n');
return diffStr;
}
export function loadPackageJson() { export function loadPackageJson() {
const packageJsonPath = path.join(ROOT, 'package.json'); const packageJsonPath = path.join(ROOT, 'package.json');

View File

@ -13,6 +13,8 @@ GitHub](https://github.com/balena-io/balena-cli/), and your contribution is also
Check the [balena CLI installation instructions on Check the [balena CLI installation instructions on
GitHub](https://github.com/balena-io/balena-cli/blob/master/INSTALL.md). GitHub](https://github.com/balena-io/balena-cli/blob/master/INSTALL.md).
Note for v22 Migration: If you are upgrading to balena CLI v22 from a previous standalone installation, please [see the v22 Migration Guide](https://github.com/balena-io/balena-cli/blob/master/MIGRATIONS.md) for installation changes.
## Choosing a shell (command prompt/terminal) ## Choosing a shell (command prompt/terminal)
On **Windows,** the standard Command Prompt (`cmd.exe`) and On **Windows,** the standard Command Prompt (`cmd.exe`) and
@ -574,9 +576,9 @@ Generate a config.json file for a device or fleet.
The target balenaOS version must be specified with the --version option. The target balenaOS version must be specified with the --version option.
The '--dev' option is used to configure balenaOS to operate in development mode, The '--dev' option is used to configure balenaOS to operate in development mode,
allowing anauthenticated root ssh access and exposing network ports such as allowing unauthenticated root ssh access and exposing network ports such as
balenaEngine's 2375 (unencrypted). This option causes `"developmentMode": true` balenaEngine's 2375 (unencrypted). This option causes `"developmentMode": true`
to be inserted in the 'config.json' file in the image's boot partion. Development to be inserted in the 'config.json' file in the image's boot partition. Development
mode (as a configurable option) is applicable to balenaOS releases from early mode (as a configurable option) is applicable to balenaOS releases from early
2022. Older releases have separate development and production balenaOS images 2022. Older releases have separate development and production balenaOS images
that cannot be reconfigured through 'config.json' or the '--dev' option. Do not that cannot be reconfigured through 'config.json' or the '--dev' option. Do not
@ -2872,9 +2874,9 @@ The --device-type option is used to override the fleet's default device type,
in case of a fleet with mixed device types. in case of a fleet with mixed device types.
The '--dev' option is used to configure balenaOS to operate in development mode, The '--dev' option is used to configure balenaOS to operate in development mode,
allowing anauthenticated root ssh access and exposing network ports such as allowing unauthenticated root ssh access and exposing network ports such as
balenaEngine's 2375 (unencrypted). This option causes `"developmentMode": true` balenaEngine's 2375 (unencrypted). This option causes `"developmentMode": true`
to be inserted in the 'config.json' file in the image's boot partion. Development to be inserted in the 'config.json' file in the image's boot partition. Development
mode (as a configurable option) is applicable to balenaOS releases from early mode (as a configurable option) is applicable to balenaOS releases from early
2022. Older releases have separate development and production balenaOS images 2022. Older releases have separate development and production balenaOS images
that cannot be reconfigured through 'config.json' or the '--dev' option. Do not that cannot be reconfigured through 'config.json' or the '--dev' option. Do not

3521
npm-shrinkwrap.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "balena-cli", "name": "balena-cli",
"version": "21.1.2", "version": "22.1.1",
"description": "The official balena Command Line Interface", "description": "The official balena Command Line Interface",
"main": "./build/app.js", "main": "./build/app.js",
"homepage": "https://github.com/balena-io/balena-cli", "homepage": "https://github.com/balena-io/balena-cli",
@ -24,26 +24,6 @@
"bin": { "bin": {
"balena": "./bin/run.js" "balena": "./bin/run.js"
}, },
"pkg": {
"scripts": [
"build/**/*.js",
"node_modules/balena-sdk/es2018/index.js",
"node_modules/pinejs-client-request/node_modules/pinejs-client-core/es2018/index.js",
"node_modules/@balena/compose/dist/parse/schemas/*.json"
],
"assets": [
"build/auth/pages/*.ejs",
"node_modules/balena-sdk/node_modules/balena-pine/**/*",
"node_modules/balena-pine/**/*",
"node_modules/pinejs-client-core/**/*",
"node_modules/open/xdg-open",
"node_modules/windosu/*.bat",
"node_modules/windosu/*.cmd",
"node_modules/axios/**/*",
"npm-shrinkwrap.json",
"oclif.manifest.json"
]
},
"scripts": { "scripts": {
"postinstall": "node patches/apply-patches.js", "postinstall": "node patches/apply-patches.js",
"prebuild": "rimraf build/ build-bin/", "prebuild": "rimraf build/ build-bin/",
@ -92,7 +72,7 @@
"author": "Balena Inc. (https://balena.io/)", "author": "Balena Inc. (https://balena.io/)",
"license": "Apache-2.0", "license": "Apache-2.0",
"engines": { "engines": {
"node": "^20.6.0" "node": ">=20.6.0 <23"
}, },
"oclif": { "oclif": {
"bin": "balena", "bin": "balena",
@ -114,14 +94,12 @@
"devDependencies": { "devDependencies": {
"@balena/lint": "^9.1.3", "@balena/lint": "^9.1.3",
"@electron/notarize": "^2.0.0", "@electron/notarize": "^2.0.0",
"@types/archiver": "^6.0.2",
"@types/bluebird": "^3.5.36", "@types/bluebird": "^3.5.36",
"@types/body-parser": "^1.19.2", "@types/body-parser": "^1.19.2",
"@types/chai": "^4.3.0", "@types/chai": "^4.3.0",
"@types/chai-as-promised": "^7.1.4", "@types/chai-as-promised": "^7.1.4",
"@types/cli-truncate": "^2.0.0", "@types/cli-truncate": "^2.0.0",
"@types/common-tags": "^1.8.1", "@types/common-tags": "^1.8.1",
"@types/diff": "^5.0.3",
"@types/dockerode": "3.3.23", "@types/dockerode": "3.3.23",
"@types/ejs": "^3.1.0", "@types/ejs": "^3.1.0",
"@types/express": "^4.17.13", "@types/express": "^4.17.13",
@ -146,7 +124,6 @@
"@types/node-cleanup": "^2.1.2", "@types/node-cleanup": "^2.1.2",
"@types/prettyjson": "^0.0.33", "@types/prettyjson": "^0.0.33",
"@types/progress-stream": "^2.0.2", "@types/progress-stream": "^2.0.2",
"@types/request": "^2.48.7",
"@types/rewire": "^2.5.30", "@types/rewire": "^2.5.30",
"@types/rimraf": "^3.0.2", "@types/rimraf": "^3.0.2",
"@types/semver": "^7.3.9", "@types/semver": "^7.3.9",
@ -160,16 +137,12 @@
"@types/update-notifier": "^4.1.1", "@types/update-notifier": "^4.1.1",
"@types/which": "^2.0.1", "@types/which": "^2.0.1",
"@types/window-size": "^1.1.1", "@types/window-size": "^1.1.1",
"@yao-pkg/pkg": "^5.11.1",
"archiver": "^7.0.1",
"catch-uncommitted": "^2.0.0", "catch-uncommitted": "^2.0.0",
"chai": "^4.3.4", "chai": "^4.3.4",
"chai-as-promised": "^7.1.1", "chai-as-promised": "^7.1.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"deep-object-diff": "^1.1.0", "deep-object-diff": "^1.1.0",
"diff": "^5.0.0",
"ent": "^2.2.0", "ent": "^2.2.0",
"filehound": "^1.17.5",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
"http-proxy": "^1.18.1", "http-proxy": "^1.18.1",
"husky": "^9.1.5", "husky": "^9.1.5",
@ -180,7 +153,7 @@
"mocha": "^10.6.0", "mocha": "^10.6.0",
"mock-fs": "^5.2.0", "mock-fs": "^5.2.0",
"mock-require": "^3.0.3", "mock-require": "^3.0.3",
"nock": "^13.2.1", "nock": "^14.0.4",
"oclif": "^4.17.0", "oclif": "^4.17.0",
"rewire": "^7.0.0", "rewire": "^7.0.0",
"simple-git": "^3.14.1", "simple-git": "^3.14.1",
@ -190,17 +163,17 @@
"typescript": "^5.8.2" "typescript": "^5.8.2"
}, },
"dependencies": { "dependencies": {
"@balena/compose": "^7.0.1", "@balena/compose": "^7.0.9",
"@balena/dockerignore": "^1.0.2", "@balena/dockerignore": "^1.0.2",
"@balena/env-parsing": "^1.1.8", "@balena/env-parsing": "^1.1.8",
"@balena/es-version": "^1.0.1", "@balena/es-version": "^1.0.1",
"@oclif/core": "^4.1.0", "@oclif/core": "^4.1.0",
"@sentry/node": "^6.16.1", "@sentry/node": "^9.0.0",
"balena-config-json": "^4.2.2", "balena-config-json": "^4.2.7",
"balena-device-init": "^8.1.3", "balena-device-init": "^8.1.11",
"balena-errors": "^4.7.3", "balena-errors": "^4.7.3",
"balena-image-fs": "^7.5.0", "balena-image-fs": "^7.5.2",
"balena-preload": "^18.0.1", "balena-preload": "^18.0.4",
"balena-sdk": "^21.3.0", "balena-sdk": "^21.3.0",
"balena-semver": "^2.3.0", "balena-semver": "^2.3.0",
"balena-settings-client": "^5.0.2", "balena-settings-client": "^5.0.2",
@ -214,11 +187,11 @@
"common-tags": "^1.7.2", "common-tags": "^1.7.2",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"denymount": "^2.3.0", "denymount": "^2.3.0",
"docker-modem": "5.0.5", "docker-modem": "^5.0.6",
"docker-progress": "^5.1.3", "docker-progress": "^5.1.3",
"dockerode": "4.0.3", "dockerode": "^4.0.5",
"ejs": "^3.1.6", "ejs": "^3.1.6",
"etcher-sdk": "9.1.0", "etcher-sdk": "^10.0.0",
"express": "^4.17.2", "express": "^4.17.2",
"fast-boot2": "^1.1.0", "fast-boot2": "^1.1.0",
"fast-levenshtein": "^3.0.0", "fast-levenshtein": "^3.0.0",
@ -246,9 +219,8 @@
"prettyjson": "^1.2.5", "prettyjson": "^1.2.5",
"progress-stream": "^2.0.0", "progress-stream": "^2.0.0",
"reconfix": "^1.0.0-v0-1-0-fork-46760acff4d165f5238bfac5e464256ef1944476", "reconfix": "^1.0.0-v0-1-0-fork-46760acff4d165f5238bfac5e464256ef1944476",
"request": "^2.88.2", "resin-cli-form": "^4.0.0",
"resin-cli-form": "^3.0.0", "resin-cli-visuals": "^3.0.0",
"resin-cli-visuals": "^2.0.1",
"resin-doodles": "^0.2.0", "resin-doodles": "^0.2.0",
"resin-stream-logger": "^0.1.2", "resin-stream-logger": "^0.1.2",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
@ -276,6 +248,6 @@
} }
}, },
"versionist": { "versionist": {
"publishedAt": "2025-03-27T12:20:23.852Z" "publishedAt": "2025-06-19T09:32:53.877Z"
} }
} }

View File

@ -1,16 +0,0 @@
diff --git a/node_modules/open/index.js b/node_modules/open/index.js
index 13147d0..ff161dd 100644
--- a/node_modules/open/index.js
+++ b/node_modules/open/index.js
@@ -10,7 +10,10 @@ const pAccess = promisify(fs.access);
const pReadFile = promisify(fs.readFile);
// Path to included `xdg-open`.
-const localXdgOpenPath = path.join(__dirname, 'xdg-open');
+const localXdgOpenPath = process.pkg
+ ? path.join(path.dirname(process.execPath), 'xdg-open')
+ : path.join(__dirname, 'xdg-open');
+
/**
Get the mount point for fixed drives in WSL.

View File

@ -1,14 +0,0 @@
diff --git a/node_modules/node-gyp-build/node-gyp-build.js b/node_modules/node-gyp-build/node-gyp-build.js
index 61b398e..3cc3be8 100644
--- a/node_modules/node-gyp-build/node-gyp-build.js
+++ b/node_modules/node-gyp-build/node-gyp-build.js
@@ -30,6 +30,9 @@ load.resolve = load.path = function (dir) {
if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']
} catch (err) {}
+ // pkg fix: native node modules are located externally to the pkg executable
+ dir = dir.replace(/^\/snapshot\/.+?\/node_modules\//, path.dirname(process.execPath) + path.sep)
+
if (!prebuildsOnly) {
var release = getFirst(path.join(dir, 'build/Release'), matchBuild)
if (release) return release

View File

@ -1,38 +0,0 @@
diff --git a/node_modules/windosu/lib/pipe.js b/node_modules/windosu/lib/pipe.js
index dc81fa5..a381cc7 100644
--- a/node_modules/windosu/lib/pipe.js
+++ b/node_modules/windosu/lib/pipe.js
@@ -42,7 +42,8 @@ function pipe(path, options) {
return d.promise;
}
module.exports = pipe;
-if (module === require.main) {
+
+function main() {
if (!process.argv[4]) {
console.error('Incorrect arguments!');
process.exit(-1);
@@ -52,3 +53,8 @@ if (module === require.main) {
serve: process.argv[3] == 'server'
});
}
+module.exports.main = main;
+
+if (module === require.main) {
+ main();
+}
diff --git a/node_modules/windosu/lib/windosu.js b/node_modules/windosu/lib/windosu.js
index 6502812..dd0391a 100644
--- a/node_modules/windosu/lib/windosu.js
+++ b/node_modules/windosu/lib/windosu.js
@@ -16,7 +16,9 @@ module.exports.exec = function (command, options, callback) {
temp: temp,
command: command,
cliWidth: cliWidth(),
- pipe: '"' + process.execPath + '" "' + path.join(__dirname, 'pipe.js') + '"',
+ pipe: process.pkg
+ ? '"' + process.execPath + '" pkgExec "' + path.join(__dirname, 'pipe.js') + '::main"'
+ : '"' + process.execPath + '" "' + path.join(__dirname, 'pipe.js') + '"',
input: inputName = id + '-in',
output: outputName = id + '-out',
stderr_redir: process.stdout.isTTY ? '2>&1' : '2> %ERROR%'

View File

@ -34,18 +34,14 @@ export const setupSentry = onceAsync(async () => {
const config = await import('./config'); const config = await import('./config');
const Sentry = await import('@sentry/node'); const Sentry = await import('@sentry/node');
Sentry.init({ Sentry.init({
autoSessionTracking: false,
dsn: config.sentryDsn, dsn: config.sentryDsn,
release: packageJSON.version, release: packageJSON.version,
}); });
Sentry.configureScope((scope) => { Sentry.getCurrentScope().setExtras({
scope.setExtras({ is_pkg: !!(process as any).pkg,
is_pkg: !!(process as any).pkg, node_version: process.version,
node_version: process.version, platform: process.platform,
platform: process.platform,
});
}); });
return Sentry.getCurrentHub();
}); });
async function checkNodeVersion() { async function checkNodeVersion() {
@ -159,18 +155,12 @@ async function oclifRun(command: string[], options: AppOptions) {
/** CLI entrypoint. Called by the `bin/run.js` and `bin/dev.js` scripts. */ /** CLI entrypoint. Called by the `bin/run.js` and `bin/dev.js` scripts. */
export async function run(cliArgs = process.argv, options: AppOptions) { export async function run(cliArgs = process.argv, options: AppOptions) {
try { try {
const { setOfflineModeEnvVars, normalizeEnvVars, pkgExec } = await import( const { setOfflineModeEnvVars, normalizeEnvVars } = await import(
'./utils/bootstrap' './utils/bootstrap'
); );
setOfflineModeEnvVars(); setOfflineModeEnvVars();
normalizeEnvVars(); normalizeEnvVars();
// The 'pkgExec' special/internal command provides a Node.js interpreter
// for use of the standalone zip package. See pkgExec function.
if (cliArgs.length > 3 && cliArgs[2] === 'pkgExec') {
return pkgExec(cliArgs[3], cliArgs.slice(4));
}
await init(); await init();
// Look for commands that have been removed and if so, exit with a notice // Look for commands that have been removed and if so, exit with a notice

View File

@ -64,7 +64,12 @@ export default class ConfigInjectCmd extends Command {
); );
const config = await import('balena-config-json'); const config = await import('balena-config-json');
await config.write(drive, '', configJSON); await config.write(
drive,
// Will be removed in the next major of balena-config-json
undefined,
configJSON,
);
console.info('Done'); console.info('Done');
} }

View File

@ -54,7 +54,7 @@ export default class ConfigReadCmd extends Command {
await safeUmount(drive); await safeUmount(drive);
const config = await import('balena-config-json'); const config = await import('balena-config-json');
const configJSON = await config.read(drive, ''); const configJSON = await config.read(drive);
if (options.json) { if (options.json) {
console.log(JSON.stringify(configJSON, null, 4)); console.log(JSON.stringify(configJSON, null, 4));

View File

@ -62,7 +62,7 @@ export default class ConfigReconfigureCmd extends Command {
await safeUmount(drive); await safeUmount(drive);
const config = await import('balena-config-json'); const config = await import('balena-config-json');
const { uuid } = await config.read(drive, ''); const { uuid } = await config.read(drive);
await safeUmount(drive); await safeUmount(drive);
if (!uuid) { if (!uuid) {

View File

@ -64,14 +64,19 @@ export default class ConfigWriteCmd extends Command {
await safeUmount(drive); await safeUmount(drive);
const config = await import('balena-config-json'); const config = await import('balena-config-json');
const configJSON = await config.read(drive, ''); const configJSON = await config.read(drive);
console.info(`Setting ${params.key} to ${params.value}`); console.info(`Setting ${params.key} to ${params.value}`);
ConfigWriteCmd.updateConfigJson(configJSON, params.key, params.value); ConfigWriteCmd.updateConfigJson(configJSON, params.key, params.value);
await denyMount(drive, async () => { await denyMount(drive, async () => {
await safeUmount(drive); await safeUmount(drive);
await config.write(drive, '', configJSON); await config.write(
drive,
// Will be removed in the next major of balena-config-json
undefined,
configJSON,
);
}); });
console.info('Done'); console.info('Done');

View File

@ -77,103 +77,59 @@ export default class DeviceCmd extends Command {
const balena = getBalenaSdk(); const balena = getBalenaSdk();
const device = (await balena.models.device.get( let device: ExtendedDevice;
params.uuid, if (options.json) {
options.json const [deviceBase, deviceComputed] = await Promise.all([
? { balena.models.device.get(params.uuid, {
$select: [ $expand: {
'id', device_tag: {
'belongs_to__application', $select: ['tag_key', 'value'],
'belongs_to__user',
'actor',
'is_pinned_on__release',
'device_name',
'is_of__device_type',
'uuid',
'is_running__release',
'note',
'local_id',
'status',
'update_status',
'last_update_status_event',
'is_online',
'last_connectivity_event',
'is_connected_to_vpn',
'last_vpn_event',
'ip_address',
'mac_address',
'public_address',
'os_version',
'os_variant',
'supervisor_version',
'should_be_managed_by__release',
'should_be_operated_by__release',
'is_managed_by__service_instance',
'provisioning_progress',
'provisioning_state',
'download_progress',
'is_web_accessible',
'longitude',
'latitude',
'location',
'custom_longitude',
'custom_latitude',
'is_locked_until__date',
'is_accessible_by_support_until__date',
'created_at',
'modified_at',
'is_active',
'api_heartbeat_state',
'changed_api_heartbeat_state_on__date',
'memory_usage',
'memory_total',
'storage_block_device',
'storage_usage',
'storage_total',
'cpu_temp',
'cpu_usage',
'cpu_id',
'is_undervolted',
// explicit read
'overall_status',
'overall_progress',
'should_be_running__release',
],
$expand: {
device_tag: {
$select: ['tag_key', 'value'],
},
...expandForAppName.$expand,
}, },
} ...expandForAppName.$expand,
: {
$select: [
'device_name',
'id',
'overall_status',
'is_online',
'ip_address',
'mac_address',
'last_connectivity_event',
'uuid',
'supervisor_version',
'is_web_accessible',
'note',
'os_version',
'memory_usage',
'memory_total',
'public_address',
'storage_block_device',
'storage_usage',
'storage_total',
'cpu_usage',
'cpu_temp',
'cpu_id',
'is_undervolted',
],
...expandForAppName,
}, },
)) as ExtendedDevice; }),
balena.models.device.get(params.uuid, {
$select: [
'overall_status',
'overall_progress',
'should_be_running__release',
],
}),
]);
device = {
...deviceBase,
...deviceComputed,
} as ExtendedDevice;
} else {
device = (await balena.models.device.get(params.uuid, {
$select: [
'device_name',
'id',
'overall_status',
'is_online',
'ip_address',
'mac_address',
'last_connectivity_event',
'uuid',
'supervisor_version',
'is_web_accessible',
'note',
'os_version',
'memory_usage',
'memory_total',
'public_address',
'storage_block_device',
'storage_usage',
'storage_total',
'cpu_usage',
'cpu_temp',
'cpu_id',
'is_undervolted',
],
...expandForAppName,
})) as ExtendedDevice;
}
if (options.view) { if (options.view) {
const open = await import('open'); const open = await import('open');

View File

@ -162,8 +162,13 @@ Can be repeated to add multiple certificates.\
); );
} }
// Verify that image is not enabled for secure boot. First, confirm it // Verify that image is not enabled for secure boot. First, confirm it is
// is a secure boot image with an /opt/*.sig file in the rootA partition. // a secure boot image with a .sig file in the /opt directory of the rootA
// partition. For example, below are contents for generic-amd64 device type:
// $ ls -l opt
// total 864696
// -rw-r--r-- 1 root root 2378170368 Mar 26 09:14 balena-image-generic-amd64.balenaos-img
// -rw-r--r-- 1 root root 512 Mar 9 2018 balena-image-generic-amd64.balenaos-img.sig
const { explorePartition, BalenaPartition } = await import( const { explorePartition, BalenaPartition } = await import(
'../../utils/image-contents' '../../utils/image-contents'
); );
@ -187,7 +192,7 @@ Can be repeated to add multiple certificates.\
// Next verify that config.json enables secureboot. // Next verify that config.json enables secureboot.
if (isSecureBoot) { if (isSecureBoot) {
const { read } = await import('balena-config-json'); const { read } = await import('balena-config-json');
const config = await read(params.image, ''); const config = await read(params.image);
if (config.installer?.secureboot === true) { if (config.installer?.secureboot === true) {
throw new ExpectedError("Can't preload image with secure boot enabled"); throw new ExpectedError("Can't preload image with secure boot enabled");
} }

View File

@ -38,11 +38,11 @@ import { stripIndent } from './utils/lazy';
export async function trackCommand(commandSignature: string) { export async function trackCommand(commandSignature: string) {
try { try {
let Sentry: typeof import('@sentry/node'); let Sentry: typeof import('@sentry/node');
let scope: import('@sentry/node').Scope;
if (!process.env.BALENARC_NO_SENTRY) { if (!process.env.BALENARC_NO_SENTRY) {
Sentry = await import('@sentry/node'); Sentry = await import('@sentry/node');
Sentry.configureScope((scope) => { scope = Sentry.getCurrentScope();
scope.setExtra('command', commandSignature); scope.setExtra('command', commandSignature);
});
} }
const { getCachedUsername } = await import('./utils/bootstrap'); const { getCachedUsername } = await import('./utils/bootstrap');
let username: string | undefined; let username: string | undefined;
@ -52,11 +52,9 @@ export async function trackCommand(commandSignature: string) {
// ignore // ignore
} }
if (!process.env.BALENARC_NO_SENTRY) { if (!process.env.BALENARC_NO_SENTRY) {
Sentry!.configureScope((scope) => { scope!.setUser({
scope.setUser({ id: username,
id: username, username,
username,
});
}); });
} }
if ( if (

View File

@ -83,43 +83,6 @@ export function setOfflineModeEnvVars() {
} }
} }
/**
* Implements the 'pkgExec' command, used as a way to provide a Node.js
* interpreter for child_process.spawn()-like operations when the CLI is
* executing as a standalone zip package (built-in Node interpreter) and
* the system may not have a separate Node.js installation. A present use
* case is a patched version of the 'windosu' package that requires a
* Node.js interpreter to spawn a privileged child process.
*
* @param modFunc Path to a JS module that will be executed via require().
* The modFunc argument may optionally contain a function name separated
* by '::', for example '::main' in:
* 'C:\\snapshot\\balena-cli\\node_modules\\windosu\\lib\\pipe.js::main'
* in which case that function is executed in the require'd module.
* @param args Optional arguments to passed through process.argv and as
* arguments to the function specified via modFunc.
*/
export async function pkgExec(modFunc: string, args: string[]) {
const [modPath, funcName] = modFunc.split('::');
let replacedModPath = modPath;
const match = modPath
.replace(/\\/g, '/')
.match(/\/snapshot\/balena-cli\/(.+)/);
if (match) {
replacedModPath = `../${match[1]}`;
}
process.argv = [process.argv[0], process.argv[1], ...args];
try {
const mod: any = await import(replacedModPath);
if (funcName) {
await mod[funcName](...args);
}
} catch (err) {
console.error(`Error executing pkgExec "${modFunc}" [${args.join()}]`);
console.error(err);
}
}
export interface CachedUsername { export interface CachedUsername {
token: string; token: string;
username: string; username: string;

View File

@ -1322,6 +1322,9 @@ async function pushAndUpdateServiceImages(
} }
} }
// Error messages are limited to 300KB characters in the API, so we truncate longer ones.
const MAX_ERROR_MESSAGE_LENGTH = 300_000;
async function pushServiceImages( async function pushServiceImages(
docker: Dockerode, docker: Dockerode,
logger: Logger, logger: Logger,
@ -1344,23 +1347,34 @@ async function pushServiceImages(
delete serviceImage.build_log; delete serviceImage.build_log;
} }
await releaseMod.updateImage( // These are the only update-able image fields in bC atm, and passing
pineClient, // the whole image object in v7+ would result the allowlist to reject the request.
serviceImage.id, const imagePayload = _.pick(serviceImage, [
// These are the only update-able image fields in bC atm, and passing 'end_timestamp',
// the whole image object in v7+ would result the allowlist to reject the request. 'project_type',
_.pick(serviceImage, [ 'error_message',
'end_timestamp', 'build_log',
'project_type', 'push_timestamp',
'error_message', 'status',
'build_log', 'content_hash',
'push_timestamp', 'dockerfile',
'status', 'image_size',
'content_hash', ]);
'dockerfile',
'image_size', if (
]), typeof imagePayload.error_message === 'string' &&
); imagePayload.error_message.length > MAX_ERROR_MESSAGE_LENGTH
) {
logger.logDebug(
`Truncating error message of image ${serviceImage.is_stored_at__image_location} to ${MAX_ERROR_MESSAGE_LENGTH} characters.`,
);
imagePayload.error_message = imagePayload.error_message.substring(
0,
MAX_ERROR_MESSAGE_LENGTH,
);
}
await releaseMod.updateImage(pineClient, serviceImage.id, imagePayload);
}, },
); );
} }
@ -1596,7 +1610,9 @@ function buildProgressAdapter(inline: boolean) {
return; return;
} }
if (!str.startsWith('Successfully tagged ')) { // We want to keep the regex match instead of startsWith as it also works with buffers
// eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
if (!/^Successfully tagged /.test(str)) {
const match = stepRegex.exec(str); const match = stepRegex.exec(str);
if (match) { if (match) {
step = match[1]; step = match[1];

View File

@ -19,7 +19,7 @@ import { getVisuals } from './lazy';
import { promisify } from 'util'; import { promisify } from 'util';
import type * as Dockerode from 'dockerode'; import type * as Dockerode from 'dockerode';
import type Logger = require('./logger'); import type Logger = require('./logger');
import type { Request } from 'request'; import type got from 'got';
const getBuilderPushEndpoint = function ( const getBuilderPushEndpoint = function (
baseUrl: string, baseUrl: string,
@ -75,7 +75,10 @@ const showPushProgress = function (message: string) {
return progressBar; return progressBar;
}; };
const uploadToPromise = (uploadRequest: Request, logger: Logger) => const uploadToPromise = (
uploadRequest: ReturnType<typeof got.stream.post>,
logger: Logger,
) =>
new Promise<{ buildId: number }>(function (resolve, reject) { new Promise<{ buildId: number }>(function (resolve, reject) {
uploadRequest.on('error', reject).on('data', function handleMessage(data) { uploadRequest.on('error', reject).on('data', function handleMessage(data) {
let obj; let obj;
@ -106,10 +109,7 @@ const uploadToPromise = (uploadRequest: Request, logger: Logger) =>
}); });
}); });
/** const uploadImage = async function (
* @returns {Promise<{ buildId: number }>}
*/
const uploadImage = function (
imageStream: NodeJS.ReadableStream & { length: number }, imageStream: NodeJS.ReadableStream & { length: number },
token: string, token: string,
username: string, username: string,
@ -117,10 +117,9 @@ const uploadImage = function (
appName: string, appName: string,
logger: Logger, logger: Logger,
): Promise<{ buildId: number }> { ): Promise<{ buildId: number }> {
const request = require('request') as typeof import('request'); const { default: got } = await import('got');
const progressStream = const progressStream = await import('progress-stream');
require('progress-stream') as typeof import('progress-stream'); const zlib = await import('zlib');
const zlib = require('zlib') as typeof import('zlib');
// Need to strip off the newline // Need to strip off the newline
const progressMessage = logger const progressMessage = logger
@ -141,25 +140,26 @@ const uploadImage = function (
), ),
); );
const uploadRequest = request.post({ const uploadRequest = got.stream.post(
url: getBuilderPushEndpoint(url, username, appName), getBuilderPushEndpoint(url, username, appName),
headers: { {
'Content-Encoding': 'gzip', headers: {
'Content-Encoding': 'gzip',
Authorization: `Bearer ${token}`,
},
body: streamWithProgress.pipe(
zlib.createGzip({
level: 6,
}),
),
throwHttpErrors: false,
}, },
auth: { );
bearer: token,
},
body: streamWithProgress.pipe(
zlib.createGzip({
level: 6,
}),
),
});
return uploadToPromise(uploadRequest, logger); return uploadToPromise(uploadRequest, logger);
}; };
const uploadLogs = function ( const uploadLogs = async function (
logs: string, logs: string,
token: string, token: string,
url: string, url: string,
@ -167,14 +167,14 @@ const uploadLogs = function (
username: string, username: string,
appName: string, appName: string,
) { ) {
const request = require('request') as typeof import('request'); const { default: got } = await import('got');
return request.post({ return got.post(getBuilderLogPushEndpoint(url, buildId, username, appName), {
json: true, headers: {
url: getBuilderLogPushEndpoint(url, buildId, username, appName), Authorization: `Bearer ${token}`,
auth: {
bearer: token,
}, },
body: Buffer.from(logs), body: Buffer.from(logs),
responseType: 'json',
throwHttpErrors: false,
}); });
}; };
@ -232,7 +232,7 @@ export const deployLegacy = async function (
username, username,
appName, appName,
]); ]);
uploadLogs(...args); await uploadLogs(...args);
} }
return buildId; return buildId;

View File

@ -15,12 +15,12 @@
* limitations under the License. * limitations under the License.
*/ */
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as request from 'request';
import type * as Stream from 'stream';
import { retry } from '../helpers'; import { retry } from '../helpers';
import Logger = require('../logger'); import Logger = require('../logger');
import * as ApiErrors from './errors'; import * as ApiErrors from './errors';
import { getBalenaSdk } from '../lazy';
import type { BalenaSDK } from 'balena-sdk';
export interface DeviceResponse { export interface DeviceResponse {
[key: string]: any; [key: string]: any;
@ -80,9 +80,9 @@ export class DeviceAPI {
} }
// Either return nothing, or throw an error with the info // Either return nothing, or throw an error with the info
public async setTargetState(state: any): Promise<void> { public async setTargetState(state: Record<string, any>) {
const url = this.getUrlForAction('setTargetState'); const url = this.getUrlForAction('setTargetState');
return DeviceAPI.promisifiedRequest( await DeviceAPI.sendRequest(
{ {
method: 'POST', method: 'POST',
url, url,
@ -96,37 +96,37 @@ export class DeviceAPI {
public async getTargetState() { public async getTargetState() {
const url = this.getUrlForAction('getTargetState'); const url = this.getUrlForAction('getTargetState');
return DeviceAPI.promisifiedRequest( return await DeviceAPI.sendRequest(
{ {
method: 'GET', method: 'GET',
url, url,
json: true, json: true,
}, },
this.logger, this.logger,
).then((body) => { ).then(({ state }: { state: Record<string, any> }) => {
return body.state; return state;
}); });
} }
public async getDeviceInformation(): Promise<DeviceInfo> { public async getDeviceInformation() {
const url = this.getUrlForAction('getDeviceInformation'); const url = this.getUrlForAction('getDeviceInformation');
return DeviceAPI.promisifiedRequest( return await DeviceAPI.sendRequest(
{ {
method: 'GET', method: 'GET',
url, url,
json: true, json: true,
}, },
this.logger, this.logger,
).then((body) => { ).then(({ info }: { info: DeviceInfo }) => {
return body.info; return info;
}); });
} }
public async getContainerId(serviceName: string): Promise<string> { public async getContainerId(serviceName: string): Promise<string> {
const url = this.getUrlForAction('containerId'); const url = this.getUrlForAction('containerId');
const body = await DeviceAPI.promisifiedRequest( const body = await DeviceAPI.sendRequest(
{ {
method: 'GET', method: 'GET',
url, url,
@ -146,10 +146,10 @@ export class DeviceAPI {
return body.containerId; return body.containerId;
} }
public async ping(): Promise<void> { public async ping() {
const url = this.getUrlForAction('ping'); const url = this.getUrlForAction('ping');
return DeviceAPI.promisifiedRequest( await DeviceAPI.sendRequest(
{ {
method: 'GET', method: 'GET',
url, url,
@ -158,10 +158,10 @@ export class DeviceAPI {
); );
} }
public getVersion(): Promise<string> { public async getVersion(): Promise<string> {
const url = this.getUrlForAction('version'); const url = this.getUrlForAction('version');
return DeviceAPI.promisifiedRequest({ return await DeviceAPI.sendRequest({
method: 'GET', method: 'GET',
url, url,
json: true, json: true,
@ -176,10 +176,10 @@ export class DeviceAPI {
}); });
} }
public getStatus(): Promise<Status> { public async getStatus() {
const url = this.getUrlForAction('status'); const url = this.getUrlForAction('status');
return DeviceAPI.promisifiedRequest({ return await DeviceAPI.sendRequest({
method: 'GET', method: 'GET',
url, url,
json: true, json: true,
@ -194,96 +194,60 @@ export class DeviceAPI {
}); });
} }
public getLogStream(): Promise<Stream.Readable> { public async getLogStream() {
const url = this.getUrlForAction('logs'); const url = this.getUrlForAction('logs');
const sdk = getBalenaSdk();
// Don't use the promisified version here as we want to stream the output const stream = await sdk.request.stream({ url });
return new Promise((resolve, reject) => { stream.on('response', (res) => {
const req = request.get(url); if (res.statusCode !== 200) {
throw new ApiErrors.DeviceAPIError(
req.on('error', reject).on('response', (res) => { 'Non-200 response from log streaming endpoint',
if (res.statusCode !== 200) { );
reject( }
new ApiErrors.DeviceAPIError( res.socket.setKeepAlive(true, 1000);
'Non-200 response from log streaming endpoint',
),
);
return;
}
try {
res.socket.setKeepAlive(true, 1000);
} catch (error) {
reject(error as Error);
}
resolve(res);
});
}); });
return stream;
} }
private getUrlForAction(action: keyof typeof deviceEndpoints): string { private getUrlForAction(action: keyof typeof deviceEndpoints) {
return `${this.deviceAddress}${deviceEndpoints[action]}`; return `${this.deviceAddress}${deviceEndpoints[action]}`;
} }
// A helper method for promisifying general (non-streaming) requests. Streaming // A helper method for promisifying general (non-streaming) requests. Streaming
// requests should use a seperate setup // requests should use a seperate setup
private static async promisifiedRequest< private static async sendRequest(
T extends Parameters<typeof request>[0], opts: Parameters<BalenaSDK['request']['send']>[number],
>(opts: T, logger?: Logger): Promise<any> { logger?: Logger,
interface ObjectWithUrl { ) {
url?: string; if (logger != null && opts.url != null) {
} logger.logDebug(`Sending request to ${opts.url}`);
if (logger != null) {
let url: string | null = null;
if (_.isObject(opts) && (opts as ObjectWithUrl).url != null) {
// the `as string` shouldn't be necessary, but the type system
// is getting a little confused
url = (opts as ObjectWithUrl).url!;
} else if (typeof opts === 'string') {
url = opts;
}
if (url != null) {
logger.logDebug(`Sending request to ${url}`);
}
} }
const sdk = getBalenaSdk();
const doRequest = async () => { const doRequest = async () => {
return await new Promise((resolve, reject) => { const response = await sdk.request.send(opts);
return request(opts, (err, response, body) => { const bodyError =
if (err) { typeof response.body === 'string'
reject(err as Error); ? response.body
return; : response.body.message;
} switch (response.statusCode) {
switch (response.statusCode) { case 200:
case 200: { return response.body;
resolve(body); case 400:
return; throw new ApiErrors.BadRequestDeviceAPIError(bodyError);
} case 503:
case 400: { throw new ApiErrors.ServiceUnavailableAPIError(bodyError);
reject(new ApiErrors.BadRequestDeviceAPIError(body.message)); default:
return; new ApiErrors.DeviceAPIError(bodyError);
} }
case 503: {
reject(new ApiErrors.ServiceUnavailableAPIError(body.message));
return;
}
default: {
reject(new ApiErrors.DeviceAPIError(body.message));
return;
}
}
});
});
}; };
return await retry({ return await retry({
func: doRequest, func: doRequest,
initialDelayMs: 2000, initialDelayMs: 2000,
maxAttempts: 6, maxAttempts: 6,
label: `Supervisor API (${opts.method} ${(opts as any).url})`, label: `Supervisor API (${opts.method} ${opts.url})`,
}); });
} }
} }
export default DeviceAPI;

View File

@ -603,11 +603,11 @@ function getImageNameFromTask(task: BuildTask): string {
} }
export function generateTargetState( export function generateTargetState(
currentTargetState: any, currentTargetState: Record<string, any>,
composition: Composition, composition: Composition,
buildTasks: BuildTask[], buildTasks: BuildTask[],
env: ParsedEnvironment, env: ParsedEnvironment,
): any { ) {
const keyedBuildTasks = _.keyBy(buildTasks, 'serviceName'); const keyedBuildTasks = _.keyBy(buildTasks, 'serviceName');
const services: { [serviceId: string]: any } = {}; const services: { [serviceId: string]: any } = {};

View File

@ -28,7 +28,7 @@ import { instanceOf } from '../../errors';
import Logger = require('../logger'); import Logger = require('../logger');
import { Dockerfile } from 'livepush'; import { Dockerfile } from 'livepush';
import type DeviceAPI from './api'; import type { DeviceAPI } from './api';
import type { DeviceInfo, Status } from './api'; import type { DeviceInfo, Status } from './api';
import type { DeviceDeployOptions } from './deploy'; import type { DeviceDeployOptions } from './deploy';
import { generateTargetState, rebuildSingleTask } from './deploy'; import { generateTargetState, rebuildSingleTask } from './deploy';

View File

@ -159,9 +159,9 @@ especially discouraged in scripts (e.g. CI environments).`;
export const devModeInfo = `\ export const devModeInfo = `\
The '--dev' option is used to configure balenaOS to operate in development mode, The '--dev' option is used to configure balenaOS to operate in development mode,
allowing anauthenticated root ssh access and exposing network ports such as allowing unauthenticated root ssh access and exposing network ports such as
balenaEngine's 2375 (unencrypted). This option causes \`"developmentMode": true\` balenaEngine's 2375 (unencrypted). This option causes \`"developmentMode": true\`
to be inserted in the 'config.json' file in the image's boot partion. Development to be inserted in the 'config.json' file in the image's boot partition. Development
mode (as a configurable option) is applicable to balenaOS releases from early mode (as a configurable option) is applicable to balenaOS releases from early
2022. Older releases have separate development and production balenaOS images 2022. Older releases have separate development and production balenaOS images
that cannot be reconfigured through 'config.json' or the '--dev' option. Do not that cannot be reconfigured through 'config.json' or the '--dev' option. Do not

View File

@ -94,7 +94,7 @@ async function installQemu(arch: string, qemuPath: string) {
const urlVersion = encodeURIComponent(QEMU_VERSION); const urlVersion = encodeURIComponent(QEMU_VERSION);
const qemuUrl = `https://github.com/balena-io/qemu/releases/download/${urlVersion}/${urlFile}`; const qemuUrl = `https://github.com/balena-io/qemu/releases/download/${urlVersion}/${urlFile}`;
const request = await import('request'); const { default: got } = await import('got');
const fs = await import('fs'); const fs = await import('fs');
const zlib = await import('zlib'); const zlib = await import('zlib');
const tar = await import('tar-stream'); const tar = await import('tar-stream');
@ -117,7 +117,8 @@ async function installQemu(arch: string, qemuPath: string) {
reject(err as Error); reject(err as Error);
} }
}); });
request(qemuUrl) got.stream
.get(qemuUrl)
.on('error', reject) .on('error', reject)
.pipe(zlib.createGunzip()) .pipe(zlib.createGunzip())
.on('error', reject) .on('error', reject)

View File

@ -16,7 +16,8 @@ limitations under the License.
import type { BalenaSDK } from 'balena-sdk'; import type { BalenaSDK } from 'balena-sdk';
import * as JSONStream from 'JSONStream'; import * as JSONStream from 'JSONStream';
import * as readline from 'readline'; import * as readline from 'readline';
import * as request from 'request'; import type { PlainResponse } from 'got';
import type got from 'got';
import type { RegistrySecrets } from '@balena/compose/dist/multibuild'; import type { RegistrySecrets } from '@balena/compose/dist/multibuild';
import type * as Stream from 'stream'; import type * as Stream from 'stream';
import streamToPromise = require('stream-to-promise'); import streamToPromise = require('stream-to-promise');
@ -119,7 +120,7 @@ export async function startRemoteBuild(
} catch (err) { } catch (err) {
console.error(err.message); console.error(err.message);
} finally { } finally {
buildRequest.abort(); buildRequest.destroy();
const sigintErr = new SIGINTError('Build aborted on SIGINT signal'); const sigintErr = new SIGINTError('Build aborted on SIGINT signal');
sigintErr.code = 'SIGINT'; sigintErr.code = 'SIGINT';
stream.emit('error', sigintErr); stream.emit('error', sigintErr);
@ -337,32 +338,29 @@ async function getTarStream(build: RemoteBuild): Promise<Stream.Readable> {
/** /**
* Initiate a POST HTTP request to the remote builder and add some event * Initiate a POST HTTP request to the remote builder and add some event
* listeners. * listeners.
*
* ¡! Note: this function must be synchronous because of a bug in the `request`
* library that requires the following two steps to take place in the same
* iteration of Node's event loop: (1) adding a listener for the 'response'
* event and (2) calling request.pipe():
* https://github.com/request/request/issues/887
*/ */
function createRemoteBuildRequest( async function createRemoteBuildRequest(
build: RemoteBuild, build: RemoteBuild,
tarStream: Stream.Readable, tarStream: Stream.Readable,
builderUrl: string, builderUrl: string,
onError: (error: Error) => void, onError: (error: Error) => void,
): request.Request { ) {
const zlib = require('zlib') as typeof import('zlib'); const { default: got } = await import('got');
const zlib = await import('zlib');
if (DEBUG_MODE) { if (DEBUG_MODE) {
console.error(`[debug] Connecting to builder at ${builderUrl}`); console.error(`[debug] Connecting to builder at ${builderUrl}`);
} }
return request return got.stream
.post({ .post(builderUrl, {
url: builderUrl, headers: {
auth: { bearer: build.auth }, Authorization: `Bearer ${build.auth}`,
headers: { 'Content-Encoding': 'gzip' }, 'Content-Encoding': 'gzip',
},
body: tarStream.pipe(zlib.createGzip({ level: 6 })), body: tarStream.pipe(zlib.createGzip({ level: 6 })),
throwHttpErrors: false,
}) })
.once('error', onError) // `.once` because the handler re-emits .once('error', onError) // `.once` because the handler re-emits
.once('response', (response: request.RequestResponse) => { .once('response', (response: PlainResponse) => {
if (response.statusCode >= 100 && response.statusCode < 400) { if (response.statusCode >= 100 && response.statusCode < 400) {
if (DEBUG_MODE) { if (DEBUG_MODE) {
console.error( console.error(
@ -374,8 +372,8 @@ function createRemoteBuildRequest(
'Remote builder responded with HTTP error:', 'Remote builder responded with HTTP error:',
`${response.statusCode} ${response.statusMessage}`, `${response.statusCode} ${response.statusMessage}`,
]; ];
if (response.body) { if (response.rawBody) {
msgArr.push(response.body); msgArr.push(response.rawBody.toString());
} }
onError(new ExpectedError(msgArr.join('\n'))); onError(new ExpectedError(msgArr.join('\n')));
} }
@ -384,7 +382,7 @@ function createRemoteBuildRequest(
async function getRemoteBuildStream( async function getRemoteBuildStream(
build: RemoteBuild, build: RemoteBuild,
): Promise<[request.Request, Stream.Stream]> { ): Promise<[ReturnType<typeof got.stream.post>, Stream.Stream]> {
const builderUrl = await getBuilderEndpoint( const builderUrl = await getBuilderEndpoint(
build.baseUrl, build.baseUrl,
build.appSlug, build.appSlug,
@ -412,7 +410,7 @@ async function getRemoteBuildStream(
} }
const tarStream = await getTarStream(build); const tarStream = await getTarStream(build);
const buildRequest = createRemoteBuildRequest( const buildRequest = await createRemoteBuildRequest(
build, build,
tarStream, tarStream,
builderUrl, builderUrl,

View File

@ -20,7 +20,7 @@ import * as chaiAsPromised from 'chai-as-promised';
import * as ejs from 'ejs'; import * as ejs from 'ejs';
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import * as request from 'request'; import got from 'got';
import * as sinon from 'sinon'; import * as sinon from 'sinon';
import { LoginServer } from '../../build/auth/server'; import { LoginServer } from '../../build/auth/server';
@ -61,38 +61,30 @@ describe('Login server:', function () {
server.shutdown(); server.shutdown();
}); });
async function testLogin(opt: { async function testLogin({
verb = 'post',
...opt
}: {
expectedBody: string; expectedBody: string;
expectedErrorMsg?: string; expectedErrorMsg?: string;
expectedStatusCode: number; expectedStatusCode: number;
expectedToken: string; expectedToken: string;
urlPath?: string; urlPath?: string;
verb?: string; verb?: 'post' | 'put';
}) { }) {
opt.urlPath = opt.urlPath ?? addr.urlPath; opt.urlPath = opt.urlPath ?? addr.urlPath;
const post = opt.verb const res = await got[verb](
? ((request as any)[opt.verb] as typeof request.post) `http://${addr.host}:${addr.port}${opt.urlPath}`,
: request.post; {
await new Promise<void>((resolve, reject) => { form: {
post( token: opt.expectedToken,
`http://${addr.host}:${addr.port}${opt.urlPath}`,
{
form: {
token: opt.expectedToken,
},
}, },
function (error, response, body) { throwHttpErrors: false,
try { },
expect(error).to.not.exist; );
expect(response.statusCode).to.equal(opt.expectedStatusCode);
expect(body).to.equal(opt.expectedBody); expect(res.body).to.equal(opt.expectedBody);
resolve(); expect(res.statusCode).to.equal(opt.expectedStatusCode);
} catch (err) {
reject(err as Error);
}
},
);
});
try { try {
const token = await server.awaitForToken(); const token = await server.awaitForToken();
@ -127,7 +119,7 @@ describe('Login server:', function () {
expectedStatusCode: 404, expectedStatusCode: 404,
expectedToken: tokens.johndoe.token, expectedToken: tokens.johndoe.token,
expectedErrorMsg: 'Unknown path or verb', expectedErrorMsg: 'Unknown path or verb',
verb: 'get', verb: 'put',
}); });
}); });

View File

@ -442,6 +442,93 @@ describe('balena build', function () {
}); });
}); });
it('should create the expected tar stream (docker-compose --nologs)', async () => {
const projectPath = path.join(projectsPath, 'docker-compose', 'basic');
const service1Dockerfile = (
await fs.readFile(
path.join(projectPath, 'service1', 'Dockerfile.template'),
'utf8',
)
).replace('%%BALENA_MACHINE_NAME%%', 'nuc');
const expectedFilesByService: ExpectedTarStreamFilesByService = {
service1: {
Dockerfile: {
contents: service1Dockerfile,
fileSize: service1Dockerfile.length,
type: 'file',
},
'Dockerfile.template': { fileSize: 144, type: 'file' },
'file1.sh': { fileSize: 12, type: 'file' },
},
service2: {
'Dockerfile-alt': { fileSize: 13, type: 'file' },
'file2-crlf.sh': {
fileSize: isWindows ? 12 : 14,
testStream: isWindows ? expectStreamNoCRLF : undefined,
type: 'file',
},
'src/file1.sh': { fileSize: 12, type: 'file' },
},
};
const responseFilename = 'build-POST.json';
const responseBody = await fs.readFile(
path.join(dockerResponsePath, responseFilename),
'utf8',
);
const expectedQueryParamsByService = {
service1: Object.entries(
_.merge({}, commonComposeQueryParams, {
buildargs: {
COMPOSE_ARG: 'A',
barg: 'b',
SERVICE1_VAR: 'This is a service specific variable',
},
cachefrom: ['my/img1', 'my/img2'],
}),
),
service2: Object.entries(
_.merge({}, commonComposeQueryParamsIntel, {
buildargs: {
COMPOSE_ARG: 'A',
barg: 'b',
},
cachefrom: ['my/img1', 'my/img2'],
dockerfile: 'Dockerfile-alt',
}),
),
};
const expectedResponseLines: string[] = [
...commonResponseLines[responseFilename],
...getDockerignoreWarn1(
[path.join(projectPath, 'service2', '.dockerignore')],
'build',
),
];
if (isWindows) {
expectedResponseLines.push(
`[Info] Converting line endings CRLF -> LF for file: ${path.join(
projectPath,
'service2',
'file2-crlf.sh',
)}`,
);
}
docker.expectGetInfo({});
docker.expectGetManifestNucAlpine();
docker.expectGetManifestBusybox();
await testDockerBuildStream({
commandLine: `build ${projectPath} --deviceType nuc --arch amd64 -B COMPOSE_ARG=A -B barg=b --cache-from my/img1,my/img2 --nologs`,
dockerMock: docker,
expectedFilesByService,
expectedQueryParamsByService,
expectedResponseLines,
projectPath,
responseBody,
responseCode: 200,
services: ['service1', 'service2'],
});
});
it('should create the expected tar stream (docker-compose, --multi-dockerignore)', async () => { it('should create the expected tar stream (docker-compose, --multi-dockerignore)', async () => {
const projectPath = path.join(projectsPath, 'docker-compose', 'basic'); const projectPath = path.join(projectsPath, 'docker-compose', 'basic');
const service1Dockerfile = ( const service1Dockerfile = (

View File

@ -27,7 +27,7 @@ import * as sinon from 'sinon';
import { BalenaAPIMock } from '../nock/balena-api-mock'; import { BalenaAPIMock } from '../nock/balena-api-mock';
import { expectStreamNoCRLF, testDockerBuildStream } from '../docker-build'; import { expectStreamNoCRLF, testDockerBuildStream } from '../docker-build';
import { DockerMock, dockerResponsePath } from '../nock/docker-mock'; import { DockerMock, dockerResponsePath } from '../nock/docker-mock';
import { cleanOutput, runCommand, switchSentry } from '../helpers'; import { cleanOutput, runCommand } from '../helpers';
import type { import type {
ExpectedTarStreamFiles, ExpectedTarStreamFiles,
ExpectedTarStreamFilesByService, ExpectedTarStreamFilesByService,
@ -262,7 +262,6 @@ describe('balena deploy', function () {
}); });
it('should update a release with status="failed" on error (single container)', async () => { it('should update a release with status="failed" on error (single container)', async () => {
let sentryStatus: boolean | undefined;
const projectPath = path.join(projectsPath, 'no-docker-compose', 'basic'); const projectPath = path.join(projectsPath, 'no-docker-compose', 'basic');
const expectedFiles: ExpectedTarStreamFiles = { const expectedFiles: ExpectedTarStreamFiles = {
'src/.dockerignore': { fileSize: 16, type: 'file' }, 'src/.dockerignore': { fileSize: 16, type: 'file' },
@ -319,7 +318,6 @@ describe('balena deploy', function () {
api.expectPostImageLabel(); api.expectPostImageLabel();
try { try {
sentryStatus = await switchSentry(false);
sinon.stub(process, 'exit'); sinon.stub(process, 'exit');
await testDockerBuildStream({ await testDockerBuildStream({
@ -337,9 +335,8 @@ describe('balena deploy', function () {
}); });
expect(failedImagePatchRequests).to.equal(maxRequestRetries); expect(failedImagePatchRequests).to.equal(maxRequestRetries);
} finally { } finally {
await switchSentry(sentryStatus); // We mock process.exit and need to force cast it to a SinonStub to restore it
// @ts-expect-error claims restore does not exist (process.exit as unknown as sinon.SinonStub).restore();
process.exit.restore();
} }
}); });

View File

@ -114,6 +114,14 @@ describe('balena device', function () {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}); });
api.scope
.get(
/^\/v\d+\/device\?.+&\$select=overall_status,overall_progress,should_be_running__release$/,
)
.replyWithFile(200, path.join(apiResponsePath, 'device.json'), {
'Content-Type': 'application/json',
});
const { out, err } = await runCommand('device 27fda508c --json'); const { out, err } = await runCommand('device 27fda508c --json');
expect(err).to.be.empty; expect(err).to.be.empty;
const json = JSON.parse(out.join('')); const json = JSON.parse(out.join(''));

View File

@ -21,8 +21,6 @@ import { BalenaAPIMock } from '../../nock/balena-api-mock';
import { cleanOutput, runCommand } from '../../helpers'; import { cleanOutput, runCommand } from '../../helpers';
import { SupervisorMock } from '../../nock/supervisor-mock'; import { SupervisorMock } from '../../nock/supervisor-mock';
const itS = process.env.BALENA_CLI_TEST_TYPE === 'standalone' ? it : it.skip;
describe('balena device logs', function () { describe('balena device logs', function () {
let api: BalenaAPIMock; let api: BalenaAPIMock;
let supervisor: SupervisorMock; let supervisor: SupervisorMock;
@ -39,10 +37,7 @@ describe('balena device logs', function () {
supervisor.done(); supervisor.done();
}); });
// skip non-standalone tests because nock's mock socket causes the error: it('should reach the expected endpoints on a local device', async () => {
// "setKeepAliveInterval expects an instance of socket as its first argument"
// in utils/device/api.ts: NetKeepalive.setKeepAliveInterval(sock, 5000);
itS('should reach the expected endpoints on a local device', async () => {
supervisor.expectGetPing(); supervisor.expectGetPing();
supervisor.expectGetLogs(); supervisor.expectGetLogs();
supervisor.expectGetLogs(); supervisor.expectGetLogs();

View File

@ -17,13 +17,21 @@
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as path from 'path'; import * as path from 'path';
import * as fs from 'fs';
import { createGunzip } from 'zlib';
import * as packageJSON from '../package.json'; import * as packageJSON from '../package.json';
import { getNodeEngineVersionWarn } from '../build/utils/messages'; import { getNodeEngineVersionWarn } from '../build/utils/messages';
import { warnify } from '../build/utils/messages'; import { warnify } from '../build/utils/messages';
const balenaExe = process.platform === 'win32' ? 'balena.exe' : 'balena'; const standalonePath = path.resolve(
const standalonePath = path.resolve(__dirname, '..', 'build-bin', balenaExe); __dirname,
'..',
'dist',
'balena',
'bin',
'balena',
);
export interface TestOutput { export interface TestOutput {
err: string[]; // stderr err: string[]; // stderr
@ -164,11 +172,11 @@ async function runCommandInSubprocess(
// override default proxy exclusion to allow proxying of requests to 127.0.0.1 // override default proxy exclusion to allow proxying of requests to 127.0.0.1
BALENARC_DO_PROXY: '127.0.0.1,localhost', BALENARC_DO_PROXY: '127.0.0.1,localhost',
}; };
const { execFile } = await import('child_process'); const { exec } = await import('child_process');
await new Promise<void>((resolve) => { await new Promise<void>((resolve) => {
const child = execFile( const child = exec(
standalonePath, `${standalonePath} ${cmd}`,
cmd.split(' ').filter((c) => c),
{ env: { ...process.env, ...addedEnvs } }, { env: { ...process.env, ...addedEnvs } },
($error, $stdout, $stderr) => { ($error, $stdout, $stderr) => {
stderr = $stderr || ''; stderr = $stderr || '';
@ -213,6 +221,67 @@ ${$error}`;
}; };
} }
async function extractTarStream() {
if (
fs.existsSync(path.join(__dirname, '..', 'dist', 'balena', 'bin', 'balena'))
) {
return;
}
const tar = await import('tar-stream');
const version = 'v' + packageJSON.version;
const arch = process.arch;
const platform =
process.platform === 'win32'
? 'windows'
: process.platform === 'darwin'
? 'macOS'
: process.platform;
const sourceFile = path.join(
__dirname,
'..',
'dist',
`balena-cli-${version}-${platform}-${arch}-standalone.tar.gz`,
);
const destinationDir = path.join(__dirname, '..', 'dist');
const extract = tar.extract();
return new Promise((resolve, reject) => {
extract.on('entry', (header, stream, next) => {
const outputPath = path.join(destinationDir, header.name);
if (header.type === 'directory') {
fs.mkdirSync(outputPath, { recursive: true });
next();
} else {
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
const fileStream = fs.createWriteStream(outputPath);
stream.pipe(fileStream);
fileStream.on('close', () => {
if (header.mode) {
fs.chmodSync(outputPath, header.mode); // Set file permissions
}
next();
});
fileStream.on('error', reject);
}
});
extract.on('finish', resolve);
extract.on('error', reject);
fs.createReadStream(sourceFile)
.pipe(createGunzip())
.pipe(extract)
.on('error', reject);
});
}
/** /**
* Run a CLI command and capture its stdout, stderr and exit code for testing. * Run a CLI command and capture its stdout, stderr and exit code for testing.
* If the BALENA_CLI_TEST_TYPE env var is set to 'standalone', then the command * If the BALENA_CLI_TEST_TYPE env var is set to 'standalone', then the command
@ -223,6 +292,7 @@ ${$error}`;
*/ */
export async function runCommand(cmd: string): Promise<TestOutput> { export async function runCommand(cmd: string): Promise<TestOutput> {
if (process.env.BALENA_CLI_TEST_TYPE === 'standalone') { if (process.env.BALENA_CLI_TEST_TYPE === 'standalone') {
await extractTarStream();
const semver = await import('semver'); const semver = await import('semver');
if (semver.lt(process.version, '10.16.0')) { if (semver.lt(process.version, '10.16.0')) {
throw new Error( throw new Error(
@ -347,15 +417,3 @@ export function deepJsonParse(data: any): any {
} }
return data; return data;
} }
export async function switchSentry(
enabled: boolean | undefined,
): Promise<boolean | undefined> {
const balenaCLI = await import('../build/app');
const sentryOpts = (await balenaCLI.setupSentry()).getClient()?.getOptions();
if (sentryOpts) {
const sentryStatus = sentryOpts.enabled;
sentryOpts.enabled = enabled;
return sentryStatus;
}
}

View File

@ -41,23 +41,18 @@ export class BuilderMock extends NockMock {
checkBuildRequestBody: (requestBody: string | Buffer) => Promise<void>; checkBuildRequestBody: (requestBody: string | Buffer) => Promise<void>;
}) { }) {
this.optPost(/^\/v3\/build($|[(?])/, opts).reply( this.optPost(/^\/v3\/build($|[(?])/, opts).reply(
async function (uri, requestBody, callback) { async function (uri, requestBody) {
let error: Error | null = null; await opts.checkURI(uri);
try { if (typeof requestBody === 'string') {
await opts.checkURI(uri); const gzipped = Buffer.from(requestBody, 'hex');
if (typeof requestBody === 'string') { const gunzipped = await gunzipAsync(gzipped);
const gzipped = Buffer.from(requestBody, 'hex'); await opts.checkBuildRequestBody(gunzipped);
const gunzipped = await gunzipAsync(gzipped); return [opts.responseCode, opts.responseBody];
await opts.checkBuildRequestBody(gunzipped); } else {
} else { throw new Error(
throw new Error( `unexpected requestBody type "${typeof requestBody}"`,
`unexpected requestBody type "${typeof requestBody}"`, );
);
}
} catch (err) {
error = err;
} }
callback(error, [opts.responseCode, opts.responseBody]);
}, },
); );
} }

View File

@ -81,21 +81,14 @@ export class DockerMock extends NockMock {
this.optPost( this.optPost(
new RegExp(`^/build\\?(|.+&)${qs.stringify({ t: opts.tag })}&`), new RegExp(`^/build\\?(|.+&)${qs.stringify({ t: opts.tag })}&`),
opts, opts,
).reply(async function (uri, requestBody, cb) { ).reply(async function (uri, requestBody) {
let error: Error | null = null; await opts.checkURI(uri);
try { if (typeof requestBody === 'string') {
await opts.checkURI(uri); await opts.checkBuildRequestBody(requestBody);
if (typeof requestBody === 'string') { return [opts.responseCode, opts.responseBody];
await opts.checkBuildRequestBody(requestBody); } else {
} else { throw new Error(`unexpected requestBody type "${typeof requestBody}"`);
throw new Error(
`unexpected requestBody type "${typeof requestBody}"`,
);
}
} catch (err) {
error = err;
} }
cb(error, [opts.responseCode, opts.responseBody]);
}); });
} }

View File

@ -1,382 +0,0 @@
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/help.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-args.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-flags.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/compose_ts.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/docker.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/env-common.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/helpers.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/lazy.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/revoke.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/app/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/block/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/inject.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/read.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/reconfigure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/write.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/deploy/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/deactivate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/detect.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/identify.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/init.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/local-mode.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/logs.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/move.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/note.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/os-update.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/public-url.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/reboot.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/register.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/shutdown.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/ssh.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/start-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/stop-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/track-fleet.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/tunnel.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device-type/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/track-latest.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/internal/osinit.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/join/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/leave/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/flash.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/login/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/logout/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/organization/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/build-config.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/download.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/initialize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/versions.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/preload/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/push/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/finalize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/invalidate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/validate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/settings/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/add.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/support/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/util/available-drives.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/version/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/whoami/index.js
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot resolve 'path'
node_modules/@balena/compose/dist/parse/schemas/index.js
Dynamic require may fail at run time, because the requested file
is unknown at compilation time and not included into executable.
Use a string literal as an argument for 'require', or leave it
as is and specify the resolved file name in 'scripts' option.
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/axios.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/utils.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/adapters/adapters.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/adapters/http.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/adapters/xhr.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/cancel/CancelToken.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/cancel/CanceledError.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/cancel/isCancel.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/Axios.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/AxiosError.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/AxiosHeaders.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/InterceptorManager.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/buildFullPath.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/dispatchRequest.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/mergeConfig.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/settle.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/transformData.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/defaults/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/defaults/transitional.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/env/data.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/AxiosTransformStream.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/AxiosURLSearchParams.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/HttpStatusCode.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/bind.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/buildURL.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/callbackify.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/combineURLs.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/cookies.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/formDataToJSON.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/formDataToStream.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/fromDataURI.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/isAbsoluteURL.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/isAxiosError.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/isURLSameOrigin.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/parseHeaders.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/parseProtocol.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/readBlob.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/speedometer.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/spread.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/throttle.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/toFormData.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/toURLEncodedForm.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/validator.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/common/utils.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/node/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/node/classes/FormData.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/node/classes/URLSearchParams.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/form-data-encoder/lib/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/formdata-node/lib/form-data.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/string-width/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js

View File

@ -1,382 +0,0 @@
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/help.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-args.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-flags.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/compose_ts.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/docker.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/env-common.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/helpers.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/lazy.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/revoke.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/app/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/block/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/inject.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/read.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/reconfigure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/write.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/deploy/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/deactivate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/detect.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/identify.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/init.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/local-mode.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/logs.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/move.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/note.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/os-update.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/public-url.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/reboot.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/register.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/shutdown.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/ssh.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/start-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/stop-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/track-fleet.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/tunnel.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device-type/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/track-latest.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/internal/osinit.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/join/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/leave/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/flash.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/login/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/logout/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/organization/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/build-config.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/download.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/initialize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/versions.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/preload/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/push/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/finalize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/invalidate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/validate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/settings/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/add.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/support/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/util/available-drives.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/version/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/whoami/index.js
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot resolve 'path'
node_modules/@balena/compose/dist/parse/schemas/index.js
Dynamic require may fail at run time, because the requested file
is unknown at compilation time and not included into executable.
Use a string literal as an argument for 'require', or leave it
as is and specify the resolved file name in 'scripts' option.
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/axios.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/utils.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/adapters/adapters.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/adapters/http.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/adapters/xhr.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/cancel/CancelToken.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/cancel/CanceledError.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/cancel/isCancel.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/Axios.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/AxiosError.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/AxiosHeaders.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/InterceptorManager.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/buildFullPath.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/dispatchRequest.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/mergeConfig.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/settle.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/transformData.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/defaults/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/defaults/transitional.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/env/data.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/AxiosTransformStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/AxiosURLSearchParams.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/HttpStatusCode.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/bind.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/buildURL.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/callbackify.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/combineURLs.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/cookies.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/formDataToJSON.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/formDataToStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/fromDataURI.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/isAbsoluteURL.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/isAxiosError.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/isURLSameOrigin.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/parseHeaders.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/parseProtocol.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/readBlob.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/speedometer.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/spread.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/throttle.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/toFormData.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/toURLEncodedForm.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/validator.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/common/utils.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/node/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/node/classes/FormData.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/node/classes/URLSearchParams.js
> Warning Failed to make bytecode node20-x64 for file node_modules/form-data-encoder/lib/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/formdata-node/lib/form-data.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/string-width/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js

View File

@ -1,382 +0,0 @@
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/help.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-args.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-flags.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/compose_ts.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/docker.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/env-common.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/helpers.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/lazy.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/revoke.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/app/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/block/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/inject.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/read.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/reconfigure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/write.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/deploy/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/deactivate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/detect.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/identify.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/init.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/local-mode.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/logs.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/move.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/note.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/os-update.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/public-url.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/reboot.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/register.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/shutdown.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/ssh.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/start-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/stop-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/track-fleet.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/tunnel.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device-type/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/track-latest.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/internal/osinit.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/join/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/leave/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/flash.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/login/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/logout/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/organization/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/build-config.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/download.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/initialize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/versions.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/preload/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/push/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/finalize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/invalidate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/validate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/settings/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/add.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/support/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/util/available-drives.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/version/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/whoami/index.js
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot resolve 'path'
node_modules/@balena/compose/dist/parse/schemas/index.js
Dynamic require may fail at run time, because the requested file
is unknown at compilation time and not included into executable.
Use a string literal as an argument for 'require', or leave it
as is and specify the resolved file name in 'scripts' option.
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/axios.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/utils.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/adapters/adapters.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/adapters/http.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/adapters/xhr.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/cancel/CancelToken.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/cancel/CanceledError.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/cancel/isCancel.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/Axios.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/AxiosError.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/AxiosHeaders.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/InterceptorManager.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/buildFullPath.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/dispatchRequest.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/mergeConfig.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/settle.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/core/transformData.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/defaults/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/defaults/transitional.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/env/data.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/AxiosTransformStream.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/AxiosURLSearchParams.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/HttpStatusCode.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/bind.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/buildURL.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/callbackify.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/combineURLs.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/cookies.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/formDataToJSON.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/formDataToStream.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/fromDataURI.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/isAbsoluteURL.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/isAxiosError.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/isURLSameOrigin.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/parseHeaders.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/parseProtocol.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/readBlob.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/speedometer.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/spread.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/throttle.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/toFormData.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/toURLEncodedForm.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/helpers/validator.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/common/utils.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/node/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/node/classes/FormData.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/axios/lib/platform/node/classes/URLSearchParams.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/form-data-encoder/lib/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/formdata-node/lib/form-data.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/string-width/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js
> Warning Failed to make bytecode node20-arm64 for file node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js

View File

@ -1,382 +0,0 @@
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/app.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/help.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-args.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/common-flags.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/compose_ts.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/docker.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/env-common.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/helpers.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/utils/lazy.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/api-key/revoke.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/app/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/block/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/generate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/inject.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/read.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/reconfigure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/config/write.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/deploy/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/deactivate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/detect.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/identify.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/init.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/local-mode.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/logs.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/move.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/note.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/os-update.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/public-url.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/reboot.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/register.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/shutdown.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/ssh.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/start-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/stop-service.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/track-fleet.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device/tunnel.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/device-type/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/env/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/create.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/pin.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/purge.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rename.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/restart.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/fleet/track-latest.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/internal/osinit.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/join/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/leave/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/local/flash.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/login/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/logout/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/organization/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/build-config.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/configure.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/download.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/initialize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/os/versions.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/preload/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/push/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/finalize.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/invalidate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/release/validate.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/settings/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/add.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/ssh-key/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/support/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/list.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/rm.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/tag/set.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/util/available-drives.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/version/index.js
> Warning Entry 'main' not found in %1
%1: node_modules/@oclif/core/package.json
%2: build/commands/whoami/index.js
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/open/xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/build/Release/drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules/drivelist/scripts/win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot resolve 'path'
node_modules/@balena/compose/dist/parse/schemas/index.js
Dynamic require may fail at run time, because the requested file
is unknown at compilation time and not included into executable.
Use a string literal as an argument for 'require', or leave it
as is and specify the resolved file name in 'scripts' option.
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/axios.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/utils.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/adapters/adapters.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/adapters/http.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/adapters/xhr.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/cancel/CancelToken.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/cancel/CanceledError.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/cancel/isCancel.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/Axios.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/AxiosError.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/AxiosHeaders.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/InterceptorManager.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/buildFullPath.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/dispatchRequest.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/mergeConfig.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/settle.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/core/transformData.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/defaults/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/defaults/transitional.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/env/data.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/AxiosTransformStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/AxiosURLSearchParams.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/HttpStatusCode.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/bind.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/buildURL.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/callbackify.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/combineURLs.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/cookies.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/formDataToJSON.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/formDataToStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/fromDataURI.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/isAbsoluteURL.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/isAxiosError.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/isURLSameOrigin.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/parseHeaders.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/parseProtocol.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/readBlob.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/speedometer.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/spread.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/throttle.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/toFormData.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/toURLEncodedForm.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/helpers/validator.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/common/utils.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/node/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/node/classes/FormData.js
> Warning Failed to make bytecode node20-x64 for file node_modules/axios/lib/platform/node/classes/URLSearchParams.js
> Warning Failed to make bytecode node20-x64 for file node_modules/form-data-encoder/lib/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/formdata-node/lib/form-data.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/string-width/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js
> Warning Failed to make bytecode node20-x64 for file node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js

View File

@ -1,382 +0,0 @@
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\app.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\app.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\help.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\utils\common-args.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\utils\common-flags.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\utils\compose_ts.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\utils\docker.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\utils\env-common.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\utils\helpers.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\utils\lazy.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\api-key\generate.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\api-key\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\api-key\revoke.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\app\create.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\block\create.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\config\generate.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\config\inject.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\config\read.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\config\reconfigure.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\config\write.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\deploy\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\deactivate.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\detect.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\identify.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\init.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\local-mode.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\logs.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\move.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\note.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\os-update.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\pin.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\public-url.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\purge.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\reboot.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\register.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\rename.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\restart.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\rm.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\shutdown.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\ssh.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\start-service.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\stop-service.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\track-fleet.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device\tunnel.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\device-type\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\env\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\env\rename.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\env\rm.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\env\set.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\create.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\pin.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\purge.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\rename.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\restart.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\rm.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\fleet\track-latest.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\internal\osinit.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\join\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\leave\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\local\configure.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\local\flash.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\login\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\logout\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\organization\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\os\build-config.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\os\configure.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\os\download.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\os\initialize.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\os\versions.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\preload\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\push\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\release\finalize.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\release\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\release\invalidate.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\release\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\release\validate.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\settings\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\ssh-key\add.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\ssh-key\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\ssh-key\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\ssh-key\rm.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\support\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\tag\list.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\tag\rm.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\tag\set.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\util\available-drives.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\version\index.js
> Warning Entry 'main' not found in %1
%1: node_modules\@oclif\core\package.json
%2: build\commands\whoami\index.js
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\open\xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\open\xdg-open
%2: path-to-executable/xdg-open
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\build\Release\drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\scripts\darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\scripts\linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\scripts\win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\build\Release\drivelist.node
%2: path-to-executable/drivelist.node
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\scripts\darwin.sh
%2: path-to-executable/drivelist/darwin.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\scripts\linux.sh
%2: path-to-executable/drivelist/linux.sh
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
%1: node_modules\drivelist\scripts\win32.bat
%2: path-to-executable/drivelist/win32.bat
> Warning Cannot resolve 'path'
node_modules\@balena\compose\dist\parse\schemas\index.js
Dynamic require may fail at run time, because the requested file
is unknown at compilation time and not included into executable.
Use a string literal as an argument for 'require', or leave it
as is and specify the resolved file name in 'scripts' option.
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\axios.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\utils.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\adapters\adapters.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\adapters\http.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\adapters\xhr.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\cancel\CanceledError.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\cancel\CancelToken.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\cancel\isCancel.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\Axios.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\AxiosError.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\AxiosHeaders.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\buildFullPath.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\dispatchRequest.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\InterceptorManager.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\mergeConfig.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\settle.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\core\transformData.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\defaults\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\defaults\transitional.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\env\data.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\AxiosTransformStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\AxiosURLSearchParams.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\bind.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\buildURL.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\callbackify.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\combineURLs.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\cookies.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\formDataToJSON.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\formDataToStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\fromDataURI.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\HttpStatusCode.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\isAbsoluteURL.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\isAxiosError.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\isURLSameOrigin.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\parseHeaders.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\parseProtocol.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\readBlob.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\speedometer.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\spread.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\throttle.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\toFormData.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\toURLEncodedForm.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\validator.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\helpers\ZlibHeaderTransformStream.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\platform\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\platform\common\utils.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\platform\node\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\platform\node\classes\FormData.js
> Warning Failed to make bytecode node20-x64 for file node_modules\axios\lib\platform\node\classes\URLSearchParams.js
> Warning Failed to make bytecode node20-x64 for file node_modules\form-data-encoder\lib\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\formdata-node\lib\form-data.js
> Warning Failed to make bytecode node20-x64 for file node_modules\@isaacs\cliui\node_modules\string-width\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\@isaacs\cliui\node_modules\strip-ansi\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\@isaacs\cliui\node_modules\wrap-ansi\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\@isaacs\cliui\node_modules\ansi-regex\index.js
> Warning Failed to make bytecode node20-x64 for file node_modules\@isaacs\cliui\node_modules\ansi-styles\index.js

View File

@ -63,7 +63,7 @@ describe('detectEncoding() function', function () {
it('should correctly detect the encoding of a few selected files', async () => { it('should correctly detect the encoding of a few selected files', async () => {
const sampleBinary = [ const sampleBinary = [
'drivelist/build/Release/drivelist.node', 'drivelist/build/Release/drivelist.node',
'mountutils/build/Release/MountUtils.node', 'mountutils/prebuilds/linux-x64/mountutils.node',
]; ];
const sampleText = [ const sampleText = [
'node_modules/.bin/mocha', 'node_modules/.bin/mocha',