@pnp/cli-microsoft365 6.10.0-beta.81a81c0 → 6.10.0-beta.bd0bd83

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 (40) hide show
  1. package/README.md +7 -5
  2. package/dist/m365/search/commands/externalconnection/externalconnection-remove.js +35 -34
  3. package/dist/m365/spfx/commands/project/project-doctor/doctor-1.18.0-beta.1.js +23 -0
  4. package/dist/m365/spfx/commands/project/project-doctor.js +2 -1
  5. package/dist/m365/spfx/commands/project/project-externalize/rules/DynamicRule.js +59 -51
  6. package/dist/m365/spfx/commands/project/project-upgrade/rules/FN001022_DEP_office_ui_fabric_react.js +2 -2
  7. package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.18.0-beta.1.js +61 -0
  8. package/dist/m365/spfx/commands/project/project-upgrade.js +16 -13
  9. package/dist/m365/spfx/commands/spfx-doctor.js +15 -0
  10. package/dist/m365/spo/commands/folder/folder-remove.js +30 -28
  11. package/dist/m365/spo/commands/tenant/tenant-appcatalog-add.js +12 -15
  12. package/dist/m365/spo/commands/tenant/tenant-applicationcustomizer-set.js +80 -2
  13. package/dist/m365/spo/commands/tenant/tenant-recyclebinitem-remove.js +48 -48
  14. package/dist/m365/teams/commands/chat/chat-get.js +4 -4
  15. package/dist/m365/teams/commands/chat/chat-message-send.js +4 -4
  16. package/docs/docs/_clisettings.mdx +17 -0
  17. package/docs/docs/cmd/pa/app/app-get.mdx +1 -1
  18. package/docs/docs/cmd/pa/app/app-list.mdx +1 -1
  19. package/docs/docs/cmd/pp/aibuildermodel/aibuildermodel-get.mdx +1 -1
  20. package/docs/docs/cmd/pp/aibuildermodel/aibuildermodel-list.mdx +1 -1
  21. package/docs/docs/cmd/pp/card/card-clone.mdx +1 -1
  22. package/docs/docs/cmd/pp/card/card-get.mdx +1 -1
  23. package/docs/docs/cmd/pp/card/card-list.mdx +1 -1
  24. package/docs/docs/cmd/pp/chatbot/chatbot-get.mdx +1 -1
  25. package/docs/docs/cmd/pp/chatbot/chatbot-list.mdx +1 -1
  26. package/docs/docs/cmd/pp/dataverse/dataverse-table-get.mdx +1 -1
  27. package/docs/docs/cmd/pp/dataverse/dataverse-table-list.mdx +1 -1
  28. package/docs/docs/cmd/pp/dataverse/dataverse-table-remove.mdx +1 -1
  29. package/docs/docs/cmd/pp/dataverse/dataverse-table-row-list.mdx +1 -1
  30. package/docs/docs/cmd/pp/dataverse/dataverse-table-row-remove.mdx +1 -1
  31. package/docs/docs/cmd/spo/tenant/tenant-applicationcustomizer-get.mdx +1 -1
  32. package/docs/docs/cmd/spo/tenant/tenant-applicationcustomizer-list.mdx +1 -1
  33. package/docs/docs/cmd/spo/tenant/tenant-applicationcustomizer-remove.mdx +1 -1
  34. package/docs/docs/cmd/spo/tenant/tenant-applicationcustomizer-set.mdx +12 -3
  35. package/docs/docs/cmd/spo/tenant/tenant-commandset-get.mdx +1 -1
  36. package/docs/docs/cmd/spo/tenant/tenant-commandset-list.mdx +1 -1
  37. package/docs/docs/cmd/spo/tenant/tenant-commandset-remove.mdx +1 -1
  38. package/docs/docs/cmd/spo/tenant/tenant-commandset-set.mdx +1 -1
  39. package/docs/docs/cmd/spo/userprofile/userprofile-get.mdx +1 -1
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -49,11 +49,13 @@
49
49
  <a href="#contribute">Contribute</a>
50
50
  </p>
51
51
  <p align="center">
52
- <a href="#sharing-is-caring">Sharing is Caring</a> |
53
- <a href="#code-of-conduct">Code of Conduct</a> |
52
+ <a href="https://github.com/pnp/cli-microsoft365/blob/main/CODE_OF_CONDUCT.md">Code of Conduct</a> |
53
+ <a href="#need-help">Need help?</a> |
54
54
  <a href="#disclaimer">Disclaimer</a>
55
55
  </p>
56
-
56
+ <p align="center">
57
+ <a href="#microsoft-365--power-platform-community">Microsoft 365 & Power Platform Community</a>
58
+ </p>
57
59
  <p align="center">
58
60
  <img alt="CLI for Microsoft 365" src="./docs/docs/images/cli-microsoft365.gif" height="500" />
59
61
  </p>
@@ -229,9 +231,9 @@ Checkout our [Wiki](https://github.com/pnp/cli-microsoft365/wiki) for guides on
229
231
  </a>
230
232
  </p>
231
233
 
232
- ## Microsoft 365 Platform Community
234
+ ## Microsoft 365 & Power Platform Community
233
235
 
234
- CLI for Microsoft 365 is a [Microsoft 365 Platform Community](https://pnp.github.io) (PnP) project. Microsoft 365 Platform Community is a virtual team consisting of Microsoft employees and community members focused on helping the community make the best use of Microsoft products. CLI for Microsoft 365 is an open-source project not affiliated with Microsoft and not covered by Microsoft support. If you experience any issues using the CLI, please submit an issue in the [issues list](https://github.com/pnp/cli-microsoft365/issues).
236
+ CLI for Microsoft 365 is a [Microsoft 365 & Power Platform Community](https://pnp.github.io) (PnP) project. Microsoft 365 & Power Platform Community is a virtual team consisting of Microsoft employees and community members focused on helping the community make the best use of Microsoft products. CLI for Microsoft 365 is an open-source project not affiliated with Microsoft and not covered by Microsoft support. If you experience any issues using the CLI, please submit an issue in the [issues list](https://github.com/pnp/cli-microsoft365/issues).
235
237
 
236
238
  ## Disclaimer
237
239
 
@@ -35,48 +35,31 @@ class SearchExternalConnectionRemoveCommand extends GraphCommand_1.default {
35
35
  __classPrivateFieldGet(this, _SearchExternalConnectionRemoveCommand_instances, "m", _SearchExternalConnectionRemoveCommand_initOptionSets).call(this);
36
36
  }
37
37
  getExternalConnectionId(args) {
38
- if (args.options.id) {
39
- return Promise.resolve(args.options.id);
40
- }
41
- const requestOptions = {
42
- url: `${this.resource}/v1.0/external/connections?$filter=name eq '${formatting_1.formatting.encodeQueryParameter(args.options.name)}'&$select=id`,
43
- headers: {
44
- accept: 'application/json;odata.metadata=none'
45
- },
46
- responseType: 'json'
47
- };
48
- return request_1.default
49
- .get(requestOptions)
50
- .then((res) => {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ if (args.options.id) {
40
+ return args.options.id;
41
+ }
42
+ const requestOptions = {
43
+ url: `${this.resource}/v1.0/external/connections?$filter=name eq '${formatting_1.formatting.encodeQueryParameter(args.options.name)}'&$select=id`,
44
+ headers: {
45
+ accept: 'application/json;odata.metadata=none'
46
+ },
47
+ responseType: 'json'
48
+ };
49
+ const res = yield request_1.default.get(requestOptions);
51
50
  if (res.value.length === 1) {
52
- return Promise.resolve(res.value[0].id);
51
+ return res.value[0].id;
53
52
  }
54
53
  if (res.value.length === 0) {
55
- return Promise.reject(`The specified connection does not exist in Microsoft Search`);
54
+ throw `The specified connection does not exist in Microsoft Search`;
56
55
  }
57
- return Promise.reject(`Multiple external connections with name ${args.options.name} found. Please disambiguate (IDs): ${res.value.map(x => x.id).join(', ')}`);
56
+ throw `Multiple external connections with name ${args.options.name} found. Please disambiguate (IDs): ${res.value.map(x => x.id).join(', ')}`;
58
57
  });
59
58
  }
60
59
  commandAction(logger, args) {
61
60
  return __awaiter(this, void 0, void 0, function* () {
62
- const removeExternalConnection = () => __awaiter(this, void 0, void 0, function* () {
63
- try {
64
- const externalConnectionId = yield this.getExternalConnectionId(args);
65
- const requestOptions = {
66
- url: `${this.resource}/v1.0/external/connections/${formatting_1.formatting.encodeQueryParameter(externalConnectionId)}`,
67
- headers: {
68
- accept: 'application/json;odata.metadata=none'
69
- },
70
- responseType: 'json'
71
- };
72
- yield request_1.default.delete(requestOptions);
73
- }
74
- catch (err) {
75
- this.handleRejectedODataJsonPromise(err);
76
- }
77
- });
78
61
  if (args.options.confirm) {
79
- yield removeExternalConnection();
62
+ yield this.removeExternalConnection(args);
80
63
  }
81
64
  else {
82
65
  const result = yield Cli_1.Cli.prompt({
@@ -86,11 +69,29 @@ class SearchExternalConnectionRemoveCommand extends GraphCommand_1.default {
86
69
  message: `Are you sure you want to remove the external connection '${args.options.id || args.options.name}'?`
87
70
  });
88
71
  if (result.continue) {
89
- yield removeExternalConnection();
72
+ yield this.removeExternalConnection(args);
90
73
  }
91
74
  }
92
75
  });
93
76
  }
77
+ removeExternalConnection(args) {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ try {
80
+ const externalConnectionId = yield this.getExternalConnectionId(args);
81
+ const requestOptions = {
82
+ url: `${this.resource}/v1.0/external/connections/${formatting_1.formatting.encodeQueryParameter(externalConnectionId)}`,
83
+ headers: {
84
+ accept: 'application/json;odata.metadata=none'
85
+ },
86
+ responseType: 'json'
87
+ };
88
+ yield request_1.default.delete(requestOptions);
89
+ }
90
+ catch (err) {
91
+ this.handleRejectedODataJsonPromise(err);
92
+ }
93
+ });
94
+ }
94
95
  }
95
96
  _SearchExternalConnectionRemoveCommand_instances = new WeakSet(), _SearchExternalConnectionRemoveCommand_initTelemetry = function _SearchExternalConnectionRemoveCommand_initTelemetry() {
96
97
  this.telemetry.push((args) => {
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const FN001008_DEP_react_1 = require("./rules/FN001008_DEP_react");
4
+ const FN001009_DEP_react_dom_1 = require("./rules/FN001009_DEP_react_dom");
5
+ const FN001035_DEP_fluentui_react_1 = require("./rules/FN001035_DEP_fluentui_react");
6
+ const FN002004_DEVDEP_gulp_1 = require("./rules/FN002004_DEVDEP_gulp");
7
+ const FN002007_DEVDEP_ajv_1 = require("./rules/FN002007_DEVDEP_ajv");
8
+ const FN002013_DEVDEP_types_webpack_env_1 = require("./rules/FN002013_DEVDEP_types_webpack_env");
9
+ const FN002015_DEVDEP_types_react_1 = require("./rules/FN002015_DEVDEP_types_react");
10
+ const FN002016_DEVDEP_types_react_dom_1 = require("./rules/FN002016_DEVDEP_types_react_dom");
11
+ const FN002019_DEVDEP_microsoft_rush_stack_compiler_1 = require("./rules/FN002019_DEVDEP_microsoft_rush_stack_compiler");
12
+ module.exports = [
13
+ new FN001008_DEP_react_1.FN001008_DEP_react('17'),
14
+ new FN001009_DEP_react_dom_1.FN001009_DEP_react_dom('17'),
15
+ new FN001035_DEP_fluentui_react_1.FN001035_DEP_fluentui_react('^8.106.4'),
16
+ new FN002004_DEVDEP_gulp_1.FN002004_DEVDEP_gulp('4.0.2'),
17
+ new FN002007_DEVDEP_ajv_1.FN002007_DEVDEP_ajv('^6.12.5'),
18
+ new FN002013_DEVDEP_types_webpack_env_1.FN002013_DEVDEP_types_webpack_env('~1.15.2'),
19
+ new FN002015_DEVDEP_types_react_1.FN002015_DEVDEP_types_react('17'),
20
+ new FN002016_DEVDEP_types_react_dom_1.FN002016_DEVDEP_types_react_dom('17'),
21
+ new FN002019_DEVDEP_microsoft_rush_stack_compiler_1.FN002019_DEVDEP_microsoft_rush_stack_compiler(['4.5'])
22
+ ];
23
+ //# sourceMappingURL=doctor-1.18.0-beta.1.js.map
@@ -77,7 +77,8 @@ class SpfxProjectDoctorCommand extends base_project_command_1.BaseProjectCommand
77
77
  '1.17.1',
78
78
  '1.17.2',
79
79
  '1.17.3',
80
- '1.17.4'
80
+ '1.17.4',
81
+ '1.18.0-beta.1'
81
82
  ];
82
83
  __classPrivateFieldGet(this, _SpfxProjectDoctorCommand_instances, "m", _SpfxProjectDoctorCommand_initTelemetry).call(this);
83
84
  __classPrivateFieldGet(this, _SpfxProjectDoctorCommand_instances, "m", _SpfxProjectDoctorCommand_initOptions).call(this);
@@ -1,4 +1,13 @@
1
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
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.DynamicRule = void 0;
4
13
  const fs = require("fs");
@@ -12,36 +21,32 @@ class DynamicRule extends BasicDependencyRule_1.BasicDependencyRule {
12
21
  this.fileVariationSuffixes = ['.min', '.bundle', '-min', '.bundle.min'];
13
22
  }
14
23
  visit(project) {
15
- if (!project.packageJson ||
16
- !project.packageJson.dependencies) {
17
- return Promise.resolve({ entries: [], suggestions: [] });
18
- }
19
- const validPackageNames = Object.getOwnPropertyNames(project.packageJson.dependencies)
20
- .filter(x => this.restrictedNamespaces.map(y => x.indexOf(y) === -1).reduce((y, z) => y && z))
21
- .filter(x => this.restrictedModules.indexOf(x) === -1);
22
- return Promise
23
- .all(validPackageNames.map((x) => this.getExternalEntryForPackage(x, project)))
24
- .then((res) => {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ if (!project.packageJson || !project.packageJson.dependencies) {
26
+ return { entries: [], suggestions: [] };
27
+ }
28
+ const validPackageNames = Object.getOwnPropertyNames(project.packageJson.dependencies)
29
+ .filter(x => this.restrictedNamespaces.map(y => x.indexOf(y) === -1).reduce((y, z) => y && z))
30
+ .filter(x => this.restrictedModules.indexOf(x) === -1);
31
+ const res = yield Promise.all(validPackageNames.map((x) => this.getExternalEntryForPackage(x, project)));
25
32
  return {
26
- entries: res
27
- .filter(x => x !== undefined)
28
- .map(x => x),
33
+ entries: res.filter(x => x !== undefined),
29
34
  suggestions: []
30
35
  };
31
36
  });
32
37
  }
33
38
  getExternalEntryForPackage(packageName, project) {
34
- const version = project.packageJson.dependencies[packageName];
35
- const filesPaths = this.getFilePath(packageName).map(x => this.cleanFilePath(x));
36
- if (!version || filesPaths.length === 0) {
37
- return Promise.resolve(undefined);
38
- }
39
- const filesPathsVariations = filesPaths
40
- .map(x => this.fileVariationSuffixes.map(y => x.indexOf(y) === -1 ? x.replace('.js', `${y}.js`) : x))
41
- .reduce((x, y) => [...x, ...y]);
42
- const pathsAndVariations = [...filesPaths, ...filesPathsVariations];
43
- return Promise.all(pathsAndVariations.map(x => this.getExternalEntryForFilePath(x, packageName, version)))
44
- .then((externalizeEntryCandidates) => {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ const version = project.packageJson.dependencies[packageName];
41
+ const filesPaths = this.getFilePath(packageName).map(x => this.cleanFilePath(x));
42
+ if (!version || filesPaths.length === 0) {
43
+ return undefined;
44
+ }
45
+ const filesPathsVariations = filesPaths
46
+ .map(x => this.fileVariationSuffixes.map(y => x.indexOf(y) === -1 ? x.replace('.js', `${y}.js`) : x))
47
+ .reduce((x, y) => [...x, ...y]);
48
+ const pathsAndVariations = [...filesPaths, ...filesPathsVariations];
49
+ const externalizeEntryCandidates = yield Promise.all(pathsAndVariations.map(x => this.getExternalEntryForFilePath(x, packageName, version)));
45
50
  const dExternalizeEntryCandidates = externalizeEntryCandidates.filter(x => x !== undefined);
46
51
  const minifiedModule = dExternalizeEntryCandidates.find(x => !x.globalName && this.pathContainsMinifySuffix(x.path));
47
52
  const minifiedNonModule = dExternalizeEntryCandidates.find(x => x.globalName && this.pathContainsMinifySuffix(x.path));
@@ -57,31 +62,29 @@ class DynamicRule extends BasicDependencyRule_1.BasicDependencyRule {
57
62
  .filter(y => y > -1).length > 0;
58
63
  }
59
64
  getExternalEntryForFilePath(filePath, packageName, version) {
60
- const url = this.getFileUrl(packageName, version, filePath);
61
- return this
62
- .testUrl(url)
63
- .then((testResult) => {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ const url = this.getFileUrl(packageName, version, filePath);
67
+ const testResult = yield this.testUrl(url);
64
68
  if (!testResult) {
65
- return Promise.resolve(undefined);
69
+ return undefined;
70
+ }
71
+ const moduleInfo = yield this.getModuleType(url);
72
+ if (moduleInfo.scriptType === 'CommonJs') {
73
+ return undefined; //browsers don't support those module types without an additional library
74
+ }
75
+ else if (moduleInfo.scriptType === 'ES2015' || moduleInfo.scriptType === 'AMD') {
76
+ return {
77
+ key: packageName,
78
+ path: url
79
+ };
80
+ }
81
+ else { //TODO for non-module and UMD we should technically add dependencies as well
82
+ return {
83
+ key: packageName,
84
+ path: url,
85
+ globalName: moduleInfo.exports && moduleInfo.exports.length > 0 ? moduleInfo.exports[0] : packageName // examples where this is not good https://unpkg.com/@pnp/polyfill-ie11@^1.0.2/dist/index.js https://unpkg.com/moment-timezone@^0.5.27/builds/moment-timezone-with-data.js
86
+ };
66
87
  }
67
- return this.getModuleType(url).then((moduleInfo) => {
68
- if (moduleInfo.scriptType === 'CommonJs') {
69
- return Promise.resolve(undefined); //browsers don't support those module types without an additional library
70
- }
71
- else if (moduleInfo.scriptType === 'ES2015' || moduleInfo.scriptType === 'AMD') {
72
- return {
73
- key: packageName,
74
- path: url
75
- };
76
- }
77
- else { //TODO for non-module and UMD we should technically add dependencies as well
78
- return {
79
- key: packageName,
80
- path: url,
81
- globalName: moduleInfo.exports && moduleInfo.exports.length > 0 ? moduleInfo.exports[0] : packageName // examples where this is not good https://unpkg.com/@pnp/polyfill-ie11@^1.0.2/dist/index.js https://unpkg.com/moment-timezone@^0.5.27/builds/moment-timezone-with-data.js
82
- };
83
- }
84
- });
85
88
  });
86
89
  }
87
90
  getModuleType(url) {
@@ -101,10 +104,15 @@ class DynamicRule extends BasicDependencyRule_1.BasicDependencyRule {
101
104
  return `https://unpkg.com/${packageName}@${version}/${filePath}`;
102
105
  }
103
106
  testUrl(url) {
104
- return request_1.default
105
- .head({ url: url, headers: { 'x-anonymous': 'true' } })
106
- .then(() => true)
107
- .catch(() => false);
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ try {
109
+ yield request_1.default.head({ url: url, headers: { 'x-anonymous': 'true' } });
110
+ return true;
111
+ }
112
+ catch (_a) {
113
+ return false;
114
+ }
115
+ });
108
116
  }
109
117
  getFilePath(packageName) {
110
118
  const packageJsonFilePath = `node_modules/${packageName}/package.json`;
@@ -4,8 +4,8 @@ exports.FN001022_DEP_office_ui_fabric_react = void 0;
4
4
  const spfx_1 = require("../../../../../../utils/spfx");
5
5
  const DependencyRule_1 = require("./DependencyRule");
6
6
  class FN001022_DEP_office_ui_fabric_react extends DependencyRule_1.DependencyRule {
7
- constructor(packageVersion) {
8
- super('office-ui-fabric-react', packageVersion, false, true);
7
+ constructor(packageVersion, add = true) {
8
+ super('office-ui-fabric-react', packageVersion, false, add);
9
9
  }
10
10
  get id() {
11
11
  return 'FN001022';
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const FN001001_DEP_microsoft_sp_core_library_1 = require("./rules/FN001001_DEP_microsoft_sp_core_library");
4
+ const FN001002_DEP_microsoft_sp_lodash_subset_1 = require("./rules/FN001002_DEP_microsoft_sp_lodash_subset");
5
+ const FN001003_DEP_microsoft_sp_office_ui_fabric_core_1 = require("./rules/FN001003_DEP_microsoft_sp_office_ui_fabric_core");
6
+ const FN001004_DEP_microsoft_sp_webpart_base_1 = require("./rules/FN001004_DEP_microsoft_sp_webpart_base");
7
+ const FN001011_DEP_microsoft_sp_dialog_1 = require("./rules/FN001011_DEP_microsoft_sp_dialog");
8
+ const FN001012_DEP_microsoft_sp_application_base_1 = require("./rules/FN001012_DEP_microsoft_sp_application_base");
9
+ const FN001013_DEP_microsoft_decorators_1 = require("./rules/FN001013_DEP_microsoft_decorators");
10
+ const FN001014_DEP_microsoft_sp_listview_extensibility_1 = require("./rules/FN001014_DEP_microsoft_sp_listview_extensibility");
11
+ const FN001021_DEP_microsoft_sp_property_pane_1 = require("./rules/FN001021_DEP_microsoft_sp_property_pane");
12
+ const FN001022_DEP_office_ui_fabric_react_1 = require("./rules/FN001022_DEP_office_ui_fabric_react");
13
+ const FN001023_DEP_microsoft_sp_component_base_1 = require("./rules/FN001023_DEP_microsoft_sp_component_base");
14
+ const FN001024_DEP_microsoft_sp_diagnostics_1 = require("./rules/FN001024_DEP_microsoft_sp_diagnostics");
15
+ const FN001025_DEP_microsoft_sp_dynamic_data_1 = require("./rules/FN001025_DEP_microsoft_sp_dynamic_data");
16
+ const FN001026_DEP_microsoft_sp_extension_base_1 = require("./rules/FN001026_DEP_microsoft_sp_extension_base");
17
+ const FN001027_DEP_microsoft_sp_http_1 = require("./rules/FN001027_DEP_microsoft_sp_http");
18
+ const FN001028_DEP_microsoft_sp_list_subscription_1 = require("./rules/FN001028_DEP_microsoft_sp_list_subscription");
19
+ const FN001029_DEP_microsoft_sp_loader_1 = require("./rules/FN001029_DEP_microsoft_sp_loader");
20
+ const FN001030_DEP_microsoft_sp_module_interfaces_1 = require("./rules/FN001030_DEP_microsoft_sp_module_interfaces");
21
+ const FN001031_DEP_microsoft_sp_odata_types_1 = require("./rules/FN001031_DEP_microsoft_sp_odata_types");
22
+ const FN001032_DEP_microsoft_sp_page_context_1 = require("./rules/FN001032_DEP_microsoft_sp_page_context");
23
+ const FN001034_DEP_microsoft_sp_adaptive_card_extension_base_1 = require("./rules/FN001034_DEP_microsoft_sp_adaptive_card_extension_base");
24
+ const FN001035_DEP_fluentui_react_1 = require("./rules/FN001035_DEP_fluentui_react");
25
+ const FN002001_DEVDEP_microsoft_sp_build_web_1 = require("./rules/FN002001_DEVDEP_microsoft_sp_build_web");
26
+ const FN002002_DEVDEP_microsoft_sp_module_interfaces_1 = require("./rules/FN002002_DEVDEP_microsoft_sp_module_interfaces");
27
+ const FN002022_DEVDEP_microsoft_eslint_plugin_spfx_1 = require("./rules/FN002022_DEVDEP_microsoft_eslint_plugin_spfx");
28
+ const FN002023_DEVDEP_microsoft_eslint_config_spfx_1 = require("./rules/FN002023_DEVDEP_microsoft_eslint_config_spfx");
29
+ const FN010001_YORC_version_1 = require("./rules/FN010001_YORC_version");
30
+ const FN010010_YORC_sdkVersions_teams_js_1 = require("./rules/FN010010_YORC_sdkVersions_teams_js");
31
+ module.exports = [
32
+ new FN001001_DEP_microsoft_sp_core_library_1.FN001001_DEP_microsoft_sp_core_library('1.18.0-beta.1'),
33
+ new FN001002_DEP_microsoft_sp_lodash_subset_1.FN001002_DEP_microsoft_sp_lodash_subset('1.18.0-beta.1'),
34
+ new FN001003_DEP_microsoft_sp_office_ui_fabric_core_1.FN001003_DEP_microsoft_sp_office_ui_fabric_core('1.18.0-beta.1'),
35
+ new FN001004_DEP_microsoft_sp_webpart_base_1.FN001004_DEP_microsoft_sp_webpart_base('1.18.0-beta.1'),
36
+ new FN001011_DEP_microsoft_sp_dialog_1.FN001011_DEP_microsoft_sp_dialog('1.18.0-beta.1'),
37
+ new FN001012_DEP_microsoft_sp_application_base_1.FN001012_DEP_microsoft_sp_application_base('1.18.0-beta.1'),
38
+ new FN001014_DEP_microsoft_sp_listview_extensibility_1.FN001014_DEP_microsoft_sp_listview_extensibility('1.18.0-beta.1'),
39
+ new FN001021_DEP_microsoft_sp_property_pane_1.FN001021_DEP_microsoft_sp_property_pane('1.18.0-beta.1'),
40
+ new FN001022_DEP_office_ui_fabric_react_1.FN001022_DEP_office_ui_fabric_react('', false),
41
+ new FN001023_DEP_microsoft_sp_component_base_1.FN001023_DEP_microsoft_sp_component_base('1.18.0-beta.1'),
42
+ new FN001024_DEP_microsoft_sp_diagnostics_1.FN001024_DEP_microsoft_sp_diagnostics('1.18.0-beta.1'),
43
+ new FN001025_DEP_microsoft_sp_dynamic_data_1.FN001025_DEP_microsoft_sp_dynamic_data('1.18.0-beta.1'),
44
+ new FN001026_DEP_microsoft_sp_extension_base_1.FN001026_DEP_microsoft_sp_extension_base('1.18.0-beta.1'),
45
+ new FN001027_DEP_microsoft_sp_http_1.FN001027_DEP_microsoft_sp_http('1.18.0-beta.1'),
46
+ new FN001028_DEP_microsoft_sp_list_subscription_1.FN001028_DEP_microsoft_sp_list_subscription('1.18.0-beta.1'),
47
+ new FN001029_DEP_microsoft_sp_loader_1.FN001029_DEP_microsoft_sp_loader('1.18.0-beta.1'),
48
+ new FN001030_DEP_microsoft_sp_module_interfaces_1.FN001030_DEP_microsoft_sp_module_interfaces('1.18.0-beta.1'),
49
+ new FN001031_DEP_microsoft_sp_odata_types_1.FN001031_DEP_microsoft_sp_odata_types('1.18.0-beta.1'),
50
+ new FN001032_DEP_microsoft_sp_page_context_1.FN001032_DEP_microsoft_sp_page_context('1.18.0-beta.1'),
51
+ new FN001035_DEP_fluentui_react_1.FN001035_DEP_fluentui_react('8.106.4'),
52
+ new FN001013_DEP_microsoft_decorators_1.FN001013_DEP_microsoft_decorators('1.18.0-beta.1'),
53
+ new FN001034_DEP_microsoft_sp_adaptive_card_extension_base_1.FN001034_DEP_microsoft_sp_adaptive_card_extension_base('1.18.0-beta.1'),
54
+ new FN002022_DEVDEP_microsoft_eslint_plugin_spfx_1.FN002022_DEVDEP_microsoft_eslint_plugin_spfx('1.18.0-beta.1'),
55
+ new FN002023_DEVDEP_microsoft_eslint_config_spfx_1.FN002023_DEVDEP_microsoft_eslint_config_spfx('1.18.0-beta.1'),
56
+ new FN002001_DEVDEP_microsoft_sp_build_web_1.FN002001_DEVDEP_microsoft_sp_build_web('1.18.0-beta.1'),
57
+ new FN002002_DEVDEP_microsoft_sp_module_interfaces_1.FN002002_DEVDEP_microsoft_sp_module_interfaces('1.18.0-beta.1'),
58
+ new FN010001_YORC_version_1.FN010001_YORC_version('1.18.0-beta.1'),
59
+ new FN010010_YORC_sdkVersions_teams_js_1.FN010010_YORC_sdkVersions_teams_js('2.12.0')
60
+ ];
61
+ //# sourceMappingURL=upgrade-1.18.0-beta.1.js.map
@@ -18,6 +18,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  const fs = require("fs");
19
19
  const os = require("os");
20
20
  const path = require("path");
21
+ // uncomment to support upgrading to preview releases
22
+ const semver_1 = require("semver");
21
23
  const Command_1 = require("../../../../Command");
22
24
  const fsUtil_1 = require("../../../../utils/fsUtil");
23
25
  const packageManager_1 = require("../../../../utils/packageManager");
@@ -79,7 +81,8 @@ class SpfxProjectUpgradeCommand extends base_project_command_1.BaseProjectComman
79
81
  '1.17.1',
80
82
  '1.17.2',
81
83
  '1.17.3',
82
- '1.17.4'
84
+ '1.17.4',
85
+ '1.18.0-beta.1'
83
86
  ];
84
87
  __classPrivateFieldGet(this, _SpfxProjectUpgradeCommand_instances, "m", _SpfxProjectUpgradeCommand_initTelemetry).call(this);
85
88
  __classPrivateFieldGet(this, _SpfxProjectUpgradeCommand_instances, "m", _SpfxProjectUpgradeCommand_initOptions).call(this);
@@ -93,15 +96,15 @@ class SpfxProjectUpgradeCommand extends base_project_command_1.BaseProjectComman
93
96
  }
94
97
  this.toVersion = args.options.toVersion ? args.options.toVersion : this.supportedVersions[this.supportedVersions.length - 1];
95
98
  // uncomment to support upgrading to preview releases
96
- // if (!args.options.toVersion &&
97
- // !args.options.preview &&
98
- // prerelease(this.toVersion)) {
99
- // // no version and no preview specified while the current version to
100
- // // upgrade to is a prerelease so let's grab the first non-preview version
101
- // // since we're supporting only one preview version, it's sufficient for
102
- // // us to take second to last version
103
- // this.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
104
- // }
99
+ if (!args.options.toVersion &&
100
+ !args.options.preview &&
101
+ (0, semver_1.prerelease)(this.toVersion)) {
102
+ // no version and no preview specified while the current version to
103
+ // upgrade to is a prerelease so let's grab the first non-preview version
104
+ // since we're supporting only one preview version, it's sufficient for
105
+ // us to take second to last version
106
+ this.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
107
+ }
105
108
  this.packageManager = args.options.packageManager || 'npm';
106
109
  this.shell = args.options.shell || 'bash';
107
110
  if (this.supportedVersions.indexOf(this.toVersion) < 0) {
@@ -488,9 +491,9 @@ _SpfxProjectUpgradeCommand_instances = new WeakSet(), _SpfxProjectUpgradeCommand
488
491
  preview: args.options.preview
489
492
  });
490
493
  // uncomment to support upgrading to preview releases
491
- // if (prerelease(this.telemetryProperties.toVersion) && !args.options.preview) {
492
- // this.telemetryProperties.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
493
- // }
494
+ if ((0, semver_1.prerelease)(this.telemetryProperties.toVersion) && !args.options.preview) {
495
+ this.telemetryProperties.toVersion = this.supportedVersions[this.supportedVersions.length - 2];
496
+ }
494
497
  });
495
498
  }, _SpfxProjectUpgradeCommand_initOptions = function _SpfxProjectUpgradeCommand_initOptions() {
496
499
  this.options.unshift({
@@ -534,6 +534,21 @@ class SpfxDoctorCommand extends base_project_command_1.BaseProjectCommand {
534
534
  range: '^4',
535
535
  fix: 'npm i -g yo@4'
536
536
  }
537
+ },
538
+ '1.18.0-beta.1': {
539
+ gulpCli: {
540
+ range: '^1 || ^2',
541
+ fix: 'npm i -g gulp-cli@2'
542
+ },
543
+ node: {
544
+ range: '>=16.13.0 <17.0.0',
545
+ fix: 'Install Node.js >=16.13.0 <17.0.0'
546
+ },
547
+ sp: SharePointVersion.SPO,
548
+ yo: {
549
+ range: '^4',
550
+ fix: 'npm i -g yo@4'
551
+ }
537
552
  }
538
553
  };
539
554
  __classPrivateFieldGet(this, _SpfxDoctorCommand_instances, "m", _SpfxDoctorCommand_initTelemetry).call(this);
@@ -38,34 +38,8 @@ class SpoFolderRemoveCommand extends SpoCommand_1.default {
38
38
  }
39
39
  commandAction(logger, args) {
40
40
  return __awaiter(this, void 0, void 0, function* () {
41
- const removeFolder = () => __awaiter(this, void 0, void 0, function* () {
42
- if (this.verbose) {
43
- logger.logToStderr(`Removing folder in site at ${args.options.webUrl}...`);
44
- }
45
- const serverRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(args.options.webUrl, args.options.url);
46
- let requestUrl = `${args.options.webUrl}/_api/web/GetFolderByServerRelativeUrl('${formatting_1.formatting.encodeQueryParameter(serverRelativeUrl)}')`;
47
- if (args.options.recycle) {
48
- requestUrl += `/recycle()`;
49
- }
50
- const requestOptions = {
51
- url: requestUrl,
52
- method: 'POST',
53
- headers: {
54
- 'X-HTTP-Method': 'DELETE',
55
- 'If-Match': '*',
56
- 'accept': 'application/json;odata=nometadata'
57
- },
58
- responseType: 'json'
59
- };
60
- try {
61
- yield request_1.default.post(requestOptions);
62
- }
63
- catch (err) {
64
- this.handleRejectedODataJsonPromise(err);
65
- }
66
- });
67
41
  if (args.options.confirm) {
68
- yield removeFolder();
42
+ yield this.removeFolder(logger, args.options);
69
43
  }
70
44
  else {
71
45
  const result = yield Cli_1.Cli.prompt({
@@ -75,11 +49,39 @@ class SpoFolderRemoveCommand extends SpoCommand_1.default {
75
49
  message: `Are you sure you want to ${args.options.recycle ? "recycle" : "remove"} the folder ${args.options.url} located in site ${args.options.webUrl}?`
76
50
  });
77
51
  if (result.continue) {
78
- yield removeFolder();
52
+ yield this.removeFolder(logger, args.options);
79
53
  }
80
54
  }
81
55
  });
82
56
  }
57
+ removeFolder(logger, options) {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ if (this.verbose) {
60
+ logger.logToStderr(`Removing folder in site at ${options.webUrl}...`);
61
+ }
62
+ const serverRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(options.webUrl, options.url);
63
+ let requestUrl = `${options.webUrl}/_api/web/GetFolderByServerRelativeUrl('${formatting_1.formatting.encodeQueryParameter(serverRelativeUrl)}')`;
64
+ if (options.recycle) {
65
+ requestUrl += `/recycle()`;
66
+ }
67
+ const requestOptions = {
68
+ url: requestUrl,
69
+ method: 'POST',
70
+ headers: {
71
+ 'X-HTTP-Method': 'DELETE',
72
+ 'If-Match': '*',
73
+ 'accept': 'application/json;odata=nometadata'
74
+ },
75
+ responseType: 'json'
76
+ };
77
+ try {
78
+ yield request_1.default.post(requestOptions);
79
+ }
80
+ catch (err) {
81
+ this.handleRejectedODataJsonPromise(err);
82
+ }
83
+ });
84
+ }
83
85
  }
84
86
  _SpoFolderRemoveCommand_instances = new WeakSet(), _SpoFolderRemoveCommand_initTelemetry = function _SpoFolderRemoveCommand_initTelemetry() {
85
87
  this.telemetry.push((args) => {
@@ -62,7 +62,8 @@ class SpoTenantAppCatalogAddCommand extends SpoCommand_1.default {
62
62
  });
63
63
  }
64
64
  ensureNoExistingSite(url, force, logger) {
65
- return new Promise((resolve, reject) => {
65
+ var _a, _b;
66
+ return __awaiter(this, void 0, void 0, function* () {
66
67
  if (this.verbose) {
67
68
  logger.logToStderr(`Checking if site ${url} exists...`);
68
69
  }
@@ -74,14 +75,13 @@ class SpoTenantAppCatalogAddCommand extends SpoCommand_1.default {
74
75
  _: []
75
76
  }
76
77
  };
77
- Cli_1.Cli
78
- .executeCommandWithOutput(spoSiteGetCommand, siteGetOptions)
79
- .then(() => {
78
+ try {
79
+ yield Cli_1.Cli.executeCommandWithOutput(spoSiteGetCommand, siteGetOptions);
80
80
  if (this.verbose) {
81
81
  logger.logToStderr(`Found site ${url}`);
82
82
  }
83
83
  if (!force) {
84
- return reject(new Command_1.CommandError(`Another site exists at ${url}`));
84
+ throw new Command_1.CommandError(`Another site exists at ${url}`);
85
85
  }
86
86
  if (this.verbose) {
87
87
  logger.logToStderr(`Deleting site ${url}...`);
@@ -94,20 +94,17 @@ class SpoTenantAppCatalogAddCommand extends SpoCommand_1.default {
94
94
  verbose: this.verbose,
95
95
  debug: this.debug
96
96
  };
97
- Cli_1.Cli
98
- .executeCommand(spoSiteRemoveCommand, { options: Object.assign(Object.assign({}, siteRemoveOptions), { _: [] }) })
99
- .then(() => resolve(), (err) => reject(err));
100
- }, (err) => {
101
- if (err.error.message !== 'File Not Found.' && err.error.message !== '404 FILE NOT FOUND') {
102
- // some other error occurred
103
- return reject(err.error);
97
+ yield Cli_1.Cli.executeCommand(spoSiteRemoveCommand, { options: Object.assign(Object.assign({}, siteRemoveOptions), { _: [] }) });
98
+ }
99
+ catch (err) {
100
+ if (((_a = err.error) === null || _a === void 0 ? void 0 : _a.message) !== 'File not Found' && ((_b = err.error) === null || _b === void 0 ? void 0 : _b.message) !== '404 FILE NOT FOUND') {
101
+ throw err.error || err;
104
102
  }
105
103
  if (this.verbose) {
106
104
  logger.logToStderr(`No site found at ${url}`);
107
105
  }
108
- // site not found. continue
109
- resolve();
110
- });
106
+ // Site not found. Continue
107
+ }
111
108
  });
112
109
  }
113
110
  createAppCatalog(options, logger) {
@@ -23,6 +23,8 @@ const validation_1 = require("../../../../utils/validation");
23
23
  const SpoCommand_1 = require("../../../base/SpoCommand");
24
24
  const commands_1 = require("../../commands");
25
25
  const os = require("os");
26
+ const Cli_1 = require("../../../../cli/Cli");
27
+ const spoListItemListCommand = require("../listitem/listitem-list");
26
28
  const request_1 = require("../../../../request");
27
29
  class SpoTenantApplicationCustomizerSetCommand extends SpoCommand_1.default {
28
30
  get name() {
@@ -46,6 +48,20 @@ class SpoTenantApplicationCustomizerSetCommand extends SpoCommand_1.default {
46
48
  if (!appCatalogUrl) {
47
49
  throw 'No app catalog URL found';
48
50
  }
51
+ if (args.options.newClientSideComponentId !== undefined) {
52
+ const componentManifest = yield this.getComponentManifest(appCatalogUrl, args.options.newClientSideComponentId, logger);
53
+ const clientComponentManifest = JSON.parse(componentManifest.ClientComponentManifest);
54
+ if (clientComponentManifest.extensionType !== "ApplicationCustomizer") {
55
+ throw `The extension type of this component is not of type 'ApplicationCustomizer' but of type '${clientComponentManifest.extensionType}'`;
56
+ }
57
+ const solution = yield this.getSolutionFromAppCatalog(appCatalogUrl, componentManifest.SolutionId, logger);
58
+ if (!solution.ContainsTenantWideExtension) {
59
+ 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.`;
60
+ }
61
+ else if (!solution.SkipFeatureDeployment) {
62
+ throw 'The solution has not been deployed to all sites. Make sure to deploy this solution to all sites.';
63
+ }
64
+ }
49
65
  const listServerRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(appCatalogUrl, '/lists/TenantWideExtensions');
50
66
  const listItemId = yield this.getListItemId(appCatalogUrl, args.options, listServerRelativeUrl, logger);
51
67
  yield this.updateTenantWideExtension(appCatalogUrl, args.options, listServerRelativeUrl, listItemId, logger);
@@ -72,9 +88,59 @@ class SpoTenantApplicationCustomizerSetCommand extends SpoCommand_1.default {
72
88
  return listItemInstances[0].Id;
73
89
  });
74
90
  }
91
+ getComponentManifest(appCatalogUrl, clientSideComponentId, logger) {
92
+ return __awaiter(this, void 0, void 0, function* () {
93
+ if (this.verbose) {
94
+ logger.logToStderr('Retrieving component manifest item from the ComponentManifests list on the app catalog site so that we get the solution id');
95
+ }
96
+ 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>`;
97
+ const commandOptions = {
98
+ webUrl: appCatalogUrl,
99
+ listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/Lists/ComponentManifests`,
100
+ camlQuery: camlQuery,
101
+ verbose: this.verbose,
102
+ debug: this.debug,
103
+ output: 'json'
104
+ };
105
+ const output = yield Cli_1.Cli.executeCommandWithOutput(spoListItemListCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
106
+ if (this.verbose) {
107
+ logger.logToStderr(output.stderr);
108
+ }
109
+ const outputParsed = JSON.parse(output.stdout);
110
+ if (outputParsed.length === 0) {
111
+ 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';
112
+ }
113
+ return outputParsed[0];
114
+ });
115
+ }
116
+ getSolutionFromAppCatalog(appCatalogUrl, solutionId, logger) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ if (this.verbose) {
119
+ logger.logToStderr(`Retrieving solution with id ${solutionId} from the application catalog`);
120
+ }
121
+ 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>`;
122
+ const commandOptions = {
123
+ webUrl: appCatalogUrl,
124
+ listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/AppCatalog`,
125
+ camlQuery: camlQuery,
126
+ verbose: this.verbose,
127
+ debug: this.debug,
128
+ output: 'json'
129
+ };
130
+ const output = yield Cli_1.Cli.executeCommandWithOutput(spoListItemListCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
131
+ if (this.verbose) {
132
+ logger.logToStderr(output.stderr);
133
+ }
134
+ const outputParsed = JSON.parse(output.stdout);
135
+ if (outputParsed.length === 0) {
136
+ throw `No component found with the solution id ${solutionId}. Make sure that the solution is available in the app catalog`;
137
+ }
138
+ return outputParsed[0];
139
+ });
140
+ }
75
141
  updateTenantWideExtension(appCatalogUrl, options, listServerRelativeUrl, itemId, logger) {
76
142
  return __awaiter(this, void 0, void 0, function* () {
77
- const { title, id, clientSideComponentId, newTitle, clientSideComponentProperties, webTemplate } = options;
143
+ const { title, id, clientSideComponentId, newTitle, newClientSideComponentId, clientSideComponentProperties, webTemplate } = options;
78
144
  if (this.verbose) {
79
145
  logger.logToStderr(`Updating tenant-wide application customizer: "${title || id || clientSideComponentId}"...`);
80
146
  }
@@ -85,6 +151,12 @@ class SpoTenantApplicationCustomizerSetCommand extends SpoCommand_1.default {
85
151
  FieldValue: newTitle
86
152
  });
87
153
  }
154
+ if (newClientSideComponentId !== undefined) {
155
+ formValues.push({
156
+ FieldName: 'TenantWideExtensionComponentId',
157
+ FieldValue: newClientSideComponentId
158
+ });
159
+ }
88
160
  if (clientSideComponentProperties !== undefined) {
89
161
  formValues.push({
90
162
  FieldName: 'TenantWideExtensionComponentProperties',
@@ -118,6 +190,7 @@ _SpoTenantApplicationCustomizerSetCommand_instances = new WeakSet(), _SpoTenantA
118
190
  id: typeof args.options.id !== 'undefined',
119
191
  clientSideComponentId: typeof args.options.clientSideComponentId !== 'undefined',
120
192
  newTitle: typeof args.options.newTitle !== 'undefined',
193
+ newClientSideComponentId: typeof args.options.newClientSideComponentId !== 'undefined',
121
194
  clientSideComponentProperties: typeof args.options.clientSideComponentProperties !== 'undefined',
122
195
  webTemplate: typeof args.options.webTemplate !== 'undefined'
123
196
  });
@@ -131,6 +204,8 @@ _SpoTenantApplicationCustomizerSetCommand_instances = new WeakSet(), _SpoTenantA
131
204
  option: '-c, --clientSideComponentId [clientSideComponentId]'
132
205
  }, {
133
206
  option: '--newTitle [newTitle]'
207
+ }, {
208
+ option: '--newClientSideComponentId [newClientSideComponentId]'
134
209
  }, {
135
210
  option: '-p, --clientSideComponentProperties [clientSideComponentProperties]'
136
211
  }, {
@@ -144,7 +219,10 @@ _SpoTenantApplicationCustomizerSetCommand_instances = new WeakSet(), _SpoTenantA
144
219
  if (args.options.clientSideComponentId && !validation_1.validation.isValidGuid(args.options.clientSideComponentId)) {
145
220
  return `${args.options.clientSideComponentId} is not a valid GUID`;
146
221
  }
147
- if (!args.options.newTitle && !args.options.clientSideComponentProperties && !args.options.webTemplate) {
222
+ if (args.options.newClientSideComponentId && !validation_1.validation.isValidGuid(args.options.newClientSideComponentId)) {
223
+ return `${args.options.newClientSideComponentId} is not a valid GUID`;
224
+ }
225
+ if (!args.options.newTitle && !args.options.newClientSideComponentId && !args.options.clientSideComponentProperties && !args.options.webTemplate) {
148
226
  return `Please specify an option to be updated`;
149
227
  }
150
228
  return true;
@@ -39,54 +39,8 @@ class SpoTenantRecycleBinItemRemoveCommand extends SpoCommand_1.default {
39
39
  }
40
40
  commandAction(logger, args) {
41
41
  return __awaiter(this, void 0, void 0, function* () {
42
- const removeDeletedSite = () => __awaiter(this, void 0, void 0, function* () {
43
- try {
44
- this.spoAdminUrl = yield spo_1.spo.getSpoAdminUrl(logger, this.debug);
45
- const res = yield spo_1.spo.ensureFormDigest(this.spoAdminUrl, logger, this.context, this.debug);
46
- if (this.verbose) {
47
- logger.logToStderr(`Removing deleted site collection ${args.options.siteUrl}...`);
48
- }
49
- const requestOptions = {
50
- url: `${this.spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
51
- headers: {
52
- 'X-RequestDigest': res.FormDigestValue
53
- },
54
- data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config_1.default.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="16" ObjectPathId="15" /><Query Id="17" ObjectPathId="15"><Query SelectAllProperties="false"><Properties><Property Name="PollingInterval" ScalarProperty="true" /><Property Name="IsComplete" ScalarProperty="true" /></Properties></Query></Query></Actions><ObjectPaths><Method Id="15" ParentId="1" Name="RemoveDeletedSite"><Parameters><Parameter Type="String">${formatting_1.formatting.escapeXml(args.options.siteUrl)}</Parameter></Parameters></Method><Constructor Id="1" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /></ObjectPaths></Request>`
55
- };
56
- const processQuery = yield request_1.default.post(requestOptions);
57
- const json = JSON.parse(processQuery);
58
- const response = json[0];
59
- if (response.ErrorInfo) {
60
- throw response.ErrorInfo.ErrorMessage;
61
- }
62
- else {
63
- const operation = json[json.length - 1];
64
- const isComplete = operation.IsComplete;
65
- if (!args.options.wait || isComplete) {
66
- return;
67
- }
68
- yield new Promise((resolve, reject) => {
69
- setTimeout(() => {
70
- spo_1.spo.waitUntilFinished({
71
- operationId: JSON.stringify(operation._ObjectIdentity_),
72
- siteUrl: this.spoAdminUrl,
73
- resolve,
74
- reject,
75
- logger,
76
- currentContext: this.context,
77
- debug: this.debug,
78
- verbose: this.verbose
79
- });
80
- }, operation.PollingInterval);
81
- });
82
- }
83
- }
84
- catch (err) {
85
- this.handleRejectedODataJsonPromise(err);
86
- }
87
- });
88
42
  if (args.options.confirm) {
89
- yield removeDeletedSite();
43
+ yield this.removeDeletedSite(logger, args);
90
44
  }
91
45
  else {
92
46
  const result = yield Cli_1.Cli.prompt({
@@ -96,11 +50,57 @@ class SpoTenantRecycleBinItemRemoveCommand extends SpoCommand_1.default {
96
50
  message: `Are you sure you want to remove the deleted site collection ${args.options.siteUrl} from tenant recycle bin?`
97
51
  });
98
52
  if (result.continue) {
99
- yield removeDeletedSite();
53
+ yield this.removeDeletedSite(logger, args);
100
54
  }
101
55
  }
102
56
  });
103
57
  }
58
+ removeDeletedSite(logger, args) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ try {
61
+ const spoAdminUrl = yield spo_1.spo.getSpoAdminUrl(logger, this.debug);
62
+ const res = yield spo_1.spo.ensureFormDigest(spoAdminUrl, logger, this.context, this.debug);
63
+ if (this.verbose) {
64
+ logger.logToStderr(`Removing deleted site collection ${args.options.siteUrl}...`);
65
+ }
66
+ const requestOptions = {
67
+ url: `${spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
68
+ headers: {
69
+ 'X-RequestDigest': res.FormDigestValue
70
+ },
71
+ data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config_1.default.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="16" ObjectPathId="15" /><Query Id="17" ObjectPathId="15"><Query SelectAllProperties="false"><Properties><Property Name="PollingInterval" ScalarProperty="true" /><Property Name="IsComplete" ScalarProperty="true" /></Properties></Query></Query></Actions><ObjectPaths><Method Id="15" ParentId="1" Name="RemoveDeletedSite"><Parameters><Parameter Type="String">${formatting_1.formatting.escapeXml(args.options.siteUrl)}</Parameter></Parameters></Method><Constructor Id="1" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /></ObjectPaths></Request>`
72
+ };
73
+ const processQuery = yield request_1.default.post(requestOptions);
74
+ const json = JSON.parse(processQuery);
75
+ const response = json[0];
76
+ if (response.ErrorInfo) {
77
+ throw response.ErrorInfo.ErrorMessage;
78
+ }
79
+ const operation = json[json.length - 1];
80
+ const isComplete = operation.IsComplete;
81
+ if (!args.options.wait || isComplete) {
82
+ return;
83
+ }
84
+ yield new Promise((resolve, reject) => {
85
+ setTimeout(() => {
86
+ spo_1.spo.waitUntilFinished({
87
+ operationId: JSON.stringify(operation._ObjectIdentity_),
88
+ siteUrl: spoAdminUrl,
89
+ resolve,
90
+ reject,
91
+ logger,
92
+ currentContext: this.context,
93
+ debug: this.debug,
94
+ verbose: this.verbose
95
+ });
96
+ }, operation.PollingInterval);
97
+ });
98
+ }
99
+ catch (err) {
100
+ this.handleRejectedODataJsonPromise(err);
101
+ }
102
+ });
103
+ }
104
104
  }
105
105
  _SpoTenantRecycleBinItemRemoveCommand_instances = new WeakSet(), _SpoTenantRecycleBinItemRemoveCommand_initTelemetry = function _SpoTenantRecycleBinItemRemoveCommand_initTelemetry() {
106
106
  this.telemetry.push((args) => {
@@ -79,7 +79,7 @@ class TeamsChatGetCommand extends GraphCommand_1.default {
79
79
  const currentUserEmail = accessToken_1.accessToken.getUserNameFromAccessToken(Auth_1.default.service.accessTokens[this.resource].accessToken).toLowerCase();
80
80
  const existingChats = yield chatUtil_1.chatUtil.findExistingChatsByParticipants([currentUserEmail, ...participants]);
81
81
  if (!existingChats || existingChats.length === 0) {
82
- throw new Error('No chat conversation was found with these participants.');
82
+ throw 'No chat conversation was found with these participants.';
83
83
  }
84
84
  if (existingChats.length === 1) {
85
85
  return existingChats[0].id;
@@ -87,14 +87,14 @@ class TeamsChatGetCommand extends GraphCommand_1.default {
87
87
  const disambiguationText = existingChats.map(c => {
88
88
  return `- ${c.id}${c.topic && ' - '}${c.topic} - ${c.createdDateTime && new Date(c.createdDateTime).toLocaleString()}`;
89
89
  }).join(os.EOL);
90
- throw new Error(`Multiple chat conversations with these participants found. Please disambiguate:${os.EOL}${disambiguationText}`);
90
+ throw `Multiple chat conversations with these participants found. Please disambiguate:${os.EOL}${disambiguationText}`;
91
91
  });
92
92
  }
93
93
  getChatIdByName(name) {
94
94
  return __awaiter(this, void 0, void 0, function* () {
95
95
  const existingChats = yield chatUtil_1.chatUtil.findExistingGroupChatsByName(name);
96
96
  if (!existingChats || existingChats.length === 0) {
97
- throw new Error('No chat conversation was found with this name.');
97
+ throw 'No chat conversation was found with this name.';
98
98
  }
99
99
  if (existingChats.length === 1) {
100
100
  return existingChats[0].id;
@@ -103,7 +103,7 @@ class TeamsChatGetCommand extends GraphCommand_1.default {
103
103
  const memberstring = c.members.map(m => m.email).join(', ');
104
104
  return `- ${c.id} - ${c.createdDateTime && new Date(c.createdDateTime).toLocaleString()} - ${memberstring}`;
105
105
  }).join(os.EOL);
106
- throw new Error(`Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`);
106
+ throw `Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`;
107
107
  });
108
108
  }
109
109
  }
@@ -74,14 +74,14 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
74
74
  const disambiguationText = existingChats.map(c => {
75
75
  return `- ${c.id}${c.topic && ' - '}${c.topic} - ${c.createdDateTime && new Date(c.createdDateTime).toLocaleString()}`;
76
76
  }).join(os.EOL);
77
- throw new Error(`Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`);
77
+ throw `Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`;
78
78
  });
79
79
  }
80
80
  getChatIdByName(chatName) {
81
81
  return __awaiter(this, void 0, void 0, function* () {
82
82
  const existingChats = yield chatUtil_1.chatUtil.findExistingGroupChatsByName(chatName);
83
83
  if (!existingChats || existingChats.length === 0) {
84
- throw new Error('No chat conversation was found with this name.');
84
+ throw 'No chat conversation was found with this name.';
85
85
  }
86
86
  if (existingChats.length === 1) {
87
87
  return existingChats[0].id;
@@ -90,7 +90,7 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
90
90
  const memberstring = c.members.map(m => m.email).join(', ');
91
91
  return `- ${c.id} - ${c.createdDateTime && new Date(c.createdDateTime).toLocaleString()} - ${memberstring}`;
92
92
  }).join(os.EOL);
93
- throw new Error(`Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`);
93
+ throw `Multiple chat conversations with this name found. Please disambiguate:${os.EOL}${disambiguationText}`;
94
94
  });
95
95
  }
96
96
  // This Microsoft Graph API request throws an intermittent 404 exception, saying that it cannot find the principal.
@@ -146,7 +146,7 @@ class TeamsChatMessageSendCommand extends GraphCommand_1.default {
146
146
  }
147
147
  }
148
148
  };
149
- yield request_1.default.post(requestOptions);
149
+ return request_1.default.post(requestOptions);
150
150
  });
151
151
  }
152
152
  }
@@ -0,0 +1,17 @@
1
+ Setting name|Definition|Default value
2
+ ------------|----------|-------------
3
+ `autoOpenLinksInBrowser`|Automatically open the browser for all commands which return a url and expect the user to copy paste this to the browser. For example when logging in, using `m365 login` in device code mode.|`false`
4
+ `copyDeviceCodeToClipboard`|Automatically copy the device code to the clipboard when running `m365 login` command in device code mode|`false`
5
+ `csvEscape`|Single character used for escaping; only apply to characters matching the quote and the escape options|`"`
6
+ `csvHeader`|Display the column names on the first line|`true`
7
+ `csvQuote`|The quote characters surrounding a field. An empty quote value will preserve the original field, whether it contains quotation marks or not.|` `
8
+ `csvQuoted`|Quote all the non-empty fields even if not required|`false`
9
+ `csvQuotedEmpty`|Quote empty strings and overrides quoted_string on empty strings when defined|`false`
10
+ `disableTelemetry`|Disables sending of telemetry data|`false`
11
+ `errorOutput`|Defines if errors should be written to `stdout` or `stderr`|`stderr`
12
+ `helpMode`|Defines what part of command's help to display. Allowed values are `options`, `examples`, `remarks`, `response`, `full`|`full`
13
+ `output`|Defines the default output when issuing a command|`json`
14
+ `printErrorsAsPlainText`|When output mode is set to `json`, print error messages as plain-text rather than JSON|`true`
15
+ `prompt`|Prompts for missing values in required options and enables interactive selection when multiple values are available for a command that requires a specific value to be retrieved.|`false`
16
+ `showHelpOnFailure`|Automatically display help when executing a command failed|`true`
17
+ `showSpinner`|Display spinner when executing commands|`true`
@@ -9,7 +9,7 @@ Gets information about the specified Microsoft Power App
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pa app get [options]
12
+ m365 pa app get [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Lists all Power Apps apps
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pa app list [options]
12
+ m365 pa app list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Gets a specific AI builder models in the specified Power Platform environment
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp aibuildermodel get [options]
12
+ m365 pp aibuildermodel get [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ List available AI builder models in the specified Power Platform environment
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp aibuildermodel list [options]
12
+ m365 pp aibuildermodel list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Clones a specific Microsoft Power Platform card in the specified Power Platform
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp card clone [options]
12
+ m365 pp card clone [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Gets a specific Microsoft Power Platform card in the specified Power Platform en
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp card get [options]
12
+ m365 pp card get [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Lists Microsoft Power Platform cards in the specified Power Platform environment
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp card list [options]
12
+ m365 pp card list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Get information about the specified chatbot
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp chatbot get [options]
12
+ m365 pp chatbot get [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Lists Microsoft Power Platform chatbot in the specified Power Platform environme
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp chatbot list [options]
12
+ m365 pp chatbot list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ List a dataverse table in a given environment
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp dataverse table get [options]
12
+ m365 pp dataverse table get [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Lists dataverse tables in a given environment
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp dataverse table list [options]
12
+ m365 pp dataverse table list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -7,7 +7,7 @@ Removes a dataverse table in a given environment
7
7
  ## Usage
8
8
 
9
9
  ```sh
10
- pp dataverse table remove [options]
10
+ m365 pp dataverse table remove [options]
11
11
  ```
12
12
 
13
13
  ## Options
@@ -9,7 +9,7 @@ Lists table rows for the given Dataverse table
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- pp dataverse table row list [options]
12
+ m365 pp dataverse table row list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -7,7 +7,7 @@ Removes a row from a dataverse table in a given environment.
7
7
  ## Usage
8
8
 
9
9
  ```sh
10
- pp dataverse table row remove [options]
10
+ m365 pp dataverse table row remove [options]
11
11
  ```
12
12
 
13
13
  ## Options
@@ -9,7 +9,7 @@ Get an application customizer that is installed tenant wide
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- spo tenant applicationcustomizer get [options]
12
+ m365 spo tenant applicationcustomizer get [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Retrieves a list of application customizers that are installed tenant-wide.
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- spo tenant applicationcustomizer list [options]
12
+ m365 spo tenant applicationcustomizer list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -7,7 +7,7 @@ Removes an application customizer that is installed tenant wide.
7
7
  ## Usage
8
8
 
9
9
  ```sh
10
- spo tenant applicationcustomizer remove [options]
10
+ m365 spo tenant applicationcustomizer remove [options]
11
11
  ```
12
12
 
13
13
  ## Options
@@ -25,6 +25,9 @@ m365 spo tenant applicationcustomizer set [options]
25
25
  `--newTitle [newTitle]`
26
26
  : The updated title of the Application Customizer.
27
27
 
28
+ `--newClientSideComponentId [newClientSideComponentId]`
29
+ : The new Client Side Component Id (GUID) of the Application Customizer.
30
+
28
31
  `-p, --clientSideComponentProperties [clientSideComponentProperties]`
29
32
  : The Client Side Component properties of the Application Customizer.
30
33
 
@@ -55,7 +58,13 @@ When using the `--clientSideComponentProperties` option it's possible to enter a
55
58
  Updates the title of an Application Customizer that is deployed as a tenant-wide extension by its id
56
59
 
57
60
  ```sh
58
- m365 spo tenant applicationcustomizer set --id 3 --newTitle "Some customizer"
61
+ m365 spo tenant applicationcustomizer set --id 3 --newTitle "Some customizer"
62
+ ```
63
+
64
+ Updates the Client Side Component Id of an Application Customizer that is deployed as a tenant-wide extension by its id
65
+
66
+ ```sh
67
+ m365 spo tenant applicationcustomizer set --id 3 --newClientSideComponentId "b44a5182-9877-4029-baec-0181c70dacbc"
59
68
  ```
60
69
 
61
70
  Updates the properties of an Application Customizer that is deployed as a tenant-wide extension by its id
@@ -67,13 +76,13 @@ m365 spo tenant applicationcustomizer set --id 3 --clientSideComponentProperties
67
76
  Updates the title of an Application Customizer that is deployed as a tenant-wide extension by its title
68
77
 
69
78
  ```sh
70
- m365 spo tenant applicationcustomizer set --title "Some customizer" --newTitle "Updated customizer"
79
+ m365 spo tenant applicationcustomizer set --title "Some customizer" --newTitle "Updated customizer"
71
80
  ```
72
81
 
73
82
  Updates the title of an Application Customizer that is deployed as a tenant-wide extension by its clientSideComponentId
74
83
 
75
84
  ```sh
76
- m365 spo tenant applicationcustomizer set --clientSideComponentId "7f8fd1f2-9d26-4a4a-a607-bf4622d7ec11" --newTitle "Some customizer"
85
+ m365 spo tenant applicationcustomizer set --clientSideComponentId "7f8fd1f2-9d26-4a4a-a607-bf4622d7ec11" --newTitle "Some customizer"
77
86
  ```
78
87
 
79
88
  ## Response
@@ -9,7 +9,7 @@ Get a ListView Command Set that is installed tenant wide
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- spo tenant commandset get [options]
12
+ m365 spo tenant commandset get [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -9,7 +9,7 @@ Retrieves a list of ListView Command Sets that are installed tenant-wide
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- spo tenant commandset list [options]
12
+ m365 spo tenant commandset list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -7,7 +7,7 @@ Removes a ListView Command Set that is installed tenant wide.
7
7
  ## Usage
8
8
 
9
9
  ```sh
10
- spo tenant commandset remove [options]
10
+ m365 spo tenant commandset remove [options]
11
11
  ```
12
12
 
13
13
  ## Options
@@ -7,7 +7,7 @@ Updates a ListView Command Set that is installed tenant wide.
7
7
  ## Usage
8
8
 
9
9
  ```sh
10
- spo tenant commandset set [options]
10
+ m365 spo tenant commandset set [options]
11
11
  ```
12
12
 
13
13
  ## Options
@@ -9,7 +9,7 @@ Get SharePoint user profile properties for the specified user
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- spo userprofile get [options]
12
+ m365 spo userprofile get [options]
13
13
  ```
14
14
 
15
15
  ## Options
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnp/cli-microsoft365",
3
- "version": "6.10.0-beta.81a81c0",
3
+ "version": "6.10.0-beta.bd0bd83",
4
4
  "description": "Manage Microsoft 365 and SharePoint Framework projects on any platform",
5
5
  "license": "MIT",
6
6
  "main": "./dist/api.js",