balena-cli 17.1.7 → 17.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file
4
4
  automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
5
5
  This project adheres to [Semantic Versioning](http://semver.org/).
6
6
 
7
+ ## 17.2.0 - 2023-10-20
8
+
9
+ * release: Add '--json' option for JSON output [Brian Bugh]
10
+
7
11
  ## 17.1.7 - 2023-10-20
8
12
 
9
13
  * tag set: Fix using empty string as a value [Thodoris Greasidis]
@@ -1,13 +1,16 @@
1
+ import { type Interfaces } from '@oclif/core';
1
2
  import Command from '../../command';
2
3
  import type * as BalenaSdk from 'balena-sdk';
3
4
  export declare const commitOrIdArg: import("@oclif/core/lib/interfaces/parser").ArgDefinition<string | number, Record<string, unknown>>;
5
+ type FlagsDef = Interfaces.InferredFlags<typeof ReleaseCmd.flags>;
4
6
  export default class ReleaseCmd extends Command {
5
7
  static description: string;
6
8
  static examples: string[];
7
9
  static usage: string;
8
10
  static flags: {
9
- help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
10
- composition: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ json: Interfaces.BooleanFlag<boolean>;
12
+ help: Interfaces.BooleanFlag<void>;
13
+ composition: Interfaces.BooleanFlag<boolean>;
11
14
  };
12
15
  static args: {
13
16
  commitOrId: import("@oclif/core/lib/interfaces/parser").Arg<string | number, Record<string, unknown>>;
@@ -15,5 +18,6 @@ export default class ReleaseCmd extends Command {
15
18
  static authenticated: boolean;
16
19
  run(): Promise<void>;
17
20
  showComposition(commitOrId: string | number, balena: BalenaSdk.BalenaSDK): Promise<void>;
18
- showReleaseInfo(commitOrId: string | number, balena: BalenaSdk.BalenaSDK): Promise<void>;
21
+ showReleaseInfo(commitOrId: string | number, balena: BalenaSdk.BalenaSDK, options: FlagsDef): Promise<void>;
19
22
  }
23
+ export {};
@@ -7,6 +7,7 @@ const cf = require("../../utils/common-flags");
7
7
  const lazy_1 = require("../../utils/lazy");
8
8
  const jsyaml = require("js-yaml");
9
9
  const validation_1 = require("../../utils/validation");
10
+ const messages_1 = require("../../utils/messages");
10
11
  exports.commitOrIdArg = core_1.Args.custom({
11
12
  parse: async (commitOrId) => (0, validation_1.tryAsInteger)(commitOrId),
12
13
  });
@@ -18,7 +19,7 @@ class ReleaseCmd extends command_1.default {
18
19
  await this.showComposition(params.commitOrId, balena);
19
20
  }
20
21
  else {
21
- await this.showReleaseInfo(params.commitOrId, balena);
22
+ await this.showReleaseInfo(params.commitOrId, balena, options);
22
23
  }
23
24
  }
24
25
  async showComposition(commitOrId, balena) {
@@ -27,7 +28,7 @@ class ReleaseCmd extends command_1.default {
27
28
  });
28
29
  console.log(jsyaml.dump(release.composition));
29
30
  }
30
- async showReleaseInfo(commitOrId, balena) {
31
+ async showReleaseInfo(commitOrId, balena, options) {
31
32
  const fields = [
32
33
  'id',
33
34
  'commit',
@@ -40,31 +41,40 @@ class ReleaseCmd extends command_1.default {
40
41
  'end_timestamp',
41
42
  ];
42
43
  const release = await balena.models.release.get(commitOrId, {
43
- $select: fields,
44
+ ...(!options.json && { $select: fields }),
44
45
  $expand: {
45
46
  release_tag: {
46
47
  $select: ['tag_key', 'value'],
47
48
  },
48
49
  },
49
50
  });
50
- const tagStr = release
51
- .release_tag.map((t) => `${t.tag_key}=${t.value}`)
52
- .join('\n');
53
- const _ = await Promise.resolve().then(() => require('lodash'));
54
- const values = _.mapValues(release, (val) => val !== null && val !== void 0 ? val : 'N/a');
55
- values['tags'] = tagStr;
56
- console.log((0, lazy_1.getVisuals)().table.vertical(values, [...fields, 'tags']));
51
+ if (options.json) {
52
+ console.log(JSON.stringify(release, null, 4));
53
+ }
54
+ else {
55
+ const tagStr = release
56
+ .release_tag.map((t) => `${t.tag_key}=${t.value}`)
57
+ .join('\n');
58
+ const _ = await Promise.resolve().then(() => require('lodash'));
59
+ const values = _.mapValues(release, (val) => val !== null && val !== void 0 ? val : 'N/a');
60
+ values['tags'] = tagStr;
61
+ console.log((0, lazy_1.getVisuals)().table.vertical(values, [...fields, 'tags']));
62
+ }
57
63
  }
58
64
  }
59
65
  ReleaseCmd.description = (0, lazy_1.stripIndent) `
60
66
  Get info for a release.
67
+
68
+ ${messages_1.jsonInfo.split('\n').join('\n\t\t')}
61
69
  `;
62
70
  ReleaseCmd.examples = [
63
71
  '$ balena release a777f7345fe3d655c1c981aa642e5555',
64
72
  '$ balena release 1234567',
73
+ '$ balena release d3f3151f5ad25ca6b070aa4d08296aca --json',
65
74
  ];
66
75
  ReleaseCmd.usage = 'release <commitOrId>';
67
76
  ReleaseCmd.flags = {
77
+ json: cf.json,
68
78
  help: cf.help,
69
79
  composition: core_1.Flags.boolean({
70
80
  default: false,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/commands/release/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/commands/release/index.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export default class ReleasesCmd extends Command {
4
4
  static examples: string[];
5
5
  static usage: string;
6
6
  static flags: {
7
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
7
8
  help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
8
9
  };
9
10
  static args: {
@@ -5,9 +5,10 @@ const command_1 = require("../command");
5
5
  const cf = require("../utils/common-flags");
6
6
  const lazy_1 = require("../utils/lazy");
7
7
  const messages_1 = require("../utils/messages");
8
+ const messages_2 = require("../utils/messages");
8
9
  class ReleasesCmd extends command_1.default {
9
10
  async run() {
10
- const { args: params } = await this.parse(ReleasesCmd);
11
+ const { args: params, flags: options } = await this.parse(ReleasesCmd);
11
12
  const fields = [
12
13
  'id',
13
14
  'commit',
@@ -18,9 +19,22 @@ class ReleasesCmd extends command_1.default {
18
19
  ];
19
20
  const balena = (0, lazy_1.getBalenaSdk)();
20
21
  const { getFleetSlug } = await Promise.resolve().then(() => require('../utils/sdk'));
21
- const releases = await balena.models.release.getAllByApplication(await getFleetSlug(balena, params.fleet), { $select: fields });
22
- const _ = await Promise.resolve().then(() => require('lodash'));
23
- console.log((0, lazy_1.getVisuals)().table.horizontal(releases.map((rel) => _.mapValues(rel, (val) => val !== null && val !== void 0 ? val : 'N/a')), fields));
22
+ const releases = await balena.models.release.getAllByApplication(await getFleetSlug(balena, params.fleet), options.json
23
+ ? {
24
+ $expand: {
25
+ release_tag: {
26
+ $select: ['tag_key', 'value'],
27
+ },
28
+ },
29
+ }
30
+ : { $select: fields });
31
+ if (options.json) {
32
+ console.log(JSON.stringify(releases, null, 4));
33
+ }
34
+ else {
35
+ const _ = await Promise.resolve().then(() => require('lodash'));
36
+ console.log((0, lazy_1.getVisuals)().table.horizontal(releases.map((rel) => _.mapValues(rel, (val) => val !== null && val !== void 0 ? val : 'N/a')), fields));
37
+ }
24
38
  }
25
39
  }
26
40
  ReleasesCmd.description = (0, lazy_1.stripIndent) `
@@ -29,10 +43,16 @@ ReleasesCmd.description = (0, lazy_1.stripIndent) `
29
43
  List all releases of the given fleet.
30
44
 
31
45
  ${messages_1.applicationNameNote.split('\n').join('\n\t\t')}
46
+
47
+ ${messages_2.jsonInfo.split('\n').join('\n\t\t')}
32
48
  `;
33
- ReleasesCmd.examples = ['$ balena releases myorg/myfleet'];
49
+ ReleasesCmd.examples = [
50
+ '$ balena releases myorg/myfleet',
51
+ '$ balena releases myorg/myfleet --json',
52
+ ];
34
53
  ReleasesCmd.usage = 'releases <fleet>';
35
54
  ReleasesCmd.flags = {
55
+ json: cf.json,
36
56
  help: cf.help,
37
57
  };
38
58
  ReleasesCmd.args = {
@@ -1 +1 @@
1
- {"version":3,"file":"releases.js","sourceRoot":"","sources":["../../lib/commands/releases.ts"],"names":[],"mappings":";;AAiBA,sCAAmC;AACnC,wCAAiC;AACjC,4CAA4C;AAC5C,wCAAsE;AACtE,gDAAwD;AAGxD,MAAqB,WAAY,SAAQ,iBAAO;IAyBxC,KAAK,CAAC,GAAG;QACf,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAmC;YAC9C,IAAI;YACJ,QAAQ;YACR,YAAY;YACZ,QAAQ;YACR,QAAQ;YACR,UAAU;SACV,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,mBAAY,GAAE,CAAC;QAC9B,MAAM,EAAE,YAAY,EAAE,GAAG,2CAAa,cAAc,EAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAC/D,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EACxC,EAAE,OAAO,EAAE,MAAM,EAAE,CACnB,CAAC;QAEF,MAAM,CAAC,GAAG,2CAAa,QAAQ,EAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CACV,IAAA,iBAAU,GAAE,CAAC,KAAK,CAAC,UAAU,CAC5B,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,KAAK,CAAC,CAAC,EAC9D,MAAM,CACN,CACD,CAAC;IACH,CAAC;;AAnDa,uBAAW,GAAG,IAAA,kBAAW,EAAA;;;;;IAKpC,8BAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;CACjD,CAAC;AACa,oBAAQ,GAAG,CAAC,iCAAiC,CAAC,CAAC;AAE/C,iBAAK,GAAG,kBAAkB,CAAC;AAE3B,iBAAK,GAAG;IACrB,IAAI,EAAE,EAAE,CAAC,IAAI;CACb,CAAC;AAEY,gBAAI,GAAG;IACpB,KAAK,EAAE,WAAI,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,IAAI;KACd,CAAC;CACF,CAAC;AAEY,yBAAa,GAAG,IAAI,CAAC;kBAvBf,WAAW"}
1
+ {"version":3,"file":"releases.js","sourceRoot":"","sources":["../../lib/commands/releases.ts"],"names":[],"mappings":";;AAiBA,sCAAmC;AACnC,wCAAiC;AACjC,4CAA4C;AAC5C,wCAAsE;AACtE,gDAAwD;AAExD,gDAA6C;AAE7C,MAAqB,WAAY,SAAQ,iBAAO;IA+BxC,KAAK,CAAC,GAAG;QACf,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAmC;YAC9C,IAAI;YACJ,QAAQ;YACR,YAAY;YACZ,QAAQ;YACR,QAAQ;YACR,UAAU;SACV,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,mBAAY,GAAE,CAAC;QAC9B,MAAM,EAAE,YAAY,EAAE,GAAG,2CAAa,cAAc,EAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAC/D,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EACxC,OAAO,CAAC,IAAI;YACX,CAAC,CAAC;gBACA,OAAO,EAAE;oBACR,WAAW,EAAE;wBACZ,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;qBAC7B;iBACD;aACA;YACH,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CACtB,CAAC;QAEF,IAAI,OAAO,CAAC,IAAI,EAAE;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/C;aAAM;YACN,MAAM,CAAC,GAAG,2CAAa,QAAQ,EAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CACV,IAAA,iBAAU,GAAE,CAAC,KAAK,CAAC,UAAU,CAC5B,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,KAAK,CAAC,CAAC,EAC9D,MAAM,CACN,CACD,CAAC;SACF;IACF,CAAC;;AArEa,uBAAW,GAAG,IAAA,kBAAW,EAAA;;;;;IAKpC,8BAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAE9C,mBAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;CACtC,CAAC;AACa,oBAAQ,GAAG;IACxB,iCAAiC;IACjC,wCAAwC;CACxC,CAAC;AAEY,iBAAK,GAAG,kBAAkB,CAAC;AAE3B,iBAAK,GAAG;IACrB,IAAI,EAAE,EAAE,CAAC,IAAI;IACb,IAAI,EAAE,EAAE,CAAC,IAAI;CACb,CAAC;AAEY,gBAAI,GAAG;IACpB,KAAK,EAAE,WAAI,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,IAAI;KACd,CAAC;CACF,CAAC;AAEY,yBAAa,GAAG,IAAI,CAAC;kBA7Bf,WAAW"}
@@ -15,30 +15,37 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import { Flags, Args } from '@oclif/core';
18
+ import { Flags, Args, type Interfaces } from '@oclif/core';
19
19
  import Command from '../../command';
20
20
  import * as cf from '../../utils/common-flags';
21
21
  import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
22
22
  import type * as BalenaSdk from 'balena-sdk';
23
23
  import jsyaml = require('js-yaml');
24
24
  import { tryAsInteger } from '../../utils/validation';
25
+ import { jsonInfo } from '../../utils/messages';
25
26
 
26
27
  export const commitOrIdArg = Args.custom({
27
28
  parse: async (commitOrId: string) => tryAsInteger(commitOrId),
28
29
  });
29
30
 
31
+ type FlagsDef = Interfaces.InferredFlags<typeof ReleaseCmd.flags>;
32
+
30
33
  export default class ReleaseCmd extends Command {
31
34
  public static description = stripIndent`
32
35
  Get info for a release.
36
+
37
+ ${jsonInfo.split('\n').join('\n\t\t')}
33
38
  `;
34
39
  public static examples = [
35
40
  '$ balena release a777f7345fe3d655c1c981aa642e5555',
36
41
  '$ balena release 1234567',
42
+ '$ balena release d3f3151f5ad25ca6b070aa4d08296aca --json',
37
43
  ];
38
44
 
39
45
  public static usage = 'release <commitOrId>';
40
46
 
41
47
  public static flags = {
48
+ json: cf.json,
42
49
  help: cf.help,
43
50
  composition: Flags.boolean({
44
51
  default: false,
@@ -63,7 +70,7 @@ export default class ReleaseCmd extends Command {
63
70
  if (options.composition) {
64
71
  await this.showComposition(params.commitOrId, balena);
65
72
  } else {
66
- await this.showReleaseInfo(params.commitOrId, balena);
73
+ await this.showReleaseInfo(params.commitOrId, balena, options);
67
74
  }
68
75
  }
69
76
 
@@ -81,6 +88,7 @@ export default class ReleaseCmd extends Command {
81
88
  async showReleaseInfo(
82
89
  commitOrId: string | number,
83
90
  balena: BalenaSdk.BalenaSDK,
91
+ options: FlagsDef,
84
92
  ) {
85
93
  const fields: Array<keyof BalenaSdk.Release> = [
86
94
  'id',
@@ -95,7 +103,7 @@ export default class ReleaseCmd extends Command {
95
103
  ];
96
104
 
97
105
  const release = await balena.models.release.get(commitOrId, {
98
- $select: fields,
106
+ ...(!options.json && { $select: fields }),
99
107
  $expand: {
100
108
  release_tag: {
101
109
  $select: ['tag_key', 'value'],
@@ -103,17 +111,21 @@ export default class ReleaseCmd extends Command {
103
111
  },
104
112
  });
105
113
 
106
- const tagStr = release
107
- .release_tag!.map((t) => `${t.tag_key}=${t.value}`)
108
- .join('\n');
109
-
110
- const _ = await import('lodash');
111
- const values = _.mapValues(
112
- release,
113
- (val) => val ?? 'N/a',
114
- ) as Dictionary<string>;
115
- values['tags'] = tagStr;
116
-
117
- console.log(getVisuals().table.vertical(values, [...fields, 'tags']));
114
+ if (options.json) {
115
+ console.log(JSON.stringify(release, null, 4));
116
+ } else {
117
+ const tagStr = release
118
+ .release_tag!.map((t) => `${t.tag_key}=${t.value}`)
119
+ .join('\n');
120
+
121
+ const _ = await import('lodash');
122
+ const values = _.mapValues(
123
+ release,
124
+ (val) => val ?? 'N/a',
125
+ ) as Dictionary<string>;
126
+ values['tags'] = tagStr;
127
+
128
+ console.log(getVisuals().table.vertical(values, [...fields, 'tags']));
129
+ }
118
130
  }
119
131
  }
@@ -21,6 +21,7 @@ import * as cf from '../utils/common-flags';
21
21
  import { getBalenaSdk, getVisuals, stripIndent } from '../utils/lazy';
22
22
  import { applicationNameNote } from '../utils/messages';
23
23
  import type * as BalenaSdk from 'balena-sdk';
24
+ import { jsonInfo } from '../utils/messages';
24
25
 
25
26
  export default class ReleasesCmd extends Command {
26
27
  public static description = stripIndent`
@@ -29,12 +30,18 @@ export default class ReleasesCmd extends Command {
29
30
  List all releases of the given fleet.
30
31
 
31
32
  ${applicationNameNote.split('\n').join('\n\t\t')}
33
+
34
+ ${jsonInfo.split('\n').join('\n\t\t')}
32
35
  `;
33
- public static examples = ['$ balena releases myorg/myfleet'];
36
+ public static examples = [
37
+ '$ balena releases myorg/myfleet',
38
+ '$ balena releases myorg/myfleet --json',
39
+ ];
34
40
 
35
41
  public static usage = 'releases <fleet>';
36
42
 
37
43
  public static flags = {
44
+ json: cf.json,
38
45
  help: cf.help,
39
46
  };
40
47
 
@@ -48,7 +55,7 @@ export default class ReleasesCmd extends Command {
48
55
  public static authenticated = true;
49
56
 
50
57
  public async run() {
51
- const { args: params } = await this.parse(ReleasesCmd);
58
+ const { args: params, flags: options } = await this.parse(ReleasesCmd);
52
59
 
53
60
  const fields: Array<keyof BalenaSdk.Release> = [
54
61
  'id',
@@ -64,15 +71,27 @@ export default class ReleasesCmd extends Command {
64
71
 
65
72
  const releases = await balena.models.release.getAllByApplication(
66
73
  await getFleetSlug(balena, params.fleet),
67
- { $select: fields },
74
+ options.json
75
+ ? {
76
+ $expand: {
77
+ release_tag: {
78
+ $select: ['tag_key', 'value'],
79
+ },
80
+ },
81
+ }
82
+ : { $select: fields },
68
83
  );
69
84
 
70
- const _ = await import('lodash');
71
- console.log(
72
- getVisuals().table.horizontal(
73
- releases.map((rel) => _.mapValues(rel, (val) => val ?? 'N/a')),
74
- fields,
75
- ),
76
- );
85
+ if (options.json) {
86
+ console.log(JSON.stringify(releases, null, 4));
87
+ } else {
88
+ const _ = await import('lodash');
89
+ console.log(
90
+ getVisuals().table.horizontal(
91
+ releases.map((rel) => _.mapValues(rel, (val) => val ?? 'N/a')),
92
+ fields,
93
+ ),
94
+ );
95
+ }
77
96
  }
78
97
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "balena-cli",
3
- "version": "17.1.7",
3
+ "version": "17.2.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "balena-cli",
9
- "version": "17.1.7",
9
+ "version": "17.2.0",
10
10
  "hasInstallScript": true,
11
11
  "license": "Apache-2.0",
12
12
  "dependencies": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "17.1.7",
2
+ "version": "17.2.0",
3
3
  "commands": {
4
4
  "build": {
5
5
  "id": "build",
@@ -1189,7 +1189,7 @@
1189
1189
  },
1190
1190
  "releases": {
1191
1191
  "id": "releases",
1192
- "description": "List all releases of a fleet.\n\nList all releases of the given fleet.\n\nFleets may be specified by fleet name or slug. Slugs are recommended because\nthey are unique and unambiguous. Slugs can be listed with the `balena fleets`\ncommand. Note that slugs may change if the fleet is renamed. Fleet names are\nnot unique and may result in \"Fleet is ambiguous\" errors at any time (even if\n\"it used to work in the past\"), for example if the name clashes with a newly\ncreated public/open fleet, or with fleets from other balena accounts that you\nmay be invited to join under any role. For this reason, fleet names are\nespecially discouraged in scripts (e.g. CI environments).",
1192
+ "description": "List all releases of a fleet.\n\nList all releases of the given fleet.\n\nFleets may be specified by fleet name or slug. Slugs are recommended because\nthey are unique and unambiguous. Slugs can be listed with the `balena fleets`\ncommand. Note that slugs may change if the fleet is renamed. Fleet names are\nnot unique and may result in \"Fleet is ambiguous\" errors at any time (even if\n\"it used to work in the past\"), for example if the name clashes with a newly\ncreated public/open fleet, or with fleets from other balena accounts that you\nmay be invited to join under any role. For this reason, fleet names are\nespecially discouraged in scripts (e.g. CI environments).\n\nThe --json option is recommended when scripting the output of this command,\nbecause field names are less likely to change in JSON format and because it\nbetter represents data types like arrays, empty strings and null values.\nThe 'jq' utility may be helpful for querying JSON fields in shell scripts\n(https://stedolan.github.io/jq/manual/).",
1193
1193
  "strict": true,
1194
1194
  "usage": "releases <fleet>",
1195
1195
  "pluginName": "balena-cli",
@@ -1197,9 +1197,17 @@
1197
1197
  "pluginType": "core",
1198
1198
  "aliases": [],
1199
1199
  "examples": [
1200
- "$ balena releases myorg/myfleet"
1200
+ "$ balena releases myorg/myfleet",
1201
+ "$ balena releases myorg/myfleet --json"
1201
1202
  ],
1202
1203
  "flags": {
1204
+ "json": {
1205
+ "name": "json",
1206
+ "type": "boolean",
1207
+ "char": "j",
1208
+ "description": "produce JSON output instead of tabular output",
1209
+ "allowNo": false
1210
+ },
1203
1211
  "help": {
1204
1212
  "name": "help",
1205
1213
  "type": "boolean",
@@ -4012,7 +4020,7 @@
4012
4020
  },
4013
4021
  "release": {
4014
4022
  "id": "release",
4015
- "description": "Get info for a release.",
4023
+ "description": "Get info for a release.\n\nThe --json option is recommended when scripting the output of this command,\nbecause field names are less likely to change in JSON format and because it\nbetter represents data types like arrays, empty strings and null values.\nThe 'jq' utility may be helpful for querying JSON fields in shell scripts\n(https://stedolan.github.io/jq/manual/).",
4016
4024
  "strict": true,
4017
4025
  "usage": "release <commitOrId>",
4018
4026
  "pluginName": "balena-cli",
@@ -4021,9 +4029,17 @@
4021
4029
  "aliases": [],
4022
4030
  "examples": [
4023
4031
  "$ balena release a777f7345fe3d655c1c981aa642e5555",
4024
- "$ balena release 1234567"
4032
+ "$ balena release 1234567",
4033
+ "$ balena release d3f3151f5ad25ca6b070aa4d08296aca --json"
4025
4034
  ],
4026
4035
  "flags": {
4036
+ "json": {
4037
+ "name": "json",
4038
+ "type": "boolean",
4039
+ "char": "j",
4040
+ "description": "produce JSON output instead of tabular output",
4041
+ "allowNo": false
4042
+ },
4027
4043
  "help": {
4028
4044
  "name": "help",
4029
4045
  "type": "boolean",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "balena-cli",
3
- "version": "17.1.7",
3
+ "version": "17.2.0",
4
4
  "description": "The official balena Command Line Interface",
5
5
  "main": "./build/app.js",
6
6
  "homepage": "https://github.com/balena-io/balena-cli",
@@ -280,6 +280,6 @@
280
280
  "windosu": "^0.3.0"
281
281
  },
282
282
  "versionist": {
283
- "publishedAt": "2023-10-20T10:12:59.637Z"
283
+ "publishedAt": "2023-10-20T12:48:36.933Z"
284
284
  }
285
285
  }