mirror of
https://github.com/balena-io/balena-cli.git
synced 2025-06-25 02:47:55 +00:00
Compare commits
26 Commits
developmen
...
droplet-cr
Author | SHA1 | Date | |
---|---|---|---|
08653aeee2 | |||
bb011ff1b9 | |||
4cd8af904e | |||
19b6d194ea | |||
bb4c2b1f82 | |||
2a8bd18e9b | |||
6265e03d80 | |||
03d59f9e2b | |||
cd7014b293 | |||
9a562ce1f4 | |||
6890e9c5b4 | |||
cb0336d1de | |||
dcbba23d80 | |||
e10a974a9f | |||
f635f648da | |||
3d4e2cf823 | |||
ef3b630887 | |||
19040ccb6c | |||
8e712ac910 | |||
c401ed35ac | |||
94be97313b | |||
48053ecefc | |||
cc60e86507 | |||
bd774e8553 | |||
c493c33e38 | |||
112a7b8194 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -34,3 +34,5 @@
|
||||
/package-lock.json
|
||||
/resinrc.yml
|
||||
/tmp/
|
||||
|
||||
config.json
|
||||
|
@ -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
|
||||
|
30
CHANGELOG.md
30
CHANGELOG.md
@ -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]
|
||||
|
@ -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/).
|
||||
|
@ -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/).
|
||||
|
@ -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;
|
||||
}
|
||||
|
60
lib/commands/instance/index.ts
Normal file
60
lib/commands/instance/index.ts
Normal 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() {
|
||||
|
||||
}
|
||||
}
|
259
lib/commands/instance/init.ts
Normal file
259
lib/commands/instance/init.ts
Normal 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!')
|
||||
|
||||
}
|
||||
}
|
@ -232,5 +232,6 @@ See: https://git.io/JRHUW#deprecation-policy`,
|
||||
'join',
|
||||
'leave',
|
||||
'scan',
|
||||
'instance',
|
||||
];
|
||||
}
|
||||
|
@ -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
70
npm-shrinkwrap.json
generated
@ -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",
|
||||
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -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',
|
||||
];
|
||||
|
||||
|
Reference in New Issue
Block a user