@pnp/cli-microsoft365 10.10.0-beta.bd186ba → 10.10.0-beta.eb74779

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 (77) hide show
  1. package/.devproxy/api-specs/sharepoint-admin.yaml +67 -0
  2. package/.devproxy/api-specs/sharepoint.yaml +230 -0
  3. package/.devproxy/devproxyrc.json +48 -0
  4. package/.devproxy/generate-openapi-spec.json +24 -0
  5. package/.devproxy/spo-csom-types.json +54 -0
  6. package/.eslintrc.cjs +8 -0
  7. package/allCommands.json +1 -1
  8. package/allCommandsFull.json +1 -1
  9. package/dist/cli/cli.js +2 -2
  10. package/dist/m365/app/commands/permission/permission-add.js +8 -1
  11. package/dist/m365/base/SpoCommand.js +1 -0
  12. package/dist/m365/entra/commands/app/app-permission-add.js +5 -18
  13. package/dist/m365/file/commands/file-copy.js +2 -2
  14. package/dist/m365/file/commands/file-move.js +1 -1
  15. package/dist/m365/planner/commands/tenant/tenant-settings-list.js +0 -3
  16. package/dist/m365/spo/commands/contenttype/contenttype-add.js +3 -65
  17. package/dist/m365/spo/commands/contenttype/contenttype-field-remove.js +5 -50
  18. package/dist/m365/spo/commands/contenttype/contenttype-field-set.js +4 -48
  19. package/dist/m365/spo/commands/contenttype/contenttype-set.js +8 -58
  20. package/dist/m365/spo/commands/contenttype/contenttype-sync.js +2 -2
  21. package/dist/m365/spo/commands/folder/folder-sharinglink-add.js +1 -1
  22. package/dist/m365/spo/commands/folder/folder-sharinglink-clear.js +1 -1
  23. package/dist/m365/spo/commands/folder/folder-sharinglink-get.js +1 -1
  24. package/dist/m365/spo/commands/folder/folder-sharinglink-list.js +1 -1
  25. package/dist/m365/spo/commands/folder/folder-sharinglink-remove.js +1 -1
  26. package/dist/m365/spo/commands/folder/folder-sharinglink-set.js +1 -1
  27. package/dist/m365/spo/commands/listitem/listitem-batch-set.js +3 -27
  28. package/dist/m365/spo/commands/page/Page.js +16 -1
  29. package/dist/m365/spo/commands/page/page-add.js +1 -1
  30. package/dist/m365/spo/commands/page/page-clientsidewebpart-add.js +2 -8
  31. package/dist/m365/spo/commands/page/page-control-remove.js +99 -0
  32. package/dist/m365/spo/commands/page/page-control-set.js +1 -1
  33. package/dist/m365/spo/commands/page/page-header-set.js +9 -40
  34. package/dist/m365/spo/commands/page/page-publish.js +2 -10
  35. package/dist/m365/spo/commands/page/page-section-add.js +2 -8
  36. package/dist/m365/spo/commands/page/page-set.js +1 -1
  37. package/dist/m365/spo/commands/site/site-admin-add.js +1 -12
  38. package/dist/m365/spo/commands/site/site-set.js +2 -2
  39. package/dist/m365/spo/commands.js +1 -0
  40. package/dist/utils/entraServicePrincipal.js +21 -0
  41. package/dist/utils/md.js +3 -3
  42. package/dist/utils/spo.js +87 -3
  43. package/docs/docs/cmd/_global.mdx +1 -1
  44. package/docs/docs/cmd/planner/bucket/bucket-add.mdx +19 -0
  45. package/docs/docs/cmd/planner/bucket/bucket-get.mdx +19 -0
  46. package/docs/docs/cmd/planner/bucket/bucket-list.mdx +19 -0
  47. package/docs/docs/cmd/planner/bucket/bucket-remove.mdx +21 -0
  48. package/docs/docs/cmd/planner/bucket/bucket-set.mdx +21 -0
  49. package/docs/docs/cmd/planner/plan/plan-add.mdx +19 -0
  50. package/docs/docs/cmd/planner/plan/plan-get.mdx +19 -0
  51. package/docs/docs/cmd/planner/plan/plan-list.mdx +19 -0
  52. package/docs/docs/cmd/planner/plan/plan-remove.mdx +21 -0
  53. package/docs/docs/cmd/planner/plan/plan-set.mdx +19 -0
  54. package/docs/docs/cmd/planner/roster/roster-add.mdx +19 -0
  55. package/docs/docs/cmd/planner/roster/roster-get.mdx +19 -0
  56. package/docs/docs/cmd/planner/roster/roster-member-add.mdx +19 -0
  57. package/docs/docs/cmd/planner/roster/roster-member-get.mdx +19 -0
  58. package/docs/docs/cmd/planner/roster/roster-member-list.mdx +19 -0
  59. package/docs/docs/cmd/planner/roster/roster-member-remove.mdx +21 -0
  60. package/docs/docs/cmd/planner/roster/roster-plan-list.mdx +19 -0
  61. package/docs/docs/cmd/planner/roster/roster-remove.mdx +21 -0
  62. package/docs/docs/cmd/planner/task/task-add.mdx +19 -0
  63. package/docs/docs/cmd/planner/task/task-checklistitem-add.mdx +19 -0
  64. package/docs/docs/cmd/planner/task/task-checklistitem-list.mdx +19 -0
  65. package/docs/docs/cmd/planner/task/task-checklistitem-remove.mdx +21 -0
  66. package/docs/docs/cmd/planner/task/task-get.mdx +27 -0
  67. package/docs/docs/cmd/planner/task/task-list.mdx +19 -0
  68. package/docs/docs/cmd/planner/task/task-reference-add.mdx +19 -0
  69. package/docs/docs/cmd/planner/task/task-reference-list.mdx +19 -0
  70. package/docs/docs/cmd/planner/task/task-reference-remove.mdx +21 -0
  71. package/docs/docs/cmd/planner/task/task-remove.mdx +21 -0
  72. package/docs/docs/cmd/planner/task/task-set.mdx +19 -0
  73. package/docs/docs/cmd/planner/tenant/tenant-settings-list.mdx +44 -7
  74. package/docs/docs/cmd/planner/tenant/tenant-settings-set.mdx +43 -8
  75. package/docs/docs/cmd/spo/page/page-control-remove.mdx +56 -0
  76. package/npm-shrinkwrap.json +2322 -534
  77. package/package.json +16 -13
package/dist/cli/cli.js CHANGED
@@ -34,7 +34,7 @@ let currentCommandName;
34
34
  let optionsFromArgs;
35
35
  const defaultHelpMode = 'options';
36
36
  const defaultHelpTarget = 'console';
37
- const helpModes = ['options', 'examples', 'remarks', 'response', 'full'];
37
+ const helpModes = ['options', 'examples', 'remarks', 'permissions', 'response', 'full'];
38
38
  const helpTargets = ['console', 'web'];
39
39
  const yargsConfiguration = {
40
40
  'parse-numbers': true,
@@ -791,7 +791,7 @@ async function closeWithError(error, args, showHelpIfEnabled = false) {
791
791
  }
792
792
  let errorMessage = error instanceof CommandError ? error.message : error;
793
793
  if (error instanceof ZodError) {
794
- errorMessage = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(os.EOL);
794
+ errorMessage = error.errors.map(e => (e.path.length > 0 ? `${e.path.join('.')}: ${e.message}` : e.message)).join(os.EOL);
795
795
  }
796
796
  if ((!args.options.output || args.options.output === 'json') &&
797
797
  !cli.getSettingWithDefaultValue(settingsNames.printErrorsAsPlainText, true)) {
@@ -4,6 +4,7 @@ import { formatting } from '../../../../utils/formatting.js';
4
4
  import { odata } from '../../../../utils/odata.js';
5
5
  import AppCommand, { appCommandOptions } from '../../../base/AppCommand.js';
6
6
  import commands from '../../commands.js';
7
+ import { entraServicePrincipal } from '../../../../utils/entraServicePrincipal.js';
7
8
  const options = appCommandOptions
8
9
  .extend({
9
10
  applicationPermissions: z.string().optional(),
@@ -58,7 +59,13 @@ class AppPermissionAddCommand extends AppCommand {
58
59
  };
59
60
  await request.patch(addPermissionsRequestOptions);
60
61
  if (args.options.grantAdminConsent) {
61
- const appServicePrincipal = servicePrincipals.find(sp => sp.appId === this.appId);
62
+ let appServicePrincipal = servicePrincipals.find(sp => sp.appId === this.appId);
63
+ if (!appServicePrincipal) {
64
+ if (this.verbose) {
65
+ await logger.logToStderr(`Creating service principal for app ${this.appId}...`);
66
+ }
67
+ appServicePrincipal = await entraServicePrincipal.createServicePrincipal(this.appId);
68
+ }
62
69
  await this.grantAdminConsent(appServicePrincipal, appPermissions, logger);
63
70
  }
64
71
  }
@@ -28,6 +28,7 @@ export default class SpoCommand extends Command {
28
28
  'parentWebUrl',
29
29
  'previewImageUrl',
30
30
  'siteLogoUrl',
31
+ 'siteThumbnailUrl',
31
32
  'siteUrl',
32
33
  'StartASiteFormUrl',
33
34
  'targetUrl',
@@ -11,6 +11,7 @@ import request from "../../../../request.js";
11
11
  import { validation } from "../../../../utils/validation.js";
12
12
  import { formatting } from "../../../../utils/formatting.js";
13
13
  import { cli } from "../../../../cli/cli.js";
14
+ import { entraServicePrincipal } from "../../../../utils/entraServicePrincipal.js";
14
15
  var ScopeType;
15
16
  (function (ScopeType) {
16
17
  ScopeType["Role"] = "Role";
@@ -58,7 +59,10 @@ class EntraAppPermissionAddCommand extends GraphCommand {
58
59
  if (args.options.grantAdminConsent) {
59
60
  let appServicePrincipal = servicePrincipals.find(sp => sp.appId === appObject.appId);
60
61
  if (!appServicePrincipal) {
61
- appServicePrincipal = await this.createServicePrincipal(appObject.appId, logger);
62
+ if (this.verbose) {
63
+ await logger.logToStderr(`Creating service principal for app ${appObject.appId}...`);
64
+ }
65
+ appServicePrincipal = await entraServicePrincipal.createServicePrincipal(appObject.appId);
62
66
  }
63
67
  await this.grantAdminConsent(appServicePrincipal, appPermissions, logger);
64
68
  }
@@ -67,23 +71,6 @@ class EntraAppPermissionAddCommand extends GraphCommand {
67
71
  this.handleRejectedODataJsonPromise(err);
68
72
  }
69
73
  }
70
- async createServicePrincipal(appId, logger) {
71
- if (this.verbose) {
72
- await logger.logToStderr(`Creating service principal for app ${appId}...`);
73
- }
74
- const requestOptions = {
75
- url: `${this.resource}/v1.0/servicePrincipals`,
76
- headers: {
77
- accept: 'application/json;odata.metadata=none',
78
- 'content-type': 'application/json;odata=nometadata'
79
- },
80
- data: {
81
- appId
82
- },
83
- responseType: 'json'
84
- };
85
- return await request.post(requestOptions);
86
- }
87
74
  async getAppObject(options) {
88
75
  let appNotFoundMessage = '';
89
76
  let apps = [];
@@ -63,7 +63,7 @@ class FileCopyCommand extends GraphCommand {
63
63
  async getCopyUrl(options, sourcePath, logger) {
64
64
  const { webUrl, sourceUrl, verbose, nameConflictBehavior } = options;
65
65
  const folderUrl = new URL(sourcePath);
66
- const siteId = await spo.getSiteId(webUrl, logger, verbose);
66
+ const siteId = await spo.getSiteIdByMSGraph(webUrl, logger, verbose);
67
67
  const drive = await this.getDocumentLibrary(siteId, folderUrl, sourceUrl, logger);
68
68
  const itemId = await this.getStartingFolderId(drive, folderUrl, logger);
69
69
  const queryParameters = nameConflictBehavior && nameConflictBehavior !== 'fail'
@@ -74,7 +74,7 @@ class FileCopyCommand extends GraphCommand {
74
74
  }
75
75
  async getTargetDriveAndItemId(webUrl, targetUrl, logger, verbose) {
76
76
  const targetSiteUrl = urlUtil.getTargetSiteAbsoluteUrl(webUrl, targetUrl);
77
- const targetSiteId = await spo.getSiteId(targetSiteUrl, logger, verbose);
77
+ const targetSiteId = await spo.getSiteIdByMSGraph(targetSiteUrl, logger, verbose);
78
78
  const targetFolderUrl = new URL(this.getAbsoluteUrl(targetSiteUrl, targetUrl));
79
79
  const targetDrive = await this.getDocumentLibrary(targetSiteId, targetFolderUrl, targetUrl, logger);
80
80
  const targetDriveId = targetDrive.id;
@@ -59,7 +59,7 @@ class FileMoveCommand extends GraphCommand {
59
59
  return url.startsWith('https://') ? url : urlUtil.getAbsoluteUrl(webUrl, url);
60
60
  }
61
61
  async getDriveIdAndItemId(webUrl, folderUrl, sourceUrl, logger, verbose) {
62
- const siteId = await spo.getSiteId(webUrl, logger, verbose);
62
+ const siteId = await spo.getSiteIdByMSGraph(webUrl, logger, verbose);
63
63
  const driveDetails = await drive.getDriveByUrl(siteId, new URL(folderUrl), logger, verbose);
64
64
  const itemId = await drive.getDriveItemId(driveDetails, new URL(folderUrl), logger, verbose);
65
65
  return { driveId: driveDetails.id, itemId };
@@ -8,9 +8,6 @@ class PlannerTenantSettingsListCommand extends PlannerCommand {
8
8
  get description() {
9
9
  return 'Lists the Microsoft Planner configuration of the tenant';
10
10
  }
11
- defaultProperties() {
12
- return ['isPlannerAllowed', 'allowCalendarSharing', 'allowTenantMoveWithDataLoss', 'allowTenantMoveWithDataMigration', 'allowRosterCreation', 'allowPlannerMobilePushNotifications'];
13
- }
14
11
  async commandAction(logger) {
15
12
  const requestOptions = {
16
13
  url: `${this.resource}/taskAPI/tenantAdminSettings/Settings`,
@@ -9,7 +9,6 @@ import config from '../../../../config.js';
9
9
  import request from '../../../../request.js';
10
10
  import { formatting } from '../../../../utils/formatting.js';
11
11
  import { spo } from '../../../../utils/spo.js';
12
- import { urlUtil } from '../../../../utils/urlUtil.js';
13
12
  import { validation } from '../../../../utils/validation.js';
14
13
  import SpoCommand from '../../../base/SpoCommand.js';
15
14
  import commands from '../../commands.js';
@@ -87,72 +86,11 @@ class SpoContentTypeAddCommand extends SpoCommand {
87
86
  }
88
87
  }
89
88
  async getParentInfo(options, logger) {
90
- const siteId = await this.getSiteId(options.webUrl, logger);
91
- const webId = await this.getWebId(options.webUrl, logger);
92
- const listId = await this.getListId(options, logger);
89
+ const siteId = await spo.getSiteIdBySPApi(options.webUrl, logger, this.verbose);
90
+ const webId = await spo.getWebId(options.webUrl, logger, this.verbose);
91
+ const listId = options.listId ? options.listId : await spo.getListId(options.webUrl, options.listTitle, options.listUrl, logger, this.verbose);
93
92
  return `<Identity Id="5" Name="1a48869e-c092-0000-1f61-81ec89809537|740c6a0b-85e2-48a0-a494-e0f1759d4aa7:site:${siteId}:web:${webId}:list:${listId}" />`;
94
93
  }
95
- async getSiteId(webUrl, logger) {
96
- if (this.verbose) {
97
- await logger.logToStderr(`Retrieving site collection id...`);
98
- }
99
- const requestOptions = {
100
- url: `${webUrl}/_api/site?$select=Id`,
101
- headers: {
102
- accept: 'application/json;odata=nometadata'
103
- },
104
- responseType: 'json'
105
- };
106
- const siteResponse = await request.get(requestOptions);
107
- return siteResponse.Id;
108
- }
109
- async getWebId(webUrl, logger) {
110
- if (this.verbose) {
111
- await logger.logToStderr(`Retrieving web id...`);
112
- }
113
- const requestOptions = {
114
- url: `${webUrl}/_api/web?$select=Id`,
115
- headers: {
116
- accept: 'application/json;odata=nometadata'
117
- },
118
- responseType: 'json'
119
- };
120
- const webResponse = await request.get(requestOptions);
121
- return webResponse.Id;
122
- }
123
- async getListId(options, logger) {
124
- if (this.verbose) {
125
- await logger.logToStderr(`Retrieving list id...`);
126
- }
127
- let listId = '';
128
- if (options.listId) {
129
- return options.listId;
130
- }
131
- else if (options.listTitle) {
132
- const requestOptions = {
133
- url: `${options.webUrl}/_api/web/lists/getByTitle('${formatting.encodeQueryParameter(options.listTitle)}')?$select=Id`,
134
- headers: {
135
- accept: 'application/json;odata=nometadata'
136
- },
137
- responseType: 'json'
138
- };
139
- const listResponse = await request.get(requestOptions);
140
- listId = listResponse.Id;
141
- }
142
- else if (options.listUrl) {
143
- const listServerRelativeUrl = urlUtil.getServerRelativePath(options.webUrl, options.listUrl);
144
- const requestOptions = {
145
- url: `${options.webUrl}/_api/web/GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')?$select=Id`,
146
- headers: {
147
- accept: 'application/json;odata=nometadata'
148
- },
149
- responseType: 'json'
150
- };
151
- const listResponse = await request.get(requestOptions);
152
- listId = listResponse.Id;
153
- }
154
- return listId;
155
- }
156
94
  }
157
95
  _SpoContentTypeAddCommand_instances = new WeakSet(), _SpoContentTypeAddCommand_initTelemetry = function _SpoContentTypeAddCommand_initTelemetry() {
158
96
  this.telemetry.push((args) => {
@@ -8,7 +8,6 @@ import { cli } from '../../../../cli/cli.js';
8
8
  import request from '../../../../request.js';
9
9
  import { formatting } from '../../../../utils/formatting.js';
10
10
  import { spo } from '../../../../utils/spo.js';
11
- import { urlUtil } from '../../../../utils/urlUtil.js';
12
11
  import { validation } from '../../../../utils/validation.js';
13
12
  import SpoCommand from '../../../base/SpoCommand.js';
14
13
  import commands from '../../commands.js';
@@ -33,30 +32,12 @@ class SpoContentTypeFieldRemoveCommand extends SpoCommand {
33
32
  if (this.debug) {
34
33
  await logger.logToStderr(`Get SiteId required by ProcessQuery endpoint.`);
35
34
  }
36
- // GET SiteId
37
- let requestOptions = {
38
- url: `${args.options.webUrl}/_api/site?$select=Id`,
39
- headers: {
40
- accept: 'application/json;odata=nometadata'
41
- },
42
- responseType: 'json'
43
- };
44
- const site = await request.get(requestOptions);
45
- const siteId = site.Id;
35
+ const siteId = await spo.getSiteIdBySPApi(args.options.webUrl, logger, this.verbose);
46
36
  if (this.debug) {
47
37
  await logger.logToStderr(`SiteId: ${siteId}`);
48
38
  await logger.logToStderr(`Get WebId required by ProcessQuery endpoint.`);
49
39
  }
50
- // GET WebId
51
- requestOptions = {
52
- url: `${args.options.webUrl}/_api/web?$select=Id`,
53
- headers: {
54
- accept: 'application/json;odata=nometadata'
55
- },
56
- responseType: 'json'
57
- };
58
- const web = await request.get(requestOptions);
59
- const webId = web.Id;
40
+ const webId = await spo.getWebId(args.options.webUrl, logger, this.verbose);
60
41
  if (this.debug) {
61
42
  await logger.logToStderr(`WebId: ${webId}`);
62
43
  }
@@ -64,11 +45,8 @@ class SpoContentTypeFieldRemoveCommand extends SpoCommand {
64
45
  if (args.options.listId) {
65
46
  listId = args.options.listId;
66
47
  }
67
- else if (args.options.listTitle) {
68
- listId = await this.getListIdFromListTitle(args.options.webUrl, args.options.listTitle);
69
- }
70
- else if (args.options.listUrl) {
71
- listId = await this.getListIdFromListUrl(args.options.webUrl, args.options.listUrl);
48
+ if (args.options.listTitle || args.options.listUrl) {
49
+ listId = await spo.getListId(args.options.webUrl, args.options.listTitle, args.options.listUrl, logger, this.verbose);
72
50
  }
73
51
  if (this.debug) {
74
52
  await logger.logToStderr(`ListId: ${listId}`);
@@ -88,7 +66,7 @@ class SpoContentTypeFieldRemoveCommand extends SpoCommand {
88
66
  else {
89
67
  requestBody = `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName=".NET Library" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="77" ObjectPathId="76" /><ObjectPath Id="79" ObjectPathId="78" /><Method Name="DeleteObject" Id="80" ObjectPathId="78" /><Method Name="Update" Id="81" ObjectPathId="24"><Parameters><Parameter Type="Boolean">${updateChildContentTypes}</Parameter></Parameters></Method></Actions><ObjectPaths><Property Id="76" ParentId="24" Name="FieldLinks" /><Method Id="78" ParentId="76" Name="GetById"><Parameters><Parameter Type="Guid">{${formatting.escapeXml(args.options.id)}}</Parameter></Parameters></Method><Identity Id="24" Name="6b3ec69e-00a7-0000-55a3-61f8d779d2b3|740c6a0b-85e2-48a0-a494-e0f1759d4aa7:site:${siteId}:web:${webId}:contenttype:${formatting.escapeXml(args.options.contentTypeId)}" /></ObjectPaths></Request>`;
90
68
  }
91
- requestOptions = {
69
+ const requestOptions = {
92
70
  url: `${args.options.webUrl}/_vti_bin/client.svc/ProcessQuery`,
93
71
  headers: {
94
72
  'X-RequestDigest': requestDigest
@@ -116,29 +94,6 @@ class SpoContentTypeFieldRemoveCommand extends SpoCommand {
116
94
  }
117
95
  }
118
96
  }
119
- async getListIdFromListTitle(webUrl, listTitle) {
120
- const requestOptions = {
121
- url: `${webUrl}/_api/lists/GetByTitle('${formatting.encodeQueryParameter(listTitle)}')?$select=Id`,
122
- headers: {
123
- accept: 'application/json;odata=nometadata'
124
- },
125
- responseType: 'json'
126
- };
127
- const list = await request.get(requestOptions);
128
- return list.Id;
129
- }
130
- async getListIdFromListUrl(webUrl, listUrl) {
131
- const listServerRelativeUrl = urlUtil.getServerRelativePath(webUrl, listUrl);
132
- const requestOptions = {
133
- url: `${webUrl}/_api/web/GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')?$select=Id`,
134
- headers: {
135
- accept: 'application/json;odata=nometadata'
136
- },
137
- responseType: 'json'
138
- };
139
- const list = await request.get(requestOptions);
140
- return list.Id;
141
- }
142
97
  }
143
98
  _SpoContentTypeFieldRemoveCommand_instances = new WeakSet(), _SpoContentTypeFieldRemoveCommand_initTelemetry = function _SpoContentTypeFieldRemoveCommand_initTelemetry() {
144
99
  this.telemetry.push((args) => {
@@ -102,32 +102,10 @@ class SpoContentTypeFieldSetCommand extends SpoCommand {
102
102
  throw 'DONE';
103
103
  }
104
104
  if (!this.siteId) {
105
- if (this.verbose) {
106
- await logger.logToStderr(`Retrieving site collection id...`);
107
- }
108
- requestOptions = {
109
- url: `${args.options.webUrl}/_api/site?$select=Id`,
110
- headers: {
111
- accept: 'application/json;odata=nometadata'
112
- },
113
- responseType: 'json'
114
- };
115
- const site = await request.get(requestOptions);
116
- this.siteId = site.Id;
105
+ this.siteId = await spo.getSiteIdBySPApi(args.options.webUrl, logger, this.verbose);
117
106
  }
118
107
  if (!this.webId) {
119
- if (this.verbose) {
120
- await logger.logToStderr(`Retrieving site id...`);
121
- }
122
- requestOptions = {
123
- url: `${args.options.webUrl}/_api/web?$select=Id`,
124
- headers: {
125
- accept: 'application/json;odata=nometadata'
126
- },
127
- responseType: 'json'
128
- };
129
- const web = await request.get(requestOptions);
130
- this.webId = web.Id;
108
+ this.webId = await spo.getWebId(args.options.webUrl, logger, this.verbose);
131
109
  }
132
110
  if (this.verbose) {
133
111
  await logger.logToStderr(`Updating field link...`);
@@ -172,30 +150,8 @@ class SpoContentTypeFieldSetCommand extends SpoCommand {
172
150
  }
173
151
  }
174
152
  await this.updateField(xField, requiresUpdate, logger, args);
175
- if (this.verbose) {
176
- await logger.logToStderr(`Retrieving site collection id...`);
177
- }
178
- const requestOptionsSiteId = {
179
- url: `${args.options.webUrl}/_api/site?$select=Id`,
180
- headers: {
181
- accept: 'application/json;odata=nometadata'
182
- },
183
- responseType: 'json'
184
- };
185
- const resSiteId = await request.get(requestOptionsSiteId);
186
- this.siteId = resSiteId.Id;
187
- if (this.verbose) {
188
- await logger.logToStderr(`Retrieving site id...`);
189
- }
190
- const requestOptionsWebId = {
191
- url: `${args.options.webUrl}/_api/web?$select=Id`,
192
- headers: {
193
- accept: 'application/json;odata=nometadata'
194
- },
195
- responseType: 'json'
196
- };
197
- const resWebId = await request.get(requestOptionsWebId);
198
- this.webId = resWebId.Id;
153
+ this.siteId = await spo.getSiteIdBySPApi(args.options.webUrl, logger, this.verbose);
154
+ this.webId = await spo.getWebId(args.options.webUrl, logger, this.verbose);
199
155
  await this.ensureRequestDigest(args.options.webUrl, logger);
200
156
  const requestOptions = {
201
157
  url: `${args.options.webUrl}/_vti_bin/client.svc/ProcessQuery`,
@@ -7,6 +7,7 @@ var _SpoContentTypeSetCommand_instances, _SpoContentTypeSetCommand_initTelemetry
7
7
  import config from '../../../../config.js';
8
8
  import request from '../../../../request.js';
9
9
  import { formatting } from '../../../../utils/formatting.js';
10
+ import { spo } from '../../../../utils/spo.js';
10
11
  import { urlUtil } from '../../../../utils/urlUtil.js';
11
12
  import { validation } from '../../../../utils/validation.js';
12
13
  import SpoCommand from '../../../base/SpoCommand.js';
@@ -33,8 +34,8 @@ class SpoContentTypeSetCommand extends SpoCommand {
33
34
  async commandAction(logger, args) {
34
35
  try {
35
36
  const contentTypeId = await this.getContentTypeId(logger, args.options);
36
- const siteId = await this.getSiteId(logger, args.options.webUrl);
37
- const webId = await this.getWebId(logger, args.options.webUrl);
37
+ const siteId = await spo.getSiteIdBySPApi(args.options.webUrl, logger, this.verbose);
38
+ const webId = await spo.getWebId(args.options.webUrl, logger, this.verbose);
38
39
  await this.updateContentType(logger, siteId, webId, contentTypeId, args.options);
39
40
  }
40
41
  catch (err) {
@@ -80,7 +81,7 @@ class SpoContentTypeSetCommand extends SpoCommand {
80
81
  headers: {
81
82
  'Content-Type': 'text/xml'
82
83
  },
83
- data: await this.getCsomCallXmlBody(options, siteId, webId, contentTypeId)
84
+ data: await this.getCsomCallXmlBody(options, siteId, webId, contentTypeId, logger)
84
85
  };
85
86
  const res = await request.post(requestOptions);
86
87
  const json = JSON.parse(res);
@@ -89,9 +90,9 @@ class SpoContentTypeSetCommand extends SpoCommand {
89
90
  throw response.ErrorInfo.ErrorMessage;
90
91
  }
91
92
  }
92
- async getCsomCallXmlBody(options, siteId, webId, contentTypeId) {
93
+ async getCsomCallXmlBody(options, siteId, webId, contentTypeId, logger) {
93
94
  const payload = this.getRequestPayload(options);
94
- const list = await this.getListId(options);
95
+ const list = await this.getListId(options, logger);
95
96
  return `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions>${payload}</Actions><ObjectPaths><Identity Id="9" Name="fc4179a0-e0d7-5000-c38b-bc3506fbab6f|740c6a0b-85e2-48a0-a494-e0f1759d4aa7:site:${siteId}:web:${webId}${list}:contenttype:${formatting.escapeXml(contentTypeId)}" /></ObjectPaths></Request>`;
96
97
  }
97
98
  getRequestPayload(options) {
@@ -122,35 +123,7 @@ class SpoContentTypeSetCommand extends SpoCommand {
122
123
  }
123
124
  return payload.join('');
124
125
  }
125
- async getSiteId(logger, webUrl) {
126
- if (this.verbose) {
127
- await logger.logToStderr(`Retrieving site collection id...`);
128
- }
129
- const requestOptions = {
130
- url: `${webUrl}/_api/site?$select=Id`,
131
- headers: {
132
- accept: 'application/json;odata=nometadata'
133
- },
134
- responseType: 'json'
135
- };
136
- const site = await request.get(requestOptions);
137
- return site.Id;
138
- }
139
- async getWebId(logger, webUrl) {
140
- if (this.verbose) {
141
- await logger.logToStderr(`Retrieving web id...`);
142
- }
143
- const requestOptions = {
144
- url: `${webUrl}/_api/web?$select=Id`,
145
- headers: {
146
- accept: 'application/json;odata=nometadata'
147
- },
148
- responseType: 'json'
149
- };
150
- const web = await request.get(requestOptions);
151
- return web.Id;
152
- }
153
- async getListId(options) {
126
+ async getListId(options, logger) {
154
127
  if (!options.listId && !options.listTitle && !options.listUrl) {
155
128
  return '';
156
129
  }
@@ -158,30 +131,7 @@ class SpoContentTypeSetCommand extends SpoCommand {
158
131
  if (options.listId) {
159
132
  return baseString += options.listId;
160
133
  }
161
- else if (options.listTitle) {
162
- const requestOptions = {
163
- url: `${options.webUrl}/_api/web/lists/getByTitle('${formatting.encodeQueryParameter(options.listTitle)}')?$select=Id`,
164
- headers: {
165
- accept: 'application/json;odata=nometadata'
166
- },
167
- responseType: 'json'
168
- };
169
- const listResponse = await request.get(requestOptions);
170
- baseString += listResponse.Id;
171
- }
172
- else if (options.listUrl) {
173
- const listServerRelativeUrl = urlUtil.getServerRelativePath(options.webUrl, options.listUrl);
174
- const requestOptions = {
175
- url: `${options.webUrl}/_api/web/GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')?$select=Id`,
176
- headers: {
177
- accept: 'application/json;odata=nometadata'
178
- },
179
- responseType: 'json'
180
- };
181
- const listResponse = await request.get(requestOptions);
182
- baseString += listResponse.Id;
183
- }
184
- return baseString;
134
+ return baseString += await spo.getListId(options.webUrl, options.listTitle, options.listUrl, logger, this.verbose);
185
135
  }
186
136
  }
187
137
  _SpoContentTypeSetCommand_instances = new WeakSet(), _SpoContentTypeSetCommand_initTelemetry = function _SpoContentTypeSetCommand_initTelemetry() {
@@ -33,7 +33,7 @@ class SpoContentTypeSyncCommand extends SpoCommand {
33
33
  const url = new URL(webUrl);
34
34
  const baseUrl = 'https://graph.microsoft.com/v1.0/sites/';
35
35
  try {
36
- const siteUrl = url.pathname === '/' ? url.host : await spo.getSiteId(webUrl, logger, this.verbose);
36
+ const siteUrl = url.pathname === '/' ? url.host : await spo.getSiteIdByMSGraph(webUrl, logger, this.verbose);
37
37
  const listPath = listId || listTitle || listUrl ? `/lists/${listId || listTitle || await this.getListIdByUrl(webUrl, listUrl, logger)}` : '';
38
38
  const contentTypeId = await this.getContentTypeId(baseUrl, url, args.options, logger);
39
39
  if (this.verbose) {
@@ -64,7 +64,7 @@ class SpoContentTypeSyncCommand extends SpoCommand {
64
64
  if (options.id) {
65
65
  return options.id;
66
66
  }
67
- const siteId = await spo.getSiteId(`${url.origin}/sites/contenttypehub`, logger, this.verbose);
67
+ const siteId = await spo.getSiteIdByMSGraph(`${url.origin}/sites/contenttypehub`, logger, this.verbose);
68
68
  if (this.verbose) {
69
69
  await logger.logToStderr(`Retrieving content type Id by name...`);
70
70
  }
@@ -38,7 +38,7 @@ class SpoFolderSharingLinkAddCommand extends SpoCommand {
38
38
  const relFolderUrl = await spo.getFolderServerRelativeUrl(args.options.webUrl, args.options.folderUrl, args.options.folderId, logger, args.options.verbose);
39
39
  const absoluteFolderUrl = urlUtil.getAbsoluteUrl(args.options.webUrl, relFolderUrl);
40
40
  const folderUrl = new URL(absoluteFolderUrl);
41
- const siteId = await spo.getSiteId(args.options.webUrl);
41
+ const siteId = await spo.getSiteIdByMSGraph(args.options.webUrl);
42
42
  const driveDetails = await drive.getDriveByUrl(siteId, folderUrl, logger, args.options.verbose);
43
43
  const itemId = await drive.getDriveItemId(driveDetails, folderUrl, logger, args.options.verbose);
44
44
  const requestOptions = {
@@ -39,7 +39,7 @@ class SpoFolderSharingLinkClearCommand extends SpoCommand {
39
39
  const relFolderUrl = await spo.getFolderServerRelativeUrl(args.options.webUrl, args.options.folderUrl, args.options.folderId, logger, args.options.verbose);
40
40
  const absoluteFolderUrl = urlUtil.getAbsoluteUrl(args.options.webUrl, relFolderUrl);
41
41
  const folderUrl = new URL(absoluteFolderUrl);
42
- const siteId = await spo.getSiteId(args.options.webUrl);
42
+ const siteId = await spo.getSiteIdByMSGraph(args.options.webUrl);
43
43
  const driveDetails = await drive.getDriveByUrl(siteId, folderUrl, logger, args.options.verbose);
44
44
  const itemId = await drive.getDriveItemId(driveDetails, folderUrl, logger, args.options.verbose);
45
45
  let requestUrl = `https://graph.microsoft.com/v1.0/drives/${driveDetails.id}/items/${itemId}/permissions?$filter=Link ne null`;
@@ -35,7 +35,7 @@ class SpoFolderSharingLinkGetCommand extends SpoCommand {
35
35
  const relFolderUrl = await spo.getFolderServerRelativeUrl(args.options.webUrl, args.options.folderUrl, args.options.folderId);
36
36
  const absoluteFolderUrl = urlUtil.getAbsoluteUrl(args.options.webUrl, relFolderUrl);
37
37
  const folderUrl = new URL(absoluteFolderUrl);
38
- const siteId = await spo.getSiteId(args.options.webUrl);
38
+ const siteId = await spo.getSiteIdByMSGraph(args.options.webUrl);
39
39
  const drive = await driveItem.getDriveByUrl(siteId, folderUrl);
40
40
  const itemId = await driveItem.getDriveItemId(drive, folderUrl);
41
41
  const requestUrl = `https://graph.microsoft.com/v1.0/drives/${drive.id}/items/${itemId}/permissions/${args.options.id}`;
@@ -40,7 +40,7 @@ class SpoFolderSharingLinkListCommand extends SpoCommand {
40
40
  const relFolderUrl = await spo.getFolderServerRelativeUrl(args.options.webUrl, args.options.folderUrl, args.options.folderId, logger, args.options.verbose);
41
41
  const absoluteFolderUrl = urlUtil.getAbsoluteUrl(args.options.webUrl, relFolderUrl);
42
42
  const folderUrl = new URL(absoluteFolderUrl);
43
- const siteId = await spo.getSiteId(args.options.webUrl);
43
+ const siteId = await spo.getSiteIdByMSGraph(args.options.webUrl);
44
44
  const driveDetails = await drive.getDriveByUrl(siteId, folderUrl, logger, args.options.verbose);
45
45
  const itemId = await drive.getDriveItemId(driveDetails, folderUrl, logger, args.options.verbose);
46
46
  let requestUrl = `https://graph.microsoft.com/v1.0/drives/${driveDetails.id}/items/${itemId}/permissions?$filter=Link ne null`;
@@ -37,7 +37,7 @@ class SpoFolderSharingLinkRemoveCommand extends SpoCommand {
37
37
  const relFolderUrl = await spo.getFolderServerRelativeUrl(args.options.webUrl, args.options.folderUrl, args.options.folderId, logger, args.options.verbose);
38
38
  const absoluteFolderUrl = urlUtil.getAbsoluteUrl(args.options.webUrl, relFolderUrl);
39
39
  const folderUrl = new URL(absoluteFolderUrl);
40
- const siteId = await spo.getSiteId(args.options.webUrl);
40
+ const siteId = await spo.getSiteIdByMSGraph(args.options.webUrl);
41
41
  const driveDetails = await drive.getDriveByUrl(siteId, folderUrl, logger, args.options.verbose);
42
42
  const itemId = await drive.getDriveItemId(driveDetails, folderUrl, logger, args.options.verbose);
43
43
  const requestOptions = {
@@ -35,7 +35,7 @@ class SpoFolderSharingLinkSetCommand extends SpoCommand {
35
35
  const relFolderUrl = await spo.getFolderServerRelativeUrl(args.options.webUrl, args.options.folderUrl, args.options.folderId, logger, args.options.verbose);
36
36
  const absoluteFolderUrl = urlUtil.getAbsoluteUrl(args.options.webUrl, relFolderUrl);
37
37
  const folderUrl = new URL(absoluteFolderUrl);
38
- const siteId = await spo.getSiteId(args.options.webUrl);
38
+ const siteId = await spo.getSiteIdByMSGraph(args.options.webUrl);
39
39
  const driveDetails = await drive.getDriveByUrl(siteId, folderUrl, logger, args.options.verbose);
40
40
  const itemId = await drive.getDriveItemId(driveDetails, folderUrl, logger, args.options.verbose);
41
41
  const requestOptions = {
@@ -10,7 +10,6 @@ import request from '../../../../request.js';
10
10
  import { formatting } from '../../../../utils/formatting.js';
11
11
  import { odata } from '../../../../utils/odata.js';
12
12
  import { spo } from '../../../../utils/spo.js';
13
- import { urlUtil } from '../../../../utils/urlUtil.js';
14
13
  import { validation } from '../../../../utils/validation.js';
15
14
  import SpoCommand from '../../../base/SpoCommand.js';
16
15
  import commands from '../../commands.js';
@@ -41,7 +40,9 @@ class SpoListItemBatchSetCommand extends SpoCommand {
41
40
  if (!jsonContent[0].hasOwnProperty(idColumn)) {
42
41
  throw `The specified value for idColumn does not exist in the array. Specified idColumn is '${args.options.idColumn || 'ID'}'. Please specify the correct value.`;
43
42
  }
44
- const listId = await this.getListId(args.options, logger);
43
+ const listId = args.options.listId ?
44
+ args.options.listId :
45
+ await spo.getListId(args.options.webUrl, args.options.listTitle, args.options.listUrl, logger, this.verbose);
45
46
  const fields = await this.getListFields(args.options, listId, jsonContent, idColumn, logger);
46
47
  const userFields = fields.filter(field => field.TypeAsString === 'UserMulti' || field.TypeAsString === 'User');
47
48
  const resolvedUsers = await this.getUsersFromCsv(args.options.webUrl, jsonContent, userFields);
@@ -151,31 +152,6 @@ class SpoListItemBatchSetCommand extends SpoCommand {
151
152
  }
152
153
  return fields;
153
154
  }
154
- async getListId(options, logger) {
155
- if (options.listId) {
156
- return options.listId;
157
- }
158
- if (this.verbose) {
159
- await logger.logToStderr('Retrieving list id');
160
- }
161
- let listUrl = `${options.webUrl}/_api/web`;
162
- if (options.listTitle) {
163
- listUrl += `/lists/getByTitle('${formatting.encodeQueryParameter(options.listTitle)}')`;
164
- }
165
- else {
166
- const listServerRelativeUrl = urlUtil.getServerRelativePath(options.webUrl, options.listUrl);
167
- listUrl += `/GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')`;
168
- }
169
- const requestOptions = {
170
- url: `${listUrl}?$select=Id`,
171
- headers: {
172
- 'accept': 'application/json;odata=nometadata'
173
- },
174
- responseType: 'json'
175
- };
176
- const listResult = await request.get(requestOptions);
177
- return listResult.Id;
178
- }
179
155
  async getUsersFromCsv(webUrl, jsonContent, userFields) {
180
156
  if (userFields.length === 0) {
181
157
  return [];