@pnp/cli-microsoft365 6.7.0-beta.60f2469 → 6.7.0-beta.872b0f5

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.
@@ -18,6 +18,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  const Cli_1 = require("../../../../cli/Cli");
19
19
  const request_1 = require("../../../../request");
20
20
  const formatting_1 = require("../../../../utils/formatting");
21
+ const odata_1 = require("../../../../utils/odata");
21
22
  const spo_1 = require("../../../../utils/spo");
22
23
  const urlUtil_1 = require("../../../../utils/urlUtil");
23
24
  const validation_1 = require("../../../../utils/validation");
@@ -41,63 +42,94 @@ class SpoListItemListCommand extends SpoCommand_1.default {
41
42
  }
42
43
  commandAction(logger, args) {
43
44
  return __awaiter(this, void 0, void 0, function* () {
44
- let requestUrl = `${args.options.webUrl}/_api/web`;
45
+ let listApiUrl = `${args.options.webUrl}/_api/web`;
45
46
  if (args.options.listId) {
46
- requestUrl += `/lists(guid'${formatting_1.formatting.encodeQueryParameter(args.options.listId)}')`;
47
+ listApiUrl += `/lists(guid'${formatting_1.formatting.encodeQueryParameter(args.options.listId)}')`;
47
48
  }
48
49
  else if (args.options.listTitle) {
49
- requestUrl += `/lists/getByTitle('${formatting_1.formatting.encodeQueryParameter(args.options.listTitle)}')`;
50
+ listApiUrl += `/lists/getByTitle('${formatting_1.formatting.encodeQueryParameter(args.options.listTitle)}')`;
50
51
  }
51
52
  else if (args.options.listUrl) {
52
53
  const listServerRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(args.options.webUrl, args.options.listUrl);
53
- requestUrl += `/GetList('${formatting_1.formatting.encodeQueryParameter(listServerRelativeUrl)}')`;
54
- }
55
- let formDigestValue = '';
56
- const fieldsArray = args.options.fields ? args.options.fields.split(",")
57
- : (!args.options.output || Cli_1.Cli.shouldTrimOutput(args.options.output)) ? ["Title", "Id"] : [];
58
- const fieldsWithSlash = fieldsArray.filter(item => item.includes('/'));
59
- const fieldsToExpand = fieldsWithSlash.map(e => e.split('/')[0]);
60
- const expandFieldsArray = fieldsToExpand.filter((item, pos) => fieldsToExpand.indexOf(item) === pos);
54
+ listApiUrl += `/GetList('${formatting_1.formatting.encodeQueryParameter(listServerRelativeUrl)}')`;
55
+ }
61
56
  try {
62
- if (args.options.camlQuery) {
63
- if (this.debug) {
64
- logger.logToStderr(`getting request digest for query request`);
57
+ const listItems = args.options.camlQuery
58
+ ? yield this.getItemsUsingCAMLQuery(logger, args.options, listApiUrl)
59
+ : yield this.getItems(logger, args.options, listApiUrl);
60
+ listItems.forEach(v => delete v['ID']);
61
+ logger.log(listItems);
62
+ }
63
+ catch (err) {
64
+ this.handleRejectedODataJsonPromise(err);
65
+ }
66
+ });
67
+ }
68
+ getItems(logger, options, listApiUrl) {
69
+ return __awaiter(this, void 0, void 0, function* () {
70
+ if (this.verbose) {
71
+ logger.logToStderr(`Getting list items`);
72
+ }
73
+ const queryParams = [];
74
+ const fieldsArray = options.fields ? options.fields.split(",")
75
+ : (!options.output || Cli_1.Cli.shouldTrimOutput(options.output)) ? ["Title", "Id"] : [];
76
+ const expandFieldsArray = this.getExpandFieldsArray(fieldsArray);
77
+ const skipTokenId = yield this.getLastItemIdForPage(logger, options, listApiUrl);
78
+ queryParams.push(`$top=${options.pageSize || 5000}`);
79
+ if (options.filter) {
80
+ queryParams.push(`$filter=${encodeURIComponent(options.filter)}`);
81
+ }
82
+ if (expandFieldsArray.length > 0) {
83
+ queryParams.push(`$expand=${expandFieldsArray.join(",")}`);
84
+ }
85
+ if (fieldsArray.length > 0) {
86
+ queryParams.push(`$select=${formatting_1.formatting.encodeQueryParameter(fieldsArray.join(","))}`);
87
+ }
88
+ if (skipTokenId !== undefined) {
89
+ queryParams.push(`$skiptoken=Paged=TRUE%26p_ID=${skipTokenId}`);
90
+ }
91
+ // If skiptoken is not found, then we are past the last page
92
+ if (options.pageNumber && Number(options.pageNumber) > 0 && skipTokenId === undefined) {
93
+ return [];
94
+ }
95
+ if (!options.pageSize) {
96
+ return yield odata_1.odata.getAllItems(`${listApiUrl}/items?${queryParams.join('&')}`);
97
+ }
98
+ else {
99
+ const requestOptions = {
100
+ url: `${listApiUrl}/items?${queryParams.join('&')}`,
101
+ headers: {
102
+ 'accept': 'application/json;odata=nometadata'
103
+ },
104
+ responseType: 'json'
105
+ };
106
+ const listItemCollection = yield request_1.default.get(requestOptions);
107
+ return listItemCollection.value;
108
+ }
109
+ });
110
+ }
111
+ getItemsUsingCAMLQuery(logger, options, listApiUrl) {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ const formDigestValue = (yield spo_1.spo.getRequestDigest(options.webUrl)).FormDigestValue;
114
+ if (this.verbose) {
115
+ logger.logToStderr(`Getting list items using CAML query`);
116
+ }
117
+ const items = [];
118
+ let skipTokenId = undefined;
119
+ do {
120
+ const requestBody = {
121
+ "query": {
122
+ "ViewXml": options.camlQuery,
123
+ "AllowIncrementalResults": true
65
124
  }
66
- const res = yield spo_1.spo.getRequestDigest(args.options.webUrl);
67
- formDigestValue = res.FormDigestValue;
68
- }
69
- let res;
70
- if (args.options.pageNumber && Number(args.options.pageNumber) > 0) {
71
- const rowLimit = `$top=${Number(args.options.pageSize) * Number(args.options.pageNumber)}`;
72
- const filter = args.options.filter ? `$filter=${encodeURIComponent(args.options.filter)}` : ``;
73
- const fieldSelect = `?$select=Id&${rowLimit}&${filter}`;
74
- const requestOptions = {
75
- url: `${requestUrl}/items${fieldSelect}`,
76
- headers: {
77
- 'accept': 'application/json;odata=nometadata',
78
- 'X-RequestDigest': formDigestValue
79
- },
80
- responseType: 'json'
125
+ };
126
+ if (skipTokenId !== undefined) {
127
+ requestBody.query.ListItemCollectionPosition = {
128
+ "PagingInfo": `Paged=TRUE&p_ID=${skipTokenId}`
81
129
  };
82
- res = yield request_1.default.get(requestOptions);
83
130
  }
84
- const skipTokenId = (res && res.value && res.value.length && res.value[res.value.length - 1]) ? res.value[res.value.length - 1].Id : 0;
85
- const skipToken = (args.options.pageNumber && Number(args.options.pageNumber) > 0 && skipTokenId > 0) ? `$skiptoken=Paged=TRUE%26p_ID=${res.value[res.value.length - 1].Id}` : ``;
86
- const rowLimit = args.options.pageSize ? `$top=${args.options.pageSize}` : ``;
87
- const filter = args.options.filter ? `$filter=${encodeURIComponent(args.options.filter)}` : ``;
88
- const fieldExpand = expandFieldsArray.length > 0 ? `&$expand=${expandFieldsArray.join(",")}` : ``;
89
- const fieldSelect = fieldsArray.length > 0 ?
90
- `?$select=${formatting_1.formatting.encodeQueryParameter(fieldsArray.join(","))}${fieldExpand}&${rowLimit}&${skipToken}&${filter}` :
91
- `?${rowLimit}&${skipToken}&${filter}`;
92
- const requestBody = args.options.camlQuery ?
93
- {
94
- "query": {
95
- "ViewXml": args.options.camlQuery
96
- }
97
- }
98
- : ``;
99
131
  const requestOptions = {
100
- url: `${requestUrl}/${args.options.camlQuery ? `GetItems` : `items${fieldSelect}`}`,
132
+ url: `${listApiUrl}/GetItems`,
101
133
  headers: {
102
134
  'accept': 'application/json;odata=nometadata',
103
135
  'X-RequestDigest': formDigestValue
@@ -105,13 +137,39 @@ class SpoListItemListCommand extends SpoCommand_1.default {
105
137
  responseType: 'json',
106
138
  data: requestBody
107
139
  };
108
- const listItemInstances = args.options.camlQuery ? yield request_1.default.post(requestOptions) : yield request_1.default.get(requestOptions);
109
- listItemInstances.value.forEach(v => delete v['ID']);
110
- logger.log(listItemInstances.value);
140
+ const listItemInstances = yield request_1.default.post(requestOptions);
141
+ skipTokenId = listItemInstances.value.length > 0 ? listItemInstances.value[listItemInstances.value.length - 1].Id : undefined;
142
+ items.push(...listItemInstances.value);
143
+ } while (skipTokenId !== undefined);
144
+ return items;
145
+ });
146
+ }
147
+ getExpandFieldsArray(fieldsArray) {
148
+ const fieldsWithSlash = fieldsArray.filter(item => item.includes('/'));
149
+ const fieldsToExpand = fieldsWithSlash.map(e => e.split('/')[0]);
150
+ const expandFieldsArray = fieldsToExpand.filter((item, pos) => fieldsToExpand.indexOf(item) === pos);
151
+ return expandFieldsArray;
152
+ }
153
+ getLastItemIdForPage(logger, options, listApiUrl) {
154
+ var _a;
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ if (!options.pageNumber || Number(options.pageNumber) === 0) {
157
+ return undefined;
111
158
  }
112
- catch (err) {
113
- this.handleRejectedODataJsonPromise(err);
159
+ if (this.verbose) {
160
+ logger.logToStderr(`Getting skipToken Id for page ${options.pageNumber}`);
114
161
  }
162
+ const rowLimit = `$top=${Number(options.pageSize) * Number(options.pageNumber)}`;
163
+ const filter = options.filter ? `$filter=${encodeURIComponent(options.filter)}` : ``;
164
+ const requestOptions = {
165
+ url: `${listApiUrl}/items?$select=Id&${rowLimit}&${filter}`,
166
+ headers: {
167
+ 'accept': 'application/json;odata=nometadata'
168
+ },
169
+ responseType: 'json'
170
+ };
171
+ const response = yield request_1.default.get(requestOptions);
172
+ return (_a = response.value[response.value.length - 1]) === null || _a === void 0 ? void 0 : _a.Id;
115
173
  });
116
174
  }
117
175
  }
@@ -155,16 +213,16 @@ _SpoListItemListCommand_instances = new WeakSet(), _SpoListItemListCommand_initT
155
213
  return isValidSharePointUrl;
156
214
  }
157
215
  if (args.options.camlQuery && args.options.fields) {
158
- return `Specify camlQuery or fields but not both`;
216
+ return `You cannot use the fields-option when specifying a camlQuery`;
159
217
  }
160
218
  if (args.options.camlQuery && args.options.pageSize) {
161
- return `Specify camlQuery or pageSize but not both`;
219
+ return `You cannot use the pageSize-option when specifying a camlQuery`;
162
220
  }
163
221
  if (args.options.camlQuery && args.options.pageNumber) {
164
- return `Specify camlQuery or pageNumber but not both`;
222
+ return `You cannot use the pageNumber-option when specifying a camlQuery`;
165
223
  }
166
224
  if (args.options.pageSize && isNaN(Number(args.options.pageSize))) {
167
- return `pageSize must be numeric`;
225
+ return `pageSize ${args.options.pageSize} must be numeric`;
168
226
  }
169
227
  if (args.options.pageNumber && !args.options.pageSize) {
170
228
  return `pageSize must be specified if pageNumber is specified`;
package/dist/request.js CHANGED
@@ -123,6 +123,7 @@ class Request {
123
123
  if (!this._logger) {
124
124
  return Promise.reject('Logger not set on the request object');
125
125
  }
126
+ this.updateRequestForCloudType(options, Auth_1.default.service.cloudType);
126
127
  return new Promise((_resolve, _reject) => {
127
128
  (() => {
128
129
  if (options.headers && options.headers['x-anonymous']) {
@@ -181,6 +182,12 @@ class Request {
181
182
  });
182
183
  });
183
184
  }
185
+ updateRequestForCloudType(options, cloudType) {
186
+ const url = new URL(options.url);
187
+ const hostname = `${url.protocol}//${url.hostname}`;
188
+ const cloudUrl = Auth_1.Auth.getEndpointForResource(hostname, cloudType);
189
+ options.url = options.url.replace(hostname, cloudUrl);
190
+ }
184
191
  }
185
192
  exports.default = new Request();
186
193
  //# sourceMappingURL=request.js.map
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.misc = void 0;
4
+ exports.misc = {
5
+ getEnums(en) {
6
+ return Object
7
+ .keys(en)
8
+ .filter(k => isNaN(parseInt(k)));
9
+ }
10
+ };
11
+ //# sourceMappingURL=misc.js.map
@@ -19,6 +19,9 @@ m365 flow run get [options]
19
19
  `-e, --environmentName <environmentName>`
20
20
  : The name of the environment where the flow is located
21
21
 
22
+ `--includeTriggerInformation`
23
+ : If specified, include information about the trigger details
24
+
22
25
  --8<-- "docs/cmd/_global.md"
23
26
 
24
27
  ## Remarks
@@ -32,6 +35,8 @@ If the Microsoft Flow with the name you specified doesn't exist, you will get th
32
35
 
33
36
  If the run with the name you specified doesn't exist, you will get the `The provided workflow run name is not valid.` error.
34
37
 
38
+ If the option `includeTriggerInformation` is specified, but the trigger does not contain an outputsLink such as for example with a `Recurrence` trigger, this option will be ignored.
39
+
35
40
  ## Examples
36
41
 
37
42
  Get information about the given run of the specified Power Automate flow
@@ -40,6 +45,11 @@ Get information about the given run of the specified Power Automate flow
40
45
  m365 flow run get --environmentName Default-d87a7535-dd31-4437-bfe1-95340acd55c5 --flowName 5923cb07-ce1a-4a5c-ab81-257ce820109a --name 08586653536760200319026785874CU62
41
46
  ```
42
47
 
48
+ Get information about the given run of the specified Power Automate flow including trigger information
49
+
50
+ ```sh
51
+ m365 flow run get --environmentName Default-d87a7535-dd31-4437-bfe1-95340acd55c5 --flowName 5923cb07-ce1a-4a5c-ab81-257ce820109a --name 08586653536760200319026785874CU62 --includeTriggerInformation
52
+ ```
43
53
 
44
54
  ## Response
45
55
 
@@ -61,7 +71,7 @@ m365 flow run get --environmentName Default-d87a7535-dd31-4437-bfe1-95340acd55c5
61
71
  "trigger": {
62
72
  "name": "When_a_new_response_is_submitted",
63
73
  "inputsLink": {
64
- "uri": "https://prod-08.centralindia.logic.azure.com:443/workflows/f7bf8f6b5c494e63bfc21b54087a596e/runs/08585329112602833828909892130CU17/contents/TriggerInputs?api-version=2016-06-01&se=2022-11-17T18%3A00%3A00.0000000Z&sp=%2Fruns%2F08585329112602833828909892130CU17%2Fcontents%2FTriggerInputs%2Fread&sv=1.0&sig=jmdMRWvY7uGoxTmqd3_a2bJtegXuVyuKTKKUVLiwh38",
74
+ "uri": "https://prod-08.centralindia.logic.azure.com:443/workflows/f7bf8f6b5c494e63bfc21b54087a596e/runs/08585329112602833828909892130CU17/contents/TriggerInputs?api-version=2016-06-01&se=2022-11-17T18%3A00%3A00.0000000Z&sp=%2Fruns%2F08585329112602833828909892130CU17%2Fcontents%2FTriggerInputs%2Fread&sv=1.0&sig=",
65
75
  "contentVersion": "6ZrBBE+MJg7IvhMgyJLMmA==",
66
76
  "contentSize": 349,
67
77
  "contentHash": {
@@ -70,7 +80,7 @@ m365 flow run get --environmentName Default-d87a7535-dd31-4437-bfe1-95340acd55c5
70
80
  }
71
81
  },
72
82
  "outputsLink": {
73
- "uri": "https://prod-08.centralindia.logic.azure.com:443/workflows/f7bf8f6b5c494e63bfc21b54087a596e/runs/08585329112602833828909892130CU17/contents/TriggerOutputs?api-version=2016-06-01&se=2022-11-17T18%3A00%3A00.0000000Z&sp=%2Fruns%2F08585329112602833828909892130CU17%2Fcontents%2FTriggerOutputs%2Fread&sv=1.0&sig=Y3qqjuWrrcQJrmF7uvm6LVzQy5w-dNOFWJ8Yt8khXvA",
83
+ "uri": "https://prod-08.centralindia.logic.azure.com:443/workflows/f7bf8f6b5c494e63bfc21b54087a596e/runs/08585329112602833828909892130CU17/contents/TriggerOutputs?api-version=2016-06-01&se=2022-11-17T18%3A00%3A00.0000000Z&sp=%2Fruns%2F08585329112602833828909892130CU17%2Fcontents%2FTriggerOutputs%2Fread&sv=1.0&sig=",
74
84
  "contentVersion": "Z/4a8tfYygNAR1xpc44iww==",
75
85
  "contentSize": 493,
76
86
  "contentHash": {
@@ -97,17 +107,108 @@ m365 flow run get --environmentName Default-d87a7535-dd31-4437-bfe1-95340acd55c5
97
107
  === "Text"
98
108
 
99
109
  ```text
100
- endTime :
101
- name : 08585329112602833828909892130CU17
102
- startTime : 2022-11-17T14:33:45.2763872Z
103
- status : Running
104
- triggerName: When_a_new_response_is_submitted
110
+ endTime : 2023-03-04T09:05:22.5880202Z
111
+ name : 08585236861638480597867166179CU104
112
+ startTime : 2023-03-04T09:05:21.8066368Z
113
+ status : Succeeded
114
+ triggerName: When_an_email_is_flagged_(V4)
105
115
  ```
106
116
 
107
117
  === "CSV"
108
118
 
109
119
  ```csv
110
120
  name,startTime,endTime,status,triggerName
111
- 08585329112602833828909892130CU17,2022-11-17T14:33:45.2763872Z,,Running,When_a_new_response_is_submitted
121
+ 08585236861638480597867166179CU104,2023-03-04T09:05:21.8066368Z,2023-03-04T09:05:22.5880202Z,Succeeded,When_an_email_is_flagged_(V4)
122
+ ```
123
+
124
+ === "Markdown"
125
+
126
+ ```md
127
+ # flow run get --environmentName Default-d87a7535-dd31-4437-bfe1-95340acd55c5 --flowName 5923cb07-ce1a-4a5c-ab81-257ce820109a --name 08586653536760200319026785874CU62
128
+
129
+ Date: 04/03/2023
130
+
131
+ ## 08586653536760200319026785874CU62 (/providers/Microsoft.ProcessSimple/environments/Default-d87a7535-dd31-4437-bfe1-95340acd55c5/flows/5923cb07-ce1a-4a5c-ab81-257ce820109a/runs/08586653536760200319026785874CU62)
132
+
133
+ Property | Value
134
+ ---------|-------
135
+ name | 08586653536760200319026785874CU62
136
+ id | /providers/Microsoft.ProcessSimple/environments/Default-e1dd4023-a656-480a-8a0e-c1b1eec51e1d/flows/c3c707b5-fefd-4f7a-a96c-b8e0d5ca3cc1/runs/08585208964855963748594654409CU47
137
+ type | Microsoft.ProcessSimple/environments/flows/runs
138
+ startTime | 2023-03-04T09:05:21.8066368Z
139
+ endTime | 2023-03-04T09:05:22.5880202Z
140
+ status | Succeeded
141
+ triggerName | When\_an\_email\_is\_flagged\_(V4)
142
+ ```
143
+
144
+ ### `includeTriggerInformation` response
145
+
146
+ When using the option `includeTriggerInformation`, the response for the json-output will differ.
147
+
148
+ === "JSON"
149
+
150
+ ```json
151
+ {
152
+ "name": "08585236861638480597867166179CU104",
153
+ "id": "/providers/Microsoft.ProcessSimple/environments/Default-e1dd4023-a656-480a-8a0e-c1b1eec51e1d/flows/24335774-daf6-4183-acb7-f5155c2cd2fe/runs/08585236861638480597867166179CU104",
154
+ "type": "Microsoft.ProcessSimple/environments/flows/runs",
155
+ "properties": {
156
+ "startTime": "2023-03-04T09:05:21.8066368Z",
157
+ "endTime": "2023-03-04T09:05:22.5880202Z",
158
+ "status": "Succeeded",
159
+ "correlation": {
160
+ "clientTrackingId": "08585236861638480598867166179CU131"
161
+ },
162
+ "trigger": {
163
+ "name": "When_an_email_is_flagged_(V4)",
164
+ "inputsLink": {
165
+ "uri": "https://prod-130.westeurope.logic.azure.com:443/workflows/3ebadb794f6641e0b7f4fda131cdfb0b/runs/08585236861638480597867166179CU104/contents/TriggerInputs?api-version=2016-06-01&se=2023-03-04T14%3A00%3A00.0000000Z&sp=%2Fruns%2F08585236861638480597867166179CU104%2Fcontents%2FTriggerInputs%2Fread&sv=1.0&sig=",
166
+ "contentVersion": "2v/VLXFrKV6JvwSdcN7aHg==",
167
+ "contentSize": 343,
168
+ "contentHash": {
169
+ "algorithm": "md5",
170
+ "value": "2v/VLXFrKV6JvwSdcN7aHg=="
171
+ }
172
+ },
173
+ "outputsLink": {
174
+ "uri": "https://prod-130.westeurope.logic.azure.com:443/workflows/3ebadb794f6641e0b7f4fda131cdfb0b/runs/08585236861638480597867166179CU104/contents/TriggerOutputs?api-version=2016-06-01&se=2023-03-04T14%3A00%3A00.0000000Z&sp=%2Fruns%2F08585236861638480597867166179CU104%2Fcontents%2FTriggerOutputs%2Fread&sv=1.0&sig=",
175
+ "contentVersion": "AHZEeWNlQ0bLe48yDmpzrQ==",
176
+ "contentSize": 3478,
177
+ "contentHash": {
178
+ "algorithm": "md5",
179
+ "value": "AHZEeWNlQ0bLe48yDmpzrQ=="
180
+ }
181
+ },
182
+ "startTime": "2023-03-04T09:05:21.6192576Z",
183
+ "endTime": "2023-03-04T09:05:21.7442626Z",
184
+ "scheduledTime": "2023-03-04T09:05:21.573561Z",
185
+ "originHistoryName": "08585236861638480598867166179CU131",
186
+ "correlation": {
187
+ "clientTrackingId": "08585236861638480598867166179CU131"
188
+ },
189
+ "code": "OK",
190
+ "status": "Succeeded"
191
+ }
192
+ },
193
+ "startTime": "2023-03-04T09:05:21.8066368Z",
194
+ "endTime": "2023-03-04T09:05:22.5880202Z",
195
+ "status": "Succeeded",
196
+ "triggerName": "When_an_email_is_flagged_(V4)",
197
+ "triggerInformation": {
198
+ "from": "john@contoso.com",
199
+ "toRecipients": "doe@contoso.com",
200
+ "subject": "Dummy email",
201
+ "body": "<html><head>\r\\\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head><body><p>This is dummy content</p></body></html>",
202
+ "importance": "normal",
203
+ "bodyPreview": "This is dummy content",
204
+ "hasAttachments": false,
205
+ "id": "AAMkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgBGAAAAAAC6jQfUzacTSIHqMw2yacnUBwBiOC8xvYmdT6G2E_hLMK5kAAAAAAEMAABiOC8xvYmdT6G2E_hLMK5kAALUqy81AAA=",
206
+ "internetMessageId": "<DB7PR03MB5018879914324FC65695809FE1AD9@DB7PR03MB5018.eurprd03.prod.outlook.com>",
207
+ "conversationId": "AAQkADgzN2Q1NThiLTI0NjYtNGIxYS05MDdjLTg1OWQxNzgwZGM2ZgAQAMqP9zsK8a1CnIYEgHclLTk=",
208
+ "receivedDateTime": "2023-03-01T15:06:57+00:00",
209
+ "isRead": false,
210
+ "attachments": [],
211
+ "isHtml": true
212
+ }
213
+ }
112
214
  ```
113
-
@@ -37,6 +37,9 @@ m365 login [options]
37
37
  `--tenant [tenant]`
38
38
  : ID of the tenant from which accounts should be able to authenticate. Use `common` or `organization` if the app is multitenant. If not specified, use the tenant specified in the `CLIMICROSOFT365_TENANT` environment variable. If the environment variable is not defined, use `common` as the tenant identifier
39
39
 
40
+ `--cloud [cloud]`
41
+ : Cloud to connect to. Allowed values `Public`, `USGov`, `USGovHigh`, `USGovDoD` and `China`. Default `Public`
42
+
40
43
  --8<-- "docs/cmd/_global.md"
41
44
 
42
45
  ## Remarks
@@ -45,8 +48,6 @@ Using the `login` command you can log in to Microsoft 365.
45
48
 
46
49
  By default, the `login` command uses device code OAuth flow to log in to Microsoft 365. Alternatively, you can authenticate using a user name and password or certificate, which are convenient for CI/CD scenarios, but which come with their own [limitations](../user-guide/connecting-office-365.md).
47
50
 
48
- When logging in to Microsoft 365, the `login` command stores in memory the access token and the refresh token. Both tokens are cleared from memory after exiting the CLI or by calling the [logout](logout.md) command.
49
-
50
51
  When logging in to Microsoft 365 using the user name and password, next to the access and refresh token, the CLI for Microsoft 365 will store the user credentials so that it can automatically re-authenticate if necessary. Similarly to the tokens, the credentials are removed by re-authenticating using the device code or by calling the [logout](logout.md) command.
51
52
 
52
53
  When logging in to Microsoft 365 using a certificate, the CLI for Microsoft 365 will store the contents of the certificate so that it can automatically re-authenticate if necessary. The contents of the certificate are removed by re-authenticating using the device code or by calling the [logout](logout.md) command.
@@ -55,6 +56,8 @@ To log in to Microsoft 365 using a certificate or secret, you will typically [cr
55
56
 
56
57
  Managed identity in Azure Cloud Shell is the identity of the user. It is neither system- nor user-assigned and it can't be configured. To log in to Microsoft 365 using managed identity in Azure Cloud Shell, set `authType` to `identity` and don't specify the `userName` option.
57
58
 
59
+ When connecting to clouds other than `Public`, you'll need to use an Azure AD application registered in a directory provisioned in that cloud. If you try to login using the default Azure AD application, login will fail.
60
+
58
61
  ## Examples
59
62
 
60
63
  Log in to Microsoft 365 using the device code
@@ -50,7 +50,7 @@ m365 planner task add [options]
50
50
  : Hint used to order items of this type in a list view. The format is defined as outlined [here](https://docs.microsoft.com/graph/api/resources/planner-order-hint-format?view=graph-rest-1.0).
51
51
 
52
52
  `--description [description]`
53
- : Description of the task
53
+ : Description of the task.
54
54
 
55
55
  `--appliedCategories [appliedCategories]`
56
56
  : Comma-separated categories that should be added to the task. The possible options are: `category1`, `category2`, `category3`, `category4`, `category5` and/or `category6`. Additional info defined [here](https://docs.microsoft.com/graph/api/resources/plannerappliedcategories?view=graph-rest-1.0).
@@ -81,6 +81,8 @@ When you specify an integer value for `priority`, consider the following:
81
81
  - values 5, 6 and 7 are interpreted as _Medium_
82
82
  - values 8, 9 and 10 are interpreted as _Low_
83
83
 
84
+ When using `description` with a multiple lines value, use the new line character of the shell you are using to indicate line breaks. For PowerShell this is `` `n ``. For Zsh or Bash use `\n` with a `$` in front. E.g. `$"Line 1\nLine 2"`.
85
+
84
86
  ## Examples
85
87
 
86
88
  Adds a Microsoft Planner task with the name _My Planner Task_ for plan with the ID _8QZEH7b3wkSbGQobscsM5gADCBa_ and for the bucket with the ID _IK8tuFTwQEa5vTonM7ZMRZgAKdna_
@@ -50,16 +50,16 @@ m365 planner task set [options]
50
50
  : Comma-separated UPNs of the assignees that should be added to the task assignment. Specify either `assignedToUserIds` or `assignedToUserNames` but not both.
51
51
 
52
52
  `--description [description]`
53
- : Description of the task
53
+ : Description of the task.
54
54
 
55
55
  `--orderHint [orderHint]`
56
- : Hint used to order items of this type in a list view
56
+ : Hint used to order items of this type in a list view.
57
57
 
58
58
  `--assigneePriority [assigneePriority]`
59
- : Hint used to order items of this type in a list view
59
+ : Hint used to order items of this type in a list view.
60
60
 
61
61
  `--appliedCategories [appliedCategories]`
62
- : Comma-separated categories that should be added to the task
62
+ : Comma-separated categories that should be added to the task.
63
63
 
64
64
  `--priority [priority]`
65
65
  : Priority of the task: Urgent, Important, Medium, Low. Or an integer between 0 and 10 (check remarks section for more info).
@@ -83,6 +83,8 @@ When you specify an integer value for `priority`, consider the following:
83
83
 
84
84
  You can add up to 6 categories to the task. An example to add _category1_ and _category3_ would be `category1,category3`.
85
85
 
86
+ When using `description` with a multiple lines value, use the new line character of the shell you are using to indicate line breaks. For PowerShell this is `` `n ``. For Zsh or Bash use `\n` with a `$` in front. E.g. `$"Line 1\nLine 2"`.
87
+
86
88
  ## Examples
87
89
 
88
90
  Updates a Microsoft Planner task name to _My Planner Task_ for the task with the ID _Z-RLQGfppU6H3663DBzfs5gAMD3o_
@@ -16,21 +16,106 @@ m365 spo file list [options]
16
16
  `-f, --folder <folder>`
17
17
  : The server- or site-relative URL of the folder from which to retrieve files
18
18
 
19
+ `--fields [fields]`
20
+ : Comma-separated list of fields to retrieve. Will retrieve all fields if not specified.
21
+
22
+ `--filter [filter]`
23
+ : OData filter to use to query the list of items with
24
+
19
25
  `-r, --recursive`
20
26
  : Set to retrieve files from subfolders
21
27
 
22
28
  --8<-- "docs/cmd/_global.md"
23
29
 
30
+ ## Remarks
31
+
32
+ When the `fields` option includes values with a `/`, for example: `ListItemAllFields/Id`, an additional `$expand` query parameter will be included on `ListItemAllFields`.
33
+
24
34
  ## Examples
25
35
 
26
- Return all files from folder _Shared Documents_ located in site _https://contoso.sharepoint.com/sites/project-x_
36
+ Return all files from a folder
27
37
 
28
38
  ```sh
29
39
  m365 spo file list --webUrl https://contoso.sharepoint.com/sites/project-x --folder 'Shared Documents'
30
40
  ```
31
41
 
32
- Return all files from the folder _Shared Documents_ and all the sub-folders of _Shared Documents_ located in site _https://contoso.sharepoint.com/sites/project-x_
42
+ Return all files from a folder and all the sub-folders
33
43
 
34
44
  ```sh
35
45
  m365 spo file list --webUrl https://contoso.sharepoint.com/sites/project-x --folder 'Shared Documents' --recursive
36
46
  ```
47
+
48
+ Return the files from a folder with specific fields which will be expanded
49
+
50
+ ```sh
51
+ m365 spo file list --webUrl https://contoso.sharepoint.com/sites/project-x --folder 'Shared Documents' --fields "Title,Length"
52
+ ```
53
+
54
+ Return the files from a folder that meet the criteria of the filter with specific fields which will be expanded
55
+
56
+ ```sh
57
+ m365 spo file list --webUrl https://contoso.sharepoint.com/sites/project-x --folder 'Shared Documents' --fields ListItemAllFields/Id --filter "Name eq 'document.docx'"
58
+ ```
59
+
60
+ ## Response
61
+
62
+ === "JSON"
63
+
64
+ ```json
65
+ [
66
+ {
67
+ "CheckInComment": "",
68
+ "CheckOutType": 2,
69
+ "ContentTag": "{F09C4EFE-B8C0-4E89-A166-03418661B89B},9,12",
70
+ "CustomizedPageStatus": 0,
71
+ "ETag": "\"{F09C4EFE-B8C0-4E89-A166-03418661B89B},9\"",
72
+ "Exists": true,
73
+ "IrmEnabled": false,
74
+ "Length": 331673,
75
+ "Level": 1,
76
+ "LinkingUri": "https://contoso.sharepoint.com/sites/project-x/Shared Documents/Document.docx?d=wf09c4efeb8c04e89a16603418661b89b",
77
+ "LinkingUrl": "https://contoso.sharepoint.com/sites/project-x/Shared Documents/Document.docx?d=wf09c4efeb8c04e89a16603418661b89b",
78
+ "MajorVersion": 3,
79
+ "MinorVersion": 0,
80
+ "Name": "Document.docx",
81
+ "ServerRelativeUrl": "/sites/project-x/Shared Documents/Document.docx",
82
+ "TimeCreated": "2018-02-05T08:42:36Z",
83
+ "TimeLastModified": "2018-02-05T08:44:03Z",
84
+ "Title": "",
85
+ "UIVersion": 1536,
86
+ "UIVersionLabel": "3.0",
87
+ "UniqueId": "f09c4efe-b8c0-4e89-a166-03418661b89b"
88
+ }
89
+ ]
90
+ ```
91
+
92
+ === "Text"
93
+
94
+ ```text
95
+ Name ServerRelativeUrl UniqueId
96
+ --------------------------------- ----------------------------------------------- ------------------------------------
97
+ Document.docx /sites/project-x/Shared Documents/Document.docx 5eb97525-2167-4d26-94b8-092a97d65716
98
+ ```
99
+
100
+ === "CSV"
101
+
102
+ ```csv
103
+ Name,ServerRelativeUrl,UniqueId
104
+ Document.docx,/sites/project-x/Shared Documents/Document.docx,5eb97525-2167-4d26-94b8-092a97d65716
105
+ ```
106
+
107
+ === "Markdown"
108
+
109
+ ```md
110
+ # spo file list --webUrl "https://contoso.sharepoint.com" --folder "Shared Documents"
111
+
112
+ Date: 23/3/2023
113
+
114
+ ## Document.docx (5eb97525-2167-4d26-94b8-092a97d65716)
115
+
116
+ Property | Value
117
+ ---------|-------
118
+ Name | Document.docx
119
+ ServerRelativeUrl | /sites/project-x/Shared Documents/Document.docx
120
+ UniqueId | 5eb97525-2167-4d26-94b8-092a97d65716
121
+ ```