@pnp/cli-microsoft365 6.9.0-beta.f488de8 → 6.9.0-beta.f6054b4

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/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM mcr.microsoft.com/powershell:alpine-3.12
1
+ FROM mcr.microsoft.com/powershell:alpine-3.17
2
2
 
3
3
  ARG CLI_VERSION=latest
4
4
 
@@ -48,6 +48,7 @@ RUN bash -c 'echo "export PATH=$PATH:/home/cli-microsoft365/.npm-global/bin:/hom
48
48
  && bash -c 'm365 cli completion sh setup' \
49
49
  && pwsh -c 'm365 cli completion pwsh setup --profile $profile'
50
50
 
51
+ RUN pip install setuptools==58
51
52
  RUN pip install jmespath-terminal
52
53
 
53
54
  CMD [ "bash", "-l" ]
package/dist/cli/Cli.js CHANGED
@@ -801,6 +801,22 @@ class Cli {
801
801
  return response;
802
802
  });
803
803
  }
804
+ static handleMultipleResultsFound(promptMessage, errorMessage, values) {
805
+ return __awaiter(this, void 0, void 0, function* () {
806
+ const interactive = Cli.getInstance().getSettingWithDefaultValue(settingsNames_1.settingsNames.interactive, false);
807
+ if (!interactive) {
808
+ throw errorMessage;
809
+ }
810
+ const response = yield Cli.prompt({
811
+ type: 'list',
812
+ name: 'select',
813
+ default: 0,
814
+ message: promptMessage,
815
+ choices: Object.keys(values)
816
+ });
817
+ return values[response.select];
818
+ });
819
+ }
804
820
  static removeShortOptions(args) {
805
821
  const filteredArgs = JSON.parse(JSON.stringify(args));
806
822
  const optionsToRemove = Object.getOwnPropertyNames(args.options)
@@ -43,6 +43,7 @@ class CliConfigSetCommand extends AnonymousCommand_1.default {
43
43
  case settingsNames_1.settingsNames.csvQuoted:
44
44
  case settingsNames_1.settingsNames.csvQuotedEmpty:
45
45
  case settingsNames_1.settingsNames.disableTelemetry:
46
+ case settingsNames_1.settingsNames.interactive:
46
47
  case settingsNames_1.settingsNames.printErrorsAsPlainText:
47
48
  case settingsNames_1.settingsNames.prompt:
48
49
  case settingsNames_1.settingsNames.showHelpOnFailure:
@@ -31,7 +31,7 @@ class FlowListCommand extends AzmgmtItemsListCommand_1.AzmgmtItemsListCommand {
31
31
  constructor() {
32
32
  super();
33
33
  _FlowListCommand_instances.add(this);
34
- this.allowedSharingStatusses = ['all', 'personal', 'ownedByMe', 'sharedWithMe'];
34
+ this.allowedSharingStatuses = ['all', 'personal', 'ownedByMe', 'sharedWithMe'];
35
35
  __classPrivateFieldGet(this, _FlowListCommand_instances, "m", _FlowListCommand_initTelemetry).call(this);
36
36
  __classPrivateFieldGet(this, _FlowListCommand_instances, "m", _FlowListCommand_initOptions).call(this);
37
37
  __classPrivateFieldGet(this, _FlowListCommand_instances, "m", _FlowListCommand_initValidators).call(this);
@@ -88,7 +88,7 @@ _FlowListCommand_instances = new WeakSet(), _FlowListCommand_initTelemetry = fun
88
88
  option: '-e, --environmentName <environmentName>'
89
89
  }, {
90
90
  option: '--sharingStatus [sharingStatus]',
91
- autocomplete: this.allowedSharingStatusses
91
+ autocomplete: this.allowedSharingStatuses
92
92
  }, {
93
93
  option: '--asAdmin'
94
94
  });
@@ -97,8 +97,8 @@ _FlowListCommand_instances = new WeakSet(), _FlowListCommand_initTelemetry = fun
97
97
  if (args.options.asAdmin && args.options.sharingStatus) {
98
98
  return `The options asAdmin and sharingStatus cannot be specified together.`;
99
99
  }
100
- if (args.options.sharingStatus && !this.allowedSharingStatusses.some(status => status === args.options.sharingStatus)) {
101
- return `${args.options.sharingStatus} is not a valid sharing status. Allowed values are: ${this.allowedSharingStatusses.join(',')}`;
100
+ if (args.options.sharingStatus && !this.allowedSharingStatuses.some(status => status === args.options.sharingStatus)) {
101
+ return `${args.options.sharingStatus} is not a valid sharing status. Allowed values are: ${this.allowedSharingStatuses.join(',')}`;
102
102
  }
103
103
  return true;
104
104
  }));
@@ -20,6 +20,7 @@ const PowerPlatformCommand_1 = require("../../../base/PowerPlatformCommand");
20
20
  const commands_1 = require("../../commands");
21
21
  const request_1 = require("../../../../request");
22
22
  const validation_1 = require("../../../../utils/validation");
23
+ const Cli_1 = require("../../../../cli/Cli");
23
24
  class PpCardGetCommand extends PowerPlatformCommand_1.default {
24
25
  get name() {
25
26
  return commands_1.default.CARD_GET;
@@ -72,7 +73,11 @@ class PpCardGetCommand extends PowerPlatformCommand_1.default {
72
73
  throw `The specified card '${options.name}' does not exist.`;
73
74
  }
74
75
  if (result.value.length > 1) {
75
- throw `Multiple cards with name '${options.name}' found: ${result.value.map(x => x.cardid).join(',')}`;
76
+ const resultAsKeyValuePair = {};
77
+ result.value.forEach((obj) => {
78
+ resultAsKeyValuePair[obj.cardid] = obj;
79
+ });
80
+ return Cli_1.Cli.handleMultipleResultsFound(`Multiple cards with name '${options.name}' found. Choose the correct ID:`, `Multiple cards with name '${options.name}' found.`, resultAsKeyValuePair);
76
81
  }
77
82
  return result.value[0];
78
83
  });
@@ -16,6 +16,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
16
16
  var _SpoNavigationNodeAddCommand_instances, _SpoNavigationNodeAddCommand_initTelemetry, _SpoNavigationNodeAddCommand_initOptions, _SpoNavigationNodeAddCommand_initValidators, _SpoNavigationNodeAddCommand_initOptionSets;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  const request_1 = require("../../../../request");
19
+ const spo_1 = require("../../../../utils/spo");
19
20
  const validation_1 = require("../../../../utils/validation");
20
21
  const SpoCommand_1 = require("../../../base/SpoCommand");
21
22
  const commands_1 = require("../../commands");
@@ -62,6 +63,20 @@ class SpoNavigationNodeAddCommand extends SpoCommand_1.default {
62
63
  };
63
64
  try {
64
65
  const res = yield request_1.default.post(requestOptions);
66
+ if (args.options.openInNewWindow) {
67
+ if (this.verbose) {
68
+ logger.logToStderr(`Making sure that the newly added navigation node opens in a new window.`);
69
+ }
70
+ const id = res.Id.toString();
71
+ let menuState = args.options.location === 'TopNavigationBar' ? yield spo_1.spo.getTopNavigationMenuState(args.options.webUrl) : yield spo_1.spo.getQuickLaunchMenuState(args.options.webUrl);
72
+ let menuStateItem = this.getMenuStateNode(menuState.Nodes, id);
73
+ if (args.options.parentNodeId && !menuStateItem) {
74
+ menuState = yield spo_1.spo.getTopNavigationMenuState(args.options.webUrl);
75
+ menuStateItem = this.getMenuStateNode(menuState.Nodes, id);
76
+ }
77
+ menuStateItem.OpenInNewWindow = true;
78
+ yield spo_1.spo.saveMenuState(args.options.webUrl, menuState);
79
+ }
65
80
  logger.log(res);
66
81
  }
67
82
  catch (err) {
@@ -69,6 +84,18 @@ class SpoNavigationNodeAddCommand extends SpoCommand_1.default {
69
84
  }
70
85
  });
71
86
  }
87
+ getMenuStateNode(nodes, id) {
88
+ let menuNode = nodes.find((node) => node.Key !== null && node.Key === id);
89
+ if (menuNode === undefined) {
90
+ for (const node of nodes.filter(node => node.Nodes.length > 0)) {
91
+ menuNode = this.getMenuStateNode(node.Nodes, id);
92
+ if (menuNode) {
93
+ break;
94
+ }
95
+ }
96
+ }
97
+ return menuNode;
98
+ }
72
99
  }
73
100
  _SpoNavigationNodeAddCommand_instances = new WeakSet(), _SpoNavigationNodeAddCommand_initTelemetry = function _SpoNavigationNodeAddCommand_initTelemetry() {
74
101
  this.telemetry.push((args) => {
@@ -77,7 +104,8 @@ _SpoNavigationNodeAddCommand_instances = new WeakSet(), _SpoNavigationNodeAddCom
77
104
  location: typeof args.options.location !== 'undefined',
78
105
  parentNodeId: typeof args.options.parentNodeId !== 'undefined',
79
106
  audienceIds: typeof args.options.audienceIds !== 'undefined',
80
- url: typeof args.options.url !== 'undefined'
107
+ url: typeof args.options.url !== 'undefined',
108
+ openInNewWindow: !!args.options.openInNewWindow
81
109
  });
82
110
  });
83
111
  }, _SpoNavigationNodeAddCommand_initOptions = function _SpoNavigationNodeAddCommand_initOptions() {
@@ -96,6 +124,8 @@ _SpoNavigationNodeAddCommand_instances = new WeakSet(), _SpoNavigationNodeAddCom
96
124
  option: '--isExternal'
97
125
  }, {
98
126
  option: '--audienceIds [audienceIds]'
127
+ }, {
128
+ option: '--openInNewWindow'
99
129
  });
100
130
  }, _SpoNavigationNodeAddCommand_initValidators = function _SpoNavigationNodeAddCommand_initValidators() {
101
131
  this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
@@ -16,6 +16,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
16
16
  var _SpoNavigationNodeSetCommand_instances, _SpoNavigationNodeSetCommand_initTelemetry, _SpoNavigationNodeSetCommand_initTypes, _SpoNavigationNodeSetCommand_initOptions, _SpoNavigationNodeSetCommand_initValidators;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  const request_1 = require("../../../../request");
19
+ const spo_1 = require("../../../../utils/spo");
19
20
  const validation_1 = require("../../../../utils/validation");
20
21
  const SpoCommand_1 = require("../../../base/SpoCommand");
21
22
  const commands_1 = require("../../commands");
@@ -65,12 +66,37 @@ class SpoNavigationNodeSetCommand extends SpoCommand_1.default {
65
66
  if (response['odata.null'] === true) {
66
67
  throw `Navigation node does not exist.`;
67
68
  }
69
+ if (args.options.openInNewWindow !== undefined) {
70
+ if (this.verbose) {
71
+ logger.logToStderr(`Making sure that the navigation node opens in a new window.`);
72
+ }
73
+ let menuState = yield spo_1.spo.getQuickLaunchMenuState(args.options.webUrl);
74
+ let menuStateItem = this.getMenuStateNode(menuState.Nodes, args.options.id);
75
+ if (!menuStateItem) {
76
+ menuState = yield spo_1.spo.getTopNavigationMenuState(args.options.webUrl);
77
+ menuStateItem = this.getMenuStateNode(menuState.Nodes, args.options.id);
78
+ }
79
+ menuStateItem.OpenInNewWindow = args.options.openInNewWindow;
80
+ yield spo_1.spo.saveMenuState(args.options.webUrl, menuState);
81
+ }
68
82
  }
69
83
  catch (err) {
70
84
  this.handleRejectedODataJsonPromise(err);
71
85
  }
72
86
  });
73
87
  }
88
+ getMenuStateNode(nodes, id) {
89
+ let menuNode = nodes.find((node) => node.Key.toString() === id.toString());
90
+ if (menuNode === undefined) {
91
+ for (const node of nodes.filter(node => node.Nodes.length > 0)) {
92
+ menuNode = this.getMenuStateNode(node.Nodes, id);
93
+ if (menuNode) {
94
+ break;
95
+ }
96
+ }
97
+ }
98
+ return menuNode;
99
+ }
74
100
  }
75
101
  _SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCommand_initTelemetry = function _SpoNavigationNodeSetCommand_initTelemetry() {
76
102
  this.telemetry.push((args) => {
@@ -78,7 +104,8 @@ _SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCom
78
104
  title: typeof args.options.title !== 'undefined',
79
105
  url: typeof args.options.url !== 'undefined',
80
106
  isExternal: typeof args.options.isExternal !== 'undefined',
81
- audienceIds: typeof args.options.audienceIds !== 'undefined'
107
+ audienceIds: typeof args.options.audienceIds !== 'undefined',
108
+ openInNewWindow: typeof args.options.openInNewWindow !== 'undefined'
82
109
  });
83
110
  });
84
111
  }, _SpoNavigationNodeSetCommand_initTypes = function _SpoNavigationNodeSetCommand_initTypes() {
@@ -96,6 +123,8 @@ _SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCom
96
123
  option: '--audienceIds [audienceIds]'
97
124
  }, {
98
125
  option: '--isExternal [isExternal]'
126
+ }, {
127
+ option: '--openInNewWindow [openInNewWindow]'
99
128
  });
100
129
  }, _SpoNavigationNodeSetCommand_initValidators = function _SpoNavigationNodeSetCommand_initValidators() {
101
130
  this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
@@ -103,7 +132,7 @@ _SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCom
103
132
  if (isValidSharePointUrl !== true) {
104
133
  return isValidSharePointUrl;
105
134
  }
106
- if (args.options.audienceIds === undefined && !args.options.url && args.options.isExternal === undefined && !args.options.title) {
135
+ if (args.options.audienceIds === undefined && !args.options.url && args.options.isExternal === undefined && !args.options.title && args.options.openInNewWindow === undefined) {
107
136
  return `Please specify atleast one property to update.`;
108
137
  }
109
138
  if (args.options.audienceIds) {
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Solution.js.map
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ 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");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _SpoTenantCommandSetAddCommand_instances, _SpoTenantCommandSetAddCommand_initTelemetry, _SpoTenantCommandSetAddCommand_initOptions, _SpoTenantCommandSetAddCommand_initValidators;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const validation_1 = require("../../../../utils/validation");
19
+ const SpoCommand_1 = require("../../../base/SpoCommand");
20
+ const commands_1 = require("../../commands");
21
+ const Cli_1 = require("../../../../cli/Cli");
22
+ const spoTenantAppCatalogUrlGetCommand = require("./tenant-appcatalogurl-get");
23
+ const spoListItemAddCommand = require("../listitem/listitem-add");
24
+ const spoListItemListCommand = require("../listitem/listitem-list");
25
+ const urlUtil_1 = require("../../../../utils/urlUtil");
26
+ class SpoTenantCommandSetAddCommand extends SpoCommand_1.default {
27
+ get name() {
28
+ return commands_1.default.TENANT_COMMANDSET_ADD;
29
+ }
30
+ get description() {
31
+ return 'Add a ListView Command Set as a tenant-wide extension.';
32
+ }
33
+ constructor() {
34
+ super();
35
+ _SpoTenantCommandSetAddCommand_instances.add(this);
36
+ __classPrivateFieldGet(this, _SpoTenantCommandSetAddCommand_instances, "m", _SpoTenantCommandSetAddCommand_initTelemetry).call(this);
37
+ __classPrivateFieldGet(this, _SpoTenantCommandSetAddCommand_instances, "m", _SpoTenantCommandSetAddCommand_initOptions).call(this);
38
+ __classPrivateFieldGet(this, _SpoTenantCommandSetAddCommand_instances, "m", _SpoTenantCommandSetAddCommand_initValidators).call(this);
39
+ }
40
+ commandAction(logger, args) {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ try {
43
+ const appCatalogUrl = yield this.getAppCatalogUrl(logger);
44
+ const componentManifest = yield this.getComponentManifest(appCatalogUrl, args.options.clientSideComponentId, logger);
45
+ const clientComponentManifest = JSON.parse(componentManifest.ClientComponentManifest);
46
+ if (clientComponentManifest.extensionType !== "ListViewCommandSet") {
47
+ throw `The extension type of this component is not of type 'ListViewCommandSet' but of type '${clientComponentManifest.extensionType}'`;
48
+ }
49
+ const solution = yield this.getSolutionFromAppCatalog(appCatalogUrl, componentManifest.SolutionId, logger);
50
+ if (!solution.ContainsTenantWideExtension) {
51
+ throw `The solution does not contain an extension that can be deployed to all sites. Make sure that you've entered the correct component Id.`;
52
+ }
53
+ else if (!solution.SkipFeatureDeployment) {
54
+ throw 'The solution has not been deployed to all sites. Make sure to deploy this solution to all sites.';
55
+ }
56
+ yield this.addTenantWideExtension(appCatalogUrl, args.options, logger);
57
+ }
58
+ catch (err) {
59
+ this.handleRejectedODataJsonPromise(err);
60
+ }
61
+ });
62
+ }
63
+ getAppCatalogUrl(logger) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ const spoTenantAppCatalogUrlGetCommandOutput = yield Cli_1.Cli.executeCommandWithOutput(spoTenantAppCatalogUrlGetCommand, { options: { output: 'text', _: [] } });
66
+ if (this.verbose) {
67
+ logger.logToStderr(spoTenantAppCatalogUrlGetCommandOutput.stderr);
68
+ }
69
+ const appCatalogUrl = spoTenantAppCatalogUrlGetCommandOutput.stdout;
70
+ if (!appCatalogUrl) {
71
+ throw 'Cannot add tenant-wide ListView Command Set as app catalog cannot be found';
72
+ }
73
+ if (this.verbose) {
74
+ logger.logToStderr(`Got tenant app catalog url: ${appCatalogUrl}`);
75
+ }
76
+ return appCatalogUrl;
77
+ });
78
+ }
79
+ getComponentManifest(appCatalogUrl, clientSideComponentId, logger) {
80
+ return __awaiter(this, void 0, void 0, function* () {
81
+ if (this.verbose) {
82
+ logger.logToStderr('Retrieving component manifest item from the ComponentManifests list on the app catalog site so that we get the solution id');
83
+ }
84
+ 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>`;
85
+ const commandOptions = {
86
+ webUrl: appCatalogUrl,
87
+ listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/Lists/ComponentManifests`,
88
+ camlQuery: camlQuery,
89
+ verbose: this.verbose,
90
+ debug: this.debug,
91
+ output: 'json'
92
+ };
93
+ const output = yield Cli_1.Cli.executeCommandWithOutput(spoListItemListCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
94
+ if (this.verbose) {
95
+ logger.logToStderr(output.stderr);
96
+ }
97
+ const outputParsed = JSON.parse(output.stdout);
98
+ if (outputParsed.length === 0) {
99
+ throw 'No component found with the specified clientSideComponentId found in the component manifest list. Make sure that the application is added to the application catalog';
100
+ }
101
+ return outputParsed[0];
102
+ });
103
+ }
104
+ getSolutionFromAppCatalog(appCatalogUrl, solutionId, logger) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ if (this.verbose) {
107
+ logger.logToStderr(`Retrieving solution with id ${solutionId} from the application catalog`);
108
+ }
109
+ 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>`;
110
+ const commandOptions = {
111
+ webUrl: appCatalogUrl,
112
+ listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/AppCatalog`,
113
+ camlQuery: camlQuery,
114
+ verbose: this.verbose,
115
+ debug: this.debug,
116
+ output: 'json'
117
+ };
118
+ const output = yield Cli_1.Cli.executeCommandWithOutput(spoListItemListCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
119
+ if (this.verbose) {
120
+ logger.logToStderr(output.stderr);
121
+ }
122
+ const outputParsed = JSON.parse(output.stdout);
123
+ if (outputParsed.length === 0) {
124
+ throw `No component found with the solution id ${solutionId}. Make sure that the solution is available in the app catalog`;
125
+ }
126
+ return outputParsed[0];
127
+ });
128
+ }
129
+ addTenantWideExtension(appCatalogUrl, options, logger) {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ if (this.verbose) {
132
+ logger.logToStderr('Pre-checks finished. Adding tenant wide extension to the TenantWideExtensions list');
133
+ }
134
+ const commandOptions = {
135
+ webUrl: appCatalogUrl,
136
+ listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/Lists/TenantWideExtensions`,
137
+ Title: options.title,
138
+ TenantWideExtensionComponentId: options.clientSideComponentId,
139
+ TenantWideExtensionLocation: this.getLocation(options.location),
140
+ TenantWideExtensionSequence: 0,
141
+ TenantWideExtensionListTemplate: this.getListTemplate(options.listType),
142
+ TenantWideExtensionComponentProperties: options.clientSideComponentProperties || '',
143
+ TenantWideExtensionWebTemplate: options.webTemplate || '',
144
+ TenantWideExtensionDisabled: false,
145
+ verbose: this.verbose,
146
+ debug: this.debug,
147
+ output: options.output
148
+ };
149
+ yield Cli_1.Cli.executeCommand(spoListItemAddCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
150
+ });
151
+ }
152
+ getLocation(location) {
153
+ switch (location) {
154
+ case 'Both':
155
+ return 'ClientSideExtension.ListViewCommandSet';
156
+ case 'ContextMenu':
157
+ return 'ClientSideExtension.ListViewCommandSet.ContextMenu';
158
+ default:
159
+ return 'ClientSideExtension.ListViewCommandSet.CommandBar';
160
+ }
161
+ }
162
+ getListTemplate(listTemplate) {
163
+ switch (listTemplate) {
164
+ case 'SitePages':
165
+ return '119';
166
+ case 'Library':
167
+ return '101';
168
+ default:
169
+ return '100';
170
+ }
171
+ }
172
+ }
173
+ _SpoTenantCommandSetAddCommand_instances = new WeakSet(), _SpoTenantCommandSetAddCommand_initTelemetry = function _SpoTenantCommandSetAddCommand_initTelemetry() {
174
+ this.telemetry.push((args) => {
175
+ Object.assign(this.telemetryProperties, {
176
+ listType: args.options.listType,
177
+ clientSideComponentProperties: typeof args.options.clientSideComponentProperties !== 'undefined',
178
+ webTemplate: typeof args.options.webTemplate !== 'undefined',
179
+ location: args.options.location
180
+ });
181
+ });
182
+ }, _SpoTenantCommandSetAddCommand_initOptions = function _SpoTenantCommandSetAddCommand_initOptions() {
183
+ this.options.unshift({
184
+ option: '-t, --title <title>'
185
+ }, {
186
+ option: '-l, --listType <listType>',
187
+ autocomplete: SpoTenantCommandSetAddCommand.listTypes
188
+ }, {
189
+ option: '-i, --clientSideComponentId <clientSideComponentId>'
190
+ }, {
191
+ option: '-p, --clientSideComponentProperties [clientSideComponentProperties]'
192
+ }, {
193
+ option: '-w, --webTemplate [webTemplate]'
194
+ }, {
195
+ option: '--location [location]',
196
+ autocomplete: SpoTenantCommandSetAddCommand.locations
197
+ });
198
+ }, _SpoTenantCommandSetAddCommand_initValidators = function _SpoTenantCommandSetAddCommand_initValidators() {
199
+ this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
200
+ if (!validation_1.validation.isValidGuid(args.options.clientSideComponentId)) {
201
+ return `${args.options.clientSideComponentId} is not a valid GUID`;
202
+ }
203
+ if (SpoTenantCommandSetAddCommand.listTypes.indexOf(args.options.listType) < 0) {
204
+ return `${args.options.listType} is not a valid list type. Allowed values are ${SpoTenantCommandSetAddCommand.listTypes.join(', ')}`;
205
+ }
206
+ if (args.options.location && SpoTenantCommandSetAddCommand.locations.indexOf(args.options.location) < 0) {
207
+ return `${args.options.location} is not a valid location. Allowed values are ${SpoTenantCommandSetAddCommand.locations.join(', ')}`;
208
+ }
209
+ return true;
210
+ }));
211
+ };
212
+ SpoTenantCommandSetAddCommand.listTypes = ['List', 'Library', 'SitePages'];
213
+ SpoTenantCommandSetAddCommand.locations = ['ContextMenu', 'CommandBar', 'Both'];
214
+ module.exports = new SpoTenantCommandSetAddCommand();
215
+ //# sourceMappingURL=tenant-commandset-add.js.map
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ 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");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _SpoTenantCommandSetGetCommand_instances, _SpoTenantCommandSetGetCommand_initTelemetry, _SpoTenantCommandSetGetCommand_initOptions, _SpoTenantCommandSetGetCommand_initValidators, _SpoTenantCommandSetGetCommand_initOptionSets;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const Command_1 = require("../../../../Command");
19
+ const request_1 = require("../../../../request");
20
+ const formatting_1 = require("../../../../utils/formatting");
21
+ const spo_1 = require("../../../../utils/spo");
22
+ const urlUtil_1 = require("../../../../utils/urlUtil");
23
+ const validation_1 = require("../../../../utils/validation");
24
+ const SpoCommand_1 = require("../../../base/SpoCommand");
25
+ const commands_1 = require("../../commands");
26
+ class SpoTenantCommandSetGetCommand extends SpoCommand_1.default {
27
+ get name() {
28
+ return commands_1.default.TENANT_COMMANDSET_GET;
29
+ }
30
+ get description() {
31
+ return 'Get a ListView Command Set that is installed tenant wide';
32
+ }
33
+ constructor() {
34
+ super();
35
+ _SpoTenantCommandSetGetCommand_instances.add(this);
36
+ __classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initTelemetry).call(this);
37
+ __classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initOptions).call(this);
38
+ __classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initValidators).call(this);
39
+ __classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initOptionSets).call(this);
40
+ }
41
+ commandAction(logger, args) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ const appCatalogUrl = yield spo_1.spo.getTenantAppCatalogUrl(logger, this.debug);
44
+ if (!appCatalogUrl) {
45
+ throw new Command_1.CommandError('No app catalog URL found');
46
+ }
47
+ let filter = `startswith(TenantWideExtensionLocation,'ClientSideExtension.ListViewCommandSet')`;
48
+ if (args.options.title) {
49
+ filter += ` and Title eq '${args.options.title}'`;
50
+ }
51
+ else if (args.options.id) {
52
+ filter += ` and Id eq ${args.options.id}`;
53
+ }
54
+ else if (args.options.clientSideComponentId) {
55
+ filter += ` and TenantWideExtensionComponentId eq '${args.options.clientSideComponentId}'`;
56
+ }
57
+ const listServerRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(appCatalogUrl, '/lists/TenantWideExtensions');
58
+ const reqOptions = {
59
+ url: `${appCatalogUrl}/_api/web/GetList('${formatting_1.formatting.encodeQueryParameter(listServerRelativeUrl)}')/items?$filter=${filter}`,
60
+ headers: {
61
+ 'accept': 'application/json;odata=nometadata'
62
+ },
63
+ responseType: 'json'
64
+ };
65
+ try {
66
+ const listItemInstances = yield request_1.default.get(reqOptions);
67
+ if ((listItemInstances === null || listItemInstances === void 0 ? void 0 : listItemInstances.value.length) > 0) {
68
+ if (listItemInstances.value.length > 1) {
69
+ throw `Multiple ListView Command Sets with ${args.options.title || args.options.clientSideComponentId} were found. Please disambiguate (IDs): ${listItemInstances.value.map(item => item.Id).join(', ')}`;
70
+ }
71
+ listItemInstances.value.forEach(v => delete v['ID']);
72
+ logger.log(listItemInstances.value[0]);
73
+ }
74
+ else {
75
+ throw 'The specified ListView Command Set was not found';
76
+ }
77
+ }
78
+ catch (err) {
79
+ return this.handleRejectedODataJsonPromise(err);
80
+ }
81
+ });
82
+ }
83
+ }
84
+ _SpoTenantCommandSetGetCommand_instances = new WeakSet(), _SpoTenantCommandSetGetCommand_initTelemetry = function _SpoTenantCommandSetGetCommand_initTelemetry() {
85
+ this.telemetry.push((args) => {
86
+ Object.assign(this.telemetryProperties, {
87
+ title: typeof args.options.title !== 'undefined',
88
+ id: typeof args.options.id !== 'undefined',
89
+ clientSideComponentId: typeof args.options.clientSideComponentId !== 'undefined'
90
+ });
91
+ });
92
+ }, _SpoTenantCommandSetGetCommand_initOptions = function _SpoTenantCommandSetGetCommand_initOptions() {
93
+ this.options.unshift({
94
+ option: '-t, --title [title]'
95
+ }, {
96
+ option: '-i, --id [id]'
97
+ }, {
98
+ option: '-c, --clientSideComponentId [clientSideComponentId]'
99
+ });
100
+ }, _SpoTenantCommandSetGetCommand_initValidators = function _SpoTenantCommandSetGetCommand_initValidators() {
101
+ this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
102
+ if (args.options.id && isNaN(parseInt(args.options.id))) {
103
+ return `${args.options.id} is not a number`;
104
+ }
105
+ if (args.options.clientSideComponentId && !validation_1.validation.isValidGuid(args.options.clientSideComponentId)) {
106
+ return `${args.options.clientSideComponentId} is not a valid GUID`;
107
+ }
108
+ return true;
109
+ }));
110
+ }, _SpoTenantCommandSetGetCommand_initOptionSets = function _SpoTenantCommandSetGetCommand_initOptionSets() {
111
+ this.optionSets.push({ options: ['title', 'id', 'clientSideComponentId'] });
112
+ };
113
+ module.exports = new SpoTenantCommandSetGetCommand();
114
+ //# sourceMappingURL=tenant-commandset-get.js.map
@@ -295,6 +295,8 @@ exports.default = {
295
295
  TENANT_APPLICATIONCUSTOMIZER_GET: `${prefix} tenant applicationcustomizer get`,
296
296
  TENANT_APPLICATIONCUSTOMIZER_LIST: `${prefix} tenant applicationcustomizer list`,
297
297
  TENANT_APPLICATIONCUSTOMIZER_REMOVE: `${prefix} tenant applicationcustomizer remove`,
298
+ TENANT_COMMANDSET_ADD: `${prefix} tenant commandset add`,
299
+ TENANT_COMMANDSET_GET: `${prefix} tenant commandset get`,
298
300
  TENANT_COMMANDSET_REMOVE: `${prefix} tenant commandset remove`,
299
301
  TENANT_COMMANDSET_SET: `${prefix} tenant commandset set`,
300
302
  TENANT_RECYCLEBINITEM_LIST: `${prefix} tenant recyclebinitem list`,
@@ -12,6 +12,7 @@ const settingsNames = {
12
12
  disableTelemetry: 'disableTelemetry',
13
13
  errorOutput: 'errorOutput',
14
14
  helpMode: 'helpMode',
15
+ interactive: 'interactive',
15
16
  output: 'output',
16
17
  printErrorsAsPlainText: 'printErrorsAsPlainText',
17
18
  prompt: 'prompt',
package/dist/utils/spo.js CHANGED
@@ -568,6 +568,66 @@ exports.spo = {
568
568
  const res = yield request_1.default.get(requestOptions);
569
569
  return res.AadObjectId.NameId;
570
570
  });
571
+ },
572
+ /**
573
+ * Retrieves the menu state for the quick launch.
574
+ * @param webUrl Web url
575
+ */
576
+ getQuickLaunchMenuState(webUrl) {
577
+ return __awaiter(this, void 0, void 0, function* () {
578
+ return this.getMenuState(webUrl);
579
+ });
580
+ },
581
+ /**
582
+ * Retrieves the menu state for the top navigation.
583
+ * @param webUrl Web url
584
+ */
585
+ getTopNavigationMenuState(webUrl) {
586
+ return __awaiter(this, void 0, void 0, function* () {
587
+ return this.getMenuState(webUrl, '1002');
588
+ });
589
+ },
590
+ /**
591
+ * Retrieves the menu state.
592
+ * @param webUrl Web url
593
+ * @param menuNodeKey Menu node key
594
+ */
595
+ getMenuState(webUrl, menuNodeKey) {
596
+ return __awaiter(this, void 0, void 0, function* () {
597
+ const requestBody = {
598
+ customProperties: null,
599
+ depth: 10,
600
+ mapProviderName: null,
601
+ menuNodeKey: menuNodeKey || null
602
+ };
603
+ const requestOptions = {
604
+ url: `${webUrl}/_api/navigation/MenuState`,
605
+ headers: {
606
+ accept: 'application/json;odata=nometadata'
607
+ },
608
+ data: requestBody,
609
+ responseType: 'json'
610
+ };
611
+ return request_1.default.post(requestOptions);
612
+ });
613
+ },
614
+ /**
615
+ * Saves the menu state.
616
+ * @param webUrl Web url
617
+ * @param menuState Updated menu state
618
+ */
619
+ saveMenuState(webUrl, menuState) {
620
+ return __awaiter(this, void 0, void 0, function* () {
621
+ const requestOptions = {
622
+ url: `${webUrl}/_api/navigation/SaveMenuState`,
623
+ headers: {
624
+ accept: 'application/json;odata=nometadata'
625
+ },
626
+ data: { menuState: menuState },
627
+ responseType: 'json'
628
+ };
629
+ return request_1.default.post(requestOptions);
630
+ });
571
631
  }
572
632
  };
573
633
  //# sourceMappingURL=spo.js.map
@@ -16,10 +16,13 @@ m365 flow list [options]
16
16
 
17
17
  ```md definition-list
18
18
  `-e, --environmentName <environmentName>`
19
- : The name of the environment for which to retrieve available flows
19
+ : The name of the environment for which to retrieve available flows.
20
+
21
+ `--sharingStatus [sharingStatus]`
22
+ : List a specific type of flows. Valid values: `ownedByMe`, `personal`, `sharedWithMe`, `all`. Defaults to `ownedByMe`. Don't specify this option when using asAdmin.
20
23
 
21
24
  `--asAdmin`
22
- : Set, to list all Flows as admin. Otherwise will return only your own flows
25
+ : Set, to list all Flows as admin. Otherwise will return only your own flows.
23
26
  ```
24
27
 
25
28
  <Global />
@@ -34,7 +37,12 @@ This command is based on an API that is currently in preview and is subject to c
34
37
 
35
38
  If the environment with the name you specified doesn't exist, you will get the `Access to the environment 'xyz' is denied.` error.
36
39
 
37
- By default, the `flow list` command returns only your flows. To list all flows, use the `asAdmin` option.
40
+ When you specify a value for `sharingStatus`, consider the following:
41
+
42
+ - `ownedByMe` returns all flows created by you regardless of whether they are shared or not.
43
+ - `personal` returns all flows created by you which are not shared.
44
+ - `sharedWithMe` returns flows that are shared with you, or created by you and shared with someone.
45
+ - `all` combines `personal` and `sharedWithMe`.
38
46
 
39
47
  ## Examples
40
48
 
@@ -30,9 +30,6 @@ m365 flow run list [options]
30
30
  `--triggerEndTime [triggerEndTime]`
31
31
  : Time indicating the exclusive end of a time range of flow runs to return. This should be defined as a valid ISO 8601 string (2021-12-16T18:28:48.6964197Z).
32
32
 
33
- `--sharingStatus [sharingStatus]`
34
- : List a specific type of flows. Valid values: `ownedByMe`, `personal`, `sharedWithMe`, `all`. Defaults to `ownedByMe`. Don't specify this option when using asAdmin.
35
-
36
33
  `--asAdmin`
37
34
  : Run the command as admin. Use this flag when targeting flows you don't own.
38
35
  ```
@@ -35,6 +35,9 @@ m365 spo navigation node add [options]
35
35
 
36
36
  `--audienceIds [audienceIds]`
37
37
  : Comma-separated list of group IDs that will be used for audience targeting. The limit is 10 ids per navigation node.
38
+
39
+ `--openInNewWindow`
40
+ : Set, if the link has to be opened in a new window.
38
41
  ```
39
42
 
40
43
  <Global />
@@ -57,16 +60,16 @@ Add a navigation node pointing to an external page to the quick launch
57
60
  m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --location QuickLaunch --title "About us" --url https://contoso.com/about-us --isExternal
58
61
  ```
59
62
 
60
- Add a navigation node below an existing node
63
+ Add a navigation node below an existing node and opens it in a new window
61
64
 
62
65
  ```sh
63
- m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --parentNodeId 2010 --title About --url /sites/team-s/sitepages/about.aspx
66
+ m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --parentNodeId 2010 --title About --url /sites/team-s/sitepages/about.aspx --openInNewWindow
64
67
  ```
65
68
 
66
- Add a navigation node to the top navigation which is audience targetted
69
+ Add a navigation node to the top navigation which is audience targetted and open it in a new window
67
70
 
68
71
  ```sh
69
- m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --location TopNavigationBar --title About --url /sites/team-s/sitepages/about.aspx --audienceIds "7aa4a1ca-4035-4f2f-bac7-7beada59b5ba,4bbf236f-a131-4019-b4a2-315902fcfa3a"
72
+ m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --location TopNavigationBar --title About --url /sites/team-s/sitepages/about.aspx --audienceIds "7aa4a1ca-4035-4f2f-bac7-7beada59b5ba,4bbf236f-a131-4019-b4a2-315902fcfa3a" --openInNewWindow
70
73
  ```
71
74
 
72
75
  ## Response
@@ -30,6 +30,9 @@ m365 spo navigation node set [options]
30
30
 
31
31
  `--isExternal [isExternal]`
32
32
  : Whether the navigation node points to an external URL. Valid values: `true` or `false`.
33
+
34
+ `--openInNewWindow [openInNewWindow]`
35
+ : Open the URL in a new window. Valid values: `true` or `false`.
33
36
  ```
34
37
 
35
38
  <Global />
@@ -58,6 +61,12 @@ Updates audience targeting of a navigation node with 3 groups
58
61
  m365 spo navigation node set --webUrl https://contoso.sharepoint.com/sites/marketing --id 2209 --audienceIds "61f78c73-f71a-471e-a3b9-15daa936e200,9524e6b4-e663-44fe-b179-210c963e37e7,c42b8756-494d-4141-a575-45f01320e26a"
59
62
  ```
60
63
 
64
+ Updates the navigation node so that it opens in a new window
65
+
66
+ ```sh
67
+ m365 spo navigation node set --webUrl https://contoso.sharepoint.com/sites/marketing --id 2209 --openInNewWindow true
68
+ ```
69
+
61
70
  ## Response
62
71
 
63
72
  The command won't return a response on success.
@@ -0,0 +1,183 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # spo tenant commandset add
6
+
7
+ Add a ListView Command Set as a tenant-wide extension.
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ m365 spo tenant commandset add [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ ```md defintion-list
18
+ `-t, --title <title>`
19
+ : The title of the ListView Command Set.
20
+
21
+ `-l, --listType <listType>`
22
+ : The list or library type to register the ListView Command Set on. Allowed values `List` or `Library`.
23
+
24
+ `-i, --clientSideComponentId <clientSideComponentId>`
25
+ : The Client Side Component Id (GUID) of the ListView Command Set.
26
+
27
+ `-p, --clientSideComponentProperties [clientSideComponentProperties]`
28
+ : The Client Side Component properties of the ListView Command Set.
29
+
30
+ `-w, --webTemplate [webTemplate]`
31
+ : Optionally add a web template (e.g. STS#3, SITEPAGEPUBLISHING#0, etc) as a filter for what kind of sites the ListView Command Set is registered on.
32
+
33
+ `--location [location]`
34
+ : The location of the ListView Command Set. Allowed values `ContextMenu`, `CommandBar` or `Both`. Defaults to `CommandBar`.
35
+ ```
36
+
37
+ <Global />
38
+
39
+ ## Remarks
40
+
41
+ Running this command from the Windows Command Shell (cmd.exe) or PowerShell for Windows OS XP, 7, 8, 8.1 without bash installed might require additional formatting for command options that have JSON, XML, or JavaScript values because the command shell treats quotes differently. For example, this is how commandset user custom action can be created from the Windows cmd.exe:
42
+
43
+ ```sh
44
+ m365 spo tenant commandset add --title "YourAppCustomizer" --clientSideComponentId b41916e7-e69d-467f-b37f-ff8ecf8f99f2 --clientSideComponentProperties '{\"testMessage\":\"Test message\"}'
45
+ ```
46
+
47
+ Note, how the clientSideComponentProperties option has escaped double quotes `'{\"testMessage\":\"Test message\"}'` compared to execution from bash `'{"testMessage":"Test message"}'`.
48
+
49
+ :::caution Escaping JSON in PowerShell
50
+
51
+ When using the `--clientSideComponentProperties` option it's possible to enter a JSON string. In PowerShell 5 to 7.2 [specific escaping rules](./../../../user-guide/using-cli.mdx#escaping-double-quotes-in-powershell) apply due to an issue. Remember that you can also use [file tokens](./../../../user-guide/using-cli.mdx#passing-complex-content-into-cli-options) instead.
52
+
53
+ :::
54
+
55
+ :::info
56
+
57
+ To use this command, you need to be a SharePoint Admin.
58
+
59
+ :::
60
+
61
+ ## Examples
62
+
63
+ Adds a ListView Command Set that's deployed tenant wide to CommandBars of Lists.
64
+
65
+ ```sh
66
+ m365 spo tenant commandset add --title "Some customizer" --clientSideComponentId 799883f5-7962-4384-a10a-105adaec6ffc --listType List
67
+ ```
68
+
69
+ Adds a ListView Command Set that is configured to the context menu of communication site libraries.
70
+
71
+ ```sh
72
+ m365 spo tenant commandset add --title "Some customizer" --clientSideComponentId 799883f5-7962-4384-a10a-105adaec6ffc --webTemplate "SITEPAGEPUBLISHING#0" --listType Library --location ContextMenu
73
+ ```
74
+
75
+ ## Response
76
+
77
+ <Tabs>
78
+ <TabItem value="JSON">
79
+
80
+ ```json
81
+ {
82
+ "FileSystemObjectType": 0,
83
+ "Id": 4,
84
+ "ServerRedirectedEmbedUri": null,
85
+ "ServerRedirectedEmbedUrl": "",
86
+ "ID": 4,
87
+ "ContentTypeId": "0x00693E2C487575B448BD420C12CEAE7EFE",
88
+ "Title": "Some ListView Command Set",
89
+ "Modified": "2023-01-11T15:47:38Z",
90
+ "Created": "2023-01-11T15:47:38Z",
91
+ "AuthorId": 9,
92
+ "EditorId": 9,
93
+ "OData__UIVersionString": "1.0",
94
+ "Attachments": false,
95
+ "GUID": "14125658-a9bc-4ddf-9c75-1b5767c9a337",
96
+ "ComplianceAssetId": null,
97
+ "TenantWideExtensionComponentId": "7096cded-b83d-4eab-96f0-df477ed7c0bc",
98
+ "TenantWideExtensionComponentProperties": "{\"testMessage\":\"Test message\"}",
99
+ "TenantWideExtensionWebTemplate": null,
100
+ "TenantWideExtensionListTemplate": 101,
101
+ "TenantWideExtensionLocation": "ClientSideExtension.ListViewCommandSet.ContextMenu",
102
+ "TenantWideExtensionSequence": 0,
103
+ "TenantWideExtensionHostProperties": null,
104
+ "TenantWideExtensionDisabled": false
105
+ }
106
+ ```
107
+
108
+ </TabItem>
109
+ <TabItem value="Text">
110
+
111
+ ```text
112
+ Attachments : false
113
+ AuthorId : 9
114
+ ComplianceAssetId : null
115
+ ContentTypeId : 0x00693E2C487575B448BD420C12CEAE7EFE
116
+ Created : 2023-01-11T15:47:38Z
117
+ EditorId : 9
118
+ FileSystemObjectType : 0
119
+ GUID : 14125658-a9bc-4ddf-9c75-1b5767c9a337
120
+ Id : 4
121
+ ID : 4
122
+ Modified : 2023-01-11T15:47:38Z
123
+ OData__UIVersionString : 1.0
124
+ ServerRedirectedEmbedUri : null
125
+ ServerRedirectedEmbedUrl :
126
+ TenantWideExtensionComponentId : 7096cded-b83d-4eab-96f0-df477ed7c0bc
127
+ TenantWideExtensionComponentProperties: {"testMessage":"Test message"}
128
+ TenantWideExtensionDisabled : false
129
+ TenantWideExtensionHostProperties : null
130
+ TenantWideExtensionListTemplate : 101
131
+ TenantWideExtensionLocation : ClientSideExtension.ListViewCommandSet.ContextMenu
132
+ TenantWideExtensionSequence : 0
133
+ TenantWideExtensionWebTemplate : null
134
+ Title : Some ListView Command Set
135
+ ```
136
+
137
+ </TabItem>
138
+ <TabItem value="CSV">
139
+
140
+ ```csv
141
+ FileSystemObjectType,Id,ServerRedirectedEmbedUri,ServerRedirectedEmbedUrl,ID,ContentTypeId,Title,Modified,Created,AuthorId,EditorId,OData__UIVersionString,Attachments,GUID,ComplianceAssetId,TenantWideExtensionComponentId,TenantWideExtensionComponentProperties,TenantWideExtensionWebTemplate,TenantWideExtensionListTemplate,TenantWideExtensionLocation,TenantWideExtensionSequence,TenantWideExtensionHostProperties,TenantWideExtensionDisabled
142
+ 0,4,,,4,0x00693E2C487575B448BD420C12CEAE7EFE,Some ListView Command Set,2023-01-11T15:47:38Z,2023-01-11T15:47:38Z,9,9,1.0,,14125658-a9bc-4ddf-9c75-1b5767c9a337,,7096cded-b83d-4eab-96f0-df477ed7c0bc,"{""testMessage"":""Test message""}",,101,ClientSideExtension.ListViewCommandSet.ContextMenu,0,,
143
+ ```
144
+
145
+ </TabItem>
146
+ <TabItem value="Markdown">
147
+
148
+ ```md
149
+ # spo listitem add --webUrl "https://contoso.sharepoint.com/sites/appcatalog" --listUrl "/sites/appcatalog/Lists/TenantWideExtensions" --Title "Some ListView Command Set" --TenantWideExtensionComponentId "7096cded-b83d-4eab-96f0-df477ed7c0bc" --TenantWideExtensionLocation "ClientSideExtension.ListViewCommandSet.ContextMenu" --TenantWideExtensionSequence "0" --TenantWideExtensionListTemplate "101" --TenantWideExtensionComponentProperties "{"testMessage":"Test message"}" --TenantWideExtensionWebTemplate "" --TenantWideExtensionDisabled "false" --verbose "false" --debug "false" --_ ""
150
+
151
+ Date: 1/13/2023
152
+
153
+ ## Some ListView Command Set (4)
154
+
155
+ Property | Value
156
+ ---------|-------
157
+ FileSystemObjectType | 0
158
+ Id | 4
159
+ ServerRedirectedEmbedUri | null
160
+ ServerRedirectedEmbedUrl |
161
+ ID | 4
162
+ ContentTypeId | 0x00693E2C487575B448BD420C12CEAE7EFE
163
+ Title | Some customizer
164
+ Modified | 2023-01-11T15:47:38Z
165
+ Created | 2023-01-11T15:47:38Z
166
+ AuthorId | 9
167
+ EditorId | 9
168
+ OData\_\_UIVersionString | 1.0
169
+ Attachments | false
170
+ GUID | 14125658-a9bc-4ddf-9c75-1b5767c9a337
171
+ ComplianceAssetId | null
172
+ TenantWideExtensionComponentId | 7096cded-b83d-4eab-96f0-df477ed7c0bc
173
+ TenantWideExtensionComponentProperties | {"testMessage":"Test message"}
174
+ TenantWideExtensionWebTemplate | null
175
+ TenantWideExtensionListTemplate | 101
176
+ TenantWideExtensionLocation | ClientSideExtension.ListViewCommandSet.ContextMenu
177
+ TenantWideExtensionSequence | 0
178
+ TenantWideExtensionHostProperties | null
179
+ TenantWideExtensionDisabled | false
180
+ ```
181
+
182
+ </TabItem>
183
+ </Tabs>
@@ -0,0 +1,155 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # spo tenant commandset get
6
+
7
+ Get a ListView Command Set that is installed tenant wide
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ spo tenant commandset get [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ ```md defintion-list
18
+ `-t, --title [title]`
19
+ : The title of the ListView Command Set. Specify either `title`, `id`, or `clientSideComponentId`.
20
+
21
+ `-i, --id [id]`
22
+ : The id of the ListView Command Set. Specify either `title`, `id`, or `clientSideComponentId`.
23
+
24
+ `-c, --clientSideComponentId [clientSideComponentId]`
25
+ : The Client Side Component Id (GUID) of the ListView Command Set. Specify either `title`, `id`, or `clientSideComponentId`.
26
+ ```
27
+
28
+ <Global />
29
+
30
+ ## Examples
31
+
32
+ Retrieves a ListView Command Set by title.
33
+
34
+ ```sh
35
+ m365 spo tenant commandset get --title "Some customizer"
36
+ ```
37
+
38
+ Retrieves a ListView Command Set by id.
39
+
40
+ ```sh
41
+ m365 spo tenant commandset get --id 3
42
+ ```
43
+
44
+ Retrieves a ListView Command Set by clientSideComponentId.
45
+
46
+ ```sh
47
+ m365 spo tenant commandset get --clientSideComponentId 7096cded-b83d-4eab-96f0-df477ed7c0bc
48
+ ```
49
+
50
+ ## Response
51
+
52
+ <Tabs>
53
+ <TabItem value="JSON">
54
+
55
+ ```json
56
+ {
57
+ "FileSystemObjectType": 0,
58
+ "Id": 4,
59
+ "ServerRedirectedEmbedUri": null,
60
+ "ServerRedirectedEmbedUrl": "",
61
+ "ContentTypeId": "0x00693E2C487575B448BD420C12CEAE7EFE",
62
+ "Title": "Some ListView Command Set",
63
+ "Modified": "2023-01-11T15:47:38Z",
64
+ "Created": "2023-01-11T15:47:38Z",
65
+ "AuthorId": 9,
66
+ "EditorId": 9,
67
+ "OData__UIVersionString": "1.0",
68
+ "Attachments": false,
69
+ "GUID": "14125658-a9bc-4ddf-9c75-1b5767c9a337",
70
+ "ComplianceAssetId": null,
71
+ "TenantWideExtensionComponentId": "7096cded-b83d-4eab-96f0-df477ed7c0bc",
72
+ "TenantWideExtensionComponentProperties": "{\"testMessage\":\"Test message\"}",
73
+ "TenantWideExtensionWebTemplate": null,
74
+ "TenantWideExtensionListTemplate": 101,
75
+ "TenantWideExtensionLocation": "ClientSideExtension.ListViewCommandSet.ContextMenu",
76
+ "TenantWideExtensionSequence": 0,
77
+ "TenantWideExtensionHostProperties": null,
78
+ "TenantWideExtensionDisabled": false
79
+ }
80
+ ```
81
+
82
+ </TabItem>
83
+ <TabItem value="Text">
84
+
85
+ ```text
86
+ Attachments : false
87
+ AuthorId : 9
88
+ ComplianceAssetId : null
89
+ ContentTypeId : 0x00693E2C487575B448BD420C12CEAE7EFE
90
+ Created : 2023-01-11T15:47:38Z
91
+ EditorId : 9
92
+ FileSystemObjectType : 0
93
+ GUID : 14125658-a9bc-4ddf-9c75-1b5767c9a337
94
+ Id : 4
95
+ Modified : 2023-01-11T15:47:38Z
96
+ OData__UIVersionString : 1.0
97
+ ServerRedirectedEmbedUri : null
98
+ ServerRedirectedEmbedUrl :
99
+ TenantWideExtensionComponentId : 7096cded-b83d-4eab-96f0-df477ed7c0bc
100
+ TenantWideExtensionComponentProperties: {"testMessage":"Test message"}
101
+ TenantWideExtensionDisabled : false
102
+ TenantWideExtensionHostProperties : null
103
+ TenantWideExtensionListTemplate : 101
104
+ TenantWideExtensionLocation : ClientSideExtension.ListViewCommandSet.ContextMenu
105
+ TenantWideExtensionSequence : 0
106
+ TenantWideExtensionWebTemplate : null
107
+ Title : Some ListView Command Set
108
+ ```
109
+
110
+ </TabItem>
111
+ <TabItem value="CSV">
112
+
113
+ ```csv
114
+ FileSystemObjectType,Id,ServerRedirectedEmbedUri,ServerRedirectedEmbedUrl,ContentTypeId,Title,Modified,Created,AuthorId,EditorId,OData__UIVersionString,Attachments,GUID,ComplianceAssetId,TenantWideExtensionComponentId,TenantWideExtensionComponentProperties,TenantWideExtensionWebTemplate,TenantWideExtensionListTemplate,TenantWideExtensionLocation,TenantWideExtensionSequence,TenantWideExtensionHostProperties,TenantWideExtensionDisabled
115
+ 0,4,,,0x00693E2C487575B448BD420C12CEAE7EFE,Some ListView Command Set,2023-01-11T15:47:38Z,2023-01-11T15:47:38Z,9,9,1.0,,14125658-a9bc-4ddf-9c75-1b5767c9a337,,7096cded-b83d-4eab-96f0-df477ed7c0bc,"{""testMessage"":""Test message""}",,101,ClientSideExtension.ListViewCommandSet.ContextMenu,0,,
116
+ ```
117
+
118
+ </TabItem>
119
+ <TabItem value="Markdown">
120
+
121
+ ```md
122
+ # spo tenant commandset get --title "Some ListView Command Set"
123
+
124
+ Date: 1/13/2023
125
+
126
+ ## Some ListView Command Set (4)
127
+
128
+ Property | Value
129
+ ---------|-------
130
+ FileSystemObjectType | 0
131
+ Id | 4
132
+ ServerRedirectedEmbedUri | null
133
+ ServerRedirectedEmbedUrl |
134
+ ContentTypeId | 0x00693E2C487575B448BD420C12CEAE7EFE
135
+ Title | Some customizer
136
+ Modified | 2023-01-11T15:47:38Z
137
+ Created | 2023-01-11T15:47:38Z
138
+ AuthorId | 9
139
+ EditorId | 9
140
+ OData\_\_UIVersionString | 1.0
141
+ Attachments | false
142
+ GUID | 14125658-a9bc-4ddf-9c75-1b5767c9a337
143
+ ComplianceAssetId | null
144
+ TenantWideExtensionComponentId | 7096cded-b83d-4eab-96f0-df477ed7c0bc
145
+ TenantWideExtensionComponentProperties | {"testMessage":"Test message"}
146
+ TenantWideExtensionWebTemplate | null
147
+ TenantWideExtensionListTemplate | 101
148
+ TenantWideExtensionLocation | ClientSideExtension.ListViewCommandSet.ContextMenu
149
+ TenantWideExtensionSequence | 0
150
+ TenantWideExtensionHostProperties | null
151
+ TenantWideExtensionDisabled | false
152
+ ```
153
+
154
+ </TabItem>
155
+ </Tabs>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnp/cli-microsoft365",
3
- "version": "6.9.0-beta.f488de8",
3
+ "version": "6.9.0-beta.f6054b4",
4
4
  "description": "Manage Microsoft 365 and SharePoint Framework projects on any platform",
5
5
  "license": "MIT",
6
6
  "main": "./dist/api.js",