@pnp/cli-microsoft365 7.0.0-beta.99e75a7 → 7.0.0-beta.aa2d71e

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 (139) hide show
  1. package/.eslintrc.cjs +0 -2
  2. package/dist/GlobalOptions.js +1 -7
  3. package/dist/cli/Cli.js +19 -2
  4. package/dist/m365/aad/commands/app/app-add.js +8 -8
  5. package/dist/m365/aad/commands/app/app-role-add.js +5 -5
  6. package/dist/m365/aad/commands/app/app-set.js +5 -5
  7. package/dist/m365/aad/commands/policy/policy-list.js +5 -5
  8. package/dist/m365/cli/commands/cli-issue.js +5 -5
  9. package/dist/m365/cli/commands/config/config-get.js +5 -5
  10. package/dist/m365/cli/commands/config/config-reset.js +5 -5
  11. package/dist/m365/cli/commands/config/config-set.js +5 -5
  12. package/dist/m365/commands/login.js +5 -5
  13. package/dist/m365/commands/request.js +1 -1
  14. package/dist/m365/flow/commands/owner/owner-ensure.js +5 -5
  15. package/dist/m365/pa/commands/app/app-owner-set.js +5 -5
  16. package/dist/m365/pa/commands/app/app-permission-ensure.js +5 -5
  17. package/dist/m365/pa/commands.js +1 -4
  18. package/dist/m365/planner/commands/task/task-add.js +17 -11
  19. package/dist/m365/planner/commands/task/task-get.js +35 -25
  20. package/dist/m365/planner/commands/task/task-list.js +26 -19
  21. package/dist/m365/planner/commands/task/task-remove.js +39 -34
  22. package/dist/m365/planner/commands/task/task-set.js +35 -23
  23. package/dist/m365/purview/commands/retentionlabel/retentionlabel-add.js +14 -14
  24. package/dist/m365/spfx/commands/package/package-generate.js +15 -15
  25. package/dist/m365/spfx/commands/project/DeployWorkflow.js +55 -0
  26. package/dist/m365/spfx/commands/project/project-doctor/{doctor-1.18.0-beta.1.js → doctor-1.18.0-beta.5.js} +1 -1
  27. package/dist/m365/spfx/commands/project/project-doctor.js +9 -9
  28. package/dist/m365/spfx/commands/project/project-github-workflow-add.js +157 -0
  29. package/dist/m365/spfx/commands/project/project-github-workflow-model.js +2 -0
  30. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.15.2.js +1 -1
  31. package/dist/m365/spfx/commands/project/project-upgrade/{upgrade-1.18.0-beta.1.js → upgrade-1.18.0-beta.5.js} +26 -26
  32. package/dist/m365/spfx/commands/project/project-upgrade.js +14 -14
  33. package/dist/m365/spfx/commands/spfx-doctor.js +3 -3
  34. package/dist/m365/spfx/commands.js +1 -0
  35. package/dist/m365/spo/commands/app/SpoAppBaseCommand.js +27 -26
  36. package/dist/m365/spo/commands/app/app-add.js +9 -9
  37. package/dist/m365/spo/commands/applicationcustomizer/applicationcustomizer-add.js +5 -5
  38. package/dist/m365/spo/commands/applicationcustomizer/applicationcustomizer-list.js +5 -5
  39. package/dist/m365/spo/commands/commandset/commandset-add.js +11 -11
  40. package/dist/m365/spo/commands/commandset/commandset-get.js +8 -8
  41. package/dist/m365/spo/commands/commandset/commandset-list.js +5 -5
  42. package/dist/m365/spo/commands/commandset/commandset-remove.js +5 -5
  43. package/dist/m365/spo/commands/commandset/commandset-set.js +11 -11
  44. package/dist/m365/spo/commands/file/file-move.js +73 -97
  45. package/dist/m365/spo/commands/file/file-sharinglink-add.js +8 -8
  46. package/dist/m365/spo/commands/file/file-sharinglink-list.js +5 -5
  47. package/dist/m365/spo/commands/folder/folder-copy.js +89 -45
  48. package/dist/m365/spo/commands/folder/folder-move.js +89 -47
  49. package/dist/m365/spo/commands/list/list-add.js +4 -4
  50. package/dist/m365/spo/commands/list/list-set.js +4 -4
  51. package/dist/m365/spo/commands/orgassetslibrary/orgassetslibrary-add.js +34 -5
  52. package/dist/m365/spo/commands/page/clientsidepages.js +1 -81
  53. package/dist/m365/spo/commands/propertybag/propertybag-base.js +63 -59
  54. package/dist/m365/spo/commands/propertybag/propertybag-remove.js +28 -31
  55. package/dist/m365/spo/commands/serviceprincipal/serviceprincipal-set.js +30 -32
  56. package/dist/m365/spo/commands/site/FlowsPolicy.js +7 -0
  57. package/dist/m365/spo/commands/site/site-add.js +114 -161
  58. package/dist/m365/spo/commands/site/site-apppermission-add.js +15 -18
  59. package/dist/m365/spo/commands/site/site-apppermission-remove.js +34 -38
  60. package/dist/m365/spo/commands/site/site-apppermission-set.js +11 -14
  61. package/dist/m365/spo/commands/site/site-ensure.js +14 -67
  62. package/dist/m365/spo/commands/site/site-hubsite-disconnect.js +22 -22
  63. package/dist/m365/spo/commands/site/site-list.js +27 -43
  64. package/dist/m365/spo/commands/site/site-recyclebinitem-list.js +6 -6
  65. package/dist/m365/spo/commands/site/site-remove.js +166 -210
  66. package/dist/m365/spo/commands/site/site-set.js +177 -198
  67. package/dist/m365/spo/commands/tenant/tenant-commandset-add.js +8 -8
  68. package/dist/m365/spo/commands/tenant/tenant-commandset-set.js +8 -8
  69. package/dist/m365/spo/commands/tenant/tenant-settings-set.js +4 -4
  70. package/dist/m365/spo/commands/theme/theme-remove.js +24 -24
  71. package/dist/m365/spo/commands/theme/theme-set.js +0 -1
  72. package/dist/m365/spo/commands/user/user-remove.js +27 -27
  73. package/dist/m365/spo/commands/web/web-reindex.js +35 -42
  74. package/dist/m365/spo/commands/web/web-remove.js +21 -21
  75. package/dist/m365/spo/commands/web/web-roleassignment-add.js +16 -31
  76. package/dist/m365/spo/commands/web/web-roleassignment-remove.js +33 -44
  77. package/dist/m365/spo/commands/web/web-roleinheritance-break.js +18 -18
  78. package/dist/m365/spo/commands/web/web-roleinheritance-reset.js +19 -19
  79. package/dist/m365/spo/commands/web/web-set.js +5 -5
  80. package/dist/m365/teams/commands/app/app-list.js +5 -5
  81. package/dist/m365/teams/commands/chat/chat-member-add.js +5 -5
  82. package/dist/m365/teams/commands/funsettings/funsettings-set.js +4 -4
  83. package/dist/m365/teams/commands/guestsettings/guestsettings-set.js +4 -4
  84. package/dist/m365/teams/commands/membersettings/membersettings-set.js +4 -4
  85. package/dist/m365/teams/commands/messagingsettings/messagingsettings-set.js +5 -5
  86. package/dist/m365/teams/commands/team/team-set.js +3 -3
  87. package/dist/m365/todo/commands/task/task-add.js +6 -6
  88. package/dist/m365/yammer/commands/message/message-like-set.js +27 -28
  89. package/dist/m365/yammer/commands/message/message-list.js +67 -86
  90. package/dist/m365/yammer/commands/message/message-remove.js +18 -18
  91. package/dist/m365/yammer/commands/yammer-search.js +58 -74
  92. package/dist/utils/aadGroup.js +18 -0
  93. package/dist/utils/fsUtil.js +5 -0
  94. package/dist/utils/spo.js +594 -53
  95. package/dist/utils/validation.js +0 -3
  96. package/docs/docs/cmd/planner/task/task-add.mdx +22 -7
  97. package/docs/docs/cmd/planner/task/task-get.mdx +13 -4
  98. package/docs/docs/cmd/planner/task/task-list.mdx +22 -7
  99. package/docs/docs/cmd/planner/task/task-remove.mdx +25 -8
  100. package/docs/docs/cmd/planner/task/task-set.mdx +22 -7
  101. package/docs/docs/cmd/spfx/project/project-github-workflow-add.mdx +94 -0
  102. package/docs/docs/cmd/spo/file/file-move.mdx +36 -18
  103. package/docs/docs/cmd/spo/folder/folder-copy.mdx +39 -12
  104. package/docs/docs/cmd/spo/folder/folder-move.mdx +40 -13
  105. package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-add.mdx +14 -1
  106. package/docs/docs/cmd/spo/site/site-ensure.mdx +1 -1
  107. package/docs/docs/cmd/spo/site/site-list.mdx +3 -78
  108. package/npm-shrinkwrap.json +240 -1417
  109. package/package.json +6 -7
  110. package/dist/m365/pa/cds-project-mutator.js +0 -91
  111. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/dataset-template/generated/ManifestTypes.d.ts +0 -11
  112. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/dataset-template/template_ControlManifest.Input.xml +0 -31
  113. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/dataset-template/template_index.ts +0 -51
  114. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/field-template/generated/ManifestTypes.d.ts +0 -12
  115. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/field-template/template_ControlManifest.Input.xml +0 -37
  116. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/field-template/template_index.ts +0 -48
  117. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/index.ts +0 -0
  118. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-dataset-template/template_ControlManifest.Input.xml +0 -31
  119. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-dataset-template/template_index.tsx +0 -58
  120. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-field-template/template_ControlManifest.Input.xml +0 -37
  121. package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-field-template/template_index.tsx +0 -55
  122. package/dist/m365/pa/commands/pcf/pcf-init/assets/package.json +0 -19
  123. package/dist/m365/pa/commands/pcf/pcf-init/assets/pcfconfig.json +0 -3
  124. package/dist/m365/pa/commands/pcf/pcf-init/assets/template_.gitignore +0 -14
  125. package/dist/m365/pa/commands/pcf/pcf-init/assets/template_pcfprojecttype.pcfproj +0 -45
  126. package/dist/m365/pa/commands/pcf/pcf-init/pcf-init-variables.js +0 -2
  127. package/dist/m365/pa/commands/pcf/pcf-init.js +0 -120
  128. package/dist/m365/pa/commands/solution/solution-init/assets/Other/Customizations.xml +0 -18
  129. package/dist/m365/pa/commands/solution/solution-init/assets/Other/Relationships.xml +0 -2
  130. package/dist/m365/pa/commands/solution/solution-init/assets/Other/template_Solution.xml +0 -94
  131. package/dist/m365/pa/commands/solution/solution-init/assets/template_.gitignore +0 -2
  132. package/dist/m365/pa/commands/solution/solution-init/assets/template_solutionprojecttype.cdsproj +0 -44
  133. package/dist/m365/pa/commands/solution/solution-init/solution-init-variables.js +0 -2
  134. package/dist/m365/pa/commands/solution/solution-init.js +0 -126
  135. package/dist/m365/pa/commands/solution/solution-reference-add.js +0 -88
  136. package/dist/m365/pa/template-instantiator.js +0 -57
  137. package/docs/docs/cmd/pa/pcf/pcf-init.mdx +0 -56
  138. package/docs/docs/cmd/pa/solution/solution-init.mdx +0 -46
  139. package/docs/docs/cmd/pa/solution/solution-reference-add.mdx +0 -42
@@ -127,18 +127,16 @@ class SpoSiteAddCommand extends SpoCommand {
127
127
  requestOptions.data.request.Owner = args.options.owners;
128
128
  }
129
129
  }
130
- const res = await request.post(requestOptions);
130
+ const response = await request.post(requestOptions);
131
131
  if (isTeamSite) {
132
- if (res.ErrorMessage !== null) {
133
- throw res.ErrorMessage;
134
- }
135
- else {
136
- await logger.log(res.SiteUrl);
132
+ if (response.ErrorMessage !== null) {
133
+ throw response.ErrorMessage;
137
134
  }
135
+ await logger.log(response.SiteUrl);
138
136
  }
139
137
  else {
140
- if (res.SiteStatus === 2) {
141
- await logger.log(res.SiteUrl);
138
+ if (response.SiteStatus === 2) {
139
+ await logger.log(response.SiteUrl);
142
140
  }
143
141
  else {
144
142
  throw 'An error has occurred while creating the site';
@@ -155,7 +153,7 @@ class SpoSiteAddCommand extends SpoCommand {
155
153
  this.context = await spo.ensureFormDigest(this.spoAdminUrl, logger, this.context, this.debug);
156
154
  let exists;
157
155
  if (args.options.removeDeletedSite) {
158
- exists = await this.siteExistsInTheRecycleBin(args.options.url, logger);
156
+ exists = await this.siteExists(args.options.url, logger);
159
157
  }
160
158
  else {
161
159
  // assume site doesn't exist
@@ -189,166 +187,121 @@ class SpoSiteAddCommand extends SpoCommand {
189
187
  },
190
188
  data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="4" ObjectPathId="3" /><ObjectPath Id="6" ObjectPathId="5" /><Query Id="7" ObjectPathId="3"><Query SelectAllProperties="true"><Properties /></Query></Query><Query Id="8" ObjectPathId="5"><Query SelectAllProperties="false"><Properties><Property Name="IsComplete" ScalarProperty="true" /><Property Name="PollingInterval" ScalarProperty="true" /></Properties></Query></Query></Actions><ObjectPaths><Constructor Id="3" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /><Method Id="5" ParentId="3" Name="CreateSite"><Parameters><Parameter TypeId="{11f84fff-b8cf-47b6-8b50-34e692656606}"><Property Name="CompatibilityLevel" Type="Int32">0</Property><Property Name="Lcid" Type="UInt32">${lcid}</Property><Property Name="Owner" Type="String">${formatting.escapeXml(args.options.owners)}</Property><Property Name="StorageMaximumLevel" Type="Int64">${storageQuota}</Property><Property Name="StorageWarningLevel" Type="Int64">${storageQuotaWarningLevel}</Property><Property Name="Template" Type="String">${formatting.escapeXml(webTemplate)}</Property><Property Name="TimeZoneId" Type="Int32">${args.options.timeZone}</Property><Property Name="Title" Type="String">${formatting.escapeXml(args.options.title)}</Property><Property Name="Url" Type="String">${formatting.escapeXml(args.options.url)}</Property><Property Name="UserCodeMaximumLevel" Type="Double">${resourceQuota}</Property><Property Name="UserCodeWarningLevel" Type="Double">${resourceQuotaWarningLevel}</Property></Parameter></Parameters></Method></ObjectPaths></Request>`
191
189
  };
192
- const res = await request.post(requestOptions);
190
+ const response = await request.post(requestOptions);
191
+ const json = JSON.parse(response);
192
+ const responseContent = json[0];
193
+ if (responseContent.ErrorInfo) {
194
+ throw responseContent.ErrorInfo.ErrorMessage;
195
+ }
196
+ const operation = json[json.length - 1];
197
+ const isComplete = operation.IsComplete;
198
+ if (!args.options.wait || isComplete) {
199
+ return;
200
+ }
193
201
  await new Promise((resolve, reject) => {
194
- const json = JSON.parse(res);
195
- const response = json[0];
196
- if (response.ErrorInfo) {
197
- reject(response.ErrorInfo.ErrorMessage);
198
- }
199
- else {
200
- const operation = json[json.length - 1];
201
- const isComplete = operation.IsComplete;
202
- if (!args.options.wait || isComplete) {
203
- resolve();
204
- return;
205
- }
206
- setTimeout(() => {
207
- spo.waitUntilFinished({
208
- operationId: JSON.stringify(operation._ObjectIdentity_),
209
- siteUrl: this.spoAdminUrl,
210
- resolve,
211
- reject,
212
- logger,
213
- currentContext: this.context,
214
- verbose: this.verbose,
215
- debug: this.debug
216
- });
217
- }, operation.PollingInterval);
218
- }
202
+ setTimeout(() => {
203
+ spo.waitUntilFinished({
204
+ operationId: JSON.stringify(operation._ObjectIdentity_),
205
+ siteUrl: this.spoAdminUrl,
206
+ resolve,
207
+ reject,
208
+ logger,
209
+ currentContext: this.context,
210
+ verbose: this.verbose,
211
+ debug: this.debug
212
+ });
213
+ }, operation.PollingInterval);
219
214
  });
220
215
  }
221
216
  catch (err) {
222
217
  this.handleRejectedPromise(err);
223
218
  }
224
219
  }
225
- siteExistsInTheRecycleBin(url, logger) {
226
- return new Promise((resolve, reject) => {
227
- spo
228
- .ensureFormDigest(this.spoAdminUrl, logger, this.context, this.debug)
229
- .then(async (res) => {
230
- this.context = res;
231
- if (this.verbose) {
232
- await logger.logToStderr(`Checking if the site ${url} exists...`);
233
- }
234
- const requestOptions = {
235
- url: `${this.spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
236
- headers: {
237
- 'X-RequestDigest': this.context.FormDigestValue
238
- },
239
- data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="197" ObjectPathId="196" /><ObjectPath Id="199" ObjectPathId="198" /><Query Id="200" ObjectPathId="198"><Query SelectAllProperties="true"><Properties /></Query></Query></Actions><ObjectPaths><Constructor Id="196" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /><Method Id="198" ParentId="196" Name="GetSitePropertiesByUrl"><Parameters><Parameter Type="String">${formatting.escapeXml(url)}</Parameter><Parameter Type="Boolean">false</Parameter></Parameters></Method></ObjectPaths></Request>`
240
- };
241
- return request.post(requestOptions);
242
- })
243
- .then((res) => {
244
- const json = JSON.parse(res);
245
- const response = json[0];
246
- if (response.ErrorInfo) {
247
- if (response.ErrorInfo.ErrorTypeName === 'Microsoft.Online.SharePoint.Common.SpoNoSiteException') {
248
- return Promise.resolve(false);
249
- }
250
- else {
251
- return Promise.reject(response.ErrorInfo.ErrorMessage);
252
- }
253
- }
254
- else {
255
- const site = json[json.length - 1];
256
- if (site.Status === 'Recycled') {
257
- return Promise.reject(true);
258
- }
259
- else {
260
- return Promise.resolve(false);
261
- }
262
- }
263
- })
264
- .then(async () => {
265
- if (this.verbose) {
266
- await logger.logToStderr(`Site doesn't exist. Checking if the site ${url} exists in the recycle bin...`);
267
- }
268
- const requestOptions = {
269
- url: `${this.spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
270
- headers: {
271
- 'X-RequestDigest': this.context.FormDigestValue
272
- },
273
- data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="181" ObjectPathId="180" /><Query Id="182" ObjectPathId="180"><Query SelectAllProperties="true"><Properties /></Query></Query></Actions><ObjectPaths><Method Id="180" ParentId="175" Name="GetDeletedSitePropertiesByUrl"><Parameters><Parameter Type="String">${formatting.escapeXml(url)}</Parameter></Parameters></Method><Constructor Id="175" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /></ObjectPaths></Request>`
274
- };
275
- return request.post(requestOptions);
276
- })
277
- .then((res) => {
278
- const json = JSON.parse(res);
279
- const response = json[0];
280
- if (response.ErrorInfo) {
281
- if (response.ErrorInfo.ErrorTypeName === 'Microsoft.SharePoint.Client.UnknownError') {
282
- resolve(false);
283
- }
284
- else {
285
- reject(response.ErrorInfo.ErrorMessage);
286
- }
287
- }
288
- else {
289
- const site = json[json.length - 1];
290
- if (site.Status === 'Recycled') {
291
- resolve(true);
292
- }
293
- else {
294
- resolve(false);
295
- }
296
- }
297
- }, (error) => {
298
- if (typeof error === 'boolean') {
299
- resolve(error);
300
- }
301
- else {
302
- reject(error);
303
- }
304
- });
305
- });
220
+ async siteExists(url, logger) {
221
+ this.context = await spo.ensureFormDigest(this.spoAdminUrl, logger, this.context, this.debug);
222
+ if (this.verbose) {
223
+ await logger.logToStderr(`Checking if the site ${url} exists...`);
224
+ }
225
+ const requestOptions = {
226
+ url: `${this.spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
227
+ headers: {
228
+ 'X-RequestDigest': this.context.FormDigestValue
229
+ },
230
+ data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="197" ObjectPathId="196" /><ObjectPath Id="199" ObjectPathId="198" /><Query Id="200" ObjectPathId="198"><Query SelectAllProperties="true"><Properties /></Query></Query></Actions><ObjectPaths><Constructor Id="196" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /><Method Id="198" ParentId="196" Name="GetSitePropertiesByUrl"><Parameters><Parameter Type="String">${formatting.escapeXml(url)}</Parameter><Parameter Type="Boolean">false</Parameter></Parameters></Method></ObjectPaths></Request>`
231
+ };
232
+ const response = await request.post(requestOptions);
233
+ const json = JSON.parse(response);
234
+ const responseContent = json[0];
235
+ if (responseContent.ErrorInfo) {
236
+ if (responseContent.ErrorInfo.ErrorTypeName === 'Microsoft.Online.SharePoint.Common.SpoNoSiteException') {
237
+ return await this.siteExistsInTheRecycleBin(url, logger);
238
+ }
239
+ throw responseContent.ErrorInfo.ErrorMessage;
240
+ }
241
+ else {
242
+ const site = json[json.length - 1];
243
+ return site.Status === 'Recycled';
244
+ }
306
245
  }
307
- deleteSiteFromTheRecycleBin(url, wait, logger) {
308
- return new Promise((resolve, reject) => {
309
- spo
310
- .ensureFormDigest(this.spoAdminUrl, logger, this.context, this.debug)
311
- .then(async (res) => {
312
- this.context = res;
313
- if (this.verbose) {
314
- await logger.logToStderr(`Deleting site ${url} from the recycle bin...`);
315
- }
316
- const requestOptions = {
317
- url: `${this.spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
318
- headers: {
319
- 'X-RequestDigest': this.context.FormDigestValue
320
- },
321
- data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="185" ObjectPathId="184" /><Query Id="186" ObjectPathId="184"><Query SelectAllProperties="false"><Properties><Property Name="IsComplete" ScalarProperty="true" /><Property Name="PollingInterval" ScalarProperty="true" /></Properties></Query></Query></Actions><ObjectPaths><Method Id="184" ParentId="175" Name="RemoveDeletedSite"><Parameters><Parameter Type="String">${formatting.escapeXml(url)}</Parameter></Parameters></Method><Constructor Id="175" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /></ObjectPaths></Request>`
322
- };
323
- return request.post(requestOptions);
324
- })
325
- .then((res) => {
326
- const json = JSON.parse(res);
327
- const response = json[0];
328
- if (response.ErrorInfo) {
329
- reject(response.ErrorInfo.ErrorMessage);
330
- }
331
- else {
332
- const operation = json[json.length - 1];
333
- const isComplete = operation.IsComplete;
334
- if (!wait || isComplete) {
335
- resolve();
336
- return;
337
- }
338
- setTimeout(() => {
339
- spo.waitUntilFinished({
340
- operationId: JSON.stringify(operation._ObjectIdentity_),
341
- siteUrl: this.spoAdminUrl,
342
- resolve,
343
- reject,
344
- logger,
345
- currentContext: this.context,
346
- verbose: this.verbose,
347
- debug: this.debug
348
- });
349
- }, operation.PollingInterval);
350
- }
351
- });
246
+ async siteExistsInTheRecycleBin(url, logger) {
247
+ if (this.verbose) {
248
+ await logger.logToStderr(`Site doesn't exist. Checking if the site ${url} exists in the recycle bin...`);
249
+ }
250
+ const requestOptions = {
251
+ url: `${this.spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
252
+ headers: {
253
+ 'X-RequestDigest': this.context.FormDigestValue
254
+ },
255
+ data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="181" ObjectPathId="180" /><Query Id="182" ObjectPathId="180"><Query SelectAllProperties="true"><Properties /></Query></Query></Actions><ObjectPaths><Method Id="180" ParentId="175" Name="GetDeletedSitePropertiesByUrl"><Parameters><Parameter Type="String">${formatting.escapeXml(url)}</Parameter></Parameters></Method><Constructor Id="175" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /></ObjectPaths></Request>`
256
+ };
257
+ const res = await request.post(requestOptions);
258
+ const json = JSON.parse(res);
259
+ const response = json[0];
260
+ if (response.ErrorInfo) {
261
+ if (response.ErrorInfo.ErrorTypeName === 'Microsoft.SharePoint.Client.UnknownError') {
262
+ return false;
263
+ }
264
+ throw response.ErrorInfo.ErrorMessage;
265
+ }
266
+ const site = json[json.length - 1];
267
+ return site.Status === 'Recycled';
268
+ }
269
+ async deleteSiteFromTheRecycleBin(url, wait, logger) {
270
+ this.context = await spo.ensureFormDigest(this.spoAdminUrl, logger, this.context, this.debug);
271
+ if (this.verbose) {
272
+ await logger.logToStderr(`Deleting site ${url} from the recycle bin...`);
273
+ }
274
+ const requestOptions = {
275
+ url: `${this.spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
276
+ headers: {
277
+ 'X-RequestDigest': this.context.FormDigestValue
278
+ },
279
+ data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="185" ObjectPathId="184" /><Query Id="186" ObjectPathId="184"><Query SelectAllProperties="false"><Properties><Property Name="IsComplete" ScalarProperty="true" /><Property Name="PollingInterval" ScalarProperty="true" /></Properties></Query></Query></Actions><ObjectPaths><Method Id="184" ParentId="175" Name="RemoveDeletedSite"><Parameters><Parameter Type="String">${formatting.escapeXml(url)}</Parameter></Parameters></Method><Constructor Id="175" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /></ObjectPaths></Request>`
280
+ };
281
+ const response = await request.post(requestOptions);
282
+ const json = JSON.parse(response);
283
+ const responseContent = json[0];
284
+ if (responseContent.ErrorInfo) {
285
+ throw responseContent.ErrorInfo.ErrorMessage;
286
+ }
287
+ const operation = json[json.length - 1];
288
+ const isComplete = operation.IsComplete;
289
+ if (!wait || isComplete) {
290
+ return;
291
+ }
292
+ await new Promise((resolve, reject) => {
293
+ setTimeout(() => {
294
+ spo.waitUntilFinished({
295
+ operationId: JSON.stringify(operation._ObjectIdentity_),
296
+ siteUrl: this.spoAdminUrl,
297
+ resolve,
298
+ reject,
299
+ logger,
300
+ currentContext: this.context,
301
+ verbose: this.verbose,
302
+ debug: this.debug
303
+ });
304
+ }, operation.PollingInterval);
352
305
  });
353
306
  }
354
307
  }
@@ -27,12 +27,12 @@ class SpoSiteAppPermissionAddCommand extends GraphCommand {
27
27
  __classPrivateFieldGet(this, _SpoSiteAppPermissionAddCommand_instances, "m", _SpoSiteAppPermissionAddCommand_initValidators).call(this);
28
28
  __classPrivateFieldGet(this, _SpoSiteAppPermissionAddCommand_instances, "m", _SpoSiteAppPermissionAddCommand_initOptionSets).call(this);
29
29
  }
30
- getAppInfo(args) {
30
+ async getAppInfo(args) {
31
31
  if (args.options.appId && args.options.appDisplayName) {
32
- return Promise.resolve({
32
+ return {
33
33
  appId: args.options.appId,
34
34
  displayName: args.options.appDisplayName
35
- });
35
+ };
36
36
  }
37
37
  let endpoint = "";
38
38
  if (args.options.appId) {
@@ -48,21 +48,18 @@ class SpoSiteAppPermissionAddCommand extends GraphCommand {
48
48
  },
49
49
  responseType: 'json'
50
50
  };
51
- return request
52
- .get(appRequestOptions)
53
- .then(response => {
54
- const appItem = response.value[0];
55
- if (!appItem) {
56
- return Promise.reject("The specified Azure AD app does not exist");
57
- }
58
- if (response.value.length > 1) {
59
- return Promise.reject(`Multiple Azure AD app with displayName ${args.options.appDisplayName} found: ${response.value.map(x => x.appId)}`);
60
- }
61
- return Promise.resolve({
62
- appId: appItem.appId,
63
- displayName: appItem.displayName
64
- });
65
- });
51
+ const response = await request.get(appRequestOptions);
52
+ const appItem = response.value[0];
53
+ if (!appItem) {
54
+ throw "The specified Azure AD app does not exist";
55
+ }
56
+ if (response.value.length > 1) {
57
+ throw `Multiple Azure AD app with displayName ${args.options.appDisplayName} found: ${response.value.map(x => x.appId)}`;
58
+ }
59
+ return {
60
+ appId: appItem.appId,
61
+ displayName: appItem.displayName
62
+ };
66
63
  }
67
64
  /**
68
65
  * Checks if the requested permission needs elevation after the initial creation.
@@ -20,15 +20,14 @@ class SpoSiteAppPermissionRemoveCommand extends GraphCommand {
20
20
  constructor() {
21
21
  super();
22
22
  _SpoSiteAppPermissionRemoveCommand_instances.add(this);
23
- this.siteId = '';
24
23
  __classPrivateFieldGet(this, _SpoSiteAppPermissionRemoveCommand_instances, "m", _SpoSiteAppPermissionRemoveCommand_initTelemetry).call(this);
25
24
  __classPrivateFieldGet(this, _SpoSiteAppPermissionRemoveCommand_instances, "m", _SpoSiteAppPermissionRemoveCommand_initOptions).call(this);
26
25
  __classPrivateFieldGet(this, _SpoSiteAppPermissionRemoveCommand_instances, "m", _SpoSiteAppPermissionRemoveCommand_initValidators).call(this);
27
26
  __classPrivateFieldGet(this, _SpoSiteAppPermissionRemoveCommand_instances, "m", _SpoSiteAppPermissionRemoveCommand_initOptionSets).call(this);
28
27
  }
29
- getPermissions() {
28
+ getPermissions(siteId) {
30
29
  const requestOptions = {
31
- url: `${this.resource}/v1.0/sites/${this.siteId}/permissions`,
30
+ url: `${this.resource}/v1.0/sites/${siteId}/permissions`,
32
31
  headers: {
33
32
  accept: 'application/json;odata.metadata=none'
34
33
  },
@@ -36,34 +35,31 @@ class SpoSiteAppPermissionRemoveCommand extends GraphCommand {
36
35
  };
37
36
  return request.get(requestOptions);
38
37
  }
39
- getFilteredPermissions(args, permissions) {
38
+ getFilteredPermissions(options, permissions) {
40
39
  let filterProperty = 'displayName';
41
- let filterValue = args.options.appDisplayName;
42
- if (args.options.appId) {
40
+ let filterValue = options.appDisplayName;
41
+ if (options.appId) {
43
42
  filterProperty = 'id';
44
- filterValue = args.options.appId;
43
+ filterValue = options.appId;
45
44
  }
46
45
  return permissions.filter((p) => {
47
46
  return p.grantedToIdentities.some(({ application }) => application[filterProperty] === filterValue);
48
47
  });
49
48
  }
50
- getPermissionIds(args) {
51
- if (args.options.id) {
52
- return Promise.resolve([args.options.id]);
49
+ async getPermissionIds(siteId, options) {
50
+ if (options.id) {
51
+ return Promise.resolve([options.id]);
53
52
  }
54
- return this
55
- .getPermissions()
56
- .then((res) => {
57
- let permissions = res.value;
58
- if (args.options.appId || args.options.appDisplayName) {
59
- permissions = this.getFilteredPermissions(args, res.value);
60
- }
61
- return Promise.resolve(permissions.map(x => x.id));
62
- });
53
+ const permissionsObject = await this.getPermissions(siteId);
54
+ let permissions = permissionsObject.value;
55
+ if (options.appId || options.appDisplayName) {
56
+ permissions = this.getFilteredPermissions(options, permissionsObject.value);
57
+ }
58
+ return permissions.map(x => x.id);
63
59
  }
64
- removePermissions(permissionId) {
60
+ removePermissions(siteId, permissionId) {
65
61
  const spRequestOptions = {
66
- url: `${this.resource}/v1.0/sites/${this.siteId}/permissions/${permissionId}`,
62
+ url: `${this.resource}/v1.0/sites/${siteId}/permissions/${permissionId}`,
67
63
  headers: {
68
64
  'accept': 'application/json;odata.metadata=none'
69
65
  },
@@ -72,23 +68,8 @@ class SpoSiteAppPermissionRemoveCommand extends GraphCommand {
72
68
  return request.delete(spRequestOptions);
73
69
  }
74
70
  async commandAction(logger, args) {
75
- const removeSiteAppPermission = async () => {
76
- try {
77
- this.siteId = await spo.getSpoGraphSiteId(args.options.siteUrl);
78
- const permissionIdsToRemove = await this.getPermissionIds(args);
79
- const tasks = [];
80
- for (const permissionId of permissionIdsToRemove) {
81
- tasks.push(this.removePermissions(permissionId));
82
- }
83
- const res = await Promise.all(tasks);
84
- await logger.log(res);
85
- }
86
- catch (err) {
87
- this.handleRejectedODataJsonPromise(err);
88
- }
89
- };
90
71
  if (args.options.force) {
91
- await removeSiteAppPermission();
72
+ await this.removeSiteAppPermission(logger, args.options);
92
73
  }
93
74
  else {
94
75
  const result = await Cli.prompt({
@@ -98,10 +79,25 @@ class SpoSiteAppPermissionRemoveCommand extends GraphCommand {
98
79
  message: `Are you sure you want to remove the specified application permission from site ${args.options.siteUrl}?`
99
80
  });
100
81
  if (result.continue) {
101
- await removeSiteAppPermission();
82
+ await this.removeSiteAppPermission(logger, args.options);
102
83
  }
103
84
  }
104
85
  }
86
+ async removeSiteAppPermission(logger, options) {
87
+ try {
88
+ const siteId = await spo.getSpoGraphSiteId(options.siteUrl);
89
+ const permissionIdsToRemove = await this.getPermissionIds(siteId, options);
90
+ const tasks = [];
91
+ for (const permissionId of permissionIdsToRemove) {
92
+ tasks.push(this.removePermissions(siteId, permissionId));
93
+ }
94
+ const response = await Promise.all(tasks);
95
+ await logger.log(response);
96
+ }
97
+ catch (err) {
98
+ this.handleRejectedODataJsonPromise(err);
99
+ }
100
+ }
105
101
  }
106
102
  _SpoSiteAppPermissionRemoveCommand_instances = new WeakSet(), _SpoSiteAppPermissionRemoveCommand_initTelemetry = function _SpoSiteAppPermissionRemoveCommand_initTelemetry() {
107
103
  this.telemetry.push((args) => {
@@ -35,9 +35,9 @@ class SpoSiteAppPermissionSetCommand extends GraphCommand {
35
35
  }
36
36
  return permissions.filter((p) => p.grantedToIdentities.some(({ application }) => application[filterProperty] === filterValue));
37
37
  }
38
- getPermission(args) {
38
+ async getPermission(args) {
39
39
  if (args.options.id) {
40
- return Promise.resolve(args.options.id);
40
+ return args.options.id;
41
41
  }
42
42
  const permissionRequestOptions = {
43
43
  url: `${this.resource}/v1.0/sites/${this.siteId}/permissions`,
@@ -46,18 +46,15 @@ class SpoSiteAppPermissionSetCommand extends GraphCommand {
46
46
  },
47
47
  responseType: 'json'
48
48
  };
49
- return request
50
- .get(permissionRequestOptions)
51
- .then(response => {
52
- const sitePermissionItems = this.getFilteredPermissions(args, response.value);
53
- if (sitePermissionItems.length === 0) {
54
- return Promise.reject('The specified app permission does not exist');
55
- }
56
- if (sitePermissionItems.length > 1) {
57
- return Promise.reject(`Multiple app permissions with displayName ${args.options.appDisplayName} found: ${response.value.map(x => x.grantedToIdentities.map(y => y.application.id))}`);
58
- }
59
- return Promise.resolve(sitePermissionItems[0].id);
60
- });
49
+ const response = await request.get(permissionRequestOptions);
50
+ const sitePermissionItems = this.getFilteredPermissions(args, response.value);
51
+ if (sitePermissionItems.length === 0) {
52
+ throw 'The specified app permission does not exist';
53
+ }
54
+ if (sitePermissionItems.length > 1) {
55
+ throw `Multiple app permissions with displayName ${args.options.appDisplayName} found: ${response.value.map(x => x.grantedToIdentities.map(y => y.application.id))}`;
56
+ }
57
+ return sitePermissionItems[0].id;
61
58
  }
62
59
  async commandAction(logger, args) {
63
60
  try {