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

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 (45) hide show
  1. package/.eslintrc.js +2 -0
  2. package/Dockerfile +1 -0
  3. package/dist/Command.js +17 -7
  4. package/dist/cli/Cli.js +15 -11
  5. package/dist/m365/cli/commands/config/config-set.js +1 -0
  6. package/dist/m365/commands/request.js +18 -1
  7. package/dist/m365/pa/commands/app/app-export.js +197 -0
  8. package/dist/m365/pa/commands.js +1 -0
  9. package/dist/m365/pp/commands/tenant/tenant-settings-set.js +261 -0
  10. package/dist/m365/pp/commands.js +2 -1
  11. package/dist/m365/purview/commands/threatassessment/threatassessment-get.js +79 -0
  12. package/dist/m365/purview/commands.js +2 -1
  13. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.17.0.js +23 -0
  14. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.17.1.js +23 -0
  15. package/dist/m365/spfx/commands/project/project-doctor.js +3 -1
  16. package/dist/m365/spfx/commands/project/project-upgrade/{upgrade-1.17.0-rc.1.js → upgrade-1.17.0.js} +26 -26
  17. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.17.1.js +55 -0
  18. package/dist/m365/spfx/commands/project/project-upgrade.js +14 -15
  19. package/dist/m365/spfx/commands/spfx-doctor.js +30 -0
  20. package/dist/m365/spo/commands/file/file-move.js +1 -1
  21. package/dist/m365/spo/commands/file/file-retentionlabel-ensure.js +22 -1
  22. package/dist/m365/spo/commands/listitem/ListItemFieldValueResult.js +3 -0
  23. package/dist/m365/spo/commands/listitem/listitem-add.js +6 -5
  24. package/dist/m365/spo/commands/listitem/listitem-batch-add.js +18 -1
  25. package/dist/m365/spo/commands/listitem/listitem-get.js +21 -6
  26. package/dist/m365/spo/commands/listitem/listitem-retentionlabel-ensure.js +35 -1
  27. package/dist/m365/spo/commands/listitem/listitem-set.js +5 -6
  28. package/dist/m365/spo/commands/web/web-set.js +33 -13
  29. package/dist/settingsNames.js +2 -1
  30. package/dist/utils/fsUtil.js +1 -1
  31. package/docs/docs/_clisettings.md +1 -0
  32. package/docs/docs/cmd/aad/o365group/o365group-add.md +3 -3
  33. package/docs/docs/cmd/pa/app/app-export.md +52 -0
  34. package/docs/docs/cmd/pp/tenant/tenant-settings-set.md +218 -0
  35. package/docs/docs/cmd/purview/threatassessment/threatassessment-get.md +191 -0
  36. package/docs/docs/cmd/request.md +10 -4
  37. package/docs/docs/cmd/spfx/project/project-upgrade.md +2 -2
  38. package/docs/docs/cmd/spo/file/file-retentionlabel-ensure.md +12 -1
  39. package/docs/docs/cmd/spo/listitem/listitem-add.md +12 -1
  40. package/docs/docs/cmd/spo/listitem/listitem-batch-add.md +12 -9
  41. package/docs/docs/cmd/spo/listitem/listitem-get.md +14 -5
  42. package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-ensure.md +15 -2
  43. package/docs/docs/cmd/spo/listitem/listitem-set.md +12 -1
  44. package/npm-shrinkwrap.json +460 -273
  45. package/package.json +14 -12
@@ -467,6 +467,36 @@ 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
+ }
485
+ },
486
+ '1.17.1': {
487
+ gulpCli: {
488
+ range: '^1 || ^2',
489
+ fix: 'npm i -g gulp-cli@2'
490
+ },
491
+ node: {
492
+ range: '>=16.13.0 <17.0.0',
493
+ fix: 'Install Node.js >=16.13.0 <17.0.0'
494
+ },
495
+ sp: SharePointVersion.SPO,
496
+ yo: {
497
+ range: '^4',
498
+ fix: 'npm i -g yo@4'
499
+ }
470
500
  }
471
501
  };
472
502
  __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* () {
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ListItemFieldValueResult.js.map
@@ -15,6 +15,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
15
15
  };
16
16
  var _SpoListItemAddCommand_instances, _SpoListItemAddCommand_initTelemetry, _SpoListItemAddCommand_initOptions, _SpoListItemAddCommand_initValidators, _SpoListItemAddCommand_initTypes, _SpoListItemAddCommand_initOptionSets;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
+ const os = require("os");
18
19
  const request_1 = require("../../../../request");
19
20
  const formatting_1 = require("../../../../utils/formatting");
20
21
  const spo_1 = require("../../../../utils/spo");
@@ -139,16 +140,16 @@ class SpoListItemAddCommand extends SpoCommand_1.default {
139
140
  const response = yield request_1.default.post(requestOptions);
140
141
  // Response is from /AddValidateUpdateItemUsingPath POST call, perform get on added item to get all field values
141
142
  const fieldValues = response.value;
143
+ if (fieldValues.some(f => f.HasException)) {
144
+ throw `Creating the item failed with the following errors: ${os.EOL}${fieldValues.filter(f => f.HasException).map(f => { return `- ${f.FieldName} - ${f.ErrorMessage}`; }).join(os.EOL)}`;
145
+ }
142
146
  const idField = fieldValues.filter((thisField) => {
143
147
  return (thisField.FieldName === "Id");
144
148
  });
145
149
  if (this.debug) {
146
- logger.logToStderr(`field values returned:`);
150
+ logger.logToStderr(`Field values returned:`);
147
151
  logger.logToStderr(fieldValues);
148
- logger.logToStderr(`Id returned by AddValidateUpdateItemUsingPath: ${idField}`);
149
- }
150
- if (idField.length === 0) {
151
- throw `Item didn't add successfully`;
152
+ logger.logToStderr(`Id returned by AddValidateUpdateItemUsingPath: ${idField[0].FieldValue}`);
152
153
  }
153
154
  requestOptions = {
154
155
  url: `${requestUrl}/items(${idField[0].FieldValue})`,
@@ -23,6 +23,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
23
23
  var _SpoListItemBatchAddCommand_instances, _SpoListItemBatchAddCommand_initTelemetry, _SpoListItemBatchAddCommand_initOptions, _SpoListItemBatchAddCommand_initValidators, _SpoListItemBatchAddCommand_initTypes, _SpoListItemBatchAddCommand_initOptionSets;
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  const fs = require("fs");
26
+ const os = require("os");
26
27
  const request_1 = require("../../../../request");
27
28
  const uuid_1 = require("uuid");
28
29
  const formatting_1 = require("../../../../utils/formatting");
@@ -116,7 +117,11 @@ class SpoListItemBatchAddCommand extends SpoCommand_1.default {
116
117
  },
117
118
  data: requestBody.join('')
118
119
  };
119
- yield request_1.default.post(requestOptions);
120
+ const response = yield request_1.default.post(requestOptions);
121
+ const parsedResponse = this.parseBatchResponseBody(response);
122
+ if (parsedResponse.some(r => r.HasException)) {
123
+ throw `Creating some items failed with the following errors: ${os.EOL}${parsedResponse.filter(f => f.HasException).map(f => { return `- Line ${f.csvLineNumber}: ${f.FieldName} - ${f.ErrorMessage}`; }).join(os.EOL)}`;
124
+ }
120
125
  });
121
126
  }
122
127
  parseBatchRequestBody(items, batchId, requestUrl) {
@@ -142,6 +147,18 @@ class SpoListItemBatchAddCommand extends SpoCommand_1.default {
142
147
  batchBody.push(`--batch_${batchId}--\n`);
143
148
  return batchBody;
144
149
  }
150
+ parseBatchResponseBody(response) {
151
+ const batchResults = [];
152
+ response.split('\r\n')
153
+ .filter((line) => line.startsWith('{'))
154
+ .forEach((line, index) => {
155
+ const parsedResponse = JSON.parse(line);
156
+ parsedResponse.value.forEach((fieldValueResult) => {
157
+ batchResults.push(Object.assign({ csvLineNumber: (index + 2) }, fieldValueResult));
158
+ });
159
+ });
160
+ return batchResults;
161
+ }
145
162
  getSingleItemRequestBody(row) {
146
163
  const requestBody = [];
147
164
  Object.keys(row).forEach(key => {
@@ -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* () {
@@ -15,6 +15,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
15
15
  };
16
16
  var _SpoListItemSetCommand_instances, _SpoListItemSetCommand_initTelemetry, _SpoListItemSetCommand_initOptions, _SpoListItemSetCommand_initValidators, _SpoListItemSetCommand_initTypes, _SpoListItemSetCommand_initOptionSets;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
+ const os = require("os");
18
19
  const config_1 = require("../../../../config");
19
20
  const request_1 = require("../../../../request");
20
21
  const formatting_1 = require("../../../../utils/formatting");
@@ -185,13 +186,11 @@ class SpoListItemSetCommand extends SpoCommand_1.default {
185
186
  }
186
187
  else {
187
188
  // Response is from /ValidateUpdateListItem POST call, perform get on updated item to get all field values
188
- const returnedData = response.value;
189
- if (!returnedData[0].ItemId) {
190
- throw `Item didn't update successfully`;
191
- }
192
- else {
193
- itemId = returnedData[0].ItemId;
189
+ const fieldValues = response.value;
190
+ if (fieldValues.some(f => f.HasException)) {
191
+ throw `Updating the items has failed with the following errors: ${os.EOL}${fieldValues.filter(f => f.HasException).map(f => { return `- ${f.FieldName} - ${f.ErrorMessage}`; }).join(os.EOL)}`;
194
192
  }
193
+ itemId = fieldValues[0].ItemId;
195
194
  }
196
195
  const requestOptionsItems = {
197
196
  url: `${requestUrl}/items(${itemId})`,
@@ -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
@@ -42,7 +42,7 @@ const addFileCommands = {
42
42
  addFileCommand: 'cat > [FILEPATH] << EOF [FILECONTENT]EOF'
43
43
  },
44
44
  powershell: {
45
- addFileCommand: `@"[FILECONTENT]"@ | Out-File -FilePath [FILEPATH]`
45
+ addFileCommand: `@'[FILECONTENT]'@ | Out-File -FilePath [FILEPATH]`
46
46
  },
47
47
  cmd: {
48
48
  addFileCommand: `echo [FILECONTENT] > [FILEPATH]`
@@ -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.