@pnp/cli-microsoft365 5.8.0-beta.5250f08 → 5.8.0-beta.85a4dec

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 (33) hide show
  1. package/dist/m365/commands/commands.js +1 -0
  2. package/dist/m365/commands/request.js +153 -0
  3. package/dist/m365/graph/Changelog.js +3 -0
  4. package/dist/m365/graph/commands/changelog/changelog-list.js +160 -0
  5. package/dist/m365/graph/commands.js +1 -0
  6. package/dist/m365/onenote/commands/notebook/notebook-list.js +139 -0
  7. package/dist/m365/onenote/commands.js +7 -0
  8. package/dist/m365/planner/commands/task/task-get.js +7 -0
  9. package/dist/m365/pp/commands/environment/environment-list.js +1 -1
  10. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.16.0-beta.1.js +23 -0
  11. package/dist/m365/spfx/commands/project/project-doctor.js +2 -1
  12. package/dist/m365/spfx/commands/spfx-doctor.js +90 -79
  13. package/dist/m365/spo/commands/hubsite/hubsite-unregister.js +1 -1
  14. package/dist/m365/spo/commands/list/list-roleassignment-add.js +9 -0
  15. package/dist/m365/spo/commands/list/list-roleassignment-remove.js +57 -28
  16. package/dist/m365/spo/commands/listitem/listitem-roleassignment-remove.js +206 -0
  17. package/dist/m365/spo/commands/web/web-roleassignment-add.js +187 -0
  18. package/dist/m365/spo/commands/web/web-roleassignment-remove.js +170 -0
  19. package/dist/m365/spo/commands.js +3 -0
  20. package/dist/request.js +6 -2
  21. package/docs/docs/cmd/adaptivecard/adaptivecard-send.md +0 -20
  22. package/docs/docs/cmd/graph/changelog/changelog-list.md +53 -0
  23. package/docs/docs/cmd/onenote/notebook/notebook-list.md +70 -0
  24. package/docs/docs/cmd/pp/environment/environment-list.md +1 -1
  25. package/docs/docs/cmd/request.md +76 -0
  26. package/docs/docs/cmd/spfx/spfx-doctor.md +3 -3
  27. package/docs/docs/cmd/spo/hubsite/hubsite-unregister.md +2 -2
  28. package/docs/docs/cmd/spo/list/list-roleassignment-add.md +2 -2
  29. package/docs/docs/cmd/spo/list/list-roleassignment-remove.md +5 -2
  30. package/docs/docs/cmd/spo/listitem/listitem-roleassignment-remove.md +67 -0
  31. package/docs/docs/cmd/spo/web/web-roleassignment-add.md +57 -0
  32. package/docs/docs/cmd/spo/web/web-roleassignment-remove.md +54 -0
  33. package/package.json +2 -1
@@ -71,9 +71,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
71
71
  _SpfxDoctorCommand_instances.add(this);
72
72
  this.versions = {
73
73
  '1.0.0': {
74
- gulp: {
75
- range: '^3',
76
- fix: 'npm i -g gulp@3'
74
+ gulpCli: {
75
+ range: '^1 || ^2',
76
+ fix: 'npm i -g gulp-cli@2'
77
77
  },
78
78
  node: {
79
79
  range: '^6',
@@ -86,9 +86,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
86
86
  }
87
87
  },
88
88
  '1.1.0': {
89
- gulp: {
90
- range: '^3',
91
- fix: 'npm i -g gulp@3'
89
+ gulpCli: {
90
+ range: '^1 || ^2',
91
+ fix: 'npm i -g gulp-cli@2'
92
92
  },
93
93
  node: {
94
94
  range: '^6',
@@ -101,9 +101,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
101
101
  }
102
102
  },
103
103
  '1.2.0': {
104
- gulp: {
105
- range: '^3',
106
- fix: 'npm i -g gulp@3'
104
+ gulpCli: {
105
+ range: '^1 || ^2',
106
+ fix: 'npm i -g gulp-cli@2'
107
107
  },
108
108
  node: {
109
109
  range: '^6',
@@ -116,9 +116,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
116
116
  }
117
117
  },
118
118
  '1.4.0': {
119
- gulp: {
120
- range: '^3',
121
- fix: 'npm i -g gulp@3'
119
+ gulpCli: {
120
+ range: '^1 || ^2',
121
+ fix: 'npm i -g gulp-cli@2'
122
122
  },
123
123
  node: {
124
124
  range: '^6',
@@ -131,9 +131,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
131
131
  }
132
132
  },
133
133
  '1.4.1': {
134
- gulp: {
135
- range: '^3',
136
- fix: 'npm i -g gulp@3'
134
+ gulpCli: {
135
+ range: '^1 || ^2',
136
+ fix: 'npm i -g gulp-cli@2'
137
137
  },
138
138
  node: {
139
139
  range: '^6 || ^8',
@@ -146,9 +146,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
146
146
  }
147
147
  },
148
148
  '1.5.0': {
149
- gulp: {
150
- range: '^3',
151
- fix: 'npm i -g gulp@3'
149
+ gulpCli: {
150
+ range: '^1 || ^2',
151
+ fix: 'npm i -g gulp-cli@2'
152
152
  },
153
153
  node: {
154
154
  range: '^6 || ^8',
@@ -161,9 +161,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
161
161
  }
162
162
  },
163
163
  '1.5.1': {
164
- gulp: {
165
- range: '^3',
166
- fix: 'npm i -g gulp@3'
164
+ gulpCli: {
165
+ range: '^1 || ^2',
166
+ fix: 'npm i -g gulp-cli@2'
167
167
  },
168
168
  node: {
169
169
  range: '^6 || ^8',
@@ -176,9 +176,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
176
176
  }
177
177
  },
178
178
  '1.6.0': {
179
- gulp: {
180
- range: '^3',
181
- fix: 'npm i -g gulp@3'
179
+ gulpCli: {
180
+ range: '^1 || ^2',
181
+ fix: 'npm i -g gulp-cli@2'
182
182
  },
183
183
  node: {
184
184
  range: '^6 || ^8',
@@ -191,9 +191,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
191
191
  }
192
192
  },
193
193
  '1.7.0': {
194
- gulp: {
195
- range: '^3',
196
- fix: 'npm i -g gulp@3'
194
+ gulpCli: {
195
+ range: '^1 || ^2',
196
+ fix: 'npm i -g gulp-cli@2'
197
197
  },
198
198
  node: {
199
199
  range: '^8',
@@ -206,9 +206,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
206
206
  }
207
207
  },
208
208
  '1.7.1': {
209
- gulp: {
210
- range: '^3',
211
- fix: 'npm i -g gulp@3'
209
+ gulpCli: {
210
+ range: '^1 || ^2',
211
+ fix: 'npm i -g gulp-cli@2'
212
212
  },
213
213
  node: {
214
214
  range: '^8',
@@ -221,9 +221,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
221
221
  }
222
222
  },
223
223
  '1.8.0': {
224
- gulp: {
225
- range: '^3',
226
- fix: 'npm i -g gulp@3'
224
+ gulpCli: {
225
+ range: '^1 || ^2',
226
+ fix: 'npm i -g gulp-cli@2'
227
227
  },
228
228
  node: {
229
229
  range: '^8',
@@ -236,9 +236,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
236
236
  }
237
237
  },
238
238
  '1.8.1': {
239
- gulp: {
240
- range: '^3',
241
- fix: 'npm i -g gulp@3'
239
+ gulpCli: {
240
+ range: '^1 || ^2',
241
+ fix: 'npm i -g gulp-cli@2'
242
242
  },
243
243
  node: {
244
244
  range: '^8',
@@ -251,9 +251,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
251
251
  }
252
252
  },
253
253
  '1.8.2': {
254
- gulp: {
255
- range: '^3',
256
- fix: 'npm i -g gulp@3'
254
+ gulpCli: {
255
+ range: '^1 || ^2',
256
+ fix: 'npm i -g gulp-cli@2'
257
257
  },
258
258
  node: {
259
259
  range: '^8 || ^10',
@@ -266,9 +266,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
266
266
  }
267
267
  },
268
268
  '1.9.0': {
269
- gulp: {
270
- range: '^3',
271
- fix: 'npm i -g gulp@3'
269
+ gulpCli: {
270
+ range: '^1 || ^2',
271
+ fix: 'npm i -g gulp-cli@2'
272
272
  },
273
273
  node: {
274
274
  range: '^8 || ^10',
@@ -281,9 +281,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
281
281
  }
282
282
  },
283
283
  '1.9.1': {
284
- gulp: {
285
- range: '^3',
286
- fix: 'npm i -g gulp@3'
284
+ gulpCli: {
285
+ range: '^1 || ^2',
286
+ fix: 'npm i -g gulp-cli@2'
287
287
  },
288
288
  node: {
289
289
  range: '^10',
@@ -296,9 +296,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
296
296
  }
297
297
  },
298
298
  '1.10.0': {
299
- gulp: {
300
- range: '^3',
301
- fix: 'npm i -g gulp@3'
299
+ gulpCli: {
300
+ range: '^1 || ^2',
301
+ fix: 'npm i -g gulp-cli@2'
302
302
  },
303
303
  node: {
304
304
  range: '^10',
@@ -311,9 +311,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
311
311
  }
312
312
  },
313
313
  '1.11.0': {
314
- gulp: {
315
- range: '^3',
316
- fix: 'npm i -g gulp@3'
314
+ gulpCli: {
315
+ range: '^1 || ^2',
316
+ fix: 'npm i -g gulp-cli@2'
317
317
  },
318
318
  node: {
319
319
  range: '^10',
@@ -326,9 +326,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
326
326
  }
327
327
  },
328
328
  '1.12.0': {
329
- gulp: {
330
- range: '^4',
331
- fix: 'npm i -g gulp@4'
329
+ gulpCli: {
330
+ range: '^1 || ^2',
331
+ fix: 'npm i -g gulp-cli@2'
332
332
  },
333
333
  node: {
334
334
  range: '^12',
@@ -341,9 +341,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
341
341
  }
342
342
  },
343
343
  '1.12.1': {
344
- gulp: {
345
- range: '^4',
346
- fix: 'npm i -g gulp@4'
344
+ gulpCli: {
345
+ range: '^1 || ^2',
346
+ fix: 'npm i -g gulp-cli@2'
347
347
  },
348
348
  node: {
349
349
  range: '^12 || ^14',
@@ -356,9 +356,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
356
356
  }
357
357
  },
358
358
  '1.13.0': {
359
- gulp: {
360
- range: '^4',
361
- fix: 'npm i -g gulp@4'
359
+ gulpCli: {
360
+ range: '^1 || ^2',
361
+ fix: 'npm i -g gulp-cli@2'
362
362
  },
363
363
  node: {
364
364
  range: '^12 || ^14',
@@ -371,9 +371,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
371
371
  }
372
372
  },
373
373
  '1.13.1': {
374
- gulp: {
375
- range: '^4',
376
- fix: 'npm i -g gulp@4'
374
+ gulpCli: {
375
+ range: '^1 || ^2',
376
+ fix: 'npm i -g gulp-cli@2'
377
377
  },
378
378
  node: {
379
379
  range: '^12 || ^14',
@@ -386,9 +386,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
386
386
  }
387
387
  },
388
388
  '1.14.0': {
389
- gulp: {
390
- range: '^4',
391
- fix: 'npm i -g gulp@4'
389
+ gulpCli: {
390
+ range: '^1 || ^2',
391
+ fix: 'npm i -g gulp-cli@2'
392
392
  },
393
393
  node: {
394
394
  range: '^12 || ^14',
@@ -401,9 +401,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
401
401
  }
402
402
  },
403
403
  '1.15.0': {
404
- gulp: {
405
- range: '^4',
406
- fix: 'npm i -g gulp@4'
404
+ gulpCli: {
405
+ range: '^1 || ^2',
406
+ fix: 'npm i -g gulp-cli@2'
407
407
  },
408
408
  node: {
409
409
  range: '^12.13 || ^14.15 || ^16.13',
@@ -416,9 +416,9 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
416
416
  }
417
417
  },
418
418
  '1.15.2': {
419
- gulp: {
420
- range: '^4',
421
- fix: 'npm i -g gulp@4'
419
+ gulpCli: {
420
+ range: '^1 || ^2',
421
+ fix: 'npm i -g gulp-cli@2'
422
422
  },
423
423
  node: {
424
424
  range: '^12.13 || ^14.15 || ^16.13',
@@ -472,7 +472,8 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
472
472
  .then(_ => this.checkSharePointCompatibility(spfxVersion, prerequisites, args, fixes, logger))
473
473
  .then(_ => this.checkNodeVersion(prerequisites, fixes, logger))
474
474
  .then(_ => this.checkYo(prerequisites, fixes, logger))
475
- .then(_ => this.checkGulp(prerequisites, fixes, logger))
475
+ .then(_ => this.checkGulp(fixes, logger))
476
+ .then(_ => this.checkGulpCli(prerequisites, fixes, logger))
476
477
  .then(_ => this.checkTypeScript(fixes, logger))
477
478
  .then(_ => {
478
479
  if (fixes.length > 0) {
@@ -534,16 +535,26 @@ class SpfxDoctorCommand extends AnonymousCommand_1.default {
534
535
  }
535
536
  });
536
537
  }
537
- checkGulp(prerequisites, fixes, logger) {
538
+ checkGulpCli(prerequisites, fixes, logger) {
539
+ return this
540
+ .getPackageVersion('gulp-cli', PackageSearchMode.GlobalOnly, HandlePromise.Continue, logger)
541
+ .then((gulpCliVersion) => {
542
+ if (gulpCliVersion) {
543
+ this.checkStatus('gulp-cli', gulpCliVersion, prerequisites.gulpCli, OptionalOrRequired.Required, fixes, logger);
544
+ }
545
+ else {
546
+ logger.log(this.getStatus(CheckStatus.Failure, `gulp-cli not found`));
547
+ fixes.push(prerequisites.gulpCli.fix);
548
+ }
549
+ });
550
+ }
551
+ checkGulp(fixes, logger) {
538
552
  return this
539
553
  .getPackageVersion('gulp', PackageSearchMode.GlobalOnly, HandlePromise.Continue, logger)
540
554
  .then((gulpVersion) => {
541
555
  if (gulpVersion) {
542
- this.checkStatus('gulp', gulpVersion, prerequisites.gulp, OptionalOrRequired.Required, fixes, logger);
543
- }
544
- else {
545
- logger.log(this.getStatus(CheckStatus.Failure, `gulp not found`));
546
- fixes.push(prerequisites.gulp.fix);
556
+ logger.log(this.getStatus(CheckStatus.Failure, `gulp should be removed`));
557
+ fixes.push('npm un -g gulp');
547
558
  }
548
559
  });
549
560
  }
@@ -32,7 +32,7 @@ class SpoHubSiteUnregisterCommand extends SpoCommand_1.default {
32
32
  return commands_1.default.HUBSITE_UNREGISTER;
33
33
  }
34
34
  get description() {
35
- return 'Unregisters the specifies site collection as a hub site';
35
+ return 'Unregisters the specified site collection as a hub site';
36
36
  }
37
37
  commandAction(logger, args, cb) {
38
38
  const unregisterHubSite = () => {
@@ -193,14 +193,23 @@ _SpoListRoleAssignmentAddCommand_instances = new WeakSet(), _SpoListRoleAssignme
193
193
  if (listOptions.some(item => item !== undefined) && listOptions.filter(item => item !== undefined).length > 1) {
194
194
  return `Specify either list id or title or list url`;
195
195
  }
196
+ if (listOptions.filter(item => item !== undefined).length === 0) {
197
+ return `Specify at least list id or title or list url`;
198
+ }
196
199
  const principalOptions = [args.options.principalId, args.options.upn, args.options.groupName];
197
200
  if (principalOptions.some(item => item !== undefined) && principalOptions.filter(item => item !== undefined).length > 1) {
198
201
  return `Specify either principalId id or upn or groupName`;
199
202
  }
203
+ if (principalOptions.filter(item => item !== undefined).length === 0) {
204
+ return `Specify at least principalId id or upn or groupName`;
205
+ }
200
206
  const roleDefinitionOptions = [args.options.roleDefinitionId, args.options.roleDefinitionName];
201
207
  if (roleDefinitionOptions.some(item => item !== undefined) && roleDefinitionOptions.filter(item => item !== undefined).length > 1) {
202
208
  return `Specify either roleDefinitionId id or roleDefinitionName`;
203
209
  }
210
+ if (roleDefinitionOptions.filter(item => item !== undefined).length === 0) {
211
+ return `Specify at least roleDefinitionId id or roleDefinitionName`;
212
+ }
204
213
  return true;
205
214
  }));
206
215
  };
@@ -37,36 +37,56 @@ class SpoListRoleAssignmentRemoveCommand extends SpoCommand_1.default {
37
37
  return 'Removes a role assignment from list permissions';
38
38
  }
39
39
  commandAction(logger, args, cb) {
40
- if (this.verbose) {
41
- logger.logToStderr(`Removing role assignment frm list in site at ${args.options.webUrl}...`);
42
- }
43
- let requestUrl = `${args.options.webUrl}/_api/web/`;
44
- if (args.options.listId) {
45
- requestUrl += `lists(guid'${utils_1.formatting.encodeQueryParameter(args.options.listId)}')/`;
46
- }
47
- else if (args.options.listTitle) {
48
- requestUrl += `lists/getByTitle('${utils_1.formatting.encodeQueryParameter(args.options.listTitle)}')/`;
49
- }
50
- else if (args.options.listUrl) {
51
- const listServerRelativeUrl = utils_1.urlUtil.getServerRelativePath(args.options.webUrl, args.options.listUrl);
52
- requestUrl += `GetList('${utils_1.formatting.encodeQueryParameter(listServerRelativeUrl)}')/`;
53
- }
54
- if (args.options.upn) {
55
- this.GetUserPrincipalId(args.options)
56
- .then((userPrincipalId) => {
57
- args.options.principalId = userPrincipalId;
58
- this.RemoveRoleAssignment(requestUrl, logger, args.options, cb);
59
- }, (err) => this.handleRejectedODataJsonPromise(err, logger, cb));
60
- }
61
- else if (args.options.groupName) {
62
- this.GetGroupPrincipalId(args.options)
63
- .then((groupPrincipalId) => {
64
- args.options.principalId = groupPrincipalId;
40
+ const removeRoleAssignment = () => {
41
+ if (this.verbose) {
42
+ logger.logToStderr(`Removing role assignment from list in site at ${args.options.webUrl}...`);
43
+ }
44
+ let requestUrl = `${args.options.webUrl}/_api/web/`;
45
+ if (args.options.listId) {
46
+ requestUrl += `lists(guid'${utils_1.formatting.encodeQueryParameter(args.options.listId)}')/`;
47
+ }
48
+ else if (args.options.listTitle) {
49
+ requestUrl += `lists/getByTitle('${utils_1.formatting.encodeQueryParameter(args.options.listTitle)}')/`;
50
+ }
51
+ else if (args.options.listUrl) {
52
+ const listServerRelativeUrl = utils_1.urlUtil.getServerRelativePath(args.options.webUrl, args.options.listUrl);
53
+ requestUrl += `GetList('${utils_1.formatting.encodeQueryParameter(listServerRelativeUrl)}')/`;
54
+ }
55
+ if (args.options.upn) {
56
+ this.GetUserPrincipalId(args.options)
57
+ .then((userPrincipalId) => {
58
+ args.options.principalId = userPrincipalId;
59
+ this.RemoveRoleAssignment(requestUrl, logger, args.options, cb);
60
+ }, (err) => this.handleRejectedODataJsonPromise(err, logger, cb));
61
+ }
62
+ else if (args.options.groupName) {
63
+ this.GetGroupPrincipalId(args.options)
64
+ .then((groupPrincipalId) => {
65
+ args.options.principalId = groupPrincipalId;
66
+ this.RemoveRoleAssignment(requestUrl, logger, args.options, cb);
67
+ }, (err) => this.handleRejectedODataJsonPromise(err, logger, cb));
68
+ }
69
+ else {
65
70
  this.RemoveRoleAssignment(requestUrl, logger, args.options, cb);
66
- }, (err) => this.handleRejectedODataJsonPromise(err, logger, cb));
71
+ }
72
+ };
73
+ if (args.options.confirm) {
74
+ removeRoleAssignment();
67
75
  }
68
76
  else {
69
- this.RemoveRoleAssignment(requestUrl, logger, args.options, cb);
77
+ cli_1.Cli.prompt({
78
+ type: 'confirm',
79
+ name: 'continue',
80
+ default: false,
81
+ message: `Are you sure you want to remove role assignment from list ${args.options.listId || args.options.listTitle} from site ${args.options.webUrl}?`
82
+ }, (result) => {
83
+ if (!result.continue) {
84
+ cb();
85
+ }
86
+ else {
87
+ removeRoleAssignment();
88
+ }
89
+ });
70
90
  }
71
91
  }
72
92
  RemoveRoleAssignment(requestUrl, logger, options, cb) {
@@ -125,7 +145,8 @@ _SpoListRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListRoleAssig
125
145
  listUrl: typeof args.options.listUrl !== 'undefined',
126
146
  principalId: typeof args.options.principalId !== 'undefined',
127
147
  upn: typeof args.options.upn !== 'undefined',
128
- groupName: typeof args.options.groupName !== 'undefined'
148
+ groupName: typeof args.options.groupName !== 'undefined',
149
+ confirm: (!(!args.options.confirm)).toString()
129
150
  });
130
151
  });
131
152
  }, _SpoListRoleAssignmentRemoveCommand_initOptions = function _SpoListRoleAssignmentRemoveCommand_initOptions() {
@@ -143,6 +164,8 @@ _SpoListRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListRoleAssig
143
164
  option: '--upn [upn]'
144
165
  }, {
145
166
  option: '--groupName [groupName]'
167
+ }, {
168
+ option: '--confirm'
146
169
  });
147
170
  }, _SpoListRoleAssignmentRemoveCommand_initValidators = function _SpoListRoleAssignmentRemoveCommand_initValidators() {
148
171
  this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
@@ -160,10 +183,16 @@ _SpoListRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListRoleAssig
160
183
  if (listOptions.some(item => item !== undefined) && listOptions.filter(item => item !== undefined).length > 1) {
161
184
  return `Specify either list id or title or list url`;
162
185
  }
186
+ if (listOptions.filter(item => item !== undefined).length === 0) {
187
+ return `Specify at least list id or title or list url`;
188
+ }
163
189
  const principalOptions = [args.options.principalId, args.options.upn, args.options.groupName];
164
190
  if (principalOptions.some(item => item !== undefined) && principalOptions.filter(item => item !== undefined).length > 1) {
165
191
  return `Specify either principalId id or upn or groupName`;
166
192
  }
193
+ if (principalOptions.filter(item => item !== undefined).length === 0) {
194
+ return `Specify at least principalId id or upn or groupName`;
195
+ }
167
196
  return true;
168
197
  }));
169
198
  };