@pnp/cli-microsoft365 6.3.0-beta.37c6261 → 6.3.0-beta.456e93a

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.
Files changed (79) hide show
  1. package/.eslintrc.js +2 -0
  2. package/dist/Command.js +4 -4
  3. package/dist/cli/Cli.js +38 -0
  4. package/dist/m365/aad/commands/user/user-recyclebinitem-clear.js +103 -0
  5. package/dist/m365/aad/commands/user/user-recyclebinitem-remove.js +92 -0
  6. package/dist/m365/aad/commands.js +2 -0
  7. package/dist/m365/context/commands/option/option-list.js +54 -0
  8. package/dist/m365/context/commands.js +1 -0
  9. package/dist/m365/flow/commands/environment/FlowEnvironmentDetails.js +3 -0
  10. package/dist/m365/flow/commands/environment/environment-get.js +26 -11
  11. package/dist/m365/pa/commands/environment/environment-get.js +13 -5
  12. package/dist/m365/planner/commands/plan/plan-get.js +17 -10
  13. package/dist/m365/planner/commands/plan/plan-set.js +21 -10
  14. package/dist/m365/planner/commands/roster/roster-get.js +61 -0
  15. package/dist/m365/planner/commands/roster/roster-member-remove.js +140 -0
  16. package/dist/m365/planner/commands/task/task-add.js +3 -0
  17. package/dist/m365/planner/commands.js +2 -0
  18. package/dist/m365/pp/commands/environment/environment-get.js +18 -9
  19. package/dist/m365/purview/commands/retentionevent/retentionevent-get.js +75 -0
  20. package/dist/m365/purview/commands/retentionevent/retentionevent-list.js +46 -0
  21. package/dist/m365/purview/commands/retentionevent/retentionevent-remove.js +97 -0
  22. package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-add.js +77 -0
  23. package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-get.js +13 -8
  24. package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-list.js +43 -0
  25. package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-remove.js +97 -0
  26. package/dist/m365/purview/commands/retentioneventtype/retentioneventtype-set.js +90 -0
  27. package/dist/m365/purview/commands/retentionlabel/retentionlabel-add.js +5 -0
  28. package/dist/m365/purview/commands/retentionlabel/retentionlabel-get.js +5 -0
  29. package/dist/m365/purview/commands/retentionlabel/retentionlabel-list.js +5 -0
  30. package/dist/m365/purview/commands/retentionlabel/retentionlabel-remove.js +5 -0
  31. package/dist/m365/purview/commands/retentionlabel/retentionlabel-set.js +11 -1
  32. package/dist/m365/purview/commands.js +8 -1
  33. package/dist/m365/spo/commands/customaction/customaction-get.js +17 -66
  34. package/dist/m365/spo/commands/customaction/customaction-list.js +2 -36
  35. package/dist/m365/spo/commands/customaction/customaction-remove.js +11 -18
  36. package/dist/m365/spo/commands/listitem/listitem-add.js +2 -1
  37. package/dist/m365/spo/commands/navigation/navigation-node-get.js +73 -0
  38. package/dist/m365/spo/commands/sitedesign/sitedesign-add.js +6 -0
  39. package/dist/m365/spo/commands/tenant/tenant-applicationcustomizer-add.js +179 -0
  40. package/dist/m365/spo/commands.js +2 -0
  41. package/dist/utils/aadUser.js +38 -0
  42. package/dist/utils/planner.js +1 -4
  43. package/dist/utils/spo.js +61 -0
  44. package/docs/docs/cmd/aad/user/user-recyclebinitem-clear.md +42 -0
  45. package/docs/docs/cmd/aad/user/user-recyclebinitem-remove.md +45 -0
  46. package/docs/docs/cmd/context/option/option-list.md +63 -0
  47. package/docs/docs/cmd/flow/environment/environment-get.md +31 -3
  48. package/docs/docs/cmd/login.md +26 -0
  49. package/docs/docs/cmd/logout.md +4 -0
  50. package/docs/docs/cmd/pa/environment/environment-get.md +8 -2
  51. package/docs/docs/cmd/planner/plan/plan-get.md +12 -12
  52. package/docs/docs/cmd/planner/plan/plan-set.md +10 -4
  53. package/docs/docs/cmd/planner/roster/roster-get.md +73 -0
  54. package/docs/docs/cmd/planner/roster/roster-member-remove.md +51 -0
  55. package/docs/docs/cmd/purview/retentionevent/retentionevent-get.md +132 -0
  56. package/docs/docs/cmd/purview/retentionevent/retentionevent-list.md +107 -0
  57. package/docs/docs/cmd/purview/retentionevent/retentionevent-remove.md +45 -0
  58. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-add.md +106 -0
  59. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-get.md +3 -0
  60. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-list.md +97 -0
  61. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-remove.md +43 -0
  62. package/docs/docs/cmd/purview/retentioneventtype/retentioneventtype-set.md +43 -0
  63. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-add.md +3 -0
  64. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-get.md +3 -0
  65. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-list.md +3 -0
  66. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-remove.md +3 -0
  67. package/docs/docs/cmd/purview/retentionlabel/retentionlabel-set.md +3 -0
  68. package/docs/docs/cmd/request.md +74 -0
  69. package/docs/docs/cmd/spo/list/list-contenttype-add.md +1 -1
  70. package/docs/docs/cmd/spo/list/list-contenttype-default-set.md +1 -1
  71. package/docs/docs/cmd/spo/list/list-contenttype-list.md +1 -1
  72. package/docs/docs/cmd/spo/list/list-contenttype-remove.md +1 -1
  73. package/docs/docs/cmd/spo/navigation/navigation-node-get.md +91 -0
  74. package/docs/docs/cmd/spo/sitedesign/sitedesign-add.md +3 -0
  75. package/docs/docs/cmd/spo/tenant/tenant-applicationcustomizer-add.md +59 -0
  76. package/docs/docs/cmd/status.md +46 -0
  77. package/docs/docs/cmd/version.md +26 -0
  78. package/npm-shrinkwrap.json +911 -876
  79. package/package.json +12 -12
@@ -0,0 +1,73 @@
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 _SpoNavigationNodeGetCommand_instances, _SpoNavigationNodeGetCommand_initOptions, _SpoNavigationNodeGetCommand_initValidators;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const request_1 = require("../../../../request");
19
+ const validation_1 = require("../../../../utils/validation");
20
+ const SpoCommand_1 = require("../../../base/SpoCommand");
21
+ const commands_1 = require("../../commands");
22
+ class SpoNavigationNodeGetCommand extends SpoCommand_1.default {
23
+ get name() {
24
+ return commands_1.default.NAVIGATION_NODE_GET;
25
+ }
26
+ get description() {
27
+ return 'Retrieve information about a specific navigation node';
28
+ }
29
+ constructor() {
30
+ super();
31
+ _SpoNavigationNodeGetCommand_instances.add(this);
32
+ __classPrivateFieldGet(this, _SpoNavigationNodeGetCommand_instances, "m", _SpoNavigationNodeGetCommand_initOptions).call(this);
33
+ __classPrivateFieldGet(this, _SpoNavigationNodeGetCommand_instances, "m", _SpoNavigationNodeGetCommand_initValidators).call(this);
34
+ }
35
+ commandAction(logger, args) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ if (this.verbose) {
38
+ logger.logToStderr(`Retrieving information about navigation node with id ${args.options.id}`);
39
+ }
40
+ const requestOptions = {
41
+ url: `${args.options.webUrl}/_api/web/navigation/GetNodeById(${args.options.id})`,
42
+ headers: {
43
+ 'accept': 'application/json;odata=nometadata'
44
+ },
45
+ responseType: 'json'
46
+ };
47
+ try {
48
+ const listInstance = yield request_1.default.get(requestOptions);
49
+ logger.log(listInstance);
50
+ }
51
+ catch (err) {
52
+ this.handleRejectedODataJsonPromise(err);
53
+ }
54
+ });
55
+ }
56
+ }
57
+ _SpoNavigationNodeGetCommand_instances = new WeakSet(), _SpoNavigationNodeGetCommand_initOptions = function _SpoNavigationNodeGetCommand_initOptions() {
58
+ this.options.unshift({
59
+ option: '-u, --webUrl <webUrl>'
60
+ }, {
61
+ option: '--id <id>'
62
+ });
63
+ }, _SpoNavigationNodeGetCommand_initValidators = function _SpoNavigationNodeGetCommand_initValidators() {
64
+ this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
65
+ const id = parseInt(args.options.id);
66
+ if (isNaN(id)) {
67
+ return `${args.options.id} is not a valid number`;
68
+ }
69
+ return validation_1.validation.isValidSharePointUrl(args.options.webUrl);
70
+ }));
71
+ };
72
+ module.exports = new SpoNavigationNodeGetCommand();
73
+ //# sourceMappingURL=navigation-node-get.js.map
@@ -53,6 +53,9 @@ class SpoSiteDesignAddCommand extends SpoCommand_1.default {
53
53
  if (args.options.previewImageAltText) {
54
54
  info.PreviewImageAltText = args.options.previewImageAltText;
55
55
  }
56
+ if (args.options.thumbnailUrl) {
57
+ info.ThumbnailUrl = args.options.thumbnailUrl;
58
+ }
56
59
  if (args.options.isDefault) {
57
60
  info.IsDefault = true;
58
61
  }
@@ -83,6 +86,7 @@ _SpoSiteDesignAddCommand_instances = new WeakSet(), _SpoSiteDesignAddCommand_ini
83
86
  description: (!(!args.options.description)).toString(),
84
87
  previewImageUrl: (!(!args.options.previewImageUrl)).toString(),
85
88
  previewImageAltText: (!(!args.options.previewImageAltText)).toString(),
89
+ thumbnailUrl: (!(!args.options.thumbnailUrl)).toString(),
86
90
  isDefault: args.options.isDefault || false
87
91
  });
88
92
  });
@@ -100,6 +104,8 @@ _SpoSiteDesignAddCommand_instances = new WeakSet(), _SpoSiteDesignAddCommand_ini
100
104
  option: '-m, --previewImageUrl [previewImageUrl]'
101
105
  }, {
102
106
  option: '-a, --previewImageAltText [previewImageAltText]'
107
+ }, {
108
+ option: '--thumbnailUrl [thumbnailUrl]'
103
109
  }, {
104
110
  option: '--isDefault'
105
111
  });
@@ -0,0 +1,179 @@
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 _SpoTenantApplicationCustomizerAddCommand_instances, _SpoTenantApplicationCustomizerAddCommand_initTelemetry, _SpoTenantApplicationCustomizerAddCommand_initOptions, _SpoTenantApplicationCustomizerAddCommand_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/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 SpoTenantApplicationCustomizerAddCommand extends SpoCommand_1.default {
27
+ get name() {
28
+ return commands_1.default.TENANT_APPLICATIONCUSTOMIZER_ADD;
29
+ }
30
+ get description() {
31
+ return 'Add an application customizer as a tenant wide extension.';
32
+ }
33
+ constructor() {
34
+ super();
35
+ _SpoTenantApplicationCustomizerAddCommand_instances.add(this);
36
+ __classPrivateFieldGet(this, _SpoTenantApplicationCustomizerAddCommand_instances, "m", _SpoTenantApplicationCustomizerAddCommand_initTelemetry).call(this);
37
+ __classPrivateFieldGet(this, _SpoTenantApplicationCustomizerAddCommand_instances, "m", _SpoTenantApplicationCustomizerAddCommand_initOptions).call(this);
38
+ __classPrivateFieldGet(this, _SpoTenantApplicationCustomizerAddCommand_instances, "m", _SpoTenantApplicationCustomizerAddCommand_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 !== "ApplicationCustomizer") {
47
+ throw `The extension type of this component is not of type 'ApplicationCustomizer' 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 application customizer 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: 'ClientSideExtension.ApplicationCustomizer',
140
+ TenantWideExtensionSequence: 0,
141
+ TenantWideExtensionListTemplate: 0,
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
+ }
153
+ _SpoTenantApplicationCustomizerAddCommand_instances = new WeakSet(), _SpoTenantApplicationCustomizerAddCommand_initTelemetry = function _SpoTenantApplicationCustomizerAddCommand_initTelemetry() {
154
+ this.telemetry.push((args) => {
155
+ Object.assign(this.telemetryProperties, {
156
+ clientSideComponentProperties: typeof args.options.clientSideComponentProperties !== 'undefined',
157
+ webTemplate: typeof args.options.webTemplate !== 'undefined'
158
+ });
159
+ });
160
+ }, _SpoTenantApplicationCustomizerAddCommand_initOptions = function _SpoTenantApplicationCustomizerAddCommand_initOptions() {
161
+ this.options.unshift({
162
+ option: '-t, --title <title>'
163
+ }, {
164
+ option: '-i, --clientSideComponentId <clientSideComponentId>'
165
+ }, {
166
+ option: '-p, --clientSideComponentProperties [clientSideComponentProperties]'
167
+ }, {
168
+ option: '-w, --webTemplate [webTemplate]'
169
+ });
170
+ }, _SpoTenantApplicationCustomizerAddCommand_initValidators = function _SpoTenantApplicationCustomizerAddCommand_initValidators() {
171
+ this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
172
+ if (!validation_1.validation.isValidGuid(args.options.clientSideComponentId)) {
173
+ return `${args.options.clientSideComponentId} is not a valid GUID`;
174
+ }
175
+ return true;
176
+ }));
177
+ };
178
+ module.exports = new SpoTenantApplicationCustomizerAddCommand();
179
+ //# sourceMappingURL=tenant-applicationcustomizer-add.js.map
@@ -168,6 +168,7 @@ exports.default = {
168
168
  LISTITEM_SET: `${prefix} listitem set`,
169
169
  MAIL_SEND: `${prefix} mail send`,
170
170
  NAVIGATION_NODE_ADD: `${prefix} navigation node add`,
171
+ NAVIGATION_NODE_GET: `${prefix} navigation node get`,
171
172
  NAVIGATION_NODE_LIST: `${prefix} navigation node list`,
172
173
  NAVIGATION_NODE_REMOVE: `${prefix} navigation node remove`,
173
174
  NAVIGATION_NODE_SET: `${prefix} navigation node set`,
@@ -277,6 +278,7 @@ exports.default = {
277
278
  STORAGEENTITY_REMOVE: `${prefix} storageentity remove`,
278
279
  TENANT_APPCATALOG_ADD: `${prefix} tenant appcatalog add`,
279
280
  TENANT_APPCATALOGURL_GET: `${prefix} tenant appcatalogurl get`,
281
+ TENANT_APPLICATIONCUSTOMIZER_ADD: `${prefix} tenant applicationcustomizer add`,
280
282
  TENANT_RECYCLEBINITEM_LIST: `${prefix} tenant recyclebinitem list`,
281
283
  TENANT_RECYCLEBINITEM_REMOVE: `${prefix} tenant recyclebinitem remove`,
282
284
  TENANT_RECYCLEBINITEM_RESTORE: `${prefix} tenant recyclebinitem restore`,
@@ -0,0 +1,38 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.aadUser = void 0;
13
+ const request_1 = require("../request");
14
+ const formatting_1 = require("./formatting");
15
+ const graphResource = 'https://graph.microsoft.com';
16
+ exports.aadUser = {
17
+ /**
18
+ * Retrieve the id of a user by its UPN.
19
+ * @param upn User UPN.
20
+ */
21
+ getUserIdByUpn(upn) {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ const requestOptions = {
24
+ url: `${graphResource}/v1.0/users?$filter=userPrincipalName eq '${formatting_1.formatting.encodeQueryParameter(upn)}'&$select=Id`,
25
+ headers: {
26
+ accept: 'application/json;odata.metadata=none'
27
+ },
28
+ responseType: 'json'
29
+ };
30
+ const res = yield request_1.default.get(requestOptions);
31
+ if (res.value.length === 0) {
32
+ throw Error(`The specified user with user name ${upn} does not exist.`);
33
+ }
34
+ return res.value[0].id;
35
+ });
36
+ }
37
+ };
38
+ //# sourceMappingURL=aadUser.js.map
@@ -57,15 +57,12 @@ exports.planner = {
57
57
  * @param groupId Owner group ID.
58
58
  * @param rosterId Roster ID.
59
59
  */
60
- getPlanByTitle(title, groupId, rosterId, metadata = 'none') {
60
+ getPlanByTitle(title, groupId, metadata = 'none') {
61
61
  return __awaiter(this, void 0, void 0, function* () {
62
62
  let plans = [];
63
63
  if (groupId) {
64
64
  plans = yield this.getPlansByGroupId(groupId, metadata);
65
65
  }
66
- else if (rosterId) {
67
- plans = yield this.getPlansByRosterId(rosterId, metadata);
68
- }
69
66
  const filteredPlans = plans.filter(p => p.title && p.title.toLowerCase() === title.toLowerCase());
70
67
  if (!filteredPlans.length) {
71
68
  throw Error(`The specified plan '${title}' does not exist.`);
package/dist/utils/spo.js CHANGED
@@ -18,6 +18,7 @@ const config_1 = require("../config");
18
18
  const base_permissions_1 = require("../m365/spo/base-permissions");
19
19
  const request_1 = require("../request");
20
20
  const formatting_1 = require("./formatting");
21
+ const odata_1 = require("./odata");
21
22
  exports.spo = {
22
23
  getRequestDigest(siteUrl) {
23
24
  const requestOptions = {
@@ -484,6 +485,66 @@ exports.spo = {
484
485
  const res = yield request_1.default.get(requestOptions);
485
486
  return res;
486
487
  });
488
+ },
489
+ /**
490
+ * Retrieves a list of Custom Actions from a SharePoint site.
491
+ * @param webUrl Web url
492
+ * @param scope The scope of custom actions to retrieve, allowed values "Site", "Web" or "All".
493
+ * @param filter An OData filter query to limit the results.
494
+ */
495
+ getCustomActions(webUrl, scope, filter) {
496
+ return __awaiter(this, void 0, void 0, function* () {
497
+ if (scope && scope !== "All" && scope !== "Site" && scope !== "Web") {
498
+ throw `Invalid scope '${scope}'. Allowed values are 'Site', 'Web' or 'All'.`;
499
+ }
500
+ const queryString = filter ? `?$filter=${filter}` : "";
501
+ if (scope && scope !== "All") {
502
+ return yield odata_1.odata.getAllItems(`${webUrl}/_api/${scope}/UserCustomActions${queryString}`);
503
+ }
504
+ const customActions = [
505
+ ...yield odata_1.odata.getAllItems(`${webUrl}/_api/Site/UserCustomActions${queryString}`),
506
+ ...yield odata_1.odata.getAllItems(`${webUrl}/_api/Web/UserCustomActions${queryString}`)
507
+ ];
508
+ return customActions;
509
+ });
510
+ },
511
+ /**
512
+ * Retrieves a Custom Actions from a SharePoint site by Id.
513
+ * @param webUrl Web url
514
+ * @param id The Id of the Custom Action
515
+ * @param scope The scope of custom actions to retrieve, allowed values "Site", "Web" or "All".
516
+ */
517
+ getCustomActionById(webUrl, id, scope) {
518
+ return __awaiter(this, void 0, void 0, function* () {
519
+ if (scope && scope !== "All" && scope !== "Site" && scope !== "Web") {
520
+ throw `Invalid scope '${scope}'. Allowed values are 'Site', 'Web' or 'All'.`;
521
+ }
522
+ function getById(webUrl, id, scope) {
523
+ return __awaiter(this, void 0, void 0, function* () {
524
+ const requestOptions = {
525
+ url: `${webUrl}/_api/${scope}/UserCustomActions(guid'${id}')`,
526
+ headers: {
527
+ accept: 'application/json;odata=nometadata'
528
+ },
529
+ responseType: 'json'
530
+ };
531
+ const result = yield request_1.default.get(requestOptions);
532
+ if (result["odata.null"] === true) {
533
+ return undefined;
534
+ }
535
+ return result;
536
+ });
537
+ }
538
+ if (scope && scope !== "All") {
539
+ return yield getById(webUrl, id, scope);
540
+ }
541
+ const customActionOnWeb = yield getById(webUrl, id, "Web");
542
+ if (customActionOnWeb) {
543
+ return customActionOnWeb;
544
+ }
545
+ const customActionOnSite = yield getById(webUrl, id, "Site");
546
+ return customActionOnSite;
547
+ });
487
548
  }
488
549
  };
489
550
  //# sourceMappingURL=spo.js.map
@@ -0,0 +1,42 @@
1
+ # aad user recyclebinitem clear
2
+
3
+ Removes all users from the tenant recycle bin
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 aad user recyclebinitem clear [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ `--confirm`
14
+ : Don't prompt for confirmation.
15
+
16
+ --8<-- "docs/cmd/_global.md"
17
+
18
+ ## Remarks
19
+
20
+ !!! important
21
+ To use this command you must be a Global administrator, User administrator or Privileged Authentication administrator
22
+
23
+ !!! note
24
+ After running this command, it may take a minute before all deleted users are effectively removed from the tenant.
25
+
26
+ ## Examples
27
+
28
+ Removes all users from the tenant recycle bin
29
+
30
+ ```sh
31
+ m365 aad user recyclebinitem clear
32
+ ```
33
+
34
+ Removes all users from the tenant recycle bin without confirmation prompt
35
+
36
+ ```sh
37
+ m365 aad user recyclebinitem clear --confirm
38
+ ```
39
+
40
+ ## Response
41
+
42
+ The command won't return a response on success.
@@ -0,0 +1,45 @@
1
+ # aad user recyclebinitem remove
2
+
3
+ Removes a user from the recycle bin in the current tenant
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 aad user recyclebinitem remove [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ `--id <id>`
14
+ : ID of the deleted user.
15
+
16
+ `--confirm`
17
+ : Don't prompt for confirmation.
18
+
19
+ --8<-- "docs/cmd/_global.md"
20
+
21
+ ## Remarks
22
+
23
+ !!! important
24
+ To use this command you must be a Global administrator, User administrator or Privileged Authentication administrator
25
+
26
+ !!! note
27
+ After running this command, it may take a minute before the deleted user is effectively removed from the tenant.
28
+
29
+ ## Examples
30
+
31
+ Removes a specific user from the recycle bin
32
+
33
+ ```sh
34
+ m365 aad user recyclebinitem remove --id 59f80e08-24b1-41f8-8586-16765fd830d3
35
+ ```
36
+
37
+ Removes a specific user from the recycle bin without confirmation prompt
38
+
39
+ ```sh
40
+ m365 aad user recyclebinitem remove --id 59f80e08-24b1-41f8-8586-16765fd830d3 --confirm
41
+ ```
42
+
43
+ ## Response
44
+
45
+ The command won't return a response on success.
@@ -0,0 +1,63 @@
1
+ # context option list
2
+
3
+ List all options added to the context
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ m365 context option list [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ --8<-- "docs/cmd/_global.md"
14
+
15
+ ## Examples
16
+
17
+ List all options added to the context
18
+
19
+ ```sh
20
+ m365 context option list
21
+ ```
22
+
23
+ ## Response
24
+
25
+ The responses below are an example. The output may differ based on the contents of the context file
26
+
27
+ === "JSON"
28
+
29
+ ```json
30
+ {
31
+ "url": "https://contoso.sharepoint.com",
32
+ "list": "list name"
33
+ }
34
+ ```
35
+
36
+ === "Text"
37
+
38
+ ```text
39
+ list: list name
40
+ url : https://contoso.sharepoint.com
41
+ ```
42
+
43
+ === "CSV"
44
+
45
+ ```csv
46
+ url,list
47
+ https://contoso.sharepoint.com,list name
48
+ ```
49
+
50
+ === "Markdown"
51
+
52
+ ```md
53
+ # context option list
54
+
55
+ Date: 7/2/2023
56
+
57
+ ## https://contoso.sharepoint.com
58
+
59
+ Property | Value
60
+ ---------|-------
61
+ url | https://contoso.sharepoint.com
62
+ list | list name
63
+ ```
@@ -10,8 +10,8 @@ m365 flow environment get [options]
10
10
 
11
11
  ## Options
12
12
 
13
- `-n, --name <name>`
14
- : The name of the environment to get information about
13
+ `-n, --name [name]`
14
+ : The name of the environment to get information about. When not specified, the default environment is retrieved.
15
15
 
16
16
  --8<-- "docs/cmd/_global.md"
17
17
 
@@ -24,12 +24,17 @@ If the environment with the name you specified doesn't exist, you will get the `
24
24
 
25
25
  ## Examples
26
26
 
27
- Get information about the Microsoft Flow environment named _Default-d87a7535-dd31-4437-bfe1-95340acd55c5_
27
+ Get information about a Microsoft Flow environment specified by name
28
28
 
29
29
  ```sh
30
30
  m365 flow environment get --name Default-d87a7535-dd31-4437-bfe1-95340acd55c5
31
31
  ```
32
32
 
33
+ Get information about the default Microsoft Flow environment
34
+ ```sh
35
+ m365 flow environment get
36
+ ```
37
+
33
38
  ## Response
34
39
 
35
40
  ### Standard response
@@ -129,3 +134,26 @@ m365 flow environment get --name Default-d87a7535-dd31-4437-bfe1-95340acd55c5
129
134
  name,id,location,displayName,provisioningState,environmentSku,azureRegionHint,isDefault
130
135
  Default-d87a7535-dd31-4437-bfe1-95340acd55c5,/providers/Microsoft.ProcessSimple/environments/Default-d87a7535-dd31-4437-bfe1-95340acd55c5,india,contoso (default),Succeeded,Default,centralindia,1
131
136
  ```
137
+
138
+ === "Markdown"
139
+
140
+ ```md
141
+ # flow environment get
142
+
143
+ Date: 8/2/2023
144
+
145
+ ## contoso (default) (/providers/Microsoft.ProcessSimple/environments/Default-d87a7535-dd31-4437-bfe1-95340acd55c5)
146
+
147
+ Property | Value
148
+ ---------|-------
149
+ name | Default-d87a7535-dd31-4437-bfe1-95340acd55c5
150
+ location | india
151
+ type | Microsoft.ProcessSimple/environments
152
+ id | /providers/Microsoft.ProcessSimple/environments/Default-d87a7535-dd31-4437-bfe1-95340acd55c5
153
+ properties | {"displayName":"contoso (default)","createdTime":"2019-12-21T18:32:11.8708704Z","createdBy":{"id":"SYSTEM","displayName": "SYSTEM","type": "NotSpecified"},"provisioningState":"Succeeded","creationType":"DefaultTenant","environmentSku":"Default","environmentType":"NotSpecified","states":{"management":{"id":"NotSpecified"},"runtime":{"runtimeReasonCode":"NotSpecified","requestedBy":{"displayName":"SYSTEM","type":"NotSpecified"},"id":"Enabled"}},"isDefault":true,"isPayAsYouGoEnabled":false,"azureRegionHint":"centralindia","runtimeEndpoints":{"microsoft.BusinessAppPlatform":"https://india.api.bap.microsoft.com","microsoft.CommonDataModel":"https://india.api.cds.microsoft.com","microsoft.PowerApps":"https://india.api.powerapps.com",microsoft.PowerAppsAdvisor":"https://india.api.advisor.powerapps.com","microsoft.PowerVirtualAgents":"https://powervamg.in-il101.gateway.prod.island.powerapps.com","microsoft.ApiManagement":"https://management.INDIA.azure-apihub.net","microsoft.Flow":"https://india.api.flow.microsoft.com"},"linkedEnvironmentMetadata":{"type":"NotSpecified","resourceId":"3aa550bf-52ac-42fc-98f7-5d1833c1501c","friendlyName":"contoso (default)","uniqueName":"orgfc80770f","domainName":"orgfc80770f","version":"9.2.22105.00154","instanceUrl":"https://orgfc80770f.crm8.dynamics.com/","instanceApiUrl":"https://orgfc80770f.api.crm8.dynamics.com","baseLanguage":1033,"instanceState":"Ready","createdTime":"2019-12-25T15:46:14.433Z"},"environmentFeatures":{"isOpenApiEnabled":false},"cluster":{"category":"Prod","number":"101","uriSuffix":"in-il101.gateway.prod.island","geoShortName":"IN","environment":"Prod"},"governanceConfiguration":{"protectionLevel":"Basic"}}
154
+ displayName | contoso (default)
155
+ provisioningState | Succeeded
156
+ environmentSku | Default
157
+ azureRegionHint | centralindia
158
+ isDefault | true
159
+ ```
@@ -159,3 +159,29 @@ Log in to Microsoft 365 using a client secret.
159
159
  ```sh
160
160
  m365 login --authType secret --secret topSeCr3t@007
161
161
  ```
162
+
163
+ ## Response
164
+
165
+ === "JSON"
166
+
167
+ ```json
168
+ To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CQBMTLEFC to authenticate.
169
+ ```
170
+
171
+ === "Text"
172
+
173
+ ```text
174
+ To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CQBMTLEFC to authenticate.
175
+ ```
176
+
177
+ === "CSV"
178
+
179
+ ```csv
180
+ To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CQBMTLEFC to authenticate.
181
+ ```
182
+
183
+ === "Markdown"
184
+
185
+ ```md
186
+ To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CQBMTLEFC to authenticate.
187
+ ```