@pnp/cli-microsoft365 10.11.0-beta.c2217b6 → 10.11.0

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 (115) hide show
  1. package/.eslintrc.cjs +2 -0
  2. package/Dockerfile +2 -2
  3. package/allCommands.json +1 -1
  4. package/allCommandsFull.json +1 -1
  5. package/dist/config.js +1 -0
  6. package/dist/m365/base/GraphApplicationCommand.js +17 -0
  7. package/dist/m365/base/{DelegatedGraphCommand.js → GraphDelegatedCommand.js} +4 -4
  8. package/dist/m365/base/PowerAppsCommand.js +1 -1
  9. package/dist/m365/base/PowerAutomateCommand.js +1 -1
  10. package/dist/m365/base/PowerBICommand.js +1 -1
  11. package/dist/m365/base/PowerPlatformCommand.js +1 -1
  12. package/dist/m365/base/VivaEngageCommand.js +1 -1
  13. package/dist/m365/cli/commands/app/app-add.js +95 -0
  14. package/dist/m365/cli/commands.js +1 -0
  15. package/dist/m365/entra/commands/app/app-get.js +11 -52
  16. package/dist/m365/entra/commands/app/app-permission-add.js +19 -30
  17. package/dist/m365/entra/commands/app/app-permission-list.js +2 -19
  18. package/dist/m365/entra/commands/app/app-permission-remove.js +22 -31
  19. package/dist/m365/entra/commands/app/app-remove.js +2 -18
  20. package/dist/m365/entra/commands/app/app-role-add.js +10 -43
  21. package/dist/m365/entra/commands/app/app-role-list.js +2 -20
  22. package/dist/m365/entra/commands/app/app-role-remove.js +9 -40
  23. package/dist/m365/entra/commands/app/app-set.js +2 -19
  24. package/dist/m365/entra/commands/group/group-member-add.js +55 -10
  25. package/dist/m365/entra/commands/group/group-member-set.js +18 -3
  26. package/dist/m365/outlook/commands/message/message-move.js +1 -1
  27. package/dist/m365/pp/commands/managementapp/managementapp-add.js +7 -21
  28. package/dist/m365/spe/commands/container/container-recyclebinitem-restore.js +96 -0
  29. package/dist/m365/spe/commands.js +1 -0
  30. package/dist/m365/spfx/commands/project/base-project-command.js +1 -0
  31. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.21.0.js +2 -0
  32. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.21.1.js +2 -0
  33. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.22.0-beta.1.js +21 -0
  34. package/dist/m365/spfx/commands/project/project-doctor/rules/FN002022_DEVDEP_typescript.js +10 -0
  35. package/dist/m365/spfx/commands/project/project-doctor.js +2 -1
  36. package/dist/m365/spfx/commands/project/project-model/SassJson.js +2 -0
  37. package/dist/m365/spfx/commands/project/project-model/index.js +1 -0
  38. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002001_DEVDEP_microsoft_sp_build_web.js +2 -2
  39. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002004_DEVDEP_gulp.js +2 -2
  40. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002007_DEVDEP_ajv.js +2 -2
  41. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002029_DEVDEP_microsoft_rush_stack_compiler_5_3.js +2 -2
  42. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002030_DEVDEP_microsoft_spfx_web_build_rig.js +10 -0
  43. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002031_DEVDEP_rushstack_heft.js +10 -0
  44. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002032_DEVDEP_typescript_eslint_parser.js +10 -0
  45. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002033_DEVDEP_jest_junit.js +10 -0
  46. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN010011_YORC_useGulp.js +40 -0
  47. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN015010_FILE_gulpfile_js.js +10 -0
  48. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN015011_FILE_tsconfig_json.js +10 -0
  49. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN015012_FILE_config_heft_json.js +10 -0
  50. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN015013_FILE_config_jest_config_json.js +10 -0
  51. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN015014_FILE_config_rig_json.js +10 -0
  52. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN015015_FILE_config_typescript_json.js +10 -0
  53. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021004_PKG_scripts_build.js +45 -0
  54. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021005_PKG_scripts_test.js +45 -0
  55. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021006_PKG_scripts_clean.js +45 -0
  56. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021007_PKG_scripts_deploy.js +45 -0
  57. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021008_PKG_scripts_start.js +45 -0
  58. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021009_PKG_scripts_build_watch.js +45 -0
  59. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021010_PKG_scripts_package_solution.js +45 -0
  60. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021011_PKG_scripts_deploy_azure_storage.js +45 -0
  61. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021012_PKG_scripts_eject_webpack.js +45 -0
  62. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN021013_PKG_overrides_rushstack_heft.js +45 -0
  63. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN023003_GITIGNORE_libdts.js +36 -0
  64. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN023004_GITIGNORE_libcommonjs.js +36 -0
  65. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN023005_GITIGNORE_libesm.js +36 -0
  66. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN023006_GITIGNORE_jestoutput.js +36 -0
  67. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN026001_CFG_SASS_schema.js +40 -0
  68. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN026002_CFG_SASS_extends.js +40 -0
  69. package/dist/m365/spfx/commands/project/project-upgrade/rules/FileAddRemoveRule.js +7 -0
  70. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.22.0-beta.1.js +241 -0
  71. package/dist/m365/spfx/commands/project/project-upgrade.js +16 -13
  72. package/dist/m365/spfx/commands/spfx-doctor.js +15 -0
  73. package/dist/m365/spo/commands/file/file-version-get.js +1 -0
  74. package/dist/m365/spo/commands/file/file-version-list.js +2 -2
  75. package/dist/m365/spo/commands/page/Page.js +10 -3
  76. package/dist/m365/spo/commands/page/page-section-list.js +5 -1
  77. package/dist/m365/spo/commands/serviceprincipal/serviceprincipal-permissionrequest-list.js +13 -7
  78. package/dist/m365/spo/commands/site/site-appcatalog-list.js +38 -2
  79. package/dist/m365/spo/commands/tenant/tenant-site-unarchive.js +1 -1
  80. package/dist/m365/teams/commands/callrecord/callrecord-list.js +100 -0
  81. package/dist/m365/teams/commands/chat/chat-message-send.js +2 -2
  82. package/dist/m365/teams/commands/message/message-remove.js +2 -2
  83. package/dist/m365/teams/commands/message/message-restore.js +2 -2
  84. package/dist/m365/teams/commands.js +1 -0
  85. package/dist/m365/todo/commands/list/list-add.js +2 -2
  86. package/dist/m365/todo/commands/list/list-get.js +2 -2
  87. package/dist/m365/todo/commands/list/list-list.js +2 -2
  88. package/dist/m365/todo/commands/list/list-remove.js +2 -2
  89. package/dist/m365/todo/commands/list/list-set.js +2 -2
  90. package/dist/m365/todo/commands/task/task-add.js +2 -2
  91. package/dist/m365/todo/commands/task/task-get.js +2 -2
  92. package/dist/m365/todo/commands/task/task-list.js +2 -2
  93. package/dist/m365/todo/commands/task/task-remove.js +2 -2
  94. package/dist/m365/todo/commands/task/task-set.js +2 -2
  95. package/dist/m365/viva/commands/engage/EngageRole.js +2 -0
  96. package/dist/m365/viva/commands/engage/engage-role-list.js +28 -0
  97. package/dist/m365/viva/commands/engage/engage-role-member-list.js +57 -0
  98. package/dist/m365/viva/commands.js +2 -0
  99. package/dist/utils/accessToken.js +9 -5
  100. package/dist/utils/entraApp.js +15 -0
  101. package/dist/utils/entraGroup.js +43 -0
  102. package/dist/utils/vivaEngage.js +19 -0
  103. package/docs/docs/cmd/cli/app/app-add.mdx +50 -0
  104. package/docs/docs/cmd/entra/group/group-member-add.mdx +26 -5
  105. package/docs/docs/cmd/entra/group/group-member-set.mdx +7 -4
  106. package/docs/docs/cmd/spe/container/container-recyclebinitem-restore.mdx +53 -0
  107. package/docs/docs/cmd/spo/file/file-version-get.mdx +5 -2
  108. package/docs/docs/cmd/spo/file/file-version-list.mdx +7 -5
  109. package/docs/docs/cmd/spo/site/site-appcatalog-list.mdx +11 -0
  110. package/docs/docs/cmd/spo/tenant/tenant-site-unarchive.mdx +1 -1
  111. package/docs/docs/cmd/teams/callrecord/callrecord-list.mdx +173 -0
  112. package/docs/docs/cmd/viva/engage/engage-role-list.mdx +102 -0
  113. package/docs/docs/cmd/viva/engage/engage-role-member-list.mdx +118 -0
  114. package/npm-shrinkwrap.json +291 -763
  115. package/package.json +19 -18
@@ -6,10 +6,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
6
6
  var _EntraAppRoleAddCommand_instances, _a, _EntraAppRoleAddCommand_initTelemetry, _EntraAppRoleAddCommand_initOptions, _EntraAppRoleAddCommand_initValidators, _EntraAppRoleAddCommand_initOptionSets;
7
7
  import { v4 } from 'uuid';
8
8
  import request from '../../../../request.js';
9
- import { formatting } from '../../../../utils/formatting.js';
10
9
  import GraphCommand from '../../../base/GraphCommand.js';
11
10
  import commands from '../../commands.js';
12
- import { cli } from '../../../../cli/cli.js';
13
11
  import { entraApp } from '../../../../utils/entraApp.js';
14
12
  class EntraAppRoleAddCommand extends GraphCommand {
15
13
  get name() {
@@ -28,8 +26,7 @@ class EntraAppRoleAddCommand extends GraphCommand {
28
26
  }
29
27
  async commandAction(logger, args) {
30
28
  try {
31
- const appId = await this.getAppObjectId(args, logger);
32
- const appInfo = await this.getAppInfo(appId, logger);
29
+ const appInfo = await this.getAppInfo(args, logger);
33
30
  if (this.verbose) {
34
31
  await logger.logToStderr(`Adding role ${args.options.name} to Microsoft Entra app ${appInfo.id}...`);
35
32
  }
@@ -55,19 +52,6 @@ class EntraAppRoleAddCommand extends GraphCommand {
55
52
  this.handleRejectedODataJsonPromise(err);
56
53
  }
57
54
  }
58
- async getAppInfo(appId, logger) {
59
- if (this.verbose) {
60
- await logger.logToStderr(`Retrieving information about roles for Microsoft Entra app ${appId}...`);
61
- }
62
- const requestOptions = {
63
- url: `${this.resource}/v1.0/myorganization/applications/${appId}?$select=id,appRoles`,
64
- headers: {
65
- accept: 'application/json;odata.metadata=none'
66
- },
67
- responseType: 'json'
68
- };
69
- return request.get(requestOptions);
70
- }
71
55
  getAllowedMemberTypes(args) {
72
56
  switch (args.options.allowedMembers) {
73
57
  case 'usersGroups':
@@ -80,36 +64,19 @@ class EntraAppRoleAddCommand extends GraphCommand {
80
64
  return [];
81
65
  }
82
66
  }
83
- async getAppObjectId(args, logger) {
84
- if (args.options.appObjectId) {
85
- return args.options.appObjectId;
86
- }
87
- const { appId, appName } = args.options;
67
+ async getAppInfo(args, logger) {
68
+ const { appObjectId, appId, appName } = args.options;
88
69
  if (this.verbose) {
89
- await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : appName}...`);
70
+ await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appObjectId ? appObjectId : (appId ? appId : appName)}...`);
71
+ }
72
+ if (appObjectId) {
73
+ return await entraApp.getAppRegistrationByObjectId(appObjectId, ['id', 'appRoles']);
90
74
  }
91
- if (appId) {
92
- const app = await entraApp.getAppRegistrationByAppId(appId, ['id']);
93
- return app.id;
75
+ else if (appId) {
76
+ return await entraApp.getAppRegistrationByAppId(appId, ['id', 'appRoles']);
94
77
  }
95
78
  else {
96
- const requestOptions = {
97
- url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(appName)}'&$select=id`,
98
- headers: {
99
- accept: 'application/json;odata.metadata=none'
100
- },
101
- responseType: 'json'
102
- };
103
- const res = await request.get(requestOptions);
104
- if (res.value.length === 1) {
105
- return res.value[0].id;
106
- }
107
- if (res.value.length === 0) {
108
- throw `No Microsoft Entra application registration with name ${appName} found`;
109
- }
110
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
111
- const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
112
- return result.id;
79
+ return await entraApp.getAppRegistrationByAppName(appName, ['id', 'appRoles']);
113
80
  }
114
81
  }
115
82
  }
@@ -4,12 +4,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
6
  var _EntraAppRoleListCommand_instances, _EntraAppRoleListCommand_initTelemetry, _EntraAppRoleListCommand_initOptions, _EntraAppRoleListCommand_initOptionSets;
7
- import request from '../../../../request.js';
8
- import { formatting } from '../../../../utils/formatting.js';
9
7
  import { odata } from '../../../../utils/odata.js';
10
8
  import GraphCommand from '../../../base/GraphCommand.js';
11
9
  import commands from '../../commands.js';
12
- import { cli } from '../../../../cli/cli.js';
13
10
  import { entraApp } from '../../../../utils/entraApp.js';
14
11
  class EntraAppRoleListCommand extends GraphCommand {
15
12
  get name() {
@@ -51,23 +48,8 @@ class EntraAppRoleListCommand extends GraphCommand {
51
48
  return app.id;
52
49
  }
53
50
  else {
54
- const requestOptions = {
55
- url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(appName)}'&$select=id`,
56
- headers: {
57
- accept: 'application/json;odata.metadata=none'
58
- },
59
- responseType: 'json'
60
- };
61
- const res = await request.get(requestOptions);
62
- if (res.value.length === 1) {
63
- return res.value[0].id;
64
- }
65
- if (res.value.length === 0) {
66
- throw `No Microsoft Entra application registration with name ${appName} found`;
67
- }
68
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
69
- const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
70
- return result.id;
51
+ const app = await entraApp.getAppRegistrationByAppName(appName, ["id"]);
52
+ return app.id;
71
53
  }
72
54
  }
73
55
  }
@@ -46,8 +46,7 @@ class EntraAppRoleRemoveCommand extends GraphCommand {
46
46
  }
47
47
  }
48
48
  async processAppRoleDelete(logger, args) {
49
- const appObjectId = await this.getAppObjectId(args, logger);
50
- const app = await this.getEntraApp(appObjectId, logger);
49
+ const app = await this.getEntraApp(args, logger);
51
50
  const appRoleDeleteIdentifierNameValue = args.options.name ? `name '${args.options.name}'` : (args.options.claim ? `claim '${args.options.claim}'` : `id '${args.options.id}'`);
52
51
  if (this.verbose) {
53
52
  await logger.logToStderr(`Deleting role with ${appRoleDeleteIdentifierNameValue} from Microsoft Entra app ${app.id}...`);
@@ -109,49 +108,19 @@ class EntraAppRoleRemoveCommand extends GraphCommand {
109
108
  };
110
109
  return request.patch(requestOptions);
111
110
  }
112
- async getEntraApp(appObjectId, logger) {
111
+ async getEntraApp(args, logger) {
112
+ const { appObjectId, appId, appName } = args.options;
113
113
  if (this.verbose) {
114
- await logger.logToStderr(`Retrieving app roles information for the Microsoft Entra app ${appObjectId}...`);
114
+ await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appObjectId ? appObjectId : (appId ? appId : appName)}...`);
115
115
  }
116
- const requestOptions = {
117
- url: `${this.resource}/v1.0/myorganization/applications/${appObjectId}?$select=id,appRoles`,
118
- headers: {
119
- accept: 'application/json;odata.metadata=none'
120
- },
121
- responseType: 'json'
122
- };
123
- return request.get(requestOptions);
124
- }
125
- async getAppObjectId(args, logger) {
126
- if (args.options.appObjectId) {
127
- return args.options.appObjectId;
128
- }
129
- const { appId, appName } = args.options;
130
- if (this.verbose) {
131
- await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : appName}...`);
116
+ if (appObjectId) {
117
+ return await entraApp.getAppRegistrationByObjectId(appObjectId, ['id', 'appRoles']);
132
118
  }
133
- if (appId) {
134
- const app = await entraApp.getAppRegistrationByAppId(appId, ['id']);
135
- return app.id;
119
+ else if (appId) {
120
+ return await entraApp.getAppRegistrationByAppId(appId, ['id', 'appRoles']);
136
121
  }
137
122
  else {
138
- const requestOptions = {
139
- url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(appName)}'&$select=id`,
140
- headers: {
141
- accept: 'application/json;odata.metadata=none'
142
- },
143
- responseType: 'json'
144
- };
145
- const res = await request.get(requestOptions);
146
- if (res.value.length === 1) {
147
- return res.value[0].id;
148
- }
149
- if (res.value.length === 0) {
150
- throw `No Microsoft Entra application registration with name ${appName} found`;
151
- }
152
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
153
- const result = (await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair));
154
- return result.id;
123
+ return await entraApp.getAppRegistrationByAppName(appName, ['id', 'appRoles']);
155
124
  }
156
125
  }
157
126
  }
@@ -6,10 +6,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
6
6
  var _EntraAppSetCommand_instances, _a, _EntraAppSetCommand_initTelemetry, _EntraAppSetCommand_initOptions, _EntraAppSetCommand_initValidators, _EntraAppSetCommand_initOptionSets, _EntraAppSetCommand_initTypes;
7
7
  import fs from 'fs';
8
8
  import request from '../../../../request.js';
9
- import { formatting } from '../../../../utils/formatting.js';
10
9
  import GraphCommand from '../../../base/GraphCommand.js';
11
10
  import commands from '../../commands.js';
12
- import { cli } from '../../../../cli/cli.js';
13
11
  import { optionsUtils } from '../../../../utils/optionsUtils.js';
14
12
  import { entraApp } from '../../../../utils/entraApp.js';
15
13
  class EntraAppSetCommand extends GraphCommand {
@@ -57,23 +55,8 @@ class EntraAppSetCommand extends GraphCommand {
57
55
  return app.id;
58
56
  }
59
57
  else {
60
- const requestOptions = {
61
- url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(name)}'&$select=id`,
62
- headers: {
63
- accept: 'application/json;odata.metadata=none'
64
- },
65
- responseType: 'json'
66
- };
67
- const res = await request.get(requestOptions);
68
- if (res.value.length === 1) {
69
- return res.value[0].id;
70
- }
71
- if (res.value.length === 0) {
72
- throw `No Microsoft Entra application registration with name ${name} found`;
73
- }
74
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
75
- const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registration with name '${name}' found.`, resultAsKeyValuePair);
76
- return result.id;
58
+ const app = await entraApp.getAppRegistrationByAppName(name, ["id"]);
59
+ return app.id;
77
60
  }
78
61
  }
79
62
  async updateUnknownOptions(args, objectId) {
@@ -32,13 +32,16 @@ class EntraGroupMemberAddCommand extends GraphCommand {
32
32
  if (args.options.groupDisplayName) {
33
33
  await this.warn(logger, `Option 'groupDisplayName' is deprecated and will be removed in the next major release.`);
34
34
  }
35
+ if (args.options.ids) {
36
+ await this.warn(logger, `Option 'ids' is deprecated and will be removed in the next major release. Please use 'userIds' instead.`);
37
+ }
35
38
  if (this.verbose) {
36
- await logger.logToStderr(`Adding member(s) ${args.options.ids || args.options.userNames} to group ${args.options.groupId || args.options.groupDisplayName || args.options.groupName}...`);
39
+ await logger.logToStderr(`Adding member(s) ${args.options.ids || args.options.userIds || args.options.userNames || args.options.subgroupIds || args.options.subgroupNames} to group ${args.options.groupId || args.options.groupDisplayName || args.options.groupName}...`);
37
40
  }
38
41
  const groupId = await this.getGroupId(logger, args.options);
39
- const userIds = await this.getUserIds(logger, args.options);
40
- for (let i = 0; i < userIds.length; i += 400) {
41
- const userIdsBatch = userIds.slice(i, i + 400);
42
+ const objectIds = await this.getObjectIds(logger, args.options);
43
+ for (let i = 0; i < objectIds.length; i += 400) {
44
+ const objectIdsBatch = objectIds.slice(i, i + 400);
42
45
  const requestOptions = {
43
46
  url: `${this.resource}/v1.0/$batch`,
44
47
  headers: {
@@ -49,8 +52,8 @@ class EntraGroupMemberAddCommand extends GraphCommand {
49
52
  requests: []
50
53
  }
51
54
  };
52
- for (let j = 0; j < userIdsBatch.length; j += 20) {
53
- const userIdsChunk = userIdsBatch.slice(j, j + 20);
55
+ for (let j = 0; j < objectIdsBatch.length; j += 20) {
56
+ const objectIdsChunk = objectIdsBatch.slice(j, j + 20);
54
57
  requestOptions.data.requests.push({
55
58
  id: j + 1,
56
59
  method: 'PATCH',
@@ -59,7 +62,7 @@ class EntraGroupMemberAddCommand extends GraphCommand {
59
62
  'content-type': 'application/json;odata.metadata=none'
60
63
  },
61
64
  body: {
62
- [`${args.options.role === 'Member' ? 'members' : 'owners'}@odata.bind`]: userIdsChunk.map(u => `${this.resource}/v1.0/directoryObjects/${u}`)
65
+ [`${args.options.role === 'Member' ? 'members' : 'owners'}@odata.bind`]: objectIdsChunk.map(u => `${this.resource}/v1.0/directoryObjects/${u}`)
63
66
  }
64
67
  });
65
68
  }
@@ -84,15 +87,33 @@ class EntraGroupMemberAddCommand extends GraphCommand {
84
87
  }
85
88
  return entraGroup.getGroupIdByDisplayName(options.groupDisplayName || options.groupName);
86
89
  }
90
+ async getObjectIds(logger, options) {
91
+ if (options.ids || options.userIds || options.userNames) {
92
+ return this.getUserIds(logger, options);
93
+ }
94
+ return this.getGroupIds(logger, options);
95
+ }
87
96
  async getUserIds(logger, options) {
88
97
  if (options.ids) {
89
98
  return options.ids.split(',').map(i => i.trim());
90
99
  }
100
+ if (options.userIds) {
101
+ return options.userIds.split(',').map(i => i.trim());
102
+ }
91
103
  if (this.verbose) {
92
104
  await logger.logToStderr('Retrieving ID(s) of user(s)...');
93
105
  }
94
106
  return entraUser.getUserIdsByUpns(options.userNames.split(',').map(u => u.trim()));
95
107
  }
108
+ async getGroupIds(logger, options) {
109
+ if (options.subgroupIds) {
110
+ return options.subgroupIds.split(',').map(i => i.trim());
111
+ }
112
+ if (this.verbose) {
113
+ await logger.logToStderr('Retrieving ID(s) of group(s)...');
114
+ }
115
+ return entraGroup.getGroupIdsByDisplayNames(options.subgroupNames.split(',').map(u => u.trim()));
116
+ }
96
117
  }
97
118
  _EntraGroupMemberAddCommand_instances = new WeakSet(), _EntraGroupMemberAddCommand_initTelemetry = function _EntraGroupMemberAddCommand_initTelemetry() {
98
119
  this.telemetry.push((args) => {
@@ -101,7 +122,10 @@ _EntraGroupMemberAddCommand_instances = new WeakSet(), _EntraGroupMemberAddComma
101
122
  groupDisplayName: typeof args.options.groupDisplayName !== 'undefined',
102
123
  groupName: typeof args.options.groupName !== 'undefined',
103
124
  ids: typeof args.options.ids !== 'undefined',
104
- userNames: typeof args.options.userNames !== 'undefined'
125
+ userIds: typeof args.options.userIds !== 'undefined',
126
+ userNames: typeof args.options.userNames !== 'undefined',
127
+ subgroupIds: typeof args.options.subgroupIds !== 'undefined',
128
+ subgroupNames: typeof args.options.subgroupNames !== 'undefined'
105
129
  });
106
130
  });
107
131
  }, _EntraGroupMemberAddCommand_initOptions = function _EntraGroupMemberAddCommand_initOptions() {
@@ -113,8 +137,14 @@ _EntraGroupMemberAddCommand_instances = new WeakSet(), _EntraGroupMemberAddComma
113
137
  option: '-n, --groupName [groupName]'
114
138
  }, {
115
139
  option: '--ids [ids]'
140
+ }, {
141
+ option: '--userIds [userIds]'
116
142
  }, {
117
143
  option: '--userNames [userNames]'
144
+ }, {
145
+ option: '--subgroupIds [subgroupIds]'
146
+ }, {
147
+ option: '--subgroupNames [subgroupNames]'
118
148
  }, {
119
149
  option: '-r, --role <role>',
120
150
  autocomplete: this.roleValues
@@ -130,21 +160,36 @@ _EntraGroupMemberAddCommand_instances = new WeakSet(), _EntraGroupMemberAddComma
130
160
  return `The following GUIDs are invalid for the option 'ids': ${isValidGUIDArrayResult}.`;
131
161
  }
132
162
  }
163
+ if (args.options.userIds) {
164
+ const isValidGUIDArrayResult = validation.isValidGuidArray(args.options.userIds);
165
+ if (isValidGUIDArrayResult !== true) {
166
+ return `The following GUIDs are invalid for the option 'userIds': ${isValidGUIDArrayResult}.`;
167
+ }
168
+ }
133
169
  if (args.options.userNames) {
134
170
  const isValidUPNArrayResult = validation.isValidUserPrincipalNameArray(args.options.userNames);
135
171
  if (isValidUPNArrayResult !== true) {
136
172
  return `The following user principal names are invalid for the option 'userNames': ${isValidUPNArrayResult}.`;
137
173
  }
138
174
  }
175
+ if (args.options.subgroupIds) {
176
+ const isValidGUIDArrayResult = validation.isValidGuidArray(args.options.subgroupIds);
177
+ if (isValidGUIDArrayResult !== true) {
178
+ return `The following GUIDs are invalid for the option 'subgroupIds': ${isValidGUIDArrayResult}.`;
179
+ }
180
+ }
181
+ if ((args.options.subgroupIds || args.options.subgroupNames) && args.options.role === 'Owner') {
182
+ return `Subgroups cannot be set as owners.`;
183
+ }
139
184
  if (this.roleValues.indexOf(args.options.role) === -1) {
140
185
  return `Option 'role' must be one of the following values: ${this.roleValues.join(', ')}.`;
141
186
  }
142
187
  return true;
143
188
  });
144
189
  }, _EntraGroupMemberAddCommand_initOptionSets = function _EntraGroupMemberAddCommand_initOptionSets() {
145
- this.optionSets.push({ options: ['groupId', 'groupDisplayName', 'groupName'] }, { options: ['ids', 'userNames'] });
190
+ this.optionSets.push({ options: ['groupId', 'groupDisplayName', 'groupName'] }, { options: ['ids', 'userIds', 'userNames', 'subgroupIds', 'subgroupNames'] });
146
191
  }, _EntraGroupMemberAddCommand_initTypes = function _EntraGroupMemberAddCommand_initTypes() {
147
- this.types.string.push('groupId', 'groupDisplayName', 'groupName', 'ids', 'userNames', 'role');
192
+ this.types.string.push('groupId', 'groupDisplayName', 'groupName', 'ids', 'userIds', 'userNames', 'subgroupIds', 'subgroupNames', 'role');
148
193
  };
149
194
  export default new EntraGroupMemberAddCommand();
150
195
  //# sourceMappingURL=group-member-add.js.map
@@ -32,8 +32,11 @@ class EntraGroupMemberSetCommand extends GraphCommand {
32
32
  if (args.options.groupDisplayName) {
33
33
  await this.warn(logger, `Option 'groupDisplayName' is deprecated and will be removed in the next major release.`);
34
34
  }
35
+ if (args.options.ids) {
36
+ await this.warn(logger, `Option 'ids' is deprecated and will be removed in the next major release. Please use 'userIds' instead.`);
37
+ }
35
38
  if (this.verbose) {
36
- await logger.logToStderr(`Adding member(s) ${args.options.ids || args.options.userNames} to role ${args.options.role} of group ${args.options.groupId || args.options.groupDisplayName || args.options.groupName}...`);
39
+ await logger.logToStderr(`Adding member(s) ${args.options.ids || args.options.userIds || args.options.userNames} to role ${args.options.role} of group ${args.options.groupId || args.options.groupDisplayName || args.options.groupName}...`);
37
40
  }
38
41
  const groupId = await this.getGroupId(logger, args.options);
39
42
  const userIds = await this.getUserIds(logger, args.options);
@@ -60,6 +63,9 @@ class EntraGroupMemberSetCommand extends GraphCommand {
60
63
  if (options.ids) {
61
64
  return options.ids.split(',').map(i => i.trim());
62
65
  }
66
+ if (options.userIds) {
67
+ return options.userIds.split(',').map(i => i.trim());
68
+ }
63
69
  if (this.verbose) {
64
70
  await logger.logToStderr('Retrieving ID(s) of user(s)...');
65
71
  }
@@ -163,6 +169,7 @@ _EntraGroupMemberSetCommand_instances = new WeakSet(), _EntraGroupMemberSetComma
163
169
  groupDisplayName: typeof args.options.groupDisplayName !== 'undefined',
164
170
  groupName: typeof args.options.groupName !== 'undefined',
165
171
  ids: typeof args.options.ids !== 'undefined',
172
+ userIds: typeof args.options.userIds !== 'undefined',
166
173
  userNames: typeof args.options.userNames !== 'undefined'
167
174
  });
168
175
  });
@@ -175,6 +182,8 @@ _EntraGroupMemberSetCommand_instances = new WeakSet(), _EntraGroupMemberSetComma
175
182
  option: '-n, --groupName [groupName]'
176
183
  }, {
177
184
  option: '--ids [ids]'
185
+ }, {
186
+ option: '--userIds [userIds]'
178
187
  }, {
179
188
  option: '--userNames [userNames]'
180
189
  }, {
@@ -192,6 +201,12 @@ _EntraGroupMemberSetCommand_instances = new WeakSet(), _EntraGroupMemberSetComma
192
201
  return `'${isValidGUIDArrayResult}' is not a valid GUID for option 'ids'.`;
193
202
  }
194
203
  }
204
+ if (args.options.userIds) {
205
+ const isValidGUIDArrayResult = validation.isValidGuidArray(args.options.userIds);
206
+ if (isValidGUIDArrayResult !== true) {
207
+ return `The following GUIDs are invalid for the option 'userIds': ${isValidGUIDArrayResult}.`;
208
+ }
209
+ }
195
210
  if (args.options.userNames) {
196
211
  const isValidUserPrincipalNameArray = validation.isValidUserPrincipalNameArray(args.options.userNames);
197
212
  if (isValidUserPrincipalNameArray !== true) {
@@ -204,9 +219,9 @@ _EntraGroupMemberSetCommand_instances = new WeakSet(), _EntraGroupMemberSetComma
204
219
  return true;
205
220
  });
206
221
  }, _EntraGroupMemberSetCommand_initOptionSets = function _EntraGroupMemberSetCommand_initOptionSets() {
207
- this.optionSets.push({ options: ['groupId', 'groupDisplayName', 'groupName'] }, { options: ['ids', 'userNames'] });
222
+ this.optionSets.push({ options: ['groupId', 'groupDisplayName', 'groupName'] }, { options: ['ids', 'userIds', 'userNames'] });
208
223
  }, _EntraGroupMemberSetCommand_initTypes = function _EntraGroupMemberSetCommand_initTypes() {
209
- this.types.string.push('groupId', 'groupDisplayName', 'groupName', 'ids', 'userNames', 'role');
224
+ this.types.string.push('groupId', 'groupDisplayName', 'groupName', 'ids', 'userIds', 'userNames', 'role');
210
225
  };
211
226
  export default new EntraGroupMemberSetCommand();
212
227
  //# sourceMappingURL=group-member-set.js.map
@@ -9,7 +9,7 @@ import { formatting } from '../../../../utils/formatting.js';
9
9
  import commands from '../../commands.js';
10
10
  import { Outlook } from '../../Outlook.js';
11
11
  import { cli } from '../../../../cli/cli.js';
12
- import DelegatedGraphCommand from '../../../base/DelegatedGraphCommand.js';
12
+ import DelegatedGraphCommand from '../../../base/GraphDelegatedCommand.js';
13
13
  class OutlookMessageMoveCommand extends DelegatedGraphCommand {
14
14
  get name() {
15
15
  return commands.MESSAGE_MOVE;
@@ -5,11 +5,10 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
5
5
  };
6
6
  var _PpManagementAppAddCommand_instances, _PpManagementAppAddCommand_initTelemetry, _PpManagementAppAddCommand_initOptions, _PpManagementAppAddCommand_initValidators, _PpManagementAppAddCommand_initOptionSets;
7
7
  import request from '../../../../request.js';
8
- import { formatting } from '../../../../utils/formatting.js';
9
8
  import { validation } from '../../../../utils/validation.js';
10
9
  import PowerPlatformCommand from '../../../base/PowerPlatformCommand.js';
11
10
  import commands from '../../commands.js';
12
- import { cli } from '../../../../cli/cli.js';
11
+ import { entraApp } from '../../../../utils/entraApp.js';
13
12
  class PpManagementAppAddCommand extends PowerPlatformCommand {
14
13
  get name() {
15
14
  return commands.MANAGEMENTAPP_ADD;
@@ -48,27 +47,14 @@ class PpManagementAppAddCommand extends PowerPlatformCommand {
48
47
  return args.options.appId;
49
48
  }
50
49
  const { objectId, name } = args.options;
51
- const filter = objectId ?
52
- `id eq '${formatting.encodeQueryParameter(objectId)}'` :
53
- `displayName eq '${formatting.encodeQueryParameter(name)}'`;
54
- const requestOptions = {
55
- url: `https://graph.microsoft.com/v1.0/myorganization/applications?$filter=${filter}&$select=appId`,
56
- headers: {
57
- accept: 'application/json;odata.metadata=none'
58
- },
59
- responseType: 'json'
60
- };
61
- const entraApps = await request.get((requestOptions));
62
- if (entraApps.value.length === 0) {
63
- const applicationIdentifier = objectId ? `ID ${objectId}` : `name ${name}`;
64
- throw `No Microsoft Entra application registration with ${applicationIdentifier} found`;
50
+ if (objectId) {
51
+ const app = await entraApp.getAppRegistrationByObjectId(objectId, ['appId']);
52
+ return app.appId;
65
53
  }
66
- if (entraApps.value.length === 1 && entraApps.value[0].appId) {
67
- return entraApps.value[0].appId;
54
+ else {
55
+ const app = await entraApp.getAppRegistrationByAppName(name, ['appId']);
56
+ return app.appId;
68
57
  }
69
- const resultAsKeyValuePair = formatting.convertArrayToHashTable('appId', entraApps.value);
70
- const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${name}' found.`, resultAsKeyValuePair);
71
- return result.appId;
72
58
  }
73
59
  }
74
60
  _PpManagementAppAddCommand_instances = new WeakSet(), _PpManagementAppAddCommand_initTelemetry = function _PpManagementAppAddCommand_initTelemetry() {
@@ -0,0 +1,96 @@
1
+ import { globalOptionsZod } from '../../../../Command.js';
2
+ import { z } from 'zod';
3
+ import commands from '../../commands.js';
4
+ import { validation } from '../../../../utils/validation.js';
5
+ import { spo } from '../../../../utils/spo.js';
6
+ import GraphCommand from '../../../base/GraphCommand.js';
7
+ import { spe } from '../../../../utils/spe.js';
8
+ import { odata } from '../../../../utils/odata.js';
9
+ import { formatting } from '../../../../utils/formatting.js';
10
+ import { cli } from '../../../../cli/cli.js';
11
+ import request from '../../../../request.js';
12
+ const options = globalOptionsZod
13
+ .extend({
14
+ containerTypeId: z.string()
15
+ .refine(id => validation.isValidGuid(id), id => ({
16
+ message: `'${id}' is not a valid GUID.`
17
+ })).optional(),
18
+ containerTypeName: z.string().optional(),
19
+ id: z.string().optional(),
20
+ name: z.string().optional()
21
+ })
22
+ .strict();
23
+ class SpeContainerRecycleBinItemRestoreCommand extends GraphCommand {
24
+ get name() {
25
+ return commands.CONTAINER_RECYCLEBINITEM_RESTORE;
26
+ }
27
+ get description() {
28
+ return 'Restores a deleted container';
29
+ }
30
+ get schema() {
31
+ return options;
32
+ }
33
+ getRefinedSchema(schema) {
34
+ return schema
35
+ .refine((options) => [options.id, options.name].filter(o => o !== undefined).length === 1, {
36
+ message: 'Use one of the following options: id or name.'
37
+ })
38
+ .refine((options) => !options.name || [options.containerTypeId, options.containerTypeName].filter(o => o !== undefined).length === 1, {
39
+ message: 'Use one of the following options when specifying the container name: containerTypeId or containerTypeName.'
40
+ })
41
+ .refine((options) => options.name || [options.containerTypeId, options.containerTypeName].filter(o => o !== undefined).length === 0, {
42
+ message: 'Options containerTypeId and containerTypeName are only required when restoring a container by name.'
43
+ });
44
+ }
45
+ async commandAction(logger, args) {
46
+ try {
47
+ const containerId = await this.getContainerId(args.options, logger);
48
+ if (this.verbose) {
49
+ await logger.logToStderr(`Restoring deleted container with ID '${containerId}'...`);
50
+ }
51
+ const requestOptions = {
52
+ url: `${this.resource}/v1.0/storage/fileStorage/deletedContainers/${containerId}/restore`,
53
+ headers: {
54
+ accept: 'application/json;odata.metadata=none'
55
+ },
56
+ responseType: 'json'
57
+ };
58
+ await request.post(requestOptions);
59
+ }
60
+ catch (err) {
61
+ this.handleRejectedODataJsonPromise(err);
62
+ }
63
+ }
64
+ async getContainerId(options, logger) {
65
+ if (options.id) {
66
+ return options.id;
67
+ }
68
+ if (this.verbose) {
69
+ await logger.logToStderr(`Retrieving container with name '${options.name}'...`);
70
+ }
71
+ const containerTypeId = await this.getContainerTypeId(options, logger);
72
+ const containers = await odata.getAllItems(`${this.resource}/v1.0/storage/fileStorage/deletedContainers?$filter=containerTypeId eq ${containerTypeId}&$select=id,displayName`);
73
+ const matchingContainers = containers.filter(c => c.displayName.toLowerCase() === options.name.toLowerCase());
74
+ if (matchingContainers.length === 0) {
75
+ throw new Error(`The specified container '${options.name}' does not exist.`);
76
+ }
77
+ if (matchingContainers.length > 1) {
78
+ const containerKeyValuePair = formatting.convertArrayToHashTable('id', matchingContainers);
79
+ const container = await cli.handleMultipleResultsFound(`Multiple containers with name '${options.name}' found.`, containerKeyValuePair);
80
+ return container.id;
81
+ }
82
+ return matchingContainers[0].id;
83
+ }
84
+ async getContainerTypeId(options, logger) {
85
+ if (options.containerTypeId) {
86
+ return options.containerTypeId;
87
+ }
88
+ if (this.verbose) {
89
+ await logger.logToStderr(`Getting container type with name '${options.containerTypeName}'...`);
90
+ }
91
+ const adminUrl = await spo.getSpoAdminUrl(logger, this.verbose);
92
+ return spe.getContainerTypeIdByName(adminUrl, options.containerTypeName);
93
+ }
94
+ }
95
+ export default new SpeContainerRecycleBinItemRestoreCommand();
96
+ //# sourceMappingURL=container-recyclebinitem-restore.js.map
@@ -7,6 +7,7 @@ export default {
7
7
  CONTAINER_REMOVE: `${prefix} container remove`,
8
8
  CONTAINER_PERMISSION_LIST: `${prefix} container permission list`,
9
9
  CONTAINER_RECYCLEBINITEM_LIST: `${prefix} container recyclebinitem list`,
10
+ CONTAINER_RECYCLEBINITEM_RESTORE: `${prefix} container recyclebinitem restore`,
10
11
  CONTAINERTYPE_ADD: `${prefix} containertype add`,
11
12
  CONTAINERTYPE_GET: `${prefix} containertype get`,
12
13
  CONTAINERTYPE_LIST: `${prefix} containertype list`,
@@ -43,6 +43,7 @@ export class BaseProjectCommand extends AnonymousCommand {
43
43
  this.readAndParseJsonFile(path.join(projectRootPath, 'tslint.json'), project, 'tsLintJsonRoot');
44
44
  this.readAndParseJsonFile(path.join(projectRootPath, 'config', 'write-manifests.json'), project, 'writeManifestsJson');
45
45
  this.readAndParseJsonFile(path.join(projectRootPath, '.yo-rc.json'), project, 'yoRcJson');
46
+ this.readAndParseJsonFile(path.join(projectRootPath, 'config', 'sass.json'), project, 'sassJson');
46
47
  const gulpfileJsPath = path.join(projectRootPath, 'gulpfile.js');
47
48
  if (fs.existsSync(gulpfileJsPath)) {
48
49
  project.gulpfileJs = {
@@ -8,6 +8,7 @@ import { FN002013_DEVDEP_types_webpack_env } from './rules/FN002013_DEVDEP_types
8
8
  import { FN002015_DEVDEP_types_react } from './rules/FN002015_DEVDEP_types_react.js';
9
9
  import { FN002016_DEVDEP_types_react_dom } from './rules/FN002016_DEVDEP_types_react_dom.js';
10
10
  import { FN002019_DEVDEP_microsoft_rush_stack_compiler } from './rules/FN002019_DEVDEP_microsoft_rush_stack_compiler.js';
11
+ import { FN002022_DEVDEP_typescript } from './rules/FN002022_DEVDEP_typescript.js';
11
12
  import { FN021001_PKG_spfx_deps_versions_match_project_version } from './rules/FN021001_PKG_spfx_deps_versions_match_project_version.js';
12
13
  export default [
13
14
  new FN001008_DEP_react('17'),
@@ -20,6 +21,7 @@ export default [
20
21
  new FN002016_DEVDEP_types_react_dom('17'),
21
22
  new FN002019_DEVDEP_microsoft_rush_stack_compiler(['5.3']),
22
23
  new FN002021_DEVDEP_rushstack_eslint_config('4.0.1'),
24
+ new FN002022_DEVDEP_typescript('~5.3.3'),
23
25
  new FN021001_PKG_spfx_deps_versions_match_project_version(true)
24
26
  ];
25
27
  //# sourceMappingURL=doctor-1.21.0.js.map
@@ -8,6 +8,7 @@ import { FN002013_DEVDEP_types_webpack_env } from './rules/FN002013_DEVDEP_types
8
8
  import { FN002015_DEVDEP_types_react } from './rules/FN002015_DEVDEP_types_react.js';
9
9
  import { FN002016_DEVDEP_types_react_dom } from './rules/FN002016_DEVDEP_types_react_dom.js';
10
10
  import { FN002019_DEVDEP_microsoft_rush_stack_compiler } from './rules/FN002019_DEVDEP_microsoft_rush_stack_compiler.js';
11
+ import { FN002022_DEVDEP_typescript } from './rules/FN002022_DEVDEP_typescript.js';
11
12
  import { FN021001_PKG_spfx_deps_versions_match_project_version } from './rules/FN021001_PKG_spfx_deps_versions_match_project_version.js';
12
13
  export default [
13
14
  new FN001008_DEP_react('17'),
@@ -20,6 +21,7 @@ export default [
20
21
  new FN002016_DEVDEP_types_react_dom('17'),
21
22
  new FN002019_DEVDEP_microsoft_rush_stack_compiler(['5.3']),
22
23
  new FN002021_DEVDEP_rushstack_eslint_config('4.0.1'),
24
+ new FN002022_DEVDEP_typescript('~5.3.3'),
23
25
  new FN021001_PKG_spfx_deps_versions_match_project_version(true)
24
26
  ];
25
27
  //# sourceMappingURL=doctor-1.21.1.js.map