@pnp/cli-microsoft365
Version:
Manage Microsoft 365 and SharePoint Framework projects on any platform
269 lines • 12.2 kB
JavaScript
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _EntraM365GroupAddCommand_instances, _EntraM365GroupAddCommand_initTelemetry, _EntraM365GroupAddCommand_initOptions, _EntraM365GroupAddCommand_initTypes, _EntraM365GroupAddCommand_initValidators;
import { setTimeout } from 'timers/promises';
import fs from 'fs';
import path from 'path';
import request from '../../../../request.js';
import { formatting } from '../../../../utils/formatting.js';
import GraphCommand from '../../../base/GraphCommand.js';
import commands from '../../commands.js';
class EntraM365GroupAddCommand extends GraphCommand {
get name() {
return commands.M365GROUP_ADD;
}
get description() {
return 'Creates a Microsoft 365 Group';
}
constructor() {
super();
_EntraM365GroupAddCommand_instances.add(this);
this.pollingInterval = 500;
this.allowedVisibilities = ['Private', 'Public', 'HiddenMembership'];
__classPrivateFieldGet(this, _EntraM365GroupAddCommand_instances, "m", _EntraM365GroupAddCommand_initTelemetry).call(this);
__classPrivateFieldGet(this, _EntraM365GroupAddCommand_instances, "m", _EntraM365GroupAddCommand_initOptions).call(this);
__classPrivateFieldGet(this, _EntraM365GroupAddCommand_instances, "m", _EntraM365GroupAddCommand_initTypes).call(this);
__classPrivateFieldGet(this, _EntraM365GroupAddCommand_instances, "m", _EntraM365GroupAddCommand_initValidators).call(this);
}
async commandAction(logger, args) {
let group;
let ownerIds = [];
let memberIds = [];
const resourceBehaviorOptionsCollection = [];
const resolvedVisibility = args.options.visibility || 'Public';
if (this.verbose) {
await logger.logToStderr('Creating Microsoft 365 Group...');
}
if (args.options.allowMembersToPost) {
resourceBehaviorOptionsCollection.push('AllowOnlyMembersToPost');
}
if (args.options.hideGroupInOutlook) {
resourceBehaviorOptionsCollection.push('HideGroupInOutlook');
}
if (args.options.subscribeNewGroupMembers) {
resourceBehaviorOptionsCollection.push('SubscribeNewGroupMembers');
}
if (args.options.welcomeEmailDisabled) {
resourceBehaviorOptionsCollection.push('WelcomeEmailDisabled');
}
const requestOptions = {
url: `${this.resource}/v1.0/groups`,
headers: {
'accept': 'application/json;odata.metadata=none'
},
responseType: 'json',
data: {
description: args.options.description,
displayName: args.options.displayName,
groupTypes: [
"Unified"
],
mailEnabled: true,
mailNickname: args.options.mailNickname,
resourceBehaviorOptions: resourceBehaviorOptionsCollection,
securityEnabled: false,
visibility: resolvedVisibility
}
};
try {
ownerIds = await this.getUserIds(logger, args.options.owners);
memberIds = await this.getUserIds(logger, args.options.members);
group = await request.post(requestOptions);
if (!args.options.logoPath) {
if (this.debug) {
await logger.logToStderr('logoPath not set. Skipping');
}
}
else {
const fullPath = path.resolve(args.options.logoPath);
if (this.verbose) {
await logger.logToStderr(`Setting group logo ${fullPath}...`);
}
const requestOptionsPhoto = {
url: `${this.resource}/v1.0/groups/${group.id}/photo/$value`,
headers: {
'content-type': this.getImageContentType(fullPath)
},
data: fs.readFileSync(fullPath)
};
await this.setGroupLogo(requestOptionsPhoto, EntraM365GroupAddCommand.numRepeat, logger);
}
if (ownerIds.length !== 0) {
await Promise.all(ownerIds.map(ownerId => request.post({
url: `${this.resource}/v1.0/groups/${group.id}/owners/$ref`,
headers: {
'content-type': 'application/json'
},
responseType: 'json',
data: {
"@odata.id": `https://graph.microsoft.com/v1.0/users/${ownerId}`
}
})));
}
if (memberIds.length !== 0) {
await Promise.all(memberIds.map(memberId => request.post({
url: `${this.resource}/v1.0/groups/${group.id}/members/$ref`,
headers: {
'content-type': 'application/json'
},
responseType: 'json',
data: {
"@odata.id": `https://graph.microsoft.com/v1.0/users/${memberId}`
}
})));
}
await logger.log(group);
}
catch (err) {
this.handleRejectedODataJsonPromise(err);
}
}
async getUserIds(logger, users) {
if (!users) {
if (this.debug) {
await logger.logToStderr('No users to validate, skipping.');
}
return [];
}
if (this.verbose) {
await logger.logToStderr('Retrieving user information.');
}
const userArr = users.split(',').map(o => o.trim());
let promises = [];
let userIds = [];
// eslint-disable-next-line @typescript-eslint/no-floating-promises
promises = userArr.map(user => {
const requestOptions = {
url: `${this.resource}/v1.0/users?$filter=userPrincipalName eq '${formatting.encodeQueryParameter(user)}'&$select=id,userPrincipalName`,
headers: {
'content-type': 'application/json'
},
responseType: 'json'
};
return request.get(requestOptions);
});
const usersRes = await Promise.all(promises);
let userUpns = [];
userUpns = usersRes.map(res => res.value[0]?.userPrincipalName);
userIds = usersRes.map(res => res.value[0]?.id);
// Find the members where no graph response was found
const invalidUsers = userArr.filter(user => !userUpns.some((upn) => upn?.toLowerCase() === user.toLowerCase()));
if (invalidUsers && invalidUsers.length > 0) {
throw `Cannot proceed with group creation. The following users provided are invalid : ${invalidUsers.join(',')}`;
}
return userIds;
}
async setGroupLogo(requestOptions, retryLeft, logger) {
try {
await request.put(requestOptions);
}
catch (err) {
if (--retryLeft > 0) {
await setTimeout(this.pollingInterval * (EntraM365GroupAddCommand.numRepeat - retryLeft));
await this.setGroupLogo(requestOptions, retryLeft, logger);
}
else {
throw err;
}
}
}
getImageContentType(imagePath) {
const extension = imagePath.substring(imagePath.lastIndexOf('.')).toLowerCase();
switch (extension) {
case '.png':
return 'image/png';
case '.gif':
return 'image/gif';
default:
return 'image/jpeg';
}
}
}
_EntraM365GroupAddCommand_instances = new WeakSet(), _EntraM365GroupAddCommand_initTelemetry = function _EntraM365GroupAddCommand_initTelemetry() {
this.telemetry.push((args) => {
Object.assign(this.telemetryProperties, {
description: typeof args.options.description !== 'undefined',
owners: typeof args.options.owners !== 'undefined',
members: typeof args.options.members !== 'undefined',
logoPath: typeof args.options.logoPath !== 'undefined',
visibility: typeof args.options.visibility !== 'undefined',
allowMembersToPost: !!args.options.allowMembersToPost,
hideGroupInOutlook: !!args.options.hideGroupInOutlook,
subscribeNewGroupMembers: !!args.options.subscribeNewGroupMembers,
welcomeEmailDisabled: !!args.options.welcomeEmailDisabled
});
});
}, _EntraM365GroupAddCommand_initOptions = function _EntraM365GroupAddCommand_initOptions() {
this.options.unshift({
option: '-n, --displayName <displayName>'
}, {
option: '-m, --mailNickname <mailNickname>'
}, {
option: '-d, --description [description]'
}, {
option: '--owners [owners]'
}, {
option: '--members [members]'
}, {
option: '--visibility [visibility]',
autocomplete: this.allowedVisibilities
}, {
option: '--allowMembersToPost [allowMembersToPost]',
autocomplete: ['true', 'false']
}, {
option: '--hideGroupInOutlook [hideGroupInOutlook]',
autocomplete: ['true', 'false']
}, {
option: '--subscribeNewGroupMembers [subscribeNewGroupMembers]',
autocomplete: ['true', 'false']
}, {
option: '--welcomeEmailDisabled [welcomeEmailDisabled]',
autocomplete: ['true', 'false']
}, {
option: '-l, --logoPath [logoPath]'
});
}, _EntraM365GroupAddCommand_initTypes = function _EntraM365GroupAddCommand_initTypes() {
this.types.string.push('displayName', 'mailNickname', 'description', 'owners', 'members', 'visibility', 'logoPath');
this.types.boolean.push('allowMembersToPost', 'hideGroupInOutlook', 'subscribeNewGroupMembers', 'welcomeEmailDisabled');
}, _EntraM365GroupAddCommand_initValidators = function _EntraM365GroupAddCommand_initValidators() {
this.validators.push(async (args) => {
if (args.options.owners) {
const owners = args.options.owners.split(',').map(o => o.trim());
for (let i = 0; i < owners.length; i++) {
if (owners[i].indexOf('@') < 0) {
return `${owners[i]} is not a valid userPrincipalName`;
}
}
}
if (args.options.members) {
const members = args.options.members.split(',').map(m => m.trim());
for (let i = 0; i < members.length; i++) {
if (members[i].indexOf('@') < 0) {
return `${members[i]} is not a valid userPrincipalName`;
}
}
}
if (args.options.mailNickname.indexOf(' ') !== -1) {
return 'The option mailNickname cannot contain spaces.';
}
if (args.options.logoPath) {
const fullPath = path.resolve(args.options.logoPath);
if (!fs.existsSync(fullPath)) {
return `File '${fullPath}' not found`;
}
if (fs.lstatSync(fullPath).isDirectory()) {
return `Path '${fullPath}' points to a directory`;
}
}
if (args.options.visibility && this.allowedVisibilities.map(x => x.toLowerCase()).indexOf(args.options.visibility.toLowerCase()) === -1) {
return `${args.options.visibility} is not a valid visibility. Allowed values are ${this.allowedVisibilities.join(', ')}`;
}
return true;
});
};
EntraM365GroupAddCommand.numRepeat = 15;
export default new EntraM365GroupAddCommand();
//# sourceMappingURL=m365group-add.js.map