@microsoft/teamsfx-core 3.1.4 → 3.1.5-alpha.3256bba3fe.0

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 (238) hide show
  1. package/README.md +4 -0
  2. package/build/common/featureFlags.d.ts +5 -0
  3. package/build/common/featureFlags.d.ts.map +1 -1
  4. package/build/common/featureFlags.js +5 -0
  5. package/build/common/featureFlags.js.map +1 -1
  6. package/build/common/telemetry.d.ts +2 -1
  7. package/build/common/telemetry.d.ts.map +1 -1
  8. package/build/common/telemetry.js +1 -0
  9. package/build/common/telemetry.js.map +1 -1
  10. package/build/common/templates-config.json +2 -2
  11. package/build/common/wrappedAxiosClient.d.ts +5 -0
  12. package/build/common/wrappedAxiosClient.d.ts.map +1 -1
  13. package/build/common/wrappedAxiosClient.js +95 -4
  14. package/build/common/wrappedAxiosClient.js.map +1 -1
  15. package/build/component/configManager/actionInjector.d.ts +1 -1
  16. package/build/component/configManager/actionInjector.d.ts.map +1 -1
  17. package/build/component/configManager/actionInjector.js +2 -2
  18. package/build/component/configManager/actionInjector.js.map +1 -1
  19. package/build/component/driver/copilotAgent/publish.d.ts.map +1 -1
  20. package/build/component/driver/copilotAgent/publish.js +1 -1
  21. package/build/component/driver/copilotAgent/publish.js.map +1 -1
  22. package/build/component/driver/dcr/create.d.ts.map +1 -1
  23. package/build/component/driver/dcr/create.js +47 -14
  24. package/build/component/driver/dcr/create.js.map +1 -1
  25. package/build/component/driver/dcr/interface/createDcrArgs.d.ts +4 -1
  26. package/build/component/driver/dcr/interface/createDcrArgs.d.ts.map +1 -1
  27. package/build/component/driver/index.d.ts +0 -1
  28. package/build/component/driver/index.d.ts.map +1 -1
  29. package/build/component/driver/index.js +0 -1
  30. package/build/component/driver/index.js.map +1 -1
  31. package/build/component/driver/m365/acquire.d.ts.map +1 -1
  32. package/build/component/driver/m365/acquire.js +2 -2
  33. package/build/component/driver/m365/acquire.js.map +1 -1
  34. package/build/component/driver/oauth/create.d.ts.map +1 -1
  35. package/build/component/driver/oauth/create.js +16 -2
  36. package/build/component/driver/oauth/create.js.map +1 -1
  37. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.d.ts +5 -0
  38. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.d.ts.map +1 -0
  39. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.js +13 -0
  40. package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.js.map +1 -0
  41. package/build/component/driver/oauth/interface/createOauthArgs.d.ts +1 -0
  42. package/build/component/driver/oauth/interface/createOauthArgs.d.ts.map +1 -1
  43. package/build/component/driver/oauth/interface/updateOauthArgs.d.ts +1 -0
  44. package/build/component/driver/oauth/interface/updateOauthArgs.d.ts.map +1 -1
  45. package/build/component/driver/oauth/update.d.ts.map +1 -1
  46. package/build/component/driver/oauth/update.js +26 -4
  47. package/build/component/driver/oauth/update.js.map +1 -1
  48. package/build/component/driver/oauth/utility/supportedAccountTypes.d.ts +6 -0
  49. package/build/component/driver/oauth/utility/supportedAccountTypes.d.ts.map +1 -0
  50. package/build/component/driver/oauth/utility/supportedAccountTypes.js +31 -0
  51. package/build/component/driver/oauth/utility/supportedAccountTypes.js.map +1 -0
  52. package/build/component/driver/teamsApp/constants.d.ts +5 -0
  53. package/build/component/driver/teamsApp/constants.d.ts.map +1 -1
  54. package/build/component/driver/teamsApp/constants.js +5 -0
  55. package/build/component/driver/teamsApp/constants.js.map +1 -1
  56. package/build/component/driver/teamsApp/interfaces/DcrRegistration.d.ts +5 -2
  57. package/build/component/driver/teamsApp/interfaces/DcrRegistration.d.ts.map +1 -1
  58. package/build/component/driver/teamsApp/interfaces/OauthRegistration.d.ts +6 -0
  59. package/build/component/driver/teamsApp/interfaces/OauthRegistration.d.ts.map +1 -1
  60. package/build/component/driver/teamsApp/interfaces/OauthRegistration.js +5 -1
  61. package/build/component/driver/teamsApp/interfaces/OauthRegistration.js.map +1 -1
  62. package/build/component/generator/generatorProvider.d.ts.map +1 -1
  63. package/build/component/generator/generatorProvider.js +0 -3
  64. package/build/component/generator/generatorProvider.js.map +1 -1
  65. package/build/component/generator/templates/templateNames.d.ts +1 -1
  66. package/build/component/generator/templates/templateNames.d.ts.map +1 -1
  67. package/build/component/m365/packageService.d.ts +4 -3
  68. package/build/component/m365/packageService.d.ts.map +1 -1
  69. package/build/component/m365/packageService.js +34 -30
  70. package/build/component/m365/packageService.js.map +1 -1
  71. package/build/component/m365/serviceConstant.d.ts.map +1 -1
  72. package/build/component/m365/serviceConstant.js +5 -0
  73. package/build/component/m365/serviceConstant.js.map +1 -1
  74. package/build/component/m365/skills/graphSkillFileStore.d.ts +14 -0
  75. package/build/component/m365/skills/graphSkillFileStore.d.ts.map +1 -0
  76. package/build/component/m365/skills/graphSkillFileStore.js +164 -0
  77. package/build/component/m365/skills/graphSkillFileStore.js.map +1 -0
  78. package/build/component/m365/skills/incrementalSkillUpload.d.ts +6 -0
  79. package/build/component/m365/skills/incrementalSkillUpload.d.ts.map +1 -0
  80. package/build/component/m365/skills/incrementalSkillUpload.js +70 -0
  81. package/build/component/m365/skills/incrementalSkillUpload.js.map +1 -0
  82. package/build/component/m365/skills/skillDirectoryClient.d.ts +12 -0
  83. package/build/component/m365/skills/skillDirectoryClient.d.ts.map +1 -0
  84. package/build/component/m365/skills/skillDirectoryClient.js +150 -0
  85. package/build/component/m365/skills/skillDirectoryClient.js.map +1 -0
  86. package/build/component/m365/skills/skillFileSync.d.ts +35 -0
  87. package/build/component/m365/skills/skillFileSync.d.ts.map +1 -0
  88. package/build/component/m365/skills/skillFileSync.js +256 -0
  89. package/build/component/m365/skills/skillFileSync.js.map +1 -0
  90. package/build/component/m365/skills/skillPackage.d.ts +40 -0
  91. package/build/component/m365/skills/skillPackage.d.ts.map +1 -0
  92. package/build/component/m365/skills/skillPackage.js +471 -0
  93. package/build/component/m365/skills/skillPackage.js.map +1 -0
  94. package/build/component/m365/skills/skillRequest.d.ts +7 -0
  95. package/build/component/m365/skills/skillRequest.d.ts.map +1 -0
  96. package/build/component/m365/skills/skillRequest.js +91 -0
  97. package/build/component/m365/skills/skillRequest.js.map +1 -0
  98. package/build/component/utils/mcpAuthScaffolder.d.ts +5 -20
  99. package/build/component/utils/mcpAuthScaffolder.d.ts.map +1 -1
  100. package/build/component/utils/mcpAuthScaffolder.js +9 -24
  101. package/build/component/utils/mcpAuthScaffolder.js.map +1 -1
  102. package/build/core/FxCore.d.ts +2 -4
  103. package/build/core/FxCore.d.ts.map +1 -1
  104. package/build/core/FxCore.js +7 -22
  105. package/build/core/FxCore.js.map +1 -1
  106. package/build/question/create.d.ts +0 -6
  107. package/build/question/create.d.ts.map +1 -1
  108. package/build/question/create.js +119 -281
  109. package/build/question/create.js.map +1 -1
  110. package/build/question/generator.js +0 -2
  111. package/build/question/generator.js.map +1 -1
  112. package/build/question/index.d.ts +0 -1
  113. package/build/question/index.d.ts.map +1 -1
  114. package/build/question/index.js +0 -3
  115. package/build/question/index.js.map +1 -1
  116. package/build/question/inputs/index.d.ts +0 -1
  117. package/build/question/inputs/index.d.ts.map +1 -1
  118. package/build/question/inputs/index.js +0 -1
  119. package/build/question/inputs/index.js.map +1 -1
  120. package/build/question/options/CreateProjectOptions.d.ts.map +1 -1
  121. package/build/question/options/CreateProjectOptions.js +0 -1
  122. package/build/question/options/CreateProjectOptions.js.map +1 -1
  123. package/build/question/options/index.d.ts +0 -1
  124. package/build/question/options/index.d.ts.map +1 -1
  125. package/build/question/options/index.js +0 -1
  126. package/build/question/options/index.js.map +1 -1
  127. package/build/question/other.d.ts +0 -1
  128. package/build/question/other.d.ts.map +1 -1
  129. package/build/question/other.js +158 -214
  130. package/build/question/other.js.map +1 -1
  131. package/build/question/scaffold/vsc/CapabilityOptions.d.ts +0 -1
  132. package/build/question/scaffold/vsc/CapabilityOptions.d.ts.map +1 -1
  133. package/build/question/scaffold/vsc/CapabilityOptions.js +0 -9
  134. package/build/question/scaffold/vsc/CapabilityOptions.js.map +1 -1
  135. package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts.map +1 -1
  136. package/build/question/scaffold/vsc/teamsProjectTypeNode.js +0 -24
  137. package/build/question/scaffold/vsc/teamsProjectTypeNode.js.map +1 -1
  138. package/build/v4/mcp/mcpAuthAction.d.ts +0 -1
  139. package/build/v4/mcp/mcpAuthAction.d.ts.map +1 -1
  140. package/build/v4/mcp/mcpAuthAction.js +5 -7
  141. package/build/v4/mcp/mcpAuthAction.js.map +1 -1
  142. package/build/v4/mcp/mcpAuthScaffold.d.ts.map +1 -1
  143. package/build/v4/mcp/mcpAuthScaffold.js +4 -12
  144. package/build/v4/mcp/mcpAuthScaffold.js.map +1 -1
  145. package/package.json +11 -8
  146. package/resource/package.nls.cs.json +72 -68
  147. package/resource/package.nls.de.json +72 -68
  148. package/resource/package.nls.es.json +72 -68
  149. package/resource/package.nls.fr.json +72 -68
  150. package/resource/package.nls.it.json +72 -68
  151. package/resource/package.nls.ja.json +72 -68
  152. package/resource/package.nls.json +15 -58
  153. package/resource/package.nls.ko.json +72 -68
  154. package/resource/package.nls.pl.json +72 -68
  155. package/resource/package.nls.pt-BR.json +72 -68
  156. package/resource/package.nls.ru.json +72 -68
  157. package/resource/package.nls.tr.json +72 -68
  158. package/resource/package.nls.zh-Hans.json +72 -68
  159. package/resource/package.nls.zh-Hant.json +72 -68
  160. package/resource/yaml-schema/v1.13/yaml.schema.json +71 -33
  161. package/resource/yaml-schema/yaml.schema.json +71 -33
  162. package/templates/fallback/common.zip +0 -0
  163. package/templates/fallback/csharp.zip +0 -0
  164. package/templates/fallback/js.zip +0 -0
  165. package/templates/fallback/python.zip +0 -0
  166. package/templates/fallback/ts.zip +0 -0
  167. package/templates/metadata.zip +0 -0
  168. package/templates/v4/floor.json +1 -1
  169. package/templates/v4/templates-metadata.zip +0 -0
  170. package/templates/v4/templates.zip +0 -0
  171. package/build/common/treatmentVariables.d.ts +0 -5
  172. package/build/common/treatmentVariables.d.ts.map +0 -1
  173. package/build/common/treatmentVariables.js +0 -10
  174. package/build/common/treatmentVariables.js.map +0 -1
  175. package/build/component/driver/add/addWebPart.d.ts +0 -12
  176. package/build/component/driver/add/addWebPart.d.ts.map +0 -1
  177. package/build/component/driver/add/addWebPart.js +0 -109
  178. package/build/component/driver/add/addWebPart.js.map +0 -1
  179. package/build/component/driver/add/error/noConfigurationError.d.ts +0 -5
  180. package/build/component/driver/add/error/noConfigurationError.d.ts.map +0 -1
  181. package/build/component/driver/add/error/noConfigurationError.js +0 -22
  182. package/build/component/driver/add/error/noConfigurationError.js.map +0 -1
  183. package/build/component/driver/add/interface/AddWebPartArgs.d.ts +0 -27
  184. package/build/component/driver/add/interface/AddWebPartArgs.d.ts.map +0 -1
  185. package/build/component/driver/add/interface/AddWebPartArgs.js +0 -5
  186. package/build/component/driver/add/interface/AddWebPartArgs.js.map +0 -1
  187. package/build/component/driver/add/utility/constants.d.ts +0 -8
  188. package/build/component/driver/add/utility/constants.d.ts.map +0 -1
  189. package/build/component/driver/add/utility/constants.js +0 -14
  190. package/build/component/driver/add/utility/constants.js.map +0 -1
  191. package/build/component/generator/spfx/depsChecker/dependencyChecker.d.ts +0 -4
  192. package/build/component/generator/spfx/depsChecker/dependencyChecker.d.ts.map +0 -1
  193. package/build/component/generator/spfx/depsChecker/dependencyChecker.js +0 -5
  194. package/build/component/generator/spfx/depsChecker/dependencyChecker.js.map +0 -1
  195. package/build/component/generator/spfx/depsChecker/generatorChecker.d.ts +0 -20
  196. package/build/component/generator/spfx/depsChecker/generatorChecker.d.ts.map +0 -1
  197. package/build/component/generator/spfx/depsChecker/generatorChecker.js +0 -129
  198. package/build/component/generator/spfx/depsChecker/generatorChecker.js.map +0 -1
  199. package/build/component/generator/spfx/depsChecker/yoChecker.d.ts +0 -20
  200. package/build/component/generator/spfx/depsChecker/yoChecker.d.ts.map +0 -1
  201. package/build/component/generator/spfx/depsChecker/yoChecker.js +0 -143
  202. package/build/component/generator/spfx/depsChecker/yoChecker.js.map +0 -1
  203. package/build/component/generator/spfx/error.d.ts +0 -15
  204. package/build/component/generator/spfx/error.d.ts.map +0 -1
  205. package/build/component/generator/spfx/error.js +0 -124
  206. package/build/component/generator/spfx/error.js.map +0 -1
  207. package/build/component/generator/spfx/spfxGenerator.d.ts +0 -30
  208. package/build/component/generator/spfx/spfxGenerator.d.ts.map +0 -1
  209. package/build/component/generator/spfx/spfxGenerator.js +0 -684
  210. package/build/component/generator/spfx/spfxGenerator.js.map +0 -1
  211. package/build/component/generator/spfx/utils/constants.d.ts +0 -45
  212. package/build/component/generator/spfx/utils/constants.d.ts.map +0 -1
  213. package/build/component/generator/spfx/utils/constants.js +0 -56
  214. package/build/component/generator/spfx/utils/constants.js.map +0 -1
  215. package/build/component/generator/spfx/utils/progress-helper.d.ts +0 -9
  216. package/build/component/generator/spfx/utils/progress-helper.d.ts.map +0 -1
  217. package/build/component/generator/spfx/utils/progress-helper.js +0 -22
  218. package/build/component/generator/spfx/utils/progress-helper.js.map +0 -1
  219. package/build/component/generator/spfx/utils/telemetry-helper.d.ts +0 -14
  220. package/build/component/generator/spfx/utils/telemetry-helper.d.ts.map +0 -1
  221. package/build/component/generator/spfx/utils/telemetry-helper.js +0 -31
  222. package/build/component/generator/spfx/utils/telemetry-helper.js.map +0 -1
  223. package/build/component/generator/spfx/utils/telemetryEvents.d.ts +0 -20
  224. package/build/component/generator/spfx/utils/telemetryEvents.d.ts.map +0 -1
  225. package/build/component/generator/spfx/utils/telemetryEvents.js +0 -27
  226. package/build/component/generator/spfx/utils/telemetryEvents.js.map +0 -1
  227. package/build/component/generator/spfx/utils/utils.d.ts +0 -19
  228. package/build/component/generator/spfx/utils/utils.d.ts.map +0 -1
  229. package/build/component/generator/spfx/utils/utils.js +0 -184
  230. package/build/component/generator/spfx/utils/utils.js.map +0 -1
  231. package/build/question/inputs/SPFxAddWebpartInputs.d.ts +0 -20
  232. package/build/question/inputs/SPFxAddWebpartInputs.d.ts.map +0 -1
  233. package/build/question/inputs/SPFxAddWebpartInputs.js +0 -5
  234. package/build/question/inputs/SPFxAddWebpartInputs.js.map +0 -1
  235. package/build/question/options/SPFxAddWebpartOptions.d.ts +0 -10
  236. package/build/question/options/SPFxAddWebpartOptions.d.ts.map +0 -1
  237. package/build/question/options/SPFxAddWebpartOptions.js +0 -50
  238. package/build/question/options/SPFxAddWebpartOptions.js.map +0 -1
@@ -1,684 +0,0 @@
1
- "use strict";
2
- // Copyright (c) Microsoft Corporation.
3
- // Licensed under the MIT license.
4
- /* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SPFxGeneratorImport = exports.SPFxGeneratorNew = exports.SPFxGenerator = void 0;
7
- const tslib_1 = require("tslib");
8
- const lib_1 = require("@feathersjs/hooks/lib");
9
- const teamsfx_api_1 = require("@microsoft/teamsfx-api");
10
- const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
11
- const lodash_1 = require("lodash");
12
- const os_1 = require("os");
13
- const path = tslib_1.__importStar(require("path"));
14
- const semver_1 = tslib_1.__importDefault(require("semver"));
15
- const util = tslib_1.__importStar(require("util"));
16
- const jsonUtils_1 = require("../../../common/jsonUtils");
17
- const localizeUtils_1 = require("../../../common/localizeUtils");
18
- const error_1 = require("../../../error");
19
- const constants_1 = require("../../../question/constants");
20
- const CapabilityOptions_1 = require("../../../question/scaffold/vsc/CapabilityOptions");
21
- const deps_checker_1 = require("../../deps-checker");
22
- const ManifestUtils_1 = require("../../driver/teamsApp/utils/ManifestUtils");
23
- const actionExecutionMW_1 = require("../../middleware/actionExecutionMW");
24
- const envUtil_1 = require("../../utils/envUtil");
25
- const defaultGenerator_1 = require("../defaultGenerator");
26
- const generator_1 = require("../generator");
27
- const generatorChecker_1 = require("./depsChecker/generatorChecker");
28
- const yoChecker_1 = require("./depsChecker/yoChecker");
29
- const error_2 = require("./error");
30
- const constants_2 = require("./utils/constants");
31
- const progress_helper_1 = require("./utils/progress-helper");
32
- const telemetry_helper_1 = require("./utils/telemetry-helper");
33
- const telemetryEvents_1 = require("./utils/telemetryEvents");
34
- const utils_1 = require("./utils/utils");
35
- class SPFxGenerator {
36
- static async generate(context, inputs, destinationPath, actionContext) {
37
- const spfxSolution = inputs[constants_1.QuestionNames.SPFxSolution];
38
- (0, lodash_1.merge)(actionContext?.telemetryProps, {
39
- [telemetryEvents_1.TelemetryProperty.SPFxSolution]: spfxSolution,
40
- });
41
- if (spfxSolution === "new") {
42
- return await this.newSPFxProject(context, inputs, destinationPath);
43
- }
44
- else {
45
- return await this.importSPFxProject(context, inputs, destinationPath, actionContext);
46
- }
47
- }
48
- static async newSPFxProject(context, inputs, destinationPath) {
49
- const yeomanRes = await this.doYeomanScaffold(context, inputs, destinationPath);
50
- if (yeomanRes.isErr())
51
- return (0, teamsfx_api_1.err)(yeomanRes.error);
52
- const templateRes = await generator_1.Generator.generateTemplate(context, destinationPath, constants_2.Constants.TEMPLATE_NAME, "ts");
53
- if (templateRes.isErr())
54
- return (0, teamsfx_api_1.err)(templateRes.error);
55
- return (0, teamsfx_api_1.ok)(undefined);
56
- }
57
- static async importSPFxProject(context, inputs, destinationPath, actionContext) {
58
- const importProgress = context.userInteraction.createProgressBar((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.title"), 3);
59
- await importProgress.start();
60
- const importDetails = [];
61
- try {
62
- // Copy & paste existing SPFx solution
63
- await importProgress.next((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.copyExistingSPFxSolution"));
64
- const spfxFolder = inputs[constants_1.QuestionNames.SPFxFolder];
65
- const destSpfxFolder = path.join(destinationPath, "src");
66
- importDetails.push(os_1.EOL +
67
- `(.) Processing: Copying existing SPFx solution from ${spfxFolder} to ${destSpfxFolder}...`);
68
- await this.copySPFxSolution(spfxFolder, destSpfxFolder);
69
- importDetails.push(`(√) Done: Succeeded to copy existing SPFx solution.`);
70
- // Retrieve solution info to generate template
71
- await importProgress.next((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.generateSPFxTemplates"));
72
- importDetails.push(`(.) Processing: Reading web part manifest in SPFx solution...`);
73
- const webpartManifest = await this.getWebpartManifest(spfxFolder);
74
- if (!webpartManifest ||
75
- !webpartManifest["id"] ||
76
- !webpartManifest["preconfiguredEntries"][0].title.default) {
77
- importDetails.push(`(×) Error: Failed to Read web part manifest due to invalid ${!webpartManifest
78
- ? "web part manifest"
79
- : !webpartManifest["id"]
80
- ? "web part manifest id"
81
- : "preconfiguredEntries title in web part manifest file"}!`);
82
- throw (0, error_2.RetrieveSPFxInfoError)();
83
- }
84
- importDetails.push(`(√) Done: Succeeded to retrieve web part manifest in SPFx solution.`);
85
- if (!context.templateVariables) {
86
- context.templateVariables = generator_1.Generator.getDefaultVariables(inputs[constants_1.QuestionNames.AppName]);
87
- }
88
- const nodeVersion = await this.getNodeVersion(destSpfxFolder, context);
89
- const yoInfoPath = path.join(inputs[constants_1.QuestionNames.SPFxFolder], constants_2.Constants.YO_RC_FILE);
90
- const SPFxVersion = await this.getSolutionVersion(yoInfoPath);
91
- context.templateVariables["SpfxNodeVersion"] = nodeVersion;
92
- context.templateVariables["componentId"] = webpartManifest["id"];
93
- context.templateVariables["webpartName"] =
94
- webpartManifest["preconfiguredEntries"][0].title.default;
95
- context.templateVariables["useNewDevUrl"] = semver_1.default.gte(SPFxVersion, "1.21.0") ? "true" : "";
96
- importDetails.push(`(.) Processing: Generating SPFx project templates with app name: ${inputs[constants_1.QuestionNames.AppName]}, component id: ${webpartManifest["id"]}, web part name: ${webpartManifest["preconfiguredEntries"][0].title.default}`);
97
- const templateRes = await generator_1.Generator.generateTemplate(context, destinationPath, constants_2.Constants.TEMPLATE_NAME, "ts");
98
- if (templateRes.isErr()) {
99
- importDetails.push(`(×) Error: Failed to generate SPFx project templates!`);
100
- throw templateRes.error;
101
- }
102
- importDetails.push(`(√) Done: Succeeded to generate SPFx project templates.`);
103
- // Update manifest and related files
104
- await importProgress.next((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.updateTemplates"));
105
- await this.updateSPFxTemplate(spfxFolder, destinationPath, importDetails, semver_1.default.gte(SPFxVersion, "1.21.0"));
106
- }
107
- catch (error) {
108
- await importProgress.end(false);
109
- importDetails.push((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.fail", context.logProvider?.getLogFilePath()));
110
- await context.logProvider.logInFile(teamsfx_api_1.LogLevel.Info, importDetails.join(os_1.EOL));
111
- void context.logProvider.error((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.fail", context.logProvider?.getLogFilePath()));
112
- if (error instanceof teamsfx_api_1.UserError || error instanceof teamsfx_api_1.SystemError) {
113
- return (0, teamsfx_api_1.err)(error);
114
- }
115
- return (0, teamsfx_api_1.err)((0, error_2.ImportSPFxSolutionError)(error));
116
- }
117
- await importProgress.end(true);
118
- importDetails.push((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.success", context.logProvider?.getLogFilePath()));
119
- await context.logProvider.logInFile(teamsfx_api_1.LogLevel.Info, importDetails.join(os_1.EOL));
120
- void context.logProvider.info((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.success", context.logProvider?.getLogFilePath()));
121
- void context.userInteraction.showMessage("info", (0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.success", destinationPath), false);
122
- return (0, teamsfx_api_1.ok)(undefined);
123
- }
124
- static async doYeomanScaffold(context, inputs, destinationPath) {
125
- const ui = context.userInteraction;
126
- const progressHandler = await progress_helper_1.ProgressHelper.startScaffoldProgressHandler(ui, inputs.stage == teamsfx_api_1.Stage.addWebpart);
127
- let shouldInstallLocally = inputs[constants_1.QuestionNames.SPFxInstallPackage] === constants_1.SPFxVersionOptionIds.installLocally;
128
- try {
129
- const webpartName = inputs[constants_1.QuestionNames.SPFxWebpartName];
130
- const framework = inputs[constants_1.QuestionNames.SPFxFramework];
131
- const solutionName = inputs[constants_1.QuestionNames.AppName];
132
- const isAddSPFx = inputs.stage == teamsfx_api_1.Stage.addWebpart;
133
- const componentName = utils_1.Utils.normalizeComponentName(webpartName);
134
- const componentNameCamelCase = (0, lodash_1.camelCase)(componentName);
135
- await progressHandler?.next((0, localizeUtils_1.getLocalizedString)("plugins.spfx.scaffold.dependencyCheck"));
136
- const yoChecker = new yoChecker_1.YoChecker(context.logProvider);
137
- const spGeneratorChecker = new generatorChecker_1.GeneratorChecker(context.logProvider);
138
- let targetVersion = constants_2.Constants.LatestVersion;
139
- let localVersion = undefined;
140
- if (isAddSPFx) {
141
- const yoInfoPath = path.join(inputs[constants_1.QuestionNames.SPFxFolder], constants_2.Constants.YO_RC_FILE);
142
- targetVersion = await this.getSolutionVersion(yoInfoPath);
143
- if (!targetVersion) {
144
- context.logProvider.error((0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.cannotFindSolutionVersion", yoInfoPath));
145
- throw (0, error_2.SolutionVersionMissingError)(yoInfoPath);
146
- }
147
- const versions = await Promise.all([
148
- spGeneratorChecker.findLocalInstalledVersion(),
149
- spGeneratorChecker.findGloballyInstalledVersion(undefined, false),
150
- ]);
151
- localVersion = versions[0];
152
- shouldInstallLocally = await this.shouldAddWebPartWithLocalDependencies(targetVersion, versions[1], localVersion, context);
153
- }
154
- if (shouldInstallLocally) {
155
- await this.ensureLocalDependencies(targetVersion, localVersion, inputs, context, yoChecker, spGeneratorChecker, progressHandler);
156
- }
157
- else {
158
- const isLowerVersion = !!inputs.globalSpfxPackageVersion &&
159
- semver_1.default.lt(inputs.globalSpfxPackageVersion, constants_2.Constants.RecommendedLowestSpfxVersion.substring(1));
160
- if (isLowerVersion) {
161
- context.telemetryReporter?.sendTelemetryEvent(telemetryEvents_1.TelemetryEvents.UseNotRecommendedVersion);
162
- }
163
- }
164
- await progressHandler?.next((0, localizeUtils_1.getLocalizedString)(isAddSPFx
165
- ? "driver.spfx.add.progress.scaffoldWebpart"
166
- : "plugins.spfx.scaffold.scaffoldProject"));
167
- if (inputs.platform === teamsfx_api_1.Platform.VSCode) {
168
- context.logProvider.outputChannel.show();
169
- }
170
- const yoEnv = process.env;
171
- if (yoEnv.PATH) {
172
- yoEnv.PATH = shouldInstallLocally
173
- ? `${yoChecker.getBinFolders().join(path.delimiter)}${path.delimiter}${process.env.PATH ?? ""}`
174
- : process.env.PATH;
175
- }
176
- else {
177
- yoEnv.Path = shouldInstallLocally
178
- ? `${yoChecker.getBinFolders().join(path.delimiter)}${path.delimiter}${process.env.Path ?? ""}`
179
- : process.env.Path;
180
- }
181
- const args = [
182
- shouldInstallLocally ? spGeneratorChecker.getSpGeneratorPath() : "@microsoft/sharepoint",
183
- "--skip-install",
184
- "true",
185
- "--component-type",
186
- "webpart",
187
- "--component-name",
188
- webpartName,
189
- "--environment",
190
- "spo",
191
- "--skip-feature-deployment",
192
- "true",
193
- "--is-domain-isolated",
194
- "false",
195
- ];
196
- if (framework) {
197
- args.push("--framework", framework);
198
- }
199
- if (solutionName) {
200
- args.push("--solution-name", `"${solutionName}"`);
201
- }
202
- try {
203
- await deps_checker_1.cpUtils.executeCommand(isAddSPFx ? inputs[constants_1.QuestionNames.SPFxFolder] : destinationPath, context.logProvider, {
204
- timeout: 2 * 60 * 1000,
205
- env: yoEnv,
206
- shell: (0, utils_1.getShellOptionValue)(),
207
- }, "yo", ...args);
208
- }
209
- catch (yoError) {
210
- if (yoError.message) {
211
- void context.logProvider.error(yoError.message);
212
- }
213
- throw (0, error_2.YoGeneratorScaffoldError)();
214
- }
215
- const newPath = path.join(destinationPath, "src");
216
- if (!isAddSPFx) {
217
- const currentPath = path.join(destinationPath, solutionName);
218
- await fs_extra_1.default.rename(currentPath, newPath);
219
- }
220
- await progressHandler?.next((0, localizeUtils_1.getLocalizedString)("plugins.spfx.scaffold.updateManifest"));
221
- const manifestPath = `${newPath}/src/webparts/${componentNameCamelCase}/${componentName}WebPart.manifest.json`;
222
- const manifest = await fs_extra_1.default.readFile(manifestPath, "utf8");
223
- let manifestString = manifest.toString();
224
- manifestString = manifestString.replace(`"supportedHosts": ["SharePointWebPart"]`, `"supportedHosts": ["SharePointWebPart", "TeamsPersonalApp", "TeamsTab"]`);
225
- await fs_extra_1.default.writeFile(manifestPath, manifestString);
226
- const matchHashComment = new RegExp(/(\/\/ .*)/, "gi");
227
- const manifestJson = JSON.parse(manifestString.replace(matchHashComment, "").trim());
228
- const componentId = manifestJson.id;
229
- if (!context.templateVariables) {
230
- context.templateVariables = generator_1.Generator.getDefaultVariables(solutionName ?? "");
231
- }
232
- if (shouldInstallLocally) {
233
- context.templateVariables["useNewDevUrl"] = "true";
234
- }
235
- else {
236
- const SPFxVersion = await spGeneratorChecker.findGloballyInstalledVersion(undefined, false);
237
- context.templateVariables["useNewDevUrl"] =
238
- SPFxVersion && semver_1.default.gte(SPFxVersion, "1.21.0") ? "true" : "";
239
- }
240
- if (!isAddSPFx) {
241
- context.templateVariables["componentId"] = componentId;
242
- context.templateVariables["webpartName"] = webpartName;
243
- const nodeVersion = await this.getNodeVersion(newPath, context);
244
- context.templateVariables["SpfxNodeVersion"] = nodeVersion;
245
- }
246
- // remove dataVersion() function, related issue: https://github.com/SharePoint/sp-dev-docs/issues/6469
247
- const webpartFile = `${newPath}/src/webparts/${componentNameCamelCase}/${componentName}WebPart.ts`;
248
- const codeFile = await fs_extra_1.default.readFile(webpartFile, "utf8");
249
- let codeString = codeFile.toString();
250
- codeString = codeString.replace(` protected get dataVersion(): Version {\r\n return Version.parse('1.0');\r\n }\r\n\r\n`, ``);
251
- codeString = codeString.replace(`import { Version } from '@microsoft/sp-core-library';\r\n`, ``);
252
- await fs_extra_1.default.writeFile(webpartFile, codeString);
253
- // remove .vscode
254
- const debugPath = `${newPath}/.vscode`;
255
- if (await fs_extra_1.default.pathExists(debugPath)) {
256
- await fs_extra_1.default.remove(debugPath);
257
- }
258
- await progressHandler?.end(true);
259
- return (0, teamsfx_api_1.ok)(componentId);
260
- }
261
- catch (error) {
262
- await progressHandler?.end(false);
263
- return (0, teamsfx_api_1.err)((0, error_2.ScaffoldError)(error));
264
- }
265
- }
266
- static async getSolutionVersion(yoInfoPath) {
267
- if (await fs_extra_1.default.pathExists(yoInfoPath)) {
268
- const yoInfo = await fs_extra_1.default.readJson(yoInfoPath);
269
- if (yoInfo["@microsoft/generator-sharepoint"]) {
270
- return yoInfo["@microsoft/generator-sharepoint"][constants_2.Constants.YO_RC_VERSION];
271
- }
272
- }
273
- else {
274
- throw new error_1.FileNotFoundError(constants_2.Constants.PLUGIN_NAME, yoInfoPath);
275
- }
276
- return "";
277
- }
278
- static async ensureLocalDependencies(targetSPFxVersion, localSPFxVersion, inputs, context, yoChecker, spGeneratorChecker, progressHandler) {
279
- let needInstallYo = false;
280
- let needInstallGenerator = false;
281
- const isAddWebPart = targetSPFxVersion !== constants_2.Constants.LatestVersion;
282
- // yo
283
- if (!isAddWebPart) {
284
- const latestYoInstalled = await yoChecker.isLatestInstalled();
285
- needInstallYo = !latestYoInstalled;
286
- }
287
- else {
288
- const localYoVersion = await yoChecker.findLocalInstalledVersion();
289
- needInstallYo = !localYoVersion;
290
- }
291
- // spfx generator
292
- if (!isAddWebPart) {
293
- const latestGeneratorInstalled = await spGeneratorChecker.isLatestInstalled(inputs.latestSpfxPackageVersion);
294
- needInstallGenerator = !latestGeneratorInstalled;
295
- }
296
- else {
297
- // we have check and confirmed with user before install/upgrade dependencies for user
298
- needInstallGenerator = !localSPFxVersion || semver_1.default.lt(localSPFxVersion, targetSPFxVersion);
299
- }
300
- if (needInstallYo || needInstallGenerator) {
301
- await progressHandler?.next((0, localizeUtils_1.getLocalizedString)("plugins.spfx.scaffold.dependencyInstall"));
302
- if (needInstallYo) {
303
- const yoRes = await yoChecker.ensureDependency(context, constants_2.Constants.LatestVersion);
304
- if (yoRes.isErr()) {
305
- if (isAddWebPart) {
306
- throw (0, error_2.PackageTargetVersionInstallError)(constants_2.Constants.YeomanPackageName, constants_2.Constants.LatestVersion);
307
- }
308
- else {
309
- throw (0, error_2.LatestPackageInstallError)();
310
- }
311
- }
312
- }
313
- if (needInstallGenerator) {
314
- const spGeneratorRes = await spGeneratorChecker.ensureDependency(context, targetSPFxVersion);
315
- if (spGeneratorRes.isErr()) {
316
- if (isAddWebPart) {
317
- throw (0, error_2.PackageTargetVersionInstallError)(constants_2.Constants.GeneratorPackageName, targetSPFxVersion);
318
- }
319
- else {
320
- throw (0, error_2.LatestPackageInstallError)();
321
- }
322
- }
323
- }
324
- }
325
- }
326
- // return shouldUseLocal
327
- static async shouldAddWebPartWithLocalDependencies(solutionVersion, globalVersion, localVersion, context) {
328
- if (globalVersion === solutionVersion) {
329
- // use globally installed pacakge to add web part
330
- context.telemetryReporter?.sendTelemetryEvent(telemetryEvents_1.TelemetryEvents.CheckAddWebPartPackage, {
331
- [telemetryEvents_1.TelemetryProperty.PackageSource]: "global",
332
- });
333
- return false;
334
- }
335
- if (localVersion === solutionVersion) {
336
- // use locally installed package to add web part
337
- context.telemetryReporter?.sendTelemetryEvent(telemetryEvents_1.TelemetryEvents.CheckAddWebPartPackage, {
338
- [telemetryEvents_1.TelemetryProperty.PackageSource]: "local",
339
- [telemetryEvents_1.TelemetryProperty.UserAction]: "none",
340
- });
341
- return true;
342
- }
343
- const displayedSolutionVersion = `v${solutionVersion}`;
344
- const displayedLocalVersion = localVersion ? `v${localVersion}` : undefined;
345
- const displayedGlobalVersion = globalVersion ? `v${globalVersion}` : undefined;
346
- let userAnswer;
347
- let continueText;
348
- let defaultContinueText;
349
- if (!localVersion) {
350
- // ask user to confirm to install locally
351
- continueText = (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.install");
352
- defaultContinueText = (0, localizeUtils_1.getDefaultString)("plugins.spfx.addWebPart.install");
353
- const res = await context.userInteraction.showMessage("info", (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.confirmInstall", displayedSolutionVersion, displayedSolutionVersion), true, continueText);
354
- userAnswer = res.isOk() ? res.value : undefined;
355
- }
356
- else if (semver_1.default.lt(localVersion, solutionVersion)) {
357
- // ask user to confirm to upgrade local SPFx
358
- continueText = (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.upgrade");
359
- defaultContinueText = (0, localizeUtils_1.getDefaultString)("plugins.spfx.addWebPart.upgrade");
360
- const res = await context.userInteraction.showMessage("info", (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.confirmUpgrade", displayedLocalVersion, displayedSolutionVersion, displayedSolutionVersion), true, continueText);
361
- userAnswer = res.isOk() ? res.value : undefined;
362
- }
363
- else {
364
- // localVersion > solutionVersion
365
- // ask user to confirm to continue, learn more or cancel
366
- continueText = (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.versionMismatch.continue");
367
- defaultContinueText = (0, localizeUtils_1.getDefaultString)("plugins.spfx.addWebPart.versionMismatch.continue");
368
- let userSelected;
369
- const helpText = (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.versionMismatch.help");
370
- do {
371
- const res = await context.userInteraction.showMessage("info", (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.versionMismatch.continueConfirm", displayedSolutionVersion, displayedLocalVersion), true, helpText, continueText);
372
- userSelected = res.isOk() ? res.value : undefined;
373
- if (userSelected === helpText) {
374
- context.telemetryReporter?.sendTelemetryEvent(telemetryEvents_1.TelemetryEvents.LearnMoreVersionMismatch);
375
- void context.userInteraction.openUrl(constants_2.Constants.AddWebpartHelpLink);
376
- }
377
- } while (userSelected === helpText);
378
- userAnswer = userSelected;
379
- context.logProvider.log(teamsfx_api_1.LogLevel.Warning, displayedGlobalVersion
380
- ? (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.versionMismatch.output", displayedSolutionVersion, displayedGlobalVersion, displayedLocalVersion, displayedLocalVersion, constants_2.Constants.AddWebpartHelpLink)
381
- : (0, localizeUtils_1.getLocalizedString)("plugins.spfx.addWebPart.versionMismatch.localOnly.output", displayedSolutionVersion, displayedLocalVersion, displayedLocalVersion, constants_2.Constants.AddWebpartHelpLink));
382
- }
383
- context.telemetryReporter?.sendTelemetryEvent(telemetryEvents_1.TelemetryEvents.CheckAddWebPartPackage, {
384
- [telemetryEvents_1.TelemetryProperty.PackageSource]: "local",
385
- [telemetryEvents_1.TelemetryProperty.UserAction]: defaultContinueText,
386
- [telemetryEvents_1.TelemetryProperty.ConfirmAddWebPartResult]: !userAnswer ? "Cancel" : defaultContinueText,
387
- });
388
- if (userAnswer !== continueText) {
389
- throw new error_1.UserCancelError(constants_2.Constants.PLUGIN_NAME);
390
- }
391
- else {
392
- return true;
393
- }
394
- }
395
- static async copySPFxSolution(src, dest) {
396
- try {
397
- await fs_extra_1.default.ensureDir(dest);
398
- await fs_extra_1.default.copy(src, dest, {
399
- overwrite: true,
400
- recursive: true,
401
- filter: (file) => {
402
- return file.indexOf("node_modules") < 0;
403
- },
404
- });
405
- }
406
- catch (e) {
407
- throw (0, error_2.CopyExistingSPFxSolutionError)(e);
408
- }
409
- }
410
- static async getWebpartManifest(spfxFolder) {
411
- const webpartsDir = path.join(spfxFolder, "src", "webparts");
412
- if (await fs_extra_1.default.pathExists(webpartsDir)) {
413
- const webparts = (await fs_extra_1.default.readdir(webpartsDir)).filter((file) => fs_extra_1.default.statSync(path.join(webpartsDir, file)).isDirectory());
414
- if (webparts.length < 1) {
415
- return undefined;
416
- }
417
- const webpartManifest = (await fs_extra_1.default.readdir(path.join(webpartsDir, webparts[0]))).find((file) => file.endsWith("WebPart.manifest.json"));
418
- if (webpartManifest === undefined) {
419
- throw new error_1.FileNotFoundError(constants_2.Constants.PLUGIN_NAME, path.join(webpartsDir, webparts[0], `${webparts[0].split(path.sep).pop()}WebPart.manifest.json`), constants_2.Constants.IMPORT_HELP_LINK);
420
- }
421
- const matchHashComment = new RegExp(/(\/\/ .*)/, "gi");
422
- const manifest = JSON.parse((await fs_extra_1.default.readFile(path.join(webpartsDir, webparts[0], webpartManifest), "utf8"))
423
- .toString()
424
- .replace(matchHashComment, "")
425
- .trim());
426
- return manifest;
427
- }
428
- return undefined;
429
- }
430
- static async updateSPFxTemplate(spfxFolder, destinationPath, importDetails, useNewDevUrl) {
431
- try {
432
- importDetails.push(`(.) Processing: Loading manifest.local.json...`);
433
- const localManifestRes = await ManifestUtils_1.manifestUtils._readAppManifest(path.join(destinationPath, teamsfx_api_1.AppPackageFolderName, "manifest.local.json"));
434
- if (localManifestRes.isErr())
435
- throw localManifestRes.error;
436
- const localManifest = localManifestRes.value;
437
- importDetails.push(`(√) Done: Succeeded to load manifest.local.json.`);
438
- importDetails.push(`(.) Processing: Loading manifest.json...`);
439
- const remoteManifestRes = await ManifestUtils_1.manifestUtils._readAppManifest(path.join(destinationPath, teamsfx_api_1.AppPackageFolderName, "manifest.json"));
440
- if (remoteManifestRes.isErr())
441
- throw remoteManifestRes.error;
442
- let remoteManifest = remoteManifestRes.value;
443
- importDetails.push(`(√) Done: Succeeded to load manifest.json.`);
444
- const webpartsDir = path.join(spfxFolder, "src", "webparts");
445
- const webparts = (await fs_extra_1.default.readdir(webpartsDir)).filter((file) => fs_extra_1.default.statSync(path.join(webpartsDir, file)).isDirectory());
446
- if (webparts.length > 1) {
447
- importDetails.push(`(.) Processing: There're multiple web parts in the SPFx solution, exposing each of them in Teams manifest...`);
448
- for (let i = 1; i < webparts.length; i++) {
449
- const webpart = webparts[i];
450
- const webpartManifestFile = (await fs_extra_1.default.readdir(path.join(webpartsDir, webpart))).find((file) => file.endsWith("WebPart.manifest.json"));
451
- if (webpartManifestFile === undefined) {
452
- importDetails.push(` [${i}] Web part manifest doesn't exist at ${path.join(webpartsDir, webpart, `${webpart}WebPart.manifest.json`)}, skip...`);
453
- continue;
454
- }
455
- const matchHashComment = new RegExp(/(\/\/ .*)/, "gi");
456
- const webpartManifest = JSON.parse((await fs_extra_1.default.readFile(path.join(webpartsDir, webpart, webpartManifestFile), "utf8"))
457
- .toString()
458
- .replace(matchHashComment, "")
459
- .trim());
460
- importDetails.push(` [${i}] Adding web part to Teams manifest with component id: ${webpartManifest["id"]}, web part name: ${webpartManifest["preconfiguredEntries"][0].title.default}...`);
461
- const componentId = webpartManifest["id"];
462
- const webpartName = webpartManifest["preconfiguredEntries"][0].title.default;
463
- const remoteStaticSnippet = {
464
- entityId: componentId,
465
- name: webpartName,
466
- contentUrl: util.format(constants_2.ManifestTemplate.REMOTE_CONTENT_URL, componentId),
467
- websiteUrl: constants_2.ManifestTemplate.WEBSITE_URL,
468
- scopes: ["personal"],
469
- };
470
- const localStaticSnippet = {
471
- entityId: componentId,
472
- name: webpartName,
473
- contentUrl: util.format(useNewDevUrl
474
- ? constants_2.ManifestTemplate.LOCAL_CONTENT_URL_NEW
475
- : constants_2.ManifestTemplate.LOCAL_CONTENT_URL, componentId),
476
- websiteUrl: constants_2.ManifestTemplate.WEBSITE_URL,
477
- scopes: ["personal"],
478
- };
479
- localManifest.staticTabs?.push(localStaticSnippet);
480
- remoteManifest.staticTabs?.push(remoteStaticSnippet);
481
- }
482
- importDetails.push(`(√) Done: Succeeded to expose additional web parts in Teams manifest.`);
483
- }
484
- if (await fs_extra_1.default.pathExists(path.join(spfxFolder, "teams", "manifest.json"))) {
485
- importDetails.push(`(.) Processing: There's existing Teams manifest under ${path.join(spfxFolder, "teams", "manifest.json")}, updating default template...`);
486
- const existingManifest = await fs_extra_1.default.readJson(path.join(spfxFolder, "teams", "manifest.json"));
487
- importDetails.push(`(.) Processing: Writing existing app id in manifest.json to TEAMS_APP_ID in env.dev...`);
488
- await envUtil_1.envUtil.writeEnv(destinationPath, "dev", { TEAMS_APP_ID: existingManifest.id });
489
- importDetails.push(`(√) Done: Succeeded to write existing app id to env.dev.`);
490
- importDetails.push(`(.) Processing: Updating default manifest with existing one...`);
491
- existingManifest.$schema = remoteManifest.$schema;
492
- existingManifest.manifestVersion = remoteManifest.manifestVersion;
493
- existingManifest.id = remoteManifest.id;
494
- existingManifest.icons = remoteManifest.icons;
495
- existingManifest.staticTabs = remoteManifest.staticTabs;
496
- existingManifest.configurableTabs = remoteManifest.configurableTabs;
497
- remoteManifest = existingManifest;
498
- }
499
- // Truncate manifest app name if exceed limitation
500
- localManifest.name.short = utils_1.Utils.truncateAppShortName(localManifest.name.short);
501
- remoteManifest.name.short = utils_1.Utils.truncateAppShortName(remoteManifest.name.short);
502
- importDetails.push(`(.) Processing: Writing to save changes to manifest.local.json...`);
503
- await ManifestUtils_1.manifestUtils._writeAppManifest(localManifest, path.join(destinationPath, teamsfx_api_1.AppPackageFolderName, "manifest.local.json"));
504
- importDetails.push(`(√) Done: Succeeded to write manifest.local.json.`);
505
- importDetails.push(`(.) Processing: Writing to save changes to manifest.json...`);
506
- await ManifestUtils_1.manifestUtils._writeAppManifest(remoteManifest, path.join(destinationPath, teamsfx_api_1.AppPackageFolderName, "manifest.json"));
507
- importDetails.push(`(√) Done: Succeeded to write manifest.json.`);
508
- let colorUpdated = false, outlineUpdated = false;
509
- if (await fs_extra_1.default.pathExists(path.join(spfxFolder, "teams"))) {
510
- for (const file of await fs_extra_1.default.readdir(path.join(spfxFolder, "teams"))) {
511
- if (file.endsWith("color.png") && !colorUpdated) {
512
- importDetails.push(`(.) Processing: Updating color.png with existing ${path.join(spfxFolder, "teams", file)}`);
513
- await fs_extra_1.default.copyFile(path.join(spfxFolder, "teams", file), path.join(destinationPath, teamsfx_api_1.AppPackageFolderName, "color.png"));
514
- colorUpdated = true;
515
- importDetails.push(`(√) Done: Succeeded to update color.png.`);
516
- }
517
- if (file.endsWith("outline.png") && !outlineUpdated) {
518
- importDetails.push(`(.) Processing: Updating outline.png with existing ${path.join(spfxFolder, "teams", file)}`);
519
- await fs_extra_1.default.copyFile(path.join(spfxFolder, "teams", file), path.join(destinationPath, teamsfx_api_1.AppPackageFolderName, "outline.png"));
520
- outlineUpdated = true;
521
- importDetails.push(`(√) Done: Succeeded to update outline.png.`);
522
- }
523
- }
524
- }
525
- }
526
- catch (e) {
527
- throw (0, error_2.UpdateSPFxTemplateError)(e);
528
- }
529
- }
530
- static async getNodeVersion(solutionPath, context) {
531
- const packageJsonPath = path.join(solutionPath, constants_2.Constants.PACKAGE_JSON_FILE);
532
- if (await fs_extra_1.default.pathExists(packageJsonPath)) {
533
- const jsonContentRes = await jsonUtils_1.jsonUtils.readJSONFile(packageJsonPath);
534
- if (jsonContentRes.isErr()) {
535
- telemetry_helper_1.telemetryHelper.sendErrorEvent(context, telemetryEvents_1.TelemetryEvents.GetSpfxNodeVersionFailed, jsonContentRes.error);
536
- }
537
- else {
538
- const packageJson = jsonContentRes.value;
539
- if (!packageJson.engines) {
540
- telemetry_helper_1.telemetryHelper.sendErrorEvent(context, telemetryEvents_1.TelemetryEvents.GetSpfxNodeVersionFailed, (0, error_2.CannotFindPropertyfromJsonError)("engines"));
541
- }
542
- else {
543
- if (!packageJson.engines.node) {
544
- telemetry_helper_1.telemetryHelper.sendErrorEvent(context, telemetryEvents_1.TelemetryEvents.GetSpfxNodeVersionFailed, (0, error_2.CannotFindPropertyfromJsonError)("engines.node"));
545
- }
546
- else {
547
- return packageJson.engines.node;
548
- }
549
- }
550
- }
551
- }
552
- else {
553
- telemetry_helper_1.telemetryHelper.sendErrorEvent(context, telemetryEvents_1.TelemetryEvents.GetSpfxNodeVersionFailed, new error_1.FileNotFoundError(constants_2.Constants.PLUGIN_NAME, packageJsonPath));
554
- }
555
- return constants_2.Constants.DEFAULT_NODE_VERSION;
556
- }
557
- }
558
- exports.SPFxGenerator = SPFxGenerator;
559
- tslib_1.__decorate([
560
- (0, lib_1.hooks)([
561
- (0, actionExecutionMW_1.ActionExecutionMW)({
562
- enableTelemetry: true,
563
- telemetryComponentName: constants_2.Constants.PLUGIN_DEV_NAME,
564
- telemetryEventName: telemetryEvents_1.TelemetryEvents.Generate,
565
- errorSource: constants_2.Constants.PLUGIN_DEV_NAME,
566
- }),
567
- ]),
568
- tslib_1.__metadata("design:type", Function),
569
- tslib_1.__metadata("design:paramtypes", [Object, Object, String, Object]),
570
- tslib_1.__metadata("design:returntype", Promise)
571
- ], SPFxGenerator, "generate", null);
572
- class SPFxGeneratorNew extends defaultGenerator_1.DefaultTemplateGenerator {
573
- componentName = "spfx-new-generator";
574
- activate(context, inputs) {
575
- const capability = inputs[constants_1.QuestionNames.Capabilities];
576
- const spfxSolution = inputs[constants_1.QuestionNames.SPFxSolution];
577
- return capability === CapabilityOptions_1.TabCapabilityOptions.SPFxTab().id && spfxSolution === "new";
578
- }
579
- async getTemplateInfos(context, inputs, destinationPath, actionContext) {
580
- const spfxSolution = inputs[constants_1.QuestionNames.SPFxSolution];
581
- (0, lodash_1.merge)(actionContext?.telemetryProps, {
582
- [telemetryEvents_1.TelemetryProperty.SPFxSolution]: spfxSolution,
583
- });
584
- const yeomanRes = await SPFxGenerator.doYeomanScaffold(context, inputs, destinationPath);
585
- if (yeomanRes.isErr())
586
- return (0, teamsfx_api_1.err)(yeomanRes.error);
587
- return (0, teamsfx_api_1.ok)([
588
- {
589
- templateName: constants_2.Constants.TEMPLATE_NAME,
590
- language: constants_1.ProgrammingLanguage.TS,
591
- replaceMap: context.templateVariables || {},
592
- },
593
- ]);
594
- }
595
- }
596
- exports.SPFxGeneratorNew = SPFxGeneratorNew;
597
- class SPFxGeneratorImport extends defaultGenerator_1.DefaultTemplateGenerator {
598
- componentName = "spfx-import-generator";
599
- importDetails = [];
600
- activate(context, inputs) {
601
- const capability = inputs[constants_1.QuestionNames.Capabilities];
602
- const spfxSolution = inputs[constants_1.QuestionNames.SPFxSolution];
603
- return capability === CapabilityOptions_1.TabCapabilityOptions.SPFxTab().id && spfxSolution !== "new";
604
- }
605
- async getTemplateInfos(context, inputs, destinationPath, actionContext) {
606
- this.importDetails = [];
607
- try {
608
- const spfxSolution = inputs[constants_1.QuestionNames.SPFxSolution];
609
- (0, lodash_1.merge)(actionContext?.telemetryProps, {
610
- [telemetryEvents_1.TelemetryProperty.SPFxSolution]: spfxSolution,
611
- });
612
- const spfxFolder = inputs[constants_1.QuestionNames.SPFxFolder];
613
- const destSpfxFolder = path.join(destinationPath, "src");
614
- this.importDetails.push(os_1.EOL +
615
- `(.) Processing: Copying existing SPFx solution from ${spfxFolder} to ${destSpfxFolder}...`);
616
- await SPFxGenerator.copySPFxSolution(spfxFolder, destSpfxFolder);
617
- this.importDetails.push(`(√) Done: Succeeded to copy existing SPFx solution.`);
618
- this.importDetails.push(`(.) Processing: Reading web part manifest in SPFx solution...`);
619
- const webpartManifest = await SPFxGenerator.getWebpartManifest(spfxFolder);
620
- if (!webpartManifest ||
621
- !webpartManifest["id"] ||
622
- !webpartManifest["preconfiguredEntries"][0].title.default) {
623
- this.importDetails.push(`(×) Error: Failed to Read web part manifest due to invalid ${!webpartManifest
624
- ? "web part manifest"
625
- : !webpartManifest["id"]
626
- ? "web part manifest id"
627
- : "preconfiguredEntries title in web part manifest file"}!`);
628
- throw (0, error_2.RetrieveSPFxInfoError)();
629
- }
630
- this.importDetails.push(`(√) Done: Succeeded to retrieve web part manifest in SPFx solution.`);
631
- if (!context.templateVariables) {
632
- context.templateVariables = generator_1.Generator.getDefaultVariables(inputs[constants_1.QuestionNames.AppName]);
633
- }
634
- const nodeVersion = await SPFxGenerator.getNodeVersion(destSpfxFolder, context);
635
- const yoInfoPath = path.join(inputs[constants_1.QuestionNames.SPFxFolder], constants_2.Constants.YO_RC_FILE);
636
- const SPFxVersion = await SPFxGenerator.getSolutionVersion(yoInfoPath);
637
- context.templateVariables["SpfxNodeVersion"] = nodeVersion;
638
- context.templateVariables["componentId"] = webpartManifest["id"];
639
- context.templateVariables["webpartName"] =
640
- webpartManifest["preconfiguredEntries"][0].title.default;
641
- context.templateVariables["useNewDevUrl"] = semver_1.default.gte(SPFxVersion, "1.21.0") ? "true" : "";
642
- this.importDetails.push(`(.) Processing: Generating SPFx project templates with app name: ${inputs[constants_1.QuestionNames.AppName]}, component id: ${webpartManifest["id"]}, web part name: ${webpartManifest["preconfiguredEntries"][0].title.default}`);
643
- return (0, teamsfx_api_1.ok)([
644
- {
645
- templateName: constants_2.Constants.TEMPLATE_NAME,
646
- language: constants_1.ProgrammingLanguage.TS,
647
- replaceMap: context.templateVariables,
648
- },
649
- ]);
650
- }
651
- catch (error) {
652
- this.importDetails.push((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.fail", context.logProvider?.getLogFilePath()));
653
- await context.logProvider.logInFile(teamsfx_api_1.LogLevel.Info, this.importDetails.join(os_1.EOL));
654
- void context.logProvider.error((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.fail", context.logProvider?.getLogFilePath()));
655
- if (error instanceof teamsfx_api_1.UserError || error instanceof teamsfx_api_1.SystemError) {
656
- return (0, teamsfx_api_1.err)(error);
657
- }
658
- return (0, teamsfx_api_1.err)((0, error_2.ImportSPFxSolutionError)(error));
659
- }
660
- }
661
- async post(context, inputs, destinationPath, actionContext) {
662
- try {
663
- const spfxFolder = inputs[constants_1.QuestionNames.SPFxFolder];
664
- const useNewDevUrl = context.templateVariables?.["useNewDevUrl"];
665
- await SPFxGenerator.updateSPFxTemplate(spfxFolder, destinationPath, this.importDetails, useNewDevUrl == "true");
666
- this.importDetails.push((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.success", context.logProvider?.getLogFilePath()));
667
- await context.logProvider.logInFile(teamsfx_api_1.LogLevel.Info, this.importDetails.join(os_1.EOL));
668
- void context.logProvider.info((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.success", context.logProvider?.getLogFilePath()));
669
- void context.userInteraction.showMessage("info", (0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.success", destinationPath), false);
670
- return (0, teamsfx_api_1.ok)({});
671
- }
672
- catch (error) {
673
- this.importDetails.push((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.fail", context.logProvider?.getLogFilePath()));
674
- await context.logProvider.logInFile(teamsfx_api_1.LogLevel.Info, this.importDetails.join(os_1.EOL));
675
- void context.logProvider.error((0, localizeUtils_1.getLocalizedString)("plugins.spfx.import.log.fail", context.logProvider?.getLogFilePath()));
676
- if (error instanceof teamsfx_api_1.UserError || error instanceof teamsfx_api_1.SystemError) {
677
- return (0, teamsfx_api_1.err)(error);
678
- }
679
- return (0, teamsfx_api_1.err)((0, error_2.ImportSPFxSolutionError)(error));
680
- }
681
- }
682
- }
683
- exports.SPFxGeneratorImport = SPFxGeneratorImport;
684
- //# sourceMappingURL=spfxGenerator.js.map