@pnp/cli-microsoft365 8.1.0-beta.3bc5759 → 8.1.0-beta.a0e1bec

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 (69) hide show
  1. package/allCommands.json +1 -1
  2. package/allCommandsFull.json +1 -1
  3. package/dist/Auth.js +1 -1
  4. package/dist/m365/connection/commands/connection-remove.js +6 -2
  5. package/dist/m365/connection/commands/connection-set.js +4 -1
  6. package/dist/m365/connection/commands/connection-use.js +25 -4
  7. package/dist/m365/entra/commands/enterpriseapp/enterpriseapp-remove.js +123 -0
  8. package/dist/m365/entra/commands/group/group-set.js +256 -0
  9. package/dist/m365/entra/commands/m365group/m365group-user-add.js +109 -32
  10. package/dist/m365/entra/commands/m365group/m365group-user-set.js +159 -84
  11. package/dist/m365/entra/commands/multitenant/multitenant-add.js +65 -0
  12. package/dist/m365/entra/commands/multitenant/multitenant-remove.js +118 -0
  13. package/dist/m365/entra/commands/multitenant/multitenant-set.js +72 -0
  14. package/dist/m365/entra/commands.js +6 -0
  15. package/dist/m365/flow/commands/flow-get.js +1 -1
  16. package/dist/m365/pa/commands/app/app-export.js +13 -7
  17. package/dist/m365/spo/commands/file/file-roleassignment-add.js +1 -1
  18. package/dist/m365/spo/commands/file/file-roleinheritance-break.js +1 -1
  19. package/dist/m365/spo/commands/file/file-roleinheritance-reset.js +1 -1
  20. package/dist/m365/spo/commands/folder/folder-retentionlabel-ensure.js +1 -1
  21. package/dist/m365/spo/commands/folder/folder-sharinglink-get.js +86 -0
  22. package/dist/m365/spo/commands/folder/folder-sharinglink-list.js +110 -0
  23. package/dist/m365/spo/commands/list/ListInstance.js +6 -1
  24. package/dist/m365/spo/commands/list/list-get.js +9 -3
  25. package/dist/m365/spo/commands/list/list-roleassignment-add.js +46 -21
  26. package/dist/m365/spo/commands/list/list-roleassignment-remove.js +48 -46
  27. package/dist/m365/spo/commands.js +2 -0
  28. package/dist/m365/teams/commands/message/message-restore.js +106 -0
  29. package/dist/m365/teams/commands.js +1 -0
  30. package/dist/utils/drive.js +61 -0
  31. package/dist/utils/spo.js +69 -6
  32. package/docs/docs/cmd/connection/connection-use.mdx +8 -2
  33. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-remove.mdx +65 -0
  34. package/docs/docs/cmd/entra/group/group-add.mdx +0 -4
  35. package/docs/docs/cmd/entra/group/group-set.mdx +89 -0
  36. package/docs/docs/cmd/entra/m365group/m365group-user-add.mdx +28 -10
  37. package/docs/docs/cmd/entra/m365group/m365group-user-set.mdx +35 -11
  38. package/docs/docs/cmd/entra/multitenant/multitenant-add.mdx +107 -0
  39. package/docs/docs/cmd/entra/multitenant/multitenant-remove.mdx +58 -0
  40. package/docs/docs/cmd/entra/multitenant/multitenant-set.mdx +53 -0
  41. package/docs/docs/cmd/flow/flow-get.mdx +149 -283
  42. package/docs/docs/cmd/pa/app/app-export.mdx +15 -9
  43. package/docs/docs/cmd/planner/plan/plan-remove.mdx +1 -1
  44. package/docs/docs/cmd/spe/containertype/containertype-list.mdx +24 -53
  45. package/docs/docs/cmd/spo/app/app-uninstall.mdx +1 -1
  46. package/docs/docs/cmd/spo/applicationcustomizer/applicationcustomizer-get.mdx +4 -4
  47. package/docs/docs/cmd/spo/applicationcustomizer/applicationcustomizer-list.mdx +4 -4
  48. package/docs/docs/cmd/spo/file/file-retentionlabel-ensure.mdx +1 -1
  49. package/docs/docs/cmd/spo/file/file-roleassignment-add.mdx +2 -2
  50. package/docs/docs/cmd/spo/file/file-roleassignment-remove.mdx +1 -1
  51. package/docs/docs/cmd/spo/file/file-roleinheritance-break.mdx +1 -1
  52. package/docs/docs/cmd/spo/file/file-roleinheritance-reset.mdx +1 -1
  53. package/docs/docs/cmd/spo/folder/folder-retentionlabel-ensure.mdx +2 -2
  54. package/docs/docs/cmd/spo/folder/folder-sharinglink-get.mdx +110 -0
  55. package/docs/docs/cmd/spo/folder/folder-sharinglink-list.mdx +114 -0
  56. package/docs/docs/cmd/spo/list/list-get.mdx +6 -0
  57. package/docs/docs/cmd/spo/list/list-roleassignment-add.mdx +15 -3
  58. package/docs/docs/cmd/spo/list/list-roleassignment-remove.mdx +15 -3
  59. package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-ensure.mdx +4 -4
  60. package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-remove.mdx +1 -1
  61. package/docs/docs/cmd/spo/listitem/listitem-roleassignment-add.mdx +9 -9
  62. package/docs/docs/cmd/spo/listitem/listitem-roleassignment-remove.mdx +7 -7
  63. package/docs/docs/cmd/spo/site/site-recyclebinitem-list.mdx +1 -1
  64. package/docs/docs/cmd/spo/web/web-roleassignment-add.mdx +1 -1
  65. package/docs/docs/cmd/spo/web/web-roleassignment-remove.mdx +1 -1
  66. package/docs/docs/cmd/teams/message/message-remove.mdx +2 -1
  67. package/docs/docs/cmd/teams/message/message-restore.mdx +62 -0
  68. package/npm-shrinkwrap.json +572 -477
  69. package/package.json +22 -22
package/dist/Auth.js CHANGED
@@ -691,7 +691,7 @@ export class Auth {
691
691
  const allConnections = await this.getAllConnections();
692
692
  const connection = allConnections.find(i => i.name === name);
693
693
  if (!connection) {
694
- throw new CommandError(`The connection '${name}' cannot be found`);
694
+ throw new CommandError(`The connection '${name}' cannot be found.`);
695
695
  }
696
696
  return connection;
697
697
  }
@@ -3,7 +3,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3
3
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
- var _ConnectionRemoveCommand_instances, _ConnectionRemoveCommand_initTelemetry, _ConnectionRemoveCommand_initOptions;
6
+ var _ConnectionRemoveCommand_instances, _ConnectionRemoveCommand_initTelemetry, _ConnectionRemoveCommand_initOptions, _ConnectionRemoveCommand_initTypes;
7
7
  import auth from '../../../Auth.js';
8
8
  import commands from '../commands.js';
9
9
  import Command, { CommandError } from '../../../Command.js';
@@ -20,6 +20,7 @@ class ConnectionRemoveCommand extends Command {
20
20
  _ConnectionRemoveCommand_instances.add(this);
21
21
  __classPrivateFieldGet(this, _ConnectionRemoveCommand_instances, "m", _ConnectionRemoveCommand_initTelemetry).call(this);
22
22
  __classPrivateFieldGet(this, _ConnectionRemoveCommand_instances, "m", _ConnectionRemoveCommand_initOptions).call(this);
23
+ __classPrivateFieldGet(this, _ConnectionRemoveCommand_instances, "m", _ConnectionRemoveCommand_initTypes).call(this);
23
24
  }
24
25
  async commandAction(logger, args) {
25
26
  const deleteConnection = async () => {
@@ -53,7 +54,7 @@ class ConnectionRemoveCommand extends Command {
53
54
  _ConnectionRemoveCommand_instances = new WeakSet(), _ConnectionRemoveCommand_initTelemetry = function _ConnectionRemoveCommand_initTelemetry() {
54
55
  this.telemetry.push((args) => {
55
56
  Object.assign(this.telemetryProperties, {
56
- force: (!(!args.options.force)).toString()
57
+ force: !!args.options.force
57
58
  });
58
59
  });
59
60
  }, _ConnectionRemoveCommand_initOptions = function _ConnectionRemoveCommand_initOptions() {
@@ -62,6 +63,9 @@ _ConnectionRemoveCommand_instances = new WeakSet(), _ConnectionRemoveCommand_ini
62
63
  }, {
63
64
  option: '-f, --force'
64
65
  });
66
+ }, _ConnectionRemoveCommand_initTypes = function _ConnectionRemoveCommand_initTypes() {
67
+ this.types.string.push('name');
68
+ this.types.boolean.push('force');
65
69
  };
66
70
  export default new ConnectionRemoveCommand();
67
71
  //# sourceMappingURL=connection-remove.js.map
@@ -3,7 +3,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3
3
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
- var _ConnectionSetCommand_instances, _ConnectionSetCommand_initOptions, _ConnectionSetCommand_initValidators;
6
+ var _ConnectionSetCommand_instances, _ConnectionSetCommand_initOptions, _ConnectionSetCommand_initValidators, _ConnectionSetCommand_initTypes;
7
7
  import auth from '../../../Auth.js';
8
8
  import commands from '../commands.js';
9
9
  import Command, { CommandError } from '../../../Command.js';
@@ -19,6 +19,7 @@ class ConnectionSetCommand extends Command {
19
19
  _ConnectionSetCommand_instances.add(this);
20
20
  __classPrivateFieldGet(this, _ConnectionSetCommand_instances, "m", _ConnectionSetCommand_initOptions).call(this);
21
21
  __classPrivateFieldGet(this, _ConnectionSetCommand_instances, "m", _ConnectionSetCommand_initValidators).call(this);
22
+ __classPrivateFieldGet(this, _ConnectionSetCommand_instances, "m", _ConnectionSetCommand_initTypes).call(this);
22
23
  }
23
24
  async commandAction(logger, args) {
24
25
  const connection = await auth.getConnection(args.options.name);
@@ -51,6 +52,8 @@ _ConnectionSetCommand_instances = new WeakSet(), _ConnectionSetCommand_initOptio
51
52
  }
52
53
  return true;
53
54
  });
55
+ }, _ConnectionSetCommand_initTypes = function _ConnectionSetCommand_initTypes() {
56
+ this.types.string.push('name', 'newName');
54
57
  };
55
58
  export default new ConnectionSetCommand();
56
59
  //# sourceMappingURL=connection-set.js.map
@@ -3,10 +3,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3
3
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
- var _ConnectionUseCommand_instances, _ConnectionUseCommand_initOptions;
6
+ var _ConnectionUseCommand_instances, _ConnectionUseCommand_initTelemetry, _ConnectionUseCommand_initOptions, _ConnectionUseCommand_initTypes;
7
7
  import auth from '../../../Auth.js';
8
8
  import commands from '../commands.js';
9
9
  import Command, { CommandError } from '../../../Command.js';
10
+ import { formatting } from '../../../utils/formatting.js';
11
+ import { cli } from '../../../cli/cli.js';
10
12
  class ConnectionUseCommand extends Command {
11
13
  get name() {
12
14
  return commands.USE;
@@ -18,9 +20,20 @@ class ConnectionUseCommand extends Command {
18
20
  super();
19
21
  _ConnectionUseCommand_instances.add(this);
20
22
  __classPrivateFieldGet(this, _ConnectionUseCommand_instances, "m", _ConnectionUseCommand_initOptions).call(this);
23
+ __classPrivateFieldGet(this, _ConnectionUseCommand_instances, "m", _ConnectionUseCommand_initTelemetry).call(this);
24
+ __classPrivateFieldGet(this, _ConnectionUseCommand_instances, "m", _ConnectionUseCommand_initTypes).call(this);
21
25
  }
22
26
  async commandAction(logger, args) {
23
- const connection = await auth.getConnection(args.options.name);
27
+ let connection;
28
+ if (args.options.name) {
29
+ connection = await auth.getConnection(args.options.name);
30
+ }
31
+ else {
32
+ const connections = await auth.getAllConnections();
33
+ connections.sort((a, b) => a.name.localeCompare(b.name));
34
+ const keyValuePair = formatting.convertArrayToHashTable('name', connections);
35
+ connection = await cli.handleMultipleResultsFound('Please select the connection you want to activate.', keyValuePair);
36
+ }
24
37
  if (this.verbose) {
25
38
  await logger.logToStderr(`Switching to connection '${connection.identityName}', appId: ${connection.appId}, tenantId: ${connection.identityTenantId}...`);
26
39
  }
@@ -42,10 +55,18 @@ class ConnectionUseCommand extends Command {
42
55
  await this.commandAction(logger, args);
43
56
  }
44
57
  }
45
- _ConnectionUseCommand_instances = new WeakSet(), _ConnectionUseCommand_initOptions = function _ConnectionUseCommand_initOptions() {
58
+ _ConnectionUseCommand_instances = new WeakSet(), _ConnectionUseCommand_initTelemetry = function _ConnectionUseCommand_initTelemetry() {
59
+ this.telemetry.push((args) => {
60
+ Object.assign(this.telemetryProperties, {
61
+ name: typeof args.options.name !== 'undefined'
62
+ });
63
+ });
64
+ }, _ConnectionUseCommand_initOptions = function _ConnectionUseCommand_initOptions() {
46
65
  this.options.unshift({
47
- option: '-n, --name <name>'
66
+ option: '-n, --name [name]'
48
67
  });
68
+ }, _ConnectionUseCommand_initTypes = function _ConnectionUseCommand_initTypes() {
69
+ this.types.string.push('name');
49
70
  };
50
71
  export default new ConnectionUseCommand();
51
72
  //# sourceMappingURL=connection-use.js.map
@@ -0,0 +1,123 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _EntraEnterpriseAppRemoveCommand_instances, _EntraEnterpriseAppRemoveCommand_initTelemetry, _EntraEnterpriseAppRemoveCommand_initOptions, _EntraEnterpriseAppRemoveCommand_initValidators, _EntraEnterpriseAppRemoveCommand_initOptionSets, _EntraEnterpriseAppRemoveCommand_initTypes;
7
+ import { cli } from '../../../../cli/cli.js';
8
+ import request from '../../../../request.js';
9
+ import { odata } from '../../../../utils/odata.js';
10
+ import { formatting } from '../../../../utils/formatting.js';
11
+ import { validation } from '../../../../utils/validation.js';
12
+ import GraphCommand from '../../../base/GraphCommand.js';
13
+ import commands from '../../commands.js';
14
+ class EntraEnterpriseAppRemoveCommand extends GraphCommand {
15
+ get name() {
16
+ return commands.ENTERPRISEAPP_REMOVE;
17
+ }
18
+ get description() {
19
+ return 'Deletes an enterprise application (or service principal)';
20
+ }
21
+ alias() {
22
+ return [commands.SP_REMOVE];
23
+ }
24
+ constructor() {
25
+ super();
26
+ _EntraEnterpriseAppRemoveCommand_instances.add(this);
27
+ __classPrivateFieldGet(this, _EntraEnterpriseAppRemoveCommand_instances, "m", _EntraEnterpriseAppRemoveCommand_initTelemetry).call(this);
28
+ __classPrivateFieldGet(this, _EntraEnterpriseAppRemoveCommand_instances, "m", _EntraEnterpriseAppRemoveCommand_initOptions).call(this);
29
+ __classPrivateFieldGet(this, _EntraEnterpriseAppRemoveCommand_instances, "m", _EntraEnterpriseAppRemoveCommand_initValidators).call(this);
30
+ __classPrivateFieldGet(this, _EntraEnterpriseAppRemoveCommand_instances, "m", _EntraEnterpriseAppRemoveCommand_initOptionSets).call(this);
31
+ __classPrivateFieldGet(this, _EntraEnterpriseAppRemoveCommand_instances, "m", _EntraEnterpriseAppRemoveCommand_initTypes).call(this);
32
+ }
33
+ async commandAction(logger, args) {
34
+ const removeEnterpriseApplication = async () => {
35
+ if (this.verbose) {
36
+ await logger.logToStderr(`Removing enterprise application ${args.options.id || args.options.displayName || args.options.objectId}...`);
37
+ }
38
+ try {
39
+ let url = `${this.resource}/v1.0`;
40
+ if (args.options.id) {
41
+ url += `/servicePrincipals(appId='${args.options.id}')`;
42
+ }
43
+ else {
44
+ const id = await this.getSpId(args.options);
45
+ url += `/servicePrincipals/${id}`;
46
+ }
47
+ const requestOptions = {
48
+ url: url,
49
+ headers: {
50
+ accept: 'application/json;odata.metadata=none'
51
+ },
52
+ responseType: 'json'
53
+ };
54
+ await request.delete(requestOptions);
55
+ }
56
+ catch (err) {
57
+ this.handleRejectedODataJsonPromise(err);
58
+ }
59
+ };
60
+ if (args.options.force) {
61
+ await removeEnterpriseApplication();
62
+ }
63
+ else {
64
+ const result = await cli.promptForConfirmation({ message: `Are you sure you want to remove enterprise application '${args.options.id || args.options.displayName || args.options.objectId}'?` });
65
+ if (result) {
66
+ await removeEnterpriseApplication();
67
+ }
68
+ }
69
+ }
70
+ async getSpId(options) {
71
+ if (options.objectId) {
72
+ return options.objectId;
73
+ }
74
+ const spItemsResponse = await odata.getAllItems(`${this.resource}/v1.0/servicePrincipals?$filter=displayName eq '${formatting.encodeQueryParameter(options.displayName)}'&$select=id`);
75
+ if (spItemsResponse.length === 0) {
76
+ throw `The specified enterprise application does not exist.`;
77
+ }
78
+ if (spItemsResponse.length > 1) {
79
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', spItemsResponse);
80
+ const result = await cli.handleMultipleResultsFound(`Multiple enterprise applications with name '${options.displayName}' found.`, resultAsKeyValuePair);
81
+ return result.id;
82
+ }
83
+ const spItem = spItemsResponse[0];
84
+ return spItem.id;
85
+ }
86
+ }
87
+ _EntraEnterpriseAppRemoveCommand_instances = new WeakSet(), _EntraEnterpriseAppRemoveCommand_initTelemetry = function _EntraEnterpriseAppRemoveCommand_initTelemetry() {
88
+ this.telemetry.push((args) => {
89
+ Object.assign(this.telemetryProperties, {
90
+ id: typeof args.options.id !== 'undefined',
91
+ displayName: typeof args.options.displayName !== 'undefined',
92
+ objectId: typeof args.options.objectId !== 'undefined',
93
+ force: !!args.options.force
94
+ });
95
+ });
96
+ }, _EntraEnterpriseAppRemoveCommand_initOptions = function _EntraEnterpriseAppRemoveCommand_initOptions() {
97
+ this.options.unshift({
98
+ option: '-i, --id [id]'
99
+ }, {
100
+ option: '-n, --displayName [displayName]'
101
+ }, {
102
+ option: '--objectId [objectId]'
103
+ }, {
104
+ option: '-f, --force'
105
+ });
106
+ }, _EntraEnterpriseAppRemoveCommand_initValidators = function _EntraEnterpriseAppRemoveCommand_initValidators() {
107
+ this.validators.push(async (args) => {
108
+ if (args.options.id && !validation.isValidGuid(args.options.id)) {
109
+ return `The option 'id' with value '${args.options.id}' is not a valid GUID.`;
110
+ }
111
+ if (args.options.objectId && !validation.isValidGuid(args.options.objectId)) {
112
+ return `The option 'objectId' with value '${args.options.objectId}' is not a valid GUID.`;
113
+ }
114
+ return true;
115
+ });
116
+ }, _EntraEnterpriseAppRemoveCommand_initOptionSets = function _EntraEnterpriseAppRemoveCommand_initOptionSets() {
117
+ this.optionSets.push({ options: ['id', 'displayName', 'objectId'] });
118
+ }, _EntraEnterpriseAppRemoveCommand_initTypes = function _EntraEnterpriseAppRemoveCommand_initTypes() {
119
+ this.types.string.push('id', 'displayName', 'objectId');
120
+ this.types.boolean.push('force');
121
+ };
122
+ export default new EntraEnterpriseAppRemoveCommand();
123
+ //# sourceMappingURL=enterpriseapp-remove.js.map
@@ -0,0 +1,256 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _EntraGroupSetCommand_instances, _EntraGroupSetCommand_initTelemetry, _EntraGroupSetCommand_initOptions, _EntraGroupSetCommand_initValidators, _EntraGroupSetCommand_initOptionSets, _EntraGroupSetCommand_initTypes;
7
+ import GraphCommand from '../../../base/GraphCommand.js';
8
+ import commands from '../../commands.js';
9
+ import { validation } from '../../../../utils/validation.js';
10
+ import request from '../../../../request.js';
11
+ import { entraUser } from '../../../../utils/entraUser.js';
12
+ import { entraGroup } from '../../../../utils/entraGroup.js';
13
+ import { formatting } from '../../../../utils/formatting.js';
14
+ import { odata } from '../../../../utils/odata.js';
15
+ class EntraGroupSetCommand extends GraphCommand {
16
+ get name() {
17
+ return commands.GROUP_SET;
18
+ }
19
+ get description() {
20
+ return 'Updates a Microsoft Entra group';
21
+ }
22
+ constructor() {
23
+ super();
24
+ _EntraGroupSetCommand_instances.add(this);
25
+ this.allowedVisibility = ['Public', 'Private'];
26
+ __classPrivateFieldGet(this, _EntraGroupSetCommand_instances, "m", _EntraGroupSetCommand_initTelemetry).call(this);
27
+ __classPrivateFieldGet(this, _EntraGroupSetCommand_instances, "m", _EntraGroupSetCommand_initOptions).call(this);
28
+ __classPrivateFieldGet(this, _EntraGroupSetCommand_instances, "m", _EntraGroupSetCommand_initValidators).call(this);
29
+ __classPrivateFieldGet(this, _EntraGroupSetCommand_instances, "m", _EntraGroupSetCommand_initOptionSets).call(this);
30
+ __classPrivateFieldGet(this, _EntraGroupSetCommand_instances, "m", _EntraGroupSetCommand_initTypes).call(this);
31
+ }
32
+ async commandAction(logger, args) {
33
+ let groupId = args.options.id;
34
+ try {
35
+ if (args.options.displayName) {
36
+ if (this.verbose) {
37
+ await logger.logToStderr(`Retrieving group id...`);
38
+ }
39
+ groupId = await entraGroup.getGroupIdByDisplayName(args.options.displayName);
40
+ }
41
+ const requestOptions = {
42
+ url: `${this.resource}/v1.0/groups/${groupId}`,
43
+ headers: {
44
+ accept: 'application/json;odata.metadata=none'
45
+ },
46
+ data: {
47
+ displayName: args.options.newDisplayName,
48
+ description: args.options.description === '' ? null : args.options.description,
49
+ mailNickName: args.options.mailNickname,
50
+ visibility: args.options.visibility
51
+ }
52
+ };
53
+ await request.patch(requestOptions);
54
+ const ownerIds = await this.getUserIds(logger, args.options.ownerIds, args.options.ownerUserNames);
55
+ if (ownerIds.length !== 0) {
56
+ await this.updateUsers(logger, groupId, 'owners', ownerIds);
57
+ }
58
+ else if (this.verbose) {
59
+ await logger.logToStderr(`No owners to update.`);
60
+ }
61
+ const memberIds = await this.getUserIds(logger, args.options.memberIds, args.options.memberUserNames);
62
+ if (memberIds.length !== 0) {
63
+ await this.updateUsers(logger, groupId, 'members', memberIds);
64
+ }
65
+ else if (this.verbose) {
66
+ await logger.logToStderr(`No members to update.`);
67
+ }
68
+ }
69
+ catch (err) {
70
+ this.handleRejectedODataJsonPromise(err);
71
+ }
72
+ }
73
+ ;
74
+ async getUserIds(logger, userIds, userNames) {
75
+ if (userIds) {
76
+ return formatting.splitAndTrim(userIds);
77
+ }
78
+ if (userNames) {
79
+ if (this.verbose) {
80
+ await logger.logToStderr(`Retrieving user IDs...`);
81
+ }
82
+ return entraUser.getUserIdsByUpns(formatting.splitAndTrim(userNames));
83
+ }
84
+ return [];
85
+ }
86
+ async updateUsers(logger, groupId, role, userIds) {
87
+ const groupUsers = await odata.getAllItems(`${this.resource}/v1.0/groups/${groupId}/${role}/microsoft.graph.user?$select=id`);
88
+ const userIdsToAdd = userIds.filter(userId => !groupUsers.some(groupUser => groupUser.id === userId));
89
+ const userIdsToRemove = groupUsers.filter(groupUser => !userIds.some(userId => groupUser.id === userId)).map(user => user.id);
90
+ if (this.verbose) {
91
+ await logger.logToStderr(`Adding ${userIdsToAdd.length} ${role}...`);
92
+ }
93
+ for (let i = 0; i < userIdsToAdd.length; i += 400) {
94
+ const userIdsBatch = userIdsToAdd.slice(i, i + 400);
95
+ const batchRequestOptions = this.getBatchRequestOptions();
96
+ // only 20 requests per one batch are allowed
97
+ for (let j = 0; j < userIdsBatch.length; j += 20) {
98
+ // only 20 users can be added in one request
99
+ const userIdsChunk = userIdsBatch.slice(j, j + 20);
100
+ batchRequestOptions.data.requests.push({
101
+ id: j + 1,
102
+ method: 'PATCH',
103
+ url: `/groups/${groupId}`,
104
+ headers: {
105
+ 'content-type': 'application/json;odata.metadata=none',
106
+ accept: 'application/json;odata.metadata=none'
107
+ },
108
+ body: {
109
+ [`${role}@odata.bind`]: userIdsChunk.map(u => `${this.resource}/v1.0/directoryObjects/${u}`)
110
+ }
111
+ });
112
+ }
113
+ const res = await request.post(batchRequestOptions);
114
+ for (const response of res.responses) {
115
+ if (response.status !== 204) {
116
+ throw response.body;
117
+ }
118
+ }
119
+ }
120
+ if (this.verbose) {
121
+ await logger.logToStderr(`Removing ${userIdsToRemove.length} ${role}...`);
122
+ }
123
+ for (let i = 0; i < userIdsToRemove.length; i += 20) {
124
+ const userIdsBatch = userIdsToRemove.slice(i, i + 20);
125
+ const batchRequestOptions = this.getBatchRequestOptions();
126
+ userIdsBatch.map(userId => {
127
+ batchRequestOptions.data.requests.push({
128
+ id: userId,
129
+ method: 'DELETE',
130
+ url: `/groups/${groupId}/${role}/${userId}/$ref`
131
+ });
132
+ });
133
+ const res = await request.post(batchRequestOptions);
134
+ for (const response of res.responses) {
135
+ if (response.status !== 204) {
136
+ throw response.body;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ getBatchRequestOptions() {
142
+ const requestOptions = {
143
+ url: `${this.resource}/v1.0/$batch`,
144
+ headers: {
145
+ 'content-type': 'application/json;odata.metadata=none',
146
+ accept: 'application/json;odata.metadata=none'
147
+ },
148
+ responseType: 'json',
149
+ data: {
150
+ requests: []
151
+ }
152
+ };
153
+ return requestOptions;
154
+ }
155
+ }
156
+ _EntraGroupSetCommand_instances = new WeakSet(), _EntraGroupSetCommand_initTelemetry = function _EntraGroupSetCommand_initTelemetry() {
157
+ this.telemetry.push((args) => {
158
+ Object.assign(this.telemetryProperties, {
159
+ id: typeof args.options.id !== 'undefined',
160
+ displayName: typeof args.options.displayName !== 'undefined',
161
+ newDisplayName: typeof args.options.newDisplayName !== 'undefined',
162
+ description: typeof args.options.description !== 'undefined',
163
+ mailNickname: typeof args.options.mailNickname !== 'undefined',
164
+ ownerIds: typeof args.options.ownerIds !== 'undefined',
165
+ ownerUserNames: typeof args.options.ownerUserNames !== 'undefined',
166
+ memberIds: typeof args.options.memberIds !== 'undefined',
167
+ memberUserNames: typeof args.options.memberUserNames !== 'undefined',
168
+ visibility: typeof args.options.visibility !== 'undefined'
169
+ });
170
+ });
171
+ }, _EntraGroupSetCommand_initOptions = function _EntraGroupSetCommand_initOptions() {
172
+ this.options.unshift({
173
+ option: '-i, --id [id]'
174
+ }, {
175
+ option: '--mailNickname [mailNickname]'
176
+ }, {
177
+ option: '-n, --displayName [displayName]'
178
+ }, {
179
+ option: '--newDisplayName [newDisplayName]'
180
+ }, {
181
+ option: '--description [description]'
182
+ }, {
183
+ option: '--ownerIds [ownerIds]'
184
+ }, {
185
+ option: '--ownerUserNames [ownerUserNames]'
186
+ }, {
187
+ option: '--memberIds [memberIds]'
188
+ }, {
189
+ option: '--memberUserNames [memberUserNames]'
190
+ }, {
191
+ option: '--visibility [visibility]',
192
+ autocomplete: this.allowedVisibility
193
+ });
194
+ }, _EntraGroupSetCommand_initValidators = function _EntraGroupSetCommand_initValidators() {
195
+ this.validators.push(async (args) => {
196
+ if (args.options.id && !validation.isValidGuid(args.options.id)) {
197
+ return `Value '${args.options.id}' is not a valid GUID for option 'id'.`;
198
+ }
199
+ if (args.options.newDisplayName && args.options.newDisplayName.length > 256) {
200
+ return `The maximum amount of characters for 'newDisplayName' is 256.`;
201
+ }
202
+ if (args.options.mailNickname) {
203
+ if (!validation.isValidMailNickname(args.options.mailNickname)) {
204
+ return `Value '${args.options.mailNickname}' for option 'mailNickname' must contain only characters in the ASCII character set 0-127 except the following: @ () \ [] " ; : <> , SPACE.`;
205
+ }
206
+ if (args.options.mailNickname.length > 64) {
207
+ return `The maximum amount of characters for 'mailNickname' is 64.`;
208
+ }
209
+ }
210
+ if (args.options.ownerIds) {
211
+ const isValidGUIDArrayResult = validation.isValidGuidArray(args.options.ownerIds);
212
+ if (isValidGUIDArrayResult !== true) {
213
+ return `The following GUIDs are invalid for option 'ownerIds': ${isValidGUIDArrayResult}.`;
214
+ }
215
+ }
216
+ if (args.options.ownerUserNames) {
217
+ const isValidUPNArrayResult = validation.isValidUserPrincipalNameArray(args.options.ownerUserNames);
218
+ if (isValidUPNArrayResult !== true) {
219
+ return `The following user principal names are invalid for option 'ownerUserNames': ${isValidUPNArrayResult}.`;
220
+ }
221
+ }
222
+ if (args.options.memberIds) {
223
+ const isValidGUIDArrayResult = validation.isValidGuidArray(args.options.memberIds);
224
+ if (isValidGUIDArrayResult !== true) {
225
+ return `The following GUIDs are invalid for option 'memberIds': ${isValidGUIDArrayResult}.`;
226
+ }
227
+ }
228
+ if (args.options.memberUserNames) {
229
+ const isValidUPNArrayResult = validation.isValidUserPrincipalNameArray(args.options.memberUserNames);
230
+ if (isValidUPNArrayResult !== true) {
231
+ return `The following user principal names are invalid for option 'memberUserNames': ${isValidUPNArrayResult}.`;
232
+ }
233
+ }
234
+ if (args.options.visibility && !this.allowedVisibility.includes(args.options.visibility)) {
235
+ return `Option 'visibility' must be one of the following values: ${this.allowedVisibility.join(', ')}.`;
236
+ }
237
+ if (args.options.newDisplayName === undefined && args.options.description === undefined && args.options.visibility === undefined
238
+ && args.options.ownerIds === undefined && args.options.ownerUserNames === undefined && args.options.memberIds === undefined
239
+ && args.options.memberUserNames === undefined && args.options.mailNickname === undefined) {
240
+ return `Specify at least one of the following options: 'newDisplayName', 'description', 'visibility', 'ownerIds', 'ownerUserNames', 'memberIds', 'memberUserNames', 'mailNickname'.`;
241
+ }
242
+ return true;
243
+ });
244
+ }, _EntraGroupSetCommand_initOptionSets = function _EntraGroupSetCommand_initOptionSets() {
245
+ this.optionSets.push({ options: ['id', 'displayName'] }, {
246
+ options: ['ownerIds', 'ownerUserNames'],
247
+ runsWhen: (args) => args.options.ownerIds || args.options.ownerUserNames
248
+ }, {
249
+ options: ['memberIds', 'memberUserNames'],
250
+ runsWhen: (args) => args.options.memberIds || args.options.memberUserNames
251
+ });
252
+ }, _EntraGroupSetCommand_initTypes = function _EntraGroupSetCommand_initTypes() {
253
+ this.types.string.push('id', 'displayName', 'newDisplayName', 'description', 'mailNickname', 'ownerIds', 'ownerUserNames', 'memberIds', 'memberUserNames', 'visibility');
254
+ };
255
+ export default new EntraGroupSetCommand();
256
+ //# sourceMappingURL=group-set.js.map