@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
@@ -4,7 +4,6 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
6
  var _SpoListItemRoleAssignmentAddCommand_instances, _SpoListItemRoleAssignmentAddCommand_initTelemetry, _SpoListItemRoleAssignmentAddCommand_initOptions, _SpoListItemRoleAssignmentAddCommand_initValidators;
7
- import { cli } from '../../../../cli/cli.js';
8
7
  import request from '../../../../request.js';
9
8
  import { entraGroup } from '../../../../utils/entraGroup.js';
10
9
  import { formatting } from '../../../../utils/formatting.js';
@@ -12,9 +11,6 @@ import { urlUtil } from '../../../../utils/urlUtil.js';
12
11
  import { validation } from '../../../../utils/validation.js';
13
12
  import SpoCommand from '../../../base/SpoCommand.js';
14
13
  import commands from '../../commands.js';
15
- import spoGroupGetCommand from '../group/group-get.js';
16
- import spoRoleDefinitionListCommand from '../roledefinition/roledefinition-list.js';
17
- import spoUserGetCommand from '../user/user-get.js';
18
14
  import { spo } from '../../../../utils/spo.js';
19
15
  class SpoListItemRoleAssignmentAddCommand extends SpoCommand {
20
16
  get name() {
@@ -47,15 +43,13 @@ class SpoListItemRoleAssignmentAddCommand extends SpoCommand {
47
43
  requestUrl += `GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')/`;
48
44
  }
49
45
  requestUrl += `items(${args.options.listItemId})/`;
50
- const roleDefinitionId = await this.getRoleDefinitionId(args.options);
46
+ const roleDefinitionId = await this.getRoleDefinitionId(args.options, logger);
51
47
  let principalId = args.options.principalId;
52
48
  if (args.options.upn) {
53
- principalId = await this.getUserPrincipalId(args.options);
54
- await this.addRoleAssignment(requestUrl, roleDefinitionId, principalId);
49
+ principalId = await this.getUserPrincipalId(args.options, logger);
55
50
  }
56
51
  else if (args.options.groupName) {
57
- principalId = await this.getGroupPrincipalId(args.options);
58
- await this.addRoleAssignment(requestUrl, roleDefinitionId, principalId);
52
+ principalId = await this.getGroupPrincipalId(args.options, logger);
59
53
  }
60
54
  else if (args.options.entraGroupId || args.options.entraGroupName) {
61
55
  if (this.verbose) {
@@ -85,45 +79,20 @@ class SpoListItemRoleAssignmentAddCommand extends SpoCommand {
85
79
  };
86
80
  await request.post(requestOptions);
87
81
  }
88
- async getRoleDefinitionId(options) {
82
+ async getRoleDefinitionId(options, logger) {
89
83
  if (!options.roleDefinitionName) {
90
84
  return options.roleDefinitionId;
91
85
  }
92
- const roleDefinitionListCommandOptions = {
93
- webUrl: options.webUrl,
94
- output: 'json',
95
- debug: this.debug,
96
- verbose: this.verbose
97
- };
98
- const output = await cli.executeCommandWithOutput(spoRoleDefinitionListCommand, { options: { ...roleDefinitionListCommandOptions, _: [] } });
99
- const getRoleDefinitionListOutput = JSON.parse(output.stdout);
100
- const roleDefinitionId = getRoleDefinitionListOutput.find((role) => role.Name === options.roleDefinitionName).Id;
101
- return roleDefinitionId;
86
+ const roleDefintion = await spo.getRoleDefinitionByName(options.webUrl, options.roleDefinitionName, logger, this.verbose);
87
+ return roleDefintion.Id;
102
88
  }
103
- async getGroupPrincipalId(options) {
104
- const groupGetCommandOptions = {
105
- webUrl: options.webUrl,
106
- name: options.groupName,
107
- output: 'json',
108
- debug: this.debug,
109
- verbose: this.verbose
110
- };
111
- const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
112
- const getGroupOutput = JSON.parse(output.stdout);
113
- return getGroupOutput.Id;
89
+ async getGroupPrincipalId(options, logger) {
90
+ const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
91
+ return group.Id;
114
92
  }
115
- async getUserPrincipalId(options) {
116
- const userGetCommandOptions = {
117
- webUrl: options.webUrl,
118
- email: options.upn,
119
- id: undefined,
120
- output: 'json',
121
- debug: this.debug,
122
- verbose: this.verbose
123
- };
124
- const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
125
- const getUserOutput = JSON.parse(output.stdout);
126
- return getUserOutput.Id;
93
+ async getUserPrincipalId(options, logger) {
94
+ const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
95
+ return user.Id;
127
96
  }
128
97
  }
129
98
  _SpoListItemRoleAssignmentAddCommand_instances = new WeakSet(), _SpoListItemRoleAssignmentAddCommand_initTelemetry = function _SpoListItemRoleAssignmentAddCommand_initTelemetry() {
@@ -11,8 +11,6 @@ import { urlUtil } from '../../../../utils/urlUtil.js';
11
11
  import { validation } from '../../../../utils/validation.js';
12
12
  import SpoCommand from '../../../base/SpoCommand.js';
13
13
  import commands from '../../commands.js';
14
- import spoGroupGetCommand from '../group/group-get.js';
15
- import spoUserGetCommand from '../user/user-get.js';
16
14
  import { entraGroup } from '../../../../utils/entraGroup.js';
17
15
  import { spo } from '../../../../utils/spo.js';
18
16
  class SpoListItemRoleAssignmentRemoveCommand extends SpoCommand {
@@ -59,10 +57,10 @@ class SpoListItemRoleAssignmentRemoveCommand extends SpoCommand {
59
57
  }
60
58
  requestUrl += `items(${options.listItemId})/`;
61
59
  if (options.upn) {
62
- options.principalId = await this.getUserPrincipalId(options);
60
+ options.principalId = await this.getUserPrincipalId(options, logger);
63
61
  }
64
62
  else if (options.groupName) {
65
- options.principalId = await this.getGroupPrincipalId(options);
63
+ options.principalId = await this.getGroupPrincipalId(options, logger);
66
64
  }
67
65
  else if (options.entraGroupId || options.entraGroupName) {
68
66
  if (this.verbose) {
@@ -92,30 +90,13 @@ class SpoListItemRoleAssignmentRemoveCommand extends SpoCommand {
92
90
  };
93
91
  await request.post(requestOptions);
94
92
  }
95
- async getGroupPrincipalId(options) {
96
- const groupGetCommandOptions = {
97
- webUrl: options.webUrl,
98
- name: options.groupName,
99
- output: 'json',
100
- debug: this.debug,
101
- verbose: this.verbose
102
- };
103
- const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
104
- const getGroupOutput = JSON.parse(output.stdout);
105
- return getGroupOutput.Id;
93
+ async getGroupPrincipalId(options, logger) {
94
+ const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
95
+ return group.Id;
106
96
  }
107
- async getUserPrincipalId(options) {
108
- const userGetCommandOptions = {
109
- webUrl: options.webUrl,
110
- email: options.upn,
111
- id: undefined,
112
- output: 'json',
113
- debug: this.debug,
114
- verbose: this.verbose
115
- };
116
- const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
117
- const getUserOutput = JSON.parse(output.stdout);
118
- return getUserOutput.Id;
97
+ async getUserPrincipalId(options, logger) {
98
+ const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
99
+ return user.Id;
119
100
  }
120
101
  }
121
102
  _SpoListItemRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListItemRoleAssignmentRemoveCommand_initTelemetry = function _SpoListItemRoleAssignmentRemoveCommand_initTelemetry() {
@@ -4,16 +4,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
6
  var _SpoWebRoleAssignmentAddCommand_instances, _SpoWebRoleAssignmentAddCommand_initTelemetry, _SpoWebRoleAssignmentAddCommand_initOptions, _SpoWebRoleAssignmentAddCommand_initValidators, _SpoWebRoleAssignmentAddCommand_initOptionSets;
7
- import { cli } from '../../../../cli/cli.js';
8
7
  import request from '../../../../request.js';
8
+ import { entraGroup } from '../../../../utils/entraGroup.js';
9
+ import { spo } from '../../../../utils/spo.js';
9
10
  import { validation } from '../../../../utils/validation.js';
10
11
  import SpoCommand from '../../../base/SpoCommand.js';
11
12
  import commands from '../../commands.js';
12
- import spoGroupGetCommand from '../group/group-get.js';
13
- import spoRoleDefinitionListCommand from '../roledefinition/roledefinition-list.js';
14
- import spoUserGetCommand from '../user/user-get.js';
15
- import { entraGroup } from '../../../../utils/entraGroup.js';
16
- import { spo } from '../../../../utils/spo.js';
17
13
  class SpoWebRoleAssignmentAddCommand extends SpoCommand {
18
14
  get name() {
19
15
  return commands.WEB_ROLEASSIGNMENT_ADD;
@@ -34,12 +30,14 @@ class SpoWebRoleAssignmentAddCommand extends SpoCommand {
34
30
  await logger.logToStderr(`Adding role assignment to web ${args.options.webUrl}...`);
35
31
  }
36
32
  try {
37
- args.options.roleDefinitionId = await this.getRoleDefinitionId(args.options);
33
+ const roleDefinitionId = await this.getRoleDefinitionId(args.options, logger);
38
34
  if (args.options.upn) {
39
- args.options.principalId = await this.getUserPrincipalId(args.options);
35
+ const principalId = await this.getUserPrincipalId(args.options, logger);
36
+ await this.addRoleAssignment(args.options.webUrl, principalId, roleDefinitionId, logger);
40
37
  }
41
38
  else if (args.options.groupName) {
42
- args.options.principalId = await this.getGroupPrincipalId(args.options);
39
+ const principalId = await this.getGroupPrincipalId(args.options, logger);
40
+ await this.addRoleAssignment(args.options.webUrl, principalId, roleDefinitionId, logger);
43
41
  }
44
42
  else if (args.options.entraGroupId || args.options.entraGroupName) {
45
43
  if (this.verbose) {
@@ -49,17 +47,19 @@ class SpoWebRoleAssignmentAddCommand extends SpoCommand {
49
47
  ? await entraGroup.getGroupById(args.options.entraGroupId)
50
48
  : await entraGroup.getGroupByDisplayName(args.options.entraGroupName);
51
49
  const siteUser = await spo.ensureEntraGroup(args.options.webUrl, group);
52
- args.options.principalId = siteUser.Id;
50
+ await this.addRoleAssignment(args.options.webUrl, siteUser.Id, roleDefinitionId, logger);
53
51
  }
54
- await this.addRoleAssignment(logger, args.options);
55
52
  }
56
53
  catch (err) {
57
54
  this.handleRejectedODataJsonPromise(err);
58
55
  }
59
56
  }
60
- async addRoleAssignment(logger, options) {
57
+ async addRoleAssignment(webUrl, principalId, roleDefinitionId, logger) {
58
+ if (this.verbose) {
59
+ await logger.logToStderr('Adding role assignment...');
60
+ }
61
61
  const requestOptions = {
62
- url: `${options.webUrl}/_api/web/roleassignments/addroleassignment(principalid='${options.principalId}',roledefid='${options.roleDefinitionId}')`,
62
+ url: `${webUrl}/_api/web/roleassignments/addroleassignment(principalid='${principalId}',roledefid='${roleDefinitionId}')`,
63
63
  method: 'POST',
64
64
  headers: {
65
65
  'accept': 'application/json;odata=nometadata',
@@ -69,45 +69,20 @@ class SpoWebRoleAssignmentAddCommand extends SpoCommand {
69
69
  };
70
70
  await request.post(requestOptions);
71
71
  }
72
- async getRoleDefinitionId(options) {
72
+ async getRoleDefinitionId(options, logger) {
73
73
  if (!options.roleDefinitionName) {
74
74
  return options.roleDefinitionId;
75
75
  }
76
- const roleDefinitionListCommandOptions = {
77
- webUrl: options.webUrl,
78
- output: 'json',
79
- debug: this.debug,
80
- verbose: this.verbose
81
- };
82
- const output = await cli.executeCommandWithOutput(spoRoleDefinitionListCommand, { options: { ...roleDefinitionListCommandOptions, _: [] } });
83
- const getRoleDefinitionListOutput = JSON.parse(output.stdout);
84
- const roleDefinitionId = getRoleDefinitionListOutput.find((role) => role.Name === options.roleDefinitionName).Id;
85
- return roleDefinitionId;
76
+ const roledefinition = await spo.getRoleDefinitionByName(options.webUrl, options.roleDefinitionName, logger, this.verbose);
77
+ return roledefinition.Id;
86
78
  }
87
- async getGroupPrincipalId(options) {
88
- const groupGetCommandOptions = {
89
- webUrl: options.webUrl,
90
- name: options.groupName,
91
- output: 'json',
92
- debug: this.debug,
93
- verbose: this.verbose
94
- };
95
- const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
96
- const getGroupOutput = JSON.parse(output.stdout);
97
- return getGroupOutput.Id;
79
+ async getGroupPrincipalId(options, logger) {
80
+ const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
81
+ return group.Id;
98
82
  }
99
- async getUserPrincipalId(options) {
100
- const userGetCommandOptions = {
101
- webUrl: options.webUrl,
102
- email: options.upn,
103
- id: undefined,
104
- output: 'json',
105
- debug: this.debug,
106
- verbose: this.verbose
107
- };
108
- const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
109
- const getUserOutput = JSON.parse(output.stdout);
110
- return getUserOutput.Id;
83
+ async getUserPrincipalId(options, logger) {
84
+ const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
85
+ return user.Id;
111
86
  }
112
87
  }
113
88
  _SpoWebRoleAssignmentAddCommand_instances = new WeakSet(), _SpoWebRoleAssignmentAddCommand_initTelemetry = function _SpoWebRoleAssignmentAddCommand_initTelemetry() {
@@ -4,15 +4,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
6
  var _SpoWebRoleAssignmentRemoveCommand_instances, _SpoWebRoleAssignmentRemoveCommand_initTelemetry, _SpoWebRoleAssignmentRemoveCommand_initOptions, _SpoWebRoleAssignmentRemoveCommand_initValidators, _SpoWebRoleAssignmentRemoveCommand_initOptionSets;
7
- import { cli } from '../../../../cli/cli.js';
8
7
  import request from '../../../../request.js';
9
8
  import { validation } from '../../../../utils/validation.js';
10
9
  import SpoCommand from '../../../base/SpoCommand.js';
11
10
  import commands from '../../commands.js';
12
- import spoGroupGetCommand from '../group/group-get.js';
13
- import spoUserGetCommand from '../user/user-get.js';
14
11
  import { entraGroup } from '../../../../utils/entraGroup.js';
15
12
  import { spo } from '../../../../utils/spo.js';
13
+ import { cli } from '../../../../cli/cli.js';
16
14
  class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
17
15
  get name() {
18
16
  return commands.WEB_ROLEASSIGNMENT_REMOVE;
@@ -45,10 +43,12 @@ class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
45
43
  }
46
44
  try {
47
45
  if (options.upn) {
48
- options.principalId = await this.getUserPrincipalId(options);
46
+ const principalId = await this.getUserPrincipalId(options, logger);
47
+ await this.removeRoleAssignmentWithOptions(options.webUrl, principalId, logger);
49
48
  }
50
49
  else if (options.groupName) {
51
- options.principalId = await this.getGroupPrincipalId(options);
50
+ const principalId = await this.getGroupPrincipalId(options, logger);
51
+ await this.removeRoleAssignmentWithOptions(options.webUrl, principalId, logger);
52
52
  }
53
53
  else if (options.entraGroupId || options.entraGroupName) {
54
54
  if (this.verbose) {
@@ -58,17 +58,19 @@ class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
58
58
  ? await entraGroup.getGroupById(options.entraGroupId)
59
59
  : await entraGroup.getGroupByDisplayName(options.entraGroupName);
60
60
  const siteUser = await spo.ensureEntraGroup(options.webUrl, group);
61
- options.principalId = siteUser.Id;
61
+ await this.removeRoleAssignmentWithOptions(options.webUrl, siteUser.Id, logger);
62
62
  }
63
- await this.removeRoleAssignmentWithOptions(logger, options);
64
63
  }
65
64
  catch (err) {
66
65
  this.handleRejectedODataJsonPromise(err);
67
66
  }
68
67
  }
69
- async removeRoleAssignmentWithOptions(logger, options) {
68
+ async removeRoleAssignmentWithOptions(webUrl, principalId, logger) {
69
+ if (this.verbose) {
70
+ await logger.logToStderr('Removing role assignment...');
71
+ }
70
72
  const requestOptions = {
71
- url: `${options.webUrl}/_api/web/roleassignments/removeroleassignment(principalid='${options.principalId}')`,
73
+ url: `${webUrl}/_api/web/roleassignments/removeroleassignment(principalid='${principalId}')`,
72
74
  method: 'POST',
73
75
  headers: {
74
76
  'accept': 'application/json;odata=nometadata',
@@ -78,30 +80,13 @@ class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
78
80
  };
79
81
  await request.post(requestOptions);
80
82
  }
81
- async getGroupPrincipalId(options) {
82
- const groupGetCommandOptions = {
83
- webUrl: options.webUrl,
84
- name: options.groupName,
85
- output: 'json',
86
- debug: this.debug,
87
- verbose: this.verbose
88
- };
89
- const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
90
- const getGroupOutput = JSON.parse(output.stdout);
91
- return getGroupOutput.Id;
83
+ async getGroupPrincipalId(options, logger) {
84
+ const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
85
+ return group.Id;
92
86
  }
93
- async getUserPrincipalId(options) {
94
- const userGetCommandOptions = {
95
- webUrl: options.webUrl,
96
- email: options.upn,
97
- id: undefined,
98
- output: 'json',
99
- debug: this.debug,
100
- verbose: this.verbose
101
- };
102
- const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
103
- const getUserOutput = JSON.parse(output.stdout);
104
- return getUserOutput.Id;
87
+ async getUserPrincipalId(options, logger) {
88
+ const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
89
+ return user.Id;
105
90
  }
106
91
  }
107
92
  _SpoWebRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoWebRoleAssignmentRemoveCommand_initTelemetry = function _SpoWebRoleAssignmentRemoveCommand_initTelemetry() {
@@ -5,6 +5,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
5
5
  };
6
6
  var _TenantPeopleProfileCardPropertyAddCommand_instances, _TenantPeopleProfileCardPropertyAddCommand_initTelemetry, _TenantPeopleProfileCardPropertyAddCommand_initOptions, _TenantPeopleProfileCardPropertyAddCommand_initValidators;
7
7
  import request from '../../../../request.js';
8
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
8
9
  import GraphCommand from '../../../base/GraphCommand.js';
9
10
  import commands from '../../commands.js';
10
11
  import { profileCardPropertyNames } from './profileCardProperties.js';
@@ -71,7 +72,7 @@ class TenantPeopleProfileCardPropertyAddCommand extends GraphCommand {
71
72
  ];
72
73
  }
73
74
  getLocalizations(options) {
74
- const unknownOptions = Object.keys(this.getUnknownOptions(options));
75
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(options, this.options));
75
76
  if (unknownOptions.length === 0) {
76
77
  return [];
77
78
  }
@@ -88,7 +89,7 @@ class TenantPeopleProfileCardPropertyAddCommand extends GraphCommand {
88
89
  _TenantPeopleProfileCardPropertyAddCommand_instances = new WeakSet(), _TenantPeopleProfileCardPropertyAddCommand_initTelemetry = function _TenantPeopleProfileCardPropertyAddCommand_initTelemetry() {
89
90
  this.telemetry.push((args) => {
90
91
  // Add unknown options to telemetry
91
- const unknownOptions = Object.keys(this.getUnknownOptions(args.options));
92
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
92
93
  const unknownOptionsObj = unknownOptions.reduce((obj, key) => ({ ...obj, [key]: true }), {});
93
94
  Object.assign(this.telemetryProperties, {
94
95
  displayName: typeof args.options.displayName !== 'undefined',
@@ -114,7 +115,7 @@ _TenantPeopleProfileCardPropertyAddCommand_instances = new WeakSet(), _TenantPeo
114
115
  if (!propertyName.startsWith('customattribute') && args.options.displayName !== undefined) {
115
116
  return `The option 'displayName' can only be used when adding customAttributes as profile card properties`;
116
117
  }
117
- const unknownOptions = Object.keys(this.getUnknownOptions(args.options));
118
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
118
119
  if (!propertyName.startsWith('customattribute') && unknownOptions.length > 0) {
119
120
  return `Unknown options like ${unknownOptions.join(', ')} are only supported with customAttributes`;
120
121
  }
@@ -8,6 +8,7 @@ import GraphCommand from '../../../base/GraphCommand.js';
8
8
  import request from '../../../../request.js';
9
9
  import { profileCardPropertyNames as allProfileCardPropertyNames } from './profileCardProperties.js';
10
10
  import commands from '../../commands.js';
11
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
11
12
  class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
12
13
  get name() {
13
14
  return commands.PEOPLE_PROFILECARDPROPERTY_SET;
@@ -73,7 +74,7 @@ class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
73
74
  * @example Transform "--displayName-en-US 'Cost center'" to { languageTag: 'en-US', displayName: 'Cost center' }
74
75
  */
75
76
  getLocalizations(options) {
76
- const unknownOptions = this.getUnknownOptions(options);
77
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
77
78
  const result = Object.keys(unknownOptions).map(o => ({
78
79
  languageTag: o.substring(o.indexOf('-') + 1),
79
80
  displayName: unknownOptions[o]
@@ -84,7 +85,7 @@ class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
84
85
  _TenantPeopleProfileCardPropertySetCommand_instances = new WeakSet(), _TenantPeopleProfileCardPropertySetCommand_initTelemetry = function _TenantPeopleProfileCardPropertySetCommand_initTelemetry() {
85
86
  this.telemetry.push((args) => {
86
87
  // Add unknown options to telemetry
87
- const unknownOptions = Object.keys(this.getUnknownOptions(args.options));
88
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
88
89
  const unknownOptionsObj = unknownOptions.reduce((obj, key) => ({ ...obj, [key]: true }), {});
89
90
  Object.assign(this.telemetryProperties, {
90
91
  displayName: typeof args.options.displayName !== 'undefined',
@@ -104,7 +105,7 @@ _TenantPeopleProfileCardPropertySetCommand_instances = new WeakSet(), _TenantPeo
104
105
  return `'${args.options.name}' is not a valid value for option name. Allowed values are: ${this.profileCardPropertyNames.join(', ')}.`;
105
106
  }
106
107
  // Unknown options are allowed only if they start with 'displayName-'
107
- const unknownOptionKeys = Object.keys(this.getUnknownOptions(args.options));
108
+ const unknownOptionKeys = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
108
109
  const invalidOptionKey = unknownOptionKeys.find(o => !o.startsWith('displayName-'));
109
110
  if (invalidOptionKey) {
110
111
  return `Invalid option: '${invalidOptionKey}'`;
@@ -46,7 +46,7 @@ class TodoListRemoveCommand extends DelegatedGraphCommand {
46
46
  responseType: 'json'
47
47
  };
48
48
  const response = await request.get(requestOptions);
49
- return response.value && response.value.length === 1 ? response.value[0].id : null;
49
+ return response.value && response.value.length === 1 ? response.value[0].id : undefined;
50
50
  }
51
51
  async removeList(args) {
52
52
  try {
@@ -7,6 +7,7 @@ var _UtilAccessTokenGetCommand_instances, _UtilAccessTokenGetCommand_initTelemet
7
7
  import auth, { Auth } from '../../../../Auth.js';
8
8
  import Command from '../../../../Command.js';
9
9
  import commands from '../../commands.js';
10
+ import { accessToken } from '../../../../utils/accessToken.js';
10
11
  class UtilAccessTokenGetCommand extends Command {
11
12
  get name() {
12
13
  return commands.ACCESSTOKEN_GET;
@@ -34,8 +35,14 @@ class UtilAccessTokenGetCommand extends Command {
34
35
  resource = Auth.getEndpointForResource('https://graph.microsoft.com', auth.connection.cloudType);
35
36
  }
36
37
  try {
37
- const accessToken = await auth.ensureAccessToken(resource, logger, this.debug, args.options.new);
38
- await logger.log(accessToken);
38
+ const token = await auth.ensureAccessToken(resource, logger, this.debug, args.options.new);
39
+ if (args.options.decoded) {
40
+ const { header, payload } = accessToken.getDecodedAccessToken(token);
41
+ await logger.logRaw(`${JSON.stringify(header, null, 2)}.${JSON.stringify(payload, null, 2)}.[signature]`);
42
+ }
43
+ else {
44
+ await logger.log(token);
45
+ }
39
46
  }
40
47
  catch (err) {
41
48
  this.handleRejectedODataJsonPromise(err);
@@ -45,7 +52,8 @@ class UtilAccessTokenGetCommand extends Command {
45
52
  _UtilAccessTokenGetCommand_instances = new WeakSet(), _UtilAccessTokenGetCommand_initTelemetry = function _UtilAccessTokenGetCommand_initTelemetry() {
46
53
  this.telemetry.push((args) => {
47
54
  Object.assign(this.telemetryProperties, {
48
- new: args.options.new
55
+ new: args.options.new,
56
+ decoded: args.options.decoded
49
57
  });
50
58
  });
51
59
  }, _UtilAccessTokenGetCommand_initOptions = function _UtilAccessTokenGetCommand_initOptions() {
@@ -53,6 +61,8 @@ _UtilAccessTokenGetCommand_instances = new WeakSet(), _UtilAccessTokenGetCommand
53
61
  option: '-r, --resource <resource>'
54
62
  }, {
55
63
  option: '--new'
64
+ }, {
65
+ option: '--decoded'
56
66
  });
57
67
  };
58
68
  export default new UtilAccessTokenGetCommand();
@@ -75,6 +75,14 @@ export const accessToken = {
75
75
  }
76
76
  return userId;
77
77
  },
78
+ getDecodedAccessToken(accessToken) {
79
+ const chunks = accessToken.split('.');
80
+ const headerString = Buffer.from(chunks[0], 'base64').toString();
81
+ const payloadString = Buffer.from(chunks[1], 'base64').toString();
82
+ const header = JSON.parse(headerString);
83
+ const payload = JSON.parse(payloadString);
84
+ return { header, payload };
85
+ },
78
86
  /**
79
87
  * Asserts the presence of a delegated access token.
80
88
  * @throws {CommandError} Will throw an error if the access token is not available.
@@ -3,6 +3,7 @@ import request from '../request.js';
3
3
  import { odata } from './odata.js';
4
4
  import { formatting } from './formatting.js';
5
5
  import { cli } from '../cli/cli.js';
6
+ import { optionsUtils } from './optionsUtils.js';
6
7
  async function getCertificateBase64Encoded({ options, logger, debug }) {
7
8
  if (options.certificateBase64Encoded) {
8
9
  return options.certificateBase64Encoded;
@@ -129,7 +130,7 @@ function updateAppPermissions({ spId, resourceAccessPermission, oAuth2Permission
129
130
  }
130
131
  export const entraApp = {
131
132
  appPermissions: [],
132
- createAppRegistration: async ({ options, apis, logger, verbose, debug }) => {
133
+ createAppRegistration: async ({ options, apis, logger, verbose, debug, unknownOptions }) => {
133
134
  const applicationInfo = {
134
135
  displayName: options.name,
135
136
  signInAudience: options.multitenant ? 'AzureADMultipleOrgs' : 'AzureADMyOrg'
@@ -164,6 +165,7 @@ export const entraApp = {
164
165
  if (options.allowPublicClientFlows) {
165
166
  applicationInfo.isFallbackPublicClient = true;
166
167
  }
168
+ optionsUtils.addUnknownOptionsToPayload(applicationInfo, unknownOptions);
167
169
  if (verbose) {
168
170
  await logger.logToStderr(`Creating Microsoft Entra app registration...`);
169
171
  }
@@ -0,0 +1,28 @@
1
+ const longOptionRegex = /--([^\s]+)/;
2
+ const shortOptionRegex = /-([a-z])\b/;
3
+ export const optionsUtils = {
4
+ getUnknownOptions(options, knownOptions) {
5
+ const unknownOptions = JSON.parse(JSON.stringify(options));
6
+ // remove minimist catch-all option
7
+ delete unknownOptions._;
8
+ knownOptions.forEach(o => {
9
+ const longOptionName = longOptionRegex.exec(o.option)[1];
10
+ delete unknownOptions[longOptionName];
11
+ // short names are optional so we need to check if the current command has
12
+ // one before continuing
13
+ const shortOptionMatch = shortOptionRegex.exec(o.option);
14
+ if (shortOptionMatch) {
15
+ const shortOptionName = shortOptionMatch[1];
16
+ delete unknownOptions[shortOptionName];
17
+ }
18
+ });
19
+ return unknownOptions;
20
+ },
21
+ addUnknownOptionsToPayload(payload, unknownOptions) {
22
+ const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
23
+ unknownOptionsNames.forEach(o => {
24
+ payload[o] = unknownOptions[o];
25
+ });
26
+ }
27
+ };
28
+ //# sourceMappingURL=optionsUtils.js.map
@@ -51,7 +51,7 @@ export const powerPlatform = {
51
51
  }
52
52
  if (items.length > 1) {
53
53
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('websiteUrl', items);
54
- return cli.handleMultipleResultsFound(`Multiple Power Page websites with name '${websiteName}' found`, resultAsKeyValuePair);
54
+ return cli.handleMultipleResultsFound(`Multiple Power Page websites with name '${websiteName}' found.`, resultAsKeyValuePair);
55
55
  }
56
56
  return items[0];
57
57
  },
@@ -62,6 +62,56 @@ export const powerPlatform = {
62
62
  throw Error(`The specified Power Page website with url '${url}' does not exist.`);
63
63
  }
64
64
  return items[0];
65
+ },
66
+ /**
67
+ * Get a card by name
68
+ * Returns a card object
69
+ * @param dynamicsApiUrl The dynamics api url of the environment
70
+ * @param name The name of the card
71
+ * @param logger The logger object
72
+ * @param verbose Set for verbose logging
73
+ */
74
+ async getCardByName(dynamicsApiUrl, name) {
75
+ const requestOptions = {
76
+ url: `${dynamicsApiUrl}/api/data/v9.1/cards?$filter=name eq '${name}'`,
77
+ headers: {
78
+ accept: 'application/json;odata.metadata=none'
79
+ },
80
+ responseType: 'json'
81
+ };
82
+ const result = await request.get(requestOptions);
83
+ if (result.value.length === 0) {
84
+ throw Error(`The specified card '${name}' does not exist.`);
85
+ }
86
+ if (result.value.length > 1) {
87
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('cardid', result.value);
88
+ return cli.handleMultipleResultsFound(`Multiple cards with name '${name}' found.`, resultAsKeyValuePair);
89
+ }
90
+ return result.value[0];
91
+ },
92
+ /**
93
+ * Get a solution by name
94
+ * Returns the solution object
95
+ * @param dynamicsApiUrl The dynamics api url of the environment
96
+ * @param name The name of the solution
97
+ */
98
+ async getSolutionByName(dynamicsApiUrl, name) {
99
+ const requestOptions = {
100
+ url: `${dynamicsApiUrl}/api/data/v9.0/solutions?$filter=isvisible eq true and uniquename eq \'${name}\'&$expand=publisherid($select=friendlyname)&$select=solutionid,uniquename,version,publisherid,installedon,solutionpackageversion,friendlyname,versionnumber&api-version=9.1`,
101
+ headers: {
102
+ accept: 'application/json;odata.metadata=none'
103
+ },
104
+ responseType: 'json'
105
+ };
106
+ const result = await request.get(requestOptions);
107
+ if (result.value.length === 0) {
108
+ throw Error(`The specified solution '${name}' does not exist.`);
109
+ }
110
+ if (result.value.length > 1) {
111
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('solutionid', result.value);
112
+ return cli.handleMultipleResultsFound(`Multiple solutions with name '${name}' found.`, resultAsKeyValuePair);
113
+ }
114
+ return result.value[0];
65
115
  }
66
116
  };
67
117
  //# sourceMappingURL=powerPlatform.js.map