@pnp/cli-microsoft365 6.5.0-beta.f8b8018 → 6.6.0-beta.f3b4299

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 +2 -0
  2. package/dist/Command.js +17 -7
  3. package/dist/cli/Cli.js +15 -11
  4. package/dist/m365/cli/commands/config/config-set.js +1 -0
  5. package/dist/m365/commands/request.js +18 -1
  6. package/dist/m365/pa/commands/app/app-export.js +197 -0
  7. package/dist/m365/pa/commands.js +1 -0
  8. package/dist/m365/purview/commands/threatassessment/threatassessment-get.js +79 -0
  9. package/dist/m365/purview/commands.js +2 -1
  10. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.17.0.js +23 -0
  11. package/dist/m365/spfx/commands/project/project-doctor.js +2 -1
  12. package/dist/m365/spfx/commands/project/project-upgrade/{upgrade-1.17.0-rc.1.js → upgrade-1.17.0.js} +26 -26
  13. package/dist/m365/spfx/commands/project/project-upgrade.js +13 -15
  14. package/dist/m365/spfx/commands/spfx-doctor.js +15 -0
  15. package/dist/m365/spo/commands/file/file-move.js +1 -1
  16. package/dist/m365/spo/commands/file/file-retentionlabel-ensure.js +22 -1
  17. package/dist/m365/spo/commands/listitem/listitem-get.js +21 -6
  18. package/dist/m365/spo/commands/listitem/listitem-retentionlabel-ensure.js +35 -1
  19. package/dist/m365/spo/commands/web/web-set.js +33 -13
  20. package/dist/settingsNames.js +2 -1
  21. package/docs/docs/_clisettings.md +1 -0
  22. package/docs/docs/cmd/aad/o365group/o365group-add.md +3 -3
  23. package/docs/docs/cmd/pa/app/app-export.md +52 -0
  24. package/docs/docs/cmd/purview/threatassessment/threatassessment-get.md +191 -0
  25. package/docs/docs/cmd/request.md +10 -4
  26. package/docs/docs/cmd/spfx/project/project-upgrade.md +2 -2
  27. package/docs/docs/cmd/spo/file/file-retentionlabel-ensure.md +12 -1
  28. package/docs/docs/cmd/spo/listitem/listitem-get.md +14 -5
  29. package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-ensure.md +15 -2
  30. package/npm-shrinkwrap.json +460 -273
  31. package/package.json +11 -11
@@ -467,6 +467,21 @@ class SpfxDoctorCommand extends base_project_command_1.BaseProjectCommand {
467
467
  range: '^4',
468
468
  fix: 'npm i -g yo@4'
469
469
  }
470
+ },
471
+ '1.17.0': {
472
+ gulpCli: {
473
+ range: '^1 || ^2',
474
+ fix: 'npm i -g gulp-cli@2'
475
+ },
476
+ node: {
477
+ range: '>=16.13.0 <17.0.0',
478
+ fix: 'Install Node.js >=16.13.0 <17.0.0'
479
+ },
480
+ sp: SharePointVersion.SPO,
481
+ yo: {
482
+ range: '^4',
483
+ fix: 'npm i -g yo@4'
484
+ }
470
485
  }
471
486
  };
472
487
  __classPrivateFieldGet(this, _SpfxDoctorCommand_instances, "m", _SpfxDoctorCommand_initTelemetry).call(this);
@@ -147,7 +147,7 @@ class SpoFileMoveCommand extends SpoCommand_1.default {
147
147
  yield Cli_1.Cli.executeCommand(removeCommand, { options: Object.assign(Object.assign({}, removeOptions), { _: [] }) });
148
148
  }
149
149
  catch (err) {
150
- if (err.error !== undefined && err.error.message !== undefined && err.error.message.includes('does not exist')) {
150
+ if (err !== undefined && err.message !== undefined && err.message.includes('does not exist')) {
151
151
  }
152
152
  else {
153
153
  throw err;
@@ -42,6 +42,9 @@ class SpoFileRetentionLabelEnsureCommand extends SpoCommand_1.default {
42
42
  return __awaiter(this, void 0, void 0, function* () {
43
43
  try {
44
44
  const fileProperties = yield this.getFileProperties(logger, args);
45
+ if (args.options.assetId) {
46
+ yield this.applyAssetId(args.options.webUrl, fileProperties.ListItemAllFields.ParentList.Id, fileProperties.ListItemAllFields.Id, args.options.assetId);
47
+ }
45
48
  const options = {
46
49
  webUrl: args.options.webUrl,
47
50
  listId: fileProperties.ListItemAllFields.ParentList.Id,
@@ -84,12 +87,28 @@ class SpoFileRetentionLabelEnsureCommand extends SpoCommand_1.default {
84
87
  return yield request_1.default.get(requestOptions);
85
88
  });
86
89
  }
90
+ applyAssetId(webUrl, listId, listItemId, assetId) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ const requestUrl = `${webUrl}/_api/web/lists(guid'${formatting_1.formatting.encodeQueryParameter(listId)}')`;
93
+ const requestBody = { "formValues": [{ "FieldName": "ComplianceAssetId", "FieldValue": assetId }] };
94
+ const requestOptions = {
95
+ url: `${requestUrl}/items(${listItemId})/ValidateUpdateListItem()`,
96
+ headers: {
97
+ 'accept': 'application/json;odata=nometadata'
98
+ },
99
+ data: requestBody,
100
+ responseType: 'json'
101
+ };
102
+ yield request_1.default.post(requestOptions);
103
+ });
104
+ }
87
105
  }
88
106
  _SpoFileRetentionLabelEnsureCommand_instances = new WeakSet(), _SpoFileRetentionLabelEnsureCommand_initTelemetry = function _SpoFileRetentionLabelEnsureCommand_initTelemetry() {
89
107
  this.telemetry.push((args) => {
90
108
  Object.assign(this.telemetryProperties, {
91
109
  fileUrl: typeof args.options.fileUrl !== 'undefined',
92
- fileId: typeof args.options.fileId !== 'undefined'
110
+ fileId: typeof args.options.fileId !== 'undefined',
111
+ assetId: typeof args.options.assetId !== 'undefined'
93
112
  });
94
113
  });
95
114
  }, _SpoFileRetentionLabelEnsureCommand_initOptions = function _SpoFileRetentionLabelEnsureCommand_initOptions() {
@@ -101,6 +120,8 @@ _SpoFileRetentionLabelEnsureCommand_instances = new WeakSet(), _SpoFileRetention
101
120
  option: '--fileUrl [fileUrl]'
102
121
  }, {
103
122
  option: '-i, --fileId [fileId]'
123
+ }, {
124
+ option: '-a, --assetId [assetId]'
104
125
  });
105
126
  }, _SpoFileRetentionLabelEnsureCommand_initValidators = function _SpoFileRetentionLabelEnsureCommand_initValidators() {
106
127
  this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
@@ -58,8 +58,14 @@ class SpoListItemGetCommand extends SpoCommand_1.default {
58
58
  const propertiesToExpand = propertiesWithSlash.map(e => e.split('/')[0]);
59
59
  const expandPropertiesArray = propertiesToExpand.filter((item, pos) => propertiesToExpand.indexOf(item) === pos);
60
60
  const fieldExpand = expandPropertiesArray.length > 0 ? `&$expand=${expandPropertiesArray.join(",")}` : ``;
61
+ if (args.options.id) {
62
+ requestUrl += `/items(${args.options.id})`;
63
+ }
64
+ else {
65
+ requestUrl += `/GetItemByUniqueId(guid'${args.options.uniqueId}')`;
66
+ }
61
67
  const requestOptions = {
62
- url: `${requestUrl}/items(${args.options.id})?$select=${formatting_1.formatting.encodeQueryParameter(propertiesSelect.join(","))}${fieldExpand}`,
68
+ url: `${requestUrl}?$select=${formatting_1.formatting.encodeQueryParameter(propertiesSelect.join(","))}${fieldExpand}`,
63
69
  headers: {
64
70
  'accept': 'application/json;odata=nometadata'
65
71
  },
@@ -68,7 +74,7 @@ class SpoListItemGetCommand extends SpoCommand_1.default {
68
74
  try {
69
75
  const itemProperties = yield request_1.default.get(requestOptions);
70
76
  if (args.options.withPermissions) {
71
- requestOptions.url = `${requestUrl}/items(${args.options.id})/RoleAssignments?$expand=Member,RoleDefinitionBindings`;
77
+ requestOptions.url = `${requestUrl}/RoleAssignments?$expand=Member,RoleDefinitionBindings`;
72
78
  const response = yield request_1.default.get(requestOptions);
73
79
  response.value.forEach((r) => {
74
80
  r.RoleDefinitionBindings = formatting_1.formatting.setFriendlyPermissions(r.RoleDefinitionBindings);
@@ -90,6 +96,8 @@ _SpoListItemGetCommand_instances = new WeakSet(), _SpoListItemGetCommand_initTel
90
96
  listId: typeof args.options.listId !== 'undefined',
91
97
  listTitle: typeof args.options.listTitle !== 'undefined',
92
98
  listUrl: typeof args.options.listUrl !== 'undefined',
99
+ id: typeof args.options.id !== 'undefined',
100
+ uniqueId: typeof args.options.uniqueId !== 'undefined',
93
101
  withPermissions: !!args.options.withPermissions
94
102
  });
95
103
  });
@@ -97,7 +105,9 @@ _SpoListItemGetCommand_instances = new WeakSet(), _SpoListItemGetCommand_initTel
97
105
  this.options.unshift({
98
106
  option: '-u, --webUrl <webUrl>'
99
107
  }, {
100
- option: '-i, --id <id>'
108
+ option: '-i, --id [id]'
109
+ }, {
110
+ option: '--uniqueId [uniqueId]'
101
111
  }, {
102
112
  option: '-l, --listId [listId]'
103
113
  }, {
@@ -119,15 +129,20 @@ _SpoListItemGetCommand_instances = new WeakSet(), _SpoListItemGetCommand_initTel
119
129
  !validation_1.validation.isValidGuid(args.options.listId)) {
120
130
  return `${args.options.listId} in option listId is not a valid GUID`;
121
131
  }
122
- if (isNaN(parseInt(args.options.id))) {
132
+ if (args.options.id &&
133
+ isNaN(parseInt(args.options.id))) {
123
134
  return `${args.options.id} is not a number`;
124
135
  }
136
+ if (args.options.uniqueId &&
137
+ !validation_1.validation.isValidGuid(args.options.uniqueId)) {
138
+ return `${args.options.uniqueId} in option uniqueId is not a valid GUID`;
139
+ }
125
140
  return true;
126
141
  }));
127
142
  }, _SpoListItemGetCommand_initTypes = function _SpoListItemGetCommand_initTypes() {
128
- this.types.string.push('webUrl', 'listId', 'listTitle', 'id', 'properties');
143
+ this.types.string.push('webUrl', 'listId', 'listTitle', 'id', 'uniqueId', 'properties');
129
144
  }, _SpoListItemGetCommand_initOptionSets = function _SpoListItemGetCommand_initOptionSets() {
130
- this.optionSets.push({ options: ['listId', 'listTitle', 'listUrl'] });
145
+ this.optionSets.push({ options: ['listId', 'listTitle', 'listUrl'] }, { options: ['id', 'uniqueId'] });
131
146
  };
132
147
  module.exports = new SpoListItemGetCommand();
133
148
  //# sourceMappingURL=listitem-get.js.map
@@ -42,6 +42,9 @@ class SpoListItemRetentionLabelEnsureCommand extends SpoCommand_1.default {
42
42
  return __awaiter(this, void 0, void 0, function* () {
43
43
  try {
44
44
  const labelInformation = yield this.getLabelInformation(args.options, logger);
45
+ if (args.options.assetId) {
46
+ yield this.applyAssetId(args.options, logger);
47
+ }
45
48
  yield this.applyLabel(args.options, labelInformation, logger);
46
49
  }
47
50
  catch (err) {
@@ -106,6 +109,34 @@ class SpoListItemRetentionLabelEnsureCommand extends SpoCommand_1.default {
106
109
  yield request_1.default.post(requestOptions);
107
110
  });
108
111
  }
112
+ applyAssetId(options, logger) {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ if (this.verbose) {
115
+ logger.logToStderr(`Applying the asset Id ${options.assetId}...`);
116
+ }
117
+ let requestUrl = `${options.webUrl}/_api/web`;
118
+ if (options.listId) {
119
+ requestUrl += `/lists(guid'${formatting_1.formatting.encodeQueryParameter(options.listId)}')/items(${options.listItemId})/ValidateUpdateListItem()`;
120
+ }
121
+ else if (options.listTitle) {
122
+ requestUrl += `/lists/getByTitle('${formatting_1.formatting.encodeQueryParameter(options.listTitle)}')/items(${options.listItemId})/ValidateUpdateListItem()`;
123
+ }
124
+ else if (options.listUrl) {
125
+ const listServerRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(options.webUrl, options.listUrl);
126
+ requestUrl += `/GetList(@listUrl)/items(${options.listItemId})/ValidateUpdateListItem()?@listUrl='${formatting_1.formatting.encodeQueryParameter(listServerRelativeUrl)}'`;
127
+ }
128
+ const requestBody = { "formValues": [{ "FieldName": "ComplianceAssetId", "FieldValue": options.assetId }] };
129
+ const requestOptions = {
130
+ url: requestUrl,
131
+ headers: {
132
+ 'accept': 'application/json;odata=nometadata'
133
+ },
134
+ data: requestBody,
135
+ responseType: 'json'
136
+ };
137
+ yield request_1.default.post(requestOptions);
138
+ });
139
+ }
109
140
  }
110
141
  _SpoListItemRetentionLabelEnsureCommand_instances = new WeakSet(), _SpoListItemRetentionLabelEnsureCommand_initTelemetry = function _SpoListItemRetentionLabelEnsureCommand_initTelemetry() {
111
142
  this.telemetry.push((args) => {
@@ -114,7 +145,8 @@ _SpoListItemRetentionLabelEnsureCommand_instances = new WeakSet(), _SpoListItemR
114
145
  listTitle: typeof args.options.listTitle !== 'undefined',
115
146
  listUrl: typeof args.options.listUrl !== 'undefined',
116
147
  name: typeof args.options.name !== 'undefined',
117
- id: typeof args.options.id !== 'undefined'
148
+ id: typeof args.options.id !== 'undefined',
149
+ assetId: typeof args.options.assetId !== 'undefined'
118
150
  });
119
151
  });
120
152
  }, _SpoListItemRetentionLabelEnsureCommand_initOptions = function _SpoListItemRetentionLabelEnsureCommand_initOptions() {
@@ -132,6 +164,8 @@ _SpoListItemRetentionLabelEnsureCommand_instances = new WeakSet(), _SpoListItemR
132
164
  option: '-n, --name [name]'
133
165
  }, {
134
166
  option: '-i, --id [id]'
167
+ }, {
168
+ option: '-a, --assetId [assetId]'
135
169
  });
136
170
  }, _SpoListItemRetentionLabelEnsureCommand_initValidators = function _SpoListItemRetentionLabelEnsureCommand_initValidators() {
137
171
  this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
@@ -69,20 +69,37 @@ class SpoWebSetCommand extends SpoCommand_1.default {
69
69
  const searchScope = args.options.searchScope.toLowerCase();
70
70
  payload.SearchScope = SpoWebSetCommand.searchScopeOptions.indexOf(searchScope);
71
71
  }
72
- const requestOptions = {
73
- url: `${args.options.url}/_api/web`,
74
- headers: {
75
- 'content-type': 'application/json;odata=nometadata',
76
- accept: 'application/json;odata=nometadata'
77
- },
78
- responseType: 'json',
79
- data: payload
80
- };
81
- if (this.verbose) {
82
- logger.logToStderr(`Updating properties of subsite ${args.options.url}...`);
83
- }
84
72
  try {
73
+ const requestOptions = {
74
+ url: `${args.options.url}/_api/web`,
75
+ headers: {
76
+ 'content-type': 'application/json;odata=nometadata',
77
+ accept: 'application/json;odata=nometadata'
78
+ },
79
+ responseType: 'json',
80
+ data: payload
81
+ };
82
+ if (this.verbose) {
83
+ logger.logToStderr(`Updating properties of subsite ${args.options.url}...`);
84
+ }
85
85
  yield request_1.default.patch(requestOptions);
86
+ if (typeof args.options.welcomePage !== 'undefined') {
87
+ if (this.verbose) {
88
+ logger.logToStderr(`Setting welcome page to: ${args.options.welcomePage}...`);
89
+ }
90
+ const requestOptions = {
91
+ url: `${args.options.url}/_api/web/RootFolder`,
92
+ headers: {
93
+ 'content-type': 'application/json;odata=nometadata',
94
+ accept: 'application/json;odata=nometadata'
95
+ },
96
+ responseType: 'json',
97
+ data: {
98
+ WelcomePage: args.options.welcomePage
99
+ }
100
+ };
101
+ yield request_1.default.patch(requestOptions);
102
+ }
86
103
  }
87
104
  catch (err) {
88
105
  this.handleRejectedODataJsonPromise(err);
@@ -105,7 +122,8 @@ _SpoWebSetCommand_instances = new WeakSet(), _SpoWebSetCommand_initTelemetry = f
105
122
  quickLaunchEnabled: typeof args.options.quickLaunchEnabled !== 'undefined',
106
123
  footerEnabled: typeof args.options.footerEnabled !== 'undefined',
107
124
  navAudienceTargetingEnabled: typeof args.options.navAudienceTargetingEnabled !== 'undefined',
108
- searchScope: args.options.searchScope !== 'undefined'
125
+ searchScope: typeof args.options.searchScope !== 'undefined',
126
+ welcomePage: typeof args.options.welcomePage !== 'undefined'
109
127
  });
110
128
  this.trackUnknownOptions(this.telemetryProperties, args.options);
111
129
  });
@@ -139,6 +157,8 @@ _SpoWebSetCommand_instances = new WeakSet(), _SpoWebSetCommand_initTelemetry = f
139
157
  }, {
140
158
  option: '--searchScope [searchScope]',
141
159
  autocomplete: SpoWebSetCommand.searchScopeOptions
160
+ }, {
161
+ option: '--welcomePage [welcomePage]'
142
162
  });
143
163
  }, _SpoWebSetCommand_initTypes = function _SpoWebSetCommand_initTypes() {
144
164
  this.types.boolean.push('megaMenuEnabled', 'footerEnabled', 'quickLaunchEnabled', 'navAudienceTargetingEnabled');
@@ -15,7 +15,8 @@ const settingsNames = {
15
15
  output: 'output',
16
16
  printErrorsAsPlainText: 'printErrorsAsPlainText',
17
17
  prompt: 'prompt',
18
- showHelpOnFailure: 'showHelpOnFailure'
18
+ showHelpOnFailure: 'showHelpOnFailure',
19
+ showSpinner: 'showSpinner'
19
20
  };
20
21
  exports.settingsNames = settingsNames;
21
22
  //# sourceMappingURL=settingsNames.js.map
@@ -18,3 +18,4 @@ Setting name|Definition|Default value
18
18
  `printErrorsAsPlainText`|When output mode is set to `json`, print error messages as plain-text rather than JSON|`true`
19
19
  `prompt`|Prompts for missing values in required options|`false`
20
20
  `showHelpOnFailure`|Automatically display help when executing a command failed|`true`
21
+ `showSpinner`|Display spinner when executing commands|`true`
@@ -48,7 +48,7 @@ m365 aad o365group add [options]
48
48
  ## Remarks
49
49
 
50
50
  When specifying the path to the logo image you can use both relative and absolute paths. Note, that ~ in the path, will not be resolved and will most likely result in an error.
51
- If an invalid user is provided in the comma-separated list or Owners or Members, the command operation will fail and the Micrsoft 365 Group will not be created.
51
+ If an invalid user is provided in the comma-separated list of Owners or Members, the command operation will fail and the Microsoft 365 Group will not be created.
52
52
 
53
53
  ## Examples
54
54
 
@@ -76,13 +76,13 @@ Create a public Microsoft 365 Group and set specified users as its members
76
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
77
  ```
78
78
 
79
- Create a public Microsoft 365 Group and allows only group members to be able to post conversations to the group.
79
+ Create a public Microsoft 365 Group and allow only group members to be able to post conversations to the group.
80
80
 
81
81
  ```sh
82
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
83
  ```
84
84
 
85
- Create a public Microsoft 365 Group and hides it from the Outlook experiences (web and client).
85
+ Create a public Microsoft 365 Group and hide it from the Outlook experiences (web and client).
86
86
 
87
87
  ```sh
88
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
@@ -0,0 +1,52 @@
1
+ # pa app export
2
+
3
+ Exports the specified Power App
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 pa app export [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ `-i, --id <id>`
14
+ : The id of the Power App to export
15
+
16
+ `-e, --environment <environment>`
17
+ : The name of the environment for which to export the app
18
+
19
+ `-n, --packageDisplayName [packageDisplayName]`
20
+ : The display name to use in the exported package
21
+
22
+ `-d, --packageDescription [packageDescription]`
23
+ : The description to use in the exported package
24
+
25
+ `-c, --packageCreatedBy [packageCreatedBy]`
26
+ : The name of the person to be used as the creator of the exported package
27
+
28
+ `-s, --packageSourceEnvironment [packageSourceEnvironment]`
29
+ : The name of the source environment from which the exported package was taken
30
+
31
+ `-p, --path [path]`
32
+ : The path to save the exported package to. If not specified the app will be exported in the current working directory
33
+
34
+ --8<-- "docs/cmd/_global.md"
35
+
36
+ ## Examples
37
+
38
+ Export the specified Power App as a ZIP file
39
+
40
+ ```sh
41
+ m365 pa app export --environment Default-d87a7535-dd31-4437-bfe1-95340acd55c5 --id 3989cb59-ce1a-4a5c-bb78-257c5c39381d
42
+ ```
43
+
44
+ Export the specified Power App as a ZIP file with the package displayname, package description, the one who created it, the package source environment and the path
45
+
46
+ ```sh
47
+ m365 pa app export --environment Default-d87a7535-dd31-4437-bfe1-95340acd55c5 --id 3989cb59-ce1a-4a5c-bb78-257c5c39381d --packageDisplayName "PowerApp" --packageDescription "Power App Description" --packageCreatedBy "John Doe" --packageSourceEnvironment "Contoso" --path "C:/Users/John/Documents"
48
+ ```
49
+
50
+ ## Response
51
+
52
+ The command won't return a response on success.
@@ -0,0 +1,191 @@
1
+ # purview threatassessment get
2
+
3
+ Get a threat assessment
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 purview threatassessment get [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ `-i, --id <id>`
14
+ : The Id of the threat assessment
15
+
16
+ `--includeResults`
17
+ : Include the threat assessment results
18
+
19
+ --8<-- "docs/cmd/_global.md"
20
+
21
+ ## Examples
22
+
23
+ Get a threat assessment
24
+
25
+ ```sh
26
+ m365 purview threatassessment get --id c37d695e-d581-4ae9-82a0-9364eba4291e
27
+ ```
28
+
29
+ Get a threat assessment including results
30
+
31
+ ```sh
32
+ m365 purview threatassessment get --id c37d695e-d581-4ae9-82a0-9364eba4291e --includeResults
33
+ ```
34
+
35
+ ## Response
36
+
37
+ ### Standard Response
38
+
39
+ === "JSON"
40
+
41
+ ```json
42
+ {
43
+ "id": "8aaba0ac-ec4d-4e62-5774-08db16c68731",
44
+ "createdDateTime": "2023-02-25T00:23:33.0550644Z",
45
+ "contentType": "mail",
46
+ "expectedAssessment": "block",
47
+ "category": "spam",
48
+ "status": "pending",
49
+ "requestSource": "administrator",
50
+ "recipientEmail": "john@contoso.com",
51
+ "destinationRoutingReason": "notJunk",
52
+ "messageUri": "https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E_hLMK5kAALHNaMuAAA=",
53
+ "createdBy": {
54
+ "user": {
55
+ "id": "fe36f75e-c103-410b-a18a-2bf6df06ac3a",
56
+ "displayName": "John Doe"
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+ === "Text"
63
+
64
+ ```text
65
+ category : spam
66
+ contentType : mail
67
+ createdBy : {"user":{"id":"fe36f75e-c103-410b-a18a-2bf6df06ac3a","displayName":"John Doe"}}
68
+ createdDateTime : 2023-02-25T00:23:33.0550644Z
69
+ destinationRoutingReason: notJunk
70
+ expectedAssessment : block
71
+ id : 8aaba0ac-ec4d-4e62-5774-08db16c68731
72
+ messageUri : https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E_hLMK5kAALHNaMuAAA=
73
+ recipientEmail : john@contoso.com
74
+ requestSource : administrator
75
+ status : pending
76
+ ```
77
+
78
+ === "CSV"
79
+
80
+ ```csv
81
+ id,createdDateTime,contentType,expectedAssessment,category,status,requestSource,recipientEmail,destinationRoutingReason,messageUri,createdBy
82
+ 8aaba0ac-ec4d-4e62-5774-08db16c68731,2023-02-25T00:23:33.0550644Z,mail,block,spam,pending,administrator,john@contoso.com,notJunk,https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E_hLMK5kAALHNaMuAAA=,"{""user"":{""id"":""fe36f75e-c103-410b-a18a-2bf6df06ac3a"",""displayName"":""John Doe""}}"
83
+ ```
84
+
85
+ === "Markdown"
86
+
87
+ ```md
88
+ # purview threatassessment get --id "8aaba0ac-ec4d-4e62-5774-08db16c68731"
89
+
90
+ Date: 25/02/2023
91
+
92
+ ## 8aaba0ac-ec4d-4e62-5774-08db16c68731
93
+
94
+ Property | Value
95
+ ---------|-------
96
+ id | 8aaba0ac-ec4d-4e62-5774-08db16c68731
97
+ createdDateTime | 2023-02-25T00:23:33.0550644Z
98
+ contentType | mail
99
+ expectedAssessment | block
100
+ category | spam
101
+ status | pending
102
+ requestSource | administrator
103
+ recipientEmail | john@contoso.com
104
+ destinationRoutingReason | notJunk
105
+ messageUri | https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E\_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E\_hLMK5kAALHNaMuAAA=
106
+ createdBy | {"user":{"id":"fe36f75e-c103-410b-a18a-2bf6df06ac3a","displayName":"John Doe"}}
107
+ ```
108
+
109
+ ### `includeResults` response
110
+
111
+ When we make use of the option `includeResults` the response will differ.
112
+
113
+ === "JSON"
114
+
115
+ ```json
116
+ {
117
+ "id": "8aaba0ac-ec4d-4e62-5774-08db16c68731",
118
+ "createdDateTime": "2023-02-25T00:23:33.0550644Z",
119
+ "contentType": "mail",
120
+ "expectedAssessment": "block",
121
+ "category": "spam",
122
+ "status": "pending",
123
+ "requestSource": "administrator",
124
+ "recipientEmail": "john@contoso.com",
125
+ "destinationRoutingReason": "notJunk",
126
+ "messageUri": "https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E_hLMK5kAALHNaMuAAA=",
127
+ "createdBy": {
128
+ "user": {
129
+ "id": "fe36f75e-c103-410b-a18a-2bf6df06ac3a",
130
+ "displayName": "John Doe"
131
+ }
132
+ },
133
+ "results": [
134
+ {
135
+ "id": "a5455871-18d1-44d8-0866-08db16c68b85",
136
+ "createdDateTime": "2023-02-25T00:23:40.28Z",
137
+ "resultType": "checkPolicy",
138
+ "message": "No policy was hit."
139
+ }
140
+ ]
141
+ }
142
+ ```
143
+
144
+ === "Text"
145
+
146
+ ```text
147
+ category : spam
148
+ contentType : mail
149
+ createdBy : {"user":{"id":"fe36f75e-c103-410b-a18a-2bf6df06ac3a","displayName":"John Doe"}}
150
+ createdDateTime : 2023-02-25T00:23:33.0550644Z
151
+ destinationRoutingReason: notJunk
152
+ expectedAssessment : block
153
+ id : 8aaba0ac-ec4d-4e62-5774-08db16c68731
154
+ messageUri : https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E_hLMK5kAALHNaMuAAA=
155
+ recipientEmail : john@contoso.com
156
+ requestSource : administrator
157
+ results : [{"id":"a5455871-18d1-44d8-0866-08db16c68b85","createdDateTime":"2023-02-25T00:23:40.28Z","resultType":"checkPolicy","message":"No policy was hit."}]
158
+ status : pending
159
+ ```
160
+
161
+ === "CSV"
162
+
163
+ ```csv
164
+ id,createdDateTime,contentType,expectedAssessment,category,status,requestSource,recipientEmail,destinationRoutingReason,messageUri,createdBy,results
165
+ 8aaba0ac-ec4d-4e62-5774-08db16c68731,2023-02-25T00:23:33.0550644Z,mail,block,spam,pending,administrator,john@contoso.com,notJunk,https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E_hLMK5kAALHNaMuAAA=,"{""user"":{""id"":""fe36f75e-c103-410b-a18a-2bf6df06ac3a"",""displayName"":""John Doe""}}","[{""id"":""a5455871-18d1-44d8-0866-08db16c68b85"",""createdDateTime"":""2023-02-25T00:23:40.28Z"",""resultType"":""checkPolicy"",""message"":""No policy was hit.""}]"
166
+ ```
167
+
168
+ === "Markdown"
169
+
170
+ ```md
171
+ # purview threatassessment get --id "8aaba0ac-ec4d-4e62-5774-08db16c68731" --includeResults "true"
172
+
173
+ Date: 25/02/2023
174
+
175
+ ## 8aaba0ac-ec4d-4e62-5774-08db16c68731
176
+
177
+ Property | Value
178
+ ---------|-------
179
+ id | 8aaba0ac-ec4d-4e62-5774-08db16c68731
180
+ createdDateTime | 2023-02-25T00:23:33.0550644Z
181
+ contentType | mail
182
+ expectedAssessment | block
183
+ category | spam
184
+ status | pending
185
+ requestSource | administrator
186
+ recipientEmail | john@contoso.com
187
+ destinationRoutingReason | notJunk
188
+ messageUri | https://graph.microsoft.com/v1.0/users/john@contoso.com/messages/AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E\_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E\_hLMK5kAALHNaMuAAA=
189
+ createdBy | {"user":{"id":"fe36f75e-c103-410b-a18a-2bf6df06ac3a","displayName":"John Doe"}}
190
+ results | [{"id":"a5455871-18d1-44d8-0866-08db16c68b85","createdDateTime":"2023-02-25T00:23:40.28Z","resultType":"checkPolicy","message":"No policy was hit."}]
191
+ ```
@@ -40,6 +40,12 @@ If you specify the `resource` option, the CLI will try to retrieve a valid token
40
40
 
41
41
  Specify additional headers by typing them as options, for example: `--content-type "application/json"`, `--if-match "*"`, `--x-requestdigest "somedigest"`.
42
42
 
43
+ You can simplify the request by using tokens for the `url` option. Following tokens are available:
44
+
45
+ - `@graph` resolves to `https://graph.microsoft.com/v1.0`
46
+ - `@graphbeta` resolves to `https://graph.microsoft.com/beta`
47
+ - `@spo` resolves to the current SharePoint URL if available. You can set a SharePoint URL using the [spo set](./spo/spo-set.md) command.
48
+
43
49
  !!! important
44
50
  When building the request, depending on the shell you use, you might need to escape all `$` characters in the URL, request headers, and the body. If you don't do it, the shell will treat it as a variable and will remove the following word from the request, breaking the request.
45
51
 
@@ -63,16 +69,16 @@ Call the SharePoint API to retrieve a form digest.
63
69
  m365 request --method post --url "https://contoso.sharepoint.com/sites/project-x/_api/contextinfo"
64
70
  ```
65
71
 
66
- Call the SharePoint API to update a site title.
72
+ Call the SharePoint API to update a site title using the @spo token.
67
73
 
68
74
  ```sh
69
- m365 request --method post --url "https://contoso.sharepoint.com/sites/project-x/_api/web" --body '{ "Title": "New title" }' --content-type "application/json" --x-http-method "PATCH"
75
+ m365 request --method post --url "@spo/sites/project-x/_api/web" --body '{ "Title": "New title" }' --content-type "application/json" --x-http-method "PATCH"
70
76
  ```
71
77
 
72
- Call the Microsoft Graph to get a profile photo.
78
+ Call the Microsoft Graph to get a profile photo using the @graphbeta token.
73
79
 
74
80
  ```sh
75
- m365 request --url "https://graph.microsoft.com/beta/me/photo/\$value" --filePath ./profile-pic.jpg
81
+ m365 request --url '@graphbeta/me/photo/$value' --filePath ./profile-pic.jpg
76
82
  ```
77
83
 
78
84
  ## Response
@@ -29,13 +29,13 @@ m365 spfx project upgrade [options]
29
29
 
30
30
  ## Remarks
31
31
 
32
- 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.16.1).
32
+ 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.17.0).
33
33
 
34
34
  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.
35
35
 
36
36
  !!! important
37
37
  Run this command in the folder where the project that you want to upgrade is located. This command doesn't change your project files.
38
-
38
+
39
39
  ## Examples
40
40
 
41
41
  Get instructions to upgrade the current SharePoint Framework project to SharePoint Framework version 1.5.0 and save the findings in a Markdown file
@@ -22,12 +22,17 @@ m365 spo file retentionlabel ensure [options]
22
22
  `--name <name>`
23
23
  : Name of the retention label to apply to the file.
24
24
 
25
+ `-a, --assetId [assetId]`
26
+ : A Compliance Asset Id to set on the item when it's labeled. See below for more information.
27
+
25
28
  --8<-- "docs/cmd/_global.md"
26
29
 
27
30
  ## Remarks
28
31
 
29
32
  You can also use [spo listitem retentionlabel remove](./../../../cmd/spo//listitem/listitem-retentionlabel-remove.md) for removing the retentionlabel from a listitem.
30
33
 
34
+ The `--assetId` option has to do with event-based retention. Event-based retention is about starting a retention period when a specific event occurs, instead of the moment a document was labeled or created.
35
+
31
36
  ## Examples
32
37
 
33
38
  Applies a retention label to a file based on the label name and the fileUrl
@@ -39,7 +44,13 @@ m365 spo file retentionlabel ensure --webUrl https://contoso.sharepoint.com/site
39
44
  Applies a retention label to a file based on the label name and the fileId
40
45
 
41
46
  ```sh
42
- m365 spo file retentionlabel ensure --webUrl https://contoso.sharepoint.com/sites/project-x --fileId '26541f96-017c-4189-a604-599e083533b8' --name 'Some label'
47
+ m365 spo file retentionlabel ensure --webUrl https://contoso.sharepoint.com/sites/project-x --fileId '26541f96-017c-4189-a604-599e083533b8' --name 'Some label'
48
+ ```
49
+
50
+ Applies a event-based retention label to a file and updates the Asset Id field
51
+
52
+ ```sh
53
+ m365 spo file retentionlabel ensure --webUrl https://contoso.sharepoint.com/sites/project-x --fileId '26541f96-017c-4189-a604-599e083533b8' --name 'Some label' --assetId 'XYZ'
43
54
  ```
44
55
 
45
56
  ## Response