Compare commits

...

156 Commits

Author SHA1 Message Date
357866e345 Example on how to test with mocks and stubs
Change-type: patch
2024-09-10 19:11:01 -03:00
629ac9e5e9 Add commands for exporting and importing app/fleet releases.
Change-type: minor
Signed-off-by: Carlo Miguel F. Cruz <carloc@balena.io>
2024-09-10 21:57:06 +08:00
2f03b24bcf v19.0.3 2024-09-05 12:34:15 +00:00
233ee990f9 Merge pull request #2823 from balena-io/reduce-require-usage
Reduce usage of not necessary CJS require()
2024-09-05 09:33:07 -03:00
facc66e9f9 Reduce use of CJS require() on automation files
Change-type: patch
2024-09-04 14:47:18 -03:00
6efd24489f Remove the use of CJS require() on test files
Change-type: patch
2024-09-04 14:33:52 -03:00
0339160a0b Remove not necessary 'import = require' syntax for js-yaml
Change-type: patch
2024-09-04 13:55:41 -03:00
0591f5edbd v19.0.2 2024-09-03 14:56:29 +00:00
c30dd323f1 Merge pull request #2821 from balena-io/bump-dev-deps
update dev dependencies
2024-09-03 14:55:19 +00:00
1640bd6457 Update devDependency patch-package to v8.0.0
Change-type: patch
2024-09-03 11:22:45 -03:00
da2ffde483 Update devDependency mkdirp to v3.0.1
Change-type: patch
2024-09-03 10:58:36 -03:00
5c9e3ad8f6 Update devDependency fs-extra(to v11) and @types/fs-extra(to v11)
Change-type: patch
2024-09-03 10:58:36 -03:00
7515d4b710 Update devDependency @types/parse-link-header to v2.0.3
Change-type: patch
2024-09-03 10:58:30 -03:00
fae5af6b75 Remove unused devDependency @types/nock
Change-type: patch
2024-09-03 10:47:23 -03:00
45aa1adacb Update devDependency klaw(to v4) and @types/klaw(to v3.0.6)
Change-type: patch
2024-09-03 10:47:23 -03:00
b34ea14413 Update husky to v9.1.5
Change-type: patch
2024-09-03 10:47:19 -03:00
90eae06017 Update devDependency @types/jsonwebtoken to v9.0.6
Change-type: patch
2024-09-03 09:35:25 -03:00
41da8f6f6f Update devDependency archiver(to v7) and @types/archiver(to v6)
Change-type: patch
2024-09-03 09:33:07 -03:00
8d706a7d81 Removes unused devDependency @types/net-keepalive
Change-type: patch
2024-09-03 09:30:33 -03:00
d67952024c Update devDependency rewire(to v7) and @types/rewire(to v2.5.30)
Change-type: patch
2024-09-03 09:28:32 -03:00
8895fc485c Update devDependency sinon(to v18) and @types/sinon(to v17)
Change-type: patch
2024-09-03 09:20:41 -03:00
c2dbcaaaf4 v19.0.1 2024-09-02 13:21:58 +00:00
52cb951e49 Merge pull request #2788 from balena-io/bump-oclif-core-v4
Bump @oclif/core from 3.27.0 to 4.0.18
2024-09-02 13:20:59 +00:00
2a357a438f Bump @oclif/core from 3.27.0 to 4.0.18
Change-type: patch
2024-09-02 09:24:08 -03:00
a9a202281d v19.0.0 2024-08-22 17:43:34 +00:00
b74979fb9e Merge pull request #2816 from balena-io/v19
v19
2024-08-22 14:42:42 -03:00
4760866c77 Update all references of lib to src
Change-type: patch
2024-08-22 13:03:37 -03:00
2b044348e0 Rename the lib folder to src
Change-type: major
2024-08-22 12:55:48 -03:00
c9fa10b9c6 Update @balena/compose to 4.0.1
Update @balena/compose from 3.2.1 to 4.0.1

Change-type: major
2024-08-22 07:44:09 -03:00
63674c8201 Use standard visuals table component for fleet/s
This effectively removes the ability to filter/sort/customize the output table.
The cli cannot properly handle this operations on all models and this one was inconsistent.
For now we recommend that users that require parsing the CLI output use the output json format and do any kind of necessary parsing on it.

Change-type: major
2024-08-07 13:14:24 -03:00
a08ac447a3 v18.2.34 2024-07-29 11:08:38 +00:00
12a338fb21 Merge pull request #2817 from balena-io/ab77/patch-1
Switch to self-hosted
2024-07-29 11:07:51 +00:00
1d70e6b4b4 Run npm dedupe commands
Change-type: patch
Signed-off-by: Kyle Harding <kyle@balena.io>
2024-07-29 07:25:13 -03:00
d3458379e6 Switch to self-hosted
change-type: patch
2024-07-23 11:10:09 -07:00
544f615ca0 v18.2.33 2024-07-17 07:46:28 +00:00
245c51d974 Merge pull request #2814 from balena-io/improve-scan-reliability
Improve discover balena os across different networks
2024-07-17 04:42:50 -03:00
03f0f11f8b Improve discover balena os across different networks
This is an improvement over the scan, join and leave commands removing flakiness when searching over different networks. In short, instead of leaving bonjour to search across all interfaces, we forcebly conduct a search on each interface, this requires mDNS binding any ipv4 interface (0.0.0.0), otherwise it would bind over the interface itself, which is not desired as it causes services to only be able to receive information over that interface, see [mafintosh/multicast-dns#53](https://github.com/mafintosh/multicast-dns/issues/53). This targeted approach enhances the reliability and accuracy of network searches, reducing instances of missed connections or network errors typically caused by flakiness when relying on bonjour's default behavior.

Change-type: patch
2024-07-16 19:01:53 -03:00
2c0c1f8fd1 v18.2.32 2024-07-16 13:10:07 +00:00
d4d7fce2c1 Merge pull request #2815 from balena-io/remove-unused-code
Remove unused code
2024-07-16 13:09:15 +00:00
0f23318367 Remove unused code
Change-type: patch
2024-07-16 07:46:18 -03:00
003d537433 v18.2.31 2024-07-15 21:17:44 +00:00
46d3497663 Merge pull request #2798 from balena-io/balena-compose-sdk-pine-instance
deploy: Use the sdk's pine instance with balena-compose
2024-07-16 00:16:55 +03:00
a39a772c9e Deduplicate dependencies 2024-07-15 18:51:16 +03:00
efa0d67f0a deploy: Use the sdk's pine instance with balena-compose
Change-type: patch
2024-07-15 18:42:51 +03:00
232b9678bc Update balena-sdk to 19.7.3
Update balena-sdk from 19.7.2 to 19.7.3

Change-type: patch
2024-07-15 16:09:51 +03:00
a8ce14b0e8 v18.2.30 2024-07-15 11:30:43 +00:00
838a36758a Merge pull request #2812 from balena-io/test-omit-escaped-chars
Omit unicode control character escapes from test logs
2024-07-15 14:29:46 +03:00
4e101e2fd9 Omit unicode control character escapes from test logs
Change-type: patch
2024-07-13 18:07:04 +03:00
9f9fd97795 Deduplicate dependencies 2024-07-13 17:44:04 +03:00
1b36dc84fc v18.2.29 2024-07-12 14:55:02 +00:00
5d6ee707ff Merge pull request #2801 from balena-io/bump-balena-preload
Update balena-preload from 15.0.5 to 15.0.6
2024-07-12 14:54:14 +00:00
3c64e13fb3 Update balena-preload from 15.0.5 to 15.0.6
Change-type: patch
2024-07-12 11:30:36 -03:00
7e41fda8d4 v18.2.28 2024-07-12 13:29:24 +00:00
5df316e9cb Merge pull request #2807 from balena-io/update-sdk-19-7-2
Update balena-sdk to 19.7.2
2024-07-12 16:28:38 +03:00
79fcd95491 Downgrade pinejs-client-request to 7.4.2 to unblock the sdk update
Change-type: patch
2024-07-12 16:02:35 +03:00
33199acbe8 Update balena-sdk to 19.7.2
Update balena-sdk from 19.5.5 to 19.7.2

Change-type: patch
2024-07-12 15:55:42 +03:00
4633c2456d v18.2.27 2024-07-12 12:45:19 +00:00
f8bc081228 Merge pull request #2804 from balena-io/update-sdk
Update balena-sdk to 19.5.5
2024-07-12 12:44:19 +00:00
1702f8ba59 Update balena-sdk to 19.5.5
Update balena-sdk from 19.4.0 to 19.5.5

Change-type: patch
2024-07-12 15:08:26 +03:00
60b0c7e346 v18.2.26 2024-07-12 12:03:32 +00:00
e95ef8b3b4 Merge pull request #2803 from balena-io/fix-dependencies
Fix dependencies
2024-07-12 12:02:39 +00:00
1bc0f7447f Drop unused dependencies
Change-type: patch
2024-07-12 08:38:49 -03:00
f65215e144 Move dependencies that should be dev only as devDependencies
Change-type: patch
2024-07-12 07:15:37 -03:00
97abc5cf1c v18.2.25 2024-07-11 10:54:49 +00:00
e64a09d2f4 Merge pull request #2800 from balena-io/bump-oclif-v4
Bump oclif v4
2024-07-11 07:54:00 -03:00
b1073ca549 Fix complete generation intermitency
Change-type: patch
2024-07-10 21:22:20 -03:00
e659e3577a Bump oclif to v4
Change-type: patch
2024-07-10 19:07:54 -03:00
f7233c5d42 v18.2.24 2024-07-10 22:06:20 +00:00
4ae2ff1740 Merge pull request #2799 from balena-io/overrides-inline-source-dev-dependency-version
Update Dependencies
2024-07-10 22:05:21 +00:00
19a60bb0ab Update mocha from 8.4.0 to 10.6.0
Change-type: patch
2024-07-10 18:25:37 -03:00
d1a6f7560c Override inline-source-cli with non-vulnerable dependency
Change-type: patch
2024-07-10 18:20:05 -03:00
4619ce7daa v18.2.23 2024-07-10 21:05:55 +00:00
7624240d5e Merge pull request #2796 from balena-io/replace-discoverable-service-for-std-bonjour-service
Replace resin-discoverable-services with bonjour-service
2024-07-10 21:04:58 +00:00
7273656d07 Replace resin-discoverable-services with bonjour-service
Instead of using the more generic resin-discoverable-services lib which is unmantained
and currently has several vulnerabilities and forks for fixing issues (that were later on fixed upstream)
we directly talk with mDNS using standard (and currently mantained) bonjour-service.

Change-type: patch
2024-07-10 16:06:19 -03:00
00bd4d5415 v18.2.22 2024-07-10 16:48:09 +00:00
c2d3c9fc71 Merge pull request #2797 from balena-io/remove-unused-depedency
Remove unused dependency minimatch
2024-07-10 16:46:45 +00:00
1749937373 Remove unused dependency minimatch
Change-type: patch
2024-07-10 12:54:52 -03:00
bcb7fb8902 v18.2.21 2024-07-09 15:10:38 +00:00
81e9601d6b Merge pull request #2794 from balena-io/bump-resin-discoverable-services
Bump resin-discoverable-services from 2.0.4 to 2.0.5
2024-07-09 15:09:34 +00:00
6c89ba4b22 Bump resin-discoverable-services from 2.0.4 to 2.0.5
Change-type: patch
2024-07-09 11:43:45 -03:00
57d3d6d537 v18.2.20 2024-07-05 21:12:48 +00:00
6330574c01 Merge pull request #2791 from balena-io/run-audit-fix
Audit fix dependencies
2024-07-05 18:11:52 -03:00
b6d1afac2d Audit fix dependencies
Change-type: patch
2024-07-05 17:41:14 -03:00
f2d0da0837 v18.2.19 2024-07-05 13:37:55 +00:00
068cd887c8 Merge pull request #2790 from balena-io/unneeded-publish-release
Remove unused package `publish-release`
2024-07-05 13:36:53 +00:00
93e597a596 Remove unused package publish-release
Change-type: patch
2024-07-05 08:56:51 -04:00
5b1d6a3190 v18.2.18 2024-07-04 21:56:19 +00:00
dba102f347 Merge pull request #2786 from balena-io/renovate/actions-setup-node-4.x
Update actions/setup-node action to v4
2024-07-04 18:55:25 -03:00
c30a1dc1ed Update actions/setup-node action to v4
Update actions/setup-node from 3 to 4

Change-type: patch
2024-07-02 13:47:56 +00:00
78368c8a51 v18.2.17 2024-07-02 13:20:43 +00:00
d7250ccc4e Merge pull request #2785 from balena-io/renovate/etcher-sdk
Update dependency etcher-sdk to v9.1.0
2024-07-02 13:19:44 +00:00
2d47eb53cd Update dependency etcher-sdk to v9.1.0
Update etcher-sdk from 9.0.11 to 9.1.0

Change-type: patch
2024-07-02 12:53:24 +00:00
b5fc97bdf9 v18.2.16 2024-07-02 12:14:25 +00:00
3472df2c04 Merge pull request #2783 from balena-io/renovate/patch-etcher-sdk
Update dependency etcher-sdk to v9.0.11
2024-07-02 12:13:18 +00:00
6b5657625a Update dependency etcher-sdk to v9.0.11
Update etcher-sdk from 9.0.8 to 9.0.11

Change-type: patch
2024-07-02 11:47:56 +00:00
dad6b23202 v18.2.15 2024-07-02 11:11:04 +00:00
6b59c06978 Merge pull request #2784 from balena-io/renovate/patch-event-stream
Update dependency event-stream to v3.3.5
2024-07-02 11:10:09 +00:00
b518067058 Update dependency event-stream to v3.3.5
Update event-stream from 3.3.4 to 3.3.5

Change-type: patch
2024-07-02 10:48:33 +00:00
bd4bdb805f v18.2.14 2024-07-02 10:14:47 +00:00
32e59eccc5 Merge pull request #2771 from balena-io/renovate/npm-jsonwebtoken-vulnerability
Update dependency jsonwebtoken to v9 [SECURITY]
2024-07-02 07:13:48 -03:00
f05e49915d Update dependency jsonwebtoken to v9 [SECURITY]
Update jsonwebtoken from 8.5.1 to 9.0.0

Change-type: patch
2024-07-02 09:48:15 +00:00
92146429c4 v18.2.13 2024-07-02 09:14:07 +00:00
40f5214317 Merge pull request #2780 from balena-io/renovate/patch-prettyjson
Update dependency @types/prettyjson to ^0.0.33
2024-07-02 09:13:04 +00:00
14e1255b5f Update dependency @types/prettyjson to ^0.0.33
Update @types/prettyjson from 0.0.30 to 0.0.33

Change-type: patch
2024-07-02 08:48:40 +00:00
15e91e95b4 v18.2.12 2024-07-02 07:50:17 +00:00
1814fe7581 Merge pull request #2782 from balena-io/npm-dd
Deduplicate dependencies
2024-07-02 10:49:11 +03:00
7325e8d9d5 Deduplicate dependencies
Change-type: patch
2024-07-01 22:51:28 +03:00
5358f92590 v18.2.11 2024-07-01 17:52:46 +00:00
fe6a7cfdba Merge pull request #2778 from balena-io/renovate/patch-fast-levenshtein
Update dependency @types/fast-levenshtein to v0.0.4
2024-07-01 17:51:45 +00:00
a29bd8d0ef Update dependency @types/fast-levenshtein to v0.0.4
Update @types/fast-levenshtein from 0.0.1 to 0.0.4

Change-type: patch
2024-06-21 20:48:02 +00:00
049e1da53e v18.2.10 2024-06-21 20:12:54 +00:00
2c0b4072ae Merge pull request #2776 from balena-io/renovate/actions-download-artifact-4.1.x
Update actions/download-artifact action to v4.1.7
2024-06-21 20:12:05 +00:00
15c0c32a01 Update actions/download-artifact action to v4.1.7
Update actions/download-artifact from 4.1.0 to 4.1.7

Change-type: patch
2024-06-21 19:48:21 +00:00
8f2c7f9dbf v18.2.9 2024-06-21 19:13:44 +00:00
90982256c7 Merge pull request #2773 from balena-io/renovate/actions-setup-python-digest
Update actions/setup-python digest to 65d7f2d
2024-06-21 19:12:42 +00:00
73220206a2 Update actions/setup-python digest to 65d7f2d
Update actions/setup-python

Change-type: patch
2024-06-21 18:48:07 +00:00
8b453aae89 v18.2.8 2024-06-21 18:13:51 +00:00
d85d5933fb Merge pull request #2775 from balena-io/renovate/actions-upload-artifact-digest
Update actions/upload-artifact digest to 6546280
2024-06-21 18:12:44 +00:00
2cd455ff81 Update actions/upload-artifact digest to 6546280
Update actions/upload-artifact

Change-type: patch
2024-06-21 17:49:06 +00:00
066cbaf35f v18.2.7 2024-06-21 17:16:21 +00:00
17fa888fea Merge pull request #2772 from balena-io/renovate/pin-dependencies
Pin dependencies
2024-06-21 17:15:25 +00:00
f50287873a Pin dependencies
Update actions/setup-node

Change-type: patch
2024-06-21 16:47:51 +00:00
edff14fa72 v18.2.6 2024-06-21 15:23:25 +00:00
9de753d9d3 Merge pull request #2770 from balena-io/bump-oclif-core
Update @oclif/core from 3.26.9 to 3.27.0
2024-06-21 15:22:19 +00:00
75d2d7d375 Update @oclif/core from 3.26.9 to 3.27.0
Change-type: patch
2024-06-21 09:49:38 -03:00
d9b193acc1 v18.2.5 2024-06-21 12:11:21 +00:00
2e42999642 Merge pull request #2769 from balena-io/bump-ts
Update TypeScript to 5.5.2
2024-06-21 12:10:18 +00:00
5a3f0ea453 Limit @oclif/core to ~3.26 so that npm dedupe doesn't auto-bump it
Change-type: patch
2024-06-21 01:37:00 +03:00
e1cd30060c Deduplicate dependencies 2024-06-21 01:31:53 +03:00
7959e23cd3 Update TypeScript to 5.5.2
Change-type: patch
2024-06-21 00:18:36 +03:00
9c4d788d6d v18.2.4 2024-05-17 12:04:11 +00:00
181f5a6a2f Merge pull request #2767 from balena-io/aethernet-patch-1
patch: fix outdated doc for "os configure"
2024-05-17 12:03:17 +00:00
163dcf596e patch: fix outdated doc for "os configure"
There were an outdated warning for `os configure` on windows.
The command actually works fine on windows.

see: https://balena.zulipchat.com/#narrow/stream/403752-channel.2Fsupport-help/topic/Cytiva.20image.20downloads/near/438786503
2024-05-17 13:39:22 +02:00
1724187466 v18.2.3 2024-05-15 13:32:53 +00:00
b27dcdd582 Merge pull request #2765 from balena-io/dfunckt-patch-1
Pluralize command categories in docs
2024-05-15 13:31:57 +00:00
c28039a3f2 Fix exitCode type 2024-05-15 16:01:38 +03:00
233bc705de Pluralize command categories in docs
Pluralize command categories, eg. "Device" -> "Devices”.

Results in much fewer categories in our docs pages and we no longer have the somewhat silly separate singular and plural categories for commands such as `devices` and `device <command>`.

Change-type: patch
2024-05-15 15:49:57 +03:00
71518678e1 v18.2.2 2024-04-30 13:57:49 +00:00
88a705c935 Merge pull request #2754 from balena-io/upgrade_dockerode
Upgrade dockerode and docker-modem dependencies
2024-04-30 13:56:52 +00:00
55d06aced2 Deduplicate npm dependencies
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
2024-04-29 08:20:02 -04:00
aa9a148c46 Upgrade dockerode and docker-modem dependencies
Includes test fixes due to an interface change in docker-modem.

Change-type: patch
Signed-off-by: Ken Bannister <kb2ma@runbox.com>
2024-04-29 07:56:53 -04:00
10ca5b4f59 v18.2.1 2024-04-23 12:08:57 +00:00
47e11d5f9b Merge pull request #2758 from balena-io/kyle/actuated
Use Actuated runners for Linux test and publish
2024-04-23 12:07:47 +00:00
6fb65bcf22 Re-run npm install and npm dedupe
Signed-off-by: Kyle Harding <kyle@balena.io>
2024-04-22 17:56:20 +03:00
954de13b10 Use Actuated runners for Linux test and publish
Change-type: patch
Signed-off-by: Kyle Harding <kyle@balena.io>
2024-04-19 15:27:38 -04:00
f81a27e931 v18.2.0 2024-04-17 16:13:12 +00:00
e8815d0275 Merge pull request #2756 from balena-io/build-optional-arch
build: Auto-resolve the cpu arch when the --deviceType is provided
2024-04-17 19:12:11 +03:00
766e6d4e5e build: Auto-resolve the cpu arch when the --deviceType is provided
Change-type: minor
2024-04-17 18:10:30 +03:00
7b46f65a01 v18.1.10 2024-04-16 14:17:07 +00:00
db8df0ac35 Merge pull request #2755 from balena-io/node-20-6
Mark node 20.6.0 as the minimum working version
2024-04-16 17:16:00 +03:00
7c7f46fe2b Deduplicate dependencies 2024-04-16 16:46:25 +03:00
b29aae1821 Mark node 20.6.0 as the minimum working version
Change-type: patch
2024-04-16 15:42:41 +03:00
0b10701015 v18.1.9 2024-04-10 15:24:31 +00:00
1dbe08d7e0 Merge pull request #2748 from balena-io/kyle/renovate-npm-dedupe
Enable npm dedupe as part of Renovate postUpdateOptions
2024-04-10 18:23:33 +03:00
d01461ff3e Deduplicate dependencies 2024-04-10 17:39:18 +03:00
2a970478bd Enable npm dedupe as part of Renovate postUpdateOptions
See: https://docs.renovatebot.com/configuration-options/#postupdateoptions
Change-type: patch
Signed-off-by: Kyle Harding <kyle@balena.io>
2024-04-10 10:03:01 -04:00
209 changed files with 7425 additions and 11112 deletions

View File

@ -28,7 +28,7 @@ runs:
using: 'composite'
steps:
- name: Download custom source artifact
uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with:
name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}
path: ${{ runner.temp }}
@ -39,14 +39,14 @@ runs:
run: tar -xf ${{ runner.temp }}/custom.tgz
- name: Setup Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
with:
node-version: ${{ inputs.NODE_VERSION }}
cache: npm
- name: Set up Python 3.11
if: runner.os == 'macOS'
uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4
uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4
with:
python-version: "3.11"
@ -66,7 +66,7 @@ runs:
# https://github.com/Apple-Actions/import-codesign-certs
- name: Import Apple code signing certificate
if: runner.os == 'macOS'
uses: apple-actions/import-codesign-certs@v1
uses: apple-actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071 # v1
with:
p12-file-base64: ${{ fromJSON(inputs.secrets).APPLE_SIGNING }}
p12-password: ${{ fromJSON(inputs.secrets).APPLE_SIGNING_PASSWORD }}
@ -135,7 +135,7 @@ runs:
XCODE_APP_LOADER_TEAM_ID: ${{ inputs.XCODE_APP_LOADER_TEAM_ID }}
- name: Upload artifacts
uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
with:
name: gh-release-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ strategy.job-index }}
path: dist

View File

@ -26,14 +26,14 @@ runs:
steps:
# https://github.com/actions/setup-node#caching-global-packages-data
- name: Setup Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
with:
node-version: ${{ inputs.NODE_VERSION }}
cache: npm
- name: Set up Python 3.11
if: runner.os == 'macOS'
uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4
uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4
with:
python-version: "3.11"
@ -58,7 +58,7 @@ runs:
run: tar --exclude-vcs -acf ${{ runner.temp }}/custom.tgz .
- name: Upload custom artifact
uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
with:
name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}
path: ${{ runner.temp }}/custom.tgz

4
.github/renovate.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"extends": ["github>balena-io/renovate-config"],
"postUpdateOptions": ["npmDedupe"]
}

View File

@ -21,6 +21,25 @@ jobs:
)
secrets: inherit
with:
custom_runs_on: '[["self-hosted","Linux","distro:focal","X64"],["self-hosted","Linux","distro:focal","ARM64"],["macos-12"],["windows-2019"],["macos-latest-xlarge"]]'
custom_test_matrix: >
{
"os": [
["self-hosted", "X64"],
["self-hosted", "ARM64"],
["macos-12"],
["windows-2019"],
["macos-latest-xlarge"]
]
}
custom_publish_matrix: >
{
"os": [
["self-hosted", "X64"],
["self-hosted", "ARM64"],
["macos-12"],
["windows-2019"],
["macos-latest-xlarge"]
]
}
github_prerelease: false
restrict_custom_actions: false

1
.husky/pre-commit Normal file
View File

@ -0,0 +1 @@
node automation/check-npm-version.js && ts-node automation/check-doc.ts

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,378 @@ All notable changes to this project will be documented in this file
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
This project adheres to [Semantic Versioning](http://semver.org/).
## 19.0.3 - 2024-09-05
* Reduce use of CJS require() on automation files [Otavio Jacobi]
* Remove the use of CJS require() on test files [Otavio Jacobi]
* Remove not necessary 'import = require' syntax for js-yaml [Otavio Jacobi]
## 19.0.2 - 2024-09-03
* Update devDependency patch-package to v8.0.0 [Otavio Jacobi]
* Update devDependency mkdirp to v3.0.1 [Otavio Jacobi]
* Update devDependency fs-extra(to v11) and @types/fs-extra(to v11) [Otavio Jacobi]
* Update devDependency @types/parse-link-header to v2.0.3 [Otavio Jacobi]
* Remove unused devDependency @types/nock [Otavio Jacobi]
* Update devDependency klaw(to v4) and @types/klaw(to v3.0.6) [Otavio Jacobi]
* Update husky to v9.1.5 [Otavio Jacobi]
* Update devDependency @types/jsonwebtoken to v9.0.6 [Otavio Jacobi]
* Update devDependency archiver(to v7) and @types/archiver(to v6) [Otavio Jacobi]
* Removes unused devDependency @types/net-keepalive [Otavio Jacobi]
* Update devDependency rewire(to v7) and @types/rewire(to v2.5.30) [Otavio Jacobi]
* Update devDependency sinon(to v18) and @types/sinon(to v17) [Otavio Jacobi]
## 19.0.1 - 2024-09-02
* Bump @oclif/core from 3.27.0 to 4.0.18 [Otavio Jacobi]
## 19.0.0 - 2024-08-22
* Update all references of lib to src [Otavio Jacobi]
* Rename the lib folder to src [Otavio Jacobi]
* Update @balena/compose to 4.0.1 Update @balena/compose from 3.2.1 to 4.0.1 [Otavio Jacobi]
* Use standard visuals table component for fleet/s [Otavio Jacobi]
## 18.2.34 - 2024-07-29
* Run npm dedupe commands [Kyle Harding]
* Switch to self-hosted [Anton Belodedenko]
## 18.2.33 - 2024-07-17
* Improve discover balena os across different networks [Otavio Jacobi]
## 18.2.32 - 2024-07-16
* Remove unused code [Otavio Jacobi]
## 18.2.31 - 2024-07-15
* deploy: Use the sdk's pine instance with balena-compose [Thodoris Greasidis]
<details>
<summary> Update balena-sdk to 19.7.3 [Thodoris Greasidis] </summary>
> ### balena-sdk-19.7.3 - 2024-07-12
>
> * pinejs-client-core: Add some missing methods to the custom typings [Thodoris Greasidis]
>
</details>
## 18.2.30 - 2024-07-15
* Omit unicode control character escapes from test logs [Thodoris Greasidis]
## 18.2.29 - 2024-07-12
* Update balena-preload from 15.0.5 to 15.0.6 [Otavio Jacobi]
## 18.2.28 - 2024-07-12
* Downgrade pinejs-client-request to 7.4.2 to unblock the sdk update [Thodoris Greasidis]
<details>
<summary> Update balena-sdk to 19.7.2 [Thodoris Greasidis] </summary>
> ### balena-sdk-19.7.2 - 2024-07-12
>
>
> <details>
> <summary> Update balena-request from 13.3.1 to 13.3.2 [Thodoris Greasidis] </summary>
>
>> #### balena-request-13.3.2 - 2024-07-12
>>
>> * Fix always following redirects when followRedirect = false [Thodoris Greasidis]
>>
>
> </details>
>
>
> ### balena-sdk-19.7.1 - 2024-07-08
>
>
> <details>
> <summary> Limit pinejs-client-core to ~6.14.0, to fix errors in older TypeScript [Thodoris Greasidis] </summary>
>
>> #### pinejs-client-js-6.14.0 - 2023-12-05
>>
>> * Respect the Retry-After header when clients define the getRetryAfterHeader option [Thodoris Greasidis]
>>
>> #### pinejs-client-js-6.13.0 - 2023-07-11
>>
>> * Add support for $duration [Thodoris Greasidis]
>>
>> #### pinejs-client-js-6.12.4 - 2023-05-09
>>
>> * Avoid an unnecessary function creation on each get() call [Thodoris Greasidis]
>>
>> #### pinejs-client-js-6.12.3 - 2022-12-28
>>
>> * CI: Convert tests to TypeScript [Josh Bowling]
>>
>> #### pinejs-client-js-6.12.2 - 2022-11-18
>>
>> * Fix `$orderby: { a: { $count: ... }, $dir: 'asc' }` typings [Thodoris Greasidis]
>>
>> #### pinejs-client-js-6.12.1 - 2022-11-15
>>
>> * Update TypeScript to 4.9.3 [Thodoris Greasidis]
>>
>
> </details>
>
> * Fix the TypeScript incompatibility test [Thodoris Greasidis]
>
> ### balena-sdk-19.7.0 - 2024-07-05
>
> * Add identity provider & saml account model typing [Otavio Jacobi]
>
> ### balena-sdk-19.6.1 - 2024-06-20
>
> * Update TypeScript to 5.5.2 [Thodoris Greasidis]
>
> ### balena-sdk-19.6.0 - 2024-06-20
>
> * Add the application.getAllByOrganization() method [Thodoris Greasidis]
> * Deprecate the application.getAppByOwner() method [Thodoris Greasidis]
>
> ### balena-sdk-19.5.11 - 2024-05-28
>
> * tests: Make the cleanups more precise [Thodoris Greasidis]
>
> ### balena-sdk-19.5.10 - 2024-03-29
>
> * Drop the toWritable helper in favor of TypeScript's satisfies [Thodoris Greasidis]
>
> ### balena-sdk-19.5.9 - 2024-03-29
>
> * os: Update the comments on why we still need to be using the release_tags [Thodoris Greasidis]
>
> ### balena-sdk-19.5.8 - 2024-03-18
>
> * Fix `application.create` method being wrongly marked as deprecated [myarmolinsky]
>
> ### balena-sdk-19.5.7 - 2024-03-08
>
> * Fix missing underscore to describes__device property [Andrea Rosci]
>
> ### balena-sdk-19.5.6 - 2024-03-07
>
> * Update TypeScript to 5.4.2 [Thodoris Greasidis]
> * device-type.getInstructions: Convert etcher link to HTTPS [Vipul Gupta (@vipulgupta2048)]
>
</details>
## 18.2.27 - 2024-07-12
<details>
<summary> Update balena-sdk to 19.5.5 [Thodoris Greasidis] </summary>
> ### balena-sdk-19.5.5 - 2024-02-26
>
>
> <details>
> <summary> Update balena-auth to 6.0.1 [Thodoris Greasidis] </summary>
>
>> #### balena-auth-6.0.1 - 2024-02-23
>>
>> * Update jwt-decode to v3 [Thodoris Greasidis]
>>
>> #### balena-auth-6.0.0 - 2024-02-23
>>
>> * Update typescript to 5.3.3 [Thodoris Greasidis]
>> * Move the sources from lib to src [Thodoris Greasidis]
>> * Update @balena/lint to v7 [Thodoris Greasidis]
>> * Stop publishing the lib folder [Thodoris Greasidis]
>> * Drop support for nodejs < 18 [Thodoris Greasidis]
>> * Drop no longer used appveyor.yml [Thodoris Greasidis]
>>
>> #### balena-register-device-9.0.2 - 2024-02-23
>>
>> * Update @balena/lint to v7 [Thodoris Greasidis]
>> * Update balena-request to 13.3.0 [Thodoris Greasidis]
>>
>> #### balena-request-13.3.1 - 2024-02-23
>>
>> * Update balena-auth to 6.0.1 [Thodoris Greasidis]
>>
>
> </details>
>
>
> ### balena-sdk-19.5.4 - 2024-02-14
>
> * Bump balena-request Update balena-request from 13.2.0 to 13.3.0 [Otávio Jacobi]
>
> ### balena-sdk-19.5.3 - 2024-02-14
>
> * Replace deprecated flowzone input tests_run_on [Kyle Harding]
>
> ### balena-sdk-19.5.2 - 2024-02-13
>
> * tests: Reformat describe & it calls to have curly braces [Thodoris Greasidis]
>
> ### balena-sdk-19.5.1 - 2024-02-02
>
> * Update @balena/lint to 7.3.0 [Thodoris Greasidis]
>
> ### balena-sdk-19.5.0 - 2024-01-26
>
> * types: Add the `Organization.is_using__billing_version` property [Thodoris Greasidis]
>
</details>
## 18.2.26 - 2024-07-12
* Drop unused dependencies [Otavio Jacobi]
* Move dependencies that should be dev only as devDependencies [Otavio Jacobi]
## 18.2.25 - 2024-07-11
* Fix complete generation intermitency [Otavio Jacobi]
* Bump oclif to v4 [Otavio Jacobi]
## 18.2.24 - 2024-07-10
* Update mocha from 8.4.0 to 10.6.0 [Otavio Jacobi]
* Override inline-source-cli with non-vulnerable dependency [Otavio Jacobi]
## 18.2.23 - 2024-07-10
* Replace resin-discoverable-services with bonjour-service [Otavio Jacobi]
## 18.2.22 - 2024-07-10
* Remove unused dependency minimatch [Otavio Jacobi]
## 18.2.21 - 2024-07-09
* Bump resin-discoverable-services from 2.0.4 to 2.0.5 [Otavio Jacobi]
## 18.2.20 - 2024-07-05
* Audit fix dependencies [Otavio Jacobi]
## 18.2.19 - 2024-07-05
* Remove unused package `publish-release` [myarmolinsky]
## 18.2.18 - 2024-07-04
* Update actions/setup-node action to v4 [Self-hosted Renovate Bot]
## 18.2.17 - 2024-07-02
<details>
<summary> Update dependency etcher-sdk to v9.1.0 [Self-hosted Renovate Bot] </summary>
> ### etcher-sdk-9.1.0 - 2024-06-13
>
> * patch: etcher-sdk is not yet compatible with node22 [JOASSART Edwin]
> * minor: allow passing custom assets to start SB protected CM4 [Edwin Joassart]
>
</details>
## 18.2.16 - 2024-07-02
<details>
<summary> Update dependency etcher-sdk to v9.0.11 [Self-hosted Renovate Bot] </summary>
> ### etcher-sdk-9.0.11 - 2024-04-26
>
> * patch: use http2 to fix issues with url source [Edwin Joassart]
>
> ### etcher-sdk-9.0.10 - 2024-04-26
>
> * patch: remove CI workaround [Edwin Joassart]
>
> ### etcher-sdk-9.0.9 - 2024-04-24
>
> * patch: add option to allow listing virtual drive on Mac [JOASSART Edwin]
>
</details>
## 18.2.15 - 2024-07-02
* Update dependency event-stream to v3.3.5 [Self-hosted Renovate Bot]
## 18.2.14 - 2024-07-02
* Update dependency jsonwebtoken to v9 [SECURITY] [Self-hosted Renovate Bot]
## 18.2.13 - 2024-07-02
* Update dependency @types/prettyjson to ^0.0.33 [Self-hosted Renovate Bot]
## 18.2.12 - 2024-07-02
* Deduplicate dependencies [Thodoris Greasidis]
## 18.2.11 - 2024-07-01
* Update dependency @types/fast-levenshtein to v0.0.4 [Self-hosted Renovate Bot]
## 18.2.10 - 2024-06-21
* Update actions/download-artifact action to v4.1.7 [Self-hosted Renovate Bot]
## 18.2.9 - 2024-06-21
* Update actions/setup-python digest to 65d7f2d [Self-hosted Renovate Bot]
## 18.2.8 - 2024-06-21
* Update actions/upload-artifact digest to 6546280 [Self-hosted Renovate Bot]
## 18.2.7 - 2024-06-21
* Pin dependencies [Self-hosted Renovate Bot]
## 18.2.6 - 2024-06-21
* Update @oclif/core from 3.26.9 to 3.27.0 [Otavio Jacobi]
## 18.2.5 - 2024-06-21
* Limit @oclif/core to ~3.26 so that npm dedupe doesn't auto-bump it [Thodoris Greasidis]
* Update TypeScript to 5.5.2 [Thodoris Greasidis]
## 18.2.4 - 2024-05-17
* patch: fix outdated doc for "os configure" [Edwin Joassart]
## 18.2.3 - 2024-05-15
* Pluralize command categories in docs [dfunckt]
## 18.2.2 - 2024-04-30
* Upgrade dockerode and docker-modem dependencies [Ken Bannister]
## 18.2.1 - 2024-04-23
* Use Actuated runners for Linux test and publish [Kyle Harding]
## 18.2.0 - 2024-04-17
* build: Auto-resolve the cpu arch when the --deviceType is provided [Thodoris Greasidis]
## 18.1.10 - 2024-04-16
* Mark node 20.6.0 as the minimum working version [Thodoris Greasidis]
## 18.1.9 - 2024-04-10
* Enable npm dedupe as part of Renovate postUpdateOptions [Kyle Harding]
## 18.1.8 - 2024-04-09
* Bump patch-package to 6.5.1 [Thodoris Greasidis]

View File

@ -115,9 +115,9 @@ The content sources for the auto generation of `docs/balena-cli.md` are:
* [Selected
sections](https://github.com/balena-io/balena-cli/blob/v12.23.0/automation/capitanodoc/capitanodoc.ts#L199-L204)
of the README file.
* The CLI's command documentation in source code (`lib/commands/` folder), for example:
* `lib/commands/push.ts`
* `lib/commands/env/add.ts`
* The CLI's command documentation in source code (`src/commands/` folder), for example:
* `src/commands/push.ts`
* `src/commands/env/add.ts`
The README file is manually edited, but subsections are automatically extracted for inclusion in
`docs/balena-cli.md` by the `getCapitanoDoc()` function in
@ -224,7 +224,7 @@ command, or by manually editing or copying files to the `node_modules` folder.
Unexpected behavior may then be observed because of the CLI's use of the
[fast-boot2](https://www.npmjs.com/package/fast-boot2) package that caches module resolution.
`fast-boot2` is configured in `lib/fast-boot.ts` to automatically invalidate the cache if
`fast-boot2` is configured in `src/fast-boot.ts` to automatically invalidate the cache if
changes are made to the `package.json` or `npm-shrinkwrap.json` files, but the cache won't
be automatically invalidated if `npm link` is used or if manual modifications are made to the
`node_modules` folder. In this situation:

View File

@ -40,7 +40,7 @@ By default, the CLI is installed to the following folders:
OS | Folders
--- | ---
Windows: | `C:\Program Files\balena-cli\`
macOS: | `/usr/local/lib/balena-cli/` <br> `/usr/local/bin/balena`
macOS: | `/usr/local/src/balena-cli/` <br> `/usr/local/bin/balena`
## Standalone Zip Package
@ -78,7 +78,7 @@ 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
some development tools to be installed first, as follows.
> **The balena CLI currently requires Node.js version 20.**
> **The balena CLI currently requires Node.js version ^20.6.0**
> **Versions 21 and later are not yet fully supported.**
### Install development tools

View File

@ -27,7 +27,7 @@ To update the balena CLI, repeat the steps above for the new version.
To uninstall it, run the following command on a terminal prompt:
```text
sudo /usr/local/lib/balena-cli/bin/uninstall
sudo /usr/local/src/balena-cli/bin/uninstall
```
## Additional Dependencies

View File

@ -15,7 +15,7 @@
* limitations under the License.
*/
import type { JsonVersions } from '../lib/commands/version/index';
import type { JsonVersions } from '../src/commands/version/index';
import { run as oclifRun } from '@oclif/core';
import * as archiver from 'archiver';

View File

@ -28,7 +28,7 @@ import { GlobSync } from 'glob';
*
* IMPORTANT
*
* All commands need to be stored under a folder in lib/commands to maintain uniformity
* All commands need to be stored under a folder in src/commands to maintain uniformity
* Generating docs will error out if directive not followed
* To add a custom heading for command docs, add the heading next to the folder name
* in the `commandHeadings` dictionary.
@ -54,15 +54,15 @@ interface Documentation {
// Mapping folders names to custom headings in the docs
const commandHeadings: { [key: string]: string } = {
'api-key': 'API Key',
'api-key': 'API Keys',
'api-keys': 'API Keys',
login: 'Authentication',
whoami: 'Authentication',
logout: 'Authentication',
env: 'Environment Variable',
env: 'Environment Variables',
envs: 'Environment Variables',
help: 'Help and Version',
key: 'SSH Key',
key: 'SSH Keys',
keys: 'SSH Keys',
orgs: 'Organizations',
os: 'OS',
@ -73,6 +73,12 @@ const commandHeadings: { [key: string]: string } = {
build: 'Deploy',
join: 'Platform',
leave: 'Platform',
app: 'Apps',
block: 'Blocks',
device: 'Devices',
fleet: 'Fleets',
release: 'Releases',
tag: 'Tags',
};
// Fetch all available commands

View File

@ -18,7 +18,7 @@ import * as path from 'path';
import { getCapitanoDoc } from './capitanodoc';
import type { Category, Document, OclifCommand } from './doc-types';
import * as markdown from './markdown';
import { stripIndent } from '../../lib/utils/lazy';
import { stripIndent } from '../../src/utils/lazy';
/**
* Generates the markdown document (as a string) for the CLI documentation
@ -39,7 +39,7 @@ export async function renderMarkdown(): Promise<string> {
};
for (const jsFilename of commandCategory.files) {
category.commands.push(...importOclifCommands(jsFilename));
category.commands.push(...(await importOclifCommands(jsFilename)));
}
result.categories.push(category);
}
@ -78,7 +78,9 @@ class FakeHelpCommand {
};
}
function importOclifCommands(jsFilename: string): OclifCommand[] {
async function importOclifCommands(
jsFilename: string,
): Promise<OclifCommand[]> {
// TODO: Currently oclif commands with no `usage` overridden will cause
// an error when parsed. This should be improved so that `usage` does not have
// to be overridden if not necessary.
@ -86,7 +88,8 @@ function importOclifCommands(jsFilename: string): OclifCommand[] {
const command: OclifCommand =
jsFilename === 'help'
? (new FakeHelpCommand() as unknown as OclifCommand)
: (require(path.join(process.cwd(), jsFilename)).default as OclifCommand);
: ((await import(path.join(process.cwd(), jsFilename)))
.default as OclifCommand);
return [command];
}

View File

@ -18,8 +18,8 @@ import { Parser } from '@oclif/core';
import * as ent from 'ent';
import * as _ from 'lodash';
import { getManualSortCompareFunction } from '../../lib/utils/helpers';
import { capitanoizeOclifUsage } from '../../lib/utils/oclif-utils';
import { getManualSortCompareFunction } from '../../src/utils/helpers';
import { capitanoizeOclifUsage } from '../../src/utils/oclif-utils';
import type { Category, Document, OclifCommand } from './doc-types';
function renderOclifCommand(command: OclifCommand): string[] {

View File

@ -15,41 +15,9 @@
* limitations under the License.
*/
import type { OptionDefinition } from 'capitano';
import * as ent from 'ent';
import * as fs from 'fs';
import * as readline from 'readline';
export function getOptionPrefix(signature: string) {
if (signature.length > 1) {
return '--';
} else {
return '-';
}
}
export function getOptionSignature(signature: string) {
return `${getOptionPrefix(signature)}${signature}`;
}
export function parseCapitanoOption(option: OptionDefinition): string {
let result = getOptionSignature(option.signature);
if (Array.isArray(option.alias)) {
for (const alias of option.alias) {
result += `, ${getOptionSignature(alias)}`;
}
} else if (typeof option.alias === 'string') {
result += `, ${getOptionSignature(option.alias)}`;
}
if (option.parameter) {
result += ` <${option.parameter}>`;
}
return ent.encode(result);
}
export class MarkdownFileParser {
constructor(public mdFilePath: string) {}

View File

@ -43,8 +43,8 @@ async function checkBuildTimestamps() {
...gitStatus.staged,
...gitStatus.renamed.map((o) => o.to),
])
// select only staged files that start with lib/ or typings/
.filter((f) => f.match(/^(lib|typings)[/\\]/))
// select only staged files that start with src/ or typings/
.filter((f) => f.match(/^(src|typings)[/\\]/))
.map((f) => path.join(ROOT, f));
const fStats = await Promise.all(stagedFiles.map((f) => fs.stat(f)));

View File

@ -15,59 +15,17 @@
* limitations under the License.
*/
import * as Bluebird from 'bluebird';
import * as _ from 'lodash';
import * as semver from 'semver';
import { finalReleaseAssets, version } from './build-bin';
import { Octokit } from '@octokit/rest';
import { throttling } from '@octokit/plugin-throttling';
const { GITHUB_TOKEN } = process.env;
/**
* Create or update a release in GitHub's releases page, uploading the
* installer files (standalone zip + native oclif installers).
*/
export async function createGitHubRelease() {
console.log(`Publishing release ${version} to GitHub`);
const publishRelease = await import('publish-release');
const ghRelease = (await Bluebird.fromCallback(
publishRelease.bind(null, {
token: GITHUB_TOKEN || '',
owner: 'balena-io',
repo: 'balena-cli',
tag: version,
name: `balena-CLI ${version}`,
reuseRelease: true,
assets: finalReleaseAssets[process.platform],
}),
)) as { html_url: any };
console.log(`Release ${version} successful: ${ghRelease.html_url}`);
}
/**
* Top-level function to create a CLI release in GitHub's releases page:
* call zipStandaloneInstaller(), rename the files as we'd like them to
* display on the releases page, and call createGitHubRelease() to upload
* the files.
*/
export async function release() {
try {
await createGitHubRelease();
} catch (err) {
throw new Error(`Error creating GitHub release:\n${err}`);
}
}
/** Return a cached Octokit instance, creating a new one as needed. */
const getOctokit = _.once(function () {
const Octokit = (
require('@octokit/rest') as typeof import('@octokit/rest')
).Octokit.plugin(
(
require('@octokit/plugin-throttling') as typeof import('@octokit/plugin-throttling')
).throttling,
);
return new Octokit({
const OctokitConstructor = Octokit.plugin(throttling);
return new OctokitConstructor({
auth: GITHUB_TOKEN,
throttle: {
onRateLimit: (retryAfter: number, options: any) => {
@ -103,16 +61,16 @@ const getOctokit = _.once(function () {
* 'pages' is the total number of pages, and 'ordinal' is the ordinal number
* (3rd, 4th, 5th...) of the first item in the current page.
*/
function getPageNumbers(
async function getPageNumbers(
response: any,
perPageDefault: number,
): { page: number; pages: number; ordinal: number } {
): Promise<{ page: number; pages: number; ordinal: number }> {
const res = { page: 1, pages: 1, ordinal: 1 };
if (!response.headers.link) {
return res;
}
const parse =
require('parse-link-header') as typeof import('parse-link-header');
const parse = await import('parse-link-header');
const parsed = parse(response.headers.link);
if (parsed == null) {
throw new Error(`Failed to parse link header: '${response.headers.link}'`);
@ -122,13 +80,13 @@ function getPageNumbers(
if (parsed.next.per_page) {
perPage = parseInt(parsed.next.per_page, 10);
}
res.page = parseInt(parsed.next.page, 10) - 1;
res.pages = parseInt(parsed.last.page, 10);
res.page = parseInt(parsed.next.page!, 10) - 1;
res.pages = parseInt(parsed.last!.page!, 10);
} else {
if (parsed.prev.per_page) {
perPage = parseInt(parsed.prev.per_page, 10);
if (parsed.prev!.per_page) {
perPage = parseInt(parsed.prev!.per_page, 10);
}
res.page = res.pages = parseInt(parsed.prev.page, 10) + 1;
res.page = res.pages = parseInt(parsed.prev!.page!, 10) + 1;
}
res.ordinal = (res.page - 1) * perPage + 1;
return res;
@ -167,7 +125,7 @@ async function updateGitHubReleaseDescriptions(
page: thisPage,
pages: totalPages,
ordinal,
} = getPageNumbers(response, perPage);
} = await getPageNumbers(response, perPage);
let i = 0;
for (const cliRelease of response.data) {
const prefix = `[#${ordinal + i++} pg ${thisPage}/${totalPages}]`;

View File

@ -24,10 +24,7 @@ import {
signFilesForNotarization,
testShrinkwrap,
} from './build-bin';
import {
release,
updateDescriptionOfReleasesAffectedByIssue1359,
} from './deploy-bin';
import { updateDescriptionOfReleasesAffectedByIssue1359 } from './deploy-bin';
// DEBUG set to falsy for negative values else is truthy
process.env.DEBUG = ['0', 'no', 'false', '', undefined].includes(
@ -41,7 +38,6 @@ process.env.DEBUG = ['0', 'no', 'false', '', undefined].includes(
* of the following strings, then call the appropriate functions:
* 'build:installer' (to build a native oclif installer)
* 'build:standalone' (to build a standalone pkg package)
* 'release' (to create/update a GitHub release)
*
* @param args Arguments to parse (default is process.argv.slice(2))
*/
@ -59,7 +55,6 @@ async function parse(args?: string[]) {
'catch-uncommitted': catchUncommitted,
'test-shrinkwrap': testShrinkwrap,
fix1359: updateDescriptionOfReleasesAffectedByIssue1359,
release,
};
for (const arg of args) {
if (!Object.hasOwn(commands, arg)) {

View File

@ -17,6 +17,8 @@
import { spawn } from 'child_process';
import * as path from 'path';
import * as fs from 'fs';
import { diffTrimmedLines } from 'diff';
export const ROOT = path.join(__dirname, '..');
@ -64,7 +66,6 @@ export class StdOutTap {
* https://www.npmjs.com/package/diff
*/
export function diffLines(str1: string, str2: string): string {
const { diffTrimmedLines } = require('diff');
const diffObjs = diffTrimmedLines(str1, str2);
const prefix = (chunk: string, char: string) =>
chunk
@ -84,7 +85,10 @@ export function diffLines(str1: string, str2: string): string {
}
export function loadPackageJson() {
return require(path.join(ROOT, 'package.json'));
const packageJsonPath = path.join(ROOT, 'package.json');
const packageJson = fs.readFileSync(packageJsonPath, 'utf8');
return JSON.parse(packageJson);
}
/**

View File

@ -29,7 +29,7 @@ const path = require('path');
const rootDir = path.join(__dirname, '..');
// Allow balena-dev to work with oclif by temporarily
// pointing oclif config options to lib/ instead of build/
// pointing oclif config options to src/ instead of build/
modifyOclifPaths();
// Undo changes on exit
process.on('exit', function () {
@ -57,9 +57,9 @@ require('ts-node').register({
project: path.join(rootDir, 'tsconfig.json'),
transpileOnly: true,
});
require('../lib/app').run(undefined, { dir: __dirname, development: true });
require('../src/app').run(undefined, { dir: __dirname, development: true });
// Modify package.json oclif paths from build/ -> lib/, or vice versa
// Modify package.json oclif paths from build/ -> src/, or vice versa
function modifyOclifPaths(revert) {
const fs = require('fs');
const packageJsonPath = path.join(rootDir, 'package.json');
@ -73,9 +73,9 @@ function modifyOclifPaths(revert) {
let oclifSectionText = JSON.stringify(packageObj.oclif);
if (!revert) {
oclifSectionText = oclifSectionText.replace(/\/build\//g, '/lib/');
oclifSectionText = oclifSectionText.replace(/\/build\//g, '/src/');
} else {
oclifSectionText = oclifSectionText.replace(/\/lib\//g, '/build/');
oclifSectionText = oclifSectionText.replace(/\/src\//g, '/build/');
}
packageObj.oclif = JSON.parse(oclifSectionText);

View File

@ -8,7 +8,7 @@ _balena() {
local context state line curcontext="$curcontext"
# Valid top-level completions
main_commands=( api-key api-keys app block build config deploy device device devices env envs fleet fleet fleets internal join key key keys leave local login logout logs notes orgs os preload push release release releases scan settings ssh support tag tags tunnel util version whoami )
main_commands=( api-key api-keys app block build config deploy device devices env envs fleet fleets internal join key keys leave local login logout logs notes orgs os preload push release releases scan settings ssh support tag tags tunnel util version whoami )
# Sub-completions
api_key_cmds=( generate revoke )
app_cmds=( create )
@ -22,7 +22,7 @@ _balena() {
key_cmds=( add rm )
local_cmds=( configure flash )
os_cmds=( build-config configure download initialize versions )
release_cmds=( finalize invalidate validate )
release_cmds=( export finalize import invalidate validate )
tag_cmds=( rm set )

View File

@ -7,7 +7,7 @@ _balena_complete()
local cur prev
# Valid top-level completions
main_commands="api-key api-keys app block build config deploy device device devices env envs fleet fleet fleets internal join key key keys leave local login logout logs notes orgs os preload push release release releases scan settings ssh support tag tags tunnel util version whoami"
main_commands="api-key api-keys app block build config deploy device devices env envs fleet fleets internal join key keys leave local login logout logs notes orgs os preload push release releases scan settings ssh support tag tags tunnel util version whoami"
# Sub-completions
api_key_cmds="generate revoke"
app_cmds="create"
@ -21,7 +21,7 @@ _balena_complete()
key_cmds="add rm"
local_cmds="configure flash"
os_cmds="build-config configure download initialize versions"
release_cmds="finalize invalidate validate"
release_cmds="export finalize import invalidate validate"
tag_cmds="rm set"

View File

@ -33,7 +33,7 @@ const commandsJson = JSON.parse(fs.readFileSync(commandsFilePath, 'utf8'));
const mainCommands = [];
const additionalCommands = [];
for (const key of Object.keys(commandsJson.commands)) {
for (const key of Object.keys(commandsJson.commands).sort()) {
const cmd = key.split(':');
if (cmd.length > 1) {
additionalCommands.push(cmd);

View File

@ -160,16 +160,13 @@ are encouraged to regularly update the balena CLI to the latest version.
# CLI Command Reference
- API Key
- API Keys
- [api-key generate &#60;name&#62;](#api-key-generate-name)
- [api-key revoke &#60;ids&#62;](#api-key-revoke-ids)
- API Keys
- [api-keys](#api-keys)
- App
- Apps
- [app create &#60;name&#62;](#app-create-name)
@ -179,7 +176,7 @@ are encouraged to regularly update the balena CLI to the latest version.
- [logout](#logout)
- [whoami](#whoami)
- Block
- Blocks
- [block create &#60;name&#62;](#block-create-name)
@ -196,7 +193,7 @@ are encouraged to regularly update the balena CLI to the latest version.
- [build [source]](#build-source)
- [deploy &#60;fleet&#62; [image]](#deploy-fleet-image)
- Device
- Devices
- [device deactivate &#60;uuid&#62;](#device-deactivate-uuid)
- [device identify &#60;uuid&#62;](#device-identify-uuid)
@ -217,23 +214,17 @@ are encouraged to regularly update the balena CLI to the latest version.
- [device start-service &#60;uuid&#62;](#device-start-service-uuid)
- [device stop-service &#60;uuid&#62;](#device-stop-service-uuid)
- [device track-fleet &#60;uuid&#62;](#device-track-fleet-uuid)
- Devices
- [devices](#devices)
- [devices supported](#devices-supported)
- Environment Variable
- [env add &#60;name&#62; [value]](#env-add-name-value)
- [env rename &#60;id&#62; &#60;value&#62;](#env-rename-id-value)
- [env rm &#60;id&#62;](#env-rm-id)
- Environment Variables
- [envs](#envs)
- [env rm &#60;id&#62;](#env-rm-id)
- [env add &#60;name&#62; [value]](#env-add-name-value)
- [env rename &#60;id&#62; &#60;value&#62;](#env-rename-id-value)
- Fleet
- Fleets
- [fleet create &#60;name&#62;](#fleet-create-name)
- [fleet &#60;fleet&#62;](#fleet-fleet)
@ -243,9 +234,6 @@ are encouraged to regularly update the balena CLI to the latest version.
- [fleet restart &#60;fleet&#62;](#fleet-restart-fleet)
- [fleet rm &#60;fleet&#62;](#fleet-rm-fleet)
- [fleet track-latest &#60;slug&#62;](#fleet-track-latest-slug)
- Fleets
- [fleets](#fleets)
- Local
@ -292,42 +280,35 @@ are encouraged to regularly update the balena CLI to the latest version.
- [push &#60;fleetordevice&#62;](#push-fleetordevice)
- Release
- Releases
- [release export &#60;commitorid&#62;](#release-export-commitorid)
- [release finalize &#60;commitorid&#62;](#release-finalize-commitorid)
- [release import &#60;file&#62; &#60;fleet&#62;](#release-import-file-fleet)
- [release &#60;commitorid&#62;](#release-commitorid)
- [release invalidate &#60;commitorid&#62;](#release-invalidate-commitorid)
- [release validate &#60;commitorid&#62;](#release-validate-commitorid)
- Releases
- [releases &#60;fleet&#62;](#releases-fleet)
- Settings
- [settings](#settings)
- SSH Key
- SSH Keys
- [key add &#60;name&#62; [path]](#key-add-name-path)
- [key &#60;id&#62;](#key-id)
- [key rm &#60;id&#62;](#key-rm-id)
- SSH Keys
- [keys](#keys)
- Support
- [support &#60;action&#62;](#support-action)
- Tag
- Tags
- [tag rm &#60;tagkey&#62;](#tag-rm-tagkey)
- [tag set &#60;tagkey&#62; [value]](#tag-set-tagkey-value)
- Tags
- [tags](#tags)
- Utilities
@ -338,7 +319,7 @@ are encouraged to regularly update the balena CLI to the latest version.
- [version](#version)
# API Key
# API Keys
## api-key generate &#60;name&#62;
@ -380,8 +361,6 @@ the API key ids
### Options
# API Keys
## api-keys
Print a list of balenaCloud API keys.
@ -402,7 +381,7 @@ show API keys for your user
fleet name or slug (preferred)
# App
# Apps
## app create &#60;name&#62;
@ -524,7 +503,7 @@ Examples:
$ balena whoami
# Block
# Blocks
## block create &#60;name&#62;
@ -882,6 +861,7 @@ Examples:
$ balena build --fleet myFleet
$ balena build ./source/ --fleet myorg/myfleet
$ balena build --deviceType raspberrypi3 --emulated
$ balena build --deviceType raspberrypi3 --arch armv7hf --emulated
$ balena build --docker /var/run/docker.sock --fleet myFleet # Linux, Mac
$ balena build --docker //./pipe/docker_engine --fleet myFleet # Windows
@ -1214,7 +1194,7 @@ Docker host TLS certificate file
Docker host TLS key file
# Device
# Devices
## device deactivate &#60;uuid&#62;
@ -1774,8 +1754,6 @@ the uuid of the device to make track the fleet's release
### Options
# Devices
## devices
List all of your devices.
@ -1835,7 +1813,149 @@ Examples:
produce JSON output instead of tabular output
# Environment Variable
# Environment Variables
## envs
List the environment or configuration variables of a fleet, device or
service, as selected by the respective command-line options. (A service
corresponds to a Docker image/container in a microservices fleet.)
The results include fleet-wide (multiple devices), device-specific (multiple
services on a specific device) and service-specific variables that apply to the
selected fleet, device or service. It can be thought of as including inherited
variables; for example, a service inherits device-wide variables, and a device
inherits fleet-wide variables.
The printed output may include DEVICE and/or SERVICE columns to distinguish
between fleet-wide, device-specific and service-specific variables.
An asterisk in these columns indicates that the variable applies to
"all devices" or "all services".
The --config option is used to list "configuration variables" that control
balena platform features, as opposed to custom environment variables defined
by the user. The --config and the --service options are mutually exclusive
because configuration variables cannot be set for specific services.
The --json option is recommended when scripting the output of this command,
because the JSON format is less likely to change and it better represents data
types like lists and empty strings. The 'jq' utility may be helpful in shell
scripts (https://stedolan.github.io/jq/manual/). When --json is used, an empty
JSON array ([]) is printed instead of an error message when no variables exist
for the given query. When querying variables for a device, note that the fleet
name may be null in JSON output (or 'N/A' in tabular output) if the fleet that
the device belonged to is no longer accessible by the current user (for example,
in case the current user was removed from the fleet by the fleet's owner).
Fleets may be specified by fleet name or slug. Fleet slugs are
the recommended option, as they are unique and unambiguous. Slugs can be
listed with the `balena fleets` command. Note that slugs may change if the
fleet is renamed. Fleet names are not unique and may result in "Fleet is
ambiguous" errors at any time (even if it "used to work in the past"), for
example if the name clashes with a newly created public fleet, or with fleets
from other balena accounts that you may be invited to join under any role.
For this reason, fleet names are especially discouraged in scripts (e.g. CI
environments).
Examples:
$ balena envs --fleet myorg/myfleet
$ balena envs --fleet MyFleet --json
$ balena envs --fleet MyFleet --service MyService
$ balena envs --fleet MyFleet --config
$ balena envs --device 7cf02a6
$ balena envs --device 7cf02a6 --json
$ balena envs --device 7cf02a6 --config --json
$ balena envs --device 7cf02a6 --service MyService
### Options
#### -f, --fleet FLEET
fleet name or slug (preferred)
#### -c, --config
show configuration variables only
#### -d, --device DEVICE
device UUID
#### -j, --json
produce JSON output instead of tabular output
#### -s, --service SERVICE
service name
## env rm &#60;id&#62;
Remove a configuration or environment variable from a fleet, device
or service, as selected by command-line options.
Variables are selected by their database ID (as reported by the 'balena envs'
command) and one of six database "resource types":
- fleet environment variable
- fleet configuration variable (--config)
- fleet service variable (--service)
- device environment variable (--device)
- device configuration variable (--device --config)
- device service variable (--device --service)
The --device option selects a device-specific variable instead of a fleet
variable.
The --config option selects a configuration variable. Configuration variable
names typically start with the 'BALENA_' or 'RESIN_' prefixes and are used to
configure balena platform features.
The --service option selects a service variable, which is an environment variable
that applies to a specifc service (container) in a microservices (multicontainer)
fleet.
The --service and --config options cannot be used together, but they can be
used alongside the --device option to select a device-specific service or
configuration variable.
Interactive confirmation is normally asked before the variable is deleted.
The --yes option disables this behavior.
Examples:
$ balena env rm 123123
$ balena env rm 234234 --yes
$ balena env rm 345345 --config
$ balena env rm 456456 --service
$ balena env rm 567567 --device
$ balena env rm 678678 --device --config
$ balena env rm 789789 --device --service --yes
### Arguments
#### ID
variable's numeric database ID
### Options
#### -c, --config
select a configuration variable (may be used together with the --device option)
#### -d, --device
select a device-specific variable instead of a fleet variable
#### -s, --service
select a service variable (may be used together with the --device option)
#### -y, --yes
do not prompt for confirmation before deleting the variable
## env add &#60;name&#62; [value]
@ -1975,151 +2095,7 @@ select a device-specific variable instead of a fleet variable
select a service variable (may be used together with the --device option)
## env rm &#60;id&#62;
Remove a configuration or environment variable from a fleet, device
or service, as selected by command-line options.
Variables are selected by their database ID (as reported by the 'balena envs'
command) and one of six database "resource types":
- fleet environment variable
- fleet configuration variable (--config)
- fleet service variable (--service)
- device environment variable (--device)
- device configuration variable (--device --config)
- device service variable (--device --service)
The --device option selects a device-specific variable instead of a fleet
variable.
The --config option selects a configuration variable. Configuration variable
names typically start with the 'BALENA_' or 'RESIN_' prefixes and are used to
configure balena platform features.
The --service option selects a service variable, which is an environment variable
that applies to a specifc service (container) in a microservices (multicontainer)
fleet.
The --service and --config options cannot be used together, but they can be
used alongside the --device option to select a device-specific service or
configuration variable.
Interactive confirmation is normally asked before the variable is deleted.
The --yes option disables this behavior.
Examples:
$ balena env rm 123123
$ balena env rm 234234 --yes
$ balena env rm 345345 --config
$ balena env rm 456456 --service
$ balena env rm 567567 --device
$ balena env rm 678678 --device --config
$ balena env rm 789789 --device --service --yes
### Arguments
#### ID
variable's numeric database ID
### Options
#### -c, --config
select a configuration variable (may be used together with the --device option)
#### -d, --device
select a device-specific variable instead of a fleet variable
#### -s, --service
select a service variable (may be used together with the --device option)
#### -y, --yes
do not prompt for confirmation before deleting the variable
# Environment Variables
## envs
List the environment or configuration variables of a fleet, device or
service, as selected by the respective command-line options. (A service
corresponds to a Docker image/container in a microservices fleet.)
The results include fleet-wide (multiple devices), device-specific (multiple
services on a specific device) and service-specific variables that apply to the
selected fleet, device or service. It can be thought of as including inherited
variables; for example, a service inherits device-wide variables, and a device
inherits fleet-wide variables.
The printed output may include DEVICE and/or SERVICE columns to distinguish
between fleet-wide, device-specific and service-specific variables.
An asterisk in these columns indicates that the variable applies to
"all devices" or "all services".
The --config option is used to list "configuration variables" that control
balena platform features, as opposed to custom environment variables defined
by the user. The --config and the --service options are mutually exclusive
because configuration variables cannot be set for specific services.
The --json option is recommended when scripting the output of this command,
because the JSON format is less likely to change and it better represents data
types like lists and empty strings. The 'jq' utility may be helpful in shell
scripts (https://stedolan.github.io/jq/manual/). When --json is used, an empty
JSON array ([]) is printed instead of an error message when no variables exist
for the given query. When querying variables for a device, note that the fleet
name may be null in JSON output (or 'N/A' in tabular output) if the fleet that
the device belonged to is no longer accessible by the current user (for example,
in case the current user was removed from the fleet by the fleet's owner).
Fleets may be specified by fleet name or slug. Fleet slugs are
the recommended option, as they are unique and unambiguous. Slugs can be
listed with the `balena fleets` command. Note that slugs may change if the
fleet is renamed. Fleet names are not unique and may result in "Fleet is
ambiguous" errors at any time (even if it "used to work in the past"), for
example if the name clashes with a newly created public fleet, or with fleets
from other balena accounts that you may be invited to join under any role.
For this reason, fleet names are especially discouraged in scripts (e.g. CI
environments).
Examples:
$ balena envs --fleet myorg/myfleet
$ balena envs --fleet MyFleet --json
$ balena envs --fleet MyFleet --service MyService
$ balena envs --fleet MyFleet --config
$ balena envs --device 7cf02a6
$ balena envs --device 7cf02a6 --json
$ balena envs --device 7cf02a6 --config --json
$ balena envs --device 7cf02a6 --service MyService
### Options
#### -f, --fleet FLEET
fleet name or slug (preferred)
#### -c, --config
show configuration variables only
#### -d, --device DEVICE
device UUID
#### -j, --json
produce JSON output instead of tabular output
#### -s, --service SERVICE
service name
# Fleet
# Fleets
## fleet create &#60;name&#62;
@ -2194,13 +2170,9 @@ fleet name or slug (preferred)
open fleet dashboard page
#### --fields FIELDS
only show provided fields (comma-separated)
#### -j, --json
output in json format
produce JSON output instead of tabular output
## fleet pin &#60;slug&#62; [releaseToPinTo]
@ -2366,8 +2338,6 @@ the slug of the fleet to make track the latest release
### Options
# Fleets
## fleets
List all your balena fleets.
@ -2381,29 +2351,9 @@ Examples:
### Options
#### --fields FIELDS
only show provided fields (comma-separated)
#### -j, --json
output in json format
#### --filter FILTER
filter results by substring matching of a given field, eg: --filter field=foo
#### --no-header
hide table header from output
#### --no-truncate
do not truncate output to fit screen
#### --sort SORT
field to sort by (prepend '-' for descending order)
produce JSON output instead of tabular output
# Local
@ -2862,11 +2812,6 @@ from other balena accounts that you may be invited to join under any role.
For this reason, fleet names are especially discouraged in scripts (e.g. CI
environments).
Note: This command is currently not supported on Windows natively. Windows users
are advised to install the Windows Subsystem for Linux (WSL) with Ubuntu, and use
the Linux release of the balena CLI:
https://docs.microsoft.com/en-us/windows/wsl/about
Examples:
$ balena os configure ../path/rpi3.img --device 7cf02a6
@ -3400,7 +3345,38 @@ as final by default unless this option is given.
The notes for this release
# Release
# Releases
## release export &#60;commitOrId&#62;
Exporting a release to a file allows you to import an exact
copy of the original release into another app.
If the SemVer of a release is provided using the --version option,
the first argument is assumed to be the fleet's slug.
Only successful releases can be exported.
Examples:
$ balena release export a777f7345fe3d655c1c981aa642e5555 -o ../path/to/release.tar
$ balena release export myOrg/myFleet --version 1.2.3 -o ../path/to/release.tar
### Arguments
#### COMMITORID
commit, ID, or version of the release to export
### Options
#### -o, --output OUTPUT
output path
#### --version VERSION
version of the release to export from the specified fleet
## release finalize &#60;commitOrId&#62;
@ -3428,6 +3404,40 @@ the commit or ID of the release to finalize
### Options
## release import &#60;file&#62; &#60;fleet&#62;
is automatically omitted when importing a release. The backend will auto-increment
the revision field of the imported release if a release exists with the same semver.
A release will not be imported if a successful release with the same commit already
exists.
To export a release to a file, use 'balena release export'.
Use the --override-version option to specify the version
of the imported release, overriding the one saved in the file.
Examples:
$ balena release import ../path/to/release.tar myFleet
$ balena release import ../path/to/release.tar myOrg/myFleet
$ balena release import ../path/to/release.tar myOrg/myFleet --override-version 1.2.3
### Arguments
#### BUNDLE
path to a file, e.g. "./release.tar"
#### FLEET
fleet that the release will be imported to, e.g. "myOrg/myFleet"
### Options
#### --override-version OVERRIDE-VERSION
Imports this release with the specified version overriding the version in the file.
## release &#60;commitOrId&#62;
The --json option is recommended when scripting the output of this command,
@ -3499,8 +3509,6 @@ the commit or ID of the release to validate
### Options
# Releases
## releases &#60;fleet&#62;
List all releases of the given fleet.
@ -3549,7 +3557,7 @@ Examples:
### Options
# SSH Key
# SSH Keys
## key add &#60;name&#62; [path]
@ -3629,8 +3637,6 @@ balenaCloud ID for the SSH key
answer "yes" to all questions (non interactive use)
# SSH Keys
## keys
List all SSH keys registered in balenaCloud for the logged in user.
@ -3691,7 +3697,7 @@ comma-separated list (no spaces) of fleet names or slugs (preferred)
length of time to enable support for, in (h)ours or (d)ays, e.g. 12h, 2d
# Tag
# Tags
## tag rm &#60;tagKey&#62;
@ -3788,8 +3794,6 @@ device UUID
release id
# Tags
## tags
List all tags and their values for the specified fleet, device or release.

View File

@ -1,19 +0,0 @@
/*
Copyright 2020 Balena
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import type { DataOutputOptions, DataSetOutputOptions } from './output';
export { DataOutputOptions, DataSetOutputOptions };

View File

@ -1,158 +0,0 @@
/*
Copyright 2020 Balena
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import { getCliUx, getChalk } from '../utils/lazy';
export interface DataOutputOptions {
fields?: string;
json?: boolean;
}
export interface DataSetOutputOptions extends DataOutputOptions {
filter?: string;
'no-header'?: boolean;
'no-truncate'?: boolean;
sort?: string;
}
/**
* Output message to STDERR
*/
export function outputMessage(msg: string) {
// Messages go to STDERR
console.error(msg);
}
/**
* Output result data to STDOUT
* Supports:
* - arrays of items (displayed in a tabular way),
* - single items (displayed in a field per row format).
*
* @param data Array of data objects to output
* @param fields Array of fieldnames, specifying the fields and display order
* @param options Output options
*/
export async function outputData(
data: any[] | object,
fields: string[],
options: DataOutputOptions | DataSetOutputOptions,
) {
if (Array.isArray(data)) {
await outputDataSet(data, fields, options as DataSetOutputOptions);
} else {
await outputDataItem(data, fields, options as DataOutputOptions);
}
}
/**
* Wraps the cli.ux table implementation, to output tabular data
*
* @param data Array of data objects to output
* @param fields Array of fieldnames, specifying the fields and display order
* @param options Output options
*/
async function outputDataSet(
data: any[],
fields: string[],
options: DataSetOutputOptions,
) {
// Oclif expects fields to be specified in the format used in table headers (though lowercase)
// By replacing underscores with spaces here, we can support both header format and actual field name
// (e.g. as seen in json output).
options.fields = options.fields?.replace(/_/g, ' ');
options.filter = options.filter?.replace(/_/g, ' ');
options.sort = options.sort?.replace(/_/g, ' ');
getCliUx().table(
data,
// Convert fields array to column object keys
// that cli.ux expects. We can later add support
// for both formats if beneficial
fields.reduce((ac, a) => ({ ...ac, [a]: {} }), {}),
{
...options,
...(options.json
? {
output: 'json',
}
: {}),
columns: options.fields,
printLine,
},
);
}
/**
* Outputs a single data object (like `resin-cli-visuals table.vertical`),
* but supporting a subset of options from `cli-ux table` (--json and --fields)
*
* @param data Array of data objects to output
* @param fields Array of fieldnames, specifying the fields and display order
* @param options Output options
*/
async function outputDataItem(
data: any,
fields: string[],
options: DataOutputOptions,
) {
const outData: typeof data = {};
// Convert comma separated list of fields in `options.fields` to array of correct format.
// Note, user may have specified the true field name (e.g. `some_field`),
// or the format displayed in headers (e.g. `Some field`, case insensitive).
const userSelectedFields = options.fields?.split(',').map((f) => {
return f.toLowerCase().trim().replace(/ /g, '_');
});
// Order and filter the fields based on `fields` parameter and `options.fields`
(userSelectedFields || fields).forEach((fieldName) => {
if (fields.includes(fieldName)) {
outData[fieldName] = data[fieldName];
}
});
if (options.json) {
printLine(JSON.stringify(outData, undefined, 2));
} else {
const chalk = getChalk();
const { capitalize } = await import('lodash');
// Find longest key, so we can align results
const longestKeyLength = getLongestObjectKeyLength(outData);
// Output one field per line
for (const [k, v] of Object.entries(outData)) {
const shim = ' '.repeat(longestKeyLength - k.length);
const kDisplay = capitalize(k.replace(/_/g, ' '));
printLine(`${chalk.bold(kDisplay) + shim} : ${v}`);
}
}
}
function getLongestObjectKeyLength(o: any): number {
return Object.keys(o).length >= 1
? Object.keys(o).reduce((a, b) => {
return a.length > b.length ? a : b;
}).length
: 0;
}
function printLine(s: any) {
// Duplicating oclif cli-ux's default implementation here,
// but using this one explicitly for ease of testing
process.stdout.write(s + '\n');
}

View File

@ -1,40 +0,0 @@
import { enumerateServices, findServices } from 'resin-discoverable-services';
interface LocalBalenaOsDevice {
address: string;
host: string;
osVariant?: string;
port: number;
}
// Although we only check for 'balena-ssh', we know, implicitly, that balenaOS
// devices come with 'rsync' installed that can be used over SSH.
const avahiBalenaSshTag = 'resin-ssh';
export async function discoverLocalBalenaOsDevices(
timeout = 4000,
): Promise<LocalBalenaOsDevice[]> {
const availableServices = await enumerateServices();
const serviceDefinitions = Array.from(availableServices)
.filter((s) => Array.from(s.tags).includes(avahiBalenaSshTag))
.map((s) => s.service);
if (serviceDefinitions.length === 0) {
throw new Error(
`Could not find any available '${avahiBalenaSshTag}' services`,
);
}
const services = await findServices(serviceDefinitions, timeout);
return services.map(function (service) {
// User referer address to get device IP. This will work fine assuming that
// a device only advertises own services.
const {
referer: { address },
host,
port,
} = service;
return { address, host, port };
});
}

13396
npm-shrinkwrap.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "balena-cli",
"version": "18.1.8",
"version": "19.0.3",
"description": "The official balena Command Line Interface",
"main": "./build/app.js",
"homepage": "https://github.com/balena-io/balena-cli",
@ -14,7 +14,7 @@
"bin/",
"build/",
"doc/",
"lib/",
"src/",
"patches/",
"!patches/**/**.dev.patch",
"*.md",
@ -33,7 +33,6 @@
],
"assets": [
"build/auth/pages/*.ejs",
"node_modules/resin-discoverable-services/services/**/*",
"node_modules/balena-sdk/node_modules/balena-pine/**/*",
"node_modules/balena-pine/**/*",
"node_modules/pinejs-client-core/**/*",
@ -52,7 +51,7 @@
"build": "npm run build:src && npm run catch-uncommitted",
"build:t": "npm run lint && npm run build:fast && npm run build:test",
"build:src": "npm run lint && npm run build:fast && npm run build:test && npm run build:doc && npm run build:completion",
"build:pages": "mkdirp ./build/auth/pages/&& inline-source --compress ./lib/auth/pages/error.ejs ./build/auth/pages/error.ejs && inline-source --compress ./lib/auth/pages/success.ejs ./build/auth/pages/success.ejs",
"build:pages": "mkdirp ./build/auth/pages/&& inline-source --compress ./src/auth/pages/error.ejs ./build/auth/pages/error.ejs && inline-source --compress ./src/auth/pages/success.ejs ./build/auth/pages/success.ejs",
"build:fast": "npm run build:pages && tsc && npx oclif manifest",
"build:test": "tsc -P ./tsconfig.dev.json --noEmit",
"build:doc": "ts-node --transpile-only automation/capitanodoc/index.ts > docs/balena-cli.md",
@ -60,7 +59,6 @@
"build:standalone": "ts-node --transpile-only automation/run.ts build:standalone",
"build:installer": "ts-node --transpile-only automation/run.ts build:installer",
"package": "npm run build:fast && npm run build:standalone && npm run build:installer",
"release": "ts-node --transpile-only automation/run.ts release",
"pretest": "npm run build",
"test": "npm run test:shrinkwrap && npm run test:core",
"test:core": "npm run test:source && npm run test:standalone",
@ -69,15 +67,16 @@
"test:standalone": "npm run build:standalone && npm run test:standalone:fast",
"test:standalone:fast": "cross-env BALENA_CLI_TEST_TYPE=standalone mocha --config .mocharc-standalone.js",
"test:fast": "npm run build:fast && npm run test:source",
"test:fast-profile": "npm run test:fast -- -- --inspect-brk=0.0.0.0",
"test:debug": "cross-env BALENA_CLI_TEST_TYPE=source mocha --inspect-brk=0.0.0.0",
"test:only": "npm run build:fast && cross-env BALENA_CLI_TEST_TYPE=source mocha \"tests/**/${npm_config_test}.spec.ts\"",
"catch-uncommitted": "ts-node --transpile-only automation/run.ts catch-uncommitted",
"ci": "npm run test && npm run catch-uncommitted",
"lint": "npm run lint-tsconfig && npm run lint-other",
"lint-tsconfig": "balena-lint -e ts -e js -t tsconfig.dev.json --fix automation/ lib/ tests/ typings/",
"lint-tsconfig": "balena-lint -e ts -e js -t tsconfig.dev.json --fix automation/ src/ tests/ typings/",
"lint-other": "balena-lint -e ts -e js --fix bin/run.js bin/dev.js completion/ .mocharc.js .mocharc-standalone.js",
"update": "ts-node --transpile-only ./automation/update-module.ts",
"prepare": "echo {} > bin/.fast-boot.json",
"prepare": "echo {} > bin/.fast-boot.json && husky",
"prepublishOnly": "npm run build"
},
"keywords": [
@ -92,12 +91,7 @@
"author": "Balena Inc. (https://balena.io/)",
"license": "Apache-2.0",
"engines": {
"node": ">=20 <21"
},
"husky": {
"hooks": {
"pre-commit": "node automation/check-npm-version.js && ts-node automation/check-doc.ts"
}
"node": "^20.6.0"
},
"oclif": {
"bin": "balena",
@ -121,7 +115,7 @@
"@electron/notarize": "^2.0.0",
"@octokit/plugin-throttling": "^3.5.1",
"@octokit/rest": "^18.6.7",
"@types/archiver": "^5.1.1",
"@types/archiver": "^6.0.2",
"@types/bluebird": "^3.5.36",
"@types/body-parser": "^1.19.2",
"@types/chai": "^4.3.0",
@ -129,10 +123,11 @@
"@types/cli-truncate": "^2.0.0",
"@types/common-tags": "^1.8.1",
"@types/diff": "^5.0.3",
"@types/dockerode": "^3.3.9",
"@types/dockerode": "3.3.23",
"@types/ejs": "^3.1.0",
"@types/express": "^4.17.13",
"@types/fs-extra": "^9.0.13",
"@types/fast-levenshtein": "^0.0.4",
"@types/fs-extra": "^11.0.4",
"@types/global-agent": "^2.1.1",
"@types/global-tunnel-ng": "^2.1.1",
"@types/http-proxy": "^1.17.8",
@ -140,35 +135,35 @@
"@types/intercept-stdout": "^0.1.0",
"@types/is-root": "^2.1.2",
"@types/js-yaml": "^4.0.5",
"@types/jsonwebtoken": "^8.5.6",
"@types/klaw": "^3.0.3",
"@types/jsonwebtoken": "^9.0.6",
"@types/klaw": "^3.0.6",
"@types/lodash": "^4.14.178",
"@types/mixpanel": "^2.14.3",
"@types/mocha": "^8.2.3",
"@types/mocha": "^10.0.7",
"@types/mock-require": "^2.0.1",
"@types/moment-duration-format": "^2.2.3",
"@types/ndjson": "^2.0.1",
"@types/net-keepalive": "^0.4.1",
"@types/nock": "^11.1.0",
"@types/node": "^20.0.0",
"@types/node-cleanup": "^2.1.2",
"@types/parse-link-header": "^1.0.1",
"@types/prettyjson": "^0.0.30",
"@types/parse-link-header": "^2.0.3",
"@types/prettyjson": "^0.0.33",
"@types/progress-stream": "^2.0.2",
"@types/request": "^2.48.7",
"@types/rewire": "^2.5.28",
"@types/rewire": "^2.5.30",
"@types/rimraf": "^3.0.2",
"@types/semver": "^7.3.9",
"@types/shell-escape": "^0.2.0",
"@types/sinon": "^10.0.6",
"@types/sinon": "^17.0.3",
"@types/split": "^1.0.0",
"@types/stream-to-promise": "^2.2.1",
"@types/tar-stream": "^2.2.2",
"@types/through2": "^2.0.36",
"@types/tmp": "^0.2.3",
"@types/update-notifier": "^4.1.1",
"@types/which": "^2.0.1",
"@types/window-size": "^1.1.1",
"archiver": "^5.3.0",
"@yao-pkg/pkg": "^5.11.1",
"archiver": "^7.0.1",
"catch-uncommitted": "^2.0.0",
"chai": "^4.3.4",
"chai-as-promised": "^7.1.1",
@ -177,62 +172,58 @@
"diff": "^5.0.0",
"ent": "^2.2.0",
"filehound": "^1.17.5",
"fs-extra": "^9.1.0",
"fs-extra": "^11.2.0",
"http-proxy": "^1.18.1",
"husky": "^4.3.8",
"husky": "^9.1.5",
"inline-source-cli": "^2.0.0",
"intercept-stdout": "^0.1.2",
"jsonwebtoken": "^8.5.1",
"klaw": "^3.0.0",
"mkdirp": "^1.0.4",
"mocha": "^8.4.0",
"jsonwebtoken": "^9.0.0",
"klaw": "^4.1.0",
"mkdirp": "^3.0.1",
"mocha": "^10.6.0",
"mock-require": "^3.0.3",
"nock": "^13.2.1",
"oclif": "^3.17.1",
"oclif": "^4.14.0",
"parse-link-header": "^2.0.0",
"publish-release": "^1.6.1",
"rewire": "^5.0.0",
"rewire": "^7.0.0",
"simple-git": "^3.14.1",
"sinon": "^11.1.2",
"sinon": "^18.0.0",
"ts-node": "^10.4.0",
"typescript": "^5.3.2"
"typescript": "^5.5.2"
},
"dependencies": {
"@balena/compose": "^3.2.0",
"@balena/compose": "^4.0.1",
"@balena/dockerignore": "^1.0.2",
"@balena/env-parsing": "^1.1.8",
"@balena/es-version": "^1.0.1",
"@oclif/core": "^3.26.2",
"@balena/release-bundle": "^0.5.2",
"@oclif/core": "^4.0.8",
"@resin.io/valid-email": "^0.1.0",
"@sentry/node": "^6.16.1",
"@types/fast-levenshtein": "0.0.1",
"@types/update-notifier": "^4.1.1",
"@yao-pkg/pkg": "^5.11.1",
"balena-config-json": "^4.2.0",
"balena-device-init": "^7.0.1",
"balena-errors": "^4.7.3",
"balena-image-fs": "^7.0.6",
"balena-image-manager": "^10.0.1",
"balena-preload": "^15.0.5",
"balena-sdk": "^19.4.0",
"balena-preload": "^15.0.6",
"balena-sdk": "^19.7.3",
"balena-semver": "^2.3.0",
"balena-settings-client": "^5.0.2",
"balena-settings-storage": "^8.1.0",
"bluebird": "^3.7.2",
"body-parser": "^1.19.1",
"bonjour-service": "^1.2.1",
"chalk": "^3.0.0",
"chokidar": "^3.5.2",
"cli-truncate": "^2.1.0",
"color-hash": "^1.1.1",
"columnify": "^1.5.2",
"common-tags": "^1.7.2",
"denymount": "^2.3.0",
"docker-modem": "3.0.0",
"docker-modem": "^5.0.3",
"docker-progress": "^5.1.3",
"dockerode": "3.3.3",
"dockerode": "^4.0.2",
"ejs": "^3.1.6",
"etcher-sdk": "9.0.8",
"event-stream": "3.3.4",
"etcher-sdk": "9.1.0",
"express": "^4.17.2",
"fast-boot2": "^1.1.0",
"fast-levenshtein": "^3.0.0",
@ -250,21 +241,19 @@
"JSONStream": "^1.0.3",
"livepush": "^3.5.1",
"lodash": "^4.17.21",
"minimatch": "^3.0.4",
"moment": "^2.29.1",
"moment-duration-format": "^2.3.2",
"ndjson": "^2.0.0",
"node-cleanup": "^2.1.2",
"node-unzip-2": "^0.2.8",
"open": "^7.1.0",
"patch-package": "^6.5.1",
"patch-package": "^8.0.0",
"prettyjson": "^1.2.5",
"progress-stream": "^2.0.0",
"reconfix": "^1.0.0-v0-1-0-fork-46760acff4d165f5238bfac5e464256ef1944476",
"request": "^2.88.2",
"resin-cli-form": "^3.0.0",
"resin-cli-visuals": "^2.0.0",
"resin-discoverable-services": "^2.0.4",
"resin-doodles": "^0.2.0",
"resin-stream-logger": "^0.1.2",
"rimraf": "^3.0.2",
@ -286,7 +275,12 @@
"optionalDependencies": {
"windosu": "^0.3.0"
},
"overrides": {
"inline-source-cli": {
"inline-source": "^8.0.3"
}
},
"versionist": {
"publishedAt": "2024-04-09T17:29:45.181Z"
"publishedAt": "2024-09-05T12:34:09.871Z"
}
}

View File

@ -1,50 +1,19 @@
diff --git a/node_modules/@oclif/core/lib/cli-ux/list.js b/node_modules/@oclif/core/lib/cli-ux/list.js
index 607d8dc..07ba1f2 100644
--- a/node_modules/@oclif/core/lib/cli-ux/list.js
+++ b/node_modules/@oclif/core/lib/cli-ux/list.js
@@ -22,7 +22,7 @@ function renderList(items) {
}
left = left.padEnd(maxLength);
right = linewrap(maxLength + 2, right);
- return `${left} ${right}`;
+ return `${left} : ${right}`;
});
return lines.join('\n');
}
diff --git a/node_modules/@oclif/core/lib/help/command.js b/node_modules/@oclif/core/lib/help/command.js
index bc54de4..cb246ce 100644
index 90922c8..6b7f417 100644
--- a/node_modules/@oclif/core/lib/help/command.js
+++ b/node_modules/@oclif/core/lib/help/command.js
@@ -59,7 +59,9 @@ class CommandHelp extends formatter_1.HelpFormatter {
@@ -58,7 +58,8 @@ class CommandHelp extends formatter_1.HelpFormatter {
return;
return args.map((a) => {
// Add ellipsis to indicate that the argument takes multiple values if strict is false
- const name = this.command.strict === false ? `${a.name.toUpperCase()}...` : a.name.toUpperCase();
+ let name = this.command.strict === false ? `${a.name.toUpperCase()}...` : a.name.toUpperCase();
+ name = a.required ? `<${name}>` : `[${name}]`;
+
let description = a.description || '';
if (a.default)
description = `${(0, theme_1.colorize)(this.config?.theme?.flagDefaultValue, `[default: ${a.default}]`)} ${description}`;
@@ -154,14 +156,12 @@ class CommandHelp extends formatter_1.HelpFormatter {
label = labels.join(flag.char ? (0, theme_1.colorize)(this.config?.theme?.flagSeparator, ', ') : ' ');
}
if (flag.type === 'option') {
- let value = flag.helpValue || (this.opts.showFlagNameInTitle ? flag.name : '<value>');
+ let value = flag.helpValue || (this.opts.showFlagNameInTitle ? flag.name : `<${flag.name}>`);
if (!flag.helpValue && flag.options) {
value = showOptions || this.opts.showFlagOptionsInTitle ? `${flag.options.join('|')}` : '<option>';
}
if (flag.multiple)
- value += '...';
- if (!value.includes('|'))
- value = chalk_1.default.underline(value);
+ value += ' ...';
label += `=${value}`;
}
return (0, theme_1.colorize)(this.config.theme?.flag, label);
diff --git a/node_modules/@oclif/core/lib/help/index.js b/node_modules/@oclif/core/lib/help/index.js
index e1859e1..756654c 100644
index 4a34b89..d7eb6ac 100644
--- a/node_modules/@oclif/core/lib/help/index.js
+++ b/node_modules/@oclif/core/lib/help/index.js
@@ -172,11 +172,12 @@ class Help extends HelpBase {
@ -63,7 +32,7 @@ index e1859e1..756654c 100644
const uniqueSubCommands = subCommands.filter((p) => {
aliases.push(...p.aliases);
diff --git a/node_modules/@oclif/core/lib/parser/errors.js b/node_modules/@oclif/core/lib/parser/errors.js
index b37743a..489d66e 100644
index 168da99..538a880 100644
--- a/node_modules/@oclif/core/lib/parser/errors.js
+++ b/node_modules/@oclif/core/lib/parser/errors.js
@@ -15,7 +15,8 @@ class CLIParseError extends errors_1.CLIError {
@ -76,18 +45,17 @@ index b37743a..489d66e 100644
super(options.message, { exit: options.exit });
this.parse = options.parse;
}
@@ -38,7 +39,9 @@ exports.InvalidArgsSpecError = InvalidArgsSpecError;
@@ -38,7 +39,8 @@ exports.InvalidArgsSpecError = InvalidArgsSpecError;
class RequiredArgsError extends CLIParseError {
args;
constructor({ args, exit, flagsWithMultiple, parse, }) {
- let message = `Missing ${args.length} required arg${args.length === 1 ? '' : 's'}`;
+ const command = 'balena ' + parse.input.context.id.replace(/:/g, ' ');
+ let message = `Missing ${args.length} required argument${args.length === 1 ? '' : 's'}`;
+
const namedArgs = args.filter((a) => a.name);
if (namedArgs.length > 0) {
const list = (0, list_1.renderList)(namedArgs.map((a) => {
@@ -52,7 +55,7 @@ class RequiredArgsError extends CLIParseError {
const list = (0, list_1.default)(namedArgs.map((a) => {
@@ -52,7 +54,7 @@ class RequiredArgsError extends CLIParseError {
message += `\n\nNote: ${flags} allow${flagsWithMultiple.length === 1 ? 's' : ''} multiple values. Because of this you need to provide all arguments before providing ${flagsWithMultiple.length === 1 ? 'that flag' : 'those flags'}.`;
message += '\nAlternatively, you can use "--" to signify the end of the flags and the beginning of arguments.';
}
@ -96,3 +64,16 @@ index b37743a..489d66e 100644
this.args = args;
this.showHelp = true;
}
diff --git a/node_modules/@oclif/core/lib/ux/list.js b/node_modules/@oclif/core/lib/ux/list.js
index 954954c..0e507c7 100644
--- a/node_modules/@oclif/core/lib/ux/list.js
+++ b/node_modules/@oclif/core/lib/ux/list.js
@@ -22,7 +22,7 @@ function renderList(items) {
}
left = left.padEnd(maxLength);
right = linewrap(maxLength + 2, right);
- return `${left} ${right}`;
+ return `${left} : ${right}`;
});
return lines.join('\n');
}

View File

@ -1,44 +0,0 @@
diff --git a/node_modules/oclif/lib/commands/pack/win.js b/node_modules/oclif/lib/commands/pack/win.js
index c0926bd..e4f645c 100644
--- a/node_modules/oclif/lib/commands/pack/win.js
+++ b/node_modules/oclif/lib/commands/pack/win.js
@@ -59,6 +59,12 @@ InstallDir "\$PROGRAMFILES${arch === 'x64' ? '64' : ''}\\${config.dirname}"
${customization}
Section "${config.name} CLI \${VERSION}"
+ ; First remove any old client files.
+ ; (Remnants of old versions were causing CLI errors)
+ ; Initially tried running the Uninstall.exe, but was
+ ; unable to make script wait for completion (despite using _?)
+ DetailPrint "Removing files from previous version."
+ RMDir /r "$INSTDIR\\client"
SetOutPath $INSTDIR
File /r bin
File /r client
diff --git a/node_modules/oclif/lib/tarballs/build.js b/node_modules/oclif/lib/tarballs/build.js
index 384ea4b..c9607f3 100644
--- a/node_modules/oclif/lib/tarballs/build.js
+++ b/node_modules/oclif/lib/tarballs/build.js
@@ -30,7 +30,9 @@ async function build(c, options = {}) {
await fs.emptyDir(c.workspace());
const tarballNewLocation = path.join(c.workspace(), path.basename(tarball));
await fs.move(tarball, tarballNewLocation);
- await exec(`tar -xzf "${tarballNewLocation}"`, { cwd: c.workspace() });
+ let tarCmd = `tar -xzf "${tarballNewLocation}"`;
+ if (process.platform === 'win32') tarCmd += ' --force-local';
+ await exec(tarCmd, { cwd: c.workspace() });
await Promise.all((await fs.promises.readdir(path.join(c.workspace(), 'package'), { withFileTypes: true }))
.map(i => fs.move(path.join(c.workspace(), 'package', i.name), path.join(c.workspace(), i.name))));
await Promise.all([
@@ -38,6 +40,11 @@ async function build(c, options = {}) {
fs.promises.rm(path.join(c.workspace(), path.basename(tarball)), { recursive: true }),
fs.remove(path.join(c.workspace(), 'bin', 'run.cmd')),
]);
+ // The oclif installers are a production installation, while the source
+ // `bin` folder may contain a `.fast-boot.json` file of a dev installation.
+ // This has previously led to issues preventing the CLI from starting, so
+ // delete `.fast-boot.json` (if any) from the destination folder.
+ await fs.promises.rm(path.join(c.workspace(), 'bin', '.fast-boot.json'));
};
const updatePJSON = async () => {
const pjsonPath = path.join(c.workspace(), 'package.json');

View File

@ -0,0 +1,35 @@
diff --git a/node_modules/oclif/lib/commands/pack/win.js b/node_modules/oclif/lib/commands/pack/win.js
index ef7f90e..8264b7c 100644
--- a/node_modules/oclif/lib/commands/pack/win.js
+++ b/node_modules/oclif/lib/commands/pack/win.js
@@ -76,6 +76,12 @@ InstallDir "\$PROGRAMFILES${arch === 'x64' ? '64' : ''}\\${config.dirname}"
${customization}
Section "${config.name} CLI \${VERSION}"
+ ; First remove any old client files.
+ ; (Remnants of old versions were causing CLI errors)
+ ; Initially tried running the Uninstall.exe, but was
+ ; unable to make script wait for completion (despite using _?)
+ DetailPrint "Removing files from previous version."
+ RMDir /r "$INSTDIR\\client"
SetOutPath $INSTDIR
File /r bin
File /r client
diff --git a/node_modules/oclif/lib/tarballs/build.js b/node_modules/oclif/lib/tarballs/build.js
index 14d5a6e..7b42a6f 100644
--- a/node_modules/oclif/lib/tarballs/build.js
+++ b/node_modules/oclif/lib/tarballs/build.js
@@ -200,6 +200,13 @@ const extractCLI = async (tarball, c) => {
(0, promises_1.rm)(path.join(workspace, path.basename(tarball)), { recursive: true }),
(0, fs_extra_1.remove)(path.join(workspace, 'bin', 'run.cmd')),
]);
+
+ // The oclif installers are a production installation, while the source
+ // `bin` folder may contain a `.fast-boot.json` file of a dev installation.
+ // This has previously led to issues preventing the CLI from starting, so
+ // delete `.fast-boot.json` (if any) from the destination folder.
+ await (0, fs_extra_1.remove)(path.join(workspace, 'bin', '.fast-boot.json'));
+
};
const buildTarget = async (target, c, options) => {
const workspace = c.workspace(target);

View File

@ -137,7 +137,8 @@ async function oclifRun(command: string[], options: AppOptions) {
}
}
if (shouldFlush) {
await import('@oclif/core/flush');
const { flush } = await import('@oclif/core');
await flush();
}
// TODO: figure out why we need to call fast-boot stop() here, in
// addition to calling it in the main `run()` function in this file.

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -21,7 +21,6 @@ import {
NotAvailableInOfflineModeError,
} from './errors';
import { stripIndent } from './utils/lazy';
import * as output from './framework/output';
export default abstract class BalenaCommand extends Command {
/**
@ -168,7 +167,4 @@ export default abstract class BalenaCommand extends Command {
await this.getStdin();
}
}
protected outputMessage = output.outputMessage;
protected outputData = output.outputData;
}

View File

@ -20,7 +20,13 @@ import Command from '../../command';
import { getBalenaSdk } from '../../utils/lazy';
import * as cf from '../../utils/common-flags';
import * as compose from '../../utils/compose';
import type { ApplicationType, BalenaSDK } from 'balena-sdk';
import type {
ApplicationType,
BalenaSDK,
DeviceType,
PineOptions,
PineTypedResult,
} from 'balena-sdk';
import {
buildArgDeprecation,
dockerignoreHelp,
@ -67,6 +73,7 @@ ${dockerignoreHelp}
public static examples = [
'$ balena build --fleet myFleet',
'$ balena build ./source/ --fleet myorg/myfleet',
'$ balena build --deviceType raspberrypi3 --emulated',
'$ balena build --deviceType raspberrypi3 --arch armv7hf --emulated',
'$ balena build --docker /var/run/docker.sock --fleet myFleet # Linux, Mac',
'$ balena build --docker //./pipe/docker_engine --fleet myFleet # Windows',
@ -114,6 +121,8 @@ ${dockerignoreHelp}
options.source = params.source;
delete params.source;
await this.resolveArchFromDeviceType(sdk, options);
await this.validateOptions(options, sdk);
// Build args are under consideration for removal - warn user
@ -127,7 +136,7 @@ ${dockerignoreHelp}
try {
await this.buildProject(docker, logger, composeOpts, {
app,
appType: app?.application_type?.[0],
arch: options.arch!,
deviceType: options.deviceType!,
buildEmulated: options.emulated,
@ -150,7 +159,7 @@ ${dockerignoreHelp}
) {
const { ExpectedError } = await import('../../errors');
throw new ExpectedError(
'You must specify either a fleet (-f), or the device type (-d) and architecture (-A)',
'You must specify either a fleet (-f), or the device type (-d) and optionally the architecture (-A)',
);
}
@ -170,6 +179,39 @@ ${dockerignoreHelp}
opts['registry-secrets'] = registrySecrets;
}
protected async resolveArchFromDeviceType(sdk: BalenaSDK, opts: FlagsDef) {
if (opts.deviceType != null && opts.arch == null) {
try {
const deviceTypeOpts = {
$select: 'is_of__cpu_architecture',
$expand: {
is_of__cpu_architecture: {
$select: 'slug',
},
},
} satisfies PineOptions<DeviceType>;
opts.arch = (
(await sdk.models.deviceType.get(
opts.deviceType,
deviceTypeOpts,
)) as PineTypedResult<DeviceType, typeof deviceTypeOpts>
).is_of__cpu_architecture[0].slug;
} catch (err) {
const { ExpectedError } = await import('../../errors');
if (err instanceof sdk.errors.BalenaInvalidDeviceType) {
let message = err.message;
if (!(await sdk.auth.isLoggedIn())) {
message = `${message}. In case you are trying to use a private device type, please try to log in first.`;
}
throw new ExpectedError(message);
}
throw new ExpectedError(
'Failed to resolve the architecture of the provided device type. If you are in an air-gapped environment please also define the architecture (-A) parameter.',
);
}
}
}
protected async getAppAndResolveArch(opts: FlagsDef) {
if (opts.fleet) {
const { getAppWithArch } = await import('../../utils/helpers');
@ -212,9 +254,7 @@ ${dockerignoreHelp}
logger: import('../../utils/logger'),
composeOpts: ComposeOpts,
opts: {
app?: {
application_type: [Pick<ApplicationType, 'supports_multicontainer'>];
};
appType?: Pick<ApplicationType, 'supports_multicontainer'>;
arch: string;
deviceType: string;
buildEmulated: boolean;
@ -230,11 +270,10 @@ ${dockerignoreHelp}
opts.buildOpts.t,
);
const appType = opts.app?.application_type?.[0];
if (
appType != null &&
opts.appType != null &&
project.descriptors.length > 1 &&
!appType.supports_multicontainer
!opts.appType.supports_multicontainer
) {
logger.logWarn(
'Target fleet does not support multiple containers.\n' +

View File

@ -364,20 +364,13 @@ ${dockerignoreHelp}
$select: ['commit'],
});
} else {
const [{ id: userId }, auth, apiEndpoint] = await Promise.all([
sdk.auth.getUserInfo(),
sdk.auth.getToken(),
sdk.settings.get('apiUrl'),
]);
release = await $deployProject(
docker,
sdk,
logger,
project.composition,
images,
opts.app.id,
userId,
`Bearer ${auth}`,
apiEndpoint,
!opts.shouldUploadLogs,
composeOpts.projectPath,
opts.createAsDraft,

View File

@ -20,7 +20,7 @@ import { Flags } from '@oclif/core';
import Command from '../../command';
import * as cf from '../../utils/common-flags';
import * as ca from '../../utils/common-args';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
import { applicationIdInfo } from '../../utils/messages';
export default class FleetCmd extends Command {
@ -49,7 +49,7 @@ export default class FleetCmd extends Command {
default: false,
description: 'open fleet dashboard page',
}),
...cf.dataOutputFlags,
json: cf.json,
};
public static authenticated = true;
@ -78,16 +78,28 @@ export default class FleetCmd extends Command {
return;
}
const outputApplication = {
...application,
const applicationToDisplay = {
id: application.id,
app_name: application.app_name,
slug: application.slug,
device_type: application.is_for__device_type[0].slug,
commit: application.should_be_running__release[0]?.commit,
};
await this.outputData(
outputApplication,
['app_name', 'id', 'device_type', 'slug', 'commit'],
options,
if (options.json) {
console.log(JSON.stringify(applicationToDisplay, null, 4));
return;
}
// Emulate table.vertical title output, but avoid uppercasing and inserting spaces
console.log(`== ${applicationToDisplay.app_name}`);
console.log(
getVisuals().table.vertical(applicationToDisplay, [
'id',
'device_type',
'slug',
'commit',
]),
);
}
}

View File

@ -19,7 +19,7 @@ import type * as BalenaSdk from 'balena-sdk';
import Command from '../../command';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
interface ExtendedApplication extends ApplicationWithDeviceTypeSlug {
device_count: number;
@ -42,8 +42,8 @@ export default class FleetsCmd extends Command {
public static usage = 'fleets';
public static flags = {
...cf.dataSetOutputFlags,
help: cf.help,
json: cf.json,
};
public static authenticated = true;
@ -77,17 +77,29 @@ export default class FleetsCmd extends Command {
application.device_type = application.is_for__device_type[0].slug;
});
await this.outputData(
applications,
[
const applicationsToDisplay = applications.map((application) => ({
id: application.id,
app_name: application.app_name,
slug: application.slug,
device_type: application.device_type,
online_devices: application.online_devices,
device_count: application.device_count,
}));
if (options.json) {
console.log(JSON.stringify(applicationsToDisplay, null, 4));
return;
}
console.log(
getVisuals().table.horizontal(applicationsToDisplay, [
'id',
'app_name',
'app_name => NAME',
'slug',
'device_type',
'device_count',
'online_devices',
],
options,
]),
);
}
}

Some files were not shown because too many files have changed in this diff Show More