@pnp/cli-microsoft365 10.3.0-beta.d1b978f → 10.3.0-beta.df85113
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/.eslintrc.cjs +1 -0
- package/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/config.js +2 -1
- package/dist/m365/entra/commands/app/app-add.js +3 -0
- package/dist/m365/entra/commands/pim/pim-role-assignment-remove.js +186 -0
- package/dist/m365/entra/commands/roledefinition/roledefinition-add.js +58 -0
- package/dist/m365/entra/commands/roledefinition/roledefinition-set.js +84 -0
- package/dist/m365/entra/commands/rolepermission/rolepermission-list.js +42 -0
- package/dist/m365/entra/commands.js +4 -0
- package/dist/m365/exo/commands/approleassignment/approleassignment-add.js +235 -0
- package/dist/m365/exo/commands.js +5 -0
- package/dist/m365/outlook/commands/mailbox/mailbox-settings-set.js +163 -0
- package/dist/m365/outlook/commands.js +1 -0
- package/dist/m365/pp/commands/website/website-get.js +60 -0
- package/dist/m365/pp/commands.js +2 -1
- package/dist/m365/spe/commands/container/container-activate.js +50 -0
- package/dist/m365/spe/commands.js +1 -0
- package/dist/m365/spo/commands/folder/folder-roleassignment-add.js +0 -13
- package/dist/m365/spo/commands/list/list-defaultvalue-clear.js +184 -0
- package/dist/m365/spo/commands/list/list-defaultvalue-remove.js +181 -0
- package/dist/m365/spo/commands/list/list-defaultvalue-set.js +210 -0
- package/dist/m365/spo/commands.js +3 -0
- package/dist/m365/tenant/commands/people/people-pronouns-set.js +46 -0
- package/dist/m365/tenant/commands/report/report-settings-set.js +47 -0
- package/dist/m365/tenant/commands.js +2 -0
- package/dist/utils/customAppScope.js +29 -0
- package/dist/utils/entraServicePrincipal.js +46 -0
- package/dist/utils/powerPlatform.js +38 -0
- package/dist/utils/roleDefinition.js +23 -0
- package/dist/utils/validation.js +4 -0
- package/docs/docs/cmd/entra/app/app-add.mdx +1 -1
- package/docs/docs/cmd/entra/pim/pim-role-assignment-remove.mdx +197 -0
- package/docs/docs/cmd/entra/roledefinition/roledefinition-add.mdx +131 -0
- package/docs/docs/cmd/entra/roledefinition/roledefinition-set.mdx +64 -0
- package/docs/docs/cmd/entra/rolepermission/rolepermission-list.mdx +162 -0
- package/docs/docs/cmd/exo/approleassignment/approleassignment-add.mdx +170 -0
- package/docs/docs/cmd/outlook/mailbox/mailbox-settings-set.mdx +166 -0
- package/docs/docs/cmd/pp/website/website-get.mdx +153 -0
- package/docs/docs/cmd/spe/container/container-activate.mdx +34 -0
- package/docs/docs/cmd/spo/list/list-defaultvalue-clear.mdx +62 -0
- package/docs/docs/cmd/spo/list/list-defaultvalue-remove.mdx +62 -0
- package/docs/docs/cmd/spo/list/list-defaultvalue-set.mdx +112 -0
- package/docs/docs/cmd/tenant/people/people-pronouns-set.mdx +82 -0
- package/docs/docs/cmd/tenant/report/report-settings-set.mdx +32 -0
- package/npm-shrinkwrap.json +54 -74
- package/package.json +9 -9
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { globalOptionsZod } from '../../../../Command.js';
|
|
3
|
+
import { zod } from '../../../../utils/zod.js';
|
|
4
|
+
import GraphCommand from '../../../base/GraphCommand.js';
|
|
5
|
+
import commands from '../../commands.js';
|
|
6
|
+
import { validation } from '../../../../utils/validation.js';
|
|
7
|
+
import request from '../../../../request.js';
|
|
8
|
+
import { accessToken } from '../../../../utils/accessToken.js';
|
|
9
|
+
import auth from '../../../../Auth.js';
|
|
10
|
+
const options = globalOptionsZod
|
|
11
|
+
.extend({
|
|
12
|
+
userId: zod.alias('i', z.string().refine(id => validation.isValidGuid(id), id => ({
|
|
13
|
+
message: `'${id}' is not a valid GUID.`
|
|
14
|
+
})).optional()),
|
|
15
|
+
userName: zod.alias('n', z.string().refine(name => validation.isValidUserPrincipalName(name), name => ({
|
|
16
|
+
message: `'${name}' is not a valid UPN.`
|
|
17
|
+
})).optional()),
|
|
18
|
+
dateFormat: z.string().optional(),
|
|
19
|
+
timeFormat: z.string().optional(),
|
|
20
|
+
timeZone: z.string().optional(),
|
|
21
|
+
language: z.string().optional(),
|
|
22
|
+
delegateMeetingMessageDeliveryOptions: z.enum(['sendToDelegateAndInformationToPrincipal', 'sendToDelegateAndPrincipal', 'sendToDelegateOnly']).optional(),
|
|
23
|
+
workingDays: z.string().transform((value) => value.split(',')).pipe(z.enum(['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']).array()).optional(),
|
|
24
|
+
workingHoursStartTime: z.string().optional(),
|
|
25
|
+
workingHoursEndTime: z.string().optional(),
|
|
26
|
+
workingHoursTimeZone: z.string().optional(),
|
|
27
|
+
autoReplyExternalAudience: z.enum(['none', 'all', 'contactsOnly']).optional(),
|
|
28
|
+
autoReplyExternalMessage: z.string().optional(),
|
|
29
|
+
autoReplyInternalMessage: z.string().optional(),
|
|
30
|
+
autoReplyStartDateTime: z.string().optional(),
|
|
31
|
+
autoReplyStartTimeZone: z.string().optional(),
|
|
32
|
+
autoReplyEndDateTime: z.string().optional(),
|
|
33
|
+
autoReplyEndTimeZone: z.string().optional(),
|
|
34
|
+
autoReplyStatus: z.enum(['disabled', 'scheduled', 'alwaysEnabled']).optional()
|
|
35
|
+
})
|
|
36
|
+
.strict();
|
|
37
|
+
class OutlookMailboxSettingsSetCommand extends GraphCommand {
|
|
38
|
+
get name() {
|
|
39
|
+
return commands.MAILBOX_SETTINGS_SET;
|
|
40
|
+
}
|
|
41
|
+
get description() {
|
|
42
|
+
return 'Updates user mailbox settings';
|
|
43
|
+
}
|
|
44
|
+
get schema() {
|
|
45
|
+
return options;
|
|
46
|
+
}
|
|
47
|
+
getRefinedSchema(schema) {
|
|
48
|
+
return schema
|
|
49
|
+
.refine(options => [options.workingDays, options.workingHoursStartTime, options.workingHoursEndTime, options.workingHoursTimeZone,
|
|
50
|
+
options.autoReplyStatus, options.autoReplyExternalAudience, options.autoReplyExternalMessage, options.autoReplyInternalMessage,
|
|
51
|
+
options.autoReplyStartDateTime, options.autoReplyStartTimeZone, options.autoReplyEndDateTime, options.autoReplyEndTimeZone,
|
|
52
|
+
options.timeFormat, options.timeZone, options.dateFormat, options.delegateMeetingMessageDeliveryOptions, options.language].filter(o => o !== undefined).length > 0, {
|
|
53
|
+
message: 'Specify at least one of the following options: workingDays, workingHoursStartTime, workingHoursEndTime, workingHoursTimeZone, autoReplyStatus, autoReplyExternalAudience, autoReplyExternalMessage, autoReplyInternalMessage, autoReplyStartDateTime, autoReplyStartTimeZone, autoReplyEndDateTime, autoReplyEndTimeZone, timeFormat, timeZone, dateFormat, delegateMeetingMessageDeliveryOptions, or language'
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async commandAction(logger, args) {
|
|
57
|
+
const isAppOnlyAccessToken = accessToken.isAppOnlyAccessToken(auth.connection.accessTokens[auth.defaultResource].accessToken);
|
|
58
|
+
let requestUrl = `${this.resource}/v1.0/me/mailboxSettings`;
|
|
59
|
+
if (isAppOnlyAccessToken) {
|
|
60
|
+
if (args.options.userId && args.options.userName) {
|
|
61
|
+
throw 'When running with application permissions either userId or userName is required, but not both';
|
|
62
|
+
}
|
|
63
|
+
const userIdentifier = args.options.userId ?? args.options.userName;
|
|
64
|
+
if (this.verbose) {
|
|
65
|
+
await logger.logToStderr(`Updating mailbox settings for user ${userIdentifier}...`);
|
|
66
|
+
}
|
|
67
|
+
requestUrl = `${this.resource}/v1.0/users('${userIdentifier}')/mailboxSettings`;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
if (args.options.userId || args.options.userName) {
|
|
71
|
+
throw 'You can update mailbox settings of other users only if CLI is authenticated in app-only mode';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const requestOptions = {
|
|
75
|
+
url: requestUrl,
|
|
76
|
+
headers: {
|
|
77
|
+
accept: 'application/json;odata.metadata=none'
|
|
78
|
+
},
|
|
79
|
+
responseType: 'json',
|
|
80
|
+
data: this.createRequestBody(args)
|
|
81
|
+
};
|
|
82
|
+
try {
|
|
83
|
+
const result = await request.patch(requestOptions);
|
|
84
|
+
await logger.log(result);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
this.handleRejectedODataJsonPromise(err);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
createRequestBody(args) {
|
|
91
|
+
const data = {};
|
|
92
|
+
if (args.options.dateFormat) {
|
|
93
|
+
data.dateFormat = args.options.dateFormat;
|
|
94
|
+
}
|
|
95
|
+
if (args.options.timeFormat) {
|
|
96
|
+
data.timeFormat = args.options.timeFormat;
|
|
97
|
+
}
|
|
98
|
+
if (args.options.timeZone) {
|
|
99
|
+
data.timeZone = args.options.timeZone;
|
|
100
|
+
}
|
|
101
|
+
if (args.options.delegateMeetingMessageDeliveryOptions) {
|
|
102
|
+
data.delegateMeetingMessageDeliveryOptions = args.options.delegateMeetingMessageDeliveryOptions;
|
|
103
|
+
}
|
|
104
|
+
if (args.options.language) {
|
|
105
|
+
data.language = {
|
|
106
|
+
locale: args.options.language
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (args.options.workingDays || args.options.workingHoursStartTime || args.options.workingHoursEndTime || args.options.workingHoursTimeZone) {
|
|
110
|
+
data['workingHours'] = {};
|
|
111
|
+
}
|
|
112
|
+
if (args.options.workingDays) {
|
|
113
|
+
data.workingHours.daysOfWeek = args.options.workingDays;
|
|
114
|
+
}
|
|
115
|
+
if (args.options.workingHoursStartTime) {
|
|
116
|
+
data.workingHours.startTime = args.options.workingHoursStartTime;
|
|
117
|
+
}
|
|
118
|
+
if (args.options.workingHoursEndTime) {
|
|
119
|
+
data.workingHours.endTime = args.options.workingHoursEndTime;
|
|
120
|
+
}
|
|
121
|
+
if (args.options.workingHoursTimeZone) {
|
|
122
|
+
data.workingHours.timeZone = {
|
|
123
|
+
name: args.options.workingHoursTimeZone
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
if (args.options.autoReplyStatus || args.options.autoReplyExternalAudience || args.options.autoReplyExternalMessage || args.options.autoReplyInternalMessage || args.options.autoReplyStartDateTime || args.options.autoReplyStartTimeZone || args.options.autoReplyEndDateTime || args.options.autoReplyEndTimeZone) {
|
|
127
|
+
data['automaticRepliesSetting'] = {};
|
|
128
|
+
}
|
|
129
|
+
if (args.options.autoReplyStatus) {
|
|
130
|
+
data.automaticRepliesSetting['status'] = args.options.autoReplyStatus;
|
|
131
|
+
}
|
|
132
|
+
if (args.options.autoReplyExternalAudience) {
|
|
133
|
+
data.automaticRepliesSetting['externalAudience'] = args.options.autoReplyExternalAudience;
|
|
134
|
+
}
|
|
135
|
+
if (args.options.autoReplyExternalMessage) {
|
|
136
|
+
data.automaticRepliesSetting['externalReplyMessage'] = args.options.autoReplyExternalMessage;
|
|
137
|
+
}
|
|
138
|
+
if (args.options.autoReplyInternalMessage) {
|
|
139
|
+
data.automaticRepliesSetting['internalReplyMessage'] = args.options.autoReplyInternalMessage;
|
|
140
|
+
}
|
|
141
|
+
if (args.options.autoReplyStartDateTime || args.options.autoReplyStartTimeZone) {
|
|
142
|
+
data.automaticRepliesSetting['scheduledStartDateTime'] = {};
|
|
143
|
+
}
|
|
144
|
+
if (args.options.autoReplyStartDateTime) {
|
|
145
|
+
data.automaticRepliesSetting['scheduledStartDateTime']['dateTime'] = args.options.autoReplyStartDateTime;
|
|
146
|
+
}
|
|
147
|
+
if (args.options.autoReplyStartTimeZone) {
|
|
148
|
+
data.automaticRepliesSetting['scheduledStartDateTime']['timeZone'] = args.options.autoReplyStartTimeZone;
|
|
149
|
+
}
|
|
150
|
+
if (args.options.autoReplyEndDateTime || args.options.autoReplyEndTimeZone) {
|
|
151
|
+
data.automaticRepliesSetting['scheduledEndDateTime'] = {};
|
|
152
|
+
}
|
|
153
|
+
if (args.options.autoReplyEndDateTime) {
|
|
154
|
+
data.automaticRepliesSetting['scheduledEndDateTime']['dateTime'] = args.options.autoReplyEndDateTime;
|
|
155
|
+
}
|
|
156
|
+
if (args.options.autoReplyEndTimeZone) {
|
|
157
|
+
data.automaticRepliesSetting['scheduledEndDateTime']['timeZone'] = args.options.autoReplyEndTimeZone;
|
|
158
|
+
}
|
|
159
|
+
return data;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export default new OutlookMailboxSettingsSetCommand();
|
|
163
|
+
//# sourceMappingURL=mailbox-settings-set.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { globalOptionsZod } from '../../../../Command.js';
|
|
2
|
+
import { powerPlatform } from '../../../../utils/powerPlatform.js';
|
|
3
|
+
import { validation } from '../../../../utils/validation.js';
|
|
4
|
+
import { zod } from '../../../../utils/zod.js';
|
|
5
|
+
import PowerPlatformCommand from '../../../base/PowerPlatformCommand.js';
|
|
6
|
+
import commands from '../../commands.js';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
const options = globalOptionsZod
|
|
9
|
+
.extend({
|
|
10
|
+
url: zod.alias('u', z.string().optional()
|
|
11
|
+
.refine(url => url === undefined || validation.isValidPowerPagesUrl(url) === true, url => ({
|
|
12
|
+
message: `'${url}' is not a valid Power Pages URL.`
|
|
13
|
+
}))),
|
|
14
|
+
id: zod.alias('i', z.string().uuid().optional()),
|
|
15
|
+
name: zod.alias('n', z.string().optional()),
|
|
16
|
+
environmentName: zod.alias('e', z.string())
|
|
17
|
+
}).strict();
|
|
18
|
+
class PpWebSiteGetCommand extends PowerPlatformCommand {
|
|
19
|
+
get name() {
|
|
20
|
+
return commands.WEBSITE_GET;
|
|
21
|
+
}
|
|
22
|
+
get description() {
|
|
23
|
+
return 'Gets information about the specified Power Pages website.';
|
|
24
|
+
}
|
|
25
|
+
defaultProperties() {
|
|
26
|
+
return ['id', 'name', 'websiteUrl', 'tenantId', 'subdomain', 'type', 'status', 'siteVisibility'];
|
|
27
|
+
}
|
|
28
|
+
get schema() {
|
|
29
|
+
return options;
|
|
30
|
+
}
|
|
31
|
+
getRefinedSchema(schema) {
|
|
32
|
+
return schema
|
|
33
|
+
.refine(options => [options.url, options.id, options.name].filter(x => x !== undefined).length === 1, {
|
|
34
|
+
message: `Specify either url, id or name, but not multiple.`
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async commandAction(logger, args) {
|
|
38
|
+
if (this.verbose) {
|
|
39
|
+
await logger.logToStderr(`Retrieving the website...`);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
let item = null;
|
|
43
|
+
if (args.options.id) {
|
|
44
|
+
item = await powerPlatform.getWebsiteById(args.options.environmentName, args.options.id);
|
|
45
|
+
}
|
|
46
|
+
else if (args.options.name) {
|
|
47
|
+
item = await powerPlatform.getWebsiteByName(args.options.environmentName, args.options.name);
|
|
48
|
+
}
|
|
49
|
+
else if (args.options.url) {
|
|
50
|
+
item = await powerPlatform.getWebsiteByUrl(args.options.environmentName, args.options.url);
|
|
51
|
+
}
|
|
52
|
+
await logger.log(item);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
this.handleRejectedODataJsonPromise(err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export default new PpWebSiteGetCommand();
|
|
60
|
+
//# sourceMappingURL=website-get.js.map
|
package/dist/m365/pp/commands.js
CHANGED
|
@@ -33,6 +33,7 @@ export default {
|
|
|
33
33
|
SOLUTION_PUBLISHER_LIST: `${prefix} solution publisher list`,
|
|
34
34
|
SOLUTION_PUBLISHER_REMOVE: `${prefix} solution publisher remove`,
|
|
35
35
|
TENANT_SETTINGS_LIST: `${prefix} tenant settings list`,
|
|
36
|
-
TENANT_SETTINGS_SET: `${prefix} tenant settings set
|
|
36
|
+
TENANT_SETTINGS_SET: `${prefix} tenant settings set`,
|
|
37
|
+
WEBSITE_GET: `${prefix} website get`
|
|
37
38
|
};
|
|
38
39
|
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
6
|
+
var _SpeContainerActivateCommand_instances, _SpeContainerActivateCommand_initOptions, _SpeContainerActivateCommand_initTypes;
|
|
7
|
+
import GraphCommand from '../../../base/GraphCommand.js';
|
|
8
|
+
import commands from '../../commands.js';
|
|
9
|
+
import request from '../../../../request.js';
|
|
10
|
+
import { formatting } from '../../../../utils/formatting.js';
|
|
11
|
+
class SpeContainerActivateCommand extends GraphCommand {
|
|
12
|
+
get name() {
|
|
13
|
+
return commands.CONTAINER_ACTIVATE;
|
|
14
|
+
}
|
|
15
|
+
get description() {
|
|
16
|
+
return 'Activates a container';
|
|
17
|
+
}
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
_SpeContainerActivateCommand_instances.add(this);
|
|
21
|
+
__classPrivateFieldGet(this, _SpeContainerActivateCommand_instances, "m", _SpeContainerActivateCommand_initOptions).call(this);
|
|
22
|
+
__classPrivateFieldGet(this, _SpeContainerActivateCommand_instances, "m", _SpeContainerActivateCommand_initTypes).call(this);
|
|
23
|
+
}
|
|
24
|
+
async commandAction(logger, args) {
|
|
25
|
+
if (this.verbose) {
|
|
26
|
+
await logger.logToStderr(`Activating a container with id '${args.options.id}'...`);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const requestOptions = {
|
|
30
|
+
url: `${this.resource}/v1.0/storage/fileStorage/containers/${formatting.encodeQueryParameter(args.options.id)}/activate`,
|
|
31
|
+
headers: {
|
|
32
|
+
'content-type': 'application/json;odata=nometadata',
|
|
33
|
+
'accept': 'application/json;odata.metadata=none'
|
|
34
|
+
},
|
|
35
|
+
responseType: 'json'
|
|
36
|
+
};
|
|
37
|
+
await request.post(requestOptions);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
this.handleRejectedODataJsonPromise(err);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
_SpeContainerActivateCommand_instances = new WeakSet(), _SpeContainerActivateCommand_initOptions = function _SpeContainerActivateCommand_initOptions() {
|
|
45
|
+
this.options.unshift({ option: '-i, --id <id>' });
|
|
46
|
+
}, _SpeContainerActivateCommand_initTypes = function _SpeContainerActivateCommand_initTypes() {
|
|
47
|
+
this.types.string.push('id');
|
|
48
|
+
};
|
|
49
|
+
export default new SpeContainerActivateCommand();
|
|
50
|
+
//# sourceMappingURL=container-activate.js.map
|
|
@@ -64,25 +64,12 @@ class SpoFolderRoleAssignmentAddCommand extends SpoCommand {
|
|
|
64
64
|
const siteUser = await spo.ensureEntraGroup(args.options.webUrl, group);
|
|
65
65
|
principalId = siteUser.Id;
|
|
66
66
|
}
|
|
67
|
-
await this.breakRoleAssignment(requestUrl);
|
|
68
67
|
await this.addRoleAssignment(requestUrl, principalId, roleDefinitionId);
|
|
69
68
|
}
|
|
70
69
|
catch (err) {
|
|
71
70
|
this.handleRejectedODataJsonPromise(err);
|
|
72
71
|
}
|
|
73
72
|
}
|
|
74
|
-
async breakRoleAssignment(requestUrl) {
|
|
75
|
-
const requestOptions = {
|
|
76
|
-
url: `${requestUrl}/breakroleinheritance(true)`,
|
|
77
|
-
method: 'POST',
|
|
78
|
-
headers: {
|
|
79
|
-
'accept': 'application/json;odata=nometadata',
|
|
80
|
-
'content-type': 'application/json'
|
|
81
|
-
},
|
|
82
|
-
responseType: 'json'
|
|
83
|
-
};
|
|
84
|
-
return request.post(requestOptions);
|
|
85
|
-
}
|
|
86
73
|
async addRoleAssignment(requestUrl, principalId, roleDefinitionId) {
|
|
87
74
|
const requestOptions = {
|
|
88
75
|
url: `${requestUrl}/roleassignments/addroleassignment(principalid='${principalId}',roledefid='${roleDefinitionId}')`,
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import SpoCommand from '../../../base/SpoCommand.js';
|
|
2
|
+
import { globalOptionsZod } from '../../../../Command.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { zod } from '../../../../utils/zod.js';
|
|
5
|
+
import commands from '../../commands.js';
|
|
6
|
+
import { DOMParser } from '@xmldom/xmldom';
|
|
7
|
+
import { validation } from '../../../../utils/validation.js';
|
|
8
|
+
import { urlUtil } from '../../../../utils/urlUtil.js';
|
|
9
|
+
import request from '../../../../request.js';
|
|
10
|
+
import { formatting } from '../../../../utils/formatting.js';
|
|
11
|
+
import { cli } from '../../../../cli/cli.js';
|
|
12
|
+
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 Online site URL.`
|
|
17
|
+
}))),
|
|
18
|
+
listId: zod.alias('i', z.string().optional()
|
|
19
|
+
.refine(id => id === undefined || validation.isValidGuid(id), id => ({
|
|
20
|
+
message: `'${id}' is not a valid GUID.`
|
|
21
|
+
}))),
|
|
22
|
+
listTitle: zod.alias('t', z.string().optional()),
|
|
23
|
+
listUrl: z.string().optional(),
|
|
24
|
+
fieldName: z.string().optional(),
|
|
25
|
+
folderUrl: z.string().optional(),
|
|
26
|
+
force: zod.alias('f', z.boolean().optional())
|
|
27
|
+
})
|
|
28
|
+
.strict();
|
|
29
|
+
class SpoListDefaultValueClearCommand extends SpoCommand {
|
|
30
|
+
get name() {
|
|
31
|
+
return commands.LIST_DEFAULTVALUE_CLEAR;
|
|
32
|
+
}
|
|
33
|
+
get description() {
|
|
34
|
+
return 'Clears default column values for a specific document library';
|
|
35
|
+
}
|
|
36
|
+
get schema() {
|
|
37
|
+
return options;
|
|
38
|
+
}
|
|
39
|
+
getRefinedSchema(schema) {
|
|
40
|
+
return schema
|
|
41
|
+
.refine(options => [options.listId, options.listTitle, options.listUrl].filter(o => o !== undefined).length === 1, {
|
|
42
|
+
message: 'Use one of the following options: listId, listTitle, listUrl.'
|
|
43
|
+
})
|
|
44
|
+
.refine(options => (options.fieldName !== undefined) !== (options.folderUrl !== undefined) || (options.fieldName === undefined && options.folderUrl === undefined), {
|
|
45
|
+
message: `Specify 'fieldName' or 'folderUrl', but not both.`
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async commandAction(logger, args) {
|
|
49
|
+
if (!args.options.force) {
|
|
50
|
+
const result = await cli.promptForConfirmation({ message: `Are you sure you want to clear all default values${args.options.fieldName ? ` for field '${args.options.fieldName}'` : args.options.folderUrl ? ` for folder ${args.options.folderUrl}` : ''}?` });
|
|
51
|
+
if (!result) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
if (this.verbose) {
|
|
57
|
+
await logger.logToStderr(`Clearing all default column values${args.options.fieldName ? ` for field ${args.options.fieldName}` : args.options.folderUrl ? `for folder '${args.options.folderUrl}'` : ''}...`);
|
|
58
|
+
await logger.logToStderr(`Getting server-relative URL of the list...`);
|
|
59
|
+
}
|
|
60
|
+
const listServerRelUrl = await this.getServerRelativeListUrl(args.options);
|
|
61
|
+
if (this.verbose) {
|
|
62
|
+
await logger.logToStderr(`List server-relative URL: ${listServerRelUrl}`);
|
|
63
|
+
await logger.logToStderr(`Getting default column values...`);
|
|
64
|
+
}
|
|
65
|
+
const defaultValuesXml = await this.getDefaultColumnValuesXml(args.options.webUrl, listServerRelUrl);
|
|
66
|
+
if (defaultValuesXml === null) {
|
|
67
|
+
if (this.verbose) {
|
|
68
|
+
await logger.logToStderr(`No default column values found.`);
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const trimmedXml = this.removeFieldsFromXml(defaultValuesXml, args.options);
|
|
73
|
+
await this.uploadDefaultColumnValuesXml(args.options.webUrl, listServerRelUrl, trimmedXml);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
this.handleRejectedODataJsonPromise(err);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async getServerRelativeListUrl(options) {
|
|
80
|
+
const requestOptions = {
|
|
81
|
+
url: `${options.webUrl}/_api/Web`,
|
|
82
|
+
headers: {
|
|
83
|
+
accept: 'application/json;odata=nometadata'
|
|
84
|
+
},
|
|
85
|
+
responseType: 'json'
|
|
86
|
+
};
|
|
87
|
+
if (options.listUrl) {
|
|
88
|
+
const serverRelativeUrl = urlUtil.getServerRelativePath(options.webUrl, options.listUrl);
|
|
89
|
+
requestOptions.url += `/GetList('${formatting.encodeQueryParameter(serverRelativeUrl)}')`;
|
|
90
|
+
}
|
|
91
|
+
else if (options.listId) {
|
|
92
|
+
requestOptions.url += `/Lists('${options.listId}')`;
|
|
93
|
+
}
|
|
94
|
+
else if (options.listTitle) {
|
|
95
|
+
requestOptions.url += `/Lists/GetByTitle('${formatting.encodeQueryParameter(options.listTitle)}')`;
|
|
96
|
+
}
|
|
97
|
+
requestOptions.url += '?$expand=RootFolder&$select=RootFolder/ServerRelativeUrl,BaseTemplate';
|
|
98
|
+
try {
|
|
99
|
+
const response = await request.get(requestOptions);
|
|
100
|
+
if (response.BaseTemplate !== 101) {
|
|
101
|
+
throw `The specified list is not a document library.`;
|
|
102
|
+
}
|
|
103
|
+
return response.RootFolder.ServerRelativeUrl;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error.status === 404) {
|
|
107
|
+
throw `List '${options.listId || options.listTitle || options.listUrl}' was not found.`;
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async getDefaultColumnValuesXml(webUrl, listServerRelUrl) {
|
|
113
|
+
try {
|
|
114
|
+
const requestOptions = {
|
|
115
|
+
url: `${webUrl}/_api/Web/GetFileByServerRelativePath(decodedUrl='${formatting.encodeQueryParameter(listServerRelUrl + '/Forms/client_LocationBasedDefaults.html')}')/$value`,
|
|
116
|
+
headers: {
|
|
117
|
+
accept: 'application/json;odata=nometadata'
|
|
118
|
+
},
|
|
119
|
+
responseType: 'json'
|
|
120
|
+
};
|
|
121
|
+
const defaultValuesXml = await request.get(requestOptions);
|
|
122
|
+
return defaultValuesXml;
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
// For lists that have never had default column values set, the client_LocationBasedDefaults.html file does not exist.
|
|
126
|
+
if (err.status === 404) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
removeFieldsFromXml(xml, options) {
|
|
133
|
+
if (!options.fieldName && !options.folderUrl) {
|
|
134
|
+
return '<MetadataDefaults />';
|
|
135
|
+
}
|
|
136
|
+
let folderUrlToRemove = null;
|
|
137
|
+
if (options.folderUrl) {
|
|
138
|
+
folderUrlToRemove = urlUtil.removeTrailingSlashes(urlUtil.getServerRelativePath(options.webUrl, options.folderUrl));
|
|
139
|
+
}
|
|
140
|
+
const parser = new DOMParser();
|
|
141
|
+
const doc = parser.parseFromString(xml, 'application/xml');
|
|
142
|
+
const folderLinks = doc.getElementsByTagName('a');
|
|
143
|
+
for (let i = 0; i < folderLinks.length; i++) {
|
|
144
|
+
const folderNode = folderLinks[i];
|
|
145
|
+
const folderUrl = folderNode.getAttribute('href');
|
|
146
|
+
if (folderUrlToRemove && folderUrlToRemove.toLowerCase() === decodeURIComponent(folderUrl).toLowerCase()) {
|
|
147
|
+
folderNode.parentNode.removeChild(folderNode);
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
else if (options.fieldName) {
|
|
151
|
+
const defaultValues = folderNode.getElementsByTagName('DefaultValue');
|
|
152
|
+
for (let j = 0; j < defaultValues.length; j++) {
|
|
153
|
+
const defaultValueNode = defaultValues[j];
|
|
154
|
+
const fieldName = defaultValueNode.getAttribute('FieldName');
|
|
155
|
+
if (fieldName.toLowerCase() === options.fieldName.toLowerCase()) {
|
|
156
|
+
// Remove the entire folder node if it becomes empty
|
|
157
|
+
if (folderNode.childNodes.length === 1) {
|
|
158
|
+
folderNode.parentNode.removeChild(defaultValueNode.parentNode);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
folderNode.removeChild(defaultValueNode);
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return doc.toString();
|
|
169
|
+
}
|
|
170
|
+
async uploadDefaultColumnValuesXml(webUrl, listServerRelUrl, xml) {
|
|
171
|
+
const requestOptions = {
|
|
172
|
+
url: `${webUrl}/_api/Web/GetFileByServerRelativePath(decodedUrl='${formatting.encodeQueryParameter(listServerRelUrl + '/Forms/client_LocationBasedDefaults.html')}')/$value`,
|
|
173
|
+
headers: {
|
|
174
|
+
accept: 'application/json;odata=nometadata',
|
|
175
|
+
'If-Match': '*'
|
|
176
|
+
},
|
|
177
|
+
responseType: 'json',
|
|
178
|
+
data: xml
|
|
179
|
+
};
|
|
180
|
+
await request.put(requestOptions);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
export default new SpoListDefaultValueClearCommand();
|
|
184
|
+
//# sourceMappingURL=list-defaultvalue-clear.js.map
|