heroku 10.12.0 → 10.13.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.
@@ -81,7 +81,7 @@ class Push extends command_1.Command {
81
81
  else {
82
82
  heroku_cli_util_1.hux.styledHeader(`Pushing ${job.name} (${job.dockerfile})`);
83
83
  }
84
- await DockerHelper.pushImage(job.resource);
84
+ await DockerHelper.pushImage(job.resource, this.config.arch);
85
85
  }
86
86
  const plural = jobs.length !== 1;
87
87
  core_1.ux.log(`Your image${plural ? 's have' : ' has'} been successfully pushed. You can now release ${plural ? 'them' : 'it'} with the 'container:release' command.`);
@@ -7,6 +7,7 @@ const util_1 = require("@oclif/core/lib/util");
7
7
  const date_fns_1 = require("date-fns");
8
8
  const http_call_1 = require("@heroku/http-call");
9
9
  const util_2 = require("../lib/status/util");
10
+ const errorMessage = 'Heroku platform status is unavailable at this time. Refer to https://status.salesforce.com/products/Heroku or try again later.';
10
11
  const printStatus = (status) => {
11
12
  const colorize = color_1.default[status];
12
13
  let message = (0, util_1.capitalize)(status);
@@ -15,27 +16,162 @@ const printStatus = (status) => {
15
16
  }
16
17
  return colorize(message);
17
18
  };
19
+ const getTrustStatus = async () => {
20
+ const trustHost = process.env.SF_TRUST_STAGING ? 'https://status-api-stg.test.edgekey.net/v1' : 'https://api.status.salesforce.com/v1';
21
+ const currentDateTime = new Date(Date.now()).toISOString();
22
+ let instances = [];
23
+ let activeIncidents = [];
24
+ let maintenances = [];
25
+ let localizations = [];
26
+ try {
27
+ const [instanceResponse, activeIncidentsResponse, maintenancesResponse, localizationsResponse] = await Promise.all([
28
+ http_call_1.default.get(`${trustHost}/instances?products=Heroku`),
29
+ http_call_1.default.get(`${trustHost}/incidents/active`),
30
+ http_call_1.default.get(`${trustHost}/maintenances?startTime=${currentDateTime}&limit=10&offset=0&product=Heroku&locale=en`),
31
+ http_call_1.default.get(`${trustHost}/localizations?locale=en`),
32
+ ]);
33
+ instances = instanceResponse.body;
34
+ activeIncidents = activeIncidentsResponse.body;
35
+ maintenances = maintenancesResponse.body;
36
+ localizations = localizationsResponse.body;
37
+ }
38
+ catch (_a) {
39
+ core_1.ux.error(errorMessage, { exit: 1 });
40
+ }
41
+ return formatTrustResponse(instances, activeIncidents, maintenances, localizations);
42
+ };
43
+ const determineIncidentSeverity = (incidents) => {
44
+ const severityArray = [];
45
+ incidents.forEach(incident => {
46
+ incident.IncidentImpacts.forEach(impact => {
47
+ if (!impact.endTime && impact.severity) {
48
+ severityArray.push(impact.severity);
49
+ }
50
+ });
51
+ });
52
+ if (severityArray.includes('major'))
53
+ return 'red';
54
+ if (severityArray.includes('minor'))
55
+ return 'yellow';
56
+ return 'green';
57
+ };
58
+ const formatTrustResponse = (instances, activeIncidents, maintenances, localizations) => {
59
+ const systemStatus = [];
60
+ const incidents = [];
61
+ const scheduled = [];
62
+ const instanceKeyArray = new Set(instances.map(instance => instance.key));
63
+ const herokuActiveIncidents = activeIncidents.filter(incident => {
64
+ return incident.instanceKeys.some(key => instanceKeyArray.has(key));
65
+ });
66
+ const toolsIncidents = herokuActiveIncidents.filter(incident => {
67
+ const tools = ['TOOLS', 'Tools', 'CLI', 'Dashboard', 'Platform API'];
68
+ return tools.some(tool => incident.serviceKeys.includes(tool));
69
+ });
70
+ const appsIncidents = herokuActiveIncidents.filter(incident => {
71
+ return incident.serviceKeys.includes('HerokuApps') || incident.serviceKeys.includes('Apps');
72
+ });
73
+ const dataIncidents = herokuActiveIncidents.filter(incident => {
74
+ return incident.serviceKeys.includes('HerokuData') || incident.serviceKeys.includes('Data');
75
+ });
76
+ if (appsIncidents.length > 0) {
77
+ const severity = determineIncidentSeverity(appsIncidents);
78
+ systemStatus.push({ system: 'Apps', status: severity });
79
+ incidents.push(...appsIncidents);
80
+ }
81
+ else {
82
+ systemStatus.push({ system: 'Apps', status: 'green' });
83
+ }
84
+ if (dataIncidents.length > 0) {
85
+ const severity = determineIncidentSeverity(dataIncidents);
86
+ systemStatus.push({ system: 'Data', status: severity });
87
+ incidents.push(...dataIncidents);
88
+ }
89
+ else {
90
+ systemStatus.push({ system: 'Data', status: 'green' });
91
+ }
92
+ if (toolsIncidents.length > 0) {
93
+ const severity = determineIncidentSeverity(toolsIncidents);
94
+ systemStatus.push({ system: 'Tools', status: severity });
95
+ incidents.push(...toolsIncidents);
96
+ }
97
+ else {
98
+ systemStatus.push({ system: 'Tools', status: 'green' });
99
+ }
100
+ if (maintenances.length > 0)
101
+ scheduled.push(...maintenances);
102
+ if (incidents.length > 0) {
103
+ incidents.forEach(incident => {
104
+ incident.IncidentEvents.forEach(event => {
105
+ var _a;
106
+ event.localizedType = (_a = localizations.find((l) => l.modelKey === event.type)) === null || _a === void 0 ? void 0 : _a.text;
107
+ });
108
+ });
109
+ }
110
+ return {
111
+ status: systemStatus,
112
+ incidents,
113
+ scheduled,
114
+ };
115
+ };
18
116
  class Status extends core_1.Command {
19
117
  async run() {
118
+ var _a;
20
119
  const { flags } = await this.parse(Status);
21
- const apiPath = '/api/v4/current-status';
22
- const host = process.env.HEROKU_STATUS_HOST || 'https://status.heroku.com';
23
- const { body } = await http_call_1.default.get(host + apiPath);
120
+ const herokuApiPath = '/api/v4/current-status';
121
+ let herokuStatus;
122
+ let formattedTrustStatus;
123
+ if (process.env.TRUST_ONLY) {
124
+ formattedTrustStatus = await getTrustStatus();
125
+ }
126
+ else {
127
+ try {
128
+ // Try calling the Heroku status API first
129
+ const herokuHost = process.env.HEROKU_STATUS_HOST || 'https://status.heroku.com';
130
+ const herokuStatusResponse = await http_call_1.default.get(herokuHost + herokuApiPath);
131
+ herokuStatus = herokuStatusResponse.body;
132
+ }
133
+ catch (_b) {
134
+ // If the Heroku status API call fails, call the SF Trust API
135
+ formattedTrustStatus = await getTrustStatus();
136
+ }
137
+ }
138
+ if (!herokuStatus && !formattedTrustStatus)
139
+ core_1.ux.error(errorMessage, { exit: 1 });
24
140
  if (flags.json) {
25
- heroku_cli_util_1.hux.styledJSON(body);
141
+ heroku_cli_util_1.hux.styledJSON(herokuStatus !== null && herokuStatus !== void 0 ? herokuStatus : formattedTrustStatus);
26
142
  return;
27
143
  }
28
- for (const item of body.status) {
29
- const message = printStatus(item.status);
30
- this.log(`${(item.system + ':').padEnd(11)}${message}`);
144
+ const systemStatus = herokuStatus ? herokuStatus.status : formattedTrustStatus === null || formattedTrustStatus === void 0 ? void 0 : formattedTrustStatus.status;
145
+ if (systemStatus) {
146
+ for (const item of systemStatus) {
147
+ const message = printStatus(item.status);
148
+ this.log(`${(item.system + ':').padEnd(11)}${message}`);
149
+ }
150
+ }
151
+ else {
152
+ core_1.ux.error(errorMessage, { exit: 1 });
153
+ }
154
+ if (herokuStatus) {
155
+ for (const incident of herokuStatus.incidents) {
156
+ core_1.ux.log();
157
+ heroku_cli_util_1.hux.styledHeader(`${incident.title} ${color_1.default.yellow(incident.created_at)} ${color_1.default.cyan(incident.full_url)}`);
158
+ const padding = (0, util_2.getMaxUpdateTypeLength)(incident.updates.map(update => update.update_type));
159
+ for (const u of incident.updates) {
160
+ core_1.ux.log(`${color_1.default.yellow(u.update_type.padEnd(padding))} ${new Date(u.updated_at).toISOString()} (${(0, date_fns_1.formatDistanceToNow)(new Date(u.updated_at))} ago)`);
161
+ core_1.ux.log(`${u.contents}\n`);
162
+ }
163
+ }
31
164
  }
32
- for (const incident of body.incidents) {
33
- core_1.ux.log();
34
- heroku_cli_util_1.hux.styledHeader(`${incident.title} ${color_1.default.yellow(incident.created_at)} ${color_1.default.cyan(incident.full_url)}`);
35
- const padding = (0, util_2.maxBy)(incident.updates, (i) => i.update_type.length).update_type.length + 0;
36
- for (const u of incident.updates) {
37
- core_1.ux.log(`${color_1.default.yellow(u.update_type.padEnd(padding))} ${new Date(u.updated_at).toISOString()} (${(0, date_fns_1.formatDistanceToNow)(new Date(u.updated_at))} ago)`);
38
- core_1.ux.log(`${u.contents}\n`);
165
+ else if (formattedTrustStatus) {
166
+ for (const incident of formattedTrustStatus.incidents) {
167
+ core_1.ux.log();
168
+ heroku_cli_util_1.hux.styledHeader(`${incident.id} ${color_1.default.yellow(incident.createdAt)} ${color_1.default.cyan(`https://status.salesforce.com/incidents/${incident.id}`)}`);
169
+ const padding = (0, util_2.getMaxUpdateTypeLength)(incident.IncidentEvents.map(event => { var _a; return (_a = event.localizedType) !== null && _a !== void 0 ? _a : event.type; }));
170
+ for (const event of incident.IncidentEvents) {
171
+ const eventType = (_a = event.localizedType) !== null && _a !== void 0 ? _a : event.type;
172
+ core_1.ux.log(`${color_1.default.yellow(eventType.padEnd(padding))} ${new Date(event.createdAt).toISOString()} (${(0, date_fns_1.formatDistanceToNow)(new Date(event.createdAt))} ago)`);
173
+ core_1.ux.log(`${event.message}\n`);
174
+ }
39
175
  }
40
176
  }
41
177
  }
@@ -27,6 +27,6 @@ declare type BuildImageParams = {
27
27
  arch?: string;
28
28
  };
29
29
  export declare const buildImage: ({ dockerfile, resource, buildArgs, path, arch }: BuildImageParams) => Promise<string>;
30
- export declare const pushImage: (resource: string) => Promise<string>;
30
+ export declare const pushImage: (resource: string, arch: string) => Promise<string>;
31
31
  export declare const runImage: (resource: string, command: string, port: number) => Promise<string>;
32
32
  export {};
@@ -145,8 +145,14 @@ const buildImage = async function ({ dockerfile, resource, buildArgs, path, arch
145
145
  const args = ['build', '-f', dockerfile, '-t', resource];
146
146
  // Older Docker versions don't allow for this flag, but we are
147
147
  // adding it here when necessary to allow for pushing a docker build from m1/m2 Macs.
148
- if (arch === 'arm64')
148
+ if (arch === 'arm64' || arch === 'aarch64')
149
149
  args.push('--platform', 'linux/amd64');
150
+ // newer docker versions support attestations and software bill of materials, so we want to disable them to save time/space
151
+ // Heroku's container registry doesn't support pushing them right now
152
+ if (await (0, exports.version)() >= [24, 0, 0]) {
153
+ args.push('--provenance', 'false');
154
+ args.push('--sbom', 'false');
155
+ }
150
156
  for (const element of buildArgs) {
151
157
  if (element.length > 0) {
152
158
  args.push('--build-arg', element);
@@ -156,8 +162,13 @@ const buildImage = async function ({ dockerfile, resource, buildArgs, path, arch
156
162
  return (0, exports.cmd)('docker', args);
157
163
  };
158
164
  exports.buildImage = buildImage;
159
- const pushImage = async function (resource) {
165
+ const pushImage = async function (resource, arch) {
160
166
  const args = ['push', resource];
167
+ // Older Docker versions don't allow for this flag, but we are
168
+ // adding it here when necessary to allow for pushing a docker build from m1/m2 Macs.
169
+ // Heroku's container registry doesn't support pushing multi-arch images so we need to push the expected arch
170
+ if (arch === 'arm64' || arch === 'aarch64')
171
+ args.push('--platform', 'linux/amd64');
161
172
  return (0, exports.cmd)('docker', args);
162
173
  };
163
174
  exports.pushImage = pushImage;
@@ -1 +1 @@
1
- export declare function maxBy<T>(arr: T[], fn: (i: T) => number): T | undefined;
1
+ export declare function getMaxUpdateTypeLength(updateTypes: string[]): number;
@@ -1,14 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.maxBy = void 0;
4
- function maxBy(arr, fn) {
5
- let max;
6
- for (const cur of arr) {
7
- const i = fn(cur);
8
- if (!max || i > max.i) {
9
- max = { i, element: cur };
3
+ exports.getMaxUpdateTypeLength = void 0;
4
+ function getMaxUpdateTypeLength(updateTypes) {
5
+ let max = 0;
6
+ for (const update of updateTypes) {
7
+ if (!max || update.length > max) {
8
+ max = update.length;
10
9
  }
11
10
  }
12
- return max && max.element;
11
+ return max;
13
12
  }
14
- exports.maxBy = maxBy;
13
+ exports.getMaxUpdateTypeLength = getMaxUpdateTypeLength;
@@ -2227,6 +2227,246 @@
2227
2227
  "whoami.js"
2228
2228
  ]
2229
2229
  },
2230
+ "authorizations:create": {
2231
+ "aliases": [],
2232
+ "args": {},
2233
+ "description": "create a new OAuth authorization",
2234
+ "examples": [
2235
+ "$ heroku authorizations:create --description \"For use with Anvil\""
2236
+ ],
2237
+ "flags": {
2238
+ "description": {
2239
+ "char": "d",
2240
+ "description": "set a custom authorization",
2241
+ "name": "description",
2242
+ "hasDynamicHelp": false,
2243
+ "multiple": false,
2244
+ "type": "option"
2245
+ },
2246
+ "short": {
2247
+ "char": "S",
2248
+ "description": "only output token",
2249
+ "name": "short",
2250
+ "allowNo": false,
2251
+ "type": "boolean"
2252
+ },
2253
+ "json": {
2254
+ "char": "j",
2255
+ "description": "output in json format",
2256
+ "name": "json",
2257
+ "allowNo": false,
2258
+ "type": "boolean"
2259
+ },
2260
+ "scope": {
2261
+ "char": "s",
2262
+ "description": "set custom OAuth scopes",
2263
+ "name": "scope",
2264
+ "hasDynamicHelp": false,
2265
+ "multiple": false,
2266
+ "type": "option"
2267
+ },
2268
+ "expires-in": {
2269
+ "char": "e",
2270
+ "description": "set expiration in seconds (default no expiration)",
2271
+ "name": "expires-in",
2272
+ "hasDynamicHelp": false,
2273
+ "multiple": false,
2274
+ "type": "option"
2275
+ }
2276
+ },
2277
+ "hasDynamicHelp": false,
2278
+ "hiddenAliases": [],
2279
+ "id": "authorizations:create",
2280
+ "pluginAlias": "heroku",
2281
+ "pluginName": "heroku",
2282
+ "pluginType": "core",
2283
+ "strict": true,
2284
+ "isESM": false,
2285
+ "relativePath": [
2286
+ "lib",
2287
+ "commands",
2288
+ "authorizations",
2289
+ "create.js"
2290
+ ]
2291
+ },
2292
+ "authorizations": {
2293
+ "aliases": [],
2294
+ "args": {},
2295
+ "description": "list OAuth authorizations",
2296
+ "examples": [
2297
+ "$ heroku authorizations"
2298
+ ],
2299
+ "flags": {
2300
+ "json": {
2301
+ "char": "j",
2302
+ "description": "output in json format",
2303
+ "name": "json",
2304
+ "allowNo": false,
2305
+ "type": "boolean"
2306
+ }
2307
+ },
2308
+ "hasDynamicHelp": false,
2309
+ "hiddenAliases": [],
2310
+ "id": "authorizations",
2311
+ "pluginAlias": "heroku",
2312
+ "pluginName": "heroku",
2313
+ "pluginType": "core",
2314
+ "strict": true,
2315
+ "isESM": false,
2316
+ "relativePath": [
2317
+ "lib",
2318
+ "commands",
2319
+ "authorizations",
2320
+ "index.js"
2321
+ ]
2322
+ },
2323
+ "authorizations:info": {
2324
+ "aliases": [],
2325
+ "args": {
2326
+ "id": {
2327
+ "description": "ID of the authorization",
2328
+ "name": "id",
2329
+ "required": true
2330
+ }
2331
+ },
2332
+ "description": "show an existing OAuth authorization",
2333
+ "flags": {
2334
+ "json": {
2335
+ "char": "j",
2336
+ "description": "output in json format",
2337
+ "name": "json",
2338
+ "allowNo": false,
2339
+ "type": "boolean"
2340
+ }
2341
+ },
2342
+ "hasDynamicHelp": false,
2343
+ "hiddenAliases": [],
2344
+ "id": "authorizations:info",
2345
+ "pluginAlias": "heroku",
2346
+ "pluginName": "heroku",
2347
+ "pluginType": "core",
2348
+ "strict": true,
2349
+ "isESM": false,
2350
+ "relativePath": [
2351
+ "lib",
2352
+ "commands",
2353
+ "authorizations",
2354
+ "info.js"
2355
+ ]
2356
+ },
2357
+ "authorizations:revoke": {
2358
+ "aliases": [
2359
+ "authorizations:revoke",
2360
+ "authorizations:destroy"
2361
+ ],
2362
+ "args": {
2363
+ "id": {
2364
+ "description": "ID of the authorization",
2365
+ "name": "id",
2366
+ "required": true
2367
+ }
2368
+ },
2369
+ "description": "revoke OAuth authorization",
2370
+ "examples": [
2371
+ "$ heroku authorizations:revoke 105a7bfa-34c3-476e-873a-b1ac3fdc12fb"
2372
+ ],
2373
+ "flags": {},
2374
+ "hasDynamicHelp": false,
2375
+ "hiddenAliases": [],
2376
+ "id": "authorizations:revoke",
2377
+ "pluginAlias": "heroku",
2378
+ "pluginName": "heroku",
2379
+ "pluginType": "core",
2380
+ "strict": true,
2381
+ "isESM": false,
2382
+ "relativePath": [
2383
+ "lib",
2384
+ "commands",
2385
+ "authorizations",
2386
+ "revoke.js"
2387
+ ]
2388
+ },
2389
+ "authorizations:rotate": {
2390
+ "aliases": [],
2391
+ "args": {
2392
+ "id": {
2393
+ "description": "ID of the authorization",
2394
+ "name": "id",
2395
+ "required": true
2396
+ }
2397
+ },
2398
+ "description": "updates an OAuth authorization token",
2399
+ "flags": {},
2400
+ "hasDynamicHelp": false,
2401
+ "hiddenAliases": [],
2402
+ "id": "authorizations:rotate",
2403
+ "pluginAlias": "heroku",
2404
+ "pluginName": "heroku",
2405
+ "pluginType": "core",
2406
+ "strict": true,
2407
+ "isESM": false,
2408
+ "relativePath": [
2409
+ "lib",
2410
+ "commands",
2411
+ "authorizations",
2412
+ "rotate.js"
2413
+ ]
2414
+ },
2415
+ "authorizations:update": {
2416
+ "aliases": [],
2417
+ "args": {
2418
+ "id": {
2419
+ "description": "ID of the authorization",
2420
+ "name": "id",
2421
+ "required": true
2422
+ }
2423
+ },
2424
+ "description": "updates an OAuth authorization",
2425
+ "flags": {
2426
+ "description": {
2427
+ "char": "d",
2428
+ "description": "set a custom authorization description",
2429
+ "name": "description",
2430
+ "hasDynamicHelp": false,
2431
+ "multiple": false,
2432
+ "type": "option"
2433
+ },
2434
+ "client-id": {
2435
+ "dependsOn": [
2436
+ "client-secret"
2437
+ ],
2438
+ "description": "identifier of OAuth client to set",
2439
+ "name": "client-id",
2440
+ "hasDynamicHelp": false,
2441
+ "multiple": false,
2442
+ "type": "option"
2443
+ },
2444
+ "client-secret": {
2445
+ "dependsOn": [
2446
+ "client-id"
2447
+ ],
2448
+ "description": "secret of OAuth client to set",
2449
+ "name": "client-secret",
2450
+ "hasDynamicHelp": false,
2451
+ "multiple": false,
2452
+ "type": "option"
2453
+ }
2454
+ },
2455
+ "hasDynamicHelp": false,
2456
+ "hiddenAliases": [],
2457
+ "id": "authorizations:update",
2458
+ "pluginAlias": "heroku",
2459
+ "pluginName": "heroku",
2460
+ "pluginType": "core",
2461
+ "strict": true,
2462
+ "isESM": false,
2463
+ "relativePath": [
2464
+ "lib",
2465
+ "commands",
2466
+ "authorizations",
2467
+ "update.js"
2468
+ ]
2469
+ },
2230
2470
  "autocomplete:create": {
2231
2471
  "aliases": [],
2232
2472
  "args": {},
@@ -2714,246 +2954,6 @@
2714
2954
  "versions.js"
2715
2955
  ]
2716
2956
  },
2717
- "authorizations:create": {
2718
- "aliases": [],
2719
- "args": {},
2720
- "description": "create a new OAuth authorization",
2721
- "examples": [
2722
- "$ heroku authorizations:create --description \"For use with Anvil\""
2723
- ],
2724
- "flags": {
2725
- "description": {
2726
- "char": "d",
2727
- "description": "set a custom authorization",
2728
- "name": "description",
2729
- "hasDynamicHelp": false,
2730
- "multiple": false,
2731
- "type": "option"
2732
- },
2733
- "short": {
2734
- "char": "S",
2735
- "description": "only output token",
2736
- "name": "short",
2737
- "allowNo": false,
2738
- "type": "boolean"
2739
- },
2740
- "json": {
2741
- "char": "j",
2742
- "description": "output in json format",
2743
- "name": "json",
2744
- "allowNo": false,
2745
- "type": "boolean"
2746
- },
2747
- "scope": {
2748
- "char": "s",
2749
- "description": "set custom OAuth scopes",
2750
- "name": "scope",
2751
- "hasDynamicHelp": false,
2752
- "multiple": false,
2753
- "type": "option"
2754
- },
2755
- "expires-in": {
2756
- "char": "e",
2757
- "description": "set expiration in seconds (default no expiration)",
2758
- "name": "expires-in",
2759
- "hasDynamicHelp": false,
2760
- "multiple": false,
2761
- "type": "option"
2762
- }
2763
- },
2764
- "hasDynamicHelp": false,
2765
- "hiddenAliases": [],
2766
- "id": "authorizations:create",
2767
- "pluginAlias": "heroku",
2768
- "pluginName": "heroku",
2769
- "pluginType": "core",
2770
- "strict": true,
2771
- "isESM": false,
2772
- "relativePath": [
2773
- "lib",
2774
- "commands",
2775
- "authorizations",
2776
- "create.js"
2777
- ]
2778
- },
2779
- "authorizations": {
2780
- "aliases": [],
2781
- "args": {},
2782
- "description": "list OAuth authorizations",
2783
- "examples": [
2784
- "$ heroku authorizations"
2785
- ],
2786
- "flags": {
2787
- "json": {
2788
- "char": "j",
2789
- "description": "output in json format",
2790
- "name": "json",
2791
- "allowNo": false,
2792
- "type": "boolean"
2793
- }
2794
- },
2795
- "hasDynamicHelp": false,
2796
- "hiddenAliases": [],
2797
- "id": "authorizations",
2798
- "pluginAlias": "heroku",
2799
- "pluginName": "heroku",
2800
- "pluginType": "core",
2801
- "strict": true,
2802
- "isESM": false,
2803
- "relativePath": [
2804
- "lib",
2805
- "commands",
2806
- "authorizations",
2807
- "index.js"
2808
- ]
2809
- },
2810
- "authorizations:info": {
2811
- "aliases": [],
2812
- "args": {
2813
- "id": {
2814
- "description": "ID of the authorization",
2815
- "name": "id",
2816
- "required": true
2817
- }
2818
- },
2819
- "description": "show an existing OAuth authorization",
2820
- "flags": {
2821
- "json": {
2822
- "char": "j",
2823
- "description": "output in json format",
2824
- "name": "json",
2825
- "allowNo": false,
2826
- "type": "boolean"
2827
- }
2828
- },
2829
- "hasDynamicHelp": false,
2830
- "hiddenAliases": [],
2831
- "id": "authorizations:info",
2832
- "pluginAlias": "heroku",
2833
- "pluginName": "heroku",
2834
- "pluginType": "core",
2835
- "strict": true,
2836
- "isESM": false,
2837
- "relativePath": [
2838
- "lib",
2839
- "commands",
2840
- "authorizations",
2841
- "info.js"
2842
- ]
2843
- },
2844
- "authorizations:revoke": {
2845
- "aliases": [
2846
- "authorizations:revoke",
2847
- "authorizations:destroy"
2848
- ],
2849
- "args": {
2850
- "id": {
2851
- "description": "ID of the authorization",
2852
- "name": "id",
2853
- "required": true
2854
- }
2855
- },
2856
- "description": "revoke OAuth authorization",
2857
- "examples": [
2858
- "$ heroku authorizations:revoke 105a7bfa-34c3-476e-873a-b1ac3fdc12fb"
2859
- ],
2860
- "flags": {},
2861
- "hasDynamicHelp": false,
2862
- "hiddenAliases": [],
2863
- "id": "authorizations:revoke",
2864
- "pluginAlias": "heroku",
2865
- "pluginName": "heroku",
2866
- "pluginType": "core",
2867
- "strict": true,
2868
- "isESM": false,
2869
- "relativePath": [
2870
- "lib",
2871
- "commands",
2872
- "authorizations",
2873
- "revoke.js"
2874
- ]
2875
- },
2876
- "authorizations:rotate": {
2877
- "aliases": [],
2878
- "args": {
2879
- "id": {
2880
- "description": "ID of the authorization",
2881
- "name": "id",
2882
- "required": true
2883
- }
2884
- },
2885
- "description": "updates an OAuth authorization token",
2886
- "flags": {},
2887
- "hasDynamicHelp": false,
2888
- "hiddenAliases": [],
2889
- "id": "authorizations:rotate",
2890
- "pluginAlias": "heroku",
2891
- "pluginName": "heroku",
2892
- "pluginType": "core",
2893
- "strict": true,
2894
- "isESM": false,
2895
- "relativePath": [
2896
- "lib",
2897
- "commands",
2898
- "authorizations",
2899
- "rotate.js"
2900
- ]
2901
- },
2902
- "authorizations:update": {
2903
- "aliases": [],
2904
- "args": {
2905
- "id": {
2906
- "description": "ID of the authorization",
2907
- "name": "id",
2908
- "required": true
2909
- }
2910
- },
2911
- "description": "updates an OAuth authorization",
2912
- "flags": {
2913
- "description": {
2914
- "char": "d",
2915
- "description": "set a custom authorization description",
2916
- "name": "description",
2917
- "hasDynamicHelp": false,
2918
- "multiple": false,
2919
- "type": "option"
2920
- },
2921
- "client-id": {
2922
- "dependsOn": [
2923
- "client-secret"
2924
- ],
2925
- "description": "identifier of OAuth client to set",
2926
- "name": "client-id",
2927
- "hasDynamicHelp": false,
2928
- "multiple": false,
2929
- "type": "option"
2930
- },
2931
- "client-secret": {
2932
- "dependsOn": [
2933
- "client-id"
2934
- ],
2935
- "description": "secret of OAuth client to set",
2936
- "name": "client-secret",
2937
- "hasDynamicHelp": false,
2938
- "multiple": false,
2939
- "type": "option"
2940
- }
2941
- },
2942
- "hasDynamicHelp": false,
2943
- "hiddenAliases": [],
2944
- "id": "authorizations:update",
2945
- "pluginAlias": "heroku",
2946
- "pluginName": "heroku",
2947
- "pluginType": "core",
2948
- "strict": true,
2949
- "isESM": false,
2950
- "relativePath": [
2951
- "lib",
2952
- "commands",
2953
- "authorizations",
2954
- "update.js"
2955
- ]
2956
- },
2957
2957
  "certs:add": {
2958
2958
  "aliases": [],
2959
2959
  "args": {
@@ -15007,5 +15007,5 @@
15007
15007
  ]
15008
15008
  }
15009
15009
  },
15010
- "version": "10.12.0"
15010
+ "version": "10.13.0"
15011
15011
  }
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "heroku",
3
3
  "description": "CLI to interact with Heroku",
4
- "version": "10.12.0",
4
+ "version": "10.13.0",
5
5
  "author": "Heroku",
6
6
  "bin": "./bin/run",
7
7
  "bugs": "https://github.com/heroku/cli/issues",
8
8
  "dependencies": {
9
9
  "@heroku-cli/color": "2.0.1",
10
- "@heroku-cli/command": "^11.5.0",
10
+ "@heroku-cli/command": "^11.7.0",
11
11
  "@heroku-cli/notifications": "^1.2.4",
12
12
  "@heroku-cli/plugin-ps-exec": "2.6.2",
13
13
  "@heroku-cli/schema": "^1.0.25",
14
14
  "@heroku/buildpack-registry": "^1.0.1",
15
15
  "@heroku/eventsource": "^1.0.7",
16
16
  "@heroku/heroku-cli-util": "^9.0.2",
17
- "@heroku/http-call": "^5.4.0",
17
+ "@heroku/http-call": "^5.5.0",
18
18
  "@heroku/mcp-server": "1.0.7-alpha.1",
19
19
  "@heroku/plugin-ai": "^1.0.1",
20
20
  "@inquirer/prompts": "^5.0.5",
@@ -344,7 +344,7 @@
344
344
  },
345
345
  "update": {
346
346
  "node": {
347
- "version": "20.19.1"
347
+ "version": "20.19.4"
348
348
  },
349
349
  "s3": {
350
350
  "xz": true,
@@ -400,5 +400,5 @@
400
400
  "version": "oclif readme --multi && git add README.md ../../docs"
401
401
  },
402
402
  "types": "lib/index.d.ts",
403
- "gitHead": "ea1559149d52b30d560994325be4e5ca01d2a956"
403
+ "gitHead": "d153f438454933c3f25f6cea8a2db21625c86da8"
404
404
  }