Compare commits

...

31 Commits

Author SHA1 Message Date
c6313c08ae v16.7.5 2023-07-21 06:59:22 +00:00
f5764c4659 Merge pull request #2655 from balena-io/abstract-fleet-app-block-create
Abstract the fleet/app/block create commands
2023-07-21 09:58:36 +03:00
aff094575b Abstract the fleet/app/block create commands
Change-type: patch
2023-07-20 16:14:52 +03:00
4aaaf64f8d v16.7.4 2023-07-20 10:41:09 +00:00
7b88ce273f Merge pull request #2654 from balena-io/move-discontinued-dt
move: Include fleets of discontinued device types in the fleet selection
2023-07-20 10:40:12 +00:00
b011af89ad move: Include fleets of discontinued device types in the fleet selection
Change-type: patch
2023-07-20 13:03:54 +03:00
1bf8c1bfe7 v16.7.3 2023-07-20 08:30:09 +00:00
2b39d5d111 Merge pull request #2653 from balena-io/promote-discontinued-dt
promote: Allow joining fleets of discontinued device types
2023-07-20 08:29:20 +00:00
98663af7f6 Rerun npm-shrinkwrap.json deduplication 2023-07-19 19:44:43 +03:00
5628824bee promote: Allow joining fleets of discontinued device types
Change-type: patch
2023-07-19 19:17:27 +03:00
d12d7996bc v16.7.2 2023-07-19 01:43:55 +00:00
0dcf4cbff6 Merge pull request #2650 from balena-io/bump-balena-compose
Update balena-compose to v3.0.2
2023-07-19 01:42:56 +00:00
884e37d242 Update balena-compose to v3.0.2
Update balena-compose to v3.0.2

That release removes the use of the `cachefrom` on pull tasks, which
there is good evidence to suggest is the cause of #2165

Change-type: patch
2023-07-18 18:14:56 -04:00
f4a24e26c3 v16.7.1 2023-07-18 20:27:07 +00:00
122eccf3dc Merge pull request #2652 from balena-io/update-balena-sdk-17.8.0
Update balena-sdk to 17.8.0
2023-07-18 20:26:16 +00:00
bd598788dc Update balena-sdk to 17.8.0
Update balena-sdk from 17.0.0 to 17.8.0

Change-type: patch
2023-07-18 22:48:54 +03:00
406482b4da v16.7.0 2023-07-17 19:59:52 +00:00
a381c97ca9 Merge pull request #2649 from balena-io/preload-no-pin-device-to-release
preload: Add the --no-pin-device-to-release flag to avoid interactive questions
2023-07-17 19:59:04 +00:00
8ce78ba33c Rerun npm-shrinkwrap.json deduplication 2023-07-17 11:25:02 +03:00
f53f148c89 preload: Add the --no-pin-device-to-release flag to avoid interactive questions
Change-type: minor
See: https://balena.zulipchat.com/#narrow/stream/345746-aspect.2Fproduct/topic/Level.20-.20need.20thoughts.20on.20questions.20.26.20feature.20suggestions
2023-07-17 11:19:03 +03:00
0086feb645 v16.6.6 2023-07-10 17:16:08 +00:00
4ee55b049f Merge pull request #2646 from balena-io/reduce-lodash-usage
Reduce lodash usage in common user interaction patterns
2023-07-10 17:15:14 +00:00
90c6f121cc Rerun npm-shrinkwrap.json deduplication 2023-07-10 19:36:36 +03:00
d3c27ae859 Reduce lodash usage in common user interaction patterns
Change-type: patch
2023-07-10 17:19:01 +03:00
8f39c1de6c v16.6.5 2023-07-09 21:29:55 +00:00
4df1831187 Merge pull request #2645 from balena-io/application-create-hostApp-based-supported-DTs
fleet/block/app create: Fetch the supported device types using the hostApps
2023-07-09 21:29:02 +00:00
2bce761ace Rerun npm-shrinkwrap.json deduplication 2023-07-07 20:17:53 +03:00
d78b76aceb fleet/block/app create: Fetch the supported device types using the hostApps
Change-type: patch
See: https://balena.zulipchat.com/#narrow/stream/360838-balena-io.2Fos.2Fdevices/topic/state.20field.20in.20device-type.2Ejson
See: https://balena.fibery.io/Organisation/Improvements-849#Improvements/Stop-relying-on-device-types-v1-device-type.json-for-unrelated-things-257
2023-07-07 19:57:36 +03:00
f07f6b84d4 v16.6.4 2023-07-06 13:58:27 +00:00
d297a10570 Merge pull request #2643 from balena-io/bump-balena-compose
Bump balena-compose to v2.3.0
2023-07-06 13:57:37 +00:00
9d0b82122a Bump balena-compose to v2.3.0
This allows the the CLI to use docker registry config when querying the
images manifest.

Relates-to: balena-io-modules/balena-compose#31
Change-type: patch
2023-07-05 15:46:42 -04:00
16 changed files with 1172 additions and 508 deletions

View File

@ -1,3 +1,488 @@
- commits:
- subject: Abstract the fleet/app/block create commands
hash: aff094575bb26547fa28b49eceec840a4c683929
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: 16.7.5
title: ""
date: 2023-07-21T06:59:20.298Z
- commits:
- subject: "move: Include fleets of discontinued device types in the fleet
selection"
hash: b011af89ad7b4f43199be9666009155a8c6371b7
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: 16.7.4
title: ""
date: 2023-07-20T10:41:06.291Z
- commits:
- subject: "promote: Allow joining fleets of discontinued device types"
hash: 5628824bee935f6520fad3be498ea768e591755b
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: 16.7.3
title: ""
date: 2023-07-20T08:30:06.798Z
- commits:
- subject: Update balena-compose to v3.0.2
hash: 884e37d24293fc09a3a1c0f8e8763dc24698418c
body: |
Update balena-compose to v3.0.2
That release removes the use of the `cachefrom` on pull tasks, which
there is good evidence to suggest is the cause of #2165
footer:
Change-type: patch
change-type: patch
author: Felipe Lalanne
nested: []
version: 16.7.2
title: ""
date: 2023-07-19T01:43:53.469Z
- commits:
- subject: Update balena-sdk to 17.8.0
hash: bd598788dcb70fc48d225290c9705ae17ad0b2b5
body: |
Update balena-sdk from 17.0.0 to 17.8.0
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested:
- commits:
- subject: "billing: Add `removeBillingInfo` method for removing billing info"
hash: 25d24ccdfe89ecc816ca8781cbfed6dafeda91bc
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: balena-sdk-17.8.0
title: ""
date: 2023-07-10T13:20:21.969Z
- commits:
- subject: "deviceType.getBySlugOrName: Use a clearer var name in the docs
example"
hash: 41f7b823975667c37daf1c541919c20e95a9198b
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.7.1
title: ""
date: 2023-07-09T21:29:32.317Z
- commits:
- subject: Add typings for the organization.is_frozen computed term
hash: 95a4304cf75a6537036764d59d6a7f9c9060d623
body: ""
footer:
Depends-on: https://github.com/balena-io/balena-api/pull/4503
depends-on: https://github.com/balena-io/balena-api/pull/4503
Change-type: minor
change-type: minor
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.7.0
title: ""
date: 2023-07-06T11:02:18.622Z
- commits:
- subject: "application.create: Enable creating fleets with archived device types"
hash: 97a267ce844840936a3bffe7d4f317e21cd0f8ad
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: balena-sdk-17.6.0
title: ""
date: 2023-07-05T12:29:10.114Z
- commits:
- subject: Add `owns__credit_bundle` typing for `Organization`
hash: 5260e77117f6eb07e32cb70da8889eb18112d216
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: balena-sdk-17.5.0
title: ""
date: 2023-06-27T17:12:54.385Z
- commits:
- subject: Add typings for Credits Notifications
hash: a1f526da9d3b217a51fe1987d8913c345ed0c996
body: ""
footer:
Change-type: minor
change-type: minor
author: myarmolinsky
nested: []
version: balena-sdk-17.4.0
title: ""
date: 2023-06-19T10:20:57.945Z
- commits:
- subject: "util: Simplify the listImagesFromTargetState helper"
hash: b4efb2c3412020a2a186a9798f4f225bf7cee2d5
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.3.2
title: ""
date: 2023-06-19T06:20:01.454Z
- commits:
- subject: Fix prettier complaining on windows runners
hash: 8d7f2eae237f270b128af35a2dd2da8377ea5092
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: "deviceType.getInstructions: Improve the return type"
hash: 8339dbc86b295147c5d3054a27ff667920f4ac55
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: Fix browser tests now failing to find a polyfill for querystring
hash: 02b72b0091c092403e684a6ae1ea3f3affcdb2fa
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.3.1
title: ""
date: 2023-06-17T09:13:14.340Z
- commits:
- subject: "os: Export the OsDownloadOptions type"
hash: ccfbb31d225c3dfa1d6ad8f11fc8d475b1a04315
body: ""
footer:
Change-type: minor
change-type: minor
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.3.0
title: ""
date: 2023-06-05T07:51:40.633Z
- commits:
- subject: "tsconfig: Allow noImplicitThis in the tests"
hash: 0688fef9932a22d6dc4783f862aee3bf919d753a
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: "tsconfig: Switch to strict compilation to fix the 5.1 errors"
hash: d4facc8362966b03fec3120f8d4664d7de512c17
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
- subject: Update TypeScript to 5.1.3
hash: f9c9c2be9cdd0e9a293131631b2bbfd932381ccc
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.2.3
title: ""
date: 2023-06-04T11:35:09.276Z
- commits:
- subject: Access other models internally via the shared current sdk instance
hash: 4ea321fa304c47ef8bfa474adbd45a430f6b6b40
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.2.2
title: ""
date: 2023-06-01T15:12:15.596Z
- commits:
- subject: Convert the remaining .js tests to .ts
hash: c4cd34fbeeb8815eba2684d071df313d14689238
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.2.1
title: ""
date: 2023-06-01T13:02:29.958Z
- commits:
- subject: Extends batch device actions to accept arrays of full UUIDs
hash: 3344ea5c83d0a3698293d4e989d29397fcd6a59b
body: ""
footer:
Change-type: minor
change-type: minor
author: Thodoris Greasidis
nested: []
- subject: "device.startOsUpdate: Add support for providing an array of UUIDs"
hash: 2aa208c0b086c6885948672ccd068458c7f10139
body: ""
footer:
Change-type: minor
change-type: minor
See: https://balena.zulipchat.com/#narrow/stream/345889-balena-io.2Fos/topic/Enpal.20HUP
see: https://balena.zulipchat.com/#narrow/stream/345889-balena-io.2Fos/topic/Enpal.20HUP
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.2.0
title: ""
date: 2023-06-01T10:37:18.645Z
- commits:
- subject: Add 2fa tests
hash: 969559251e183c0cba203404e6a4642c64e4a6b4
body: ""
footer:
Change-type: patch
change-type: patch
author: Otávio Jacobi
nested: []
- subject: Fix auth.twoFactor.isEnabled() regression returning always true
hash: 77c194aa66c17287f88ecc6d488dbace759d4c1a
body: |
Update balena-auth from 4.1.0 to 4.2.0
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested:
- commits:
- subject: Add a get2FAStatus() method
hash: 266c8bc9b12d13fd96ce0ae6b12d7767a27030d8
body: ""
footer:
Change-type: minor
change-type: minor
author: Thodoris Greasidis
nested: []
version: balena-auth-4.2.0
title: ""
date: 2023-05-25T12:06:34.551Z
- commits:
- subject: Fix async tests not waiting for the result
hash: 027af56893911b7b6a95c6743eb90cae86cc3f86
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-auth-4.1.3
title: ""
date: 2023-05-25T08:28:54.576Z
- commits:
- subject: Delete redundant .resinci.yml
hash: eca476bec2b6ddd9c41809f3bca4c2c2f776fe69
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-auth-4.1.2
title: ""
date: 2022-09-26T12:39:48.984Z
- commits:
- subject: Replace balenaCI with flowzone
hash: 349377a015dcbc7d963b950dc63ba2b2a03ad6a7
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-auth-4.1.1
title: ""
date: 2022-09-22T22:01:40.204Z
version: balena-sdk-17.1.4
title: ""
date: 2023-05-30T06:58:26.026Z
- commits:
- subject: Add support to short uuid on device.serviceVar.set
hash: 7b38ccb080e1d0028e6d9730738722f2122b0854
body: ""
footer:
Change-type: patch
change-type: patch
author: Otávio Jacobi
nested: []
version: balena-sdk-17.1.3
title: ""
date: 2023-05-29T14:17:14.708Z
- commits:
- subject: Switch to a stricter request limiting queuing mode
hash: 4302addfba8a773f1b528d4e12e4dd070593d149
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.1.2
title: ""
date: 2023-05-25T15:40:23.870Z
- commits:
- subject: Drop the callback examples from the docs
hash: 5d9bb410c83cbf2c0a8f031ab746984ffe912b5a
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.1.1
title: ""
date: 2023-05-25T08:12:20.868Z
- commits:
- subject: Add the requestLimit & requestLimitInterval options to the SDK factory
hash: 9a92f9b8da880b53379522f6201cadcd7fcb97bd
body: ""
footer:
Change-type: minor
change-type: minor
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.1.0
title: ""
date: 2023-05-24T18:28:06.683Z
- commits:
- subject: Update dependencies
hash: c709c49f64ffc53e2a2c0477b5b28c6db56c064d
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: balena-sdk-17.0.2
title: ""
date: 2023-05-24T16:45:55.757Z
- commits:
- subject: Add a method to retrieve the supervisor image for a DT
hash: b64ee7ec80343f9846367b3b8794ef77421fe25b
body: ""
footer:
Change-type: patch
change-type: patch
author: Edwin Joassart
nested: []
- subject: Add util to list images referenced in a target state v3
hash: 9cbebb75cde280394871d6dd04758c237a2229aa
body: ""
footer:
Change-type: patch
change-type: patch
author: Edwin Joassart
nested: []
- subject: Add a method for retrieving an application's virtual device target
supervisor state
hash: 3bc2fe3d7b6f20b733dba326e8895c7bba2e1c2f
body: ""
footer:
Change-type: patch
change-type: patch
Signed-off-by: Edwin Joassart <edwin.joassart@balena.io>
signed-off-by: Edwin Joassart <edwin.joassart@balena.io>
author: Edwin Joassart
nested: []
version: balena-sdk-17.0.1
title: ""
date: 2023-05-24T15:35:03.815Z
version: 16.7.1
title: ""
date: 2023-07-18T20:27:03.774Z
- commits:
- subject: "preload: Add the --no-pin-device-to-release flag to avoid interactive
questions"
hash: f53f148c8955f90f80e98962f10d4a1fe0dc8474
body: ""
footer:
Change-type: minor
change-type: minor
See: https://balena.zulipchat.com/#narrow/stream/345746-aspect.2Fproduct/topic/Level.20-.20need.20thoughts.20on.20questions.20.26.20feature.20suggestions
see: https://balena.zulipchat.com/#narrow/stream/345746-aspect.2Fproduct/topic/Level.20-.20need.20thoughts.20on.20questions.20.26.20feature.20suggestions
author: Thodoris Greasidis
nested: []
version: 16.7.0
title: ""
date: 2023-07-17T19:59:49.480Z
- commits:
- subject: Reduce lodash usage in common user interaction patterns
hash: d3c27ae859b32e187546964830cdbc236cc56138
body: ""
footer:
Change-type: patch
change-type: patch
author: Thodoris Greasidis
nested: []
version: 16.6.6
title: ""
date: 2023-07-10T17:16:05.627Z
- commits:
- subject: "fleet/block/app create: Fetch the supported device types using the
hostApps"
hash: d78b76aceb4cff60dbfe29d61b3ee5e9a2883fc9
body: ""
footer:
Change-type: patch
change-type: patch
See: https://balena.fibery.io/Organisation/Improvements-849#Improvements/Stop-relying-on-device-types-v1-device-type.json-for-unrelated-things-257
see: https://balena.fibery.io/Organisation/Improvements-849#Improvements/Stop-relying-on-device-types-v1-device-type.json-for-unrelated-things-257
author: Thodoris Greasidis
nested: []
version: 16.6.5
title: ""
date: 2023-07-09T21:29:52.818Z
- commits:
- subject: Bump balena-compose to v2.3.0
hash: 9d0b82122a3df2791a55c83371828635f6e4a0c1
body: |
This allows the the CLI to use docker registry config when querying the
images manifest.
footer:
Relates-to: balena-io-modules/balena-compose#31
relates-to: balena-io-modules/balena-compose#31
Change-type: patch
change-type: patch
author: Felipe Lalanne
nested: []
version: 16.6.4
title: ""
date: 2023-07-06T13:58:25.571Z
- commits:
- subject: Remove redundant dependency on docker-toolbelt
hash: 0f4054fa4ddf74a8c7ec869bef74cee43f182df1

View File

@ -4,6 +4,157 @@ 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/).
## 16.7.5 - 2023-07-21
* Abstract the fleet/app/block create commands [Thodoris Greasidis]
## 16.7.4 - 2023-07-20
* move: Include fleets of discontinued device types in the fleet selection [Thodoris Greasidis]
## 16.7.3 - 2023-07-20
* promote: Allow joining fleets of discontinued device types [Thodoris Greasidis]
## 16.7.2 - 2023-07-19
* Update balena-compose to v3.0.2 [Felipe Lalanne]
## 16.7.1 - 2023-07-18
<details>
<summary> Update balena-sdk to 17.8.0 [Thodoris Greasidis] </summary>
> ### balena-sdk-17.8.0 - 2023-07-10
>
> * billing: Add `removeBillingInfo` method for removing billing info [myarmolinsky]
>
> ### balena-sdk-17.7.1 - 2023-07-09
>
> * deviceType.getBySlugOrName: Use a clearer var name in the docs example [Thodoris Greasidis]
>
> ### balena-sdk-17.7.0 - 2023-07-06
>
> * Add typings for the organization.is_frozen computed term [Thodoris Greasidis]
>
> ### balena-sdk-17.6.0 - 2023-07-05
>
> * application.create: Enable creating fleets with archived device types [myarmolinsky]
>
> ### balena-sdk-17.5.0 - 2023-06-27
>
> * Add `owns__credit_bundle` typing for `Organization` [myarmolinsky]
>
> ### balena-sdk-17.4.0 - 2023-06-19
>
> * Add typings for Credits Notifications [myarmolinsky]
>
> ### balena-sdk-17.3.2 - 2023-06-19
>
> * util: Simplify the listImagesFromTargetState helper [Thodoris Greasidis]
>
> ### balena-sdk-17.3.1 - 2023-06-17
>
> * Fix prettier complaining on windows runners [Thodoris Greasidis]
> * deviceType.getInstructions: Improve the return type [Thodoris Greasidis]
> * Fix browser tests now failing to find a polyfill for querystring [Thodoris Greasidis]
>
> ### balena-sdk-17.3.0 - 2023-06-05
>
> * os: Export the OsDownloadOptions type [Thodoris Greasidis]
>
> ### balena-sdk-17.2.3 - 2023-06-04
>
> * tsconfig: Allow noImplicitThis in the tests [Thodoris Greasidis]
> * tsconfig: Switch to strict compilation to fix the 5.1 errors [Thodoris Greasidis]
> * Update TypeScript to 5.1.3 [Thodoris Greasidis]
>
> ### balena-sdk-17.2.2 - 2023-06-01
>
> * Access other models internally via the shared current sdk instance [Thodoris Greasidis]
>
> ### balena-sdk-17.2.1 - 2023-06-01
>
> * Convert the remaining .js tests to .ts [Thodoris Greasidis]
>
> ### balena-sdk-17.2.0 - 2023-06-01
>
> * Extends batch device actions to accept arrays of full UUIDs [Thodoris Greasidis]
> * device.startOsUpdate: Add support for providing an array of UUIDs [Thodoris Greasidis]
>
> ### balena-sdk-17.1.4 - Invalid date
>
> * Add 2fa tests [Otávio Jacobi]
>
> <details>
> <summary> Fix auth.twoFactor.isEnabled() regression returning always true [Thodoris Greasidis] </summary>
>
>> #### balena-auth-4.2.0 - 2023-05-25
>>
>> * Add a get2FAStatus() method [Thodoris Greasidis]
>>
>> #### balena-auth-4.1.3 - 2023-05-25
>>
>> * Fix async tests not waiting for the result [Thodoris Greasidis]
>>
>> #### balena-auth-4.1.2 - 2022-09-26
>>
>> * Delete redundant .resinci.yml [Thodoris Greasidis]
>>
>> #### balena-auth-4.1.1 - 2022-09-22
>>
>> * Replace balenaCI with flowzone [Thodoris Greasidis]
>>
>
> </details>
>
>
> ### balena-sdk-17.1.3 - 2023-05-29
>
> * Add support to short uuid on device.serviceVar.set [Otávio Jacobi]
>
> ### balena-sdk-17.1.2 - 2023-05-25
>
> * Switch to a stricter request limiting queuing mode [Thodoris Greasidis]
>
> ### balena-sdk-17.1.1 - 2023-05-25
>
> * Drop the callback examples from the docs [Thodoris Greasidis]
>
> ### balena-sdk-17.1.0 - 2023-05-24
>
> * Add the requestLimit & requestLimitInterval options to the SDK factory [Thodoris Greasidis]
>
> ### balena-sdk-17.0.2 - 2023-05-24
>
> * Update dependencies [Thodoris Greasidis]
>
> ### balena-sdk-17.0.1 - 2023-05-24
>
> * Add a method to retrieve the supervisor image for a DT [Edwin Joassart]
> * Add util to list images referenced in a target state v3 [Edwin Joassart]
> * Add a method for retrieving an application's virtual device target supervisor state [Edwin Joassart]
>
</details>
## 16.7.0 - 2023-07-17
* preload: Add the --no-pin-device-to-release flag to avoid interactive questions [Thodoris Greasidis]
## 16.6.6 - 2023-07-10
* Reduce lodash usage in common user interaction patterns [Thodoris Greasidis]
## 16.6.5 - 2023-07-09
* fleet/block/app create: Fetch the supported device types using the hostApps [Thodoris Greasidis]
## 16.6.4 - 2023-07-06
* Bump balena-compose to v2.3.0 [Felipe Lalanne]
## 16.6.3 - 2023-06-30
* Remove redundant dependency on docker-toolbelt [Akis Kesoglou]

View File

@ -18,19 +18,9 @@
import { flags } from '@oclif/command';
import Command from '../../command';
import { ExpectedError } from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
interface FlagsDef {
organization?: string;
type?: string; // application device type
help: void;
}
interface ArgsDef {
name: string;
}
import { stripIndent } from '../../utils/lazy';
import { ArgsDef, FlagsDef } from '../../utils/application-create';
export default class AppCreateCmd extends Command {
public static description = stripIndent`
@ -90,61 +80,8 @@ export default class AppCreateCmd extends Command {
AppCreateCmd,
);
// Ascertain device type
const deviceType =
options.type ||
(await (await import('../../utils/patterns')).selectDeviceType());
// Ascertain organization
const organization =
options.organization?.toLowerCase() || (await this.getOrganization());
// Create application
try {
const application = await getBalenaSdk().models.application.create({
name: params.name,
deviceType,
organization,
applicationClass: 'app',
});
// Output
console.log(
`App created: slug "${application.slug}", device type "${deviceType}"`,
);
} catch (err) {
if ((err.message || '').toLowerCase().includes('unique')) {
// BalenaRequestError: Request error: "organization" and "app_name" must be unique.
throw new ExpectedError(
`Error: An app or block or fleet with the name "${params.name}" already exists in organization "${organization}".`,
);
} else if ((err.message || '').toLowerCase().includes('unauthorized')) {
// BalenaRequestError: Request error: Unauthorized
throw new ExpectedError(
`Error: You are not authorized to create apps in organization "${organization}".`,
);
}
throw err;
}
}
async getOrganization() {
const { getOwnOrganizations } = await import('../../utils/sdk');
const organizations = await getOwnOrganizations(getBalenaSdk(), {
$select: ['name', 'handle'],
});
if (organizations.length === 0) {
// User is not a member of any organizations (should not happen).
throw new Error('This account is not a member of any organizations');
} else if (organizations.length === 1) {
// User is a member of only one organization - use this.
return organizations[0].handle;
} else {
// User is a member of multiple organizations -
const { selectOrganization } = await import('../../utils/patterns');
return selectOrganization(organizations);
}
await (
await import('../../utils/application-create')
).applicationCreateBase('app', options, params);
}
}

View File

@ -18,9 +18,8 @@
import { flags } from '@oclif/command';
import Command from '../../command';
import { ExpectedError } from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
import { stripIndent } from '../../utils/lazy';
interface FlagsDef {
organization?: string;
@ -90,61 +89,8 @@ export default class BlockCreateCmd extends Command {
BlockCreateCmd,
);
// Ascertain device type
const deviceType =
options.type ||
(await (await import('../../utils/patterns')).selectDeviceType());
// Ascertain organization
const organization =
options.organization?.toLowerCase() || (await this.getOrganization());
// Create application
try {
const application = await getBalenaSdk().models.application.create({
name: params.name,
deviceType,
organization,
applicationClass: 'block',
});
// Output
console.log(
`Block created: slug "${application.slug}", device type "${deviceType}"`,
);
} catch (err) {
if ((err.message || '').toLowerCase().includes('unique')) {
// BalenaRequestError: Request error: "organization" and "app_name" must be unique.
throw new ExpectedError(
`Error: An app or block or fleet with the name "${params.name}" already exists in organization "${organization}".`,
);
} else if ((err.message || '').toLowerCase().includes('unauthorized')) {
// BalenaRequestError: Request error: Unauthorized
throw new ExpectedError(
`Error: You are not authorized to create blocks in organization "${organization}".`,
);
}
throw err;
}
}
async getOrganization() {
const { getOwnOrganizations } = await import('../../utils/sdk');
const organizations = await getOwnOrganizations(getBalenaSdk(), {
$select: ['name', 'handle'],
});
if (organizations.length === 0) {
// User is not a member of any organizations (should not happen).
throw new Error('This account is not a member of any organizations');
} else if (organizations.length === 1) {
// User is a member of only one organization - use this.
return organizations[0].handle;
} else {
// User is a member of multiple organizations -
const { selectOrganization } = await import('../../utils/patterns');
return selectOrganization(organizations);
}
await (
await import('../../utils/application-create')
).applicationCreateBase('block', options, params);
}
}

View File

@ -20,7 +20,6 @@ import type { IArg } from '@oclif/parser/lib/args';
import type {
BalenaSDK,
Device,
DeviceType,
PineOptions,
PineTypedResult,
} from 'balena-sdk';
@ -138,7 +137,6 @@ export default class DeviceMoveCmd extends Command {
balena: BalenaSDK,
devices: Awaited<ReturnType<typeof this.getDevices>>,
) {
const { getExpandedProp } = await import('../../utils/pine');
// deduplicate the slugs
const deviceCpuArchs = Array.from(
new Set(
@ -148,48 +146,44 @@ export default class DeviceMoveCmd extends Command {
),
);
const deviceTypeOptions = {
$select: 'slug',
$expand: {
is_of__cpu_architecture: {
$select: 'slug',
},
const allCpuArches = await balena.pine.get({
resource: 'cpu_architecture',
options: {
$select: ['id', 'slug'],
},
} satisfies PineOptions<DeviceType>;
const deviceTypes = (await balena.models.deviceType.getAllSupported(
deviceTypeOptions,
)) as Array<PineTypedResult<DeviceType, typeof deviceTypeOptions>>;
});
const compatibleDeviceTypeSlugs = new Set(
deviceTypes
.filter((deviceType) => {
const deviceTypeArch = getExpandedProp(
deviceType.is_of__cpu_architecture,
'slug',
)!;
return deviceCpuArchs.every((deviceCpuArch) =>
balena.models.os.isArchitectureCompatibleWith(
deviceCpuArch,
deviceTypeArch,
),
);
})
.map((deviceType) => deviceType.slug),
);
const compatibleCpuArchIds = allCpuArches
.filter((cpuArch) => {
return deviceCpuArchs.every((deviceCpuArch) =>
balena.models.os.isArchitectureCompatibleWith(
deviceCpuArch,
cpuArch.slug,
),
);
})
.map((deviceType) => deviceType.id);
const patterns = await import('../../utils/patterns');
try {
const application = await patterns.selectApplication(
(app) =>
compatibleDeviceTypeSlugs.has(app.is_for__device_type[0].slug) &&
devices.some(
(device) => device.belongs_to__application.__id !== app.id,
),
{
is_for__device_type: {
$any: {
$alias: 'dt',
$expr: {
dt: {
is_of__cpu_architecture: { $in: compatibleCpuArchIds },
},
},
},
},
},
true,
);
return application;
} catch (err) {
if (!compatibleDeviceTypeSlugs.size) {
if (!compatibleCpuArchIds.length) {
throw new ExpectedError(
`${err.message}\nDo all devices have a compatible architecture?`,
);

View File

@ -18,19 +18,9 @@
import { flags } from '@oclif/command';
import Command from '../../command';
import { ExpectedError } from '../../errors';
import * as cf from '../../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../../utils/lazy';
interface FlagsDef {
organization?: string;
type?: string; // application device type
help: void;
}
interface ArgsDef {
name: string;
}
import { stripIndent } from '../../utils/lazy';
import { ArgsDef, FlagsDef } from '../../utils/application-create';
export default class FleetCreateCmd extends Command {
public static description = stripIndent`
@ -90,60 +80,8 @@ export default class FleetCreateCmd extends Command {
FleetCreateCmd,
);
// Ascertain device type
const deviceType =
options.type ||
(await (await import('../../utils/patterns')).selectDeviceType());
// Ascertain organization
const organization =
options.organization?.toLowerCase() || (await this.getOrganization());
// Create application
try {
const application = await getBalenaSdk().models.application.create({
name: params.name,
deviceType,
organization,
});
// Output
console.log(
`Fleet created: slug "${application.slug}", device type "${deviceType}"`,
);
} catch (err) {
if ((err.message || '').toLowerCase().includes('unique')) {
// BalenaRequestError: Request error: "organization" and "app_name" must be unique.
throw new ExpectedError(
`Error: An app or block or fleet with the name "${params.name}" already exists in organization "${organization}".`,
);
} else if ((err.message || '').toLowerCase().includes('unauthorized')) {
// BalenaRequestError: Request error: Unauthorized
throw new ExpectedError(
`Error: You are not authorized to create fleets in organization "${organization}".`,
);
}
throw err;
}
}
async getOrganization() {
const { getOwnOrganizations } = await import('../../utils/sdk');
const organizations = await getOwnOrganizations(getBalenaSdk(), {
$select: ['name', 'handle'],
});
if (organizations.length === 0) {
// User is not a member of any organizations (should not happen).
throw new Error('This account is not a member of any organizations');
} else if (organizations.length === 1) {
// User is a member of only one organization - use this.
return organizations[0].handle;
} else {
// User is a member of multiple organizations -
const { selectOrganization } = await import('../../utils/patterns');
return selectOrganization(organizations);
}
await (
await import('../../utils/application-create')
).applicationCreateBase('fleet', options, params);
}
}

View File

@ -15,6 +15,7 @@
* limitations under the License.
*/
import type * as BalenaSdk from 'balena-sdk';
import { flags } from '@oclif/command';
import Command from '../command';
@ -22,7 +23,7 @@ import * as cf from '../utils/common-flags';
import { getBalenaSdk, stripIndent } from '../utils/lazy';
import type { DataSetOutputOptions } from '../framework';
interface ExtendedApplication extends ApplicationWithDeviceType {
interface ExtendedApplication extends ApplicationWithDeviceTypeSlug {
device_count: number;
online_devices: number;
device_type?: string;
@ -60,15 +61,20 @@ export default class FleetsCmd extends Command {
const balena = getBalenaSdk();
const pineOptions = {
$select: ['id', 'app_name', 'slug'],
$expand: {
is_for__device_type: { $select: 'slug' },
owns__device: { $select: 'is_online' },
},
} satisfies BalenaSdk.PineOptions<BalenaSdk.Application>;
// Get applications
const applications =
(await balena.models.application.getAllDirectlyAccessible({
$select: ['id', 'app_name', 'slug'],
$expand: {
is_for__device_type: { $select: 'slug' },
owns__device: { $select: 'is_online' },
},
})) as ExtendedApplication[];
(await balena.models.application.getAllDirectlyAccessible(
pineOptions,
)) as Array<
BalenaSdk.PineTypedResult<BalenaSdk.Application, typeof pineOptions>
> as ExtendedApplication[];
// Add extended properties
applications.forEach((application) => {

View File

@ -204,7 +204,7 @@ export default class OsConfigureCmd extends Command {
const helpers = await import('../../utils/helpers');
const { getApplication } = await import('../../utils/sdk');
let app: ApplicationWithDeviceType | undefined;
let app: ApplicationWithDeviceTypeSlug | undefined;
let device;
let deviceTypeSlug: string;
@ -223,7 +223,7 @@ export default class OsConfigureCmd extends Command {
$expand: {
is_for__device_type: { $select: 'slug' },
},
})) as ApplicationWithDeviceType;
})) as ApplicationWithDeviceTypeSlug;
await checkDeviceTypeCompatibility(options, app);
deviceTypeSlug =
options['device-type'] || app.is_for__device_type[0].slug;

View File

@ -46,7 +46,7 @@ interface FlagsDef extends DockerConnectionCliFlags {
commit?: string;
'splash-image'?: string;
'dont-check-arch': boolean;
'pin-device-to-release': boolean;
'pin-device-to-release'?: boolean;
'additional-space'?: number;
'add-certificate'?: string[];
help: void;
@ -122,7 +122,7 @@ https://github.com/balena-io-examples/staged-releases\
'disable architecture compatibility check between image and fleet',
}),
'pin-device-to-release': flags.boolean({
default: false,
allowNo: true,
description:
'pin the preloaded device to the preloaded release on provision',
char: 'p',
@ -230,7 +230,7 @@ Can be repeated to add multiple certificates.\
const splashImage = options['splash-image'];
const additionalSpace = options['additional-space'];
const dontCheckArch = options['dont-check-arch'] || false;
const pinDevice = options['pin-device-to-release'] || false;
const pinDevice = options['pin-device-to-release'];
if (dontCheckArch && !fleetSlug) {
throw new ExpectedError(
@ -257,7 +257,7 @@ Can be repeated to add multiple certificates.\
splashImage,
undefined, // TODO: Currently always undefined, investigate approach in ssh command.
dontCheckArch,
pinDevice,
pinDevice ?? false,
certificates,
additionalSpace,
);
@ -450,14 +450,14 @@ Can be repeated to add multiple certificates.\
async offerToDisableAutomaticUpdates(
application: Pick<Application, 'id' | 'should_track_latest_release'>,
commit: string,
pinDevice: boolean,
pinDevice: boolean | undefined,
) {
const balena = getBalenaSdk();
if (
this.isCurrentCommit(commit) ||
!application.should_track_latest_release ||
pinDevice
pinDevice != null
) {
return;
}
@ -476,8 +476,9 @@ through the web dashboard or programatically through the balena API / SDK.
Documentation about release policies and pinning can be found at:
https://www.balena.io/docs/learn/deploy/release-strategy/release-policy/
Alternatively, the --pin-device-to-release flag may be used to pin only the
preloaded device to the selected release.
Alternatively, the --pin-device-to-release or --no-pin-device-to-release flags may be used
to avoid this interactive confirmation and pin only the preloaded device to the selected release
or keep it unpinned respectively.
Would you like to disable automatic updates for this fleet now?\
`;
@ -511,7 +512,7 @@ Would you like to disable automatic updates for this fleet now?\
options: {
slug?: string;
commit?: string;
pinDevice: boolean;
pinDevice?: boolean;
},
) {
await preloader.prepare();

View File

@ -0,0 +1,58 @@
import { ExpectedError } from '../errors';
import { getBalenaSdk } from './lazy';
export interface FlagsDef {
organization?: string;
type?: string; // application device type
help: void;
}
export interface ArgsDef {
name: string;
}
export async function applicationCreateBase(
resource: 'fleet' | 'app' | 'block',
options: FlagsDef,
params: ArgsDef,
) {
// Ascertain device type
const deviceType =
options.type || (await (await import('./patterns')).selectDeviceType());
// Ascertain organization
const organization =
options.organization?.toLowerCase() ||
(await (await import('./patterns')).getAndSelectOrganization());
// Create application
try {
const application = await getBalenaSdk().models.application.create({
name: params.name,
deviceType,
organization,
});
// Output
const { capitalize } = await import('lodash');
console.log(
`${capitalize(resource)} created: slug "${
application.slug
}", device type "${deviceType}"`,
);
} catch (err) {
if ((err.message || '').toLowerCase().includes('unique')) {
// BalenaRequestError: Request error: "organization" and "app_name" must be unique.
throw new ExpectedError(
`Error: An app or block or fleet with the name "${params.name}" already exists in organization "${organization}".`,
);
} else if ((err.message || '').toLowerCase().includes('unauthorized')) {
// BalenaRequestError: Request error: Unauthorized
throw new ExpectedError(
`Error: You are not authorized to create ${resource}s in organization "${organization}".`,
);
}
throw err;
}
}

View File

@ -588,7 +588,7 @@ async function assignDockerBuildOpts(
pull: opts.pull,
};
if (task.external) {
task.dockerOpts.authconfig = await getAuthConfigObj(
task.dockerOpts.authconfig = getAuthConfigObj(
task.imageName!,
opts.registrySecrets,
);

View File

@ -19,10 +19,10 @@ import type {
BalenaSDK,
Device,
Organization,
PineFilter,
PineOptions,
PineTypedResult,
} from 'balena-sdk';
import _ = require('lodash');
import { instanceOf, NotLoggedInError, ExpectedError } from '../errors';
import { getBalenaSdk, getVisuals, stripIndent, getCliForm } from './lazy';
@ -115,22 +115,22 @@ export function askLoginType() {
});
}
export function selectDeviceType() {
return getBalenaSdk()
.models.config.getDeviceTypes()
.then((deviceTypes) => {
deviceTypes = _.sortBy(deviceTypes, 'name').filter(
(dt) => dt.state !== 'DISCONTINUED',
);
return getCliForm().ask({
message: 'Device Type',
type: 'list',
choices: _.map(deviceTypes, ({ slug: value, name }) => ({
name,
value,
})),
});
});
export async function selectDeviceType() {
const sdk = getBalenaSdk();
let deviceTypes = await sdk.models.deviceType.getAllSupported();
if (deviceTypes.length === 0) {
// Without this open-balena users would get an empty list
// until we add a hostApps import in open-balena.
deviceTypes = await sdk.models.deviceType.getAll();
}
return getCliForm().ask({
message: 'Device Type',
type: 'list',
choices: deviceTypes.map(({ slug: value, name }) => ({
name,
value,
})),
});
}
/**
@ -179,27 +179,32 @@ type SelectApplicationResult = PineTypedResult<
>;
export async function selectApplication(
filter?: (app: SelectApplicationResult) => boolean,
filter?:
| PineFilter<Application>
| ((app: SelectApplicationResult) => boolean),
errorOnEmptySelection = false,
) {
const balena = getBalenaSdk();
const apps = (await balena.models.application.getAllDirectlyAccessible(
selectApplicationPineOptions,
)) as SelectApplicationResult[];
let apps = (await balena.models.application.getAllDirectlyAccessible({
...selectApplicationPineOptions,
...(filter != null && typeof filter === 'object' && { $filter: filter }),
})) as SelectApplicationResult[];
if (!apps.length) {
throw new ExpectedError('No fleets found');
}
const applications = filter ? apps.filter(filter) : apps;
if (filter != null && typeof filter === 'function') {
apps = apps.filter(filter);
}
if (errorOnEmptySelection && applications.length === 0) {
if (errorOnEmptySelection && apps.length === 0) {
throw new ExpectedError('No suitable fleets found for selection');
}
return getCliForm().ask({
message: 'Select an application',
type: 'list',
choices: _.map(applications, (application) => ({
choices: apps.map((application) => ({
name: `${application.app_name} (${application.slug}) [${application.is_for__device_type[0].slug}]`,
value: application,
})),
@ -223,6 +228,24 @@ export async function selectOrganization(
});
}
export async function getAndSelectOrganization() {
const { getOwnOrganizations } = await import('./sdk');
const organizations = await getOwnOrganizations(getBalenaSdk(), {
$select: ['name', 'handle'],
});
if (organizations.length === 0) {
// User is not a member of any organizations (should not happen).
throw new Error('This account is not a member of any organizations');
} else if (organizations.length === 1) {
// User is a member of only one organization - use this.
return organizations[0].handle;
} else {
// User is a member of multiple organizations -
return selectOrganization(organizations);
}
}
export async function awaitDeviceOsUpdate(
uuid: string,
targetOsVersion: string,
@ -338,7 +361,7 @@ export async function getOnlineTargetDeviceUuid(
const devices = application.owns__device;
// Throw if no devices online
if (_.isEmpty(devices)) {
if (!devices.length) {
throw new ExpectedError(
`Fleet ${application.slug} found, but has no devices online.`,
);
@ -349,7 +372,7 @@ export async function getOnlineTargetDeviceUuid(
message: `Select a device on fleet ${application.slug}`,
type: 'list',
default: devices[0].uuid,
choices: _.map(devices, (device) => ({
choices: devices.map((device) => ({
name: `${device.device_name || 'Untitled'} (${device.uuid.slice(0, 7)})`,
value: device.uuid,
})),
@ -363,7 +386,7 @@ export function selectFromList<T>(
return getCliForm().ask<T>({
message,
type: 'list',
choices: _.map(choices, (s) => ({
choices: choices.map((s) => ({
name: s.name,
value: s,
})),

View File

@ -228,8 +228,8 @@ async function selectLocalDevice(): Promise<string> {
}
async function selectAppFromList(
applications: ApplicationWithDeviceType[],
): Promise<ApplicationWithDeviceType> {
applications: ApplicationWithDeviceTypeSlug[],
): Promise<ApplicationWithDeviceTypeSlug> {
const _ = await import('lodash');
const { selectFromList } = await import('../utils/patterns');
@ -247,7 +247,7 @@ async function getOrSelectApplication(
sdk: BalenaSdk.BalenaSDK,
deviceTypeSlug: string,
appName?: string,
): Promise<ApplicationWithDeviceType> {
): Promise<ApplicationWithDeviceTypeSlug> {
const pineOptions = {
$select: 'slug',
$expand: {
@ -256,51 +256,72 @@ async function getOrSelectApplication(
},
},
} satisfies BalenaSdk.PineOptions<BalenaSdk.DeviceType>;
const [deviceType, allDeviceTypes] = await Promise.all([
sdk.models.deviceType.get(deviceTypeSlug, pineOptions) as Promise<
BalenaSdk.PineTypedResult<BalenaSdk.DeviceType, typeof pineOptions>
>,
sdk.models.deviceType.getAllSupported(pineOptions) as Promise<
Array<BalenaSdk.PineTypedResult<BalenaSdk.DeviceType, typeof pineOptions>>
>,
]);
const deviceType = (await sdk.models.deviceType.get(
deviceTypeSlug,
pineOptions,
)) as BalenaSdk.PineTypedResult<BalenaSdk.DeviceType, typeof pineOptions>;
const allCpuArches = await sdk.pine.get({
resource: 'cpu_architecture',
options: {
$select: ['id', 'slug'],
},
});
const compatibleDeviceTypes = allDeviceTypes
.filter((dt) =>
const compatibleCpuArchIds = allCpuArches
.filter((cpuArch) =>
sdk.models.os.isArchitectureCompatibleWith(
deviceType.is_of__cpu_architecture[0].slug,
dt.is_of__cpu_architecture[0].slug,
cpuArch.slug,
),
)
.map((type) => type.slug);
.map((cpu) => cpu.id);
if (!appName) {
return createOrSelectApp(sdk, compatibleDeviceTypes, deviceTypeSlug);
return createOrSelectApp(
sdk,
{
is_for__device_type: {
$any: {
$alias: 'dt',
$expr: {
dt: {
is_of__cpu_architecture: { $in: compatibleCpuArchIds },
},
},
},
},
},
deviceTypeSlug,
);
}
const options: BalenaSdk.PineOptions<BalenaSdk.Application> = {
const options = {
$expand: {
is_for__device_type: { $select: 'slug' },
is_for__device_type: { $select: ['slug', 'is_of__cpu_architecture'] },
},
};
} satisfies BalenaSdk.PineOptions<BalenaSdk.Application>;
// Check for a fleet slug of the form `user/fleet` and update the API query.
let name: string;
const match = appName.split('/');
if (match.length > 1) {
// These will match at most one fleet
options.$filter = { slug: appName.toLowerCase() };
(options as BalenaSdk.PineOptions<BalenaSdk.Application>).$filter = {
slug: appName.toLowerCase(),
};
name = match[1];
} else {
// We're given an application; resolve it if it's ambiguous and also validate
// it's of appropriate device type.
options.$filter = { app_name: appName };
(options as BalenaSdk.PineOptions<BalenaSdk.Application>).$filter = {
app_name: appName,
};
name = appName;
}
const applications = (await sdk.models.application.getAllDirectlyAccessible(
options,
)) as ApplicationWithDeviceType[];
)) as Array<BalenaSdk.PineTypedResult<BalenaSdk.Application, typeof options>>;
if (applications.length === 0) {
await confirm(
@ -315,8 +336,11 @@ async function getOrSelectApplication(
// We've found at least one fleet with the given name.
// Filter out fleets for non-matching device types and see what we're left with.
const compatibleCpuArchIdsSet = new Set(compatibleCpuArchIds);
const validApplications = applications.filter((app) =>
compatibleDeviceTypes.includes(app.is_for__device_type[0].slug),
compatibleCpuArchIdsSet.has(
app.is_for__device_type[0].is_of__cpu_architecture.__id,
),
);
if (validApplications.length === 0) {
@ -332,21 +356,14 @@ async function getOrSelectApplication(
async function createOrSelectApp(
sdk: BalenaSdk.BalenaSDK,
compatibleDeviceTypes: string[],
compatibleDeviceTypesFilter: BalenaSdk.PineFilter<BalenaSdk.Application>,
deviceType: string,
): Promise<ApplicationWithDeviceType> {
): Promise<ApplicationWithDeviceTypeSlug> {
// No fleet specified, show a list to select one.
const applications = (await sdk.models.application.getAllDirectlyAccessible({
$expand: { is_for__device_type: { $select: 'slug' } },
$filter: {
is_for__device_type: {
$any: {
$alias: 'dt',
$expr: { dt: { slug: { $in: compatibleDeviceTypes } } },
},
},
},
})) as ApplicationWithDeviceType[];
$filter: compatibleDeviceTypesFilter,
})) as ApplicationWithDeviceTypeSlug[];
if (applications.length === 0) {
await confirm(
@ -366,7 +383,7 @@ async function createApplication(
sdk: BalenaSdk.BalenaSDK,
deviceType: string,
name?: string,
): Promise<ApplicationWithDeviceType> {
): Promise<ApplicationWithDeviceTypeSlug> {
const validation = await import('./validation');
const username = await sdk.auth.whoami();
@ -414,12 +431,12 @@ async function createApplication(
$expand: {
is_for__device_type: { $select: 'slug' },
},
})) as ApplicationWithDeviceType;
})) as ApplicationWithDeviceTypeSlug;
}
async function generateApplicationConfig(
sdk: BalenaSdk.BalenaSDK,
app: ApplicationWithDeviceType,
app: ApplicationWithDeviceTypeSlug,
options: {
version: string;
appUpdatePollInterval?: number;

487
npm-shrinkwrap.json generated
View File

@ -1,16 +1,16 @@
{
"name": "balena-cli",
"version": "16.6.3",
"version": "16.7.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "balena-cli",
"version": "16.6.3",
"version": "16.7.5",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@balena/compose": "^2.2.1",
"@balena/compose": "^3.0.2",
"@balena/dockerignore": "^1.0.2",
"@balena/es-version": "^1.0.1",
"@oclif/command": "^1.8.16",
@ -24,7 +24,7 @@
"balena-image-fs": "^7.0.6",
"balena-image-manager": "^9.0.0",
"balena-preload": "^14.0.0",
"balena-sdk": "^17.0.0",
"balena-sdk": "^17.8.0",
"balena-semver": "^2.3.0",
"balena-settings-client": "^5.0.2",
"balena-settings-storage": "^7.0.0",
@ -1103,9 +1103,9 @@
}
},
"node_modules/@babel/generator": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz",
"integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==",
"version": "7.22.9",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
"integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.5",
@ -1296,9 +1296,9 @@
}
},
"node_modules/@babel/template/node_modules/@babel/parser": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
"integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
"version": "7.22.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
"integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@ -1343,9 +1343,9 @@
}
},
"node_modules/@babel/traverse/node_modules/@babel/parser": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
"integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
"version": "7.22.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
"integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@ -1394,9 +1394,9 @@
}
},
"node_modules/@balena/compose": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@balena/compose/-/compose-2.2.1.tgz",
"integrity": "sha512-NxXXG6IN50fx5ZB6e41IsUKH/W1qCFPJeF1Tg0Tg2SqsPn7zq6o5LL0ENc0WkG+ytphxA8W+d4KjV2SQMe6ClA==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@balena/compose/-/compose-3.0.2.tgz",
"integrity": "sha512-CZnGpAmt1g1ltm6f8UhnWX3/iglpOOgWtphAhh9wPirR5v3KkzjbRRnXbBNLWC5UIyxJNwXvmioByPVEaNE6mQ==",
"dependencies": {
"ajv": "^6.12.3",
"bluebird": "^3.7.2",
@ -1421,12 +1421,12 @@
"request": "^2.88.2",
"semver": "^7.3.5",
"stream-to-promise": "^3.0.0",
"tar-stream": "^2.1.3",
"tar-utils": "^2.1.0",
"tar-stream": "^3.1.6",
"tar-utils": "^3.0.2",
"typed-error": "^3.2.1"
},
"engines": {
"node": ">=12.0.0"
"node": ">=16.13.0"
}
},
"node_modules/@balena/compose/node_modules/docker-modem": {
@ -1502,6 +1502,27 @@
"node": ">= 10"
}
},
"node_modules/@balena/compose/node_modules/tar-stream": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
"integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
"dependencies": {
"b4a": "^1.6.4",
"fast-fifo": "^1.2.0",
"streamx": "^2.15.0"
}
},
"node_modules/@balena/compose/node_modules/tar-utils": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/tar-utils/-/tar-utils-3.0.2.tgz",
"integrity": "sha512-UimIIz7AKMvSKPF09ma4QG++NKjeHL/IylmCXOWgCAaAikruR40PlbhfxDmWVM/JKwc4umHGSp65UFIeJ/5/Hw==",
"dependencies": {
"tar-stream": "^3.1.6"
},
"engines": {
"node": ">=16.13.0"
}
},
"node_modules/@balena/dockerignore": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz",
@ -1802,16 +1823,16 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@oclif/command": {
"version": "1.8.29",
"resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.29.tgz",
"integrity": "sha512-wupMygd4nZ5B4oCjkjGBMzZKY9tjNKGg8iZgqjLpWs9zz8WlwIf0DemDkdaYfIkZ7vUGbPAKSg0zbD/qSdhMRw==",
"version": "1.8.33",
"resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.33.tgz",
"integrity": "sha512-7ZPvThrZaICX1hoZ/S82DaGgjI3UGG2rveBfxCE9JlgvrDQQiHLA6a/N7Hf3jq6t51AkXbBMhaMOBzXtSd73QA==",
"dependencies": {
"@oclif/config": "^1.18.2",
"@oclif/errors": "^1.3.6",
"@oclif/help": "^1.0.1",
"@oclif/parser": "^3.8.12",
"@oclif/parser": "^3.8.14",
"debug": "^4.1.1",
"semver": "^7.5.3"
"semver": "^7.5.4"
},
"engines": {
"node": ">=12.0.0"
@ -2026,14 +2047,14 @@
"integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw=="
},
"node_modules/@oclif/parser": {
"version": "3.8.12",
"resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.12.tgz",
"integrity": "sha512-yGUrpddLHdPMJIS5jEd55cEPTIFRZRdx38zz0YdFp17Co4RdZvii2jnrnAoICHhumAoQ3EBxwjGpp88D7Bin4w==",
"version": "3.8.14",
"resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.14.tgz",
"integrity": "sha512-dGF3/Db+YZTxlR2f5cUbFcUXhrGxeVu9aT+Y/J7Wt6KMRiBJ6igIBChDHvRjjQVujR00OpdkS6fyLgBFI5meWQ==",
"dependencies": {
"@oclif/errors": "^1.3.6",
"@oclif/linewrap": "^1.0.0",
"chalk": "^4.1.0",
"tslib": "^2.5.3"
"tslib": "^2.6.0"
},
"engines": {
"node": ">=8.0.0"
@ -3061,9 +3082,9 @@
}
},
"node_modules/@types/node": {
"version": "16.18.37",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.37.tgz",
"integrity": "sha512-ql+4dw4PlPFBP495k8JzUX/oMNRI2Ei4PrMHgj8oT4VhGlYUzF4EYr0qk2fW+XBVGIrq8Zzk13m4cvyXZuv4pA=="
"version": "16.18.38",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz",
"integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ=="
},
"node_modules/@types/node-cleanup": {
"version": "2.1.2",
@ -3906,15 +3927,20 @@
"follow-redirects": "^1.14.0"
}
},
"node_modules/b4a": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
"integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
},
"node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"node_modules/balena-auth": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/balena-auth/-/balena-auth-4.1.2.tgz",
"integrity": "sha512-F0cnqcm45X2aujClDePH3TOYj/ngz1IepFE9F5A6/QRqPgju1uLlMgplnUahgZK+wpPhuegn+ke3wvjzWU7vSQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/balena-auth/-/balena-auth-4.2.1.tgz",
"integrity": "sha512-crYf0gHp+hgP19HbjDmo3YoZqUBKB/5ziFjnvDxnnetW8yr0tpy38hlwQD1HkjPjjBqj5vRvnAQJgYnPv2oYCg==",
"dependencies": {
"@types/jwt-decode": "^2.2.1",
"balena-errors": "^4.7.1",
@ -4162,15 +4188,15 @@
}
},
"node_modules/balena-sdk": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/balena-sdk/-/balena-sdk-17.0.0.tgz",
"integrity": "sha512-CivFA2dGjV232nhPyc/1aA19EXLbZ5BAJ3EQ0TsA3xNx7M7fZr76Q9s47BDfAFgEO921dFxBZx30xqY1ifFI6g==",
"version": "17.8.0",
"resolved": "https://registry.npmjs.org/balena-sdk/-/balena-sdk-17.8.0.tgz",
"integrity": "sha512-njbSVvmG3u5SNrnF0FojJXx6ELCCk98pzcjT5E5wd5Ig3dyKEKbmocgcW4YzarIvb8q1/f0FAYvwKNw4RM354A==",
"dependencies": {
"@balena/es-version": "^1.0.0",
"@types/json-schema": "^7.0.9",
"@types/node": "^14.0.0",
"abortcontroller-polyfill": "^1.7.1",
"balena-auth": "^4.1.0",
"balena-auth": "^4.2.0",
"balena-errors": "^4.7.3",
"balena-hup-action-utils": "~5.0.0",
"balena-register-device": "^8.0.0",
@ -4182,6 +4208,7 @@
"lodash": "^4.17.21",
"memoizee": "^0.4.15",
"ndjson": "^2.0.0",
"p-throttle": "^4.1.1",
"pinejs-client-core": "^6.12.0",
"tslib": "^2.1.0"
},
@ -4190,9 +4217,9 @@
}
},
"node_modules/balena-sdk/node_modules/@types/node": {
"version": "14.18.52",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.52.tgz",
"integrity": "sha512-DGhiXKOHSFVVm+PJD+9Y0ObxXLeG6qwc0HoOn+ooQKeNNu+T2mEJCM5UBDUREKAggl9MHYjb5E71PAmx6MbzIg=="
"version": "14.18.53",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz",
"integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A=="
},
"node_modules/balena-sdk/node_modules/date-fns": {
"version": "2.30.0",
@ -6121,9 +6148,9 @@
}
},
"node_modules/cross-spawn/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"bin": {
"semver": "bin/semver"
}
@ -7025,9 +7052,9 @@
}
},
"node_modules/editions/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@ -7486,9 +7513,9 @@
}
},
"node_modules/eslint/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@ -7764,9 +7791,9 @@
}
},
"node_modules/etcher-sdk/node_modules/detect-libc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"engines": {
"node": ">=8"
}
@ -8290,6 +8317,11 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/fast-fifo": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz",
"integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw=="
},
"node_modules/fast-glob": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz",
@ -11442,9 +11474,9 @@
}
},
"node_modules/jsonwebtoken/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@ -11497,9 +11529,9 @@
"integrity": "sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ=="
},
"node_modules/keyv": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
"integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
"version": "4.5.3",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
"integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
"dependencies": {
"json-buffer": "3.0.1"
}
@ -12152,9 +12184,9 @@
}
},
"node_modules/make-dir/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@ -13560,9 +13592,9 @@
}
},
"node_modules/node-abi/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"bin": {
"semver": "bin/semver"
}
@ -13671,9 +13703,9 @@
}
},
"node_modules/normalize-package-data/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"bin": {
"semver": "bin/semver"
}
@ -14430,6 +14462,17 @@
"node": ">=8"
}
},
"node_modules/p-throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz",
"integrity": "sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-timeout": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
@ -14612,9 +14655,9 @@
}
},
"node_modules/package-json/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@ -14820,9 +14863,9 @@
}
},
"node_modules/patch-package/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"bin": {
"semver": "bin/semver"
}
@ -15196,9 +15239,9 @@
}
},
"node_modules/pkg/node_modules/detect-libc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"dev": true,
"engines": {
"node": ">=8"
@ -16098,6 +16141,11 @@
"lodash": "^4.17.21"
}
},
"node_modules/queue-tick": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
"integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="
},
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
@ -17202,9 +17250,9 @@
}
},
"node_modules/semver": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
"integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dependencies": {
"lru-cache": "^6.0.0"
},
@ -17232,9 +17280,9 @@
}
},
"node_modules/semver-diff/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
@ -18172,6 +18220,15 @@
"node": ">=0.8.0"
}
},
"node_modules/streamx": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz",
"integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==",
"dependencies": {
"fast-fifo": "^1.1.0",
"queue-tick": "^1.0.1"
}
},
"node_modules/strict-event-emitter-types": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz",
@ -18778,9 +18835,9 @@
}
},
"node_modules/tar-utils": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/tar-utils/-/tar-utils-2.1.2.tgz",
"integrity": "sha512-NBnDhRG1KE/FDYgrAz3KfgDKGsqczeTj+ZVXZFNMq21iQjRzvu5/l405kgP9qRWVMysZRwkYnGat6EDlKmauzg==",
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/tar-utils/-/tar-utils-2.1.3.tgz",
"integrity": "sha512-qNT76v6A4kF3Ye9p0EpVTLIS3Dbr2amGbJRW3t7mOIYiuI7hHIZ6VHWyiMW5JgxoB4RmRfShVSCGZEHomO8hNw==",
"dependencies": {
"bluebird": "^3.7.2",
"tar-stream": "^2.1.3"
@ -19177,9 +19234,9 @@
}
},
"node_modules/ts-node/node_modules/acorn": {
"version": "8.9.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz",
"integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==",
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@ -19357,9 +19414,9 @@
}
},
"node_modules/tslint/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@ -20321,9 +20378,9 @@
}
},
"node_modules/winusb-driver-generator/node_modules/detect-libc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"optional": true,
"engines": {
"node": ">=8"
@ -21298,9 +21355,9 @@
}
},
"node_modules/yeoman-environment/node_modules/yeoman-generator/node_modules/cross-spawn/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"bin": {
"semver": "bin/semver"
}
@ -22991,9 +23048,9 @@
}
},
"@babel/generator": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz",
"integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==",
"version": "7.22.9",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
"integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
"dev": true,
"requires": {
"@babel/types": "^7.22.5",
@ -23142,9 +23199,9 @@
},
"dependencies": {
"@babel/parser": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
"integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
"version": "7.22.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
"integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
"dev": true
},
"@babel/types": {
@ -23179,9 +23236,9 @@
},
"dependencies": {
"@babel/parser": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
"integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
"version": "7.22.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
"integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
"dev": true
},
"@babel/types": {
@ -23217,9 +23274,9 @@
}
},
"@balena/compose": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@balena/compose/-/compose-2.2.1.tgz",
"integrity": "sha512-NxXXG6IN50fx5ZB6e41IsUKH/W1qCFPJeF1Tg0Tg2SqsPn7zq6o5LL0ENc0WkG+ytphxA8W+d4KjV2SQMe6ClA==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@balena/compose/-/compose-3.0.2.tgz",
"integrity": "sha512-CZnGpAmt1g1ltm6f8UhnWX3/iglpOOgWtphAhh9wPirR5v3KkzjbRRnXbBNLWC5UIyxJNwXvmioByPVEaNE6mQ==",
"requires": {
"ajv": "^6.12.3",
"bluebird": "^3.7.2",
@ -23244,8 +23301,8 @@
"request": "^2.88.2",
"semver": "^7.3.5",
"stream-to-promise": "^3.0.0",
"tar-stream": "^2.1.3",
"tar-utils": "^2.1.0",
"tar-stream": "^3.1.6",
"tar-utils": "^3.0.2",
"typed-error": "^3.2.1"
},
"dependencies": {
@ -23303,6 +23360,24 @@
"end-of-stream": "~1.4.1",
"stream-to-array": "~2.3.0"
}
},
"tar-stream": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
"integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
"requires": {
"b4a": "^1.6.4",
"fast-fifo": "^1.2.0",
"streamx": "^2.15.0"
}
},
"tar-utils": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/tar-utils/-/tar-utils-3.0.2.tgz",
"integrity": "sha512-UimIIz7AKMvSKPF09ma4QG++NKjeHL/IylmCXOWgCAaAikruR40PlbhfxDmWVM/JKwc4umHGSp65UFIeJ/5/Hw==",
"requires": {
"tar-stream": "^3.1.6"
}
}
}
},
@ -23562,16 +23637,16 @@
}
},
"@oclif/command": {
"version": "1.8.29",
"resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.29.tgz",
"integrity": "sha512-wupMygd4nZ5B4oCjkjGBMzZKY9tjNKGg8iZgqjLpWs9zz8WlwIf0DemDkdaYfIkZ7vUGbPAKSg0zbD/qSdhMRw==",
"version": "1.8.33",
"resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.33.tgz",
"integrity": "sha512-7ZPvThrZaICX1hoZ/S82DaGgjI3UGG2rveBfxCE9JlgvrDQQiHLA6a/N7Hf3jq6t51AkXbBMhaMOBzXtSd73QA==",
"requires": {
"@oclif/config": "^1.18.2",
"@oclif/errors": "^1.3.6",
"@oclif/help": "^1.0.1",
"@oclif/parser": "^3.8.12",
"@oclif/parser": "^3.8.14",
"debug": "^4.1.1",
"semver": "^7.5.3"
"semver": "^7.5.4"
}
},
"@oclif/config": {
@ -23738,14 +23813,14 @@
"integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw=="
},
"@oclif/parser": {
"version": "3.8.12",
"resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.12.tgz",
"integrity": "sha512-yGUrpddLHdPMJIS5jEd55cEPTIFRZRdx38zz0YdFp17Co4RdZvii2jnrnAoICHhumAoQ3EBxwjGpp88D7Bin4w==",
"version": "3.8.14",
"resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.14.tgz",
"integrity": "sha512-dGF3/Db+YZTxlR2f5cUbFcUXhrGxeVu9aT+Y/J7Wt6KMRiBJ6igIBChDHvRjjQVujR00OpdkS6fyLgBFI5meWQ==",
"requires": {
"@oclif/errors": "^1.3.6",
"@oclif/linewrap": "^1.0.0",
"chalk": "^4.1.0",
"tslib": "^2.5.3"
"tslib": "^2.6.0"
},
"dependencies": {
"chalk": {
@ -24664,9 +24739,9 @@
}
},
"@types/node": {
"version": "16.18.37",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.37.tgz",
"integrity": "sha512-ql+4dw4PlPFBP495k8JzUX/oMNRI2Ei4PrMHgj8oT4VhGlYUzF4EYr0qk2fW+XBVGIrq8Zzk13m4cvyXZuv4pA=="
"version": "16.18.38",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz",
"integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ=="
},
"@types/node-cleanup": {
"version": "2.1.2",
@ -25377,15 +25452,20 @@
"follow-redirects": "^1.14.0"
}
},
"b4a": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
"integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"balena-auth": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/balena-auth/-/balena-auth-4.1.2.tgz",
"integrity": "sha512-F0cnqcm45X2aujClDePH3TOYj/ngz1IepFE9F5A6/QRqPgju1uLlMgplnUahgZK+wpPhuegn+ke3wvjzWU7vSQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/balena-auth/-/balena-auth-4.2.1.tgz",
"integrity": "sha512-crYf0gHp+hgP19HbjDmo3YoZqUBKB/5ziFjnvDxnnetW8yr0tpy38hlwQD1HkjPjjBqj5vRvnAQJgYnPv2oYCg==",
"requires": {
"@types/jwt-decode": "^2.2.1",
"balena-errors": "^4.7.1",
@ -25589,15 +25669,15 @@
}
},
"balena-sdk": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/balena-sdk/-/balena-sdk-17.0.0.tgz",
"integrity": "sha512-CivFA2dGjV232nhPyc/1aA19EXLbZ5BAJ3EQ0TsA3xNx7M7fZr76Q9s47BDfAFgEO921dFxBZx30xqY1ifFI6g==",
"version": "17.8.0",
"resolved": "https://registry.npmjs.org/balena-sdk/-/balena-sdk-17.8.0.tgz",
"integrity": "sha512-njbSVvmG3u5SNrnF0FojJXx6ELCCk98pzcjT5E5wd5Ig3dyKEKbmocgcW4YzarIvb8q1/f0FAYvwKNw4RM354A==",
"requires": {
"@balena/es-version": "^1.0.0",
"@types/json-schema": "^7.0.9",
"@types/node": "^14.0.0",
"abortcontroller-polyfill": "^1.7.1",
"balena-auth": "^4.1.0",
"balena-auth": "^4.2.0",
"balena-errors": "^4.7.3",
"balena-hup-action-utils": "~5.0.0",
"balena-register-device": "^8.0.0",
@ -25609,14 +25689,15 @@
"lodash": "^4.17.21",
"memoizee": "^0.4.15",
"ndjson": "^2.0.0",
"p-throttle": "^4.1.1",
"pinejs-client-core": "^6.12.0",
"tslib": "^2.1.0"
},
"dependencies": {
"@types/node": {
"version": "14.18.52",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.52.tgz",
"integrity": "sha512-DGhiXKOHSFVVm+PJD+9Y0ObxXLeG6qwc0HoOn+ooQKeNNu+T2mEJCM5UBDUREKAggl9MHYjb5E71PAmx6MbzIg=="
"version": "14.18.53",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz",
"integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A=="
},
"date-fns": {
"version": "2.30.0",
@ -27153,9 +27234,9 @@
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
},
"which": {
"version": "1.3.1",
@ -27870,9 +27951,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@ -28208,9 +28289,9 @@
}
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
},
"strip-ansi": {
@ -28458,9 +28539,9 @@
}
},
"detect-libc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w=="
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="
},
"drivelist": {
"version": "11.1.0",
@ -28878,6 +28959,11 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-fifo": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz",
"integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw=="
},
"fast-glob": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz",
@ -31251,9 +31337,9 @@
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
}
}
@ -31302,9 +31388,9 @@
"integrity": "sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ=="
},
"keyv": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
"integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
"version": "4.5.3",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
"integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
"requires": {
"json-buffer": "3.0.1"
}
@ -31867,9 +31953,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@ -32988,9 +33074,9 @@
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
}
}
},
@ -33084,9 +33170,9 @@
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
}
}
},
@ -33658,6 +33744,11 @@
"p-limit": "^2.2.0"
}
},
"p-throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz",
"integrity": "sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g=="
},
"p-timeout": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
@ -33797,9 +33888,9 @@
}
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
},
"url-parse-lax": {
"version": "3.0.0",
@ -33967,9 +34058,9 @@
}
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
},
"slash": {
"version": "2.0.0",
@ -34169,9 +34260,9 @@
}
},
"detect-libc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"dev": true
},
"has-flag": {
@ -34928,6 +35019,11 @@
"lodash": "^4.17.21"
}
},
"queue-tick": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
"integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="
},
"quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
@ -35827,9 +35923,9 @@
}
},
"semver": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
"integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"requires": {
"lru-cache": "^6.0.0"
}
@ -35848,9 +35944,9 @@
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
}
}
},
@ -36615,6 +36711,15 @@
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
},
"streamx": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz",
"integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==",
"requires": {
"fast-fifo": "^1.1.0",
"queue-tick": "^1.0.1"
}
},
"strict-event-emitter-types": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz",
@ -37097,9 +37202,9 @@
}
},
"tar-utils": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/tar-utils/-/tar-utils-2.1.2.tgz",
"integrity": "sha512-NBnDhRG1KE/FDYgrAz3KfgDKGsqczeTj+ZVXZFNMq21iQjRzvu5/l405kgP9qRWVMysZRwkYnGat6EDlKmauzg==",
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/tar-utils/-/tar-utils-2.1.3.tgz",
"integrity": "sha512-qNT76v6A4kF3Ye9p0EpVTLIS3Dbr2amGbJRW3t7mOIYiuI7hHIZ6VHWyiMW5JgxoB4RmRfShVSCGZEHomO8hNw==",
"requires": {
"bluebird": "^3.7.2",
"tar-stream": "^2.1.3"
@ -37393,9 +37498,9 @@
},
"dependencies": {
"acorn": {
"version": "8.9.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz",
"integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==",
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"dev": true
},
"diff": {
@ -37493,9 +37598,9 @@
}
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
},
"tslib": {
@ -38283,9 +38388,9 @@
}
},
"detect-libc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"optional": true
},
"mimic-response": {
@ -39030,9 +39135,9 @@
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
}
}
},

View File

@ -1,6 +1,6 @@
{
"name": "balena-cli",
"version": "16.6.3",
"version": "16.7.5",
"description": "The official balena Command Line Interface",
"main": "./build/app.js",
"homepage": "https://github.com/balena-io/balena-cli",
@ -193,7 +193,7 @@
"typescript": "^5.1.3"
},
"dependencies": {
"@balena/compose": "^2.2.1",
"@balena/compose": "^3.0.2",
"@balena/dockerignore": "^1.0.2",
"@balena/es-version": "^1.0.1",
"@oclif/command": "^1.8.16",
@ -207,7 +207,7 @@
"balena-image-fs": "^7.0.6",
"balena-image-manager": "^9.0.0",
"balena-preload": "^14.0.0",
"balena-sdk": "^17.0.0",
"balena-sdk": "^17.8.0",
"balena-semver": "^2.3.0",
"balena-settings-client": "^5.0.2",
"balena-settings-storage": "^7.0.0",
@ -284,6 +284,6 @@
"windosu": "^0.3.0"
},
"versionist": {
"publishedAt": "2023-06-30T17:07:33.152Z"
"publishedAt": "2023-07-21T06:59:21.487Z"
}
}

7
typings/global.d.ts vendored
View File

@ -1,8 +1,11 @@
import { Application, DeviceType, Device } from 'balena-sdk';
declare global {
type ApplicationWithDeviceType = Application & {
is_for__device_type: [DeviceType];
type ApplicationWithDeviceTypeSlug = Omit<
Application,
'is_for__device_type'
> & {
is_for__device_type: [Pick<DeviceType, 'slug'>];
};
type DeviceWithDeviceType = Device & {
is_of__device_type: [DeviceType];