@pnp/cli-microsoft365 11.1.0-beta.8311bbf → 11.1.0-beta.871ff4d

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 (190) hide show
  1. package/.devproxy/api-specs/sharepoint.yaml +41 -0
  2. package/allCommands.json +1 -1
  3. package/allCommandsFull.json +1 -1
  4. package/dist/Auth.js +10 -7
  5. package/dist/Command.js +2 -2
  6. package/dist/auth/msalCachePlugin.js +6 -2
  7. package/dist/autocomplete.js +6 -2
  8. package/dist/chili/chili.js +2 -1
  9. package/dist/cli/cli.js +4 -2
  10. package/dist/config.js +0 -1
  11. package/dist/m365/adaptivecard/commands/adaptivecard-send.js +2 -2
  12. package/dist/m365/app/commands/permission/permission-list.js +4 -2
  13. package/dist/m365/commands/setup.js +6 -3
  14. package/dist/m365/entra/commands/app/app-role-add.js +1 -1
  15. package/dist/m365/entra/commands/group/group-add.js +1 -1
  16. package/dist/m365/entra/commands/group/group-set.js +1 -1
  17. package/dist/m365/entra/commands/license/license-list.js +5 -0
  18. package/dist/m365/entra/commands/m365group/m365group-add.js +0 -1
  19. package/dist/m365/file/commands/convert/convert-pdf.js +1 -6
  20. package/dist/m365/flow/commands/flow-export.js +8 -5
  21. package/dist/m365/flow/commands/run/run-get.js +3 -3
  22. package/dist/m365/graph/commands/schemaextension/schemaextension-set.js +1 -1
  23. package/dist/m365/pa/commands/app/app-export.js +1 -1
  24. package/dist/m365/pa/commands/app/app-get.js +1 -1
  25. package/dist/m365/planner/commands/tenant/tenant-settings-list.js +5 -0
  26. package/dist/m365/pp/commands/solution/solution-publisher-get.js +1 -1
  27. package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-list.js +5 -0
  28. package/dist/m365/purview/commands/retentionlabel/retentionlabel-list.js +5 -0
  29. package/dist/m365/spfx/commands/package/package-generate.js +3 -1
  30. package/dist/m365/spfx/commands/project/base-project-command.js +13 -5
  31. package/dist/m365/spfx/commands/project/project-doctor/rules/FN021007_PKG_only_one_rush_stack_compiler_installed.js +1 -1
  32. package/dist/m365/spfx/commands/project/project-externalize/rules/PnPJsRule.js +6 -4
  33. package/dist/m365/spfx/commands/project/project-model/ScssFile.js +3 -1
  34. package/dist/m365/spfx/commands/project/project-model/TsFile.js +6 -2
  35. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.15.2.js +1 -1
  36. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.16.0.js +2 -0
  37. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.17.0.js +2 -0
  38. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.18.0.js +2 -0
  39. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.19.0.js +2 -0
  40. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.20.0.js +2 -0
  41. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.21.0.js +2 -0
  42. package/dist/m365/spfx/commands/spfx-doctor.js +5 -5
  43. package/dist/m365/spo/commands/file/file-add.js +4 -2
  44. package/dist/m365/spo/commands/file/file-rename.js +3 -4
  45. package/dist/m365/spo/commands/hubsite/hubsite-list.js +1 -1
  46. package/dist/m365/spo/commands/listitem/listitem-attachment-add.js +1 -1
  47. package/dist/m365/spo/commands/listitem/listitem-batch-set.js +9 -5
  48. package/dist/m365/spo/commands/page/clientsidepages.js +12 -12
  49. package/dist/m365/spo/commands/page/page-add.js +4 -2
  50. package/dist/m365/spo/commands/page/page-clientsidewebpart-add.js +1 -0
  51. package/dist/m365/spo/commands/page/page-set.js +4 -2
  52. package/dist/m365/spo/commands/page/page-text-add.js +1 -0
  53. package/dist/m365/spo/commands/propertybag/propertybag-base.js +34 -54
  54. package/dist/m365/spo/commands/theme/theme-apply.js +1 -1
  55. package/dist/m365/spo/commands/web/web-alert-list.js +107 -0
  56. package/dist/m365/spo/commands/web/web-alert-remove.js +59 -0
  57. package/dist/m365/spo/commands/web/web-reindex.js +17 -27
  58. package/dist/m365/spo/commands.js +2 -0
  59. package/dist/m365/teams/commands/tab/tab-add.js +9 -3
  60. package/dist/m365/viva/commands/connections/connections-app-create.js +1 -1
  61. package/dist/m365/viva/commands/engage/engage-community-user-add.js +1 -1
  62. package/dist/m365/viva/commands/engage/engage-community-user-remove.js +1 -1
  63. package/dist/telemetry.js +3 -1
  64. package/dist/utils/accessToken.js +4 -0
  65. package/dist/utils/cache.js +3 -2
  66. package/dist/utils/customAppScope.js +1 -1
  67. package/dist/utils/directoryExtension.js +1 -1
  68. package/dist/utils/entraAdministrativeUnit.js +1 -1
  69. package/dist/utils/entraApp.js +2 -2
  70. package/dist/utils/entraDevice.js +1 -1
  71. package/dist/utils/entraServicePrincipal.js +2 -2
  72. package/dist/utils/formatting.js +1 -1
  73. package/dist/utils/md.js +2 -2
  74. package/dist/utils/odata.js +2 -0
  75. package/dist/utils/planner.js +1 -1
  76. package/dist/utils/powerPlatform.js +2 -2
  77. package/dist/utils/roleDefinition.js +2 -2
  78. package/dist/utils/spo.js +10 -11
  79. package/dist/utils/urlUtil.js +1 -1
  80. package/dist/utils/validation.js +1 -1
  81. package/dist/utils/vivaEngage.js +3 -3
  82. package/docs/docs/cmd/booking/business/business-get.mdx +18 -1
  83. package/docs/docs/cmd/booking/business/business-list.mdx +18 -1
  84. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-add.mdx +19 -0
  85. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-get.mdx +19 -0
  86. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-list.mdx +19 -0
  87. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-member-add.mdx +21 -0
  88. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-member-get.mdx +19 -0
  89. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-member-list.mdx +19 -0
  90. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-member-remove.mdx +21 -0
  91. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-remove.mdx +21 -0
  92. package/docs/docs/cmd/entra/administrativeunit/administrativeunit-roleassignment-add.mdx +19 -0
  93. package/docs/docs/cmd/entra/app/app-add.mdx +18 -0
  94. package/docs/docs/cmd/entra/app/app-get.mdx +19 -1
  95. package/docs/docs/cmd/entra/app/app-list.mdx +18 -1
  96. package/docs/docs/cmd/entra/app/app-remove.mdx +20 -0
  97. package/docs/docs/cmd/entra/app/app-set.mdx +20 -0
  98. package/docs/docs/cmd/entra/approleassignment/approleassignment-add.mdx +18 -0
  99. package/docs/docs/cmd/entra/approleassignment/approleassignment-list.mdx +18 -0
  100. package/docs/docs/cmd/entra/approleassignment/approleassignment-remove.mdx +20 -0
  101. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-add.mdx +14 -0
  102. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-get.mdx +15 -0
  103. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-list.mdx +14 -0
  104. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-remove.mdx +14 -0
  105. package/docs/docs/cmd/entra/group/group-add.mdx +18 -0
  106. package/docs/docs/cmd/entra/group/group-get.mdx +18 -0
  107. package/docs/docs/cmd/entra/group/group-list.mdx +18 -0
  108. package/docs/docs/cmd/entra/group/group-member-add.mdx +20 -0
  109. package/docs/docs/cmd/entra/group/group-member-list.mdx +18 -0
  110. package/docs/docs/cmd/entra/group/group-member-remove.mdx +20 -0
  111. package/docs/docs/cmd/entra/group/group-member-set.mdx +20 -0
  112. package/docs/docs/cmd/entra/group/group-remove.mdx +20 -0
  113. package/docs/docs/cmd/entra/group/group-set.mdx +20 -0
  114. package/docs/docs/cmd/entra/groupsetting/groupsetting-add.mdx +19 -0
  115. package/docs/docs/cmd/entra/groupsetting/groupsetting-get.mdx +19 -0
  116. package/docs/docs/cmd/entra/groupsetting/groupsetting-list.mdx +19 -0
  117. package/docs/docs/cmd/entra/groupsetting/groupsetting-remove.mdx +21 -0
  118. package/docs/docs/cmd/entra/groupsetting/groupsetting-set.mdx +21 -0
  119. package/docs/docs/cmd/entra/m365group/m365group-add.mdx +19 -0
  120. package/docs/docs/cmd/entra/m365group/m365group-get.mdx +19 -0
  121. package/docs/docs/cmd/entra/m365group/m365group-list.mdx +19 -0
  122. package/docs/docs/cmd/entra/m365group/m365group-recyclebinitem-clear.mdx +14 -0
  123. package/docs/docs/cmd/entra/m365group/m365group-recyclebinitem-list.mdx +19 -0
  124. package/docs/docs/cmd/entra/m365group/m365group-recyclebinitem-remove.mdx +14 -0
  125. package/docs/docs/cmd/entra/m365group/m365group-recyclebinitem-restore.mdx +21 -0
  126. package/docs/docs/cmd/entra/m365group/m365group-remove.mdx +21 -0
  127. package/docs/docs/cmd/entra/m365group/m365group-renew.mdx +21 -0
  128. package/docs/docs/cmd/entra/m365group/m365group-report-activitycounts.mdx +18 -0
  129. package/docs/docs/cmd/entra/m365group/m365group-report-activitydetail.mdx +18 -0
  130. package/docs/docs/cmd/entra/m365group/m365group-report-activityfilecounts.mdx +18 -0
  131. package/docs/docs/cmd/entra/m365group/m365group-report-activitygroupcounts.mdx +18 -0
  132. package/docs/docs/cmd/entra/m365group/m365group-report-activitystorage.mdx +18 -0
  133. package/docs/docs/cmd/entra/m365group/m365group-set.mdx +21 -0
  134. package/docs/docs/cmd/entra/m365group/m365group-teamify.mdx +19 -0
  135. package/docs/docs/cmd/entra/multitenant/multitenant-add.mdx +18 -0
  136. package/docs/docs/cmd/entra/multitenant/multitenant-get.mdx +18 -1
  137. package/docs/docs/cmd/entra/multitenant/multitenant-remove.mdx +20 -0
  138. package/docs/docs/cmd/entra/multitenant/multitenant-set.mdx +20 -0
  139. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-add.mdx +20 -0
  140. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-list.mdx +17 -0
  141. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-remove.mdx +20 -0
  142. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-set.mdx +20 -0
  143. package/docs/docs/cmd/entra/organization/organization-list.mdx +19 -2
  144. package/docs/docs/cmd/entra/pim/pim-role-assignment-add.mdx +18 -0
  145. package/docs/docs/cmd/entra/pim/pim-role-assignment-eligibility-list.mdx +18 -0
  146. package/docs/docs/cmd/entra/pim/pim-role-assignment-list.mdx +18 -0
  147. package/docs/docs/cmd/entra/pim/pim-role-assignment-remove.mdx +18 -0
  148. package/docs/docs/cmd/entra/pim/pim-role-request-list.mdx +18 -0
  149. package/docs/docs/cmd/graph/directoryextension/directoryextension-add.mdx +18 -0
  150. package/docs/docs/cmd/graph/directoryextension/directoryextension-get.mdx +18 -0
  151. package/docs/docs/cmd/graph/directoryextension/directoryextension-list.mdx +18 -0
  152. package/docs/docs/cmd/graph/directoryextension/directoryextension-remove.mdx +20 -0
  153. package/docs/docs/cmd/graph/schemaextension/schemaextension-add.mdx +18 -1
  154. package/docs/docs/cmd/graph/schemaextension/schemaextension-get.mdx +18 -1
  155. package/docs/docs/cmd/graph/schemaextension/schemaextension-list.mdx +19 -1
  156. package/docs/docs/cmd/graph/schemaextension/schemaextension-remove.mdx +20 -0
  157. package/docs/docs/cmd/graph/schemaextension/schemaextension-set.mdx +23 -3
  158. package/docs/docs/cmd/graph/subscription/subscription-add.mdx +27 -6
  159. package/docs/docs/cmd/outlook/mail/mail-send.mdx +21 -0
  160. package/docs/docs/cmd/outlook/mailbox/mailbox-settings-get.mdx +20 -1
  161. package/docs/docs/cmd/outlook/mailbox/mailbox-settings-set.mdx +20 -1
  162. package/docs/docs/cmd/outlook/room/room-list.mdx +19 -0
  163. package/docs/docs/cmd/outlook/roomlist/roomlist-list.mdx +19 -0
  164. package/docs/docs/cmd/purview/retentionevent/retentionevent-add.mdx +18 -0
  165. package/docs/docs/cmd/purview/retentionevent/retentionevent-get.mdx +18 -0
  166. package/docs/docs/cmd/purview/retentionevent/retentionevent-list.mdx +18 -0
  167. package/docs/docs/cmd/purview/retentionevent/retentionevent-remove.mdx +20 -0
  168. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-add.mdx +18 -0
  169. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-get.mdx +18 -0
  170. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-list.mdx +18 -0
  171. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-remove.mdx +21 -1
  172. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-set.mdx +21 -1
  173. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-add.mdx +11 -0
  174. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-get.mdx +12 -1
  175. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-list.mdx +12 -1
  176. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-remove.mdx +14 -1
  177. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-set.mdx +13 -0
  178. package/docs/docs/cmd/purview/sensitivitylabel/sensitivitylabel-get.mdx +18 -0
  179. package/docs/docs/cmd/purview/sensitivitylabel/sensitivitylabel-list.mdx +18 -0
  180. package/docs/docs/cmd/purview/sensitivitylabel/sensitivitylabel-policysettings-list.mdx +18 -0
  181. package/docs/docs/cmd/purview/threatassessment/threatassessment-add.mdx +12 -0
  182. package/docs/docs/cmd/purview/threatassessment/threatassessment-get.mdx +19 -0
  183. package/docs/docs/cmd/purview/threatassessment/threatassessment-list.mdx +19 -0
  184. package/docs/docs/cmd/spo/web/web-alert-list.mdx +187 -0
  185. package/docs/docs/cmd/spo/web/web-alert-remove.mdx +65 -0
  186. package/eslint-rules/lib/rules/correct-command-class-name.js +18 -2
  187. package/eslint.config.mjs +270 -0
  188. package/npm-shrinkwrap.json +562 -445
  189. package/package.json +9 -7
  190. package/.eslintrc.cjs +0 -289
@@ -0,0 +1,59 @@
1
+ import commands from '../../commands.js';
2
+ import SpoCommand from '../../../base/SpoCommand.js';
3
+ import { globalOptionsZod } from '../../../../Command.js';
4
+ import { z } from 'zod';
5
+ import { zod } from '../../../../utils/zod.js';
6
+ import { validation } from '../../../../utils/validation.js';
7
+ import { formatting } from '../../../../utils/formatting.js';
8
+ import request from '../../../../request.js';
9
+ import { cli } from '../../../../cli/cli.js';
10
+ const options = globalOptionsZod
11
+ .extend({
12
+ webUrl: zod.alias('u', z.string()
13
+ .refine(url => validation.isValidSharePointUrl(url) === true, url => ({
14
+ message: `'${url}' is not a valid SharePoint URL.`
15
+ }))),
16
+ id: z.string()
17
+ .refine(id => validation.isValidGuid(id), id => ({
18
+ message: `'${id}' is not a valid GUID.`
19
+ })),
20
+ force: zod.alias('f', z.boolean().optional())
21
+ })
22
+ .strict();
23
+ class SpoWebAlertRemoveCommand extends SpoCommand {
24
+ get name() {
25
+ return commands.WEB_ALERT_REMOVE;
26
+ }
27
+ get description() {
28
+ return 'Removes an alert from a SharePoint list';
29
+ }
30
+ get schema() {
31
+ return options;
32
+ }
33
+ async commandAction(logger, args) {
34
+ if (!args.options.force) {
35
+ const result = await cli.promptForConfirmation({ message: `Are you sure you want to remove the alert with id '${args.options.id}' from site '${args.options.webUrl}'?` });
36
+ if (!result) {
37
+ return;
38
+ }
39
+ }
40
+ try {
41
+ if (this.verbose) {
42
+ await logger.logToStderr(`Removing alert with ID '${args.options.id}' from site '${args.options.webUrl}'...`);
43
+ }
44
+ const requestOptions = {
45
+ url: `${args.options.webUrl}/_api/web/Alerts/DeleteAlert('${formatting.encodeQueryParameter(args.options.id)}')`,
46
+ headers: {
47
+ accept: 'application/json;odata=nometadata'
48
+ },
49
+ responseType: 'json'
50
+ };
51
+ await request.delete(requestOptions);
52
+ }
53
+ catch (err) {
54
+ this.handleRejectedODataJsonPromise(err);
55
+ }
56
+ }
57
+ }
58
+ export default new SpoWebAlertRemoveCommand();
59
+ //# sourceMappingURL=web-alert-remove.js.map
@@ -67,24 +67,19 @@ class SpoWebReindexCommand extends SpoCommand {
67
67
  }
68
68
  }
69
69
  async reindexLists(webUrl, requestDigest, logger, webIdentityResp) {
70
- try {
71
- if (this.debug) {
72
- await logger.logToStderr(`Retrieving information about lists...`);
73
- }
74
- const requestOptions = {
75
- url: `${webUrl}/_api/web/lists?$select=NoCrawl,Title,RootFolder/Properties,RootFolder/ServerRelativeUrl&$expand=RootFolder/Properties`,
76
- headers: {
77
- 'accept': 'application/json;odata=nometadata'
78
- },
79
- responseType: 'json'
80
- };
81
- const lists = await request.get(requestOptions);
82
- const promises = lists.value.map(l => this.reindexList(l, webUrl, requestDigest, webIdentityResp, logger));
83
- await Promise.all(promises);
84
- }
85
- catch (err) {
86
- throw err;
70
+ if (this.debug) {
71
+ await logger.logToStderr(`Retrieving information about lists...`);
87
72
  }
73
+ const requestOptions = {
74
+ url: `${webUrl}/_api/web/lists?$select=NoCrawl,Title,RootFolder/Properties,RootFolder/ServerRelativeUrl&$expand=RootFolder/Properties`,
75
+ headers: {
76
+ 'accept': 'application/json;odata=nometadata'
77
+ },
78
+ responseType: 'json'
79
+ };
80
+ const lists = await request.get(requestOptions);
81
+ const promises = lists.value.map(l => this.reindexList(l, webUrl, requestDigest, webIdentityResp, logger));
82
+ await Promise.all(promises);
88
83
  }
89
84
  async reindexList(list, webUrl, requestDigest, webIdentityResp, logger) {
90
85
  if (list.NoCrawl) {
@@ -93,16 +88,11 @@ class SpoWebReindexCommand extends SpoCommand {
93
88
  }
94
89
  return;
95
90
  }
96
- try {
97
- const folderIdentityResp = await spo.getFolderIdentity(webIdentityResp.objectIdentity, webUrl, list.RootFolder.ServerRelativeUrl, requestDigest);
98
- let searchversion = list.RootFolder.Properties.vti_x005f_searchversion || 0;
99
- searchversion++;
100
- await SpoPropertyBagBaseCommand.setProperty('vti_searchversion', searchversion.toString(), webUrl, requestDigest, folderIdentityResp, logger, this.debug, list.RootFolder.ServerRelativeUrl);
101
- return;
102
- }
103
- catch (err) {
104
- throw (err);
105
- }
91
+ const folderIdentityResp = await spo.getFolderIdentity(webIdentityResp.objectIdentity, webUrl, list.RootFolder.ServerRelativeUrl, requestDigest);
92
+ let searchversion = list.RootFolder.Properties.vti_x005f_searchversion || 0;
93
+ searchversion++;
94
+ await SpoPropertyBagBaseCommand.setProperty('vti_searchversion', searchversion.toString(), webUrl, requestDigest, folderIdentityResp, logger, this.debug, list.RootFolder.ServerRelativeUrl);
95
+ return;
106
96
  }
107
97
  }
108
98
  _SpoWebReindexCommand_instances = new WeakSet(), _SpoWebReindexCommand_initOptions = function _SpoWebReindexCommand_initOptions() {
@@ -355,6 +355,8 @@ export default {
355
355
  USERPROFILE_GET: `${prefix} userprofile get`,
356
356
  USERPROFILE_SET: `${prefix} userprofile set`,
357
357
  WEB_ADD: `${prefix} web add`,
358
+ WEB_ALERT_LIST: `${prefix} web alert list`,
359
+ WEB_ALERT_REMOVE: `${prefix} web alert remove`,
358
360
  WEB_CLIENTSIDEWEBPART_LIST: `${prefix} web clientsidewebpart list`,
359
361
  WEB_GET: `${prefix} web get`,
360
362
  WEB_INSTALLEDLANGUAGE_LIST: `${prefix} web installedlanguage list`,
@@ -70,9 +70,15 @@ class TeamsTabAddCommand extends GraphCommand {
70
70
  if (options.contentUrl) {
71
71
  requestBody.configuration.contentUrl = options.contentUrl;
72
72
  }
73
- options.entityId ? requestBody.configuration.entityId = options.entityId : null;
74
- options.removeUrl ? requestBody.configuration.removeUrl = options.removeUrl : null;
75
- options.websiteUrl ? requestBody.configuration.websiteUrl = options.websiteUrl : null;
73
+ if (options.entityId) {
74
+ requestBody.configuration.entityId = options.entityId;
75
+ }
76
+ if (options.removeUrl) {
77
+ requestBody.configuration.removeUrl = options.removeUrl;
78
+ }
79
+ if (options.websiteUrl) {
80
+ requestBody.configuration.websiteUrl = options.websiteUrl;
81
+ }
76
82
  Object.keys(options).forEach(key => {
77
83
  if (excludeOptions.indexOf(key) === -1) {
78
84
  requestBody.configuration[key] = `${options[key]}`;
@@ -44,7 +44,7 @@ class VivaConnectionsAppCreateCommand extends AnonymousCommand {
44
44
  const appPortalUrl = `${args.options.portalUrl}${args.options.portalUrl.indexOf('?') > -1 ? '&' : '?'}app=portals`;
45
45
  let searchUrlPath = portalUrl.hostname;
46
46
  if (portalUrl.pathname.indexOf('/teams') > -1 || portalUrl.pathname.indexOf('/sites') > -1) {
47
- const firstTwoUrlSegments = portalUrl.pathname.match(/^\/[^\/]+\/[^\/]+/);
47
+ const firstTwoUrlSegments = portalUrl.pathname.match(/^\/[^/]+\/[^/]+/);
48
48
  if (firstTwoUrlSegments) {
49
49
  searchUrlPath += firstTwoUrlSegments[0];
50
50
  }
@@ -48,7 +48,7 @@ class VivaEngageCommunityUserAddCommand extends GraphCommand {
48
48
  .refine(options => options.ids || options.userNames, {
49
49
  message: 'Specify either of ids or userNames.'
50
50
  })
51
- .refine(options => typeof options.userNames !== undefined && typeof options.ids !== undefined, {
51
+ .refine(options => options.userNames !== undefined || options.ids !== undefined, {
52
52
  message: 'Specify either ids or userNames, but not both.'
53
53
  });
54
54
  }
@@ -48,7 +48,7 @@ class VivaEngageCommunityUserRemoveCommand extends GraphCommand {
48
48
  .refine(options => options.id || options.userName, {
49
49
  message: 'Specify either of id or userName.'
50
50
  })
51
- .refine(options => typeof options.userName !== undefined && typeof options.id !== undefined, {
51
+ .refine(options => options.userName !== undefined || options.id !== undefined, {
52
52
  message: 'Specify either id or userName, but not both.'
53
53
  });
54
54
  }
package/dist/telemetry.js CHANGED
@@ -21,7 +21,9 @@ async function trackTelemetry(object) {
21
21
  }
22
22
  await appInsights.flush();
23
23
  }
24
- catch { }
24
+ catch {
25
+ // Do nothing
26
+ }
25
27
  }
26
28
  export const telemetry = {
27
29
  trackEvent: async (commandName, properties, exception) => {
@@ -16,6 +16,7 @@ export const accessToken = {
16
16
  isAppOnlyAccessToken = token.idtyp === 'app';
17
17
  }
18
18
  catch {
19
+ // Do nothing
19
20
  }
20
21
  return isAppOnlyAccessToken;
21
22
  },
@@ -34,6 +35,7 @@ export const accessToken = {
34
35
  tenantId = token.tid;
35
36
  }
36
37
  catch {
38
+ // Do nothing
37
39
  }
38
40
  return tenantId;
39
41
  },
@@ -54,6 +56,7 @@ export const accessToken = {
54
56
  userName = token.upn || token.app_displayname;
55
57
  }
56
58
  catch {
59
+ // Do nothing
57
60
  }
58
61
  return userName;
59
62
  },
@@ -72,6 +75,7 @@ export const accessToken = {
72
75
  userId = token.oid;
73
76
  }
74
77
  catch {
78
+ // Do nothing
75
79
  }
76
80
  return userId;
77
81
  },
@@ -28,7 +28,9 @@ export const cache = {
28
28
  // eslint-disable-next-line @typescript-eslint/no-empty-function
29
29
  fs.writeFile(cacheFilePath, value, () => { });
30
30
  }
31
- catch { }
31
+ catch {
32
+ // Do nothing
33
+ }
32
34
  },
33
35
  clearExpired(cb) {
34
36
  // we don't need to wait for this to complete
@@ -58,7 +60,6 @@ export const cache = {
58
60
  // remove files that haven't been accessed in the last 24 hours
59
61
  if (stats.atime.getTime() < Date.now() - 24 * 60 * 60 * 1000) {
60
62
  // we don't need to wait for the file to be deleted
61
- // eslint-disable-next-line @typescript-eslint/no-empty-function
62
63
  fs.unlink(path.join(cacheFolderPath, file), () => {
63
64
  if (cb && index === numFiles - 1) {
64
65
  cb();
@@ -16,7 +16,7 @@ export const customAppScope = {
16
16
  }
17
17
  const customAppScopes = await odata.getAllItems(url);
18
18
  if (customAppScopes.length === 0) {
19
- throw `The specified custom application scope '${displayName}' does not exist.`;
19
+ throw new Error(`The specified custom application scope '${displayName}' does not exist.`);
20
20
  }
21
21
  if (customAppScopes.length > 1) {
22
22
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', customAppScopes);
@@ -16,7 +16,7 @@ export const directoryExtension = {
16
16
  }
17
17
  const extensionProperties = await odata.getAllItems(url);
18
18
  if (extensionProperties.length === 0) {
19
- throw `The specified directory extension '${name}' does not exist.`;
19
+ throw new Error(`The specified directory extension '${name}' does not exist.`);
20
20
  }
21
21
  // there can be only one directory extension with a given name
22
22
  return extensionProperties[0];
@@ -24,7 +24,7 @@ export const entraAdministrativeUnit = {
24
24
  const graphResource = 'https://graph.microsoft.com';
25
25
  const administrativeUnits = await odata.getAllItems(`${graphResource}/v1.0/directory/administrativeUnits?$filter=displayName eq '${formatting.encodeQueryParameter(displayName)}'${queryString}`);
26
26
  if (administrativeUnits.length === 0) {
27
- throw `The specified administrative unit '${displayName}' does not exist.`;
27
+ throw new Error(`The specified administrative unit '${displayName}' does not exist.`);
28
28
  }
29
29
  if (administrativeUnits.length > 1) {
30
30
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', administrativeUnits);
@@ -305,7 +305,7 @@ export const entraApp = {
305
305
  }
306
306
  const apps = await odata.getAllItems(url);
307
307
  if (apps.length === 0) {
308
- throw `App with appId '${appId}' not found in Microsoft Entra ID`;
308
+ throw new Error(`App with appId '${appId}' not found in Microsoft Entra ID.`);
309
309
  }
310
310
  return apps[0];
311
311
  },
@@ -316,7 +316,7 @@ export const entraApp = {
316
316
  }
317
317
  const apps = await odata.getAllItems(url);
318
318
  if (apps.length === 0) {
319
- throw `App with name '${appName}' not found in Microsoft Entra ID`;
319
+ throw new Error(`App with name '${appName}' not found in Microsoft Entra ID.`);
320
320
  }
321
321
  if (apps.length > 1) {
322
322
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', apps);
@@ -12,7 +12,7 @@ export const entraDevice = {
12
12
  async getDeviceByDisplayName(displayName) {
13
13
  const devices = await odata.getAllItems(`${graphResource}/v1.0/devices?$filter=displayName eq '${formatting.encodeQueryParameter(displayName)}'`);
14
14
  if (devices.length === 0) {
15
- throw `The specified device '${displayName}' does not exist.`;
15
+ throw new Error(`The specified device '${displayName}' does not exist.`);
16
16
  }
17
17
  if (devices.length > 1) {
18
18
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', devices);
@@ -17,7 +17,7 @@ export const entraServicePrincipal = {
17
17
  }
18
18
  const apps = await odata.getAllItems(url);
19
19
  if (apps.length === 0) {
20
- throw `Service principal with appId '${appId}' not found in Microsoft Entra ID`;
20
+ throw new Error(`Service principal with appId '${appId}' not found in Microsoft Entra ID.`);
21
21
  }
22
22
  return apps[0];
23
23
  },
@@ -35,7 +35,7 @@ export const entraServicePrincipal = {
35
35
  }
36
36
  const apps = await odata.getAllItems(url);
37
37
  if (apps.length === 0) {
38
- throw `Service principal with name '${appName}' not found in Microsoft Entra ID`;
38
+ throw new Error(`Service principal with name '${appName}' not found in Microsoft Entra ID.`);
39
39
  }
40
40
  if (apps.length > 1) {
41
41
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', apps);
@@ -99,7 +99,7 @@ export const formatting = {
99
99
  },
100
100
  openTypesEncoder(value) {
101
101
  return value
102
- .replace(/\%/g, '%25')
102
+ .replace(/%/g, '%25')
103
103
  .replace(/\./g, '%2E')
104
104
  .replace(/:/g, '%3A')
105
105
  .replace(/@/g, '%40')
package/dist/utils/md.js CHANGED
@@ -32,7 +32,7 @@ function convertDd(md) {
32
32
  });
33
33
  }
34
34
  function convertHyperlinks(md) {
35
- return md.replace(/(?!\[1m)(?!\[22m)\[([^\]]+)\]\(([^\)]+)\)/gm, (match, label, url) => {
35
+ return md.replace(/(?!\[1m)(?!\[22m)\[([^\]]+)\]\(([^)]+)\)/gm, (match, label, url) => {
36
36
  // if the link is the same as the content, return just the link
37
37
  if (label === url) {
38
38
  return url;
@@ -54,7 +54,7 @@ function convertContentTabs(md) {
54
54
  .trim();
55
55
  }
56
56
  function convertCodeFences(md) {
57
- const regex = new RegExp('^```.*?(?:\r?\n)(.*?)```(?:\r?\n)', 'gms');
57
+ const regex = /^```.*?(?:\r?\n)(.*?)```(?:\r?\n)/gms;
58
58
  return md.replace(regex, (match, code) => {
59
59
  return `${code.replace(/^(.+)$/gm, ' $1')}${EOL}`;
60
60
  });
@@ -1,4 +1,6 @@
1
1
  import request from "../request.js";
2
+ /* eslint-enable no-redeclare */
3
+ // eslint-disable-next-line no-redeclare
2
4
  async function getAllItems(param1, metadata) {
3
5
  let items = [];
4
6
  const requestOptions = typeof param1 !== 'string' ? param1 : {
@@ -22,7 +22,7 @@ export const planner = {
22
22
  try {
23
23
  return await request.get(requestOptions);
24
24
  }
25
- catch (ex) {
25
+ catch {
26
26
  throw Error(`Planner plan with id '${id}' was not found.`);
27
27
  }
28
28
  },
@@ -39,7 +39,7 @@ export const powerPlatform = {
39
39
  const response = await request.get(requestOptions);
40
40
  return response;
41
41
  }
42
- catch (ex) {
42
+ catch {
43
43
  throw Error(`The specified Power Page website with id '${id}' does not exist.`);
44
44
  }
45
45
  },
@@ -97,7 +97,7 @@ export const powerPlatform = {
97
97
  */
98
98
  async getSolutionByName(dynamicsApiUrl, name) {
99
99
  const requestOptions = {
100
- url: `${dynamicsApiUrl}/api/data/v9.0/solutions?$filter=isvisible eq true and uniquename eq \'${name}\'&$expand=publisherid($select=friendlyname)&$select=solutionid,uniquename,version,publisherid,installedon,solutionpackageversion,friendlyname,versionnumber&api-version=9.1`,
100
+ url: `${dynamicsApiUrl}/api/data/v9.0/solutions?$filter=isvisible eq true and uniquename eq '${name}'&$expand=publisherid($select=friendlyname)&$select=solutionid,uniquename,version,publisherid,installedon,solutionpackageversion,friendlyname,versionnumber&api-version=9.1`,
101
101
  headers: {
102
102
  accept: 'application/json;odata.metadata=none'
103
103
  },
@@ -17,7 +17,7 @@ export const roleDefinition = {
17
17
  }
18
18
  const roleDefinitions = await odata.getAllItems(url);
19
19
  if (roleDefinitions.length === 0) {
20
- throw `The specified role definition '${displayName}' does not exist.`;
20
+ throw new Error(`The specified role definition '${displayName}' does not exist.`);
21
21
  }
22
22
  if (roleDefinitions.length > 1) {
23
23
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', roleDefinitions);
@@ -61,7 +61,7 @@ export const roleDefinition = {
61
61
  }
62
62
  const roleDefinitions = await odata.getAllItems(url);
63
63
  if (roleDefinitions.length === 0) {
64
- throw `The specified role definition '${displayName}' does not exist.`;
64
+ throw new Error(`The specified role definition '${displayName}' does not exist.`);
65
65
  }
66
66
  if (roleDefinitions.length > 1) {
67
67
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', roleDefinitions);
package/dist/utils/spo.js CHANGED
@@ -114,7 +114,7 @@ export const spo = {
114
114
  try {
115
115
  await auth.storeConnectionInfo();
116
116
  }
117
- catch (e) {
117
+ catch {
118
118
  if (debug) {
119
119
  await logger.logToStderr('Error while storing connection info');
120
120
  }
@@ -123,7 +123,7 @@ export const spo = {
123
123
  },
124
124
  async getSpoAdminUrl(logger, debug) {
125
125
  const spoUrl = await spo.getSpoUrl(logger, debug);
126
- return (spoUrl.replace(/(https:\/\/)([^\.]+)(.*)/, '$1$2-admin$3'));
126
+ return (spoUrl.replace(/(https:\/\/)([^.]+)(.*)/, '$1$2-admin$3'));
127
127
  },
128
128
  async getTenantId(logger, debug) {
129
129
  if (auth.connection.spoTenantId) {
@@ -151,7 +151,7 @@ export const spo = {
151
151
  try {
152
152
  await auth.storeConnectionInfo();
153
153
  }
154
- catch (e) {
154
+ catch {
155
155
  if (debug) {
156
156
  await logger.logToStderr('Error while storing connection info');
157
157
  }
@@ -749,10 +749,7 @@ export const spo = {
749
749
  }
750
750
  }
751
751
  else {
752
- if (siteDesignId) {
753
- siteDesignId = siteDesignId;
754
- }
755
- else {
752
+ if (!siteDesignId) {
756
753
  if (siteDesign) {
757
754
  switch (siteDesign) {
758
755
  case 'Topic':
@@ -1592,10 +1589,12 @@ export const spo = {
1592
1589
  const requestBody = {
1593
1590
  formValues: requestBodyOptions
1594
1591
  };
1595
- contentTypeName && requestBody.formValues.push({
1596
- FieldName: 'ContentType',
1597
- FieldValue: contentTypeName
1598
- });
1592
+ if (contentTypeName) {
1593
+ requestBody.formValues.push({
1594
+ FieldName: 'ContentType',
1595
+ FieldValue: contentTypeName
1596
+ });
1597
+ }
1599
1598
  const requestOptions = {
1600
1599
  url: `${absoluteListUrl}/items(${itemId})/ValidateUpdateListItem()`,
1601
1600
  headers: {
@@ -176,7 +176,7 @@ export const urlUtil = {
176
176
  getTargetSiteAbsoluteUrl(webUrl, url) {
177
177
  const fullUrl = url.startsWith('https://') ? url : urlUtil.getAbsoluteUrl(webUrl, url);
178
178
  // Pattern to match SharePoint URLs
179
- const urlPattern = /https:\/\/[\w\-]+\.sharepoint\.com\/(teams|sites|personal)\/([\w\-]+)/;
179
+ const urlPattern = /https:\/\/[\w-]+\.sharepoint\.com\/(teams|sites|personal)\/([\w-]+)/;
180
180
  const match = fullUrl.match(urlPattern);
181
181
  if (match) {
182
182
  // If a match is found, return the matched URL
@@ -309,7 +309,7 @@ export const validation = {
309
309
  return false;
310
310
  }
311
311
  const hasInvalidProperties = validThemeProperties.map((property) => {
312
- return theme.hasOwnProperty(property);
312
+ return Object.prototype.hasOwnProperty.call(theme, property);
313
313
  }).includes(false);
314
314
  if (hasInvalidProperties) {
315
315
  return false;
@@ -19,7 +19,7 @@ export const vivaEngage = {
19
19
  };
20
20
  const community = await request.get(requestOptions);
21
21
  if (!community) {
22
- throw `The specified Viva Engage community with ID '${communityId}' does not exist.`;
22
+ throw new Error(`The specified Viva Engage community with ID '${communityId}' does not exist.`);
23
23
  }
24
24
  return community;
25
25
  },
@@ -32,7 +32,7 @@ export const vivaEngage = {
32
32
  async getCommunityByDisplayName(displayName, selectProperties) {
33
33
  const communities = await odata.getAllItems(`https://graph.microsoft.com/v1.0/employeeExperience/communities?$filter=displayName eq '${formatting.encodeQueryParameter(displayName)}'&$select=${selectProperties.join(',')}`);
34
34
  if (communities.length === 0) {
35
- throw `The specified Viva Engage community '${displayName}' does not exist.`;
35
+ throw new Error(`The specified Viva Engage community '${displayName}' does not exist.`);
36
36
  }
37
37
  if (communities.length > 1) {
38
38
  const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', communities);
@@ -53,7 +53,7 @@ export const vivaEngage = {
53
53
  const communities = await odata.getAllItems(`https://graph.microsoft.com/v1.0/employeeExperience/communities?$select=${properties.join(',')}`);
54
54
  const filteredCommunity = communities.find(c => c.groupId === entraGroupId);
55
55
  if (!filteredCommunity) {
56
- throw `The Microsoft Entra group with id '${entraGroupId}' is not associated with any Viva Engage community.`;
56
+ throw new Error(`The Microsoft Entra group with id '${entraGroupId}' is not associated with any Viva Engage community.`);
57
57
  }
58
58
  return filteredCommunity;
59
59
  },
@@ -24,6 +24,24 @@ m365 booking business get [options]
24
24
 
25
25
  <Global />
26
26
 
27
+ ## Permissions
28
+ <Tabs>
29
+ <TabItem value="Delegated">
30
+
31
+ | Resource | Permissions |
32
+ |-----------------|-------------------|
33
+ | Microsoft Graph | Bookings.Read.All |
34
+
35
+ </TabItem>
36
+ <TabItem value="Application">
37
+
38
+ | Resource | Permissions |
39
+ |-----------------|-----------------------------------|
40
+ | Microsoft Graph | BookingsAppointment.ReadWrite.All |
41
+
42
+ </TabItem>
43
+ </Tabs>
44
+
27
45
  ## Examples
28
46
 
29
47
  Retrieve the specified Microsoft Bookings business with the specified id.
@@ -186,4 +204,3 @@ m365 booking business get --name 'business name'
186
204
 
187
205
  </TabItem>
188
206
  </Tabs>
189
-
@@ -16,6 +16,24 @@ m365 booking business list [options]
16
16
 
17
17
  <Global />
18
18
 
19
+ ## Permissions
20
+ <Tabs>
21
+ <TabItem value="Delegated">
22
+
23
+ | Resource | Permissions |
24
+ |-----------------|-------------------|
25
+ | Microsoft Graph | Bookings.Read.All |
26
+
27
+ </TabItem>
28
+ <TabItem value="Application">
29
+
30
+ | Resource | Permissions |
31
+ |-----------------|-----------------------------------|
32
+ | Microsoft Graph | BookingsAppointment.ReadWrite.All |
33
+
34
+ </TabItem>
35
+ </Tabs>
36
+
19
37
  ## Examples
20
38
 
21
39
  Returns a list of all Microsoft Bookings businesses that are created for the tenant.
@@ -73,4 +91,3 @@ m365 booking business list
73
91
 
74
92
  </TabItem>
75
93
  </Tabs>
76
-
@@ -35,6 +35,25 @@ To use this command you must be either **Global Administrator** or **Privileged
35
35
 
36
36
  :::
37
37
 
38
+ ## Permissions
39
+
40
+ <Tabs>
41
+ <TabItem value="Delegated">
42
+
43
+ | Resource | Permissions |
44
+ |-----------------|----------------------------------|
45
+ | Microsoft Graph | AdministrativeUnit.ReadWrite.All |
46
+
47
+ </TabItem>
48
+ <TabItem value="Application">
49
+
50
+ | Resource | Permissions |
51
+ |-----------------|----------------------------------|
52
+ | Microsoft Graph | AdministrativeUnit.ReadWrite.All |
53
+
54
+ </TabItem>
55
+ </Tabs>
56
+
38
57
  ## Examples
39
58
 
40
59
  Create an administrative unit with a specific display name
@@ -31,6 +31,25 @@ m365 entra administrativeunit get [options]
31
31
 
32
32
  Using the `--properties` option, you can specify a comma-separated list of administrative unit properties to retrieve from the Microsoft Graph. If you don't specify any properties, the command will output the default properties returned by Graph.
33
33
 
34
+ ## Permissions
35
+
36
+ <Tabs>
37
+ <TabItem value="Delegated">
38
+
39
+ | Resource | Permissions |
40
+ |-----------------|-----------------------------|
41
+ | Microsoft Graph | AdministrativeUnit.Read.All |
42
+
43
+ </TabItem>
44
+ <TabItem value="Application">
45
+
46
+ | Resource | Permissions |
47
+ |-----------------|-----------------------------|
48
+ | Microsoft Graph | AdministrativeUnit.Read.All |
49
+
50
+ </TabItem>
51
+ </Tabs>
52
+
34
53
  ## Examples
35
54
 
36
55
  Get information about the administrative unit by its id.
@@ -25,6 +25,25 @@ m365 entra administrativeunit list [options]
25
25
 
26
26
  Using the `--properties` option, you can specify a comma-separated list of administrative unit properties to retrieve from the Microsoft Graph. If you don't specify any properties, the command will output the default properties returned by Graph.
27
27
 
28
+ ## Permissions
29
+
30
+ <Tabs>
31
+ <TabItem value="Delegated">
32
+
33
+ | Resource | Permissions |
34
+ |-----------------|-----------------------------|
35
+ | Microsoft Graph | AdministrativeUnit.Read.All |
36
+
37
+ </TabItem>
38
+ <TabItem value="Application">
39
+
40
+ | Resource | Permissions |
41
+ |-----------------|-----------------------------|
42
+ | Microsoft Graph | AdministrativeUnit.Read.All |
43
+
44
+ </TabItem>
45
+ </Tabs>
46
+
28
47
  ## Examples
29
48
 
30
49
  Retrieve a list of administrative units.