@pnp/cli-microsoft365 5.1.0-beta.55e5dfb → 5.1.0-beta.efdacec

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 (31) hide show
  1. package/.eslintrc.js +1 -0
  2. package/dist/cli/index.js +5 -1
  3. package/dist/m365/aad/commands/app/app-add.js +68 -10
  4. package/dist/m365/aad/commands/app/app-role-delete.js +1 -1
  5. package/dist/m365/aad/commands/o365group/o365group-add.js +39 -1
  6. package/dist/m365/aad/commands/o365group/o365group-conversation-post-list.js +87 -0
  7. package/dist/m365/aad/commands.js +1 -0
  8. package/dist/m365/base/PowerPlatformCommand.js +10 -0
  9. package/dist/m365/pp/commands/managementapp/managementapp-add.js +98 -0
  10. package/dist/m365/pp/commands.js +7 -0
  11. package/dist/m365/spfx/commands/project/model/index.js +5 -1
  12. package/dist/m365/spfx/commands/project/project-externalize/index.js +5 -1
  13. package/dist/m365/spfx/commands/project/project-externalize/rules/index.js +5 -1
  14. package/dist/m365/spfx/commands/project/project-upgrade/index.js +5 -1
  15. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN001033_DEP_tslib.js +14 -0
  16. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN023002_GITIGNORE_heft.js +40 -0
  17. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.15.0-beta.1.js +63 -0
  18. package/dist/m365/spfx/commands/project/project-upgrade.js +24 -19
  19. package/dist/m365/spo/commands/site/site-recyclebinitem-restore.js +66 -0
  20. package/dist/m365/spo/commands.js +1 -0
  21. package/dist/m365/teams/commands/chat/chat-message-send.js +50 -58
  22. package/dist/utils/formatting.js +3 -0
  23. package/dist/utils/index.js +5 -1
  24. package/docs/docs/cmd/aad/o365group/o365group-add.md +42 -6
  25. package/docs/docs/cmd/aad/o365group/o365group-conversation-post-list.md +36 -0
  26. package/docs/docs/cmd/pp/managementapp/managementapp-add.md +50 -0
  27. package/docs/docs/cmd/spfx/project/project-upgrade.md +1 -1
  28. package/docs/docs/cmd/spo/site/site-recyclebinitem-restore.md +27 -0
  29. package/docs/docs/cmd/teams/chat/chat-message-send.md +4 -4
  30. package/npm-shrinkwrap.json +173 -188
  31. package/package.json +10 -10
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const fs = require("fs");
4
4
  const os = require("os");
5
5
  const path = require("path");
6
+ // uncomment to support upgrading to preview releases
7
+ const semver_1 = require("semver");
6
8
  const Command_1 = require("../../../../Command");
7
9
  const commands_1 = require("../../commands");
8
10
  const base_project_command_1 = require("./base-project-command");
@@ -43,7 +45,8 @@ class SpfxProjectUpgradeCommand extends base_project_command_1.BaseProjectComman
43
45
  '1.12.1',
44
46
  '1.13.0',
45
47
  '1.13.1',
46
- '1.14.0'
48
+ '1.14.0',
49
+ '1.15.0-beta.1'
47
50
  ];
48
51
  }
49
52
  get name() {
@@ -56,9 +59,9 @@ class SpfxProjectUpgradeCommand extends base_project_command_1.BaseProjectComman
56
59
  const telemetryProps = super.getTelemetryProperties(args);
57
60
  telemetryProps.toVersion = args.options.toVersion || this.supportedVersions[this.supportedVersions.length - 1];
58
61
  // uncomment to support upgrading to preview releases
59
- // if (prerelease(telemetryProps.toVersion) && !args.options.preview) {
60
- // telemetryProps.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
61
- // }
62
+ if ((0, semver_1.prerelease)(telemetryProps.toVersion) && !args.options.preview) {
63
+ telemetryProps.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
64
+ }
62
65
  telemetryProps.packageManager = args.options.packageManager || 'npm';
63
66
  telemetryProps.shell = args.options.shell || 'bash';
64
67
  telemetryProps.preview = args.options.preview;
@@ -72,15 +75,15 @@ class SpfxProjectUpgradeCommand extends base_project_command_1.BaseProjectComman
72
75
  }
73
76
  this.toVersion = args.options.toVersion ? args.options.toVersion : this.supportedVersions[this.supportedVersions.length - 1];
74
77
  // uncomment to support upgrading to preview releases
75
- // if (!args.options.toVersion &&
76
- // !args.options.preview &&
77
- // prerelease(this.toVersion)) {
78
- // // no version and no preview specified while the current version to
79
- // // upgrade to is a prerelease so let's grab the first non-preview version
80
- // // since we're supporting only one preview version, it's sufficient for
81
- // // us to take second to last version
82
- // this.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
83
- // }
78
+ if (!args.options.toVersion &&
79
+ !args.options.preview &&
80
+ (0, semver_1.prerelease)(this.toVersion)) {
81
+ // no version and no preview specified while the current version to
82
+ // upgrade to is a prerelease so let's grab the first non-preview version
83
+ // since we're supporting only one preview version, it's sufficient for
84
+ // us to take second to last version
85
+ this.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
86
+ }
84
87
  this.packageManager = args.options.packageManager || 'npm';
85
88
  this.shell = args.options.shell || 'bash';
86
89
  if (this.supportedVersions.indexOf(this.toVersion) < 0) {
@@ -501,11 +504,11 @@ ${f.resolution}
501
504
  },
502
505
  {
503
506
  option: '--packageManager [packageManager]',
504
- autocomplete: ['npm', 'pnpm', 'yarn']
507
+ autocomplete: SpfxProjectUpgradeCommand.packageManagers
505
508
  },
506
509
  {
507
510
  option: '--shell [shell]',
508
- autocomplete: ['bash', 'powershell', 'cmd']
511
+ autocomplete: SpfxProjectUpgradeCommand.shells
509
512
  },
510
513
  {
511
514
  option: '--preview'
@@ -521,18 +524,20 @@ ${f.resolution}
521
524
  }
522
525
  validate(args) {
523
526
  if (args.options.packageManager) {
524
- if (['npm', 'pnpm', 'yarn'].indexOf(args.options.packageManager) < 0) {
525
- return `${args.options.packageManager} is not a supported package manager. Supported package managers are npm, pnpm and yarn`;
527
+ if (SpfxProjectUpgradeCommand.packageManagers.indexOf(args.options.packageManager) < 0) {
528
+ return `${args.options.packageManager} is not a supported package manager. Supported package managers are ${SpfxProjectUpgradeCommand.packageManagers.join(', ')}`;
526
529
  }
527
530
  }
528
531
  if (args.options.shell) {
529
- if (['bash', 'powershell', 'logger'].indexOf(args.options.shell) < 0) {
530
- return `${args.options.shell} is not a supported shell. Supported shells are bash, powershell and cmd`;
532
+ if (SpfxProjectUpgradeCommand.shells.indexOf(args.options.shell) < 0) {
533
+ return `${args.options.shell} is not a supported shell. Supported shells are ${SpfxProjectUpgradeCommand.shells.join(', ')}`;
531
534
  }
532
535
  }
533
536
  return true;
534
537
  }
535
538
  }
539
+ SpfxProjectUpgradeCommand.packageManagers = ['npm', 'pnpm', 'yarn'];
540
+ SpfxProjectUpgradeCommand.shells = ['bash', 'powershell', 'cmd'];
536
541
  SpfxProjectUpgradeCommand.packageCommands = {
537
542
  npm: {
538
543
  install: 'npm i -SE',
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const request_1 = require("../../../../request");
4
+ const utils_1 = require("../../../../utils");
5
+ const SpoCommand_1 = require("../../../base/SpoCommand");
6
+ const commands_1 = require("../../commands");
7
+ class SpoSiteRecycleBinItemRestoreCommand extends SpoCommand_1.default {
8
+ get name() {
9
+ return commands_1.default.SITE_RECYCLEBINITEM_RESTORE;
10
+ }
11
+ get description() {
12
+ return 'Restores given items from the site recycle bin';
13
+ }
14
+ commandAction(logger, args, cb) {
15
+ if (this.verbose) {
16
+ logger.logToStderr(`Restoring items from recycle bin at ${args.options.siteUrl}...`);
17
+ }
18
+ const requestUrl = `${args.options.siteUrl}/_api/site/RecycleBin/RestoreByIds`;
19
+ const ids = utils_1.formatting.splitAndTrim(args.options.ids);
20
+ const idsChunks = [];
21
+ while (ids.length) {
22
+ idsChunks.push(ids.splice(0, 20));
23
+ }
24
+ Promise.all(idsChunks.map((idsChunk) => {
25
+ const requestOptions = {
26
+ url: requestUrl,
27
+ headers: {
28
+ 'accept': 'application/json;odata=nometadata',
29
+ 'content-type': 'application/json'
30
+ },
31
+ responseType: 'json',
32
+ data: {
33
+ ids: idsChunk
34
+ }
35
+ };
36
+ return request_1.default.post(requestOptions);
37
+ })).then(_ => cb(), (rawRes) => this.handleRejectedODataJsonPromise(rawRes, logger, cb));
38
+ }
39
+ options() {
40
+ const options = [
41
+ {
42
+ option: '-u, --siteUrl <siteUrl>'
43
+ },
44
+ {
45
+ option: '-i, --ids <ids>'
46
+ }
47
+ ];
48
+ const parentOptions = super.options();
49
+ return options.concat(parentOptions);
50
+ }
51
+ validate(args) {
52
+ const isValidSharePointUrl = utils_1.validation.isValidSharePointUrl(args.options.siteUrl);
53
+ if (isValidSharePointUrl !== true) {
54
+ return isValidSharePointUrl;
55
+ }
56
+ const invalidIds = utils_1.formatting
57
+ .splitAndTrim(args.options.ids)
58
+ .filter(id => !utils_1.validation.isValidGuid(id));
59
+ if (invalidIds.length > 0) {
60
+ return `The following IDs are invalid: ${invalidIds.join(', ')}`;
61
+ }
62
+ return true;
63
+ }
64
+ }
65
+ module.exports = new SpoSiteRecycleBinItemRestoreCommand();
66
+ //# sourceMappingURL=site-recyclebinitem-restore.js.map
@@ -185,6 +185,7 @@ exports.default = {
185
185
  SITE_LIST: `${prefix} site list`,
186
186
  SITE_INPLACERECORDSMANAGEMENT_SET: `${prefix} site inplacerecordsmanagement set`,
187
187
  SITE_RECYCLEBINITEM_LIST: `${prefix} site recyclebinitem list`,
188
+ SITE_RECYCLEBINITEM_RESTORE: `${prefix} site recyclebinitem restore`,
188
189
  SITE_REMOVE: `${prefix} site remove`,
189
190
  SITE_RENAME: `${prefix} site rename`,
190
191
  SITE_SET: `${prefix} site set`,
@@ -20,21 +20,22 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
20
20
  return commands_1.default.CHAT_MESSAGE_SEND;
21
21
  }
22
22
  get description() {
23
- return 'Send a message to an existing or new chat conversation.';
23
+ return 'Sends a chat message to a Microsoft Teams chat conversation.';
24
+ }
25
+ getTelemetryProperties(args) {
26
+ const telemetryProps = super.getTelemetryProperties(args);
27
+ telemetryProps.chatId = typeof args.options.chatId !== 'undefined';
28
+ telemetryProps.userEmails = typeof args.options.userEmails !== 'undefined';
29
+ telemetryProps.chatName = typeof args.options.chatName !== 'undefined';
30
+ return telemetryProps;
24
31
  }
25
32
  commandAction(logger, args, cb) {
26
- return __awaiter(this, void 0, void 0, function* () {
27
- try {
28
- const chatId = args.options.chatId
29
- || args.options.userEmails && (yield this.ensureChatIdByUserEmails(args.options.userEmails))
30
- || args.options.chatName && (yield this.getChatIdByName(args.options.chatName));
31
- yield this.sendChatMessage(chatId, args.options);
32
- cb();
33
- }
34
- catch (error) {
35
- this.handleRejectedODataJsonPromise(error, logger, cb);
36
- }
37
- });
33
+ this
34
+ .getChatId(logger, args)
35
+ .then(chatId => this.sendChatMessage(chatId, args))
36
+ .then(_ => {
37
+ cb();
38
+ }, (err) => this.handleRejectedODataJsonPromise(err, logger, cb));
38
39
  }
39
40
  options() {
40
41
  const options = [
@@ -78,36 +79,44 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
78
79
  return `${args.options.chatId} is not a valid Teams ChatId.`;
79
80
  }
80
81
  if (args.options.userEmails) {
81
- const userEmails = args.options.userEmails.toLowerCase().replace(/\s/g, '').split(',').filter(e => e && e !== '');
82
+ const userEmails = this.convertCommaSeparatedListToArray(args.options.userEmails);
82
83
  if (!userEmails || userEmails.length === 0 || userEmails.some(e => !utils_1.validation.isValidUserPrincipalName(e))) {
83
84
  return `${args.options.userEmails} contains one or more invalid email addresses.`;
84
85
  }
85
86
  }
86
87
  return true;
87
88
  }
88
- ensureChatIdByUserEmails(userEmailsOption) {
89
+ getChatId(logger, args) {
89
90
  return __awaiter(this, void 0, void 0, function* () {
90
- const userEmails = userEmailsOption.toLowerCase().replace(/\s/g, '').split(',').filter(e => e && e !== '');
91
+ if (args.options.chatId) {
92
+ return args.options.chatId;
93
+ }
94
+ return args.options.userEmails
95
+ ? this.ensureChatIdByUserEmails(args.options.userEmails, logger)
96
+ : this.getChatIdByName(args.options.chatName, logger);
97
+ });
98
+ }
99
+ ensureChatIdByUserEmails(userEmailsOption, logger) {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ const userEmails = this.convertCommaSeparatedListToArray(userEmailsOption);
91
102
  const currentUserEmail = utils_1.accessToken.getUserNameFromAccessToken(Auth_1.default.service.accessTokens[this.resource].accessToken).toLowerCase();
92
- const existingChats = yield this.findExistingGroupChatsByMembers([currentUserEmail, ...userEmails]);
93
- if (existingChats && existingChats.length > 0) {
94
- if (existingChats.length > 1) {
95
- const disambiguationText = existingChats.map(c => {
96
- return `- ${c.id}${c.topic && ' - '}${c.topic} - ${c.createdDateTime && new Date(c.createdDateTime).toLocaleString()}`;
97
- }).join(os.EOL);
98
- throw new Error(`Multiple chat conversations with this topic found. Please disambiguate:${os.EOL}${disambiguationText}`);
99
- }
100
- else {
101
- return existingChats[0].id;
102
- }
103
+ const existingChats = yield this.findExistingGroupChatsByMembers([currentUserEmail, ...userEmails], logger);
104
+ if (!existingChats || existingChats.length === 0) {
105
+ const chat = yield this.createConversation([currentUserEmail, ...userEmails]);
106
+ return chat.id;
103
107
  }
104
- const chat = yield this.createConversation([currentUserEmail, ...userEmails]);
105
- return chat.id;
108
+ if (existingChats.length === 1) {
109
+ return existingChats[0].id;
110
+ }
111
+ const disambiguationText = existingChats.map(c => {
112
+ return `- ${c.id}${c.topic && ' - '}${c.topic} - ${c.createdDateTime && new Date(c.createdDateTime).toLocaleString()}`;
113
+ }).join(os.EOL);
114
+ throw new Error(`Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`);
106
115
  });
107
116
  }
108
- getChatIdByName(chatName) {
117
+ getChatIdByName(chatName, logger) {
109
118
  return __awaiter(this, void 0, void 0, function* () {
110
- const existingChats = yield this.findExistingGroupChatsByTopic(chatName);
119
+ const existingChats = yield this.findExistingGroupChatsByName(chatName, logger);
111
120
  if (!existingChats || existingChats.length === 0) {
112
121
  throw new Error('No chat conversation was found with this name.');
113
122
  }
@@ -118,7 +127,7 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
118
127
  const memberstring = c.members.map(m => m.email).join(', ');
119
128
  return `- ${c.id} - ${c.createdDateTime && new Date(c.createdDateTime).toLocaleString()} - ${memberstring}`;
120
129
  }).join(os.EOL);
121
- throw new Error(`Multiple chat conversations with this topic found. Please disambiguate:${os.EOL}${disambiguationText}`);
130
+ throw new Error(`Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`);
122
131
  });
123
132
  }
124
133
  // This Microsoft Graph API request throws an intermittent 404 exception, saying that it cannot find the principal.
@@ -159,7 +168,7 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
159
168
  }
160
169
  });
161
170
  }
162
- sendChatMessage(chatId, options) {
171
+ sendChatMessage(chatId, args) {
163
172
  return __awaiter(this, void 0, void 0, function* () {
164
173
  const requestOptions = {
165
174
  url: `${this.resource}/v1.0/chats/${chatId}/messages`,
@@ -170,18 +179,18 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
170
179
  responseType: 'json',
171
180
  data: {
172
181
  body: {
173
- content: options.message
182
+ content: args.options.message
174
183
  }
175
184
  }
176
185
  };
177
186
  yield request_1.default.post(requestOptions);
178
187
  });
179
188
  }
180
- findExistingGroupChatsByMembers(expectedMemberEmails) {
189
+ findExistingGroupChatsByMembers(expectedMemberEmails, logger) {
181
190
  return __awaiter(this, void 0, void 0, function* () {
182
191
  const endpoint = `${this.resource}/v1.0/chats?$filter=chatType eq 'group'&$expand=members&$select=id,topic,createdDateTime,members`;
183
192
  const foundChats = [];
184
- const chats = yield this.getAllChats(endpoint, []);
193
+ const chats = yield utils_1.odata.getAllItems(endpoint, logger);
185
194
  for (const chat of chats) {
186
195
  const chatMembers = chat.members;
187
196
  if (chatMembers.length === expectedMemberEmails.length) {
@@ -194,31 +203,14 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
194
203
  return foundChats;
195
204
  });
196
205
  }
197
- findExistingGroupChatsByTopic(topic) {
206
+ findExistingGroupChatsByName(name, logger) {
198
207
  return __awaiter(this, void 0, void 0, function* () {
199
- const endpoint = `${this.resource}/v1.0/chats?$filter=topic eq '${encodeURIComponent(topic)}'&$expand=members&$select=id,topic,createdDateTime,chatType`;
200
- const chats = yield this.getAllChats(endpoint, []);
201
- return chats;
208
+ const endpoint = `${this.resource}/v1.0/chats?$filter=topic eq '${encodeURIComponent(name)}'&$expand=members&$select=id,topic,createdDateTime,chatType`;
209
+ return utils_1.odata.getAllItems(endpoint, logger);
202
210
  });
203
211
  }
204
- getAllChats(url, items) {
205
- return __awaiter(this, void 0, void 0, function* () {
206
- const requestOptions = {
207
- url: url,
208
- headers: {
209
- accept: 'application/json;odata.metadata=none'
210
- },
211
- responseType: 'json'
212
- };
213
- const res = yield request_1.default.get(requestOptions);
214
- items = items.concat(res.value);
215
- if (res['@odata.nextLink']) {
216
- return yield this.getAllChats(res['@odata.nextLink'], items);
217
- }
218
- else {
219
- return items;
220
- }
221
- });
212
+ convertCommaSeparatedListToArray(userEmailsString) {
213
+ return userEmailsString.toLowerCase().replace(/\s/g, '').split(',').filter(e => e && e !== '');
222
214
  }
223
215
  }
224
216
  module.exports = new TeamsChatMessageSendCommand();
@@ -61,6 +61,9 @@ exports.formatting = {
61
61
  },
62
62
  removeSingleLineComments(s) {
63
63
  return stripJsonComments(s);
64
+ },
65
+ splitAndTrim(s) {
66
+ return s.split(',').map(c => c.trim());
64
67
  }
65
68
  };
66
69
  //# sourceMappingURL=formatting.js.map
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -1,6 +1,6 @@
1
1
  # aad o365group add
2
2
 
3
- Creates Microsoft 365 Group
3
+ Creates a Microsoft 365 Group
4
4
 
5
5
  ## Usage
6
6
 
@@ -28,6 +28,18 @@ m365 aad o365group add [options]
28
28
  `--isPrivate [isPrivate]`
29
29
  : Set to `true` if the Microsoft 365 Group should be private and to `false` if it should be public (default)
30
30
 
31
+ `--allowMembersToPost [allowMembersToPost]`
32
+ : Set if only group members should be able to post conversations to the group
33
+
34
+ `--hideGroupInOutlook [hideGroupInOutlook]`
35
+ : Set to hide the group in Outlook experiences
36
+
37
+ `--subscribeNewGroupMembers [subscribeNewGroupMembers]`
38
+ : Set to subscribe all new group members to receive group conversation emails when new messages are posted in the group
39
+
40
+ `--welcomeEmailDisabled [welcomeEmailDisabled]`
41
+ : Set to not send welcome emails to new group members
42
+
31
43
  `-l, --logoPath [logoPath]`
32
44
  : Local path to the image file to use as group logo
33
45
 
@@ -43,29 +55,53 @@ If an invalid user is provided in the comma-separated list or Owners or Members,
43
55
  Create a public Microsoft 365 Group
44
56
 
45
57
  ```sh
46
- m365 aad o365group add --displayName Finance --description 'This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more.' --mailNickname finance
58
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance
47
59
  ```
48
60
 
49
61
  Create a private Microsoft 365 Group
50
62
 
51
63
  ```sh
52
- m365 aad o365group add --displayName Finance --description 'This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more.' --mailNickname finance --isPrivate true
64
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --isPrivate true
53
65
  ```
54
66
 
55
67
  Create a public Microsoft 365 Group and set specified users as its owners
56
68
 
57
69
  ```sh
58
- m365 aad o365group add --displayName Finance --description 'This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more.' --mailNickname finance --owners "DebraB@contoso.onmicrosoft.com,DiegoS@contoso.onmicrosoft.com"
70
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --owners "DebraB@contoso.onmicrosoft.com,DiegoS@contoso.onmicrosoft.com"
59
71
  ```
60
72
 
61
73
  Create a public Microsoft 365 Group and set specified users as its members
62
74
 
63
75
  ```sh
64
- m365 aad o365group add --displayName Finance --description 'This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more.' --mailNickname finance --members "DebraB@contoso.onmicrosoft.com,DiegoS@contoso.onmicrosoft.com"
76
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --members "DebraB@contoso.onmicrosoft.com,DiegoS@contoso.onmicrosoft.com"
77
+ ```
78
+
79
+ Create a public Microsoft 365 Group and allows only group members to be able to post conversations to the group.
80
+
81
+ ```sh
82
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --allowMembersToPost
83
+ ```
84
+
85
+ Create a public Microsoft 365 Group and hides it from the Outlook experiences (web and client).
86
+
87
+ ```sh
88
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --hideGroupInOutlook
89
+ ```
90
+
91
+ Create a public Microsoft 365 Group and subscribe all new group members to receive group conversation emails when new messages are posted in the group.
92
+
93
+ ```sh
94
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --subscribeNewGroupMembers
95
+ ```
96
+
97
+ Create a public Microsoft 365 Group and set to not send welcome emails to new group members.
98
+
99
+ ```sh
100
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --welcomeEmailDisabled
65
101
  ```
66
102
 
67
103
  Create a public Microsoft 365 Group and set its logo
68
104
 
69
105
  ```sh
70
- m365 aad o365group add --displayName Finance --description 'This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more.' --mailNickname finance --logoPath images/logo.png
106
+ m365 aad o365group add --displayName Finance --description "This is the Contoso Finance Group. Please come here and check out the latest news, posts, files, and more." --mailNickname finance --logoPath images/logo.png
71
107
  ```
@@ -0,0 +1,36 @@
1
+ # aad o365group conversation post list
2
+
3
+ Lists conversation posts of a Microsoft 365 group
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 aad o365group conversation post list [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ `-i, --groupId [groupId]`
14
+ : The Id of the Office 365 Group. You can specify the groupId or groupDisplayName, but not both.
15
+
16
+ `-d, --groupDisplayName [groupDisplayName]`
17
+ : The Displayname of the Office 365 Group. You can specify the groupId or groupDisplayName, but not both.
18
+
19
+ `-t, --threadId <threadId>`
20
+ : The ID of the thread to retrieve details for
21
+
22
+ --8<-- "docs/cmd/_global.md"
23
+
24
+ ## Examples
25
+
26
+ Lists the posts of the specific conversation of Microsoft 365 group by groupId
27
+
28
+ ```sh
29
+ m365 aad o365group conversation post list --groupId '00000000-0000-0000-0000-000000000000' --threadId 'AAQkADkwN2Q2NDg1LWQ3ZGYtNDViZi1iNGRiLTVhYjJmN2Q5NDkxZQAQAOnRAfDf71lIvrdK85FAn5E='
30
+ ```
31
+
32
+ Lists the posts of the specific conversation of Microsoft 365 group by groupDisplayName
33
+
34
+ ```sh
35
+ m365 aad o365group conversation post list --groupDisplayName 'MyGroup' --threadId 'AAQkADkwN2Q2NDg1LWQ3ZGYtNDViZi1iNGRiLTVhYjJmN2Q5NDkxZQAQAOnRAfDf71lIvrdK85FAn5E='
36
+ ```
@@ -0,0 +1,50 @@
1
+ # pp managementapp add
2
+
3
+ Register management application for Power Platform
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 pp managementapp add [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ `--appId [appId]`
14
+ : Application (client) ID of the Azure AD application registration to register as a management app. Specify either `appId`, `objectId` or `name`
15
+
16
+ `--objectId [objectId]`
17
+ : Object ID of the Azure AD application registration to register as a management app. Specify either `appId`, `objectId` or `name`
18
+
19
+ `--name [name]`
20
+ : Name of the Azure AD application registration to register as a management app. Specify either `appId`, `objectId` or `name`
21
+
22
+ --8<-- "docs/cmd/_global.md"
23
+
24
+ ## Remarks
25
+
26
+ To execute this command the first time you'll need sign in using the Microsoft Azure PowerShell app registration. You can do this by executing `m365 login --appId 1950a258-227b-4e31-a9cf-717495945fc2`. To register the Azure AD app registration that CLI for Microsoft 365 uses by default, execute `m365 pp managementapp add--appId 31359c7f-bd7e-475c-86db-fdb8c937548e`.
27
+
28
+ For best performance use the `appId` option to reference the Azure AD application registration to update. If you use `objectId` or `name`, this command will first need to find the corresponding `appId` for that application.
29
+
30
+ If the command finds multiple Azure AD application registrations with the specified app name, it will prompt you to disambiguate which app it should use, listing the discovered object IDs.
31
+
32
+ ## Examples
33
+
34
+ Register CLI for Microsoft 365 as a management application for the Power Platform
35
+
36
+ ```sh
37
+ m365 pp managementapp add --appId 31359c7f-bd7e-475c-86db-fdb8c937548e
38
+ ```
39
+
40
+ Register Azure AD application with the specified object ID as a management application for the Power Platform
41
+
42
+ ```sh
43
+ m365 pp managementapp add --objectId d75be2e1-0204-4f95-857d-51a37cf40be8
44
+ ```
45
+
46
+ Register Azure AD application named _My app_ as a management application for the Power Platform
47
+
48
+ ```sh
49
+ m365 pp managementapp add --name "My app"
50
+ ```
@@ -32,7 +32,7 @@ m365 spfx project upgrade [options]
32
32
 
33
33
  ## Remarks
34
34
 
35
- The `spfx project upgrade` command helps you upgrade your SharePoint Framework project to the specified version. If no version is specified, the command will upgrade to the latest version of the SharePoint Framework it supports (v1.14.0).
35
+ The `spfx project upgrade` command helps you upgrade your SharePoint Framework project to the specified version. If no version is specified, the command will upgrade to the latest version of the SharePoint Framework it supports (v1.14.0). If you specify the `preview` option without a specific version, the command will upgrade your project to the latest preview version v1.15.0-beta.1.
36
36
 
37
37
  This command doesn't change your project files. Instead, it gives you a report with all steps necessary to upgrade your project to the specified version of the SharePoint Framework. Changing project files is error-prone, especially when it comes to updating your solution's code. This is why at this moment, this command produces a report that you can use yourself to perform the necessary updates and verify that everything is working as expected.
38
38
 
@@ -0,0 +1,27 @@
1
+ # spo site recyclebinitem restore
2
+
3
+ Restores given items from the site recycle bin
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 spo site recyclebinitem restore [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ `-u, --siteUrl <siteUrl>`
14
+ : URL of the site for which to restore the recycle bin items
15
+
16
+ `-i, --ids <ids>`
17
+ : List of ids of items which will be restored from the site recycle bin
18
+
19
+ --8<-- "docs/cmd/_global.md"
20
+
21
+ ## Examples
22
+
23
+ Restore specific items by given ids from recycle bin for site _https://contoso.sharepoint.com/site_
24
+
25
+ ```sh
26
+ m365 spo site recyclebinitem restore --siteUrl https://contoso.sharepoint.com/site --ids "ae6f97a7-280e-48d6-b481-0ea986c323da,aadbf916-1f71-42ee-abf2-8ee4802ae291"
27
+ ```
@@ -33,23 +33,23 @@ A new chat conversation will be created if no existing conversation with the par
33
33
  Send a message to a Microsoft Teams chat conversation by id
34
34
 
35
35
  ```sh
36
- m365 teams chat message send --chatId 19:2da4c29f6d7041eca70b638b43d45437@thread.v2
36
+ m365 teams chat message send --chatId 19:2da4c29f6d7041eca70b638b43d45437@thread.v2 --message "Welcome to Teams"
37
37
  ```
38
38
 
39
39
  Send a message to a single person
40
40
 
41
41
  ```sh
42
- m365 teams chat message send --userEmails alexw@contoso.com
42
+ m365 teams chat message send --userEmails alexw@contoso.com --message "Welcome to Teams"
43
43
  ```
44
44
 
45
45
  Send a message to a group of people
46
46
 
47
47
  ```sh
48
- m365 teams chat message send --userEmails alexw@contoso.com,meganb@contoso.com
48
+ m365 teams chat message send --userEmails alexw@contoso.com,meganb@contoso.com --message "Welcome to Teams"
49
49
  ```
50
50
 
51
51
  Send a message to a chat conversation finding it by display name
52
52
 
53
53
  ```sh
54
- m365 teams chat message send --chatName "Just a conversation"
54
+ m365 teams chat message send --chatName "Just a conversation" --message "Welcome to Teams"
55
55
  ```