Compare commits

...

26 Commits

Author SHA1 Message Date
08653aeee2 Add waiting for created droplets and throw error if error on creation 2021-10-26 12:29:04 -07:00
bb011ff1b9 Clean up logging and add spinner
Signed-off-by: Kyle Harding <kyle@balena.io>
2021-10-26 12:29:03 -07:00
4cd8af904e Add multiple nodes 2021-10-26 12:29:03 -07:00
19b6d194ea Add provider argument 2021-10-26 12:29:03 -07:00
bb4c2b1f82 Working name generation 2021-10-26 12:29:03 -07:00
2a8bd18e9b Make image deduplication by name work 2021-10-26 12:29:03 -07:00
6265e03d80 Add more flags 2021-10-26 12:29:03 -07:00
03d59f9e2b git ignore 2021-10-26 12:29:03 -07:00
cd7014b293 Add random droplet id, region and size flag options 2021-10-26 12:29:03 -07:00
9a562ce1f4 fix verything it works 2021-10-26 12:29:03 -07:00
6890e9c5b4 fix creation 2021-10-26 12:29:02 -07:00
cb0336d1de fix variable 2021-10-26 12:29:02 -07:00
dcbba23d80 remove import 2021-10-26 12:29:02 -07:00
e10a974a9f Initial version of command 2021-10-26 12:29:02 -07:00
f635f648da v12.51.1 2021-10-25 20:54:12 +03:00
3d4e2cf823 Merge pull request #2256 from balena-io/forum-link
Fix forums support link in README.md
2021-10-25 17:52:15 +00:00
ef3b630887 v12.51.0 2021-10-22 22:13:44 +03:00
19040ccb6c Merge pull request #2367 from balena-io/support-for-fragments
Add support for YAML anchors and aliases in 'docker-compose.yml'
2021-10-22 19:11:47 +00:00
8e712ac910 Add support for YAML anchors and aliases in 'docker-compose.yml'
This allows project files to define services from generic fragments by leveraging YAML's anchors and aliases. See here for an example: 43f6537b2c/spec.md (fragments)

Removing the FAILSAFE_SCHEMA flag is not expected to break existing project files, since the default behaviour is more liberal, or cause problems down the road given we perform validation immediately after. Docs for the flag: https://github.com/nodeca/js-yaml#load-string---options-

Change-type: minor
2021-10-22 16:42:29 +03:00
c401ed35ac v12.50.3 2021-10-20 19:33:37 +03:00
94be97313b Merge pull request #2359 from balena-io/klutchell/preload-11
preload: Avoid possible ValueError when parsing storage driver
2021-10-20 16:31:34 +00:00
48053ecefc preload: Avoid possible ValueError when parsing storage driver
Update balena-preload from 10.5.0 to 11.0.0

Change-type: patch
Signed-off-by: Kyle Harding <kyle@balena.io>
2021-10-15 09:44:27 -04:00
cc60e86507 v12.50.2 2021-10-05 13:32:02 +03:00
bd774e8553 Merge pull request #2357 from balena-io/fix-fleet-rename-error-message
Error message when renaming a fleet now mentions the target name.
2021-10-05 10:27:51 +00:00
c493c33e38 Error message when renaming a fleet now mentions the target name.
Change-type: patch
Signed-off-by: Carlo Miguel F. Cruz <carloc@balena.io>
2021-10-05 17:01:07 +08:00
112a7b8194 Fix forums support link in README.md
Change-type: patch
Signed-off-by: Scott Lowe <scott@balena.io>
2021-04-21 06:57:28 +00:00
14 changed files with 541 additions and 41 deletions

2
.gitignore vendored
View File

@ -34,3 +34,5 @@
/package-lock.json
/resinrc.yml
/tmp/
config.json

View File

@ -1,3 +1,143 @@
- commits:
- subject: Fix forums support link in README.md
hash: 112a7b8194d098e9c66754eb256590e13f54fe29
body: ''
footer:
Change-type: patch
change-type: patch
Signed-off-by: Scott Lowe <scott@balena.io>
signed-off-by: Scott Lowe <scott@balena.io>
author: Scott Lowe
nested: []
version: 12.51.1
date: 2021-10-25T17:29:36.975Z
- commits:
- subject: Add support for YAML anchors and aliases in 'docker-compose.yml'
hash: 8e712ac91055c4efde885854488000a27c6b483d
body: >
This allows project files to define services from generic fragments by
leveraging YAML's anchors and aliases. See here for an example:
https://github.com/compose-spec/compose-spec/blob/43f6537b2c8f01b6d3f0e184d13a0f3cb93d38d7/spec.md#fragments
Removing the FAILSAFE_SCHEMA flag is not expected to break existing
project files, since the default behaviour is more liberal, or cause
problems down the road given we perform validation immediately after.
Docs for the flag:
https://github.com/nodeca/js-yaml#load-string---options-
footer:
Change-type: minor
change-type: minor
author: dfunckt
nested: []
version: 12.51.0
date: 2021-10-22T16:50:50.004Z
- commits:
- subject: 'preload: Avoid possible ValueError when parsing storage driver'
hash: 48053ecefc00e451f3ee5c9b82b2b398978ec229
body: |
Update balena-preload from 10.5.0 to 11.0.0
footer:
Change-type: patch
change-type: patch
Signed-off-by: Kyle Harding <kyle@balena.io>
signed-off-by: Kyle Harding <kyle@balena.io>
author: Kyle Harding
nested:
- commits:
- subject: Avoid creating multiple preload containers
hash: 6b5b6428833ce2cd5c53c2051d6f515f1b3e4c37
body: |
This was only caught when we started correctly naming
the preload container by switching from `Name` to `name` in
our createContainer options.
Previously we were creating two containers but they had unique
random names so we never saw the conflict.
footer:
Change-type: patch
change-type: patch
Signed-off-by: Kyle Harding <kyle@balena.io>
signed-off-by: Kyle Harding <kyle@balena.io>
author: Kyle Harding
nested: []
- subject: 'major: Remove balena-preload script in favor of use with CLI'
hash: 7de06434155913b199024683e62c85e94f1d1cb1
body: ''
footer:
Signed-off-by: >-
Lorenzo Alberto Maria Ambrosi
<lorenzothunder.ambrosi@gmail.com>
signed-off-by: >-
Lorenzo Alberto Maria Ambrosi
<lorenzothunder.ambrosi@gmail.com>
author: Lorenzo Alberto Maria Ambrosi
nested: []
- subject: Fix missing 'await' for getEdisonPartitions()
hash: 9a2ebfdb2a5375304ee5cf2ba6321b93f93886ed
body: ''
footer:
Change-type: patch
change-type: patch
author: Paulo Castro
nested: []
- subject: Add extra type information (refactor bind mount array)
hash: 5b8d21e68d9da902f7304a210cb1abe22420d1d0
body: ''
footer:
Change-type: patch
change-type: patch
author: Paulo Castro
nested: []
- subject: Run linter
hash: 456c727e6518317588b31e28ffb734377fb85e76
body: ''
footer:
Change-type: patch
change-type: patch
author: Paulo Castro
nested: []
- subject: 'major: Convert to typescript'
hash: ce241be0a780bdff87f4513e4d5a0ec63d72ac7e
body: ''
footer:
Signed-off-by: >-
Lorenzo Alberto Maria Ambrosi
<lorenzothunder.ambrosi@gmail.com>
signed-off-by: >-
Lorenzo Alberto Maria Ambrosi
<lorenzothunder.ambrosi@gmail.com>
author: Lorenzo Alberto Maria Ambrosi
nested: []
- subject: 'patch: Fix incorrect python List index check'
hash: 85d404000ac6e9b4ac83ce1feed33789deca182b
body: ''
footer:
Signed-off-by: >-
Lorenzo Alberto Maria Ambrosi
<lorenzothunder.ambrosi@gmail.com>
signed-off-by: >-
Lorenzo Alberto Maria Ambrosi
<lorenzothunder.ambrosi@gmail.com>
author: Lorenzo Alberto Maria Ambrosi
nested: []
version: balena-preload-11.0.0
date: 2021-10-13T18:20:43.867Z
version: 12.50.3
date: 2021-10-20T15:30:14.694Z
- commits:
- subject: Error message when renaming a fleet now mentions the target name.
hash: c493c33e3896784ee60c9d4ac79721ca6b96a778
body: ''
footer:
Change-type: patch
change-type: patch
Signed-off-by: Carlo Miguel F. Cruz <carloc@balena.io>
signed-off-by: Carlo Miguel F. Cruz <carloc@balena.io>
author: Carlo Miguel F. Cruz
nested: []
version: 12.50.2
date: 2021-10-05T09:04:40.995Z
- commits:
- subject: Update dependencies (@sentry/node error reporting)
hash: 08dfc945f3ed1c518a7d1830a5a37d72fd5739fd

View File

@ -4,6 +4,36 @@ 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/).
## 12.51.1 - 2021-10-25
* Fix forums support link in README.md [Scott Lowe]
## 12.51.0 - 2021-10-22
* Add support for YAML anchors and aliases in 'docker-compose.yml' [dfunckt]
## 12.50.3 - 2021-10-20
<details>
<summary> preload: Avoid possible ValueError when parsing storage driver [Kyle Harding] </summary>
> ### balena-preload-11.0.0 - 2021-10-13
>
> * Avoid creating multiple preload containers [Kyle Harding]
> * major: Remove balena-preload script in favor of use with CLI [Lorenzo Alberto Maria Ambrosi]
> * Fix missing 'await' for getEdisonPartitions() [Paulo Castro]
> * Add extra type information (refactor bind mount array) [Paulo Castro]
> * Run linter [Paulo Castro]
> * major: Convert to typescript [Lorenzo Alberto Maria Ambrosi]
> * patch: Fix incorrect python List index check [Lorenzo Alberto Maria Ambrosi]
>
</details>
## 12.50.2 - 2021-10-05
* Error message when renaming a fleet now mentions the target name. [Carlo Miguel F. Cruz]
## 12.50.1 - 2021-09-30
* Update dependencies (@sentry/node error reporting) [Paulo Castro]

View File

@ -144,7 +144,7 @@ To learn more, troubleshoot issues, or to contact us for support:
* Check the [masterclass tutorials](https://www.balena.io/docs/learn/more/masterclasses/overview/)
* Check our [FAQ / troubleshooting document](https://github.com/balena-io/balena-cli/blob/master/TROUBLESHOOTING.md)
* Ask us a question through the [balenaCloud forum](https://forums.balena.io/c/balena-cloud)
* Ask us a question in the [balena forums](https://forums.balena.io/c/product-support)
For CLI bug reports or feature requests, check the
[CLI GitHub issues](https://github.com/balena-io/balena-cli/issues/).

View File

@ -132,7 +132,7 @@ To learn more, troubleshoot issues, or to contact us for support:
* Check the [masterclass tutorials](https://www.balena.io/docs/learn/more/masterclasses/overview/)
* Check our [FAQ / troubleshooting document](https://github.com/balena-io/balena-cli/blob/master/TROUBLESHOOTING.md)
* Ask us a question through the [balenaCloud forum](https://forums.balena.io/c/balena-cloud)
* Ask us a question in the [balena forums](https://forums.balena.io/c/product-support)
For CLI bug reports or feature requests, check the
[CLI GitHub issues](https://github.com/balena-io/balena-cli/issues/).

View File

@ -120,7 +120,7 @@ export class FleetRenameCmd extends Command {
} catch (e) {
// BalenaRequestError: Request error: "organization" and "app_name" must be unique.
if ((e.message || '').toLowerCase().includes('unique')) {
throw new ExpectedError(`Error: fleet ${params.fleet} already exists.`);
throw new ExpectedError(`Error: fleet ${newName} already exists.`);
}
throw e;
}

View File

@ -0,0 +1,60 @@
/**
* @license
* Copyright 2016-2020 Balena Ltd.
*
* 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 { flags } from '@oclif/command';
import { IArg } from '@oclif/parser/lib/args';
import Command from '../../command';
import * as cf from '../../utils/common-flags';
import { stripIndent } from '../../utils/lazy';
interface FlagsDef {
help: void;
v13: boolean;
}
export default class InstanceCmd extends Command {
public static args: Array<IArg<any>> = [
{
name: 'provider',
description: 'the cloud provider',
required: true,
},
];
public static description = stripIndent`
Initialize a new cloud instance running balenaOS
A config.json must first be generated using the 'balena config generate' command
`;
public static examples = ['$ balena instance init digitalocean'];
public static usage = 'instance [COMMAND]';
public static flags: flags.Input<FlagsDef> = {
help: cf.help,
v13: cf.v13,
};
public static authenticated = true;
public static primary = true;
public async run() {
}
}

View File

@ -0,0 +1,259 @@
/**
* @license
* Copyright 2016-2020 Balena Ltd.
*
* 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 { IArg } from '@oclif/parser/lib/args';
import Command from '../../command';
import { stripIndent, getVisuals } from '../../utils/lazy';
import {
applicationIdInfo,
} from '../../utils/messages';
import * as fs from 'fs'
import * as fetch from 'isomorphic-fetch'
import * as cf from '../../utils/common-flags';
import { flags } from '@oclif/command';
import { uniqueNamesGenerator, adjectives, colors, animals } from 'unique-names-generator'
function randomName() {
return uniqueNamesGenerator({
dictionaries: [adjectives, colors, animals],
separator: '-'
})
}
interface FlagsDef {
help: void;
v13: boolean;
apiKey?: string;
region?: string;
size?: string;
imageName?: string;
num?: number;
}
export default class InstanceInitCmd extends Command {
public static description = stripIndent`
Initialize a new balenaOS device in the cloud.
This will upload a balenaOS image to your specific cloud provider (if it does not already exist), create a new cloud instance, and join it to the fleet with the provided config.json
Note: depending on the instance size this can take 5-15 minutes after image upload
${applicationIdInfo.split('\n').join('\n\t\t')}
`;
public static examples = [
'$ balena instance init digitalocean config.json --apiKey <api key>',
];
public static usage = 'instance init <provider> <config.json path>';
public static args: Array<IArg<any>> = [
{
name: 'provider',
description: 'the cloud provider: do | digitalocean | aws | gcp',
required: true,
},
{
name: 'configFile',
description: 'the config.json file path',
required: true,
},
];
public static flags: flags.Input<FlagsDef> = {
help: cf.help,
v13: cf.v13,
apiKey: flags.string({
description: 'DigitalOcean api key',
}),
region: flags.string({
description: 'DigitalOcean region',
}),
size: flags.string({
description: 'DigitalOcean droplet size',
}),
num: flags.integer({
description: 'Number of instances to create',
}),
imageName: flags.string({
description: 'custom image name',
})
};
public static authenticated = true;
public async run() {
const { args: params, flags: options } = this.parse<FlagsDef, { configFile: string, provider: string }>(InstanceInitCmd);
if (!['do', 'digitalocean'].includes(params.provider)) {
console.error('Only DigitalOcean is supported as a provider, please use "do" or "digitalocean" as your provider positional argument.')
return
}
// Check if the config file exists
console.log('Reading config file')
const exists = fs.existsSync(params.configFile)
if (!exists) {
console.log('Config file does not exist, exiting...')
return
}
const configFile = JSON.parse(fs.readFileSync(params.configFile).toString())
const imageName = options.imageName || 'balenaOS-qemux86-64'
let skipUpload = false
let imageID = 0
let page = 1
let res
let responseBody
let images = []
const num = options.num || 1
console.log(`Checking if image '${imageName}' already exists...`)
do {
res = await fetch(`https://api.digitalocean.com/v2/images?per_page=200&page=${page}`, {
headers: {
authorization: `Bearer ${options.apiKey}`
}
})
responseBody = await res.json()
for (const image of responseBody.images) {
if (image.name === imageName) {
console.log('Image exists, skipping upload.')
skipUpload = true
imageID = image.id
break
}
}
page++
images = responseBody.images
} while (images.length === 200)
if (!skipUpload) {
if (!options.apiKey) {
console.log('DigitalOcean API key is required, please provide with --apiKey <api_key>')
}
console.log('Uploading image to DigitalOcean...')
res = await fetch('https://api.digitalocean.com/v2/images', {
method: 'POST',
headers: {
'content-type': 'application/json',
authorization: `Bearer ${options.apiKey}`
},
body: JSON.stringify({
name: imageName,
url: `https://api.balena-cloud.com/download?fileType=.gz&appId=1833771&deviceType=qemux86-64`,
distribution: 'Unknown',
region: options.region || 'nyc1',
description: 'balenaOS custom image',
tags: [
'balenaOS'
]
})
})
console.log('Image uploaded.')
const visuals = getVisuals();
const spinner = new visuals.Spinner(
`Waiting for image to be ready`,
);
responseBody = await res.json()
imageID = responseBody.image.id
spinner.start();
do {
// console.log('Waiting for image to be ready...')
await new Promise((r) => setTimeout(() => r(null), 2000)) // Sleep for 2 seconds
res = await fetch(`https://api.digitalocean.com/v2/images/${imageID}`, {
headers: {
authorization: `Bearer ${options.apiKey}`
}
})
responseBody = await res.json()
} while (responseBody.image.status !== 'available')
// console.log('Image available.')
spinner.stop();
}
console.log('Getting DigitalOcean SSH keys...')
res = await fetch('https://api.digitalocean.com/v2/account/keys', {
headers: {
authorization: `Bearer ${options.apiKey}`
}
})
responseBody = await res.json()
const sshKeyID = responseBody.ssh_keys[0].id
const dropletNames = []
for (let i = 0; i < num; i++) {
dropletNames.push(randomName())
}
console.log('Creating DigitalOcean droplets:', dropletNames.join(', '))
res = await fetch('https://api.digitalocean.com/v2/droplets', {
method: 'POST',
body: JSON.stringify({
names: dropletNames,
region: options.region || 'nyc1',
size: options.size || 's-2vcpu-4gb',
image: imageID,
ssh_keys: [sshKeyID],
user_data: JSON.stringify(configFile),
tags: [
'balenaOS'
]
}),
headers: {
authorization: `Bearer ${options.apiKey}`,
'content-type': 'application/json'
}
})
responseBody = await res.json()
const visuals = getVisuals();
const spinner = new visuals.Spinner(
`Waiting for droplets to be created`,
);
spinner.start();
// God tier code incoming
await Promise.all(responseBody.links.actions.map(async (action: any) => {
let respBody: any
do {
await new Promise((r) => setTimeout(() => r(null), 2000)) // Sleep for 2 seconds
const waitResp = await fetch(action.href, {
headers: {
authorization: `Bearer ${options.apiKey}`
}
})
respBody = await waitResp.json()
if (respBody.action.status === 'errored') {
throw new Error('Error creating droplet')
}
} while (respBody.action.status !== 'completed')
}))
spinner.stop();
console.log('Done! The device should appear in your Dashboard in a few minutes!')
}
}

View File

@ -232,5 +232,6 @@ See: https://git.io/JRHUW#deprecation-policy`,
'join',
'leave',
'scan',
'instance',
];
}

View File

@ -63,9 +63,7 @@ export function createProject(
const compose = require('resin-compose-parse');
// both methods below may throw.
const rawComposition = yml.load(composeStr, {
schema: yml.FAILSAFE_SCHEMA,
});
const rawComposition = yml.load(composeStr);
const composition = compose.normalize(rawComposition);
projectName ||= path.basename(composePath);

70
npm-shrinkwrap.json generated
View File

@ -1,6 +1,6 @@
{
"name": "balena-cli",
"version": "12.50.1",
"version": "12.51.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -2583,6 +2583,12 @@
"is-root": "*"
}
},
"@types/isomorphic-fetch": {
"version": "0.0.35",
"resolved": "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz",
"integrity": "sha512-DaZNUvLDCAnCTjgwxgiL1eQdxIKEpNLOlTNtAgnZc50bG2copGhRrFN9/PxPBuJe+tZVLCbQ7ls0xveXVRPkvw==",
"dev": true
},
"@types/js-yaml": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz",
@ -3814,9 +3820,9 @@
}
},
"balena-preload": {
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/balena-preload/-/balena-preload-10.5.0.tgz",
"integrity": "sha512-tgnTyOSOLB3HxIqlR1NFrTsy1eiiew5Vzmplb82/eZc/vJTrOqal2tFNn6aFay6UQ8+OASUJwANC99zBu1e8mQ==",
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/balena-preload/-/balena-preload-11.0.0.tgz",
"integrity": "sha512-2LuPTw6LoVxuasGhn+cLyA5n7kjvwBtQmBsg08KNhcbEpWLkzrV5jhpNxlMPUuoC2xcMv5Rcg6FWbY87QV5zYQ==",
"requires": {
"archiver": "^3.1.1",
"balena-sdk": "^15.44.0",
@ -3828,6 +3834,7 @@
"get-port": "^3.2.0",
"lodash": "^4.17.21",
"node-cleanup": "^2.1.2",
"request": "^2.88.2",
"request-promise": "^4.2.6",
"resin-cli-visuals": "^1.8.0",
"tar-fs": "^2.1.1",
@ -3885,11 +3892,6 @@
"readable-stream": "^3.4.0"
}
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@ -3900,14 +3902,6 @@
"util-deprecate": "^1.0.1"
}
},
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"requires": {
"lru-cache": "^6.0.0"
}
},
"tar-fs": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
@ -3933,11 +3927,6 @@
}
}
},
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
},
"zip-stream": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz",
@ -4243,9 +4232,9 @@
"dev": true
},
"big-integer": {
"version": "1.6.48",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz",
"integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w=="
"version": "1.6.50",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.50.tgz",
"integrity": "sha512-+O2uoQWFRo8ysZNo/rjtri2jIwjr3XfeAgRjAUADRqGG+ZITvyn8J1kvXLTaKVr3hhGXk+f23tKfdzmklVM9vQ=="
},
"big.js": {
"version": "5.2.2",
@ -10382,6 +10371,15 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
"isomorphic-fetch": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz",
"integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==",
"requires": {
"node-fetch": "^2.6.1",
"whatwg-fetch": "^3.4.1"
}
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@ -12153,6 +12151,12 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"nanoid": {
"version": "3.1.20",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
"integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
"dev": true
},
"p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@ -12435,12 +12439,6 @@
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
"integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw=="
},
"nanoid": {
"version": "3.1.20",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
"integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
"dev": true
},
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@ -18094,6 +18092,11 @@
"set-value": "^2.0.1"
}
},
"unique-names-generator": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.6.0.tgz",
"integrity": "sha512-m0fke1emBeT96UYn2psPQYwljooDWRTKt9oUZ5vlt88ZFMBGxqwPyLHXwCfkbgdm8jzioCp7oIpo6KdM+fnUlQ=="
},
"unique-stream": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
@ -18509,6 +18512,11 @@
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz",
"integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q=="
},
"whatwg-fetch": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
"integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA=="
},
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",

View File

@ -1,6 +1,6 @@
{
"name": "balena-cli",
"version": "12.50.1",
"version": "12.51.1",
"description": "The official balena Command Line Interface",
"main": "./build/app.js",
"homepage": "https://github.com/balena-io/balena-cli",
@ -135,6 +135,7 @@
"@types/http-proxy": "^1.17.7",
"@types/intercept-stdout": "^0.1.0",
"@types/is-root": "^2.1.2",
"@types/isomorphic-fetch": "0.0.35",
"@types/js-yaml": "^4.0.2",
"@types/jsonwebtoken": "^8.5.4",
"@types/klaw": "^3.0.2",
@ -206,7 +207,7 @@
"balena-errors": "^4.7.1",
"balena-image-fs": "^7.0.6",
"balena-image-manager": "^7.0.3",
"balena-preload": "^10.5.0",
"balena-preload": "^11.0.0",
"balena-release": "^3.2.0",
"balena-sdk": "^15.51.1",
"balena-semver": "^2.3.0",
@ -244,6 +245,7 @@
"inquirer": "^7.3.3",
"is-elevated": "^3.0.0",
"is-root": "^2.1.0",
"isomorphic-fetch": "^3.0.0",
"js-yaml": "^4.0.0",
"klaw": "^3.0.0",
"livepush": "^3.5.0",
@ -281,6 +283,7 @@
"through2": "^2.0.3",
"tmp": "^0.2.1",
"typed-error": "^3.2.1",
"unique-names-generator": "^4.6.0",
"update-notifier": "^4.1.0",
"which": "^2.0.2",
"window-size": "^1.1.0"
@ -289,6 +292,6 @@
"windosu": "^0.3.0"
},
"versionist": {
"publishedAt": "2021-09-30T00:16:32.621Z"
"publishedAt": "2021-10-25T17:29:37.217Z"
}
}

0
test.json Normal file
View File

View File

@ -74,7 +74,6 @@ describe('detectEncoding() function', function () {
'node_modules/.bin/gulp',
'node_modules/.bin/tsc',
'node_modules/.bin/balena-lint',
'node_modules/.bin/balena-preload',
'node_modules/.bin/catch-uncommitted',
];