@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.
- package/.eslintrc.cjs +0 -2
- package/dist/GlobalOptions.js +1 -7
- package/dist/cli/Cli.js +19 -2
- package/dist/m365/aad/commands/app/app-add.js +8 -8
- package/dist/m365/aad/commands/app/app-role-add.js +5 -5
- package/dist/m365/aad/commands/app/app-set.js +5 -5
- package/dist/m365/aad/commands/policy/policy-list.js +5 -5
- package/dist/m365/cli/commands/cli-issue.js +5 -5
- package/dist/m365/cli/commands/config/config-get.js +5 -5
- package/dist/m365/cli/commands/config/config-reset.js +5 -5
- package/dist/m365/cli/commands/config/config-set.js +5 -5
- package/dist/m365/commands/login.js +5 -5
- package/dist/m365/commands/request.js +1 -1
- package/dist/m365/flow/commands/owner/owner-ensure.js +5 -5
- package/dist/m365/pa/commands/app/app-owner-set.js +5 -5
- package/dist/m365/pa/commands/app/app-permission-ensure.js +5 -5
- package/dist/m365/pa/commands.js +1 -4
- package/dist/m365/planner/commands/task/task-add.js +17 -11
- package/dist/m365/planner/commands/task/task-get.js +35 -25
- package/dist/m365/planner/commands/task/task-list.js +26 -19
- package/dist/m365/planner/commands/task/task-remove.js +39 -34
- package/dist/m365/planner/commands/task/task-set.js +35 -23
- package/dist/m365/purview/commands/retentionlabel/retentionlabel-add.js +14 -14
- package/dist/m365/spfx/commands/package/package-generate.js +15 -15
- package/dist/m365/spfx/commands/project/DeployWorkflow.js +55 -0
- package/dist/m365/spfx/commands/project/project-doctor/{doctor-1.18.0-beta.1.js → doctor-1.18.0-beta.5.js} +1 -1
- package/dist/m365/spfx/commands/project/project-doctor.js +9 -9
- package/dist/m365/spfx/commands/project/project-github-workflow-add.js +157 -0
- package/dist/m365/spfx/commands/project/project-github-workflow-model.js +2 -0
- package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.15.2.js +1 -1
- package/dist/m365/spfx/commands/project/project-upgrade/{upgrade-1.18.0-beta.1.js → upgrade-1.18.0-beta.5.js} +26 -26
- package/dist/m365/spfx/commands/project/project-upgrade.js +14 -14
- package/dist/m365/spfx/commands/spfx-doctor.js +3 -3
- package/dist/m365/spfx/commands.js +1 -0
- package/dist/m365/spo/commands/app/SpoAppBaseCommand.js +27 -26
- package/dist/m365/spo/commands/app/app-add.js +9 -9
- package/dist/m365/spo/commands/applicationcustomizer/applicationcustomizer-add.js +5 -5
- package/dist/m365/spo/commands/applicationcustomizer/applicationcustomizer-list.js +5 -5
- package/dist/m365/spo/commands/commandset/commandset-add.js +11 -11
- package/dist/m365/spo/commands/commandset/commandset-get.js +8 -8
- package/dist/m365/spo/commands/commandset/commandset-list.js +5 -5
- package/dist/m365/spo/commands/commandset/commandset-remove.js +5 -5
- package/dist/m365/spo/commands/commandset/commandset-set.js +11 -11
- package/dist/m365/spo/commands/file/file-move.js +73 -97
- package/dist/m365/spo/commands/file/file-sharinglink-add.js +8 -8
- package/dist/m365/spo/commands/file/file-sharinglink-list.js +5 -5
- package/dist/m365/spo/commands/folder/folder-copy.js +89 -45
- package/dist/m365/spo/commands/folder/folder-move.js +89 -47
- package/dist/m365/spo/commands/list/list-add.js +4 -4
- package/dist/m365/spo/commands/list/list-set.js +4 -4
- package/dist/m365/spo/commands/orgassetslibrary/orgassetslibrary-add.js +34 -5
- package/dist/m365/spo/commands/page/clientsidepages.js +1 -81
- package/dist/m365/spo/commands/propertybag/propertybag-base.js +63 -59
- package/dist/m365/spo/commands/propertybag/propertybag-remove.js +28 -31
- package/dist/m365/spo/commands/serviceprincipal/serviceprincipal-set.js +30 -32
- package/dist/m365/spo/commands/site/FlowsPolicy.js +7 -0
- package/dist/m365/spo/commands/site/site-add.js +114 -161
- package/dist/m365/spo/commands/site/site-apppermission-add.js +15 -18
- package/dist/m365/spo/commands/site/site-apppermission-remove.js +34 -38
- package/dist/m365/spo/commands/site/site-apppermission-set.js +11 -14
- package/dist/m365/spo/commands/site/site-ensure.js +14 -67
- package/dist/m365/spo/commands/site/site-hubsite-disconnect.js +22 -22
- package/dist/m365/spo/commands/site/site-list.js +27 -43
- package/dist/m365/spo/commands/site/site-recyclebinitem-list.js +6 -6
- package/dist/m365/spo/commands/site/site-remove.js +166 -210
- package/dist/m365/spo/commands/site/site-set.js +177 -198
- package/dist/m365/spo/commands/tenant/tenant-commandset-add.js +8 -8
- package/dist/m365/spo/commands/tenant/tenant-commandset-set.js +8 -8
- package/dist/m365/spo/commands/tenant/tenant-settings-set.js +4 -4
- package/dist/m365/spo/commands/theme/theme-remove.js +24 -24
- package/dist/m365/spo/commands/theme/theme-set.js +0 -1
- package/dist/m365/spo/commands/user/user-remove.js +27 -27
- package/dist/m365/spo/commands/web/web-reindex.js +35 -42
- package/dist/m365/spo/commands/web/web-remove.js +21 -21
- package/dist/m365/spo/commands/web/web-roleassignment-add.js +16 -31
- package/dist/m365/spo/commands/web/web-roleassignment-remove.js +33 -44
- package/dist/m365/spo/commands/web/web-roleinheritance-break.js +18 -18
- package/dist/m365/spo/commands/web/web-roleinheritance-reset.js +19 -19
- package/dist/m365/spo/commands/web/web-set.js +5 -5
- package/dist/m365/teams/commands/app/app-list.js +5 -5
- package/dist/m365/teams/commands/chat/chat-member-add.js +5 -5
- package/dist/m365/teams/commands/funsettings/funsettings-set.js +4 -4
- package/dist/m365/teams/commands/guestsettings/guestsettings-set.js +4 -4
- package/dist/m365/teams/commands/membersettings/membersettings-set.js +4 -4
- package/dist/m365/teams/commands/messagingsettings/messagingsettings-set.js +5 -5
- package/dist/m365/teams/commands/team/team-set.js +3 -3
- package/dist/m365/todo/commands/task/task-add.js +6 -6
- package/dist/m365/yammer/commands/message/message-like-set.js +27 -28
- package/dist/m365/yammer/commands/message/message-list.js +67 -86
- package/dist/m365/yammer/commands/message/message-remove.js +18 -18
- package/dist/m365/yammer/commands/yammer-search.js +58 -74
- package/dist/utils/aadGroup.js +18 -0
- package/dist/utils/fsUtil.js +5 -0
- package/dist/utils/spo.js +594 -53
- package/dist/utils/validation.js +0 -3
- package/docs/docs/cmd/planner/task/task-add.mdx +22 -7
- package/docs/docs/cmd/planner/task/task-get.mdx +13 -4
- package/docs/docs/cmd/planner/task/task-list.mdx +22 -7
- package/docs/docs/cmd/planner/task/task-remove.mdx +25 -8
- package/docs/docs/cmd/planner/task/task-set.mdx +22 -7
- package/docs/docs/cmd/spfx/project/project-github-workflow-add.mdx +94 -0
- package/docs/docs/cmd/spo/file/file-move.mdx +36 -18
- package/docs/docs/cmd/spo/folder/folder-copy.mdx +39 -12
- package/docs/docs/cmd/spo/folder/folder-move.mdx +40 -13
- package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-add.mdx +14 -1
- package/docs/docs/cmd/spo/site/site-ensure.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-list.mdx +3 -78
- package/npm-shrinkwrap.json +240 -1417
- package/package.json +6 -7
- package/dist/m365/pa/cds-project-mutator.js +0 -91
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/dataset-template/generated/ManifestTypes.d.ts +0 -11
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/dataset-template/template_ControlManifest.Input.xml +0 -31
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/dataset-template/template_index.ts +0 -51
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/field-template/generated/ManifestTypes.d.ts +0 -12
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/field-template/template_ControlManifest.Input.xml +0 -37
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/field-template/template_index.ts +0 -48
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/index.ts +0 -0
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-dataset-template/template_ControlManifest.Input.xml +0 -31
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-dataset-template/template_index.tsx +0 -58
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-field-template/template_ControlManifest.Input.xml +0 -37
- package/dist/m365/pa/commands/pcf/pcf-init/assets/control/virtual-field-template/template_index.tsx +0 -55
- package/dist/m365/pa/commands/pcf/pcf-init/assets/package.json +0 -19
- package/dist/m365/pa/commands/pcf/pcf-init/assets/pcfconfig.json +0 -3
- package/dist/m365/pa/commands/pcf/pcf-init/assets/template_.gitignore +0 -14
- package/dist/m365/pa/commands/pcf/pcf-init/assets/template_pcfprojecttype.pcfproj +0 -45
- package/dist/m365/pa/commands/pcf/pcf-init/pcf-init-variables.js +0 -2
- package/dist/m365/pa/commands/pcf/pcf-init.js +0 -120
- package/dist/m365/pa/commands/solution/solution-init/assets/Other/Customizations.xml +0 -18
- package/dist/m365/pa/commands/solution/solution-init/assets/Other/Relationships.xml +0 -2
- package/dist/m365/pa/commands/solution/solution-init/assets/Other/template_Solution.xml +0 -94
- package/dist/m365/pa/commands/solution/solution-init/assets/template_.gitignore +0 -2
- package/dist/m365/pa/commands/solution/solution-init/assets/template_solutionprojecttype.cdsproj +0 -44
- package/dist/m365/pa/commands/solution/solution-init/solution-init-variables.js +0 -2
- package/dist/m365/pa/commands/solution/solution-init.js +0 -126
- package/dist/m365/pa/commands/solution/solution-reference-add.js +0 -88
- package/dist/m365/pa/template-instantiator.js +0 -57
- package/docs/docs/cmd/pa/pcf/pcf-init.mdx +0 -56
- package/docs/docs/cmd/pa/solution/solution-init.mdx +0 -46
- 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
|
|
130
|
+
const response = await request.post(requestOptions);
|
|
131
131
|
if (isTeamSite) {
|
|
132
|
-
if (
|
|
133
|
-
throw
|
|
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 (
|
|
141
|
-
await logger.log(
|
|
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.
|
|
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
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
return
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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/${
|
|
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(
|
|
38
|
+
getFilteredPermissions(options, permissions) {
|
|
40
39
|
let filterProperty = 'displayName';
|
|
41
|
-
let filterValue =
|
|
42
|
-
if (
|
|
40
|
+
let filterValue = options.appDisplayName;
|
|
41
|
+
if (options.appId) {
|
|
43
42
|
filterProperty = 'id';
|
|
44
|
-
filterValue =
|
|
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(
|
|
51
|
-
if (
|
|
52
|
-
return Promise.resolve([
|
|
49
|
+
async getPermissionIds(siteId, options) {
|
|
50
|
+
if (options.id) {
|
|
51
|
+
return Promise.resolve([options.id]);
|
|
53
52
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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/${
|
|
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
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
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 {
|