@pnp/cli-microsoft365 10.6.0-beta.36bb898 → 10.6.0-beta.55e3c97

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/dist/Command.js CHANGED
@@ -15,6 +15,7 @@ import { accessToken } from './utils/accessToken.js';
15
15
  import { md } from './utils/md.js';
16
16
  import { prompt } from './utils/prompt.js';
17
17
  import { zod } from './utils/zod.js';
18
+ import { optionsUtils } from './utils/optionsUtils.js';
18
19
  export class CommandError {
19
20
  constructor(message, code) {
20
21
  this.message = message;
@@ -337,39 +338,16 @@ class Command {
337
338
  }
338
339
  await telemetry.trackEvent(this.getUsedCommandName(), this.getTelemetryProperties(args));
339
340
  }
340
- getUnknownOptions(options) {
341
- const unknownOptions = JSON.parse(JSON.stringify(options));
342
- // remove minimist catch-all option
343
- delete unknownOptions._;
344
- const knownOptions = this.options;
345
- const longOptionRegex = /--([^\s]+)/;
346
- const shortOptionRegex = /-([a-z])\b/;
347
- knownOptions.forEach(o => {
348
- const longOptionName = longOptionRegex.exec(o.option)[1];
349
- delete unknownOptions[longOptionName];
350
- // short names are optional so we need to check if the current command has
351
- // one before continuing
352
- const shortOptionMatch = shortOptionRegex.exec(o.option);
353
- if (shortOptionMatch) {
354
- const shortOptionName = shortOptionMatch[1];
355
- delete unknownOptions[shortOptionName];
356
- }
357
- });
358
- return unknownOptions;
359
- }
360
341
  trackUnknownOptions(telemetryProps, options) {
361
- const unknownOptions = this.getUnknownOptions(options);
342
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
362
343
  const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
363
344
  unknownOptionsNames.forEach(o => {
364
345
  telemetryProps[o] = true;
365
346
  });
366
347
  }
367
348
  addUnknownOptionsToPayload(payload, options) {
368
- const unknownOptions = this.getUnknownOptions(options);
369
- const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
370
- unknownOptionsNames.forEach(o => {
371
- payload[o] = unknownOptions[o];
372
- });
349
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
350
+ optionsUtils.addUnknownOptionsToPayload(payload, unknownOptions);
373
351
  }
374
352
  loadValuesFromAccessToken(args) {
375
353
  if (!auth.connection.accessTokens[auth.defaultResource]) {
package/dist/config.js CHANGED
@@ -29,6 +29,7 @@ export default {
29
29
  'https://graph.microsoft.com/OnlineMeetingArtifact.Read.All',
30
30
  'https://graph.microsoft.com/OnlineMeetings.ReadWrite',
31
31
  'https://graph.microsoft.com/OnlineMeetingTranscript.Read.All',
32
+ 'https://graph.microsoft.com/Organization.ReadWrite.All',
32
33
  'https://graph.microsoft.com/PeopleSettings.ReadWrite.All',
33
34
  'https://graph.microsoft.com/Place.Read.All',
34
35
  'https://graph.microsoft.com/Policy.Read.All',
@@ -7,6 +7,7 @@ var _AdaptiveCardSendCommand_instances, _AdaptiveCardSendCommand_initTelemetry,
7
7
  import request from '../../../request.js';
8
8
  import AnonymousCommand from '../../base/AnonymousCommand.js';
9
9
  import commands from '../commands.js';
10
+ import { optionsUtils } from '../../../utils/optionsUtils.js';
10
11
  class AdaptiveCardSendCommand extends AnonymousCommand {
11
12
  get name() {
12
13
  return commands.SEND;
@@ -26,7 +27,7 @@ class AdaptiveCardSendCommand extends AnonymousCommand {
26
27
  return true;
27
28
  }
28
29
  async commandAction(logger, args) {
29
- const unknownOptions = this.getUnknownOptions(args.options);
30
+ const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
30
31
  const unknownOptionNames = Object.getOwnPropertyNames(unknownOptions);
31
32
  const card = await this.getCard(args, unknownOptionNames, unknownOptions);
32
33
  const requestOptions = {
@@ -1,6 +1,7 @@
1
1
  import { createRequire } from 'module';
2
2
  import auth, { AuthType } from '../../Auth.js';
3
3
  import Command, { CommandError } from '../../Command.js';
4
+ import { optionsUtils } from '../../utils/optionsUtils.js';
4
5
  const require = createRequire(import.meta.url);
5
6
  const csomDefs = require('../../../csom.json');
6
7
  export default class SpoCommand extends Command {
@@ -70,7 +71,7 @@ export default class SpoCommand extends Command {
70
71
  }
71
72
  }
72
73
  validateUnknownCsomOptions(options, csomObject, csomPropertyType) {
73
- const unknownOptions = this.getUnknownOptions(options);
74
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
74
75
  const optionNames = Object.getOwnPropertyNames(unknownOptions);
75
76
  if (optionNames.length === 0) {
76
77
  return true;
@@ -36,11 +36,7 @@ class RequestCommand extends Command {
36
36
  const url = this.resolveUrlTokens(args.options.url);
37
37
  const method = (args.options.method || 'get').toUpperCase();
38
38
  const headers = {};
39
- const unknownOptions = this.getUnknownOptions(args.options);
40
- const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
41
- unknownOptionsNames.forEach(o => {
42
- headers[o] = unknownOptions[o];
43
- });
39
+ this.addUnknownOptionsToPayload(headers, args.options);
44
40
  if (!headers.accept) {
45
41
  headers.accept = 'application/json';
46
42
  }
@@ -105,19 +101,14 @@ class RequestCommand extends Command {
105
101
  }
106
102
  _RequestCommand_instances = new WeakSet(), _RequestCommand_initTelemetry = function _RequestCommand_initTelemetry() {
107
103
  this.telemetry.push((args) => {
108
- const properties = {
104
+ Object.assign(this.telemetryProperties, {
109
105
  method: args.options.method || 'get',
110
106
  resource: typeof args.options.resource !== 'undefined',
111
107
  accept: args.options.accept || 'application/json',
112
108
  body: typeof args.options.body !== 'undefined',
113
109
  filePath: typeof args.options.filePath !== 'undefined'
114
- };
115
- const unknownOptions = this.getUnknownOptions(args.options);
116
- const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
117
- unknownOptionsNames.forEach(o => {
118
- properties[o] = typeof unknownOptions[o] !== 'undefined';
119
110
  });
120
- Object.assign(this.telemetryProperties, properties);
111
+ this.trackUnknownOptions(this.telemetryProperties, args.options);
121
112
  });
122
113
  }, _RequestCommand_initOptions = function _RequestCommand_initOptions() {
123
114
  this.options.unshift({
@@ -18,6 +18,7 @@ import { validation } from '../../utils/validation.js';
18
18
  import AnonymousCommand from '../base/AnonymousCommand.js';
19
19
  import commands from './commands.js';
20
20
  import { interactivePreset, powerShellPreset, scriptingPreset } from './setupPresets.js';
21
+ import { optionsUtils } from '../../utils/optionsUtils.js';
21
22
  export var CliUsageMode;
22
23
  (function (CliUsageMode) {
23
24
  CliUsageMode["Interactively"] = "interactively";
@@ -227,6 +228,7 @@ class SetupCommand extends AnonymousCommand {
227
228
  });
228
229
  const appInfo = await entraApp.createAppRegistration({
229
230
  options,
231
+ unknownOptions: optionsUtils.getUnknownOptions(options, this.options),
230
232
  apis,
231
233
  logger,
232
234
  verbose: this.verbose,
@@ -14,6 +14,9 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
14
14
  get description() {
15
15
  return 'Creates an administrative unit';
16
16
  }
17
+ allowUnknownOptions() {
18
+ return true;
19
+ }
17
20
  constructor() {
18
21
  super();
19
22
  _EntraAdministrativeUnitAddCommand_instances.add(this);
@@ -21,17 +24,19 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
21
24
  __classPrivateFieldGet(this, _EntraAdministrativeUnitAddCommand_instances, "m", _EntraAdministrativeUnitAddCommand_initOptions).call(this);
22
25
  }
23
26
  async commandAction(logger, args) {
27
+ const requestBody = {
28
+ description: args.options.description,
29
+ displayName: args.options.displayName,
30
+ visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
31
+ };
32
+ this.addUnknownOptionsToPayload(requestBody, args.options);
24
33
  const requestOptions = {
25
34
  url: `${this.resource}/v1.0/directory/administrativeUnits`,
26
35
  headers: {
27
36
  accept: 'application/json;odata.metadata=none'
28
37
  },
29
38
  responseType: 'json',
30
- data: {
31
- description: args.options.description,
32
- displayName: args.options.displayName,
33
- visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
34
- }
39
+ data: requestBody
35
40
  };
36
41
  try {
37
42
  const administrativeUnit = await request.post(requestOptions);
@@ -12,6 +12,7 @@ import { accessToken } from '../../../../utils/accessToken.js';
12
12
  import { entraApp } from '../../../../utils/entraApp.js';
13
13
  import GraphCommand from '../../../base/GraphCommand.js';
14
14
  import commands from '../../commands.js';
15
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
15
16
  class EntraAppAddCommand extends GraphCommand {
16
17
  get name() {
17
18
  return commands.APP_ADD;
@@ -19,6 +20,9 @@ class EntraAppAddCommand extends GraphCommand {
19
20
  get description() {
20
21
  return 'Creates new Entra app registration';
21
22
  }
23
+ allowUnknownOptions() {
24
+ return true;
25
+ }
22
26
  constructor() {
23
27
  super();
24
28
  _EntraAppAddCommand_instances.add(this);
@@ -43,6 +47,7 @@ class EntraAppAddCommand extends GraphCommand {
43
47
  });
44
48
  let appInfo = await entraApp.createAppRegistration({
45
49
  options: args.options,
50
+ unknownOptions: optionsUtils.getUnknownOptions(args.options, this.options),
46
51
  apis,
47
52
  logger,
48
53
  verbose: this.verbose,
@@ -10,6 +10,7 @@ import { formatting } from '../../../../utils/formatting.js';
10
10
  import GraphCommand from '../../../base/GraphCommand.js';
11
11
  import commands from '../../commands.js';
12
12
  import { cli } from '../../../../cli/cli.js';
13
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
13
14
  class EntraAppSetCommand extends GraphCommand {
14
15
  get name() {
15
16
  return commands.APP_SET;
@@ -17,6 +18,9 @@ class EntraAppSetCommand extends GraphCommand {
17
18
  get description() {
18
19
  return 'Updates Entra app registration';
19
20
  }
21
+ allowUnknownOptions() {
22
+ return true;
23
+ }
20
24
  constructor() {
21
25
  super();
22
26
  _EntraAppSetCommand_instances.add(this);
@@ -29,6 +33,7 @@ class EntraAppSetCommand extends GraphCommand {
29
33
  async commandAction(logger, args) {
30
34
  try {
31
35
  let objectId = await this.getAppObjectId(args, logger);
36
+ objectId = await this.updateUnknownOptions(args, objectId);
32
37
  objectId = await this.configureUri(args, objectId, logger);
33
38
  objectId = await this.configureRedirectUris(args, objectId, logger);
34
39
  objectId = await this.updateAllowPublicClientFlows(args, objectId, logger);
@@ -68,6 +73,23 @@ class EntraAppSetCommand extends GraphCommand {
68
73
  const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registration with name '${name}' found.`, resultAsKeyValuePair);
69
74
  return result.id;
70
75
  }
76
+ async updateUnknownOptions(args, objectId) {
77
+ const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
78
+ if (Object.keys(unknownOptions).length > 0) {
79
+ const requestBody = {};
80
+ optionsUtils.addUnknownOptionsToPayload(requestBody, unknownOptions);
81
+ const requestOptions = {
82
+ url: `${this.resource}/v1.0/myorganization/applications/${objectId}`,
83
+ headers: {
84
+ 'content-type': 'application/json;odata.metadata=none'
85
+ },
86
+ responseType: 'json',
87
+ data: requestBody
88
+ };
89
+ await request.patch(requestOptions);
90
+ }
91
+ return objectId;
92
+ }
71
93
  async updateAllowPublicClientFlows(args, objectId, logger) {
72
94
  if (args.options.allowPublicClientFlows === undefined) {
73
95
  return objectId;
@@ -270,6 +292,7 @@ _a = EntraAppSetCommand, _EntraAppSetCommand_instances = new WeakSet(), _EntraAp
270
292
  certificateDisplayName: typeof args.options.certificateDisplayName !== 'undefined',
271
293
  allowPublicClientFlows: typeof args.options.allowPublicClientFlows !== 'undefined'
272
294
  });
295
+ this.trackUnknownOptions(this.telemetryProperties, args.options);
273
296
  });
274
297
  }, _EntraAppSetCommand_initOptions = function _EntraAppSetCommand_initOptions() {
275
298
  this.options.unshift({ option: '--appId [appId]' }, { option: '--objectId [objectId]' }, { option: '-n, --name [name]' }, { option: '-u, --uris [uris]' }, { option: '-r, --redirectUris [redirectUris]' }, { option: '--certificateFile [certificateFile]' }, { option: '--certificateBase64Encoded [certificateBase64Encoded]' }, { option: '--certificateDisplayName [certificateDisplayName]' }, {
@@ -212,6 +212,7 @@ _EntraGroupAddCommand_instances = new WeakSet(), _EntraGroupAddCommand_initOptio
212
212
  memberUserNames: typeof args.options.memberUserNames !== 'undefined',
213
213
  visibility: typeof args.options.visibility !== 'undefined'
214
214
  });
215
+ this.trackUnknownOptions(this.telemetryProperties, args.options);
215
216
  });
216
217
  };
217
218
  export default new EntraGroupAddCommand();
@@ -19,6 +19,9 @@ class EntraGroupSetCommand extends GraphCommand {
19
19
  get description() {
20
20
  return 'Updates a Microsoft Entra group';
21
21
  }
22
+ allowUnknownOptions() {
23
+ return true;
24
+ }
22
25
  constructor() {
23
26
  super();
24
27
  _EntraGroupSetCommand_instances.add(this);
@@ -38,17 +41,19 @@ class EntraGroupSetCommand extends GraphCommand {
38
41
  }
39
42
  groupId = await entraGroup.getGroupIdByDisplayName(args.options.displayName);
40
43
  }
44
+ const requestBody = {
45
+ displayName: args.options.newDisplayName,
46
+ description: args.options.description === '' ? null : args.options.description,
47
+ mailNickName: args.options.mailNickname,
48
+ visibility: args.options.visibility
49
+ };
50
+ this.addUnknownOptionsToPayload(requestBody, args.options);
41
51
  const requestOptions = {
42
52
  url: `${this.resource}/v1.0/groups/${groupId}`,
43
53
  headers: {
44
54
  accept: 'application/json;odata.metadata=none'
45
55
  },
46
- data: {
47
- displayName: args.options.newDisplayName,
48
- description: args.options.description === '' ? null : args.options.description,
49
- mailNickName: args.options.mailNickname,
50
- visibility: args.options.visibility
51
- }
56
+ data: requestBody
52
57
  };
53
58
  await request.patch(requestOptions);
54
59
  const ownerIds = await this.getUserIds(logger, args.options.ownerIds, args.options.ownerUserNames);
@@ -167,6 +172,7 @@ _EntraGroupSetCommand_instances = new WeakSet(), _EntraGroupSetCommand_initTelem
167
172
  memberUserNames: typeof args.options.memberUserNames !== 'undefined',
168
173
  visibility: typeof args.options.visibility !== 'undefined'
169
174
  });
175
+ this.trackUnknownOptions(this.telemetryProperties, args.options);
170
176
  });
171
177
  }, _EntraGroupSetCommand_initOptions = function _EntraGroupSetCommand_initOptions() {
172
178
  this.options.unshift({
@@ -131,6 +131,7 @@ _EntraUserAddCommand_instances = new WeakSet(), _EntraUserAddCommand_initTelemet
131
131
  managerUserId: typeof args.options.managerUserId !== 'undefined',
132
132
  managerUserName: typeof args.options.managerUserName !== 'undefined'
133
133
  });
134
+ this.trackUnknownOptions(this.telemetryProperties, args.options);
134
135
  });
135
136
  }, _EntraUserAddCommand_initOptions = function _EntraUserAddCommand_initOptions() {
136
137
  this.options.unshift({
@@ -8,6 +8,7 @@ import { formatting } from '../../../../utils/formatting.js';
8
8
  import { odata } from '../../../../utils/odata.js';
9
9
  import GraphCommand from '../../../base/GraphCommand.js';
10
10
  import commands from '../../commands.js';
11
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
11
12
  class EntraUserListCommand extends GraphCommand {
12
13
  get name() {
13
14
  return commands.USER_LIST;
@@ -56,7 +57,7 @@ class EntraUserListCommand extends GraphCommand {
56
57
  }
57
58
  getFilter(options) {
58
59
  const filters = [];
59
- const unknownOptions = this.getUnknownOptions(options);
60
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
60
61
  Object.keys(unknownOptions).forEach(key => {
61
62
  if (typeof options[key] === 'boolean') {
62
63
  throw `Specify value for the ${key} property`;
@@ -47,7 +47,7 @@ class ExternalItemAddCommand extends GraphCommand {
47
47
  // we need to rewrite the @odata properties to the correct format
48
48
  // to extract multiple values for collections into arrays
49
49
  this.rewriteCollectionProperties(args.options);
50
- this.addUnknownOptionsToPayload(requestBody.properties, args.options);
50
+ this.addUnknownOptionsToPayload(requestBody, args.options);
51
51
  const requestOptions = {
52
52
  url: `${this.resource}/v1.0/external/connections/${args.options.externalConnectionId}/items/${args.options.id}`,
53
53
  headers: {
@@ -96,6 +96,7 @@ _a = ExternalItemAddCommand, _ExternalItemAddCommand_instances = new WeakSet(),
96
96
  Object.assign(this.telemetryProperties, {
97
97
  contentType: typeof args.options.contentType
98
98
  });
99
+ this.trackUnknownOptions(this.telemetryProperties, args.options);
99
100
  });
100
101
  }, _ExternalItemAddCommand_initOptions = function _ExternalItemAddCommand_initOptions() {
101
102
  this.options.unshift({
@@ -0,0 +1,73 @@
1
+ import { z } from 'zod';
2
+ import { globalOptionsZod } from '../../../../Command.js';
3
+ import { zod } from '../../../../utils/zod.js';
4
+ import { validation } from '../../../../utils/validation.js';
5
+ import GraphCommand from '../../../base/GraphCommand.js';
6
+ import commands from '../../commands.js';
7
+ import request from '../../../../request.js';
8
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
9
+ const options = globalOptionsZod
10
+ .extend({
11
+ name: zod.alias('n', z.string()),
12
+ resourceId: zod.alias('i', z.string()),
13
+ resourceType: zod.alias('t', z.enum(['user', 'group', 'device', 'organization']))
14
+ })
15
+ .and(z.any());
16
+ class GraphOpenExtensionAddCommand extends GraphCommand {
17
+ get name() {
18
+ return commands.OPENEXTENSION_ADD;
19
+ }
20
+ get description() {
21
+ return 'Adds an open extension to a resource';
22
+ }
23
+ get schema() {
24
+ return options;
25
+ }
26
+ getRefinedSchema(schema) {
27
+ return schema
28
+ .refine(options => options.resourceType !== 'group' && options.resourceType !== 'device' && options.resourceType !== 'organization' || (options.resourceId && validation.isValidGuid(options.resourceId)), options => ({
29
+ message: `The '${options.resourceId}' must be a valid GUID`,
30
+ path: ['resourceId']
31
+ }))
32
+ .refine(options => options.resourceType !== 'user' || (options.resourceId && (validation.isValidGuid(options.resourceId) || validation.isValidUserPrincipalName(options.resourceId))), options => ({
33
+ message: `The '${options.resourceId}' must be a valid GUID or user principal name`,
34
+ path: ['resourceId']
35
+ }));
36
+ }
37
+ async commandAction(logger, args) {
38
+ try {
39
+ const requestBody = {};
40
+ requestBody["extensionName"] = args.options.name;
41
+ const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
42
+ const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
43
+ unknownOptionsNames.forEach(async (o) => {
44
+ try {
45
+ const jsonObject = JSON.parse(unknownOptions[o]);
46
+ requestBody[o] = jsonObject;
47
+ }
48
+ catch {
49
+ requestBody[o] = unknownOptions[o];
50
+ }
51
+ });
52
+ const requestOptions = {
53
+ url: `${this.resource}/v1.0/${args.options.resourceType}${args.options.resourceType === 'organization' ? '' : 's'}/${args.options.resourceId}/extensions`,
54
+ headers: {
55
+ accept: 'application/json;odata.metadata=none',
56
+ 'content-type': 'application/json'
57
+ },
58
+ data: requestBody,
59
+ responseType: 'json'
60
+ };
61
+ if (args.options.verbose) {
62
+ await logger.logToStderr(`Adding open extension to the ${args.options.resourceType} with id '${args.options.resourceId}'...`);
63
+ }
64
+ const res = await request.post(requestOptions);
65
+ await logger.log(res);
66
+ }
67
+ catch (err) {
68
+ this.handleRejectedODataJsonPromise(err);
69
+ }
70
+ }
71
+ }
72
+ export default new GraphOpenExtensionAddCommand();
73
+ //# sourceMappingURL=openextension-add.js.map
@@ -4,6 +4,7 @@ export default {
4
4
  DIRECTORYEXTENSION_ADD: `${prefix} directoryextension add`,
5
5
  DIRECTORYEXTENSION_GET: `${prefix} directoryextension get`,
6
6
  DIRECTORYEXTENSION_REMOVE: `${prefix} directoryextension remove`,
7
+ OPENEXTENSION_ADD: `${prefix} openextension add`,
7
8
  SCHEMAEXTENSION_ADD: `${prefix} schemaextension add`,
8
9
  SCHEMAEXTENSION_GET: `${prefix} schemaextension get`,
9
10
  SCHEMAEXTENSION_LIST: `${prefix} schemaextension list`,
@@ -5,6 +5,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
5
5
  };
6
6
  var _TenantPeopleProfileCardPropertyAddCommand_instances, _TenantPeopleProfileCardPropertyAddCommand_initTelemetry, _TenantPeopleProfileCardPropertyAddCommand_initOptions, _TenantPeopleProfileCardPropertyAddCommand_initValidators;
7
7
  import request from '../../../../request.js';
8
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
8
9
  import GraphCommand from '../../../base/GraphCommand.js';
9
10
  import commands from '../../commands.js';
10
11
  import { profileCardPropertyNames } from './profileCardProperties.js';
@@ -71,7 +72,7 @@ class TenantPeopleProfileCardPropertyAddCommand extends GraphCommand {
71
72
  ];
72
73
  }
73
74
  getLocalizations(options) {
74
- const unknownOptions = Object.keys(this.getUnknownOptions(options));
75
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(options, this.options));
75
76
  if (unknownOptions.length === 0) {
76
77
  return [];
77
78
  }
@@ -88,7 +89,7 @@ class TenantPeopleProfileCardPropertyAddCommand extends GraphCommand {
88
89
  _TenantPeopleProfileCardPropertyAddCommand_instances = new WeakSet(), _TenantPeopleProfileCardPropertyAddCommand_initTelemetry = function _TenantPeopleProfileCardPropertyAddCommand_initTelemetry() {
89
90
  this.telemetry.push((args) => {
90
91
  // Add unknown options to telemetry
91
- const unknownOptions = Object.keys(this.getUnknownOptions(args.options));
92
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
92
93
  const unknownOptionsObj = unknownOptions.reduce((obj, key) => ({ ...obj, [key]: true }), {});
93
94
  Object.assign(this.telemetryProperties, {
94
95
  displayName: typeof args.options.displayName !== 'undefined',
@@ -114,7 +115,7 @@ _TenantPeopleProfileCardPropertyAddCommand_instances = new WeakSet(), _TenantPeo
114
115
  if (!propertyName.startsWith('customattribute') && args.options.displayName !== undefined) {
115
116
  return `The option 'displayName' can only be used when adding customAttributes as profile card properties`;
116
117
  }
117
- const unknownOptions = Object.keys(this.getUnknownOptions(args.options));
118
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
118
119
  if (!propertyName.startsWith('customattribute') && unknownOptions.length > 0) {
119
120
  return `Unknown options like ${unknownOptions.join(', ')} are only supported with customAttributes`;
120
121
  }
@@ -8,6 +8,7 @@ import GraphCommand from '../../../base/GraphCommand.js';
8
8
  import request from '../../../../request.js';
9
9
  import { profileCardPropertyNames as allProfileCardPropertyNames } from './profileCardProperties.js';
10
10
  import commands from '../../commands.js';
11
+ import { optionsUtils } from '../../../../utils/optionsUtils.js';
11
12
  class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
12
13
  get name() {
13
14
  return commands.PEOPLE_PROFILECARDPROPERTY_SET;
@@ -73,7 +74,7 @@ class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
73
74
  * @example Transform "--displayName-en-US 'Cost center'" to { languageTag: 'en-US', displayName: 'Cost center' }
74
75
  */
75
76
  getLocalizations(options) {
76
- const unknownOptions = this.getUnknownOptions(options);
77
+ const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
77
78
  const result = Object.keys(unknownOptions).map(o => ({
78
79
  languageTag: o.substring(o.indexOf('-') + 1),
79
80
  displayName: unknownOptions[o]
@@ -84,7 +85,7 @@ class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
84
85
  _TenantPeopleProfileCardPropertySetCommand_instances = new WeakSet(), _TenantPeopleProfileCardPropertySetCommand_initTelemetry = function _TenantPeopleProfileCardPropertySetCommand_initTelemetry() {
85
86
  this.telemetry.push((args) => {
86
87
  // Add unknown options to telemetry
87
- const unknownOptions = Object.keys(this.getUnknownOptions(args.options));
88
+ const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
88
89
  const unknownOptionsObj = unknownOptions.reduce((obj, key) => ({ ...obj, [key]: true }), {});
89
90
  Object.assign(this.telemetryProperties, {
90
91
  displayName: typeof args.options.displayName !== 'undefined',
@@ -104,7 +105,7 @@ _TenantPeopleProfileCardPropertySetCommand_instances = new WeakSet(), _TenantPeo
104
105
  return `'${args.options.name}' is not a valid value for option name. Allowed values are: ${this.profileCardPropertyNames.join(', ')}.`;
105
106
  }
106
107
  // Unknown options are allowed only if they start with 'displayName-'
107
- const unknownOptionKeys = Object.keys(this.getUnknownOptions(args.options));
108
+ const unknownOptionKeys = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
108
109
  const invalidOptionKey = unknownOptionKeys.find(o => !o.startsWith('displayName-'));
109
110
  if (invalidOptionKey) {
110
111
  return `Invalid option: '${invalidOptionKey}'`;
@@ -46,7 +46,7 @@ class TodoListRemoveCommand extends DelegatedGraphCommand {
46
46
  responseType: 'json'
47
47
  };
48
48
  const response = await request.get(requestOptions);
49
- return response.value && response.value.length === 1 ? response.value[0].id : null;
49
+ return response.value && response.value.length === 1 ? response.value[0].id : undefined;
50
50
  }
51
51
  async removeList(args) {
52
52
  try {
@@ -3,6 +3,7 @@ import request from '../request.js';
3
3
  import { odata } from './odata.js';
4
4
  import { formatting } from './formatting.js';
5
5
  import { cli } from '../cli/cli.js';
6
+ import { optionsUtils } from './optionsUtils.js';
6
7
  async function getCertificateBase64Encoded({ options, logger, debug }) {
7
8
  if (options.certificateBase64Encoded) {
8
9
  return options.certificateBase64Encoded;
@@ -129,7 +130,7 @@ function updateAppPermissions({ spId, resourceAccessPermission, oAuth2Permission
129
130
  }
130
131
  export const entraApp = {
131
132
  appPermissions: [],
132
- createAppRegistration: async ({ options, apis, logger, verbose, debug }) => {
133
+ createAppRegistration: async ({ options, apis, logger, verbose, debug, unknownOptions }) => {
133
134
  const applicationInfo = {
134
135
  displayName: options.name,
135
136
  signInAudience: options.multitenant ? 'AzureADMultipleOrgs' : 'AzureADMyOrg'
@@ -164,6 +165,7 @@ export const entraApp = {
164
165
  if (options.allowPublicClientFlows) {
165
166
  applicationInfo.isFallbackPublicClient = true;
166
167
  }
168
+ optionsUtils.addUnknownOptionsToPayload(applicationInfo, unknownOptions);
167
169
  if (verbose) {
168
170
  await logger.logToStderr(`Creating Microsoft Entra app registration...`);
169
171
  }
@@ -0,0 +1,28 @@
1
+ const longOptionRegex = /--([^\s]+)/;
2
+ const shortOptionRegex = /-([a-z])\b/;
3
+ export const optionsUtils = {
4
+ getUnknownOptions(options, knownOptions) {
5
+ const unknownOptions = JSON.parse(JSON.stringify(options));
6
+ // remove minimist catch-all option
7
+ delete unknownOptions._;
8
+ knownOptions.forEach(o => {
9
+ const longOptionName = longOptionRegex.exec(o.option)[1];
10
+ delete unknownOptions[longOptionName];
11
+ // short names are optional so we need to check if the current command has
12
+ // one before continuing
13
+ const shortOptionMatch = shortOptionRegex.exec(o.option);
14
+ if (shortOptionMatch) {
15
+ const shortOptionName = shortOptionMatch[1];
16
+ delete unknownOptions[shortOptionName];
17
+ }
18
+ });
19
+ return unknownOptions;
20
+ },
21
+ addUnknownOptionsToPayload(payload, unknownOptions) {
22
+ const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
23
+ unknownOptionsNames.forEach(o => {
24
+ payload[o] = unknownOptions[o];
25
+ });
26
+ }
27
+ };
28
+ //# sourceMappingURL=optionsUtils.js.map
@@ -38,16 +38,15 @@ m365 graph directoryextension get [options]
38
38
  Get directory extension by id registered for an application specified by app id.
39
39
 
40
40
  ```sh
41
- m365 directoryextension get --id 1f0f15e3-925d-40f0-8fc8-9d3ad135bce0 --appId fd918e4b-c821-4efb-b50a-5eddd23afc6f
41
+ m365 graph directoryextension get --id 1f0f15e3-925d-40f0-8fc8-9d3ad135bce0 --appId fd918e4b-c821-4efb-b50a-5eddd23afc6f
42
42
  ```
43
43
 
44
44
  Get directory extension by name registered for an application specified by name.
45
45
 
46
46
  ```sh
47
- m365 directoryextension get --name extension_105be60b603845fea385e58772d9d630_GitHubWorkAccount --appName ContosoApp
47
+ m365 graph directoryextension get --name extension_105be60b603845fea385e58772d9d630_GitHubWorkAccount --appName ContosoApp
48
48
  ```
49
49
 
50
-
51
50
  ## Response
52
51
 
53
52
  <Tabs>