@pnp/cli-microsoft365 11.1.0-beta.a3369ef → 11.1.0-beta.dce6352

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 (102) hide show
  1. package/.devproxy/api-specs/sharepoint.yaml +23 -0
  2. package/allCommands.json +1 -1
  3. package/allCommandsFull.json +1 -1
  4. package/dist/Auth.js +10 -7
  5. package/dist/Command.js +2 -2
  6. package/dist/auth/msalCachePlugin.js +6 -2
  7. package/dist/autocomplete.js +6 -2
  8. package/dist/chili/chili.js +2 -1
  9. package/dist/cli/cli.js +4 -2
  10. package/dist/config.js +0 -1
  11. package/dist/m365/adaptivecard/commands/adaptivecard-send.js +2 -2
  12. package/dist/m365/app/commands/permission/permission-list.js +4 -2
  13. package/dist/m365/booking/commands/business/business-list.js +5 -0
  14. package/dist/m365/commands/setup.js +6 -3
  15. package/dist/m365/commands/status.js +5 -1
  16. package/dist/m365/connection/commands/connection-list.js +5 -1
  17. package/dist/m365/entra/commands/app/app-role-add.js +1 -1
  18. package/dist/m365/entra/commands/group/group-add.js +1 -1
  19. package/dist/m365/entra/commands/group/group-set.js +1 -1
  20. package/dist/m365/entra/commands/m365group/m365group-add.js +0 -1
  21. package/dist/m365/file/commands/convert/convert-pdf.js +1 -6
  22. package/dist/m365/flow/commands/flow-export.js +8 -5
  23. package/dist/m365/flow/commands/run/run-get.js +3 -3
  24. package/dist/m365/graph/commands/schemaextension/schemaextension-set.js +1 -1
  25. package/dist/m365/onedrive/commands/onedrive-list.js +5 -0
  26. package/dist/m365/outlook/commands/roomlist/roomlist-list.js +5 -0
  27. package/dist/m365/pa/commands/app/app-export.js +1 -1
  28. package/dist/m365/pa/commands/app/app-get.js +1 -1
  29. package/dist/m365/pa/commands/environment/environment-list.js +5 -0
  30. package/dist/m365/planner/commands/tenant/tenant-settings-list.js +5 -0
  31. package/dist/m365/pp/commands/solution/solution-publisher-get.js +1 -1
  32. package/dist/m365/purview/commands/retentionevent/retentionevent-list.js +5 -0
  33. package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-list.js +5 -0
  34. package/dist/m365/purview/commands/retentionlabel/retentionlabel-list.js +5 -0
  35. package/dist/m365/spfx/commands/package/package-generate.js +3 -1
  36. package/dist/m365/spfx/commands/project/base-project-command.js +13 -5
  37. package/dist/m365/spfx/commands/project/project-doctor/rules/FN021007_PKG_only_one_rush_stack_compiler_installed.js +1 -1
  38. package/dist/m365/spfx/commands/project/project-externalize/rules/PnPJsRule.js +6 -4
  39. package/dist/m365/spfx/commands/project/project-model/ScssFile.js +3 -1
  40. package/dist/m365/spfx/commands/project/project-model/TsFile.js +6 -2
  41. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.15.2.js +1 -1
  42. package/dist/m365/spfx/commands/spfx-doctor.js +5 -5
  43. package/dist/m365/spo/commands/file/file-add.js +4 -2
  44. package/dist/m365/spo/commands/file/file-rename.js +3 -4
  45. package/dist/m365/spo/commands/hubsite/hubsite-list.js +1 -1
  46. package/dist/m365/spo/commands/listitem/listitem-attachment-add.js +1 -1
  47. package/dist/m365/spo/commands/listitem/listitem-batch-set.js +9 -5
  48. package/dist/m365/spo/commands/page/clientsidepages.js +12 -12
  49. package/dist/m365/spo/commands/page/page-add.js +4 -2
  50. package/dist/m365/spo/commands/page/page-clientsidewebpart-add.js +1 -0
  51. package/dist/m365/spo/commands/page/page-set.js +4 -2
  52. package/dist/m365/spo/commands/page/page-text-add.js +1 -0
  53. package/dist/m365/spo/commands/propertybag/propertybag-base.js +34 -54
  54. package/dist/m365/spo/commands/site/site-alert-list.js +107 -0
  55. package/dist/m365/spo/commands/theme/theme-apply.js +1 -1
  56. package/dist/m365/spo/commands/web/web-reindex.js +17 -27
  57. package/dist/m365/spo/commands.js +1 -0
  58. package/dist/m365/teams/commands/tab/tab-add.js +9 -3
  59. package/dist/m365/viva/commands/connections/connections-app-create.js +1 -1
  60. package/dist/m365/viva/commands/engage/engage-community-user-add.js +1 -1
  61. package/dist/m365/viva/commands/engage/engage-community-user-remove.js +1 -1
  62. package/dist/telemetry.js +3 -1
  63. package/dist/utils/accessToken.js +4 -0
  64. package/dist/utils/cache.js +3 -2
  65. package/dist/utils/customAppScope.js +1 -1
  66. package/dist/utils/directoryExtension.js +1 -1
  67. package/dist/utils/entraAdministrativeUnit.js +1 -1
  68. package/dist/utils/entraApp.js +2 -2
  69. package/dist/utils/entraDevice.js +1 -1
  70. package/dist/utils/entraServicePrincipal.js +2 -2
  71. package/dist/utils/formatting.js +1 -1
  72. package/dist/utils/md.js +2 -2
  73. package/dist/utils/odata.js +2 -0
  74. package/dist/utils/planner.js +1 -1
  75. package/dist/utils/powerPlatform.js +2 -2
  76. package/dist/utils/roleDefinition.js +2 -2
  77. package/dist/utils/spo.js +10 -11
  78. package/dist/utils/urlUtil.js +1 -1
  79. package/dist/utils/validation.js +1 -1
  80. package/dist/utils/vivaEngage.js +3 -3
  81. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-add.mdx +14 -0
  82. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-get.mdx +15 -0
  83. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-list.mdx +14 -0
  84. package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-remove.mdx +14 -0
  85. package/docs/docs/cmd/entra/groupsetting/groupsetting-add.mdx +19 -0
  86. package/docs/docs/cmd/entra/groupsetting/groupsetting-get.mdx +19 -0
  87. package/docs/docs/cmd/entra/groupsetting/groupsetting-list.mdx +19 -0
  88. package/docs/docs/cmd/entra/groupsetting/groupsetting-remove.mdx +21 -0
  89. package/docs/docs/cmd/entra/groupsetting/groupsetting-set.mdx +21 -0
  90. package/docs/docs/cmd/entra/m365group/m365group-add.mdx +19 -0
  91. package/docs/docs/cmd/entra/m365group/m365group-get.mdx +19 -0
  92. package/docs/docs/cmd/entra/m365group/m365group-list.mdx +19 -0
  93. package/docs/docs/cmd/entra/m365group/m365group-remove.mdx +21 -0
  94. package/docs/docs/cmd/entra/m365group/m365group-renew.mdx +21 -0
  95. package/docs/docs/cmd/entra/m365group/m365group-set.mdx +21 -0
  96. package/docs/docs/cmd/entra/m365group/m365group-teamify.mdx +19 -0
  97. package/docs/docs/cmd/spo/site/site-alert-list.mdx +187 -0
  98. package/eslint-rules/lib/rules/correct-command-class-name.js +18 -2
  99. package/eslint.config.mjs +270 -0
  100. package/npm-shrinkwrap.json +1117 -2277
  101. package/package.json +22 -21
  102. package/.eslintrc.cjs +0 -289
@@ -21,7 +21,9 @@ export class BaseProjectCommand extends AnonymousCommand {
21
21
  source: fs.readFileSync(gitignorePath, 'utf-8')
22
22
  };
23
23
  }
24
- catch { }
24
+ catch {
25
+ // Do nothing
26
+ }
25
27
  }
26
28
  const npmignorePath = path.join(projectRootPath, '.npmignore');
27
29
  if (fs.existsSync(npmignorePath)) {
@@ -30,7 +32,9 @@ export class BaseProjectCommand extends AnonymousCommand {
30
32
  source: fs.readFileSync(npmignorePath, 'utf-8')
31
33
  };
32
34
  }
33
- catch { }
35
+ catch {
36
+ // Do nothing
37
+ }
34
38
  }
35
39
  this.readAndParseJsonFile(path.join(projectRootPath, 'config', 'config.json'), project, 'configJson');
36
40
  this.readAndParseJsonFile(path.join(projectRootPath, 'config', 'copy-assets.json'), project, 'copyAssetsJson');
@@ -108,7 +112,9 @@ export class BaseProjectCommand extends AnonymousCommand {
108
112
  }
109
113
  }
110
114
  }
111
- catch { }
115
+ catch {
116
+ // Do nothing
117
+ }
112
118
  }
113
119
  const packageJsonPath = path.resolve(this.projectRootPath, 'package.json');
114
120
  try {
@@ -117,10 +123,12 @@ export class BaseProjectCommand extends AnonymousCommand {
117
123
  packageJson.dependencies &&
118
124
  packageJson.dependencies['@microsoft/sp-core-library']) {
119
125
  const coreLibVersion = packageJson.dependencies['@microsoft/sp-core-library'];
120
- return coreLibVersion.replace(/[^0-9\.]/g, '');
126
+ return coreLibVersion.replace(/[^0-9.]/g, '');
121
127
  }
122
128
  }
123
- catch { }
129
+ catch {
130
+ // Do nothing
131
+ }
124
132
  return undefined;
125
133
  }
126
134
  readAndParseJsonFile(filePath, project, keyPath) {
@@ -54,7 +54,7 @@ export class FN021007_PKG_only_one_rush_stack_compiler_installed extends JsonRul
54
54
  if (!tsConfigExtends) {
55
55
  return;
56
56
  }
57
- const match = /@microsoft\/rush-stack-compiler[^\/]+/.exec(tsConfigExtends);
57
+ const match = /@microsoft\/rush-stack-compiler[^/]+/.exec(tsConfigExtends);
58
58
  if (!match) {
59
59
  return;
60
60
  }
@@ -64,7 +64,7 @@ export class PnPJsRule extends BasicDependencyRule {
64
64
  fileEdits.push(...files.map(x => ({
65
65
  action: "add",
66
66
  path: x,
67
- targetValue: 'require(\"tslib\");'
67
+ targetValue: 'require("tslib");'
68
68
  })));
69
69
  }
70
70
  return { entries: findings, suggestions: fileEdits };
@@ -82,9 +82,11 @@ export class PnPJsRule extends BasicDependencyRule {
82
82
  ...moduleConfiguration,
83
83
  path: `https://unpkg.com/${moduleConfiguration.key}@${version}/dist/${moduleName.replace('@pnp/', '')}.es5.umd${moduleName === '@pnp/common' || moduleName === ' @pnp/pnpjs' ? '.bundle' : ''}.min.js`
84
84
  });
85
- moduleConfiguration.globalDependencies && moduleConfiguration.globalDependencies.forEach(dependency => {
86
- result.push(...this.getModuleAndParents(project, `@${dependency.replace('/', '.')}`));
87
- });
85
+ if (moduleConfiguration.globalDependencies) {
86
+ moduleConfiguration.globalDependencies.forEach(dependency => {
87
+ result.push(...this.getModuleAndParents(project, `@${dependency.replace('/', '.')}`));
88
+ });
89
+ }
88
90
  }
89
91
  }
90
92
  return result;
@@ -5,7 +5,9 @@ export class ScssFile {
5
5
  try {
6
6
  this._source = fs.readFileSync(this.path, 'utf-8');
7
7
  }
8
- catch { }
8
+ catch {
9
+ // Do nothing
10
+ }
9
11
  }
10
12
  return this._source;
11
13
  }
@@ -11,7 +11,9 @@ export class TsFile {
11
11
  try {
12
12
  this._sourceFile = tsUtil.createSourceFile(path.basename(this.path), this.source, ts.ScriptTarget.Latest, true);
13
13
  }
14
- catch { }
14
+ catch {
15
+ // Do nothing
16
+ }
15
17
  }
16
18
  return this._sourceFile;
17
19
  }
@@ -29,7 +31,9 @@ export class TsFile {
29
31
  try {
30
32
  this._source = fs.readFileSync(this.path, 'utf-8');
31
33
  }
32
- catch { }
34
+ catch {
35
+ // Do nothing
36
+ }
33
37
  }
34
38
  return this._source;
35
39
  }
@@ -352,7 +352,7 @@ export default [
352
352
  // STANDARDIZED BY: eslint\\conf\\eslint-recommended.js
353
353
  'no-with': 2,
354
354
  // RATIONALE: Makes logic easier to understand, since constants always have a known value
355
- // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js
355
+ // @typescript-eslint\\eslint-plugin\\dist\\configs\\eslint-recommended.js
356
356
  'prefer-const': 1,
357
357
  // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused.
358
358
  'promise/param-names': 2,
@@ -946,12 +946,12 @@ class SpfxDoctorCommand extends BaseProjectCommand {
946
946
  }
947
947
  }
948
948
  }
949
- getPackageVersionFromNpm(args) {
950
- return new Promise(async (resolve, reject) => {
949
+ async getPackageVersionFromNpm(args) {
950
+ if (this.debug) {
951
+ await this.logger.logToStderr(`Executing npm: ${args.join(' ')}...`);
952
+ }
953
+ return new Promise((resolve, reject) => {
951
954
  const packageName = args[1];
952
- if (this.debug) {
953
- await this.logger.logToStderr(`Executing npm: ${args.join(' ')}...`);
954
- }
955
955
  child_process.exec(`npm ${args.join(' ')}`, (err, stdout) => {
956
956
  if (err) {
957
957
  reject(err.message);
@@ -60,7 +60,7 @@ class SpoFileAddCommand extends SpoCommand {
60
60
  };
61
61
  await request.get(requestOptions);
62
62
  }
63
- catch (err) {
63
+ catch {
64
64
  // folder does not exist so will attempt to create the folder tree
65
65
  await spo.ensureFolder(args.options.webUrl, folderPath, logger, this.verbose);
66
66
  }
@@ -325,7 +325,9 @@ class SpoFileAddCommand extends SpoCommand {
325
325
  fs.closeSync(fd);
326
326
  /* c8 ignore next */
327
327
  }
328
- catch { }
328
+ catch {
329
+ // Do nothing
330
+ }
329
331
  }
330
332
  if (--info.RetriesLeft > 0) {
331
333
  if (this.verbose) {
@@ -81,11 +81,10 @@ class SpoFileRenameCommand extends SpoCommand {
81
81
  await cli.executeCommand(removeCommand, { options: { ...removeOptions, _: [] } });
82
82
  }
83
83
  catch (err) {
84
- if (err.error !== undefined && err.error.message !== undefined && err.error.message.includes('does not exist')) {
85
- }
86
- else {
87
- throw err;
84
+ if (err?.error?.message?.includes('does not exist')) {
85
+ return;
88
86
  }
87
+ throw err;
89
88
  }
90
89
  }
91
90
  }
@@ -86,7 +86,7 @@ class SpoHubSiteListCommand extends SpoCommand {
86
86
  await logger.logToStderr(res);
87
87
  await logger.logToStderr(`Retrieved ${res.Row.length} sites in batch ${batchNumber}`);
88
88
  }
89
- if (!!res.NextHref) {
89
+ if (res.NextHref) {
90
90
  reqOptions.url = nonPagedUrl + res.NextHref;
91
91
  if (this.debug) {
92
92
  await logger.logToStderr(`Url for next batch of sites: ${reqOptions.url}`);
@@ -57,7 +57,7 @@ class SpoListItemAttachmentAddCommand extends SpoCommand {
57
57
  }
58
58
  getFileName(filePath, fileName) {
59
59
  if (!fileName) {
60
- return filePath.replace(/^.*[\\\/]/, '');
60
+ return filePath.replace(/^.*[\\/]/, '');
61
61
  }
62
62
  const extension = filePath.split('.').pop();
63
63
  if (!fileName.endsWith(`.${extension}`)) {
@@ -37,7 +37,7 @@ class SpoListItemBatchSetCommand extends SpoCommand {
37
37
  const jsonContent = formatting.parseCsvToJson(csvContent);
38
38
  const amountOfRows = jsonContent.length;
39
39
  const idColumn = args.options.idColumn || 'ID';
40
- if (!jsonContent[0].hasOwnProperty(idColumn)) {
40
+ if (!Object.prototype.hasOwnProperty.call(jsonContent[0], idColumn)) {
41
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.`;
42
42
  }
43
43
  const listId = args.options.listId ?
@@ -97,26 +97,30 @@ class SpoListItemBatchSetCommand extends SpoCommand {
97
97
  }
98
98
  else {
99
99
  switch (field.TypeAsString) {
100
- case 'User':
100
+ case 'User': {
101
101
  const userDetail = users.find(us => us.email === row[field.InternalName]);
102
102
  actionString += `<Method Name="ParseAndSetFieldValue" Id="${index += 1}" ObjectPathId="${objectPathId}"><Parameters><Parameter Type="String">${field.InternalName}</Parameter><Parameter Type="String">${userDetail.id}</Parameter></Parameters></Method>`;
103
103
  break;
104
- case 'UserMulti':
104
+ }
105
+ case 'UserMulti': {
105
106
  const userMultiString = row[field.InternalName].toString().split(';').map((element) => {
106
107
  const userDetail = users.find(us => us.email === element);
107
108
  return `<Object TypeId="{c956ab54-16bd-4c18-89d2-996f57282a6f}"><Property Name="Email" Type="Null" /><Property Name="LookupId" Type="Int32">${userDetail.id}</Property><Property Name="LookupValue" Type="Null" /></Object>`;
108
109
  });
109
110
  actionString += `<Method Name="SetFieldValue" Id="${index += 1}" ObjectPathId="${objectPathId}"><Parameters><Parameter Type="String">${field.InternalName}</Parameter><Parameter Type="Array">${userMultiString.join('')}</Parameter></Parameters></Method>`;
110
111
  break;
111
- case 'Lookup':
112
+ }
113
+ case 'Lookup': {
112
114
  actionString += `<Method Name="SetFieldValue" Id="${index += 1}" ObjectPathId="${objectPathId}"><Parameters><Parameter Type="String">${field.InternalName}</Parameter><Parameter TypeId="{f1d34cc0-9b50-4a78-be78-d5facfcccfb7}"><Property Name="LookupId" Type="Int32">${row[field.InternalName]}</Property><Property Name="LookupValue" Type="Null"/></Parameter></Parameters></Method>`;
113
115
  break;
114
- case 'LookupMulti':
116
+ }
117
+ case 'LookupMulti': {
115
118
  const lookupMultiString = row[field.InternalName].toString().split(';').map((element) => {
116
119
  return `<Object TypeId="{f1d34cc0-9b50-4a78-be78-d5facfcccfb7}"><Property Name="LookupId" Type="Int32">${element}</Property><Property Name="LookupValue" Type="Null" /></Object>`;
117
120
  });
118
121
  actionString += `<Method Name="SetFieldValue" Id="${index += 1}" ObjectPathId="${objectPathId}"><Parameters><Parameter Type="String">${field.InternalName}</Parameter><Parameter Type="Array">${lookupMultiString.join('')}</Parameter></Parameters></Method>`;
119
122
  break;
123
+ }
120
124
  default:
121
125
  actionString += `<Method Name="ParseAndSetFieldValue" Id="${index += 1}" ObjectPathId="${objectPathId}"><Parameters><Parameter Type="String">${field.InternalName}</Parameter><Parameter Type="String">${formatting.escapeXml(row[field.InternalName].toString())}</Parameter></Parameters></Method>`;
122
126
  break;
@@ -238,11 +238,11 @@ export class ClientSidePage {
238
238
  .replace(/:/g, "&#58;")
239
239
  .replace(/{/g, "&#123;")
240
240
  .replace(/}/g, "&#125;")
241
- .replace(/\[/g, "\[")
242
- .replace(/\]/g, "\]")
243
- .replace(/\*/g, "\*")
244
- .replace(/\$/g, "\$")
245
- .replace(/\./g, "\.");
241
+ .replace(/\[/g, "[")
242
+ .replace(/\]/g, "]")
243
+ .replace(/\*/g, "*")
244
+ .replace(/\$/g, "$")
245
+ .replace(/\./g, ".");
246
246
  }
247
247
  /**
248
248
  * Converts an escaped string from a client-side control attribute to a json object
@@ -258,7 +258,7 @@ export class ClientSidePage {
258
258
  [/\\/g, "\\\\"], [/&quot;/g, "\""], [/&#58;/g, ":"], [/&#123;/g, "{"], [/&#125;/g, "}"],
259
259
  [/\\\\/g, "\\"], [/\\\?/g, "?"], [/\\\./g, "."], [/\\\[/g, "["], [/\\\]/g, "]"],
260
260
  [/\\\(/g, "("], [/\\\)/g, ")"], [/\\\|/g, "|"], [/\\\+/g, "+"], [/\\\*/g, "*"],
261
- [/\\\$/g, "$"],
261
+ [/\\\$/g, "$"]
262
262
  ];
263
263
  return mapDict.reduce((r, m) => r.replace(m[0], m[1]), escaped);
264
264
  };
@@ -298,7 +298,7 @@ export class ClientSidePage {
298
298
  // get the control type
299
299
  const ct = /controlType&quot;&#58;(\d*?)(,|&)/i.exec(markup);
300
300
  // if no control type is present this is a column which we give type 0 to let us process it
301
- const controlType = ct == null || ct.length < 0 ? -1 : parseInt(ct[1], 10);
301
+ const controlType = ct === null || ct.length < 0 ? -1 : parseInt(ct[1], 10);
302
302
  let control = null;
303
303
  switch (controlType) {
304
304
  case -1:
@@ -562,7 +562,7 @@ export class CanvasColumn extends CanvasControl {
562
562
  sectionIndex: this.order,
563
563
  zoneIndex: this.section?.order || 0,
564
564
  zoneId: this.section?.zoneId,
565
- layoutIndex: this.section?.layoutIndex,
565
+ layoutIndex: this.section?.layoutIndex
566
566
  },
567
567
  zoneGroupMetadata: this.section?.zoneGroupMetadata,
568
568
  emphasis: this.section?.emphasis
@@ -620,7 +620,7 @@ export class BackgroundSettings extends ClientSidePart {
620
620
  dataVersion: this.dataVersion,
621
621
  instanceId: this.id,
622
622
  properties: this.propertieJson,
623
- serverProcessedContent: this.serverProcessedContent,
623
+ serverProcessedContent: this.serverProcessedContent
624
624
  };
625
625
  const html = [];
626
626
  html.push(`<div data-sp-canvascontrol="" data-sp-canvasdataversion="${this.dataVersion}" data-sp-controldata="${this.jsonData}">`);
@@ -687,7 +687,7 @@ export class ClientSideText extends ClientSidePart {
687
687
  layoutIndex: this.column?.section?.layoutIndex
688
688
  },
689
689
  zoneGroupMetadata: this.column?.section?.zoneGroupMetadata,
690
- emphasis: this.column?.section?.emphasis,
690
+ emphasis: this.column?.section?.emphasis
691
691
  };
692
692
  if (this.column?.section?.isLayoutReflowOnTop !== undefined) {
693
693
  controlData.position.isLayoutReflowOnTop = this.column.section.isLayoutReflowOnTop;
@@ -806,11 +806,11 @@ export class ClientSideWebpart extends ClientSidePart {
806
806
  sectionIndex: this.column ? this.column.order : 0,
807
807
  zoneIndex: this.column && this.column.section ? this.column.section.order : 0,
808
808
  zoneId: this.column?.section?.zoneId,
809
- layoutIndex: this.column?.section?.layoutIndex,
809
+ layoutIndex: this.column?.section?.layoutIndex
810
810
  },
811
811
  webPartId: this.webPartId,
812
812
  zoneGroupMetadata: this.column?.section?.zoneGroupMetadata,
813
- emphasis: this.column?.section?.emphasis,
813
+ emphasis: this.column?.section?.emphasis
814
814
  };
815
815
  if (this.column?.section?.isLayoutReflowOnTop !== undefined) {
816
816
  controlData.position.isLayoutReflowOnTop = this.column.section.isLayoutReflowOnTop;
@@ -89,7 +89,7 @@ class SpoPageAddCommand extends SpoCommand {
89
89
  };
90
90
  await request.post(requestOptions);
91
91
  break;
92
- case 'NewsPage':
92
+ case 'NewsPage': {
93
93
  const listItemSetOptions = {
94
94
  FirstPublishedDate: new Date().toISOString()
95
95
  };
@@ -97,7 +97,8 @@ class SpoPageAddCommand extends SpoCommand {
97
97
  const requestUrl = `${args.options.webUrl}/_api/web/GetList('${formatting.encodeQueryParameter(listUrl)}')`;
98
98
  await spo.systemUpdateListItem(requestUrl, listItemId, logger, this.verbose, listItemSetOptions);
99
99
  break;
100
- case 'Template':
100
+ }
101
+ case 'Template': {
101
102
  requestOptions.url = `${args.options.webUrl}/_api/SitePages/Pages(${listItemId})/SavePageAsTemplate`;
102
103
  requestOptions.headers = {
103
104
  'X-RequestDigest': requestDigest,
@@ -119,6 +120,7 @@ class SpoPageAddCommand extends SpoCommand {
119
120
  };
120
121
  await request.post(requestOptions);
121
122
  break;
123
+ }
122
124
  }
123
125
  }
124
126
  requestOptions = {
@@ -233,6 +233,7 @@ class SpoPageClientSideWebPartAddCommand extends SpoCommand {
233
233
  webPart.webPartData.properties = this.extend(webPart.webPartData.properties, properties);
234
234
  }
235
235
  catch {
236
+ // Do nothing
236
237
  }
237
238
  }
238
239
  if (args.options.webPartData) {
@@ -94,7 +94,7 @@ class SpoPageSetCommand extends SpoCommand {
94
94
  };
95
95
  await request.post(requestOptions);
96
96
  break;
97
- case 'NewsPage':
97
+ case 'NewsPage': {
98
98
  const newsPageItem = await spo.getFileAsListItemByUrl(args.options.webUrl, serverRelativeFileUrl, logger, this.verbose);
99
99
  const newsPageItemId = newsPageItem.Id;
100
100
  const listItemSetOptions = {
@@ -103,7 +103,8 @@ class SpoPageSetCommand extends SpoCommand {
103
103
  };
104
104
  await spo.systemUpdateListItem(requestUrl, newsPageItemId, logger, this.verbose, listItemSetOptions);
105
105
  break;
106
- case 'Template':
106
+ }
107
+ case 'Template': {
107
108
  const templateItem = await spo.getFileAsListItemByUrl(args.options.webUrl, serverRelativeFileUrl, logger, this.verbose);
108
109
  const templateItemId = templateItem.Id;
109
110
  requestOptions.headers = {
@@ -132,6 +133,7 @@ class SpoPageSetCommand extends SpoCommand {
132
133
  }
133
134
  pageId = res.Id;
134
135
  break;
136
+ }
135
137
  }
136
138
  }
137
139
  if (args.options.promoteAs !== 'Template') {
@@ -49,6 +49,7 @@ class SpoPageTextAddCommand extends SpoCommand {
49
49
  // Add a new section when page does not contain any sections
50
50
  if (page.sections.length < 1) {
51
51
  const newSection = new CanvasSection(page, 1);
52
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
52
53
  newSection.defaultColumn;
53
54
  page.sections.push(newSection);
54
55
  }
@@ -25,28 +25,23 @@ export class SpoPropertyBagBaseCommand extends SpoCommand {
25
25
  },
26
26
  data: `<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><ObjectPath Id="10" ObjectPathId="9" /><ObjectIdentityQuery Id="11" ObjectPathId="9" /><Query Id="12" ObjectPathId="9"><Query SelectAllProperties="false"><Properties><Property Name="Properties" SelectAll="true"><Query SelectAllProperties="false"><Properties /></Query></Property></Properties></Query></Query></Actions><ObjectPaths><Method Id="9" ParentId="5" Name="GetFolderByServerRelativeUrl"><Parameters><Parameter Type="String">${serverRelativeUrl}</Parameter></Parameters></Method><Identity Id="5" Name="${identityResp.objectIdentity}" /></ObjectPaths></Request>`
27
27
  };
28
- try {
29
- const res = await request.post(requestOptions);
30
- if (this.debug) {
31
- await logger.logToStderr('Attempt to get Properties key values');
32
- }
33
- const json = JSON.parse(res);
34
- const contents = json.find(x => { return x['ErrorInfo']; });
35
- if (contents && contents.ErrorInfo) {
36
- throw contents.ErrorInfo.ErrorMessage || 'ClientSvc unknown error';
37
- }
38
- const propertiesObj = json.find(x => { return x['Properties']; });
39
- if (propertiesObj) {
40
- return propertiesObj['Properties'];
41
- }
42
- throw 'Cannot proceed. Properties not found'; // this is not suppose to happen
28
+ const res = await request.post(requestOptions);
29
+ if (this.verbose) {
30
+ await logger.logToStderr('Attempt to get Properties key values');
31
+ }
32
+ const json = JSON.parse(res);
33
+ const contents = json.find(x => { return x['ErrorInfo']; });
34
+ if (contents && contents.ErrorInfo) {
35
+ throw contents.ErrorInfo.ErrorMessage || 'ClientSvc unknown error';
43
36
  }
44
- catch (err) {
45
- throw err;
37
+ const propertiesObj = json.find(x => { return x['Properties']; });
38
+ if (propertiesObj) {
39
+ return propertiesObj['Properties'];
46
40
  }
41
+ throw 'Cannot proceed. Properties not found'; // this is not suppose to happen
47
42
  }
48
43
  /**
49
- * Gets property bag for site or sitecollection where return type is "_ObjectType_\":\"SP.Web\".
44
+ * Gets property bag for site or site collection where return type is "_ObjectType_\":\"SP.Web\".
50
45
  * This method is executed when no folder specified. PnP PowerShell behaves the same way.
51
46
  */
52
47
  async getWebPropertyBag(identityResp, webUrl, logger) {
@@ -57,25 +52,20 @@ export class SpoPropertyBagBaseCommand extends SpoCommand {
57
52
  },
58
53
  data: `<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><Query Id="97" ObjectPathId="5"><Query SelectAllProperties="false"><Properties><Property Name="ServerRelativeUrl" ScalarProperty="true" /><Property Name="AllProperties" SelectAll="true"><Query SelectAllProperties="false"><Properties /></Query></Property></Properties></Query></Query></Actions><ObjectPaths><Identity Id="5" Name="${identityResp.objectIdentity}" /></ObjectPaths></Request>`
59
54
  };
60
- try {
61
- const res = await request.post(requestOptions);
62
- if (this.debug) {
63
- await logger.logToStderr('Attempt to get AllProperties key values');
64
- }
65
- const json = JSON.parse(res);
66
- const contents = json.find(x => { return x['ErrorInfo']; });
67
- if (contents && contents.ErrorInfo) {
68
- throw contents.ErrorInfo.ErrorMessage || 'ClientSvc unknown error';
69
- }
70
- const allPropertiesObj = json.find(x => { return x['AllProperties']; });
71
- if (allPropertiesObj) {
72
- return allPropertiesObj['AllProperties'];
73
- }
74
- throw 'Cannot proceed. AllProperties not found'; // this is not supposed to happen
55
+ const res = await request.post(requestOptions);
56
+ if (this.verbose) {
57
+ await logger.logToStderr('Attempt to get AllProperties key values');
75
58
  }
76
- catch (err) {
77
- throw err;
59
+ const json = JSON.parse(res);
60
+ const contents = json.find(x => { return x['ErrorInfo']; });
61
+ if (contents && contents.ErrorInfo) {
62
+ throw contents.ErrorInfo.ErrorMessage || 'ClientSvc unknown error';
78
63
  }
64
+ const allPropertiesObj = json.find(x => { return x['AllProperties']; });
65
+ if (allPropertiesObj) {
66
+ return allPropertiesObj['AllProperties'];
67
+ }
68
+ throw 'Cannot proceed. AllProperties not found'; // this is not supposed to happen
79
69
  }
80
70
  /**
81
71
  * The property bag item data returned from the client.svc/ProcessQuery response
@@ -122,19 +112,14 @@ export class SpoPropertyBagBaseCommand extends SpoCommand {
122
112
  },
123
113
  data: `<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><Method Name="SetFieldValue" Id="206" ObjectPathId="205"><Parameters><Parameter Type="String">${formatting.escapeXml(name)}</Parameter><Parameter Type="String">${formatting.escapeXml(value)}</Parameter></Parameters></Method><Method Name="Update" Id="207" ObjectPathId="198" /></Actions><ObjectPaths><Property Id="205" ParentId="198" Name="${objectType}" /><Identity Id="198" Name="${identityResp.objectIdentity}" /></ObjectPaths></Request>`
124
114
  };
125
- try {
126
- const res = await request.post(requestOptions);
127
- const json = JSON.parse(res);
128
- const contents = json.find(x => { return x['ErrorInfo']; });
129
- if (contents && contents.ErrorInfo) {
130
- throw contents.ErrorInfo.ErrorMessage || 'ClientSvc unknown error';
131
- }
132
- else {
133
- return res;
134
- }
115
+ const res = await request.post(requestOptions);
116
+ const json = JSON.parse(res);
117
+ const contents = json.find(x => { return x['ErrorInfo']; });
118
+ if (contents && contents.ErrorInfo) {
119
+ throw contents.ErrorInfo.ErrorMessage || 'ClientSvc unknown error';
135
120
  }
136
- catch (err) {
137
- throw err;
121
+ else {
122
+ return res;
138
123
  }
139
124
  }
140
125
  /**
@@ -146,13 +131,8 @@ export class SpoPropertyBagBaseCommand extends SpoCommand {
146
131
  * @param cmd command instance
147
132
  */
148
133
  static async isNoScriptSite(webUrl, formDigest, webIdentityResp, logger, debug) {
149
- try {
150
- const basePermissionsResp = await spo.getEffectiveBasePermissions(webIdentityResp.objectIdentity, webUrl, formDigest, logger, debug);
151
- return basePermissionsResp.has(PermissionKind.AddAndCustomizePages) === false;
152
- }
153
- catch (err) {
154
- throw err;
155
- }
134
+ const basePermissionsResp = await spo.getEffectiveBasePermissions(webIdentityResp.objectIdentity, webUrl, formDigest, logger, debug);
135
+ return basePermissionsResp.has(PermissionKind.AddAndCustomizePages) === false;
156
136
  }
157
137
  }
158
138
  //# sourceMappingURL=propertybag-base.js.map
@@ -0,0 +1,107 @@
1
+ import commands from '../../commands.js';
2
+ import SpoCommand from '../../../base/SpoCommand.js';
3
+ import { globalOptionsZod } from '../../../../Command.js';
4
+ import { z } from 'zod';
5
+ import { zod } from '../../../../utils/zod.js';
6
+ import { validation } from '../../../../utils/validation.js';
7
+ import { spo } from '../../../../utils/spo.js';
8
+ import { entraUser } from '../../../../utils/entraUser.js';
9
+ import { formatting } from '../../../../utils/formatting.js';
10
+ import { odata } from '../../../../utils/odata.js';
11
+ import { cli } from '../../../../cli/cli.js';
12
+ export const options = globalOptionsZod
13
+ .extend({
14
+ webUrl: zod.alias('u', z.string()
15
+ .refine(url => validation.isValidSharePointUrl(url) === true, url => ({
16
+ message: `'${url}' is not a valid SharePoint site URL.`
17
+ }))),
18
+ listId: z.string()
19
+ .refine(id => validation.isValidGuid(id), id => ({
20
+ message: `'${id}' is not a valid GUID.`
21
+ })).optional(),
22
+ listUrl: z.string().optional(),
23
+ listTitle: z.string().optional(),
24
+ userName: z.string().refine(upn => validation.isValidUserPrincipalName(upn), upn => ({
25
+ message: `'${upn}' is not a valid UPN.`
26
+ })).optional(),
27
+ userId: z.string().refine(id => validation.isValidGuid(id), id => ({
28
+ message: `'${id}' is not a valid GUID.`
29
+ })).optional()
30
+ })
31
+ .strict();
32
+ class SpoSiteAlertListCommand extends SpoCommand {
33
+ get name() {
34
+ return commands.SITE_ALERT_LIST;
35
+ }
36
+ get description() {
37
+ return 'Lists all SharePoint list alerts';
38
+ }
39
+ defaultProperties() {
40
+ return ['ID', 'Title', 'UserPrincipalName'];
41
+ }
42
+ get schema() {
43
+ return options;
44
+ }
45
+ getRefinedSchema(schema) {
46
+ return schema
47
+ .refine(options => [options.listId, options.listUrl, options.listTitle].filter(x => x !== undefined).length <= 1, {
48
+ message: `Specify either listId, listUrl, or listTitle, but not more than one.`
49
+ })
50
+ .refine(options => [options.userName, options.userId].filter(x => x !== undefined).length <= 1, {
51
+ message: `Specify either userName or userId, but not both.`
52
+ });
53
+ }
54
+ async commandAction(logger, args) {
55
+ if (this.verbose) {
56
+ const listParams = args.options.listId || args.options.listTitle || args.options.listUrl;
57
+ const userParams = args.options.userName || args.options.userId;
58
+ let message = `Retrieving alerts from site '${args.options.webUrl}'`;
59
+ if (listParams) {
60
+ message += ` for list '${listParams}'`;
61
+ }
62
+ if (userParams) {
63
+ message += `${listParams ? ' and' : ''} for user '${userParams}'`;
64
+ }
65
+ await logger.logToStderr(`${message}...`);
66
+ }
67
+ let requestUrl = `${args.options.webUrl}/_api/web/alerts?$expand=List,User,List/Rootfolder,Item&$select=*,List/Id,List/Title,List/Rootfolder/ServerRelativeUrl,Item/ID,Item/FileRef,Item/Guid`;
68
+ const filters = [];
69
+ let listId;
70
+ if (args.options.listId) {
71
+ listId = args.options.listId;
72
+ }
73
+ else if (args.options.listUrl || args.options.listTitle) {
74
+ listId = await spo.getListId(args.options.webUrl, args.options.listTitle, args.options.listUrl, logger, this.verbose);
75
+ }
76
+ if (listId) {
77
+ filters.push(`List/Id eq guid'${formatting.encodeQueryParameter(listId)}'`);
78
+ }
79
+ if (args.options.userName) {
80
+ filters.push(`User/UserPrincipalName eq '${formatting.encodeQueryParameter(args.options.userName)}'`);
81
+ }
82
+ else if (args.options.userId) {
83
+ const userPrincipalName = await entraUser.getUpnByUserId(args.options.userId);
84
+ filters.push(`User/UserPrincipalName eq '${formatting.encodeQueryParameter(userPrincipalName)}'`);
85
+ }
86
+ if (filters.length > 0) {
87
+ requestUrl += `&$filter=${filters.join(' and ')}`;
88
+ }
89
+ try {
90
+ const res = await odata.getAllItems(requestUrl);
91
+ res.forEach(alert => {
92
+ if (alert.Item) {
93
+ delete alert.Item['ID'];
94
+ }
95
+ if (cli.shouldTrimOutput(args.options.output)) {
96
+ alert.UserPrincipalName = alert.User?.UserPrincipalName;
97
+ }
98
+ });
99
+ await logger.log(res);
100
+ }
101
+ catch (err) {
102
+ this.handleRejectedODataJsonPromise(err);
103
+ }
104
+ }
105
+ }
106
+ export default new SpoSiteAlertListCommand();
107
+ //# sourceMappingURL=site-alert-list.js.map
@@ -125,7 +125,7 @@ class SpoThemeApplyCommand extends SpoCommand {
125
125
  }
126
126
  return `{
127
127
  'name': '${themeName}' ,
128
- 'themeJson': '{\"palette\": {${palette}}}'
128
+ 'themeJson': '{"palette": {${palette}}}'
129
129
  }`;
130
130
  }
131
131
  }