@react-native-windows/cli 0.0.0-canary.99 → 0.0.1-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 (131) hide show
  1. package/README.md +0 -2
  2. package/lib-commonjs/{runWindows/utils/autolink.d.ts → commands/autolinkWindows/autolinkWindows.d.ts} +87 -86
  3. package/lib-commonjs/{runWindows/utils/autolink.js → commands/autolinkWindows/autolinkWindows.js} +655 -625
  4. package/lib-commonjs/commands/autolinkWindows/autolinkWindows.js.map +1 -0
  5. package/lib-commonjs/commands/autolinkWindows/autolinkWindowsOptions.d.ts +14 -0
  6. package/lib-commonjs/commands/autolinkWindows/autolinkWindowsOptions.js +33 -0
  7. package/lib-commonjs/commands/autolinkWindows/autolinkWindowsOptions.js.map +1 -0
  8. package/lib-commonjs/commands/codegenWindows/codegenWindows.d.ts +27 -0
  9. package/lib-commonjs/commands/codegenWindows/codegenWindows.js +206 -0
  10. package/lib-commonjs/commands/codegenWindows/codegenWindows.js.map +1 -0
  11. package/lib-commonjs/commands/codegenWindows/codegenWindowsOptions.d.ts +12 -0
  12. package/lib-commonjs/commands/codegenWindows/codegenWindowsOptions.js +23 -0
  13. package/lib-commonjs/commands/codegenWindows/codegenWindowsOptions.js.map +1 -0
  14. package/lib-commonjs/{config → commands/config}/configUtils.d.ts +123 -116
  15. package/lib-commonjs/{config → commands/config}/configUtils.js +380 -341
  16. package/lib-commonjs/commands/config/configUtils.js.map +1 -0
  17. package/lib-commonjs/{config → commands/config}/dependencyConfig.d.ts +37 -37
  18. package/lib-commonjs/{config → commands/config}/dependencyConfig.js +227 -221
  19. package/lib-commonjs/commands/config/dependencyConfig.js.map +1 -0
  20. package/lib-commonjs/{config → commands/config}/projectConfig.d.ts +27 -27
  21. package/lib-commonjs/{config → commands/config}/projectConfig.js +180 -176
  22. package/lib-commonjs/commands/config/projectConfig.js.map +1 -0
  23. package/lib-commonjs/commands/healthCheck/healthCheckList.d.ts +6 -0
  24. package/lib-commonjs/commands/healthCheck/healthCheckList.js +21 -0
  25. package/lib-commonjs/commands/healthCheck/healthCheckList.js.map +1 -0
  26. package/lib-commonjs/{healthChecks.d.ts → commands/healthCheck/healthChecks.d.ts} +7 -2
  27. package/lib-commonjs/commands/healthCheck/healthChecks.js +124 -0
  28. package/lib-commonjs/commands/healthCheck/healthChecks.js.map +1 -0
  29. package/lib-commonjs/commands/initWindows/initWindows.d.ts +46 -0
  30. package/lib-commonjs/commands/initWindows/initWindows.js +244 -0
  31. package/lib-commonjs/commands/initWindows/initWindows.js.map +1 -0
  32. package/lib-commonjs/commands/initWindows/initWindowsOptions.d.ts +15 -0
  33. package/lib-commonjs/commands/initWindows/initWindowsOptions.js +38 -0
  34. package/lib-commonjs/commands/initWindows/initWindowsOptions.js.map +1 -0
  35. package/lib-commonjs/{runWindows → commands/runWindows}/runWindows.d.ts +10 -11
  36. package/lib-commonjs/{runWindows → commands/runWindows}/runWindows.js +321 -318
  37. package/lib-commonjs/commands/runWindows/runWindows.js.map +1 -0
  38. package/lib-commonjs/{runWindows → commands/runWindows}/runWindowsOptions.d.ts +56 -56
  39. package/lib-commonjs/{runWindows → commands/runWindows}/runWindowsOptions.js +132 -135
  40. package/lib-commonjs/commands/runWindows/runWindowsOptions.js.map +1 -0
  41. package/lib-commonjs/e2etest/autolink.test.d.ts +6 -6
  42. package/lib-commonjs/e2etest/autolink.test.js +366 -418
  43. package/lib-commonjs/e2etest/autolink.test.js.map +1 -1
  44. package/lib-commonjs/e2etest/dependencyConfig.test.d.ts +6 -6
  45. package/lib-commonjs/e2etest/dependencyConfig.test.js +129 -161
  46. package/lib-commonjs/e2etest/dependencyConfig.test.js.map +1 -1
  47. package/lib-commonjs/e2etest/healthChecks.test.d.ts +6 -0
  48. package/lib-commonjs/e2etest/healthChecks.test.js +31 -0
  49. package/lib-commonjs/e2etest/healthChecks.test.js.map +1 -0
  50. package/lib-commonjs/e2etest/initWindows.test.d.ts +6 -0
  51. package/lib-commonjs/e2etest/initWindows.test.js +43 -0
  52. package/lib-commonjs/e2etest/initWindows.test.js.map +1 -0
  53. package/lib-commonjs/e2etest/projectConfig.test.d.ts +6 -6
  54. package/lib-commonjs/e2etest/projectConfig.test.js +110 -124
  55. package/lib-commonjs/e2etest/projectConfig.test.js.map +1 -1
  56. package/lib-commonjs/e2etest/projectConfig.utils.d.ts +8 -4
  57. package/lib-commonjs/e2etest/projectConfig.utils.js +76 -62
  58. package/lib-commonjs/e2etest/projectConfig.utils.js.map +1 -1
  59. package/lib-commonjs/e2etest/runWindows.test.d.ts +6 -6
  60. package/lib-commonjs/e2etest/runWindows.test.js +60 -39
  61. package/lib-commonjs/e2etest/runWindows.test.js.map +1 -1
  62. package/lib-commonjs/e2etest/typesUpToDate.test.d.ts +6 -0
  63. package/lib-commonjs/e2etest/typesUpToDate.test.js +21 -0
  64. package/lib-commonjs/e2etest/typesUpToDate.test.js.map +1 -0
  65. package/lib-commonjs/generator-common/index.d.ts +39 -39
  66. package/lib-commonjs/generator-common/index.js +242 -242
  67. package/lib-commonjs/generator-common/index.js.map +1 -1
  68. package/lib-commonjs/generator-windows/index.d.ts +10 -10
  69. package/lib-commonjs/generator-windows/index.js +316 -369
  70. package/lib-commonjs/generator-windows/index.js.map +1 -1
  71. package/lib-commonjs/index.d.ts +50 -50
  72. package/lib-commonjs/index.js +77 -106
  73. package/lib-commonjs/index.js.map +1 -1
  74. package/lib-commonjs/{runWindows/utils → utils}/build.d.ts +12 -12
  75. package/lib-commonjs/{runWindows/utils → utils}/build.js +84 -84
  76. package/lib-commonjs/utils/build.js.map +1 -0
  77. package/lib-commonjs/{runWindows/utils → utils}/checkRequirements.d.ts +6 -6
  78. package/lib-commonjs/{runWindows/utils → utils}/checkRequirements.js +69 -69
  79. package/lib-commonjs/utils/checkRequirements.js.map +1 -0
  80. package/lib-commonjs/{runWindows/utils → utils}/commandWithProgress.d.ts +21 -15
  81. package/lib-commonjs/{runWindows/utils → utils}/commandWithProgress.js +149 -127
  82. package/lib-commonjs/utils/commandWithProgress.js.map +1 -0
  83. package/lib-commonjs/{runWindows/utils → utils}/deploy.d.ts +12 -12
  84. package/lib-commonjs/{runWindows/utils → utils}/deploy.js +353 -328
  85. package/lib-commonjs/utils/deploy.js.map +1 -0
  86. package/lib-commonjs/{runWindows/utils → utils}/info.d.ts +6 -6
  87. package/lib-commonjs/{runWindows/utils → utils}/info.js +28 -28
  88. package/lib-commonjs/utils/info.js.map +1 -0
  89. package/lib-commonjs/{runWindows/utils → utils}/msbuildtools.d.ts +28 -26
  90. package/lib-commonjs/{runWindows/utils → utils}/msbuildtools.js +273 -219
  91. package/lib-commonjs/utils/msbuildtools.js.map +1 -0
  92. package/lib-commonjs/utils/pathHelpers.d.ts +9 -0
  93. package/lib-commonjs/utils/pathHelpers.js +37 -0
  94. package/lib-commonjs/utils/pathHelpers.js.map +1 -0
  95. package/lib-commonjs/utils/telemetryHelpers.d.ts +29 -0
  96. package/lib-commonjs/utils/telemetryHelpers.js +121 -0
  97. package/lib-commonjs/utils/telemetryHelpers.js.map +1 -0
  98. package/lib-commonjs/{runWindows/utils → utils}/version.d.ts +19 -19
  99. package/lib-commonjs/{runWindows/utils → utils}/version.js +109 -109
  100. package/lib-commonjs/utils/version.js.map +1 -0
  101. package/lib-commonjs/{runWindows/utils → utils}/vsInstalls.d.ts +34 -34
  102. package/lib-commonjs/{runWindows/utils → utils}/vsInstalls.js +99 -73
  103. package/lib-commonjs/utils/vsInstalls.js.map +1 -0
  104. package/lib-commonjs/{runWindows/utils → utils}/vstools.d.ts +16 -16
  105. package/lib-commonjs/{runWindows/utils → utils}/vstools.js +189 -162
  106. package/lib-commonjs/utils/vstools.js.map +1 -0
  107. package/lib-commonjs/{runWindows/utils → utils}/winappdeploytool.d.ts +24 -24
  108. package/lib-commonjs/{runWindows/utils → utils}/winappdeploytool.js +108 -108
  109. package/lib-commonjs/utils/winappdeploytool.js.map +1 -0
  110. package/package.json +27 -20
  111. package/src/powershell/Eval-MsBuildProperties.ps1 +156 -0
  112. package/lib-commonjs/config/configUtils.js.map +0 -1
  113. package/lib-commonjs/config/dependencyConfig.js.map +0 -1
  114. package/lib-commonjs/config/projectConfig.js.map +0 -1
  115. package/lib-commonjs/healthChecks.js +0 -88
  116. package/lib-commonjs/healthChecks.js.map +0 -1
  117. package/lib-commonjs/runWindows/runWindows.js.map +0 -1
  118. package/lib-commonjs/runWindows/runWindowsOptions.js.map +0 -1
  119. package/lib-commonjs/runWindows/utils/autolink.js.map +0 -1
  120. package/lib-commonjs/runWindows/utils/build.js.map +0 -1
  121. package/lib-commonjs/runWindows/utils/checkRequirements.js.map +0 -1
  122. package/lib-commonjs/runWindows/utils/commandWithProgress.js.map +0 -1
  123. package/lib-commonjs/runWindows/utils/deploy.js.map +0 -1
  124. package/lib-commonjs/runWindows/utils/info.js.map +0 -1
  125. package/lib-commonjs/runWindows/utils/msbuildtools.js.map +0 -1
  126. package/lib-commonjs/runWindows/utils/version.js.map +0 -1
  127. package/lib-commonjs/runWindows/utils/vsInstalls.js.map +0 -1
  128. package/lib-commonjs/runWindows/utils/vstools.js.map +0 -1
  129. package/lib-commonjs/runWindows/utils/winappdeploytool.js.map +0 -1
  130. /package/{powershell → src/powershell}/Add-AppDevPackage.ps1 +0 -0
  131. /package/{powershell → src/powershell}/WindowsStoreAppUtils.ps1 +0 -0
@@ -1,74 +1,100 @@
1
- "use strict";
2
- /**
3
- * Copyright (c) Microsoft Corporation.
4
- * Licensed under the MIT License.
5
- * @format
6
- */
7
- var __importDefault = (this && this.__importDefault) || function (mod) {
8
- return (mod && mod.__esModule) ? mod : { "default": mod };
9
- };
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.findLatestVsInstall = exports.enumerateVsInstalls = void 0;
12
- const telemetry_1 = require("@react-native-windows/telemetry");
13
- const child_process_1 = require("child_process");
14
- const fs_1 = __importDefault(require("fs"));
15
- const path_1 = __importDefault(require("path"));
16
- /**
17
- * Helper to run vswhere in JSON mode
18
- *
19
- * @param args Arguments to pass to vsWhere
20
- * @param verbose enable verbose logging
21
- */
22
- function vsWhere(args, verbose) {
23
- // This path is maintained and VS has promised to keep it valid.
24
- const vsWherePath = path_1.default.join(process.env['ProgramFiles(x86)'] || process.env.ProgramFiles, '/Microsoft Visual Studio/Installer/vswhere.exe');
25
- if (verbose) {
26
- console.log('Looking for vswhere at: ' + vsWherePath);
27
- }
28
- if (!fs_1.default.existsSync(vsWherePath)) {
29
- throw new telemetry_1.CodedError('NoVSWhere', `Unable to find vswhere at ${vsWherePath}`);
30
- }
31
- const cmdline = `"${vsWherePath}" ${args.join(' ')} -format json -utf8`;
32
- const json = JSON.parse((0, child_process_1.execSync)(cmdline).toString('utf8'));
33
- for (const entry of json) {
34
- entry.prerelease = entry.catalog.productMilestoneIsPreRelease;
35
- }
36
- return json;
37
- }
38
- /**
39
- * Enumerate the installed versions of Visual Studio
40
- */
41
- function enumerateVsInstalls(opts) {
42
- const args = [];
43
- if (opts.version) {
44
- args.push(`-version [${opts.version},${Number(opts.version) + 1})`);
45
- }
46
- if (opts.requires) {
47
- args.push(`-requires ${opts.requires.join(' ')}`);
48
- }
49
- if (opts.latest) {
50
- args.push('-latest');
51
- }
52
- if (opts.prerelease) {
53
- args.push('-prerelease');
54
- }
55
- return vsWhere(args, opts.verbose);
56
- }
57
- exports.enumerateVsInstalls = enumerateVsInstalls;
58
- /**
59
- * Find the latest available VS installation that matches the given constraints
60
- */
61
- function findLatestVsInstall(opts) {
62
- let installs = enumerateVsInstalls({ ...opts, latest: true });
63
- if (opts.prerelease && installs.length > 0) {
64
- installs = installs.filter(x => x.prerelease === 'True');
65
- }
66
- if (installs.length > 0) {
67
- return installs[0];
68
- }
69
- else {
70
- return null;
71
- }
72
- }
73
- exports.findLatestVsInstall = findLatestVsInstall;
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Microsoft Corporation.
4
+ * Licensed under the MIT License.
5
+ * @format
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.findLatestVsInstall = exports.enumerateVsInstalls = void 0;
12
+ const telemetry_1 = require("@react-native-windows/telemetry");
13
+ const child_process_1 = require("child_process");
14
+ const fs_1 = __importDefault(require("@react-native-windows/fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const semver_1 = __importDefault(require("semver"));
17
+ /**
18
+ * Helper to run vswhere in JSON mode
19
+ *
20
+ * @param args Arguments to pass to vsWhere
21
+ * @param verbose enable verbose logging
22
+ */
23
+ function vsWhere(args, verbose) {
24
+ // This path is maintained and VS has promised to keep it valid.
25
+ const vsWherePath = path_1.default.join(process.env['ProgramFiles(x86)'] || process.env.ProgramFiles, '/Microsoft Visual Studio/Installer/vswhere.exe');
26
+ if (verbose) {
27
+ console.log('Looking for vswhere at: ' + vsWherePath);
28
+ }
29
+ if (!fs_1.default.existsSync(vsWherePath)) {
30
+ throw new telemetry_1.CodedError('NoVSWhere', `Unable to find vswhere at ${vsWherePath}`);
31
+ }
32
+ const system32 = `${process.env.SystemRoot}\\System32`;
33
+ const cmdline = `${system32}\\cmd.exe /c ${system32}\\chcp.com 65001>nul && "${vsWherePath}" ${args.join(' ')} -format json -utf8`;
34
+ const json = JSON.parse((0, child_process_1.execSync)(cmdline).toString());
35
+ for (const entry of json) {
36
+ entry.prerelease = entry.catalog.productMilestoneIsPreRelease;
37
+ }
38
+ return json;
39
+ }
40
+ /**
41
+ * Enumerate the installed versions of Visual Studio
42
+ */
43
+ function enumerateVsInstalls(opts) {
44
+ const args = [];
45
+ if (opts.minVersion) {
46
+ // VS 2019 ex: minVersion == 16.7 => [16.7,17.0)
47
+ // VS 2022 ex: minVersion == 17.0 => [17.0,18.0)
48
+ // Try to parse minVersion as both a Number and SemVer
49
+ const minVersionNum = Number(opts.minVersion);
50
+ const minVersionSemVer = semver_1.default.parse(opts.minVersion);
51
+ let minVersion;
52
+ let maxVersion;
53
+ if (minVersionSemVer) {
54
+ minVersion = minVersionSemVer.toString();
55
+ maxVersion = (minVersionSemVer.major + 1).toFixed(1);
56
+ }
57
+ else if (!Number.isNaN(minVersionNum)) {
58
+ minVersion = minVersionNum.toFixed(1);
59
+ maxVersion = (Math.floor(minVersionNum) + 1).toFixed(1);
60
+ }
61
+ else {
62
+ // Unable to parse minVersion and determine maxVersion,
63
+ // caller will throw error that version couldn't be found.
64
+ return [];
65
+ }
66
+ const versionRange = `[${minVersion},${maxVersion}` + (opts.prerelease ? ']' : ')');
67
+ if (opts.verbose) {
68
+ console.log(`Looking for VS installs with version range: ${versionRange}`);
69
+ }
70
+ args.push(`-version ${versionRange}`);
71
+ }
72
+ if (opts.requires) {
73
+ args.push(`-requires ${opts.requires.join(' ')}`);
74
+ }
75
+ if (opts.latest) {
76
+ args.push('-latest');
77
+ }
78
+ if (opts.prerelease) {
79
+ args.push('-prerelease');
80
+ }
81
+ return vsWhere(args, opts.verbose);
82
+ }
83
+ exports.enumerateVsInstalls = enumerateVsInstalls;
84
+ /**
85
+ * Find the latest available VS installation that matches the given constraints
86
+ */
87
+ function findLatestVsInstall(opts) {
88
+ let installs = enumerateVsInstalls({ ...opts, latest: true });
89
+ if (opts.prerelease && installs.length > 0) {
90
+ installs = installs.filter(x => x.prerelease === 'True');
91
+ }
92
+ if (installs.length > 0) {
93
+ return installs[0];
94
+ }
95
+ else {
96
+ return null;
97
+ }
98
+ }
99
+ exports.findLatestVsInstall = findLatestVsInstall;
74
100
  //# sourceMappingURL=vsInstalls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vsInstalls.js","sourceRoot":"","sources":["../../src/utils/vsInstalls.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport {CodedError} from '@react-native-windows/telemetry';\nimport {execSync} from 'child_process';\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport semver from 'semver';\n\n/**\n * A subset of the per-instance properties returned by vswhere\n */\ninterface VisualStudioInstallation {\n instanceId: string;\n installationPath: string;\n installationVersion: string;\n prerelease: string;\n}\n\n/**\n * Helper to run vswhere in JSON mode\n *\n * @param args Arguments to pass to vsWhere\n * @param verbose enable verbose logging\n */\nfunction vsWhere(args: string[], verbose?: boolean): any[] {\n // This path is maintained and VS has promised to keep it valid.\n const vsWherePath = path.join(\n process.env['ProgramFiles(x86)'] || process.env.ProgramFiles!,\n '/Microsoft Visual Studio/Installer/vswhere.exe',\n );\n\n if (verbose) {\n console.log('Looking for vswhere at: ' + vsWherePath);\n }\n\n if (!fs.existsSync(vsWherePath)) {\n throw new CodedError(\n 'NoVSWhere',\n `Unable to find vswhere at ${vsWherePath}`,\n );\n }\n\n const system32 = `${process.env.SystemRoot}\\\\System32`;\n const cmdline = `${system32}\\\\cmd.exe /c ${system32}\\\\chcp.com 65001>nul && \"${vsWherePath}\" ${args.join(\n ' ',\n )} -format json -utf8`;\n const json = JSON.parse(execSync(cmdline).toString());\n\n for (const entry of json) {\n entry.prerelease = entry.catalog.productMilestoneIsPreRelease;\n }\n\n return json;\n}\n\n/**\n * Enumerate the installed versions of Visual Studio\n */\nexport function enumerateVsInstalls(opts: {\n requires?: string[];\n minVersion?: string;\n verbose?: boolean;\n latest?: boolean;\n prerelease?: boolean;\n}): VisualStudioInstallation[] {\n const args: string[] = [];\n\n if (opts.minVersion) {\n // VS 2019 ex: minVersion == 16.7 => [16.7,17.0)\n // VS 2022 ex: minVersion == 17.0 => [17.0,18.0)\n\n // Try to parse minVersion as both a Number and SemVer\n const minVersionNum = Number(opts.minVersion);\n const minVersionSemVer = semver.parse(opts.minVersion);\n\n let minVersion: string;\n let maxVersion: string;\n\n if (minVersionSemVer) {\n minVersion = minVersionSemVer.toString();\n maxVersion = (minVersionSemVer.major + 1).toFixed(1);\n } else if (!Number.isNaN(minVersionNum)) {\n minVersion = minVersionNum.toFixed(1);\n maxVersion = (Math.floor(minVersionNum) + 1).toFixed(1);\n } else {\n // Unable to parse minVersion and determine maxVersion,\n // caller will throw error that version couldn't be found.\n return [];\n }\n\n const versionRange =\n `[${minVersion},${maxVersion}` + (opts.prerelease ? ']' : ')');\n\n if (opts.verbose) {\n console.log(\n `Looking for VS installs with version range: ${versionRange}`,\n );\n }\n\n args.push(`-version ${versionRange}`);\n }\n\n if (opts.requires) {\n args.push(`-requires ${opts.requires.join(' ')}`);\n }\n\n if (opts.latest) {\n args.push('-latest');\n }\n\n if (opts.prerelease) {\n args.push('-prerelease');\n }\n\n return vsWhere(args, opts.verbose);\n}\n\n/**\n * Find the latest available VS installation that matches the given constraints\n */\nexport function findLatestVsInstall(opts: {\n requires?: string[];\n minVersion?: string;\n verbose?: boolean;\n prerelease?: boolean;\n}): VisualStudioInstallation | null {\n let installs = enumerateVsInstalls({...opts, latest: true});\n\n if (opts.prerelease && installs.length > 0) {\n installs = installs.filter(x => x.prerelease === 'True');\n }\n\n if (installs.length > 0) {\n return installs[0];\n } else {\n return null;\n }\n}\n"]}
@@ -1,16 +1,16 @@
1
- /**
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- * @format
5
- */
6
- import { Project } from '../../config/projectConfig';
7
- export declare const dotNetCoreProjectTypeGuid = "{9A19103F-16F7-4668-BE54-9A1E7A4F7556}";
8
- /**
9
- * Adds the necessary info from a VS project into a VS solution file so that it will build.
10
- * @param slnFile The Absolute path to the target VS solution file.
11
- * @param project The object representing the project info.
12
- * @param verbose If true, enable verbose logging.
13
- * @param checkMode It true, don't make any changes.
14
- * @return Whether any changes were necessary.
15
- */
16
- export declare function addProjectToSolution(slnFile: string, project: Project, verbose?: boolean, checkMode?: boolean): boolean;
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ * @format
5
+ */
6
+ import { Project } from '../commands/config/projectConfig';
7
+ export declare const dotNetCoreProjectTypeGuid = "{9A19103F-16F7-4668-BE54-9A1E7A4F7556}";
8
+ /**
9
+ * Adds the necessary info from a VS project into a VS solution file so that it will build.
10
+ * @param slnFile The Absolute path to the target VS solution file.
11
+ * @param project The object representing the project info.
12
+ * @param verbose If true, enable verbose logging.
13
+ * @param checkMode It true, don't make any changes.
14
+ * @return Whether any changes were necessary.
15
+ */
16
+ export declare function addProjectToSolution(slnFile: string, project: Project, verbose?: boolean, checkMode?: boolean): boolean;
@@ -1,163 +1,190 @@
1
- "use strict";
2
- /**
3
- * Copyright (c) Microsoft Corporation. All rights reserved.
4
- * Licensed under the MIT License.
5
- * @format
6
- */
7
- var __importDefault = (this && this.__importDefault) || function (mod) {
8
- return (mod && mod.__esModule) ? mod : { "default": mod };
9
- };
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.addProjectToSolution = exports.dotNetCoreProjectTypeGuid = void 0;
12
- const fs_1 = __importDefault(require("fs"));
13
- const path_1 = __importDefault(require("path"));
14
- const chalk_1 = __importDefault(require("chalk"));
15
- const telemetry_1 = require("@react-native-windows/telemetry");
16
- const projectTypeGuidsByLanguage = {
17
- cpp: '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}',
18
- cs: '{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}',
19
- };
20
- exports.dotNetCoreProjectTypeGuid = '{9A19103F-16F7-4668-BE54-9A1E7A4F7556}';
21
- /**
22
- * Checks is the given block of lines exists within an array of lines.
23
- * @param lines The array of lines to search.
24
- * @param block The block of lines to search for.
25
- * @return True if the block of lines does exist within lines.
26
- */
27
- function linesContainsBlock(lines, block) {
28
- if (block.length > 0) {
29
- const startIndex = lines.indexOf(block[0]);
30
- if (startIndex >= 0) {
31
- for (let i = 1; i < block.length; i++) {
32
- if (lines[startIndex + i] !== block[i]) {
33
- return false;
34
- }
35
- }
36
- return true;
37
- }
38
- }
39
- return false;
40
- }
41
- /**
42
- * Insert the given block of lines into an array of lines.
43
- * @param lines The array of lines to insert into.
44
- * @param block The block of lines to insert.
45
- * @param index The index to perform the insert.
46
- */
47
- function insertBlockIntoLines(lines, block, index) {
48
- for (let i = 0; i < block.length; i++) {
49
- lines.splice(index + i, 0, block[i]);
50
- }
51
- }
52
- /**
53
- * Search through an array of lines for a block of lines starting with startLine and ending with endLine.
54
- * @param lines The array of lines to search.
55
- * @param startLine The first line of the block.
56
- * @param endLine The last line of the block.
57
- * @param includeStartEnd Include the start and end lines in the result.
58
- * @return The found block of lines, if found.
59
- */
60
- function getBlockContentsFromLines(lines, startLine, endLine, includeStartEnd = true) {
61
- const startIndex = lines.indexOf(startLine);
62
- const endIndex = lines.indexOf(endLine, startIndex);
63
- if (startIndex >= 0 && startIndex < endIndex) {
64
- if (includeStartEnd) {
65
- return lines.slice(startIndex, endIndex + 1);
66
- }
67
- else if (startIndex + 1 < endIndex) {
68
- return lines.slice(startIndex + 1, endIndex);
69
- }
70
- }
71
- return [];
72
- }
73
- /**
74
- * Adds the necessary info from a VS project into a VS solution file so that it will build.
75
- * @param slnFile The Absolute path to the target VS solution file.
76
- * @param project The object representing the project info.
77
- * @param verbose If true, enable verbose logging.
78
- * @param checkMode It true, don't make any changes.
79
- * @return Whether any changes were necessary.
80
- */
81
- function addProjectToSolution(slnFile, project, verbose = false, checkMode = false) {
82
- if (project.projectLang === null) {
83
- throw new telemetry_1.CodedError('AddProjectToSolution', 'Unable to add project to solution, projectLang is null');
84
- }
85
- if (project.projectGuid === null) {
86
- throw new telemetry_1.CodedError('AddProjectToSolution', 'Unable to add project to solution, projectGuid is null');
87
- }
88
- if (verbose) {
89
- console.log(`Processing ${chalk_1.default.bold(path_1.default.basename(project.projectFile))}...`);
90
- }
91
- const originalSlnContents = fs_1.default.readFileSync(slnFile).toString();
92
- const isCRLF = originalSlnContents.includes('\r\n');
93
- const slnLines = originalSlnContents.split(isCRLF ? '\r\n' : '\n');
94
- let contentsChanged = false;
95
- // Check for the project entry block
96
- const slnDir = path_1.default.dirname(slnFile);
97
- const relProjectFile = path_1.default.relative(slnDir, project.projectFile);
98
- const projectTypeGuid = 'projectTypeGuid' in project
99
- ? project.projectTypeGuid
100
- : projectTypeGuidsByLanguage[project.projectLang];
101
- const projectGuid = project.projectGuid.toUpperCase();
102
- const projectEntryBlock = [
103
- `Project("${projectTypeGuid}") = "${project.projectName}", "${relProjectFile}", "${projectGuid}"`,
104
- 'EndProject',
105
- ];
106
- if (!linesContainsBlock(slnLines, projectEntryBlock)) {
107
- if (verbose) {
108
- console.log(chalk_1.default.yellow('Missing project entry block.'));
109
- }
110
- const globalIndex = slnLines.indexOf('Global');
111
- insertBlockIntoLines(slnLines, projectEntryBlock, globalIndex);
112
- contentsChanged = true;
113
- }
114
- // Check for the project configuration platforms
115
- const slnConfigs = getBlockContentsFromLines(slnLines, '\tGlobalSection(SolutionConfigurationPlatforms) = preSolution', '\tEndGlobalSection', false).map(line => line.match(/\s+([\w\s|]+)\s=/)[1]);
116
- const projectConfigLines = [];
117
- slnConfigs.forEach(slnConfig => {
118
- if (!slnConfig.endsWith('|Any CPU')) {
119
- projectConfigLines.push(`\t\t${projectGuid}.${slnConfig}.ActiveCfg = ${project.projectLang === 'cpp'
120
- ? slnConfig.replace('x86', 'Win32')
121
- : slnConfig}`);
122
- projectConfigLines.push(`\t\t${projectGuid}.${slnConfig}.Build.0 = ${project.projectLang === 'cpp'
123
- ? slnConfig.replace('x86', 'Win32')
124
- : slnConfig}`);
125
- }
126
- });
127
- const projectConfigStartIndex = slnLines.indexOf('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution');
128
- projectConfigLines.forEach(projectConfigLine => {
129
- if (!slnLines.includes(projectConfigLine)) {
130
- if (verbose) {
131
- const configLine = projectConfigLine.substr(projectConfigLine.indexOf('= ') + 2);
132
- console.log(chalk_1.default.yellow(`Missing ${configLine} config block.`));
133
- }
134
- const projectConfigEndIndex = slnLines.indexOf('\tEndGlobalSection', projectConfigStartIndex);
135
- slnLines.splice(projectConfigEndIndex, 0, projectConfigLine);
136
- contentsChanged = true;
137
- }
138
- });
139
- // Write out new solution file if there were changes
140
- if (contentsChanged) {
141
- if (verbose) {
142
- console.log(chalk_1.default.yellow(`${chalk_1.default.bold(path_1.default.basename(slnFile))} needs to be updated.`));
143
- }
144
- if (!checkMode) {
145
- if (verbose) {
146
- console.log(`Writing changes to ${chalk_1.default.bold(path_1.default.basename(slnFile))}...`);
147
- }
148
- const slnContents = slnLines.join(isCRLF ? '\r\n' : '\n');
149
- fs_1.default.writeFileSync(slnFile, slnContents, {
150
- encoding: 'utf8',
151
- flag: 'w',
152
- });
153
- }
154
- }
155
- else {
156
- if (verbose) {
157
- console.log(`No changes to ${chalk_1.default.bold(path_1.default.basename(slnFile))}.`);
158
- }
159
- }
160
- return contentsChanged;
161
- }
162
- exports.addProjectToSolution = addProjectToSolution;
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Microsoft Corporation. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ * @format
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.addProjectToSolution = exports.dotNetCoreProjectTypeGuid = void 0;
12
+ const fs_1 = __importDefault(require("@react-native-windows/fs"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const chalk_1 = __importDefault(require("chalk"));
15
+ const telemetry_1 = require("@react-native-windows/telemetry");
16
+ const projectTypeGuidsByLanguage = {
17
+ cpp: '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}',
18
+ cs: '{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}',
19
+ };
20
+ exports.dotNetCoreProjectTypeGuid = '{9A19103F-16F7-4668-BE54-9A1E7A4F7556}';
21
+ /**
22
+ * Checks is the given block of lines exists within an array of lines.
23
+ * @param lines The array of lines to search.
24
+ * @param block The block of lines to search for.
25
+ * @return The starting index the block within lines, if it exists.
26
+ */
27
+ function linesContainsBlock(lines, block) {
28
+ if (block.length > 0) {
29
+ const startIndex = lines.findIndex(s => block[0] instanceof RegExp ? s.match(block[0]) : s === block[0]);
30
+ if (startIndex >= 0) {
31
+ for (let i = 1; i < block.length; i++) {
32
+ if (block[i] instanceof RegExp
33
+ ? !lines[startIndex + i].match(block[i])
34
+ : lines[startIndex + i] !== block[i]) {
35
+ return -1;
36
+ }
37
+ }
38
+ return startIndex;
39
+ }
40
+ }
41
+ return -1;
42
+ }
43
+ /**
44
+ * Insert the given block of lines into an array of lines.
45
+ * @param lines The array of lines to insert into.
46
+ * @param block The block of lines to insert.
47
+ * @param index The index to perform the insert.
48
+ */
49
+ function insertBlockIntoLines(lines, block, index) {
50
+ for (let i = 0; i < block.length; i++) {
51
+ lines.splice(index + i, 0, block[i]);
52
+ }
53
+ }
54
+ /**
55
+ * Overwrite the lines at the given index with the block.
56
+ * @param lines The destination array of lines to.
57
+ * @param block The source block of lines.
58
+ * @param index The index to perform the overwrite.
59
+ */
60
+ function overwriteLinesWithBlock(lines, block, index) {
61
+ for (let i = 0; i < block.length; i++) {
62
+ lines[index + i] = block[i];
63
+ }
64
+ }
65
+ /**
66
+ * Search through an array of lines for a block of lines starting with startLine and ending with endLine.
67
+ * @param lines The array of lines to search.
68
+ * @param startLine The first line of the block.
69
+ * @param endLine The last line of the block.
70
+ * @param includeStartEnd Include the start and end lines in the result.
71
+ * @return The found block of lines, if found.
72
+ */
73
+ function getBlockContentsFromLines(lines, startLine, endLine, includeStartEnd = true) {
74
+ const startIndex = lines.indexOf(startLine);
75
+ const endIndex = lines.indexOf(endLine, startIndex);
76
+ if (startIndex >= 0 && startIndex < endIndex) {
77
+ if (includeStartEnd) {
78
+ return lines.slice(startIndex, endIndex + 1);
79
+ }
80
+ else if (startIndex + 1 < endIndex) {
81
+ return lines.slice(startIndex + 1, endIndex);
82
+ }
83
+ }
84
+ return [];
85
+ }
86
+ /**
87
+ * Adds the necessary info from a VS project into a VS solution file so that it will build.
88
+ * @param slnFile The Absolute path to the target VS solution file.
89
+ * @param project The object representing the project info.
90
+ * @param verbose If true, enable verbose logging.
91
+ * @param checkMode It true, don't make any changes.
92
+ * @return Whether any changes were necessary.
93
+ */
94
+ function addProjectToSolution(slnFile, project, verbose = false, checkMode = false) {
95
+ if (project.projectLang === null) {
96
+ throw new telemetry_1.CodedError('AddProjectToSolution', 'Unable to add project to solution, projectLang is null');
97
+ }
98
+ if (project.projectGuid === null) {
99
+ throw new telemetry_1.CodedError('AddProjectToSolution', 'Unable to add project to solution, projectGuid is null');
100
+ }
101
+ if (verbose) {
102
+ console.log(`Processing ${chalk_1.default.bold(path_1.default.basename(project.projectFile))}...`);
103
+ }
104
+ const originalSlnContents = fs_1.default.readFileSync(slnFile).toString();
105
+ const isCRLF = originalSlnContents.includes('\r\n');
106
+ const slnLines = originalSlnContents.split(isCRLF ? '\r\n' : '\n');
107
+ let contentsChanged = false;
108
+ // Check for the project entry block
109
+ const slnDir = path_1.default.dirname(slnFile);
110
+ const relProjectFile = path_1.default.relative(slnDir, project.projectFile);
111
+ const projectTypeGuid = 'projectTypeGuid' in project
112
+ ? project.projectTypeGuid
113
+ : projectTypeGuidsByLanguage[project.projectLang];
114
+ const projectGuid = project.projectGuid.toUpperCase();
115
+ const projectEntryBlock = [
116
+ `Project("${projectTypeGuid}") = "${project.projectName}", "${relProjectFile}", "${projectGuid}"`,
117
+ 'EndProject',
118
+ ];
119
+ const projectEntryBlockRegex = [
120
+ new RegExp(`Project\\("${projectTypeGuid}"\\) = "${project.projectName}", "(.*)", "${projectGuid}"`),
121
+ 'EndProject',
122
+ ];
123
+ const blockIndex = linesContainsBlock(slnLines, projectEntryBlockRegex);
124
+ if (blockIndex < 0) {
125
+ // Regex didn't match, insert
126
+ if (verbose) {
127
+ console.log(chalk_1.default.yellow('Missing project entry block, inserting.'));
128
+ }
129
+ const globalIndex = slnLines.indexOf('Global');
130
+ insertBlockIntoLines(slnLines, projectEntryBlock, globalIndex);
131
+ contentsChanged = true;
132
+ }
133
+ else if (linesContainsBlock(slnLines, projectEntryBlock) < 0) {
134
+ // Regex matched but project path has changed, so correct it
135
+ if (verbose) {
136
+ console.log(chalk_1.default.yellow('Existing project entry block found, overwriting.'));
137
+ }
138
+ overwriteLinesWithBlock(slnLines, projectEntryBlock, blockIndex);
139
+ contentsChanged = true;
140
+ }
141
+ // Check for the project configuration platforms
142
+ const slnConfigs = getBlockContentsFromLines(slnLines, '\tGlobalSection(SolutionConfigurationPlatforms) = preSolution', '\tEndGlobalSection', false).map(line => line.match(/\s+([\w\s|]+)\s=/)[1]);
143
+ const projectConfigLines = [];
144
+ slnConfigs.forEach(slnConfig => {
145
+ if (!slnConfig.endsWith('|Any CPU')) {
146
+ projectConfigLines.push(`\t\t${projectGuid}.${slnConfig}.ActiveCfg = ${project.projectLang === 'cpp'
147
+ ? slnConfig.replace('x86', 'Win32')
148
+ : slnConfig}`);
149
+ projectConfigLines.push(`\t\t${projectGuid}.${slnConfig}.Build.0 = ${project.projectLang === 'cpp'
150
+ ? slnConfig.replace('x86', 'Win32')
151
+ : slnConfig}`);
152
+ }
153
+ });
154
+ const projectConfigStartIndex = slnLines.indexOf('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution');
155
+ projectConfigLines.forEach(projectConfigLine => {
156
+ if (!slnLines.includes(projectConfigLine)) {
157
+ if (verbose) {
158
+ const configLine = projectConfigLine.substr(projectConfigLine.indexOf('= ') + 2);
159
+ console.log(chalk_1.default.yellow(`Missing ${configLine} config block.`));
160
+ }
161
+ const projectConfigEndIndex = slnLines.indexOf('\tEndGlobalSection', projectConfigStartIndex);
162
+ slnLines.splice(projectConfigEndIndex, 0, projectConfigLine);
163
+ contentsChanged = true;
164
+ }
165
+ });
166
+ // Write out new solution file if there were changes
167
+ if (contentsChanged) {
168
+ if (verbose) {
169
+ console.log(chalk_1.default.yellow(`${chalk_1.default.bold(path_1.default.basename(slnFile))} needs to be updated.`));
170
+ }
171
+ if (!checkMode) {
172
+ if (verbose) {
173
+ console.log(`Writing changes to ${chalk_1.default.bold(path_1.default.basename(slnFile))}...`);
174
+ }
175
+ const slnContents = slnLines.join(isCRLF ? '\r\n' : '\n');
176
+ fs_1.default.writeFileSync(slnFile, slnContents, {
177
+ encoding: 'utf8',
178
+ flag: 'w',
179
+ });
180
+ }
181
+ }
182
+ else {
183
+ if (verbose) {
184
+ console.log(`No changes to ${chalk_1.default.bold(path_1.default.basename(slnFile))}.`);
185
+ }
186
+ }
187
+ return contentsChanged;
188
+ }
189
+ exports.addProjectToSolution = addProjectToSolution;
163
190
  //# sourceMappingURL=vstools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vstools.js","sourceRoot":"","sources":["../../src/utils/vstools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n * @format\n */\n\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport {Project} from '../commands/config/projectConfig';\nimport {CodedError} from '@react-native-windows/telemetry';\n\nconst projectTypeGuidsByLanguage = {\n cpp: '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}',\n cs: '{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}',\n};\n\nexport const dotNetCoreProjectTypeGuid =\n '{9A19103F-16F7-4668-BE54-9A1E7A4F7556}';\n\n/**\n * Checks is the given block of lines exists within an array of lines.\n * @param lines The array of lines to search.\n * @param block The block of lines to search for.\n * @return The starting index the block within lines, if it exists.\n */\nfunction linesContainsBlock(\n lines: string[],\n block: (string | RegExp)[],\n): number {\n if (block.length > 0) {\n const startIndex = lines.findIndex(s =>\n block[0] instanceof RegExp ? s.match(block[0]) : s === block[0],\n );\n\n if (startIndex >= 0) {\n for (let i = 1; i < block.length; i++) {\n if (\n block[i] instanceof RegExp\n ? !lines[startIndex + i].match(block[i])\n : lines[startIndex + i] !== block[i]\n ) {\n return -1;\n }\n }\n return startIndex;\n }\n }\n\n return -1;\n}\n\n/**\n * Insert the given block of lines into an array of lines.\n * @param lines The array of lines to insert into.\n * @param block The block of lines to insert.\n * @param index The index to perform the insert.\n */\nfunction insertBlockIntoLines(lines: string[], block: string[], index: number) {\n for (let i = 0; i < block.length; i++) {\n lines.splice(index + i, 0, block[i]);\n }\n}\n\n/**\n * Overwrite the lines at the given index with the block.\n * @param lines The destination array of lines to.\n * @param block The source block of lines.\n * @param index The index to perform the overwrite.\n */\nfunction overwriteLinesWithBlock(\n lines: string[],\n block: string[],\n index: number,\n) {\n for (let i = 0; i < block.length; i++) {\n lines[index + i] = block[i];\n }\n}\n\n/**\n * Search through an array of lines for a block of lines starting with startLine and ending with endLine.\n * @param lines The array of lines to search.\n * @param startLine The first line of the block.\n * @param endLine The last line of the block.\n * @param includeStartEnd Include the start and end lines in the result.\n * @return The found block of lines, if found.\n */\nfunction getBlockContentsFromLines(\n lines: string[],\n startLine: string,\n endLine: string,\n includeStartEnd: boolean = true,\n): string[] {\n const startIndex = lines.indexOf(startLine);\n const endIndex = lines.indexOf(endLine, startIndex);\n\n if (startIndex >= 0 && startIndex < endIndex) {\n if (includeStartEnd) {\n return lines.slice(startIndex, endIndex + 1);\n } else if (startIndex + 1 < endIndex) {\n return lines.slice(startIndex + 1, endIndex);\n }\n }\n\n return [];\n}\n\n/**\n * Adds the necessary info from a VS project into a VS solution file so that it will build.\n * @param slnFile The Absolute path to the target VS solution file.\n * @param project The object representing the project info.\n * @param verbose If true, enable verbose logging.\n * @param checkMode It true, don't make any changes.\n * @return Whether any changes were necessary.\n */\nexport function addProjectToSolution(\n slnFile: string,\n project: Project,\n verbose: boolean = false,\n checkMode: boolean = false,\n): boolean {\n if (project.projectLang === null) {\n throw new CodedError(\n 'AddProjectToSolution',\n 'Unable to add project to solution, projectLang is null',\n );\n }\n\n if (project.projectGuid === null) {\n throw new CodedError(\n 'AddProjectToSolution',\n 'Unable to add project to solution, projectGuid is null',\n );\n }\n\n if (verbose) {\n console.log(\n `Processing ${chalk.bold(path.basename(project.projectFile))}...`,\n );\n }\n\n const originalSlnContents = fs.readFileSync(slnFile).toString();\n\n const isCRLF = originalSlnContents.includes('\\r\\n');\n\n const slnLines = originalSlnContents.split(isCRLF ? '\\r\\n' : '\\n');\n\n let contentsChanged = false;\n\n // Check for the project entry block\n\n const slnDir = path.dirname(slnFile);\n const relProjectFile = path.relative(slnDir, project.projectFile);\n\n const projectTypeGuid =\n 'projectTypeGuid' in project\n ? project.projectTypeGuid!\n : projectTypeGuidsByLanguage[project.projectLang];\n\n const projectGuid = project.projectGuid.toUpperCase();\n\n const projectEntryBlock = [\n `Project(\"${projectTypeGuid}\") = \"${project.projectName}\", \"${relProjectFile}\", \"${projectGuid}\"`,\n 'EndProject',\n ];\n\n const projectEntryBlockRegex = [\n new RegExp(\n `Project\\\\(\"${projectTypeGuid}\"\\\\) = \"${project.projectName}\", \"(.*)\", \"${projectGuid}\"`,\n ),\n 'EndProject',\n ];\n\n const blockIndex = linesContainsBlock(slnLines, projectEntryBlockRegex);\n\n if (blockIndex < 0) {\n // Regex didn't match, insert\n if (verbose) {\n console.log(chalk.yellow('Missing project entry block, inserting.'));\n }\n\n const globalIndex = slnLines.indexOf('Global');\n insertBlockIntoLines(slnLines, projectEntryBlock, globalIndex);\n contentsChanged = true;\n } else if (linesContainsBlock(slnLines, projectEntryBlock) < 0) {\n // Regex matched but project path has changed, so correct it\n if (verbose) {\n console.log(\n chalk.yellow('Existing project entry block found, overwriting.'),\n );\n }\n\n overwriteLinesWithBlock(slnLines, projectEntryBlock, blockIndex);\n contentsChanged = true;\n }\n\n // Check for the project configuration platforms\n\n const slnConfigs = getBlockContentsFromLines(\n slnLines,\n '\\tGlobalSection(SolutionConfigurationPlatforms) = preSolution',\n '\\tEndGlobalSection',\n false,\n ).map(line => line.match(/\\s+([\\w\\s|]+)\\s=/)![1]);\n\n const projectConfigLines: string[] = [];\n\n slnConfigs.forEach(slnConfig => {\n if (!slnConfig.endsWith('|Any CPU')) {\n projectConfigLines.push(\n `\\t\\t${projectGuid}.${slnConfig}.ActiveCfg = ${\n project.projectLang === 'cpp'\n ? slnConfig.replace('x86', 'Win32')\n : slnConfig\n }`,\n );\n projectConfigLines.push(\n `\\t\\t${projectGuid}.${slnConfig}.Build.0 = ${\n project.projectLang === 'cpp'\n ? slnConfig.replace('x86', 'Win32')\n : slnConfig\n }`,\n );\n }\n });\n\n const projectConfigStartIndex = slnLines.indexOf(\n '\\tGlobalSection(ProjectConfigurationPlatforms) = postSolution',\n );\n\n projectConfigLines.forEach(projectConfigLine => {\n if (!slnLines.includes(projectConfigLine)) {\n if (verbose) {\n const configLine = projectConfigLine.substr(\n projectConfigLine.indexOf('= ') + 2,\n );\n console.log(chalk.yellow(`Missing ${configLine} config block.`));\n }\n\n const projectConfigEndIndex = slnLines.indexOf(\n '\\tEndGlobalSection',\n projectConfigStartIndex,\n );\n\n slnLines.splice(projectConfigEndIndex, 0, projectConfigLine);\n contentsChanged = true;\n }\n });\n\n // Write out new solution file if there were changes\n if (contentsChanged) {\n if (verbose) {\n console.log(\n chalk.yellow(\n `${chalk.bold(path.basename(slnFile))} needs to be updated.`,\n ),\n );\n }\n\n if (!checkMode) {\n if (verbose) {\n console.log(\n `Writing changes to ${chalk.bold(path.basename(slnFile))}...`,\n );\n }\n\n const slnContents = slnLines.join(isCRLF ? '\\r\\n' : '\\n');\n fs.writeFileSync(slnFile, slnContents, {\n encoding: 'utf8',\n flag: 'w',\n });\n }\n } else {\n if (verbose) {\n console.log(`No changes to ${chalk.bold(path.basename(slnFile))}.`);\n }\n }\n\n return contentsChanged;\n}\n"]}