@pnp/cli-microsoft365 7.5.0 → 7.6.0-beta.480812d

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 (209) hide show
  1. package/.eslintrc.cjs +3 -0
  2. package/README.md +1 -1
  3. package/allCommands.json +1 -1
  4. package/allCommandsFull.json +1 -1
  5. package/dist/Auth.js +12 -10
  6. package/dist/AuthServer.js +1 -1
  7. package/dist/cli/cli.js +1 -1
  8. package/dist/config.js +2 -2
  9. package/dist/m365/app/commands/app-get.js +1 -1
  10. package/dist/m365/app/commands/app-open.js +1 -1
  11. package/dist/m365/app/commands/permission/permission-add.js +2 -2
  12. package/dist/m365/app/commands/permission/permission-list.js +2 -2
  13. package/dist/m365/cli/commands/cli-consent.js +2 -2
  14. package/dist/m365/cli/commands/cli-reconsent.js +3 -3
  15. package/dist/m365/commands/login.js +1 -1
  16. package/dist/m365/entra/commands/administrativeunit/administrativeunit-add.js +1 -0
  17. package/dist/m365/entra/commands/administrativeunit/administrativeunit-get.js +1 -0
  18. package/dist/m365/entra/commands/administrativeunit/administrativeunit-list.js +1 -0
  19. package/dist/m365/entra/commands/administrativeunit/administrativeunit-member-add.js +1 -0
  20. package/dist/m365/entra/commands/administrativeunit/administrativeunit-member-get.js +1 -0
  21. package/dist/m365/entra/commands/administrativeunit/administrativeunit-member-list.js +1 -0
  22. package/dist/m365/entra/commands/administrativeunit/administrativeunit-remove.js +1 -0
  23. package/dist/m365/entra/commands/app/app-add.js +7 -6
  24. package/dist/m365/entra/commands/app/app-get.js +4 -3
  25. package/dist/m365/entra/commands/app/app-list.js +1 -0
  26. package/dist/m365/entra/commands/app/app-permission-add.js +3 -2
  27. package/dist/m365/entra/commands/app/app-permission-list.js +1 -1
  28. package/dist/m365/entra/commands/app/app-remove.js +5 -4
  29. package/dist/m365/entra/commands/app/app-role-add.js +6 -5
  30. package/dist/m365/entra/commands/app/app-role-list.js +4 -3
  31. package/dist/m365/entra/commands/app/app-role-remove.js +6 -5
  32. package/dist/m365/entra/commands/app/app-set.js +8 -7
  33. package/dist/m365/entra/commands/approleassignment/approleassignment-add.js +2 -1
  34. package/dist/m365/entra/commands/approleassignment/approleassignment-list.js +1 -0
  35. package/dist/m365/entra/commands/approleassignment/approleassignment-remove.js +1 -0
  36. package/dist/m365/entra/commands/enterpriseapp/enterpriseapp-add.js +1 -0
  37. package/dist/m365/entra/commands/enterpriseapp/enterpriseapp-get.js +1 -0
  38. package/dist/m365/entra/commands/enterpriseapp/enterpriseapp-list.js +1 -0
  39. package/dist/m365/entra/commands/group/group-get.js +1 -0
  40. package/dist/m365/entra/commands/group/group-list.js +1 -0
  41. package/dist/m365/entra/commands/group/group-remove.js +1 -0
  42. package/dist/m365/entra/commands/group/group-user-list.js +1 -0
  43. package/dist/m365/entra/commands/groupsetting/groupsetting-add.js +1 -0
  44. package/dist/m365/entra/commands/groupsetting/groupsetting-get.js +1 -0
  45. package/dist/m365/entra/commands/groupsetting/groupsetting-list.js +1 -0
  46. package/dist/m365/entra/commands/groupsetting/groupsetting-remove.js +1 -0
  47. package/dist/m365/entra/commands/groupsetting/groupsetting-set.js +1 -0
  48. package/dist/m365/entra/commands/groupsettingtemplate/groupsettingtemplate-get.js +1 -0
  49. package/dist/m365/entra/commands/groupsettingtemplate/groupsettingtemplate-list.js +1 -0
  50. package/dist/m365/entra/commands/license/license-list.js +1 -0
  51. package/dist/m365/entra/commands/m365group/m365group-add.js +1 -0
  52. package/dist/m365/entra/commands/m365group/m365group-conversation-list.js +1 -0
  53. package/dist/m365/entra/commands/m365group/m365group-conversation-post-list.js +1 -0
  54. package/dist/m365/entra/commands/m365group/m365group-get.js +1 -0
  55. package/dist/m365/entra/commands/m365group/m365group-list.js +1 -0
  56. package/dist/m365/entra/commands/m365group/m365group-recyclebinitem-clear.js +1 -0
  57. package/dist/m365/entra/commands/m365group/m365group-recyclebinitem-list.js +1 -0
  58. package/dist/m365/entra/commands/m365group/m365group-recyclebinitem-remove.js +1 -0
  59. package/dist/m365/entra/commands/m365group/m365group-recyclebinitem-restore.js +1 -0
  60. package/dist/m365/entra/commands/m365group/m365group-remove.js +1 -0
  61. package/dist/m365/entra/commands/m365group/m365group-renew.js +1 -0
  62. package/dist/m365/entra/commands/m365group/m365group-set.js +1 -0
  63. package/dist/m365/entra/commands/m365group/m365group-teamify.js +1 -0
  64. package/dist/m365/entra/commands/m365group/m365group-user-add.js +1 -0
  65. package/dist/m365/entra/commands/m365group/m365group-user-list.js +1 -0
  66. package/dist/m365/entra/commands/m365group/m365group-user-remove.js +1 -0
  67. package/dist/m365/entra/commands/m365group/m365group-user-set.js +1 -0
  68. package/dist/m365/entra/commands/oauth2grant/oauth2grant-add.js +1 -0
  69. package/dist/m365/entra/commands/oauth2grant/oauth2grant-list.js +1 -0
  70. package/dist/m365/entra/commands/oauth2grant/oauth2grant-remove.js +1 -0
  71. package/dist/m365/entra/commands/oauth2grant/oauth2grant-set.js +1 -0
  72. package/dist/m365/entra/commands/policy/policy-list.js +1 -0
  73. package/dist/m365/entra/commands/siteclassification/siteclassification-disable.js +1 -0
  74. package/dist/m365/entra/commands/siteclassification/siteclassification-enable.js +1 -0
  75. package/dist/m365/entra/commands/siteclassification/siteclassification-get.js +1 -0
  76. package/dist/m365/entra/commands/siteclassification/siteclassification-set.js +1 -0
  77. package/dist/m365/entra/commands/user/user-add.js +1 -0
  78. package/dist/m365/entra/commands/user/user-get.js +1 -0
  79. package/dist/m365/entra/commands/user/user-guest-add.js +1 -0
  80. package/dist/m365/entra/commands/user/user-hibp.js +1 -0
  81. package/dist/m365/entra/commands/user/user-license-add.js +1 -0
  82. package/dist/m365/entra/commands/user/user-license-list.js +1 -0
  83. package/dist/m365/entra/commands/user/user-license-remove.js +1 -0
  84. package/dist/m365/entra/commands/user/user-list.js +1 -0
  85. package/dist/m365/entra/commands/user/user-password-validate.js +1 -0
  86. package/dist/m365/entra/commands/user/user-recyclebinitem-clear.js +1 -0
  87. package/dist/m365/entra/commands/user/user-recyclebinitem-list.js +1 -0
  88. package/dist/m365/entra/commands/user/user-recyclebinitem-remove.js +2 -1
  89. package/dist/m365/entra/commands/user/user-recyclebinitem-restore.js +1 -0
  90. package/dist/m365/entra/commands/user/user-remove.js +1 -0
  91. package/dist/m365/entra/commands/user/user-set.js +1 -0
  92. package/dist/m365/entra/commands/user/user-signin-list.js +1 -0
  93. package/dist/m365/outlook/commands/message/message-remove.js +113 -0
  94. package/dist/m365/outlook/commands.js +1 -0
  95. package/dist/m365/pp/commands/managementapp/managementapp-add.js +7 -7
  96. package/dist/m365/purview/commands/threatassessment/threatassessment-add.js +123 -0
  97. package/dist/m365/purview/commands/threatassessment/threatassessment-list.js +104 -0
  98. package/dist/m365/purview/commands.js +3 -1
  99. package/dist/m365/spfx/commands/project/DeployWorkflow.js +111 -0
  100. package/dist/m365/spfx/commands/project/project-azuredevops-pipeline-add.js +183 -0
  101. package/dist/m365/spfx/commands/project/project-azuredevops-pipeline-model.js +2 -0
  102. package/dist/m365/spfx/commands/project/project-github-workflow-add.js +3 -4
  103. package/dist/m365/spfx/commands.js +1 -0
  104. package/dist/m365/spo/commands/folder/FolderColor.js +19 -0
  105. package/dist/m365/spo/commands/folder/folder-add.js +46 -17
  106. package/dist/m365/spo/commands/folder/folder-set.js +118 -0
  107. package/dist/m365/spo/commands/group/group-member-add.js +2 -2
  108. package/dist/m365/spo/commands/group/group-member-remove.js +1 -1
  109. package/dist/m365/spo/commands/site/site-apppermission-add.js +2 -2
  110. package/dist/m365/spo/commands/site/site-recyclebinitem-restore.js +66 -27
  111. package/dist/m365/spo/commands/tenant/tenant-settings-set.js +1 -1
  112. package/dist/m365/spo/commands/user/user-remove.js +93 -16
  113. package/dist/m365/spo/commands.js +1 -0
  114. package/dist/m365/teams/commands/tab/tab-get.js +1 -1
  115. package/dist/utils/spo.js +1 -1
  116. package/docs/docs/cmd/app/app-get.mdx +10 -10
  117. package/docs/docs/cmd/app/app-open.mdx +6 -6
  118. package/docs/docs/cmd/app/permission/permission-add.mdx +2 -2
  119. package/docs/docs/cmd/app/permission/permission-list.mdx +5 -5
  120. package/docs/docs/cmd/cli/cli-consent.mdx +2 -2
  121. package/docs/docs/cmd/cli/cli-reconsent.mdx +6 -6
  122. package/docs/docs/cmd/entra/app/app-permission-add.mdx +6 -6
  123. package/docs/docs/cmd/entra/approleassignment/approleassignment-add.mdx +1 -1
  124. package/docs/docs/cmd/entra/approleassignment/approleassignment-list.mdx +4 -4
  125. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-add.mdx +1 -1
  126. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-get.mdx +1 -1
  127. package/docs/docs/cmd/entra/group/group-user-add.mdx +7 -7
  128. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-add.mdx +1 -1
  129. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-list.mdx +1 -1
  130. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-remove.mdx +1 -1
  131. package/docs/docs/cmd/entra/oauth2grant/oauth2grant-set.mdx +1 -1
  132. package/docs/docs/cmd/external/connection/connection-add.mdx +2 -2
  133. package/docs/docs/cmd/file/file-add.mdx +1 -1
  134. package/docs/docs/cmd/graph/schemaextension/schemaextension-add.mdx +2 -2
  135. package/docs/docs/cmd/graph/schemaextension/schemaextension-set.mdx +1 -1
  136. package/docs/docs/cmd/login.mdx +18 -18
  137. package/docs/docs/cmd/outlook/message/message-remove.mdx +67 -0
  138. package/docs/docs/cmd/pa/app/app-owner-set.mdx +1 -1
  139. package/docs/docs/cmd/pa/app/app-permission-ensure.mdx +3 -3
  140. package/docs/docs/cmd/pa/app/app-permission-remove.mdx +3 -3
  141. package/docs/docs/cmd/planner/plan/plan-add.mdx +1 -1
  142. package/docs/docs/cmd/planner/roster/roster-add.mdx +5 -5
  143. package/docs/docs/cmd/planner/roster/roster-get.mdx +7 -7
  144. package/docs/docs/cmd/planner/roster/roster-member-add.mdx +4 -4
  145. package/docs/docs/cmd/planner/roster/roster-member-get.mdx +4 -4
  146. package/docs/docs/cmd/planner/roster/roster-member-list.mdx +2 -2
  147. package/docs/docs/cmd/planner/roster/roster-member-remove.mdx +5 -5
  148. package/docs/docs/cmd/planner/roster/roster-plan-list.mdx +1 -1
  149. package/docs/docs/cmd/planner/roster/roster-remove.mdx +2 -2
  150. package/docs/docs/cmd/planner/task/task-add.mdx +1 -1
  151. package/docs/docs/cmd/planner/task/task-get.mdx +1 -1
  152. package/docs/docs/cmd/planner/task/task-list.mdx +1 -1
  153. package/docs/docs/cmd/planner/task/task-remove.mdx +1 -1
  154. package/docs/docs/cmd/planner/task/task-set.mdx +1 -1
  155. package/docs/docs/cmd/pp/environment/environment-get.mdx +1 -1
  156. package/docs/docs/cmd/pp/environment/environment-list.mdx +1 -1
  157. package/docs/docs/cmd/pp/managementapp/managementapp-add.mdx +9 -9
  158. package/docs/docs/cmd/purview/auditlog/auditlog-list.mdx +1 -1
  159. package/docs/docs/cmd/purview/sensitivitylabel/sensitivitylabel-get.mdx +1 -1
  160. package/docs/docs/cmd/purview/sensitivitylabel/sensitivitylabel-list.mdx +1 -1
  161. package/docs/docs/cmd/purview/sensitivitylabel/sensitivitylabel-policysettings-list.mdx +1 -1
  162. package/docs/docs/cmd/purview/threatassessment/threatassessment-add.mdx +131 -0
  163. package/docs/docs/cmd/purview/threatassessment/threatassessment-list.mdx +110 -0
  164. package/docs/docs/cmd/request.mdx +1 -1
  165. package/docs/docs/cmd/spfx/project/project-azuredevops-pipeline-add.mdx +87 -0
  166. package/docs/docs/cmd/spfx/project/project-github-workflow-add.mdx +2 -2
  167. package/docs/docs/cmd/spo/file/file-roleassignment-add.mdx +3 -3
  168. package/docs/docs/cmd/spo/file/file-roleassignment-remove.mdx +2 -2
  169. package/docs/docs/cmd/spo/folder/folder-add.mdx +38 -0
  170. package/docs/docs/cmd/spo/folder/folder-roleassignment-add.mdx +1 -1
  171. package/docs/docs/cmd/spo/folder/folder-roleassignment-remove.mdx +1 -1
  172. package/docs/docs/cmd/spo/folder/folder-set.mdx +88 -0
  173. package/docs/docs/cmd/spo/group/group-member-add.mdx +2 -2
  174. package/docs/docs/cmd/spo/group/group-member-remove.mdx +3 -3
  175. package/docs/docs/cmd/spo/list/list-roleassignment-add.mdx +3 -3
  176. package/docs/docs/cmd/spo/list/list-roleassignment-remove.mdx +2 -2
  177. package/docs/docs/cmd/spo/listitem/listitem-roleassignment-add.mdx +8 -8
  178. package/docs/docs/cmd/spo/listitem/listitem-roleassignment-remove.mdx +2 -2
  179. package/docs/docs/cmd/spo/site/site-apppermission-add.mdx +2 -2
  180. package/docs/docs/cmd/spo/site/site-apppermission-set.mdx +2 -2
  181. package/docs/docs/cmd/spo/site/site-recyclebinitem-restore.mdx +29 -5
  182. package/docs/docs/cmd/spo/tenant/tenant-settings-set.mdx +89 -89
  183. package/docs/docs/cmd/spo/user/user-ensure.mdx +1 -1
  184. package/docs/docs/cmd/spo/user/user-remove.mdx +40 -9
  185. package/docs/docs/cmd/spo/web/web-roleassignment-add.mdx +3 -3
  186. package/docs/docs/cmd/spo/web/web-roleassignment-remove.mdx +2 -2
  187. package/docs/docs/cmd/teams/channel/channel-member-remove.mdx +1 -1
  188. package/docs/docs/cmd/teams/channel/channel-member-set.mdx +1 -1
  189. package/docs/docs/cmd/teams/chat/chat-member-remove.mdx +3 -3
  190. package/docs/docs/cmd/teams/report/report-directroutingcalls.mdx +1 -1
  191. package/docs/docs/cmd/teams/report/report-pstncalls.mdx +1 -1
  192. package/docs/docs/cmd/teams/tab/tab-get.mdx +19 -12
  193. package/docs/docs/cmd/tenant/security/security-alerts-list.mdx +1 -1
  194. package/docs/docs/cmd/viva/engage/engage-group-list.mdx +1 -1
  195. package/docs/docs/cmd/viva/engage/engage-group-user-add.mdx +1 -1
  196. package/docs/docs/cmd/viva/engage/engage-group-user-remove.mdx +1 -1
  197. package/docs/docs/cmd/viva/engage/engage-message-add.mdx +1 -1
  198. package/docs/docs/cmd/viva/engage/engage-message-get.mdx +1 -1
  199. package/docs/docs/cmd/viva/engage/engage-message-like-set.mdx +1 -1
  200. package/docs/docs/cmd/viva/engage/engage-message-list.mdx +1 -1
  201. package/docs/docs/cmd/viva/engage/engage-message-remove.mdx +1 -1
  202. package/docs/docs/cmd/viva/engage/engage-network-list.mdx +1 -1
  203. package/docs/docs/cmd/viva/engage/engage-search.mdx +1 -1
  204. package/docs/docs/cmd/viva/engage/engage-user-get.mdx +1 -1
  205. package/docs/docs/cmd/viva/engage/engage-user-list.mdx +1 -1
  206. package/npm-shrinkwrap.json +64 -60
  207. package/package.json +12 -12
  208. package/dist/m365/spo/commands/folder/folder-rename.js +0 -72
  209. package/docs/docs/cmd/spo/folder/folder-rename.mdx +0 -44
@@ -0,0 +1,183 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _SpfxProjectAzureDevOpsPipelineAddCommand_instances, _a, _SpfxProjectAzureDevOpsPipelineAddCommand_initTelemetry, _SpfxProjectAzureDevOpsPipelineAddCommand_initOptions, _SpfxProjectAzureDevOpsPipelineAddCommand_initValidators;
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import yaml from 'yaml';
10
+ import { CommandError } from '../../../../Command.js';
11
+ import commands from '../../commands.js';
12
+ import { BaseProjectCommand } from './base-project-command.js';
13
+ import { validation } from '../../../../utils/validation.js';
14
+ import { pipeline } from './DeployWorkflow.js';
15
+ import { fsUtil } from '../../../../utils/fsUtil.js';
16
+ import { parse } from 'semver';
17
+ class SpfxProjectAzureDevOpsPipelineAddCommand extends BaseProjectCommand {
18
+ get name() {
19
+ return commands.PROJECT_AZUREDEVOPS_PIPELINE_ADD;
20
+ }
21
+ get description() {
22
+ return 'Adds a Azure DevOps Pipeline for a SharePoint Framework project.';
23
+ }
24
+ constructor() {
25
+ super();
26
+ _SpfxProjectAzureDevOpsPipelineAddCommand_instances.add(this);
27
+ __classPrivateFieldGet(this, _SpfxProjectAzureDevOpsPipelineAddCommand_instances, "m", _SpfxProjectAzureDevOpsPipelineAddCommand_initTelemetry).call(this);
28
+ __classPrivateFieldGet(this, _SpfxProjectAzureDevOpsPipelineAddCommand_instances, "m", _SpfxProjectAzureDevOpsPipelineAddCommand_initOptions).call(this);
29
+ __classPrivateFieldGet(this, _SpfxProjectAzureDevOpsPipelineAddCommand_instances, "m", _SpfxProjectAzureDevOpsPipelineAddCommand_initValidators).call(this);
30
+ }
31
+ async commandAction(logger, args) {
32
+ this.projectRootPath = this.getProjectRoot(process.cwd());
33
+ if (this.projectRootPath === null) {
34
+ throw new CommandError(`Couldn't find project root folder`, _a.ERROR_NO_PROJECT_ROOT_FOLDER);
35
+ }
36
+ const solutionPackageJsonFile = path.join(this.projectRootPath, 'package.json');
37
+ const packageJson = fs.readFileSync(solutionPackageJsonFile, 'utf-8');
38
+ const solutionName = JSON.parse(packageJson).name;
39
+ if (this.debug) {
40
+ logger.logToStderr(`Adding Azure DevOps pipeline in the current SPFx project`);
41
+ }
42
+ try {
43
+ this.updatePipeline(solutionName, pipeline, args.options);
44
+ this.savePipeline(pipeline);
45
+ }
46
+ catch (error) {
47
+ throw new CommandError(error);
48
+ }
49
+ }
50
+ savePipeline(pipeline) {
51
+ const azureDevOpsPath = path.join(this.projectRootPath, '.azuredevops');
52
+ fsUtil.ensureDirectory(azureDevOpsPath);
53
+ const pipelinesPath = path.join(azureDevOpsPath, 'pipelines');
54
+ fsUtil.ensureDirectory(pipelinesPath);
55
+ const pipelineFile = path.join(pipelinesPath, 'deploy-spfx-solution.yml');
56
+ fs.writeFileSync(path.resolve(pipelineFile), yaml.stringify(pipeline), 'utf-8');
57
+ }
58
+ updatePipeline(solutionName, pipeline, options) {
59
+ if (options.name) {
60
+ pipeline.name = options.name;
61
+ }
62
+ else {
63
+ delete pipeline.name;
64
+ }
65
+ if (options.branchName) {
66
+ pipeline.trigger.branches.include[0] = options.branchName;
67
+ }
68
+ const version = this.getProjectVersion();
69
+ if (!version) {
70
+ throw `Unable to determine the version of the current SharePoint Framework project`;
71
+ }
72
+ const minorVersion = parse(version)?.minor;
73
+ if (minorVersion === undefined) {
74
+ throw `Unable to determine the minor version of the current SharePoint Framework project`;
75
+ }
76
+ if (minorVersion < 18) {
77
+ const node = this.getNodeAction(pipeline);
78
+ if (node.inputs) {
79
+ node.inputs.versionSpec = '16.x';
80
+ }
81
+ }
82
+ const script = this.getScriptAction(pipeline);
83
+ if (script.script) {
84
+ if (options.loginMethod === 'user') {
85
+ script.script = script.script.replace(`{{login}}`, `m365 login --authType password --userName '$(UserName)' --password '$(Password)'`);
86
+ pipeline.variables = pipeline.variables.filter(v => v.name !== 'CertificateBase64Encoded' &&
87
+ v.name !== 'CertificateSecureFileId' &&
88
+ v.name !== 'CertificatePassword' &&
89
+ v.name !== 'EntraAppId' &&
90
+ v.name !== 'TenantId');
91
+ }
92
+ else {
93
+ script.script = script.script.replace(`{{login}}`, `m365 login --authType certificate --certificateBase64Encoded '$(CertificateBase64Encoded)' --password '$(CertificatePassword)' --appId '$(EntraAppId)' --tenant '$(TenantId)'`);
94
+ pipeline.variables = pipeline.variables.filter(v => v.name !== 'UserName' &&
95
+ v.name !== 'Password');
96
+ }
97
+ if (options.scope === 'sitecollection') {
98
+ script.script = script.script.replace(`{{deploy}}`, `m365 spo app deploy --name '$(PackageName)' --appCatalogScope sitecollection --appCatalogUrl '$(SiteAppCatalogUrl)'`);
99
+ script.script = script.script.replace(`{{addApp}}`, `m365 spo app add --filePath '$(Build.SourcesDirectory)/sharepoint/solution/$(PackageName)' --appCatalogScope sitecollection --appCatalogUrl '$(SiteAppCatalogUrl)' --overwrite`);
100
+ this.assignPipelineVariables(pipeline, 'SiteAppCatalogUrl', options.siteUrl);
101
+ }
102
+ else {
103
+ script.script = script.script.replace(`{{deploy}}`, `m365 spo app deploy --name '$(PackageName)' --appCatalogScope 'tenant'`);
104
+ script.script = script.script.replace(`{{addApp}}`, `m365 spo app add --filePath '$(Build.SourcesDirectory)/sharepoint/solution/$(PackageName)' --overwrite`);
105
+ pipeline.variables = pipeline.variables.filter(v => v.name !== 'SiteAppCatalogUrl');
106
+ }
107
+ if (solutionName) {
108
+ this.assignPipelineVariables(pipeline, 'PackageName', `${solutionName}.sppkg`);
109
+ }
110
+ if (options.skipFeatureDeployment) {
111
+ script.script = script.script.replace(`m365 spo app deploy `, `m365 spo app deploy --skipFeatureDeployment `);
112
+ }
113
+ }
114
+ }
115
+ assignPipelineVariables(pipeline, variableName, newVariableValue) {
116
+ const variable = pipeline.variables.find(v => v.name === variableName);
117
+ if (variable) {
118
+ variable.value = newVariableValue;
119
+ }
120
+ }
121
+ getScriptAction(pipeline) {
122
+ const steps = this.getPipelineSteps(pipeline);
123
+ return steps.find(step => step.script);
124
+ }
125
+ getNodeAction(pipeline) {
126
+ const steps = this.getPipelineSteps(pipeline);
127
+ return steps.find(step => step.task && step.task.indexOf('NodeTool') >= 0);
128
+ }
129
+ getPipelineSteps(pipeline) {
130
+ return pipeline.stages[0].jobs[0].steps;
131
+ }
132
+ }
133
+ _a = SpfxProjectAzureDevOpsPipelineAddCommand, _SpfxProjectAzureDevOpsPipelineAddCommand_instances = new WeakSet(), _SpfxProjectAzureDevOpsPipelineAddCommand_initTelemetry = function _SpfxProjectAzureDevOpsPipelineAddCommand_initTelemetry() {
134
+ this.telemetry.push((args) => {
135
+ Object.assign(this.telemetryProperties, {
136
+ name: typeof args.options.name !== 'undefined',
137
+ branchName: typeof args.options.branchName !== 'undefined',
138
+ loginMethod: typeof args.options.loginMethod !== 'undefined',
139
+ scope: typeof args.options.scope !== 'undefined',
140
+ skipFeatureDeployment: !!args.options.skipFeatureDeployment
141
+ });
142
+ });
143
+ }, _SpfxProjectAzureDevOpsPipelineAddCommand_initOptions = function _SpfxProjectAzureDevOpsPipelineAddCommand_initOptions() {
144
+ this.options.unshift({
145
+ option: '-n, --name [name]'
146
+ }, {
147
+ option: '-b, --branchName [branchName]'
148
+ }, {
149
+ option: '-l, --loginMethod [loginMethod]',
150
+ autocomplete: _a.loginMethod
151
+ }, {
152
+ option: '-s, --scope [scope]',
153
+ autocomplete: _a.scope
154
+ }, {
155
+ option: '-u, --siteUrl [siteUrl]'
156
+ }, {
157
+ option: '--skipFeatureDeployment'
158
+ });
159
+ }, _SpfxProjectAzureDevOpsPipelineAddCommand_initValidators = function _SpfxProjectAzureDevOpsPipelineAddCommand_initValidators() {
160
+ this.validators.push(async (args) => {
161
+ if (args.options.scope && args.options.scope === 'sitecollection') {
162
+ if (!args.options.siteUrl) {
163
+ return `siteUrl option has to be defined when scope set to ${args.options.scope}`;
164
+ }
165
+ const isValidSharePointUrl = validation.isValidSharePointUrl(args.options.siteUrl);
166
+ if (isValidSharePointUrl !== true) {
167
+ return isValidSharePointUrl;
168
+ }
169
+ }
170
+ if (args.options.loginMethod && _a.loginMethod.indexOf(args.options.loginMethod) < 0) {
171
+ return `${args.options.loginMethod} is not a valid login method. Allowed values are ${_a.loginMethod.join(', ')}`;
172
+ }
173
+ if (args.options.scope && _a.scope.indexOf(args.options.scope) < 0) {
174
+ return `${args.options.scope} is not a valid scope. Allowed values are ${_a.scope.join(', ')}`;
175
+ }
176
+ return true;
177
+ });
178
+ };
179
+ SpfxProjectAzureDevOpsPipelineAddCommand.loginMethod = ['application', 'user'];
180
+ SpfxProjectAzureDevOpsPipelineAddCommand.scope = ['tenant', 'sitecollection'];
181
+ SpfxProjectAzureDevOpsPipelineAddCommand.ERROR_NO_PROJECT_ROOT_FOLDER = 1;
182
+ export default new SpfxProjectAzureDevOpsPipelineAddCommand();
183
+ //# sourceMappingURL=project-azuredevops-pipeline-add.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-azuredevops-pipeline-model.js.map
@@ -13,6 +13,7 @@ import { validation } from '../../../../utils/validation.js';
13
13
  import commands from '../../commands.js';
14
14
  import { workflow } from './DeployWorkflow.js';
15
15
  import { BaseProjectCommand } from './base-project-command.js';
16
+ import { parse } from 'semver';
16
17
  class SpfxProjectGithubWorkflowAddCommand extends BaseProjectCommand {
17
18
  get name() {
18
19
  return commands.PROJECT_GITHUB_WORKFLOW_ADD;
@@ -67,10 +68,8 @@ class SpfxProjectGithubWorkflowAddCommand extends BaseProjectCommand {
67
68
  if (!version) {
68
69
  throw `Unable to determine the version of the current SharePoint Framework project`;
69
70
  }
70
- const match = version.match(/^(\d+)\.(\d+)\.(\d+)$/);
71
- const minorVersionString = match ? match[2] : null;
72
- const minorVersion = minorVersionString ? Number(minorVersionString) : null;
73
- if (minorVersion === null || isNaN(minorVersion)) {
71
+ const minorVersion = parse(version)?.minor;
72
+ if (minorVersion === undefined) {
74
73
  throw `Unable to determine the minor version of the current SharePoint Framework project`;
75
74
  }
76
75
  if (minorVersion < 18) {
@@ -2,6 +2,7 @@ const prefix = 'spfx';
2
2
  export default {
3
3
  DOCTOR: `${prefix} doctor`,
4
4
  PACKAGE_GENERATE: `${prefix} package generate`,
5
+ PROJECT_AZUREDEVOPS_PIPELINE_ADD: `${prefix} project azuredevops pipeline add`,
5
6
  PROJECT_DOCTOR: `${prefix} project doctor`,
6
7
  PROJECT_EXTERNALIZE: `${prefix} project externalize`,
7
8
  PROJECT_GITHUB_WORKFLOW_ADD: `${prefix} project github workflow add`,
@@ -0,0 +1,19 @@
1
+ export const FolderColorValues = {
2
+ yellow: '0',
3
+ darkRed: '1',
4
+ darkOrange: '2',
5
+ darkGreen: '3',
6
+ darkTeal: '4',
7
+ darkBlue: '5',
8
+ darkPurple: '6',
9
+ darkPink: '7',
10
+ grey: '8',
11
+ lightRed: '9',
12
+ lightOrange: '10',
13
+ lightGreen: '11',
14
+ lightTeal: '12',
15
+ lightBlue: '13',
16
+ lightPurple: '14',
17
+ lightPink: '15'
18
+ };
19
+ //# sourceMappingURL=FolderColor.js.map
@@ -3,13 +3,14 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3
3
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
- var _SpoFolderAddCommand_instances, _SpoFolderAddCommand_initOptions, _SpoFolderAddCommand_initValidators, _SpoFolderAddCommand_initTypes;
6
+ var _SpoFolderAddCommand_instances, _SpoFolderAddCommand_initTelemetry, _SpoFolderAddCommand_initOptions, _SpoFolderAddCommand_initValidators, _SpoFolderAddCommand_initTypes;
7
7
  import request from '../../../../request.js';
8
8
  import { formatting } from '../../../../utils/formatting.js';
9
9
  import { urlUtil } from '../../../../utils/urlUtil.js';
10
10
  import { validation } from '../../../../utils/validation.js';
11
11
  import SpoCommand from '../../../base/SpoCommand.js';
12
12
  import commands from '../../commands.js';
13
+ import { FolderColorValues } from './FolderColor.js';
13
14
  class SpoFolderAddCommand extends SpoCommand {
14
15
  get name() {
15
16
  return commands.FOLDER_ADD;
@@ -20,25 +21,35 @@ class SpoFolderAddCommand extends SpoCommand {
20
21
  constructor() {
21
22
  super();
22
23
  _SpoFolderAddCommand_instances.add(this);
24
+ __classPrivateFieldGet(this, _SpoFolderAddCommand_instances, "m", _SpoFolderAddCommand_initTelemetry).call(this);
23
25
  __classPrivateFieldGet(this, _SpoFolderAddCommand_instances, "m", _SpoFolderAddCommand_initOptions).call(this);
24
26
  __classPrivateFieldGet(this, _SpoFolderAddCommand_instances, "m", _SpoFolderAddCommand_initValidators).call(this);
25
27
  __classPrivateFieldGet(this, _SpoFolderAddCommand_instances, "m", _SpoFolderAddCommand_initTypes).call(this);
26
28
  }
27
29
  async commandAction(logger, args) {
28
- if (this.verbose) {
29
- await logger.logToStderr(`Adding folder to site ${args.options.webUrl}...`);
30
- }
31
- const parentFolderServerRelativeUrl = urlUtil.getServerRelativePath(args.options.webUrl, args.options.parentFolderUrl);
32
- const serverRelativeUrl = `${parentFolderServerRelativeUrl}/${args.options.name}`;
33
- const requestUrl = `${args.options.webUrl}/_api/web/folders/addUsingPath(decodedUrl='${formatting.encodeQueryParameter(serverRelativeUrl)}')`;
34
- const requestOptions = {
35
- url: requestUrl,
36
- headers: {
37
- 'accept': 'application/json;odata=nometadata'
38
- },
39
- responseType: 'json'
40
- };
41
30
  try {
31
+ if (this.verbose) {
32
+ await logger.logToStderr(`Adding folder to site ${args.options.webUrl}...`);
33
+ }
34
+ const parentFolderServerRelativeUrl = urlUtil.getServerRelativePath(args.options.webUrl, args.options.parentFolderUrl);
35
+ const serverRelativeUrl = `${parentFolderServerRelativeUrl}/${args.options.name}`;
36
+ const requestOptions = {
37
+ headers: {
38
+ 'accept': 'application/json;odata=nometadata'
39
+ },
40
+ responseType: 'json'
41
+ };
42
+ if (args.options.color === undefined) {
43
+ requestOptions.url = `${args.options.webUrl}/_api/web/folders/addUsingPath(decodedUrl='${formatting.encodeQueryParameter(serverRelativeUrl)}')`;
44
+ }
45
+ else {
46
+ requestOptions.url = `${args.options.webUrl}/_api/foldercoloring/createfolder(DecodedUrl='${formatting.encodeQueryParameter(serverRelativeUrl)}', overwrite=false)`;
47
+ requestOptions.data = {
48
+ coloringInformation: {
49
+ ColorHex: FolderColorValues[args.options.color] || args.options.color
50
+ }
51
+ };
52
+ }
42
53
  const folder = await request.post(requestOptions);
43
54
  await logger.log(folder);
44
55
  }
@@ -47,18 +58,36 @@ class SpoFolderAddCommand extends SpoCommand {
47
58
  }
48
59
  }
49
60
  }
50
- _SpoFolderAddCommand_instances = new WeakSet(), _SpoFolderAddCommand_initOptions = function _SpoFolderAddCommand_initOptions() {
61
+ _SpoFolderAddCommand_instances = new WeakSet(), _SpoFolderAddCommand_initTelemetry = function _SpoFolderAddCommand_initTelemetry() {
62
+ this.telemetry.push((args) => {
63
+ Object.assign(this.telemetryProperties, {
64
+ color: typeof args.options.color !== 'undefined'
65
+ });
66
+ });
67
+ }, _SpoFolderAddCommand_initOptions = function _SpoFolderAddCommand_initOptions() {
51
68
  this.options.unshift({
52
69
  option: '-u, --webUrl <webUrl>'
53
70
  }, {
54
71
  option: '-p, --parentFolderUrl <parentFolderUrl>'
55
72
  }, {
56
73
  option: '-n, --name <name>'
74
+ }, {
75
+ option: '--color [color]',
76
+ autocomplete: Object.keys(FolderColorValues)
57
77
  });
58
78
  }, _SpoFolderAddCommand_initValidators = function _SpoFolderAddCommand_initValidators() {
59
- this.validators.push(async (args) => validation.isValidSharePointUrl(args.options.webUrl));
79
+ this.validators.push(async (args) => {
80
+ const isValidSharePointUrl = validation.isValidSharePointUrl(args.options.webUrl);
81
+ if (isValidSharePointUrl !== true) {
82
+ return isValidSharePointUrl;
83
+ }
84
+ if (args.options.color && !Object.entries(FolderColorValues).flat().includes(args.options.color)) {
85
+ return `'${args.options.color}' is not a valid value for option 'color'. Allowed values are ${Object.keys(FolderColorValues).join(', ')}, ${Object.values(FolderColorValues).join(', ')}.`;
86
+ }
87
+ return true;
88
+ });
60
89
  }, _SpoFolderAddCommand_initTypes = function _SpoFolderAddCommand_initTypes() {
61
- this.types.string.push('webUrl', 'parentFolderUrl', 'name');
90
+ this.types.string.push('webUrl', 'parentFolderUrl', 'name', 'color');
62
91
  };
63
92
  export default new SpoFolderAddCommand();
64
93
  //# sourceMappingURL=folder-add.js.map
@@ -0,0 +1,118 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _SpoFolderSetCommand_instances, _SpoFolderSetCommand_initTelemetry, _SpoFolderSetCommand_initOptions, _SpoFolderSetCommand_initValidators, _SpoFolderSetCommand_initTypes;
7
+ import request from '../../../../request.js';
8
+ import { formatting } from '../../../../utils/formatting.js';
9
+ import { urlUtil } from '../../../../utils/urlUtil.js';
10
+ import { validation } from '../../../../utils/validation.js';
11
+ import SpoCommand from '../../../base/SpoCommand.js';
12
+ import commands from '../../commands.js';
13
+ import { FolderColorValues } from './FolderColor.js';
14
+ class SpoFolderSetCommand extends SpoCommand {
15
+ get name() {
16
+ return commands.FOLDER_SET;
17
+ }
18
+ get description() {
19
+ return 'Updates a folder';
20
+ }
21
+ alias() {
22
+ return [commands.FOLDER_RENAME];
23
+ }
24
+ constructor() {
25
+ super();
26
+ _SpoFolderSetCommand_instances.add(this);
27
+ __classPrivateFieldGet(this, _SpoFolderSetCommand_instances, "m", _SpoFolderSetCommand_initTelemetry).call(this);
28
+ __classPrivateFieldGet(this, _SpoFolderSetCommand_instances, "m", _SpoFolderSetCommand_initOptions).call(this);
29
+ __classPrivateFieldGet(this, _SpoFolderSetCommand_instances, "m", _SpoFolderSetCommand_initValidators).call(this);
30
+ __classPrivateFieldGet(this, _SpoFolderSetCommand_instances, "m", _SpoFolderSetCommand_initTypes).call(this);
31
+ }
32
+ getExcludedOptionsWithUrls() {
33
+ return ['url'];
34
+ }
35
+ async commandAction(logger, args) {
36
+ try {
37
+ await this.showDeprecationWarning(logger, this.alias()[0], this.name);
38
+ if (this.verbose) {
39
+ await logger.logToStderr(`Updating folder '${args.options.name}'...`);
40
+ }
41
+ const serverRelativePath = urlUtil.getServerRelativePath(args.options.webUrl, args.options.url);
42
+ if (!args.options.color) {
43
+ const requestOptions = {
44
+ url: `${args.options.webUrl}/_api/Web/GetFolderByServerRelativePath(DecodedUrl='${formatting.encodeQueryParameter(serverRelativePath)}')/ListItemAllFields`,
45
+ headers: {
46
+ accept: 'application/json;odata=nometadata',
47
+ 'if-match': '*'
48
+ },
49
+ data: {
50
+ FileLeafRef: args.options.name,
51
+ Title: args.options.name
52
+ },
53
+ responseType: 'json'
54
+ };
55
+ const response = await request.patch(requestOptions);
56
+ if (response && response['odata.null'] === true) {
57
+ throw 'Folder not found.';
58
+ }
59
+ }
60
+ else {
61
+ const requestOptions = {
62
+ url: `${args.options.webUrl}/_api/foldercoloring/${args.options.name ? 'renamefolder' : 'stampcolor'}(DecodedUrl='${formatting.encodeQueryParameter(serverRelativePath)}')`,
63
+ headers: {
64
+ accept: 'application/json;odata=nometadata'
65
+ },
66
+ responseType: 'json',
67
+ data: {
68
+ coloringInformation: {
69
+ ColorHex: FolderColorValues[args.options.color] || args.options.color
70
+ },
71
+ newName: args.options.name
72
+ }
73
+ };
74
+ await request.post(requestOptions);
75
+ }
76
+ }
77
+ catch (err) {
78
+ this.handleRejectedODataJsonPromise(err);
79
+ }
80
+ }
81
+ }
82
+ _SpoFolderSetCommand_instances = new WeakSet(), _SpoFolderSetCommand_initTelemetry = function _SpoFolderSetCommand_initTelemetry() {
83
+ this.telemetry.push((args) => {
84
+ Object.assign(this.telemetryProperties, {
85
+ name: typeof args.options.name !== 'undefined',
86
+ color: typeof args.options.color !== 'undefined'
87
+ });
88
+ });
89
+ }, _SpoFolderSetCommand_initOptions = function _SpoFolderSetCommand_initOptions() {
90
+ this.options.unshift({
91
+ option: '-u, --webUrl <webUrl>'
92
+ }, {
93
+ option: '--url <url>'
94
+ }, {
95
+ option: '-n, --name [name]'
96
+ }, {
97
+ option: '--color [color]',
98
+ autocomplete: Object.keys(FolderColorValues)
99
+ });
100
+ }, _SpoFolderSetCommand_initValidators = function _SpoFolderSetCommand_initValidators() {
101
+ this.validators.push(async (args) => {
102
+ const isValidSharePointUrl = validation.isValidSharePointUrl(args.options.webUrl);
103
+ if (isValidSharePointUrl !== true) {
104
+ return isValidSharePointUrl;
105
+ }
106
+ if (args.options.color === undefined && args.options.name === undefined) {
107
+ return `Specify at least one of the options: name or color.`;
108
+ }
109
+ if (args.options.color && !Object.entries(FolderColorValues).flat().includes(args.options.color)) {
110
+ return `'${args.options.color}' is not a valid value for option 'color'. Allowed values are ${Object.keys(FolderColorValues).join(', ')}, ${Object.values(FolderColorValues).join(', ')}.`;
111
+ }
112
+ return true;
113
+ });
114
+ }, _SpoFolderSetCommand_initTypes = function _SpoFolderSetCommand_initTypes() {
115
+ this.types.string.push('webUrl', 'url', 'name', 'color');
116
+ };
117
+ export default new SpoFolderSetCommand();
118
+ //# sourceMappingURL=folder-set.js.map
@@ -109,14 +109,14 @@ class SpoGroupMemberAddCommand extends SpoCommand {
109
109
  }
110
110
  else if (args.options.entraGroupNames) {
111
111
  if (this.verbose) {
112
- await logger.logToStderr(`Getting ID of Azure AD group ${trimmedIdentifier}`);
112
+ await logger.logToStderr(`Getting ID of Microsoft Entra group ${trimmedIdentifier}`);
113
113
  }
114
114
  const groupId = await entraGroup.getGroupIdByDisplayName(trimmedIdentifier);
115
115
  validUserNames.push(groupId);
116
116
  }
117
117
  else {
118
118
  if (this.verbose) {
119
- await logger.logToStderr(`Getting Azure AD ID for user ${trimmedIdentifier}`);
119
+ await logger.logToStderr(`Getting Microsoft Entra ID for user ${trimmedIdentifier}`);
120
120
  }
121
121
  const upn = await entraUser.getUserIdByEmail(trimmedIdentifier);
122
122
  validUserNames.push(upn);
@@ -122,7 +122,7 @@ class SpoGroupMemberRemoveCommand extends SpoCommand {
122
122
  foundGroups = getGroupMemberListOutput.filter((x) => { return x.Title === args.options.entraGroupName && (x.LoginName.indexOf("c:0o.c|federateddirectoryclaimprovider|") === 0 || x.LoginName.indexOf("c:0t.c|tenant|") === 0); });
123
123
  }
124
124
  if (foundGroups.length === 0) {
125
- throw `The Azure AD group ${args.options.entraGroupId || args.options.entraGroupName} is not found in SharePoint group ${args.options.groupId || args.options.groupName}`;
125
+ throw `The Microsoft Entra group ${args.options.entraGroupId || args.options.entraGroupName} is not found in SharePoint group ${args.options.groupId || args.options.groupName}`;
126
126
  }
127
127
  return foundGroups[0].Id;
128
128
  }
@@ -51,10 +51,10 @@ class SpoSiteAppPermissionAddCommand extends GraphCommand {
51
51
  const response = await request.get(appRequestOptions);
52
52
  const appItem = response.value[0];
53
53
  if (!appItem) {
54
- throw "The specified Azure AD app does not exist";
54
+ throw "The specified Microsoft Entra app does not exist";
55
55
  }
56
56
  if (response.value.length > 1) {
57
- throw `Multiple Azure AD app with displayName ${args.options.appDisplayName} found: ${response.value.map(x => x.appId)}`;
57
+ throw `Multiple Microsoft Entra apps with displayName ${args.options.appDisplayName} found: ${response.value.map(x => x.appId)}`;
58
58
  }
59
59
  return {
60
60
  appId: appItem.appId,
@@ -3,7 +3,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3
3
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
- var _SpoSiteRecycleBinItemRestoreCommand_instances, _SpoSiteRecycleBinItemRestoreCommand_initOptions, _SpoSiteRecycleBinItemRestoreCommand_initValidators;
6
+ var _SpoSiteRecycleBinItemRestoreCommand_instances, _SpoSiteRecycleBinItemRestoreCommand_initOptions, _SpoSiteRecycleBinItemRestoreCommand_initValidators, _SpoSiteRecycleBinItemRestoreCommand_initTypes;
7
7
  import request from '../../../../request.js';
8
8
  import { formatting } from '../../../../utils/formatting.js';
9
9
  import { validation } from '../../../../utils/validation.js';
@@ -21,43 +21,73 @@ class SpoSiteRecycleBinItemRestoreCommand extends SpoCommand {
21
21
  _SpoSiteRecycleBinItemRestoreCommand_instances.add(this);
22
22
  __classPrivateFieldGet(this, _SpoSiteRecycleBinItemRestoreCommand_instances, "m", _SpoSiteRecycleBinItemRestoreCommand_initOptions).call(this);
23
23
  __classPrivateFieldGet(this, _SpoSiteRecycleBinItemRestoreCommand_instances, "m", _SpoSiteRecycleBinItemRestoreCommand_initValidators).call(this);
24
+ __classPrivateFieldGet(this, _SpoSiteRecycleBinItemRestoreCommand_instances, "m", _SpoSiteRecycleBinItemRestoreCommand_initTypes).call(this);
24
25
  }
25
26
  async commandAction(logger, args) {
26
27
  if (this.verbose) {
27
28
  await logger.logToStderr(`Restoring items from recycle bin at ${args.options.siteUrl}...`);
28
29
  }
29
- const requestUrl = `${args.options.siteUrl}/_api/site/RecycleBin/RestoreByIds`;
30
- const ids = formatting.splitAndTrim(args.options.ids);
31
- const idsChunks = [];
32
- while (ids.length) {
33
- idsChunks.push(ids.splice(0, 20));
34
- }
30
+ const baseUrl = `${args.options.siteUrl}/_api`;
35
31
  try {
36
- await Promise.all(idsChunks.map((idsChunk) => {
37
- const requestOptions = {
38
- url: requestUrl,
39
- headers: {
40
- 'accept': 'application/json;odata=nometadata',
41
- 'content-type': 'application/json'
42
- },
43
- responseType: 'json',
44
- data: {
45
- ids: idsChunk
46
- }
47
- };
48
- return request.post(requestOptions);
49
- }));
32
+ if (args.options.ids) {
33
+ const requestUrl = baseUrl + '/site/RecycleBin/RestoreByIds';
34
+ const ids = formatting.splitAndTrim(args.options.ids);
35
+ const idsChunks = [];
36
+ while (ids.length) {
37
+ idsChunks.push(ids.splice(0, 20));
38
+ }
39
+ await Promise.all(idsChunks.map((idsChunk) => {
40
+ const requestOptions = {
41
+ url: requestUrl,
42
+ headers: {
43
+ 'accept': 'application/json;odata=nometadata',
44
+ 'content-type': 'application/json'
45
+ },
46
+ responseType: 'json',
47
+ data: {
48
+ ids: idsChunk
49
+ }
50
+ };
51
+ return request.post(requestOptions);
52
+ }));
53
+ }
54
+ else {
55
+ if (args.options.allPrimary && args.options.allSecondary) {
56
+ await this.restoreRecycleBinStage(baseUrl + '/site/RecycleBin/RestoreAll');
57
+ }
58
+ else if (args.options.allPrimary) {
59
+ await this.restoreRecycleBinStage(baseUrl + '/web/RecycleBin/RestoreAll');
60
+ }
61
+ else if (args.options.allSecondary) {
62
+ await this.restoreRecycleBinStage(baseUrl + '/site/GetRecycleBinItems(rowLimit=2000000000,itemState=2)/RestoreAll');
63
+ }
64
+ }
50
65
  }
51
66
  catch (err) {
52
67
  this.handleRejectedODataJsonPromise(err);
53
68
  }
54
69
  }
70
+ async restoreRecycleBinStage(requestUrl) {
71
+ const requestOptions = {
72
+ url: requestUrl,
73
+ headers: {
74
+ accept: 'application/json;odata=nometadata',
75
+ 'content-type': 'application/json'
76
+ },
77
+ responseType: 'json'
78
+ };
79
+ return request.post(requestOptions);
80
+ }
55
81
  }
56
82
  _SpoSiteRecycleBinItemRestoreCommand_instances = new WeakSet(), _SpoSiteRecycleBinItemRestoreCommand_initOptions = function _SpoSiteRecycleBinItemRestoreCommand_initOptions() {
57
83
  this.options.unshift({
58
84
  option: '-u, --siteUrl <siteUrl>'
59
85
  }, {
60
- option: '-i, --ids <ids>'
86
+ option: '-i, --ids [ids]'
87
+ }, {
88
+ option: '--allPrimary'
89
+ }, {
90
+ option: '--allSecondary'
61
91
  });
62
92
  }, _SpoSiteRecycleBinItemRestoreCommand_initValidators = function _SpoSiteRecycleBinItemRestoreCommand_initValidators() {
63
93
  this.validators.push(async (args) => {
@@ -65,14 +95,23 @@ _SpoSiteRecycleBinItemRestoreCommand_instances = new WeakSet(), _SpoSiteRecycleB
65
95
  if (isValidSharePointUrl !== true) {
66
96
  return isValidSharePointUrl;
67
97
  }
68
- const invalidIds = formatting
69
- .splitAndTrim(args.options.ids)
70
- .filter(id => !validation.isValidGuid(id));
71
- if (invalidIds.length > 0) {
72
- return `The following IDs are invalid: ${invalidIds.join(', ')}`;
98
+ if (args.options.ids) {
99
+ const invalidIds = formatting
100
+ .splitAndTrim(args.options.ids)
101
+ .filter(id => !validation.isValidGuid(id));
102
+ if (invalidIds.length > 0) {
103
+ return `The following IDs are invalid: ${invalidIds.join(', ')}`;
104
+ }
105
+ }
106
+ if ((!args.options.ids && !args.options.allPrimary && !args.options.allSecondary)
107
+ || (args.options.ids && (args.options.allPrimary || args.options.allSecondary))) {
108
+ return `Option 'ids' cannot be used with 'allPrimary' or 'allSecondary'.`;
73
109
  }
74
110
  return true;
75
111
  });
112
+ }, _SpoSiteRecycleBinItemRestoreCommand_initTypes = function _SpoSiteRecycleBinItemRestoreCommand_initTypes() {
113
+ this.types.string.push('siteUrl', 'ids');
114
+ this.types.boolean.push('allPrimary', 'allSecondary');
76
115
  };
77
116
  export default new SpoSiteRecycleBinItemRestoreCommand();
78
117
  //# sourceMappingURL=site-recyclebinitem-restore.js.map
@@ -89,7 +89,7 @@ class SpoTenantSettingsSetCommand extends SpoCommand {
89
89
  throw response.ErrorInfo.ErrorMessage;
90
90
  }
91
91
  if (args.options.EnableAzureADB2BIntegration === true) {
92
- await this.warn(logger, 'WARNING: Make sure to also enable the Azure AD one-time passcode authentication preview. If it is not enabled then SharePoint will not use Azure AD B2B even if EnableAzureADB2BIntegration is set to true. Learn more at http://aka.ms/spo-b2b-integration.');
92
+ await this.warn(logger, 'WARNING: Make sure to also enable the Microsoft Entra one-time passcode authentication preview. If it is not enabled then SharePoint will not use Microsoft Entra B2B even if EnableAzureADB2BIntegration is set to true. Learn more at http://aka.ms/spo-b2b-integration.');
93
93
  }
94
94
  }
95
95
  catch (err) {