@pnp/cli-microsoft365 11.1.0-beta.d3fc85d → 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.
- package/.devproxy/api-specs/sharepoint.yaml +23 -0
- package/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/Auth.js +10 -7
- package/dist/Command.js +2 -2
- package/dist/auth/msalCachePlugin.js +6 -2
- package/dist/autocomplete.js +6 -2
- package/dist/chili/chili.js +2 -1
- package/dist/cli/cli.js +4 -2
- package/dist/config.js +0 -1
- package/dist/m365/adaptivecard/commands/adaptivecard-send.js +2 -2
- package/dist/m365/app/commands/permission/permission-list.js +4 -2
- package/dist/m365/booking/commands/business/business-list.js +5 -0
- package/dist/m365/commands/setup.js +6 -3
- package/dist/m365/connection/commands/connection-list.js +5 -1
- package/dist/m365/entra/commands/app/app-role-add.js +1 -1
- package/dist/m365/entra/commands/group/group-add.js +1 -1
- package/dist/m365/entra/commands/group/group-set.js +1 -1
- package/dist/m365/entra/commands/m365group/m365group-add.js +0 -1
- package/dist/m365/file/commands/convert/convert-pdf.js +1 -6
- package/dist/m365/flow/commands/flow-export.js +8 -5
- package/dist/m365/flow/commands/run/run-get.js +3 -3
- package/dist/m365/graph/commands/schemaextension/schemaextension-set.js +1 -1
- package/dist/m365/onedrive/commands/onedrive-list.js +5 -0
- package/dist/m365/outlook/commands/roomlist/roomlist-list.js +5 -0
- package/dist/m365/pa/commands/app/app-export.js +1 -1
- package/dist/m365/pa/commands/app/app-get.js +1 -1
- package/dist/m365/pa/commands/environment/environment-list.js +5 -0
- package/dist/m365/planner/commands/tenant/tenant-settings-list.js +5 -0
- package/dist/m365/pp/commands/solution/solution-publisher-get.js +1 -1
- package/dist/m365/purview/commands/retentionevent/retentionevent-list.js +5 -0
- package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-list.js +5 -0
- package/dist/m365/purview/commands/retentionlabel/retentionlabel-list.js +5 -0
- package/dist/m365/spfx/commands/package/package-generate.js +3 -1
- package/dist/m365/spfx/commands/project/base-project-command.js +13 -5
- package/dist/m365/spfx/commands/project/project-doctor/rules/FN021007_PKG_only_one_rush_stack_compiler_installed.js +1 -1
- package/dist/m365/spfx/commands/project/project-externalize/rules/PnPJsRule.js +6 -4
- package/dist/m365/spfx/commands/project/project-model/ScssFile.js +3 -1
- package/dist/m365/spfx/commands/project/project-model/TsFile.js +6 -2
- package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.15.2.js +1 -1
- package/dist/m365/spfx/commands/spfx-doctor.js +5 -5
- package/dist/m365/spo/commands/file/file-add.js +4 -2
- package/dist/m365/spo/commands/file/file-rename.js +3 -4
- package/dist/m365/spo/commands/hubsite/hubsite-list.js +1 -1
- package/dist/m365/spo/commands/listitem/listitem-attachment-add.js +1 -1
- package/dist/m365/spo/commands/listitem/listitem-batch-set.js +9 -5
- package/dist/m365/spo/commands/page/clientsidepages.js +12 -12
- package/dist/m365/spo/commands/page/page-add.js +4 -2
- package/dist/m365/spo/commands/page/page-clientsidewebpart-add.js +1 -0
- package/dist/m365/spo/commands/page/page-set.js +4 -2
- package/dist/m365/spo/commands/page/page-text-add.js +1 -0
- package/dist/m365/spo/commands/propertybag/propertybag-base.js +34 -54
- package/dist/m365/spo/commands/site/site-alert-list.js +107 -0
- package/dist/m365/spo/commands/theme/theme-apply.js +1 -1
- package/dist/m365/spo/commands/web/web-reindex.js +17 -27
- package/dist/m365/spo/commands.js +1 -0
- package/dist/m365/teams/commands/tab/tab-add.js +9 -3
- package/dist/m365/viva/commands/connections/connections-app-create.js +1 -1
- package/dist/m365/viva/commands/engage/engage-community-user-add.js +1 -1
- package/dist/m365/viva/commands/engage/engage-community-user-remove.js +1 -1
- package/dist/telemetry.js +3 -1
- package/dist/utils/accessToken.js +4 -0
- package/dist/utils/cache.js +3 -2
- package/dist/utils/customAppScope.js +1 -1
- package/dist/utils/directoryExtension.js +1 -1
- package/dist/utils/entraAdministrativeUnit.js +1 -1
- package/dist/utils/entraApp.js +2 -2
- package/dist/utils/entraDevice.js +1 -1
- package/dist/utils/entraServicePrincipal.js +2 -2
- package/dist/utils/formatting.js +1 -1
- package/dist/utils/md.js +2 -2
- package/dist/utils/odata.js +2 -0
- package/dist/utils/planner.js +1 -1
- package/dist/utils/powerPlatform.js +2 -2
- package/dist/utils/roleDefinition.js +2 -2
- package/dist/utils/spo.js +10 -11
- package/dist/utils/urlUtil.js +1 -1
- package/dist/utils/validation.js +1 -1
- package/dist/utils/vivaEngage.js +3 -3
- package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-add.mdx +14 -0
- package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-get.mdx +15 -0
- package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-list.mdx +14 -0
- package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-remove.mdx +14 -0
- package/docs/docs/cmd/entra/groupsetting/groupsetting-add.mdx +19 -0
- package/docs/docs/cmd/entra/groupsetting/groupsetting-get.mdx +19 -0
- package/docs/docs/cmd/entra/groupsetting/groupsetting-list.mdx +19 -0
- package/docs/docs/cmd/entra/groupsetting/groupsetting-remove.mdx +21 -0
- package/docs/docs/cmd/entra/groupsetting/groupsetting-set.mdx +21 -0
- package/docs/docs/cmd/entra/m365group/m365group-add.mdx +19 -0
- package/docs/docs/cmd/entra/m365group/m365group-get.mdx +19 -0
- package/docs/docs/cmd/entra/m365group/m365group-list.mdx +19 -0
- package/docs/docs/cmd/entra/m365group/m365group-remove.mdx +21 -0
- package/docs/docs/cmd/entra/m365group/m365group-renew.mdx +21 -0
- package/docs/docs/cmd/entra/m365group/m365group-set.mdx +21 -0
- package/docs/docs/cmd/entra/m365group/m365group-teamify.mdx +19 -0
- package/docs/docs/cmd/spo/site/site-alert-list.mdx +187 -0
- package/eslint-rules/lib/rules/correct-command-class-name.js +18 -2
- package/eslint.config.mjs +270 -0
- package/npm-shrinkwrap.json +1117 -2277
- package/package.json +22 -21
- package/.eslintrc.cjs +0 -289
|
@@ -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(
|
|
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
|
-
|
|
86
|
-
|
|
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;
|
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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 (
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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, ":")
|
|
239
239
|
.replace(/{/g, "{")
|
|
240
240
|
.replace(/}/g, "}")
|
|
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, "\\\\"], [/"/g, "\""], [/:/g, ":"], [/{/g, "{"], [/}/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":(\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
|
|
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
|
-
|
|
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 = {
|
|
@@ -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
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
45
|
-
|
|
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
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
137
|
-
|
|
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
|
-
|
|
150
|
-
|
|
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
|