@pnp/cli-microsoft365 10.5.0 → 10.6.0-beta.38233e7

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.
Files changed (65) hide show
  1. package/.eslintrc.cjs +3 -1
  2. package/allCommands.json +1 -1
  3. package/allCommandsFull.json +1 -1
  4. package/dist/Auth.js +2 -1
  5. package/dist/Command.js +4 -26
  6. package/dist/auth/MsalNetworkClient.js +32 -0
  7. package/dist/config.js +2 -0
  8. package/dist/m365/adaptivecard/commands/adaptivecard-send.js +2 -1
  9. package/dist/m365/app/commands/app-get.js +3 -13
  10. package/dist/m365/app/commands/permission/permission-list.js +4 -14
  11. package/dist/m365/base/SpoCommand.js +2 -1
  12. package/dist/m365/commands/request.js +3 -12
  13. package/dist/m365/commands/setup.js +2 -0
  14. package/dist/m365/entra/commands/administrativeunit/administrativeunit-add.js +10 -5
  15. package/dist/m365/entra/commands/app/app-add.js +5 -0
  16. package/dist/m365/entra/commands/app/app-get.js +27 -21
  17. package/dist/m365/entra/commands/app/app-permission-list.js +28 -22
  18. package/dist/m365/entra/commands/app/app-remove.js +22 -19
  19. package/dist/m365/entra/commands/app/app-role-add.js +22 -19
  20. package/dist/m365/entra/commands/app/app-role-list.js +22 -19
  21. package/dist/m365/entra/commands/app/app-role-remove.js +39 -36
  22. package/dist/m365/entra/commands/app/app-set.js +45 -19
  23. package/dist/m365/entra/commands/group/group-add.js +1 -0
  24. package/dist/m365/entra/commands/group/group-set.js +12 -6
  25. package/dist/m365/entra/commands/policy/policy-list.js +46 -3
  26. package/dist/m365/entra/commands/user/user-add.js +1 -0
  27. package/dist/m365/entra/commands/user/user-list.js +2 -1
  28. package/dist/m365/external/commands/item/item-add.js +2 -1
  29. package/dist/m365/flow/commands/flow-list.js +1 -1
  30. package/dist/m365/graph/commands/openextension/openextension-add.js +73 -0
  31. package/dist/m365/graph/commands/openextension/openextension-get.js +57 -0
  32. package/dist/m365/graph/commands/openextension/openextension-list.js +62 -0
  33. package/dist/m365/graph/commands/openextension/openextension-remove.js +68 -0
  34. package/dist/m365/graph/commands.js +4 -0
  35. package/dist/m365/pp/commands/card/card-clone.js +12 -16
  36. package/dist/m365/pp/commands/card/card-get.js +13 -19
  37. package/dist/m365/pp/commands/card/card-remove.js +13 -16
  38. package/dist/m365/pp/commands/solution/solution-get.js +5 -11
  39. package/dist/m365/pp/commands/solution/solution-publish.js +6 -16
  40. package/dist/m365/pp/commands/solution/solution-remove.js +4 -13
  41. package/dist/m365/spo/commands/folder/folder-roleassignment-add.js +12 -47
  42. package/dist/m365/spo/commands/folder/folder-roleassignment-remove.js +13 -31
  43. package/dist/m365/spo/commands/listitem/listitem-roleassignment-add.js +12 -43
  44. package/dist/m365/spo/commands/listitem/listitem-roleassignment-remove.js +8 -27
  45. package/dist/m365/spo/commands/web/web-roleassignment-add.js +22 -47
  46. package/dist/m365/spo/commands/web/web-roleassignment-remove.js +17 -32
  47. package/dist/m365/tenant/commands/people/people-profilecardproperty-add.js +4 -3
  48. package/dist/m365/tenant/commands/people/people-profilecardproperty-set.js +4 -3
  49. package/dist/m365/todo/commands/list/list-remove.js +1 -1
  50. package/dist/m365/util/commands/accesstoken/accesstoken-get.js +13 -3
  51. package/dist/utils/accessToken.js +8 -0
  52. package/dist/utils/entraApp.js +3 -1
  53. package/dist/utils/optionsUtils.js +28 -0
  54. package/dist/utils/powerPlatform.js +51 -1
  55. package/dist/utils/spo.js +32 -3
  56. package/docs/docs/cmd/entra/policy/policy-list.mdx +1 -1
  57. package/docs/docs/cmd/graph/directoryextension/directoryextension-get.mdx +2 -3
  58. package/docs/docs/cmd/graph/openextension/openextension-add.mdx +120 -0
  59. package/docs/docs/cmd/graph/openextension/openextension-get.mdx +111 -0
  60. package/docs/docs/cmd/graph/openextension/openextension-list.mdx +129 -0
  61. package/docs/docs/cmd/graph/openextension/openextension-remove.mdx +59 -0
  62. package/docs/docs/cmd/spfx/project/project-upgrade.mdx +0 -3
  63. package/docs/docs/cmd/util/accesstoken/accesstoken-get.mdx +72 -0
  64. package/npm-shrinkwrap.json +517 -481
  65. package/package.json +15 -15
package/dist/Auth.js CHANGED
@@ -2,6 +2,7 @@ import { AzureCloudInstance } from '@azure/msal-common';
2
2
  import assert from 'assert';
3
3
  import { CommandError } from './Command.js';
4
4
  import { FileTokenStorage } from './auth/FileTokenStorage.js';
5
+ import { MsalNetworkClient } from './auth/MsalNetworkClient.js';
5
6
  import { msalCachePlugin } from './auth/msalCachePlugin.js';
6
7
  import { cli } from './cli/cli.js';
7
8
  import request from './request.js';
@@ -274,7 +275,7 @@ export class Auth {
274
275
  piiLoggingEnabled: false,
275
276
  logLevel: debug ? LogLevel.Verbose : LogLevel.Error
276
277
  },
277
- proxyUrl: process.env.HTTP_PROXY || process.env.HTTPS_PROXY
278
+ networkClient: new MsalNetworkClient()
278
279
  }
279
280
  };
280
281
  }
package/dist/Command.js CHANGED
@@ -15,6 +15,7 @@ import { accessToken } from './utils/accessToken.js';
15
15
  import { md } from './utils/md.js';
16
16
  import { prompt } from './utils/prompt.js';
17
17
  import { zod } from './utils/zod.js';
18
+ import { optionsUtils } from './utils/optionsUtils.js';
18
19
  export class CommandError {
19
20
  constructor(message, code) {
20
21
  this.message = message;
@@ -337,39 +338,16 @@ class Command {
337
338
  }
338
339
  await telemetry.trackEvent(this.getUsedCommandName(), this.getTelemetryProperties(args));
339
340
  }
340
- getUnknownOptions(options) {
341
- const unknownOptions = JSON.parse(JSON.stringify(options));
342
- // remove minimist catch-all option
343
- delete unknownOptions._;
344
- const knownOptions = this.options;
345
- const longOptionRegex = /--([^\s]+)/;
346
- const shortOptionRegex = /-([a-z])\b/;
347
- knownOptions.forEach(o => {
348
- const longOptionName = longOptionRegex.exec(o.option)[1];
349
- delete unknownOptions[longOptionName];
350
- // short names are optional so we need to check if the current command has
351
- // one before continuing
352
- const shortOptionMatch = shortOptionRegex.exec(o.option);
353
- if (shortOptionMatch) {
354
- const shortOptionName = shortOptionMatch[1];
355
- delete unknownOptions[shortOptionName];
356
- }
357
- });
358
- return unknownOptions;
359
- }
360
341
  trackUnknownOptions(telemetryProps, options) {
361
- const unknownOptions = this.getUnknownOptions(options);
342
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
362
343
  const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
363
344
  unknownOptionsNames.forEach(o => {
364
345
  telemetryProps[o] = true;
365
346
  });
366
347
  }
367
348
  addUnknownOptionsToPayload(payload, options) {
368
- const unknownOptions = this.getUnknownOptions(options);
369
- const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
370
- unknownOptionsNames.forEach(o => {
371
- payload[o] = unknownOptions[o];
372
- });
349
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
350
+ optionsUtils.addUnknownOptionsToPayload(payload, unknownOptions);
373
351
  }
374
352
  loadValuesFromAccessToken(args) {
375
353
  if (!auth.connection.accessTokens[auth.defaultResource]) {
@@ -0,0 +1,32 @@
1
+ import request from '../request.js';
2
+ export class MsalNetworkClient {
3
+ sendGetRequestAsync(url, options) {
4
+ return this.sendRequestAsync(url, 'GET', options);
5
+ }
6
+ sendPostRequestAsync(url, options) {
7
+ return this.sendRequestAsync(url, 'POST', options);
8
+ }
9
+ async sendRequestAsync(url, method, options = {}) {
10
+ const requestOptions = {
11
+ url: url,
12
+ method: method,
13
+ headers: {
14
+ 'x-anonymous': true,
15
+ ...options.headers
16
+ },
17
+ data: options.body,
18
+ fullResponse: true
19
+ };
20
+ const res = await request.execute(requestOptions);
21
+ const headersObj = {};
22
+ for (const [key, value] of Object.entries(res.headers)) {
23
+ headersObj[key] = typeof value === 'string' ? value : String(value);
24
+ }
25
+ return {
26
+ headers: headersObj,
27
+ body: JSON.parse(res.data),
28
+ status: res.status
29
+ };
30
+ }
31
+ }
32
+ //# sourceMappingURL=MsalNetworkClient.js.map
package/dist/config.js CHANGED
@@ -29,9 +29,11 @@ export default {
29
29
  'https://graph.microsoft.com/OnlineMeetingArtifact.Read.All',
30
30
  'https://graph.microsoft.com/OnlineMeetings.ReadWrite',
31
31
  'https://graph.microsoft.com/OnlineMeetingTranscript.Read.All',
32
+ 'https://graph.microsoft.com/Organization.ReadWrite.All',
32
33
  'https://graph.microsoft.com/PeopleSettings.ReadWrite.All',
33
34
  'https://graph.microsoft.com/Place.Read.All',
34
35
  'https://graph.microsoft.com/Policy.Read.All',
36
+ 'https://graph.microsoft.com/Policy.Read.PermissionGrant',
35
37
  'https://graph.microsoft.com/RecordsManagement.ReadWrite.All',
36
38
  'https://graph.microsoft.com/Reports.Read.All',
37
39
  'https://graph.microsoft.com/ReportSettings.ReadWrite.All',
@@ -7,6 +7,7 @@ var _AdaptiveCardSendCommand_instances, _AdaptiveCardSendCommand_initTelemetry,
7
7
  import request from '../../../request.js';
8
8
  import AnonymousCommand from '../../base/AnonymousCommand.js';
9
9
  import commands from '../commands.js';
10
+ import { optionsUtils } from '../../../utils/optionsUtils.js';
10
11
  class AdaptiveCardSendCommand extends AnonymousCommand {
11
12
  get name() {
12
13
  return commands.SEND;
@@ -26,7 +27,7 @@ class AdaptiveCardSendCommand extends AnonymousCommand {
26
27
  return true;
27
28
  }
28
29
  async commandAction(logger, args) {
29
- const unknownOptions = this.getUnknownOptions(args.options);
30
+ const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
30
31
  const unknownOptionNames = Object.getOwnPropertyNames(unknownOptions);
31
32
  const card = await this.getCard(args, unknownOptionNames, unknownOptions);
32
33
  const requestOptions = {
@@ -1,7 +1,6 @@
1
- import { cli } from '../../../cli/cli.js';
2
- import entraAppGetCommand from '../../entra/commands/app/app-get.js';
3
1
  import AppCommand from '../../base/AppCommand.js';
4
2
  import commands from '../commands.js';
3
+ import { entraApp } from '../../../utils/entraApp.js';
5
4
  class AppGetCommand extends AppCommand {
6
5
  get name() {
7
6
  return commands.GET;
@@ -10,18 +9,9 @@ class AppGetCommand extends AppCommand {
10
9
  return 'Retrieves information about the current Microsoft Entra app';
11
10
  }
12
11
  async commandAction(logger, args) {
13
- const options = {
14
- appId: this.appId,
15
- output: 'json',
16
- debug: args.options.debug,
17
- verbose: args.options.verbose
18
- };
19
12
  try {
20
- const appGetOutput = await cli.executeCommandWithOutput(entraAppGetCommand, { options: { ...options, _: [] } });
21
- if (this.verbose) {
22
- await logger.logToStderr(appGetOutput.stderr);
23
- }
24
- await logger.log(JSON.parse(appGetOutput.stdout));
13
+ const app = await entraApp.getAppRegistrationByAppId(args.options.appId);
14
+ await logger.log(app);
25
15
  }
26
16
  catch (err) {
27
17
  this.handleRejectedODataJsonPromise(err);
@@ -1,8 +1,7 @@
1
- import { cli } from '../../../../cli/cli.js';
2
1
  import request from '../../../../request.js';
3
- import appGetCommand from '../../../entra/commands/app/app-get.js';
4
2
  import AppCommand from '../../../base/AppCommand.js';
5
3
  import commands from '../../commands.js';
4
+ import { entraApp } from '../../../../utils/entraApp.js';
6
5
  var GetServicePrincipal;
7
6
  (function (GetServicePrincipal) {
8
7
  GetServicePrincipal[GetServicePrincipal["withPermissions"] = 0] = "withPermissions";
@@ -178,19 +177,10 @@ class AppPermissionListCommand extends AppCommand {
178
177
  }
179
178
  async getAppRegistration(appId, logger) {
180
179
  if (this.verbose) {
181
- await logger.logToStderr(`Retrieving Microsoft Entra application registration ${appId}`);
180
+ await logger.logToStderr(`Retrieving the Entra application registration with appId '${appId}'`);
182
181
  }
183
- const options = {
184
- appId: appId,
185
- output: 'json',
186
- debug: this.debug,
187
- verbose: this.verbose
188
- };
189
- const output = await cli.executeCommandWithOutput(appGetCommand, { options: { ...options, _: [] } });
190
- if (this.debug) {
191
- await logger.logToStderr(output.stderr);
192
- }
193
- return JSON.parse(output.stdout);
182
+ const app = await entraApp.getAppRegistrationByAppId(appId);
183
+ return app;
194
184
  }
195
185
  async getAppRegPermissions(appId, logger) {
196
186
  const application = await this.getAppRegistration(appId, logger);
@@ -1,6 +1,7 @@
1
1
  import { createRequire } from 'module';
2
2
  import auth, { AuthType } from '../../Auth.js';
3
3
  import Command, { CommandError } from '../../Command.js';
4
+ import { optionsUtils } from '../../utils/optionsUtils.js';
4
5
  const require = createRequire(import.meta.url);
5
6
  const csomDefs = require('../../../csom.json');
6
7
  export default class SpoCommand extends Command {
@@ -70,7 +71,7 @@ export default class SpoCommand extends Command {
70
71
  }
71
72
  }
72
73
  validateUnknownCsomOptions(options, csomObject, csomPropertyType) {
73
- const unknownOptions = this.getUnknownOptions(options);
74
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
74
75
  const optionNames = Object.getOwnPropertyNames(unknownOptions);
75
76
  if (optionNames.length === 0) {
76
77
  return true;
@@ -36,11 +36,7 @@ class RequestCommand extends Command {
36
36
  const url = this.resolveUrlTokens(args.options.url);
37
37
  const method = (args.options.method || 'get').toUpperCase();
38
38
  const headers = {};
39
- const unknownOptions = this.getUnknownOptions(args.options);
40
- const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
41
- unknownOptionsNames.forEach(o => {
42
- headers[o] = unknownOptions[o];
43
- });
39
+ this.addUnknownOptionsToPayload(headers, args.options);
44
40
  if (!headers.accept) {
45
41
  headers.accept = 'application/json';
46
42
  }
@@ -105,19 +101,14 @@ class RequestCommand extends Command {
105
101
  }
106
102
  _RequestCommand_instances = new WeakSet(), _RequestCommand_initTelemetry = function _RequestCommand_initTelemetry() {
107
103
  this.telemetry.push((args) => {
108
- const properties = {
104
+ Object.assign(this.telemetryProperties, {
109
105
  method: args.options.method || 'get',
110
106
  resource: typeof args.options.resource !== 'undefined',
111
107
  accept: args.options.accept || 'application/json',
112
108
  body: typeof args.options.body !== 'undefined',
113
109
  filePath: typeof args.options.filePath !== 'undefined'
114
- };
115
- const unknownOptions = this.getUnknownOptions(args.options);
116
- const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
117
- unknownOptionsNames.forEach(o => {
118
- properties[o] = typeof unknownOptions[o] !== 'undefined';
119
110
  });
120
- Object.assign(this.telemetryProperties, properties);
111
+ this.trackUnknownOptions(this.telemetryProperties, args.options);
121
112
  });
122
113
  }, _RequestCommand_initOptions = function _RequestCommand_initOptions() {
123
114
  this.options.unshift({
@@ -18,6 +18,7 @@ import { validation } from '../../utils/validation.js';
18
18
  import AnonymousCommand from '../base/AnonymousCommand.js';
19
19
  import commands from './commands.js';
20
20
  import { interactivePreset, powerShellPreset, scriptingPreset } from './setupPresets.js';
21
+ import { optionsUtils } from '../../utils/optionsUtils.js';
21
22
  export var CliUsageMode;
22
23
  (function (CliUsageMode) {
23
24
  CliUsageMode["Interactively"] = "interactively";
@@ -227,6 +228,7 @@ class SetupCommand extends AnonymousCommand {
227
228
  });
228
229
  const appInfo = await entraApp.createAppRegistration({
229
230
  options,
231
+ unknownOptions: optionsUtils.getUnknownOptions(options, this.options),
230
232
  apis,
231
233
  logger,
232
234
  verbose: this.verbose,
@@ -14,6 +14,9 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
14
14
  get description() {
15
15
  return 'Creates an administrative unit';
16
16
  }
17
+ allowUnknownOptions() {
18
+ return true;
19
+ }
17
20
  constructor() {
18
21
  super();
19
22
  _EntraAdministrativeUnitAddCommand_instances.add(this);
@@ -21,17 +24,19 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
21
24
  __classPrivateFieldGet(this, _EntraAdministrativeUnitAddCommand_instances, "m", _EntraAdministrativeUnitAddCommand_initOptions).call(this);
22
25
  }
23
26
  async commandAction(logger, args) {
27
+ const requestBody = {
28
+ description: args.options.description,
29
+ displayName: args.options.displayName,
30
+ visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
31
+ };
32
+ this.addUnknownOptionsToPayload(requestBody, args.options);
24
33
  const requestOptions = {
25
34
  url: `${this.resource}/v1.0/directory/administrativeUnits`,
26
35
  headers: {
27
36
  accept: 'application/json;odata.metadata=none'
28
37
  },
29
38
  responseType: 'json',
30
- data: {
31
- description: args.options.description,
32
- displayName: args.options.displayName,
33
- visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
34
- }
39
+ data: requestBody
35
40
  };
36
41
  try {
37
42
  const administrativeUnit = await request.post(requestOptions);
@@ -12,6 +12,7 @@ import { accessToken } from '../../../../utils/accessToken.js';
12
12
  import { entraApp } from '../../../../utils/entraApp.js';
13
13
  import GraphCommand from '../../../base/GraphCommand.js';
14
14
  import commands from '../../commands.js';
15
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
15
16
  class EntraAppAddCommand extends GraphCommand {
16
17
  get name() {
17
18
  return commands.APP_ADD;
@@ -19,6 +20,9 @@ class EntraAppAddCommand extends GraphCommand {
19
20
  get description() {
20
21
  return 'Creates new Entra app registration';
21
22
  }
23
+ allowUnknownOptions() {
24
+ return true;
25
+ }
22
26
  constructor() {
23
27
  super();
24
28
  _EntraAppAddCommand_instances.add(this);
@@ -43,6 +47,7 @@ class EntraAppAddCommand extends GraphCommand {
43
47
  });
44
48
  let appInfo = await entraApp.createAppRegistration({
45
49
  options: args.options,
50
+ unknownOptions: optionsUtils.getUnknownOptions(args.options, this.options),
46
51
  apis,
47
52
  logger,
48
53
  verbose: this.verbose,
@@ -11,6 +11,7 @@ import { validation } from '../../../../utils/validation.js';
11
11
  import GraphCommand from '../../../base/GraphCommand.js';
12
12
  import commands from '../../commands.js';
13
13
  import { cli } from '../../../../cli/cli.js';
14
+ import { entraApp } from '../../../../utils/entraApp.js';
14
15
  class EntraAppGetCommand extends GraphCommand {
15
16
  get name() {
16
17
  return commands.APP_GET;
@@ -28,7 +29,7 @@ class EntraAppGetCommand extends GraphCommand {
28
29
  }
29
30
  async commandAction(logger, args) {
30
31
  try {
31
- const appObjectId = await this.getAppObjectId(args);
32
+ const appObjectId = await this.getAppObjectId(args, logger);
32
33
  const appInfo = await this.getAppInfo(appObjectId, args.options.properties);
33
34
  const res = await this.saveAppInfo(args, appInfo, logger);
34
35
  await logger.log(res);
@@ -37,32 +38,37 @@ class EntraAppGetCommand extends GraphCommand {
37
38
  this.handleRejectedODataJsonPromise(err);
38
39
  }
39
40
  }
40
- async getAppObjectId(args) {
41
+ async getAppObjectId(args, logger) {
41
42
  if (args.options.objectId) {
42
43
  return args.options.objectId;
43
44
  }
44
45
  const { appId, name } = args.options;
45
- const filter = appId ?
46
- `appId eq '${formatting.encodeQueryParameter(appId)}'` :
47
- `displayName eq '${formatting.encodeQueryParameter(name)}'`;
48
- const requestOptions = {
49
- url: `${this.resource}/v1.0/myorganization/applications?$filter=${filter}&$select=id`,
50
- headers: {
51
- accept: 'application/json;odata.metadata=none'
52
- },
53
- responseType: 'json'
54
- };
55
- const res = await request.get(requestOptions);
56
- if (res.value.length === 1) {
57
- return res.value[0].id;
46
+ if (this.verbose) {
47
+ await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : name}...`);
48
+ }
49
+ if (appId) {
50
+ const app = await entraApp.getAppRegistrationByAppId(appId, ["id"]);
51
+ return app.id;
58
52
  }
59
- if (res.value.length === 0) {
60
- const applicationIdentifier = appId ? `ID ${appId}` : `name ${name}`;
61
- throw `No Microsoft Entra application registration with ${applicationIdentifier} found`;
53
+ else {
54
+ const requestOptions = {
55
+ url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(name)}'&$select=id`,
56
+ headers: {
57
+ accept: 'application/json;odata.metadata=none'
58
+ },
59
+ responseType: 'json'
60
+ };
61
+ const res = await request.get(requestOptions);
62
+ if (res.value.length === 1) {
63
+ return res.value[0].id;
64
+ }
65
+ if (res.value.length === 0) {
66
+ throw `No Microsoft Entra application registration with name ${name} found`;
67
+ }
68
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
69
+ const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${name}' found.`, resultAsKeyValuePair);
70
+ return result.id;
62
71
  }
63
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
64
- const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${name}' found.`, resultAsKeyValuePair);
65
- return result.id;
66
72
  }
67
73
  async getAppInfo(appObjectId, properties) {
68
74
  const queryParameters = [];
@@ -10,6 +10,7 @@ import request from "../../../../request.js";
10
10
  import { validation } from "../../../../utils/validation.js";
11
11
  import { formatting } from "../../../../utils/formatting.js";
12
12
  import { cli } from "../../../../cli/cli.js";
13
+ import { entraApp } from "../../../../utils/entraApp.js";
13
14
  class EntraAppPermissionListCommand extends GraphCommand {
14
15
  get name() {
15
16
  return commands.APP_PERMISSION_LIST;
@@ -28,7 +29,7 @@ class EntraAppPermissionListCommand extends GraphCommand {
28
29
  }
29
30
  async commandAction(logger, args) {
30
31
  try {
31
- const appObjectId = await this.getAppObjectId(args.options);
32
+ const appObjectId = await this.getAppObjectId(args.options, logger);
32
33
  const type = args.options.type ?? 'all';
33
34
  const permissions = await this.getAppRegPermissions(appObjectId, type, logger);
34
35
  await logger.log(permissions);
@@ -37,32 +38,37 @@ class EntraAppPermissionListCommand extends GraphCommand {
37
38
  this.handleRejectedODataJsonPromise(err);
38
39
  }
39
40
  }
40
- async getAppObjectId(options) {
41
+ async getAppObjectId(options, logger) {
41
42
  if (options.appObjectId) {
42
43
  return options.appObjectId;
43
44
  }
44
45
  const { appId, appName } = options;
45
- const filter = appId ?
46
- `appId eq '${formatting.encodeQueryParameter(appId)}'` :
47
- `displayName eq '${formatting.encodeQueryParameter(appName)}'`;
48
- const requestOptions = {
49
- url: `${this.resource}/v1.0/myorganization/applications?$filter=${filter}&$select=id`,
50
- headers: {
51
- accept: 'application/json;odata.metadata=none'
52
- },
53
- responseType: 'json'
54
- };
55
- const res = await request.get(requestOptions);
56
- if (res.value.length === 1) {
57
- return res.value[0].id;
58
- }
59
- if (res.value.length === 0) {
60
- const applicationIdentifier = appId ? `ID ${appId}` : `name ${appName}`;
61
- throw `No Microsoft Entra application registration with ${applicationIdentifier} found`;
46
+ if (this.verbose) {
47
+ await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : appName}...`);
48
+ }
49
+ if (appId) {
50
+ const app = await entraApp.getAppRegistrationByAppId(appId, ["id"]);
51
+ return app.id;
52
+ }
53
+ else {
54
+ const requestOptions = {
55
+ url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(appName)}'&$select=id`,
56
+ headers: {
57
+ accept: 'application/json;odata.metadata=none'
58
+ },
59
+ responseType: 'json'
60
+ };
61
+ const res = await request.get(requestOptions);
62
+ if (res.value.length === 1) {
63
+ return res.value[0].id;
64
+ }
65
+ if (res.value.length === 0) {
66
+ throw `No Microsoft Entra application registration with name ${appName} found`;
67
+ }
68
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
69
+ const result = await cli.handleMultipleResultsFound(`Multiple Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
70
+ return result.id;
62
71
  }
63
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
64
- const result = await cli.handleMultipleResultsFound(`Multiple Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
65
- return result.id;
66
72
  }
67
73
  async getAppRegPermissions(appObjectId, permissionType, logger) {
68
74
  const requestOptions = {
@@ -6,6 +6,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
6
6
  var _EntraAppRemoveCommand_instances, _EntraAppRemoveCommand_initTelemetry, _EntraAppRemoveCommand_initOptions, _EntraAppRemoveCommand_initValidators, _EntraAppRemoveCommand_initOptionSets;
7
7
  import { cli } from '../../../../cli/cli.js';
8
8
  import request from '../../../../request.js';
9
+ import { entraApp } from '../../../../utils/entraApp.js';
9
10
  import { formatting } from '../../../../utils/formatting.js';
10
11
  import { validation } from '../../../../utils/validation.js';
11
12
  import GraphCommand from '../../../base/GraphCommand.js';
@@ -63,27 +64,29 @@ class EntraAppRemoveCommand extends GraphCommand {
63
64
  if (this.verbose) {
64
65
  await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : name}...`);
65
66
  }
66
- const filter = appId ?
67
- `appId eq '${formatting.encodeQueryParameter(appId)}'` :
68
- `displayName eq '${formatting.encodeQueryParameter(name)}'`;
69
- const requestOptions = {
70
- url: `${this.resource}/v1.0/myorganization/applications?$filter=${filter}&$select=id`,
71
- headers: {
72
- accept: 'application/json;odata.metadata=none'
73
- },
74
- responseType: 'json'
75
- };
76
- const res = await request.get(requestOptions);
77
- if (res.value.length === 1) {
78
- return res.value[0].id;
67
+ if (appId) {
68
+ const app = await entraApp.getAppRegistrationByAppId(appId, ['id']);
69
+ return app.id;
79
70
  }
80
- if (res.value.length === 0) {
81
- const applicationIdentifier = appId ? `ID ${appId}` : `name ${name}`;
82
- throw `No Microsoft Entra application registration with ${applicationIdentifier} found`;
71
+ else {
72
+ const requestOptions = {
73
+ url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(name)}'&$select=id`,
74
+ headers: {
75
+ accept: 'application/json;odata.metadata=none'
76
+ },
77
+ responseType: 'json'
78
+ };
79
+ const res = await request.get(requestOptions);
80
+ if (res.value.length === 1) {
81
+ return res.value[0].id;
82
+ }
83
+ if (res.value.length === 0) {
84
+ throw `No Microsoft Entra application registration with name ${name} found`;
85
+ }
86
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
87
+ const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registration with name '${name}' found.`, resultAsKeyValuePair);
88
+ return result.id;
83
89
  }
84
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
85
- const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registration with name '${name}' found.`, resultAsKeyValuePair);
86
- return result.id;
87
90
  }
88
91
  }
89
92
  _EntraAppRemoveCommand_instances = new WeakSet(), _EntraAppRemoveCommand_initTelemetry = function _EntraAppRemoveCommand_initTelemetry() {
@@ -10,6 +10,7 @@ import { formatting } from '../../../../utils/formatting.js';
10
10
  import GraphCommand from '../../../base/GraphCommand.js';
11
11
  import commands from '../../commands.js';
12
12
  import { cli } from '../../../../cli/cli.js';
13
+ import { entraApp } from '../../../../utils/entraApp.js';
13
14
  class EntraAppRoleAddCommand extends GraphCommand {
14
15
  get name() {
15
16
  return commands.APP_ROLE_ADD;
@@ -87,27 +88,29 @@ class EntraAppRoleAddCommand extends GraphCommand {
87
88
  if (this.verbose) {
88
89
  await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : appName}...`);
89
90
  }
90
- const filter = appId ?
91
- `appId eq '${formatting.encodeQueryParameter(appId)}'` :
92
- `displayName eq '${formatting.encodeQueryParameter(appName)}'`;
93
- const requestOptions = {
94
- url: `${this.resource}/v1.0/myorganization/applications?$filter=${filter}&$select=id`,
95
- headers: {
96
- accept: 'application/json;odata.metadata=none'
97
- },
98
- responseType: 'json'
99
- };
100
- const res = await request.get(requestOptions);
101
- if (res.value.length === 1) {
102
- return res.value[0].id;
91
+ if (appId) {
92
+ const app = await entraApp.getAppRegistrationByAppId(appId, ['id']);
93
+ return app.id;
103
94
  }
104
- if (res.value.length === 0) {
105
- const applicationIdentifier = appId ? `ID ${appId}` : `name ${appName}`;
106
- throw `No Microsoft Entra application registration with ${applicationIdentifier} found`;
95
+ else {
96
+ const requestOptions = {
97
+ url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(appName)}'&$select=id`,
98
+ headers: {
99
+ accept: 'application/json;odata.metadata=none'
100
+ },
101
+ responseType: 'json'
102
+ };
103
+ const res = await request.get(requestOptions);
104
+ if (res.value.length === 1) {
105
+ return res.value[0].id;
106
+ }
107
+ if (res.value.length === 0) {
108
+ throw `No Microsoft Entra application registration with name ${appName} found`;
109
+ }
110
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
111
+ const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
112
+ return result.id;
107
113
  }
108
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
109
- const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
110
- return result.id;
111
114
  }
112
115
  }
113
116
  _a = EntraAppRoleAddCommand, _EntraAppRoleAddCommand_instances = new WeakSet(), _EntraAppRoleAddCommand_initTelemetry = function _EntraAppRoleAddCommand_initTelemetry() {