@pnp/cli-microsoft365 7.11.0-beta.c513557 → 8.0.0-beta.630e741
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 +5 -2
- package/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/Auth.js +2 -10
- package/dist/AuthServer.js +10 -10
- package/dist/Command.js +10 -10
- package/dist/chili/chili.js +0 -23
- package/dist/chili/index.js +1 -1
- package/dist/cli/cli.js +12 -74
- package/dist/index.js +1 -1
- package/dist/m365/base/AnonymousCommand.js +1 -1
- package/dist/m365/base/DelegatedGraphCommand.js +2 -2
- package/dist/m365/base/PowerAppsCommand.js +2 -2
- package/dist/m365/base/PowerAutomateCommand.js +2 -2
- package/dist/m365/base/PowerBICommand.js +2 -2
- package/dist/m365/base/PowerPlatformCommand.js +2 -2
- package/dist/m365/base/VivaEngageCommand.js +2 -2
- package/dist/m365/cli/commands/cli-consent.js +1 -1
- package/dist/m365/commands/login.js +1 -1
- package/dist/m365/commands/logout.js +1 -1
- package/dist/m365/commands/setup.js +0 -4
- package/dist/m365/commands/status.js +1 -1
- package/dist/m365/connection/commands/connection-list.js +1 -1
- package/dist/m365/connection/commands/connection-remove.js +1 -1
- package/dist/m365/connection/commands/connection-set.js +1 -1
- package/dist/m365/connection/commands/connection-use.js +1 -1
- package/dist/m365/entra/commands/app/app-permission-add.js +21 -1
- package/dist/m365/entra/commands/app/app-permission-remove.js +17 -0
- package/dist/m365/entra/commands/m365group/m365group-add.js +1 -0
- package/dist/m365/entra/commands/m365group/m365group-user-list.js +1 -1
- package/dist/m365/external/commands/connection/connection-doctor.js +11 -25
- package/dist/m365/external/commands/connection/connection-schema-add.js +4 -4
- package/dist/m365/file/commands/file-copy.js +3 -3
- package/dist/m365/flow/commands/flow-list.js +21 -23
- package/dist/m365/pa/commands/app/app-export.js +1 -1
- package/dist/m365/pa/commands/app/app-owner-set.js +1 -1
- package/dist/m365/pp/commands/solution/solution-publish.js +1 -1
- package/dist/m365/purview/commands/threatassessment/threatassessment-list.js +1 -1
- package/dist/m365/spfx/commands/project/base-project-command.js +36 -126
- package/dist/m365/spfx/commands/project/project-azuredevops-pipeline-add.js +1 -1
- package/dist/m365/spfx/commands/project/project-externalize.js +1 -1
- package/dist/m365/spfx/commands/project/project-github-workflow-add.js +1 -1
- package/dist/m365/spfx/commands/spfx-doctor.js +4 -4
- package/dist/m365/spo/commands/cdn/cdn-get.js +12 -15
- package/dist/m365/spo/commands/cdn/cdn-set.js +6 -4
- package/dist/m365/spo/commands/commandset/commandset-get.js +1 -1
- package/dist/m365/spo/commands/contenttype/contenttype-field-list.js +124 -0
- package/dist/m365/spo/commands/field/field-list.js +1 -1
- package/dist/m365/spo/commands/file/file-retentionlabel-remove.js +1 -1
- package/dist/m365/spo/commands/group/group-member-add.js +103 -99
- package/dist/m365/spo/commands/group/group-member-remove.js +2 -2
- package/dist/m365/spo/commands/list/list-retentionlabel-ensure.js +1 -1
- package/dist/m365/spo/commands/listitem/listitem-batch-remove.js +1 -1
- package/dist/m365/spo/commands/listitem/listitem-retentionlabel-ensure.js +2 -2
- package/dist/m365/spo/commands/listitem/listitem-retentionlabel-remove.js +2 -2
- package/dist/m365/spo/commands/page/page-clientsidewebpart-add.js +2 -3
- package/dist/m365/spo/commands/page/page-text-add.js +2 -3
- package/dist/m365/spo/commands/site/site-commsite-enable.js +1 -1
- package/dist/m365/spo/commands/spo-search.js +4 -5
- package/dist/m365/spo/commands/tenant/tenant-applicationcustomizer-set.js +4 -4
- package/dist/m365/spo/commands/tenant/tenant-commandset-set.js +2 -2
- package/dist/m365/spo/commands/user/user-ensure.js +1 -1
- package/dist/m365/spo/commands.js +1 -0
- package/dist/m365/teams/commands/chat/chat-member-add.js +1 -1
- package/dist/m365/teams/commands/meeting/meeting-attendancereport-get.js +119 -0
- package/dist/m365/teams/commands/meeting/meeting-list.js +1 -1
- package/dist/m365/teams/commands.js +1 -0
- package/dist/m365/viva/commands/engage/engage-community-get.js +1 -1
- package/dist/request.js +13 -14
- package/dist/utils/formatting.js +14 -1
- package/dist/utils/spo.js +5 -5
- package/dist/utils/validation.js +25 -0
- package/docs/docs/cmd/external/connection/connection-doctor.mdx +9 -9
- package/docs/docs/cmd/flow/flow-list.mdx +114 -56
- package/docs/docs/cmd/spo/cdn/cdn-set.mdx +3 -3
- package/docs/docs/cmd/spo/contenttype/contenttype-field-list.mdx +172 -0
- package/docs/docs/cmd/spo/field/field-list.mdx +3 -3
- package/docs/docs/cmd/spo/group/group-member-add.mdx +34 -27
- package/docs/docs/cmd/teams/meeting/meeting-attendancereport-get.mdx +138 -0
- package/npm-shrinkwrap.json +809 -803
- package/package.json +13 -13
|
@@ -76,7 +76,7 @@ class SpoTenantApplicationCustomizerSetCommand extends SpoCommand {
|
|
|
76
76
|
}
|
|
77
77
|
async getComponentManifest(appCatalogUrl, clientSideComponentId, logger) {
|
|
78
78
|
if (this.verbose) {
|
|
79
|
-
logger.logToStderr('Retrieving component manifest item from the ComponentManifests list on the app catalog site so that we get the solution id');
|
|
79
|
+
await logger.logToStderr('Retrieving component manifest item from the ComponentManifests list on the app catalog site so that we get the solution id');
|
|
80
80
|
}
|
|
81
81
|
const camlQuery = `<View><ViewFields><FieldRef Name='ClientComponentId'></FieldRef><FieldRef Name='SolutionId'></FieldRef><FieldRef Name='ClientComponentManifest'></FieldRef></ViewFields><Query><Where><Eq><FieldRef Name='ClientComponentId' /><Value Type='Guid'>${clientSideComponentId}</Value></Eq></Where></Query></View>`;
|
|
82
82
|
const commandOptions = {
|
|
@@ -89,7 +89,7 @@ class SpoTenantApplicationCustomizerSetCommand extends SpoCommand {
|
|
|
89
89
|
};
|
|
90
90
|
const output = await cli.executeCommandWithOutput(spoListItemListCommand, { options: { ...commandOptions, _: [] } });
|
|
91
91
|
if (this.verbose) {
|
|
92
|
-
logger.logToStderr(output.stderr);
|
|
92
|
+
await logger.logToStderr(output.stderr);
|
|
93
93
|
}
|
|
94
94
|
const outputParsed = JSON.parse(output.stdout);
|
|
95
95
|
if (outputParsed.length === 0) {
|
|
@@ -99,7 +99,7 @@ class SpoTenantApplicationCustomizerSetCommand extends SpoCommand {
|
|
|
99
99
|
}
|
|
100
100
|
async getSolutionFromAppCatalog(appCatalogUrl, solutionId, logger) {
|
|
101
101
|
if (this.verbose) {
|
|
102
|
-
logger.logToStderr(`Retrieving solution with id ${solutionId} from the application catalog`);
|
|
102
|
+
await logger.logToStderr(`Retrieving solution with id ${solutionId} from the application catalog`);
|
|
103
103
|
}
|
|
104
104
|
const camlQuery = `<View><ViewFields><FieldRef Name='SkipFeatureDeployment'></FieldRef><FieldRef Name='ContainsTenantWideExtension'></FieldRef></ViewFields><Query><Where><Eq><FieldRef Name='AppProductID' /><Value Type='Guid'>${solutionId}</Value></Eq></Where></Query></View>`;
|
|
105
105
|
const commandOptions = {
|
|
@@ -112,7 +112,7 @@ class SpoTenantApplicationCustomizerSetCommand extends SpoCommand {
|
|
|
112
112
|
};
|
|
113
113
|
const output = await cli.executeCommandWithOutput(spoListItemListCommand, { options: { ...commandOptions, _: [] } });
|
|
114
114
|
if (this.verbose) {
|
|
115
|
-
logger.logToStderr(output.stderr);
|
|
115
|
+
await logger.logToStderr(output.stderr);
|
|
116
116
|
}
|
|
117
117
|
const outputParsed = JSON.parse(output.stdout);
|
|
118
118
|
if (outputParsed.length === 0) {
|
|
@@ -44,7 +44,7 @@ class SpoTenantCommandSetSetCommand extends SpoCommand {
|
|
|
44
44
|
}
|
|
45
45
|
async getListItemById(logger, webUrl, listServerRelativeUrl, id) {
|
|
46
46
|
if (this.verbose) {
|
|
47
|
-
logger.logToStderr(`Getting the list item by id ${id}`);
|
|
47
|
+
await logger.logToStderr(`Getting the list item by id ${id}`);
|
|
48
48
|
}
|
|
49
49
|
const reqOptions = {
|
|
50
50
|
url: `${webUrl}/_api/web/GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')/Items(${id})`,
|
|
@@ -57,7 +57,7 @@ class SpoTenantCommandSetSetCommand extends SpoCommand {
|
|
|
57
57
|
}
|
|
58
58
|
async updateTenantWideExtension(appCatalogUrl, options, listServerRelativeUrl, logger) {
|
|
59
59
|
if (this.verbose) {
|
|
60
|
-
logger.logToStderr('Updating tenant wide extension to the TenantWideExtensions list');
|
|
60
|
+
await logger.logToStderr('Updating tenant wide extension to the TenantWideExtensions list');
|
|
61
61
|
}
|
|
62
62
|
const formValues = [];
|
|
63
63
|
if (options.newTitle !== undefined) {
|
|
@@ -27,7 +27,7 @@ class SpoUserEnsureCommand extends SpoCommand {
|
|
|
27
27
|
async commandAction(logger, args) {
|
|
28
28
|
if (args.options.aadId) {
|
|
29
29
|
args.options.entraId = args.options.aadId;
|
|
30
|
-
this.warn(logger, `Option 'aadId' is deprecated. Please use 'entraId' instead`);
|
|
30
|
+
await this.warn(logger, `Option 'aadId' is deprecated. Please use 'entraId' instead`);
|
|
31
31
|
}
|
|
32
32
|
if (this.verbose) {
|
|
33
33
|
await logger.logToStderr(`Ensuring user ${args.options.entraId || args.options.userName} at site ${args.options.webUrl}`);
|
|
@@ -31,6 +31,7 @@ export default {
|
|
|
31
31
|
COMMANDSET_REMOVE: `${prefix} commandset remove`,
|
|
32
32
|
COMMANDSET_SET: `${prefix} commandset set`,
|
|
33
33
|
CONTENTTYPE_ADD: `${prefix} contenttype add`,
|
|
34
|
+
CONTENTTYPE_FIELD_LIST: `${prefix} contenttype field list`,
|
|
34
35
|
CONTENTTYPE_FIELD_REMOVE: `${prefix} contenttype field remove`,
|
|
35
36
|
CONTENTTYPE_FIELD_SET: `${prefix} contenttype field set`,
|
|
36
37
|
CONTENTTYPE_GET: `${prefix} contenttype get`,
|
|
@@ -27,7 +27,7 @@ class TeamsChatMemberAddCommand extends GraphCommand {
|
|
|
27
27
|
async commandAction(logger, args) {
|
|
28
28
|
try {
|
|
29
29
|
if (this.verbose) {
|
|
30
|
-
logger.logToStderr(`Adding member ${args.options.userId || args.options.userName} to chat with id ${args.options.chatId}...`);
|
|
30
|
+
await logger.logToStderr(`Adding member ${args.options.userId || args.options.userName} to chat with id ${args.options.chatId}...`);
|
|
31
31
|
}
|
|
32
32
|
const chatMemberAddOptions = {
|
|
33
33
|
url: `${this.resource}/v1.0/chats/${args.options.chatId}/members`,
|
|
@@ -0,0 +1,119 @@
|
|
|
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 _TeamsMeetingAttendancereportGetCommand_instances, _TeamsMeetingAttendancereportGetCommand_initTelemetry, _TeamsMeetingAttendancereportGetCommand_initOptions, _TeamsMeetingAttendancereportGetCommand_initTypes, _TeamsMeetingAttendancereportGetCommand_initValidators, _TeamsMeetingAttendancereportGetCommand_initOptionSets;
|
|
7
|
+
import auth from '../../../../Auth.js';
|
|
8
|
+
import { accessToken } from '../../../../utils/accessToken.js';
|
|
9
|
+
import { validation } from '../../../../utils/validation.js';
|
|
10
|
+
import GraphCommand from "../../../base/GraphCommand.js";
|
|
11
|
+
import commands from '../../commands.js';
|
|
12
|
+
import { entraUser } from '../../../../utils/entraUser.js';
|
|
13
|
+
import request from '../../../../request.js';
|
|
14
|
+
class TeamsMeetingAttendancereportGetCommand extends GraphCommand {
|
|
15
|
+
get name() {
|
|
16
|
+
return commands.MEETING_ATTENDANCEREPORT_GET;
|
|
17
|
+
}
|
|
18
|
+
get description() {
|
|
19
|
+
return 'Gets attendance report for a given meeting';
|
|
20
|
+
}
|
|
21
|
+
constructor() {
|
|
22
|
+
super();
|
|
23
|
+
_TeamsMeetingAttendancereportGetCommand_instances.add(this);
|
|
24
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initTelemetry).call(this);
|
|
25
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initOptions).call(this);
|
|
26
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initTypes).call(this);
|
|
27
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initValidators).call(this);
|
|
28
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initOptionSets).call(this);
|
|
29
|
+
}
|
|
30
|
+
async commandAction(logger, args) {
|
|
31
|
+
try {
|
|
32
|
+
const isAppOnlyAccessToken = accessToken.isAppOnlyAccessToken(auth.connection.accessTokens[auth.defaultResource].accessToken);
|
|
33
|
+
if (isAppOnlyAccessToken && !args.options.userId && !args.options.userName && !args.options.email) {
|
|
34
|
+
throw `The option 'userId', 'userName' or 'email' is required when retrieving meeting attendance report using app only permissions.`;
|
|
35
|
+
}
|
|
36
|
+
else if (!isAppOnlyAccessToken && (args.options.userId || args.options.userName || args.options.email)) {
|
|
37
|
+
throw `The options 'userId', 'userName' and 'email' cannot be used when retrieving meeting attendance report using delegated permissions.`;
|
|
38
|
+
}
|
|
39
|
+
if (this.verbose) {
|
|
40
|
+
await logger.logToStderr(`Retrieving attendance report for ${isAppOnlyAccessToken ? `specific user ${args.options.userId || args.options.userName || args.options.email}.` : 'currently logged in user'}.`);
|
|
41
|
+
}
|
|
42
|
+
let userUrl = '';
|
|
43
|
+
if (isAppOnlyAccessToken) {
|
|
44
|
+
const userId = await this.getUserId(args.options);
|
|
45
|
+
userUrl += `users/${userId}`;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
userUrl += 'me';
|
|
49
|
+
}
|
|
50
|
+
const requestOptions = {
|
|
51
|
+
url: `${this.resource}/v1.0/${userUrl}/onlineMeetings/${args.options.meetingId}/attendanceReports/${args.options.id}?$expand=attendanceRecords`,
|
|
52
|
+
headers: {
|
|
53
|
+
accept: 'application/json;odata.metadata=none'
|
|
54
|
+
},
|
|
55
|
+
responseType: 'json'
|
|
56
|
+
};
|
|
57
|
+
const attendanceReport = await request.get(requestOptions);
|
|
58
|
+
await logger.log(attendanceReport);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
this.handleRejectedODataJsonPromise(err);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async getUserId(options) {
|
|
65
|
+
if (options.userId) {
|
|
66
|
+
return options.userId;
|
|
67
|
+
}
|
|
68
|
+
if (options.userName) {
|
|
69
|
+
return entraUser.getUserIdByUpn(options.userName);
|
|
70
|
+
}
|
|
71
|
+
return entraUser.getUserIdByEmail(options.email);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
_TeamsMeetingAttendancereportGetCommand_instances = new WeakSet(), _TeamsMeetingAttendancereportGetCommand_initTelemetry = function _TeamsMeetingAttendancereportGetCommand_initTelemetry() {
|
|
75
|
+
this.telemetry.push((args) => {
|
|
76
|
+
Object.assign(this.telemetryProperties, {
|
|
77
|
+
userId: typeof args.options.userId !== 'undefined',
|
|
78
|
+
userName: typeof args.options.userName !== 'undefined',
|
|
79
|
+
email: typeof args.options.email !== 'undefined'
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}, _TeamsMeetingAttendancereportGetCommand_initOptions = function _TeamsMeetingAttendancereportGetCommand_initOptions() {
|
|
83
|
+
this.options.unshift({
|
|
84
|
+
option: '-u, --userId [userId]'
|
|
85
|
+
}, {
|
|
86
|
+
option: '-n, --userName [userName]'
|
|
87
|
+
}, {
|
|
88
|
+
option: '--email [email]'
|
|
89
|
+
}, {
|
|
90
|
+
option: '-m, --meetingId <meetingId>'
|
|
91
|
+
}, {
|
|
92
|
+
option: '-i, --id <id>'
|
|
93
|
+
});
|
|
94
|
+
}, _TeamsMeetingAttendancereportGetCommand_initTypes = function _TeamsMeetingAttendancereportGetCommand_initTypes() {
|
|
95
|
+
this.types.string.push('userId', 'userName', 'email', 'meetingId', 'id');
|
|
96
|
+
}, _TeamsMeetingAttendancereportGetCommand_initValidators = function _TeamsMeetingAttendancereportGetCommand_initValidators() {
|
|
97
|
+
this.validators.push(async (args) => {
|
|
98
|
+
if (!validation.isValidGuid(args.options.id)) {
|
|
99
|
+
return `${args.options.id} is not a valid GUID for option 'id'.`;
|
|
100
|
+
}
|
|
101
|
+
if (args.options.userId && !validation.isValidGuid(args.options.userId)) {
|
|
102
|
+
return `${args.options.userId} is not a valid GUID for option 'userId'.`;
|
|
103
|
+
}
|
|
104
|
+
if (args.options.userName && !validation.isValidUserPrincipalName(args.options.userName)) {
|
|
105
|
+
return `${args.options.userName} is not a valid UPN.`;
|
|
106
|
+
}
|
|
107
|
+
if (args.options.email && !validation.isValidUserPrincipalName(args.options.email)) {
|
|
108
|
+
return `${args.options.email} is not a valid email.`;
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
});
|
|
112
|
+
}, _TeamsMeetingAttendancereportGetCommand_initOptionSets = function _TeamsMeetingAttendancereportGetCommand_initOptionSets() {
|
|
113
|
+
this.optionSets.push({
|
|
114
|
+
options: ['userId', 'userName', 'email'],
|
|
115
|
+
runsWhen: (args) => args.options.userId || args.options.userName || args.options.email
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
export default new TeamsMeetingAttendancereportGetCommand();
|
|
119
|
+
//# sourceMappingURL=meeting-attendancereport-get.js.map
|
|
@@ -90,7 +90,7 @@ class TeamsMeetingListCommand extends GraphCommand {
|
|
|
90
90
|
let result = [];
|
|
91
91
|
for (let i = 0; i < meetingUrls.length; i += 20) {
|
|
92
92
|
if (this.verbose) {
|
|
93
|
-
logger.logToStderr(`Retrieving meetings ${i + 1}-${Math.min(i + 20, meetingUrls.length)}...`);
|
|
93
|
+
await logger.logToStderr(`Retrieving meetings ${i + 1}-${Math.min(i + 20, meetingUrls.length)}...`);
|
|
94
94
|
}
|
|
95
95
|
const batch = meetingUrls.slice(i, i + 20);
|
|
96
96
|
const requestOptions = {
|
|
@@ -30,6 +30,7 @@ export default {
|
|
|
30
30
|
MEETING_ADD: `${prefix} meeting add`,
|
|
31
31
|
MEETING_GET: `${prefix} meeting get`,
|
|
32
32
|
MEETING_LIST: `${prefix} meeting list`,
|
|
33
|
+
MEETING_ATTENDANCEREPORT_GET: `${prefix} meeting attendancereport get`,
|
|
33
34
|
MEETING_ATTENDANCEREPORT_LIST: `${prefix} meeting attendancereport list`,
|
|
34
35
|
MEETING_TRANSCRIPT_LIST: `${prefix} meeting transcript list`,
|
|
35
36
|
MEMBERSETTINGS_LIST: `${prefix} membersettings list`,
|
|
@@ -22,7 +22,7 @@ class VivaEngageCommunityGetCommand extends GraphCommand {
|
|
|
22
22
|
}
|
|
23
23
|
async commandAction(logger, args) {
|
|
24
24
|
if (this.verbose) {
|
|
25
|
-
logger.logToStderr(`Getting the information of Viva Engage community with id '${args.options.id}'...`);
|
|
25
|
+
await logger.logToStderr(`Getting the information of Viva Engage community with id '${args.options.id}'...`);
|
|
26
26
|
}
|
|
27
27
|
const requestOptions = {
|
|
28
28
|
url: `${this.resource}/beta/employeeExperience/communities/${args.options.id}`,
|
package/dist/request.js
CHANGED
|
@@ -14,39 +14,39 @@ class Request {
|
|
|
14
14
|
}
|
|
15
15
|
this._debug = debug;
|
|
16
16
|
if (this._debug) {
|
|
17
|
-
this.req.interceptors.request.use(config => {
|
|
17
|
+
this.req.interceptors.request.use(async (config) => {
|
|
18
18
|
if (this._logger) {
|
|
19
|
-
this._logger.logToStderr('Request:');
|
|
19
|
+
await this._logger.logToStderr('Request:');
|
|
20
20
|
const properties = ['url', 'method', 'headers', 'responseType', 'decompress'];
|
|
21
21
|
if (config.responseType !== 'stream') {
|
|
22
22
|
properties.push('data');
|
|
23
23
|
}
|
|
24
|
-
this._logger.logToStderr(JSON.stringify(formatting.filterObject(config, properties), null, 2));
|
|
24
|
+
await this._logger.logToStderr(JSON.stringify(formatting.filterObject(config, properties), null, 2));
|
|
25
25
|
}
|
|
26
26
|
return config;
|
|
27
27
|
});
|
|
28
28
|
// since we're stubbing requests, response interceptor is never called in
|
|
29
29
|
// tests, so let's exclude it from coverage
|
|
30
30
|
/* c8 ignore next 26 */
|
|
31
|
-
this.req.interceptors.response.use((response) => {
|
|
31
|
+
this.req.interceptors.response.use(async (response) => {
|
|
32
32
|
if (this._logger) {
|
|
33
|
-
this._logger.logToStderr('Response:');
|
|
33
|
+
await this._logger.logToStderr('Response:');
|
|
34
34
|
const properties = ['status', 'statusText', 'headers'];
|
|
35
35
|
if (response.headers['content-type'] &&
|
|
36
36
|
response.headers['content-type'].indexOf('json') > -1) {
|
|
37
37
|
properties.push('data');
|
|
38
38
|
}
|
|
39
|
-
this._logger.logToStderr(JSON.stringify({
|
|
39
|
+
await this._logger.logToStderr(JSON.stringify({
|
|
40
40
|
url: response.config.url,
|
|
41
41
|
...formatting.filterObject(response, properties)
|
|
42
42
|
}, null, 2));
|
|
43
43
|
}
|
|
44
44
|
return response;
|
|
45
|
-
}, (error) => {
|
|
45
|
+
}, async (error) => {
|
|
46
46
|
if (this._logger) {
|
|
47
47
|
const properties = ['status', 'statusText', 'headers'];
|
|
48
|
-
this._logger.logToStderr('Request error:');
|
|
49
|
-
this._logger.logToStderr(JSON.stringify({
|
|
48
|
+
await this._logger.logToStderr('Request error:');
|
|
49
|
+
await this._logger.logToStderr(JSON.stringify({
|
|
50
50
|
url: error.config?.url,
|
|
51
51
|
...formatting.filterObject(error.response, properties),
|
|
52
52
|
error: error.error
|
|
@@ -169,7 +169,7 @@ class Request {
|
|
|
169
169
|
timings.api.push(Number(end - start));
|
|
170
170
|
_resolve((options.responseType === 'stream' || options.fullResponse) ? res : res.data);
|
|
171
171
|
}
|
|
172
|
-
}, (error) => {
|
|
172
|
+
}, async (error) => {
|
|
173
173
|
if (error && error.response &&
|
|
174
174
|
(error.response.status === 429 ||
|
|
175
175
|
error.response.status === 503)) {
|
|
@@ -178,11 +178,10 @@ class Request {
|
|
|
178
178
|
retryAfter = 10;
|
|
179
179
|
}
|
|
180
180
|
if (this._debug) {
|
|
181
|
-
this._logger.log(`Request throttled. Waiting ${retryAfter}sec before retrying...`);
|
|
181
|
+
await this._logger.log(`Request throttled. Waiting ${retryAfter}sec before retrying...`);
|
|
182
182
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}, retryAfter * 1000);
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
184
|
+
setTimeout(async () => { this.execute(options, resolve || _resolve, reject || _reject); }, retryAfter * 1000);
|
|
186
185
|
}
|
|
187
186
|
else {
|
|
188
187
|
if (reject) {
|
package/dist/utils/formatting.js
CHANGED
|
@@ -9,6 +9,8 @@ export var CheckStatus;
|
|
|
9
9
|
(function (CheckStatus) {
|
|
10
10
|
CheckStatus[CheckStatus["Success"] = 0] = "Success";
|
|
11
11
|
CheckStatus[CheckStatus["Failure"] = 1] = "Failure";
|
|
12
|
+
CheckStatus[CheckStatus["Information"] = 2] = "Information";
|
|
13
|
+
CheckStatus[CheckStatus["Warning"] = 3] = "Warning";
|
|
12
14
|
})(CheckStatus || (CheckStatus = {}));
|
|
13
15
|
export const formatting = {
|
|
14
16
|
escapeXml(s) {
|
|
@@ -152,7 +154,18 @@ export const formatting = {
|
|
|
152
154
|
process.env.TERM === 'xterm-256color';
|
|
153
155
|
const success = primarySupported ? '✔' : '√';
|
|
154
156
|
const failure = primarySupported ? '✖' : '×';
|
|
155
|
-
|
|
157
|
+
const information = 'i';
|
|
158
|
+
const warning = '!';
|
|
159
|
+
switch (result) {
|
|
160
|
+
case CheckStatus.Success:
|
|
161
|
+
return `${chalk.green(success)} ${message}`;
|
|
162
|
+
case CheckStatus.Failure:
|
|
163
|
+
return `${chalk.red(failure)} ${message}`;
|
|
164
|
+
case CheckStatus.Information:
|
|
165
|
+
return `${chalk.blue(information)} ${message}`;
|
|
166
|
+
case CheckStatus.Warning:
|
|
167
|
+
return `${chalk.yellow(warning)} ${message}`;
|
|
168
|
+
}
|
|
156
169
|
},
|
|
157
170
|
convertArrayToHashTable(key, array) {
|
|
158
171
|
const resultAsKeyValuePair = {};
|
package/dist/utils/spo.js
CHANGED
|
@@ -1173,7 +1173,7 @@ export const spo = {
|
|
|
1173
1173
|
*/
|
|
1174
1174
|
async getFileAsListItemByUrl(absoluteListUrl, url, logger, verbose) {
|
|
1175
1175
|
if (verbose && logger) {
|
|
1176
|
-
logger.logToStderr(`Getting the file properties with url ${url}`);
|
|
1176
|
+
await logger.logToStderr(`Getting the file properties with url ${url}`);
|
|
1177
1177
|
}
|
|
1178
1178
|
const serverRelativePath = urlUtil.getServerRelativePath(absoluteListUrl, url);
|
|
1179
1179
|
const requestUrl = `${absoluteListUrl}/_api/web/GetFileByServerRelativePath(DecodedUrl=@f)?$expand=ListItemAllFields&@f='${formatting.encodeQueryParameter(serverRelativePath)}'`;
|
|
@@ -1206,7 +1206,7 @@ export const spo = {
|
|
|
1206
1206
|
const serverRelativeSiteMatch = absoluteListUrl.match(new RegExp('/sites/[^/]+'));
|
|
1207
1207
|
const webUrl = `${parsedUrl.protocol}//${parsedUrl.host}${serverRelativeSiteMatch ?? ''}`;
|
|
1208
1208
|
if (verbose && logger) {
|
|
1209
|
-
logger.logToStderr(`Getting list id...`);
|
|
1209
|
+
await logger.logToStderr(`Getting list id...`);
|
|
1210
1210
|
}
|
|
1211
1211
|
const listRequestOptions = {
|
|
1212
1212
|
url: `${absoluteListUrl}?$select=Id`,
|
|
@@ -1218,7 +1218,7 @@ export const spo = {
|
|
|
1218
1218
|
const list = await request.get(listRequestOptions);
|
|
1219
1219
|
const listId = list.Id;
|
|
1220
1220
|
if (verbose && logger) {
|
|
1221
|
-
logger.logToStderr(`Getting request digest for systemUpdate request`);
|
|
1221
|
+
await logger.logToStderr(`Getting request digest for systemUpdate request`);
|
|
1222
1222
|
}
|
|
1223
1223
|
const res = await spo.getRequestDigest(webUrl);
|
|
1224
1224
|
const formDigestValue = res.FormDigestValue;
|
|
@@ -1361,7 +1361,7 @@ export const spo = {
|
|
|
1361
1361
|
*/
|
|
1362
1362
|
async getSiteId(webUrl, logger, verbose) {
|
|
1363
1363
|
if (verbose && logger) {
|
|
1364
|
-
logger.logToStderr(`Getting site id for URL: ${webUrl}...`);
|
|
1364
|
+
await logger.logToStderr(`Getting site id for URL: ${webUrl}...`);
|
|
1365
1365
|
}
|
|
1366
1366
|
const url = new URL(webUrl);
|
|
1367
1367
|
const requestOptions = {
|
|
@@ -1393,7 +1393,7 @@ export const spo = {
|
|
|
1393
1393
|
};
|
|
1394
1394
|
const response = await request.post(requestOptions);
|
|
1395
1395
|
if (verbose) {
|
|
1396
|
-
logger.logToStderr('Attempt to get _ObjectIdentity_ key values');
|
|
1396
|
+
await logger.logToStderr('Attempt to get _ObjectIdentity_ key values');
|
|
1397
1397
|
}
|
|
1398
1398
|
const json = JSON.parse(response);
|
|
1399
1399
|
const contents = json.find(x => { return x.ErrorInfo; });
|
package/dist/utils/validation.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatting } from "./formatting.js";
|
|
1
2
|
export const validation = {
|
|
2
3
|
isValidGuidArray(guidsString) {
|
|
3
4
|
const guids = guidsString.split(',').map(guid => guid.trim());
|
|
@@ -33,6 +34,24 @@ export const validation = {
|
|
|
33
34
|
// verify if the upn is a valid upn. @meusername will be replaced in a later stage with the actual username of the logged in user
|
|
34
35
|
return upnRegEx.test(upn) || upn.toLowerCase().trim() === '@meusername';
|
|
35
36
|
},
|
|
37
|
+
/**
|
|
38
|
+
* Validates if the provided number is a valid positive integer (1 or higher).
|
|
39
|
+
* @param integer Integer value.
|
|
40
|
+
* @returns True if integer, false otherwise.
|
|
41
|
+
*/
|
|
42
|
+
isValidPositiveInteger(integer) {
|
|
43
|
+
return !isNaN(Number(integer)) && Number.isInteger(+integer) && +integer > 0;
|
|
44
|
+
},
|
|
45
|
+
/**
|
|
46
|
+
* Validates an array of integers. The integers must be positive (1 or higher).
|
|
47
|
+
* @param integerString Comma-separated string of integers.
|
|
48
|
+
* @returns True if the integers are valid, an error message with the invalid integers otherwise.
|
|
49
|
+
*/
|
|
50
|
+
isValidPositiveIntegerArray(integerString) {
|
|
51
|
+
const integers = formatting.splitAndTrim(integerString);
|
|
52
|
+
const invalidIntegers = integers.filter(integer => !this.isValidPositiveInteger(integer));
|
|
53
|
+
return invalidIntegers.length > 0 ? invalidIntegers.join(', ') : true;
|
|
54
|
+
},
|
|
36
55
|
isDateInRange(date, monthOffset) {
|
|
37
56
|
const d = new Date(date);
|
|
38
57
|
const cutoffDate = new Date();
|
|
@@ -332,6 +351,12 @@ export const validation = {
|
|
|
332
351
|
isValidISODuration(duration) {
|
|
333
352
|
const durationRegEx = new RegExp(/^P(?!$)((\d+Y)|(\d+\.\d+Y$))?((\d+M)|(\d+\.\d+M$))?((\d+W)|(\d+\.\d+W$))?((\d+D)|(\d+\.\d+D$))?(T(?=\d)((\d+H)|(\d+\.\d+H$))?((\d+M)|(\d+\.\d+M$))?(\d+(\.\d+)?S)?)??$/);
|
|
334
353
|
return durationRegEx.test(duration);
|
|
354
|
+
},
|
|
355
|
+
isValidPermission(permissions) {
|
|
356
|
+
const invalidPermissions = permissions
|
|
357
|
+
.split(' ')
|
|
358
|
+
.filter(permission => permission.indexOf('/') < 0);
|
|
359
|
+
return invalidPermissions.length > 0 ? invalidPermissions : true;
|
|
335
360
|
}
|
|
336
361
|
};
|
|
337
362
|
//# sourceMappingURL=validation.js.map
|
|
@@ -126,15 +126,15 @@ m365 external connection doctor --id contosoproducts --ux copilot
|
|
|
126
126
|
<TabItem value="Text">
|
|
127
127
|
|
|
128
128
|
```text
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
129
|
+
√ Load connection
|
|
130
|
+
√ Load schema
|
|
131
|
+
× Required semantic labels: Missing label iconUrl
|
|
132
|
+
√ Searchable properties
|
|
133
|
+
√ Items have content ingested
|
|
134
|
+
i Connection configured for inline results (manual)
|
|
135
|
+
i Items have activities recorded (manual)
|
|
136
|
+
i Meaningful connection name and description (manual)
|
|
137
|
+
√ urlToItemResolver configured
|
|
138
138
|
```
|
|
139
139
|
|
|
140
140
|
</TabItem>
|