@microsoft/teamsfx-core 3.1.4 → 3.1.5-alpha.36e30da2f6.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.
- package/README.md +4 -0
- package/build/common/featureFlags.d.ts +5 -0
- package/build/common/featureFlags.d.ts.map +1 -1
- package/build/common/featureFlags.js +5 -0
- package/build/common/featureFlags.js.map +1 -1
- package/build/common/telemetry.d.ts +2 -1
- package/build/common/telemetry.d.ts.map +1 -1
- package/build/common/telemetry.js +1 -0
- package/build/common/telemetry.js.map +1 -1
- package/build/common/templates-config.json +2 -2
- package/build/common/wrappedAxiosClient.d.ts +5 -0
- package/build/common/wrappedAxiosClient.d.ts.map +1 -1
- package/build/common/wrappedAxiosClient.js +95 -4
- package/build/common/wrappedAxiosClient.js.map +1 -1
- package/build/component/configManager/actionInjector.d.ts +1 -1
- package/build/component/configManager/actionInjector.d.ts.map +1 -1
- package/build/component/configManager/actionInjector.js +2 -2
- package/build/component/configManager/actionInjector.js.map +1 -1
- package/build/component/driver/copilotAgent/publish.d.ts.map +1 -1
- package/build/component/driver/copilotAgent/publish.js +1 -1
- package/build/component/driver/copilotAgent/publish.js.map +1 -1
- package/build/component/driver/dcr/create.d.ts.map +1 -1
- package/build/component/driver/dcr/create.js +47 -14
- package/build/component/driver/dcr/create.js.map +1 -1
- package/build/component/driver/dcr/interface/createDcrArgs.d.ts +4 -1
- package/build/component/driver/dcr/interface/createDcrArgs.d.ts.map +1 -1
- package/build/component/driver/index.d.ts +0 -1
- package/build/component/driver/index.d.ts.map +1 -1
- package/build/component/driver/index.js +0 -1
- package/build/component/driver/index.js.map +1 -1
- package/build/component/driver/m365/acquire.d.ts.map +1 -1
- package/build/component/driver/m365/acquire.js +2 -2
- package/build/component/driver/m365/acquire.js.map +1 -1
- package/build/component/driver/oauth/create.d.ts.map +1 -1
- package/build/component/driver/oauth/create.js +16 -2
- package/build/component/driver/oauth/create.js.map +1 -1
- package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.d.ts +5 -0
- package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.d.ts.map +1 -0
- package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.js +13 -0
- package/build/component/driver/oauth/error/oauthSupportedAccountTypesUnsupportedCloud.js.map +1 -0
- package/build/component/driver/oauth/interface/createOauthArgs.d.ts +1 -0
- package/build/component/driver/oauth/interface/createOauthArgs.d.ts.map +1 -1
- package/build/component/driver/oauth/interface/updateOauthArgs.d.ts +1 -0
- package/build/component/driver/oauth/interface/updateOauthArgs.d.ts.map +1 -1
- package/build/component/driver/oauth/update.d.ts.map +1 -1
- package/build/component/driver/oauth/update.js +26 -4
- package/build/component/driver/oauth/update.js.map +1 -1
- package/build/component/driver/oauth/utility/supportedAccountTypes.d.ts +6 -0
- package/build/component/driver/oauth/utility/supportedAccountTypes.d.ts.map +1 -0
- package/build/component/driver/oauth/utility/supportedAccountTypes.js +31 -0
- package/build/component/driver/oauth/utility/supportedAccountTypes.js.map +1 -0
- package/build/component/driver/teamsApp/constants.d.ts +5 -0
- package/build/component/driver/teamsApp/constants.d.ts.map +1 -1
- package/build/component/driver/teamsApp/constants.js +5 -0
- package/build/component/driver/teamsApp/constants.js.map +1 -1
- package/build/component/driver/teamsApp/interfaces/DcrRegistration.d.ts +5 -2
- package/build/component/driver/teamsApp/interfaces/DcrRegistration.d.ts.map +1 -1
- package/build/component/driver/teamsApp/interfaces/OauthRegistration.d.ts +6 -0
- package/build/component/driver/teamsApp/interfaces/OauthRegistration.d.ts.map +1 -1
- package/build/component/driver/teamsApp/interfaces/OauthRegistration.js +5 -1
- package/build/component/driver/teamsApp/interfaces/OauthRegistration.js.map +1 -1
- package/build/component/generator/generatorProvider.d.ts.map +1 -1
- package/build/component/generator/generatorProvider.js +0 -3
- package/build/component/generator/generatorProvider.js.map +1 -1
- package/build/component/generator/templates/templateNames.d.ts +1 -1
- package/build/component/generator/templates/templateNames.d.ts.map +1 -1
- package/build/component/m365/packageService.d.ts +4 -3
- package/build/component/m365/packageService.d.ts.map +1 -1
- package/build/component/m365/packageService.js +34 -30
- package/build/component/m365/packageService.js.map +1 -1
- package/build/component/m365/serviceConstant.d.ts.map +1 -1
- package/build/component/m365/serviceConstant.js +5 -0
- package/build/component/m365/serviceConstant.js.map +1 -1
- package/build/component/m365/skills/graphSkillFileStore.d.ts +14 -0
- package/build/component/m365/skills/graphSkillFileStore.d.ts.map +1 -0
- package/build/component/m365/skills/graphSkillFileStore.js +164 -0
- package/build/component/m365/skills/graphSkillFileStore.js.map +1 -0
- package/build/component/m365/skills/incrementalSkillUpload.d.ts +6 -0
- package/build/component/m365/skills/incrementalSkillUpload.d.ts.map +1 -0
- package/build/component/m365/skills/incrementalSkillUpload.js +70 -0
- package/build/component/m365/skills/incrementalSkillUpload.js.map +1 -0
- package/build/component/m365/skills/skillDirectoryClient.d.ts +12 -0
- package/build/component/m365/skills/skillDirectoryClient.d.ts.map +1 -0
- package/build/component/m365/skills/skillDirectoryClient.js +150 -0
- package/build/component/m365/skills/skillDirectoryClient.js.map +1 -0
- package/build/component/m365/skills/skillFileSync.d.ts +35 -0
- package/build/component/m365/skills/skillFileSync.d.ts.map +1 -0
- package/build/component/m365/skills/skillFileSync.js +256 -0
- package/build/component/m365/skills/skillFileSync.js.map +1 -0
- package/build/component/m365/skills/skillPackage.d.ts +40 -0
- package/build/component/m365/skills/skillPackage.d.ts.map +1 -0
- package/build/component/m365/skills/skillPackage.js +471 -0
- package/build/component/m365/skills/skillPackage.js.map +1 -0
- package/build/component/m365/skills/skillRequest.d.ts +7 -0
- package/build/component/m365/skills/skillRequest.d.ts.map +1 -0
- package/build/component/m365/skills/skillRequest.js +91 -0
- package/build/component/m365/skills/skillRequest.js.map +1 -0
- package/build/component/utils/mcpAuthScaffolder.d.ts +5 -20
- package/build/component/utils/mcpAuthScaffolder.d.ts.map +1 -1
- package/build/component/utils/mcpAuthScaffolder.js +9 -24
- package/build/component/utils/mcpAuthScaffolder.js.map +1 -1
- package/build/core/FxCore.d.ts +2 -4
- package/build/core/FxCore.d.ts.map +1 -1
- package/build/core/FxCore.js +7 -22
- package/build/core/FxCore.js.map +1 -1
- package/build/question/create.d.ts +0 -6
- package/build/question/create.d.ts.map +1 -1
- package/build/question/create.js +119 -281
- package/build/question/create.js.map +1 -1
- package/build/question/generator.js +0 -2
- package/build/question/generator.js.map +1 -1
- package/build/question/index.d.ts +0 -1
- package/build/question/index.d.ts.map +1 -1
- package/build/question/index.js +0 -3
- package/build/question/index.js.map +1 -1
- package/build/question/inputs/index.d.ts +0 -1
- package/build/question/inputs/index.d.ts.map +1 -1
- package/build/question/inputs/index.js +0 -1
- package/build/question/inputs/index.js.map +1 -1
- package/build/question/options/CreateProjectOptions.d.ts.map +1 -1
- package/build/question/options/CreateProjectOptions.js +0 -1
- package/build/question/options/CreateProjectOptions.js.map +1 -1
- package/build/question/options/index.d.ts +0 -1
- package/build/question/options/index.d.ts.map +1 -1
- package/build/question/options/index.js +0 -1
- package/build/question/options/index.js.map +1 -1
- package/build/question/other.d.ts +0 -1
- package/build/question/other.d.ts.map +1 -1
- package/build/question/other.js +158 -214
- package/build/question/other.js.map +1 -1
- package/build/question/scaffold/vsc/CapabilityOptions.d.ts +0 -1
- package/build/question/scaffold/vsc/CapabilityOptions.d.ts.map +1 -1
- package/build/question/scaffold/vsc/CapabilityOptions.js +0 -9
- package/build/question/scaffold/vsc/CapabilityOptions.js.map +1 -1
- package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts.map +1 -1
- package/build/question/scaffold/vsc/teamsProjectTypeNode.js +0 -24
- package/build/question/scaffold/vsc/teamsProjectTypeNode.js.map +1 -1
- package/build/v4/mcp/mcpAuthAction.d.ts +0 -1
- package/build/v4/mcp/mcpAuthAction.d.ts.map +1 -1
- package/build/v4/mcp/mcpAuthAction.js +5 -7
- package/build/v4/mcp/mcpAuthAction.js.map +1 -1
- package/build/v4/mcp/mcpAuthScaffold.d.ts.map +1 -1
- package/build/v4/mcp/mcpAuthScaffold.js +4 -12
- package/build/v4/mcp/mcpAuthScaffold.js.map +1 -1
- package/package.json +11 -8
- package/resource/package.nls.cs.json +59 -68
- package/resource/package.nls.de.json +59 -68
- package/resource/package.nls.es.json +59 -68
- package/resource/package.nls.fr.json +59 -68
- package/resource/package.nls.it.json +59 -68
- package/resource/package.nls.ja.json +59 -68
- package/resource/package.nls.json +15 -58
- package/resource/package.nls.ko.json +59 -68
- package/resource/package.nls.pl.json +59 -68
- package/resource/package.nls.pt-BR.json +59 -68
- package/resource/package.nls.ru.json +59 -68
- package/resource/package.nls.tr.json +59 -68
- package/resource/package.nls.zh-Hans.json +59 -68
- package/resource/package.nls.zh-Hant.json +59 -68
- package/resource/yaml-schema/v1.13/yaml.schema.json +71 -33
- package/resource/yaml-schema/yaml.schema.json +71 -33
- package/templates/fallback/common.zip +0 -0
- package/templates/fallback/csharp.zip +0 -0
- package/templates/fallback/js.zip +0 -0
- package/templates/fallback/python.zip +0 -0
- package/templates/fallback/ts.zip +0 -0
- package/templates/metadata.zip +0 -0
- package/templates/v4/floor.json +1 -1
- package/templates/v4/templates-metadata.zip +0 -0
- package/templates/v4/templates.zip +0 -0
- package/build/common/treatmentVariables.d.ts +0 -5
- package/build/common/treatmentVariables.d.ts.map +0 -1
- package/build/common/treatmentVariables.js +0 -10
- package/build/common/treatmentVariables.js.map +0 -1
- package/build/component/driver/add/addWebPart.d.ts +0 -12
- package/build/component/driver/add/addWebPart.d.ts.map +0 -1
- package/build/component/driver/add/addWebPart.js +0 -109
- package/build/component/driver/add/addWebPart.js.map +0 -1
- package/build/component/driver/add/error/noConfigurationError.d.ts +0 -5
- package/build/component/driver/add/error/noConfigurationError.d.ts.map +0 -1
- package/build/component/driver/add/error/noConfigurationError.js +0 -22
- package/build/component/driver/add/error/noConfigurationError.js.map +0 -1
- package/build/component/driver/add/interface/AddWebPartArgs.d.ts +0 -27
- package/build/component/driver/add/interface/AddWebPartArgs.d.ts.map +0 -1
- package/build/component/driver/add/interface/AddWebPartArgs.js +0 -5
- package/build/component/driver/add/interface/AddWebPartArgs.js.map +0 -1
- package/build/component/driver/add/utility/constants.d.ts +0 -8
- package/build/component/driver/add/utility/constants.d.ts.map +0 -1
- package/build/component/driver/add/utility/constants.js +0 -14
- package/build/component/driver/add/utility/constants.js.map +0 -1
- package/build/component/generator/spfx/depsChecker/dependencyChecker.d.ts +0 -4
- package/build/component/generator/spfx/depsChecker/dependencyChecker.d.ts.map +0 -1
- package/build/component/generator/spfx/depsChecker/dependencyChecker.js +0 -5
- package/build/component/generator/spfx/depsChecker/dependencyChecker.js.map +0 -1
- package/build/component/generator/spfx/depsChecker/generatorChecker.d.ts +0 -20
- package/build/component/generator/spfx/depsChecker/generatorChecker.d.ts.map +0 -1
- package/build/component/generator/spfx/depsChecker/generatorChecker.js +0 -129
- package/build/component/generator/spfx/depsChecker/generatorChecker.js.map +0 -1
- package/build/component/generator/spfx/depsChecker/yoChecker.d.ts +0 -20
- package/build/component/generator/spfx/depsChecker/yoChecker.d.ts.map +0 -1
- package/build/component/generator/spfx/depsChecker/yoChecker.js +0 -143
- package/build/component/generator/spfx/depsChecker/yoChecker.js.map +0 -1
- package/build/component/generator/spfx/error.d.ts +0 -15
- package/build/component/generator/spfx/error.d.ts.map +0 -1
- package/build/component/generator/spfx/error.js +0 -124
- package/build/component/generator/spfx/error.js.map +0 -1
- package/build/component/generator/spfx/spfxGenerator.d.ts +0 -30
- package/build/component/generator/spfx/spfxGenerator.d.ts.map +0 -1
- package/build/component/generator/spfx/spfxGenerator.js +0 -684
- package/build/component/generator/spfx/spfxGenerator.js.map +0 -1
- package/build/component/generator/spfx/utils/constants.d.ts +0 -45
- package/build/component/generator/spfx/utils/constants.d.ts.map +0 -1
- package/build/component/generator/spfx/utils/constants.js +0 -56
- package/build/component/generator/spfx/utils/constants.js.map +0 -1
- package/build/component/generator/spfx/utils/progress-helper.d.ts +0 -9
- package/build/component/generator/spfx/utils/progress-helper.d.ts.map +0 -1
- package/build/component/generator/spfx/utils/progress-helper.js +0 -22
- package/build/component/generator/spfx/utils/progress-helper.js.map +0 -1
- package/build/component/generator/spfx/utils/telemetry-helper.d.ts +0 -14
- package/build/component/generator/spfx/utils/telemetry-helper.d.ts.map +0 -1
- package/build/component/generator/spfx/utils/telemetry-helper.js +0 -31
- package/build/component/generator/spfx/utils/telemetry-helper.js.map +0 -1
- package/build/component/generator/spfx/utils/telemetryEvents.d.ts +0 -20
- package/build/component/generator/spfx/utils/telemetryEvents.d.ts.map +0 -1
- package/build/component/generator/spfx/utils/telemetryEvents.js +0 -27
- package/build/component/generator/spfx/utils/telemetryEvents.js.map +0 -1
- package/build/component/generator/spfx/utils/utils.d.ts +0 -19
- package/build/component/generator/spfx/utils/utils.d.ts.map +0 -1
- package/build/component/generator/spfx/utils/utils.js +0 -184
- package/build/component/generator/spfx/utils/utils.js.map +0 -1
- package/build/question/inputs/SPFxAddWebpartInputs.d.ts +0 -20
- package/build/question/inputs/SPFxAddWebpartInputs.d.ts.map +0 -1
- package/build/question/inputs/SPFxAddWebpartInputs.js +0 -5
- package/build/question/inputs/SPFxAddWebpartInputs.js.map +0 -1
- package/build/question/options/SPFxAddWebpartOptions.d.ts +0 -10
- package/build/question/options/SPFxAddWebpartOptions.d.ts.map +0 -1
- package/build/question/options/SPFxAddWebpartOptions.js +0 -50
- 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
|