@react-native-windows/cli 0.0.0-canary.11 → 0.0.0-canary.113

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 (80) hide show
  1. package/README.md +49 -0
  2. package/lib-commonjs/config/configUtils.d.ts +25 -2
  3. package/lib-commonjs/config/configUtils.js +119 -30
  4. package/lib-commonjs/config/configUtils.js.map +1 -1
  5. package/lib-commonjs/config/dependencyConfig.js +101 -44
  6. package/lib-commonjs/config/dependencyConfig.js.map +1 -1
  7. package/lib-commonjs/config/projectConfig.d.ts +4 -1
  8. package/lib-commonjs/config/projectConfig.js +68 -12
  9. package/lib-commonjs/config/projectConfig.js.map +1 -1
  10. package/lib-commonjs/e2etest/autolink.test.d.ts +6 -0
  11. package/lib-commonjs/e2etest/autolink.test.js +435 -0
  12. package/lib-commonjs/e2etest/autolink.test.js.map +1 -0
  13. package/lib-commonjs/e2etest/dependencyConfig.test.d.ts +6 -0
  14. package/lib-commonjs/e2etest/dependencyConfig.test.js +162 -0
  15. package/lib-commonjs/e2etest/dependencyConfig.test.js.map +1 -0
  16. package/lib-commonjs/e2etest/projectConfig.test.d.ts +6 -0
  17. package/lib-commonjs/e2etest/projectConfig.test.js +123 -0
  18. package/lib-commonjs/e2etest/projectConfig.test.js.map +1 -0
  19. package/lib-commonjs/e2etest/projectConfig.utils.d.ts +4 -0
  20. package/lib-commonjs/e2etest/projectConfig.utils.js +56 -0
  21. package/lib-commonjs/e2etest/projectConfig.utils.js.map +1 -0
  22. package/lib-commonjs/e2etest/runWindows.test.d.ts +6 -0
  23. package/lib-commonjs/e2etest/runWindows.test.js +61 -0
  24. package/lib-commonjs/e2etest/runWindows.test.js.map +1 -0
  25. package/lib-commonjs/generator-common/index.d.ts +16 -0
  26. package/lib-commonjs/generator-common/index.js +65 -44
  27. package/lib-commonjs/generator-common/index.js.map +1 -1
  28. package/lib-commonjs/generator-windows/index.d.ts +2 -2
  29. package/lib-commonjs/generator-windows/index.js +248 -155
  30. package/lib-commonjs/generator-windows/index.js.map +1 -1
  31. package/lib-commonjs/healthChecks.d.ts +2 -0
  32. package/lib-commonjs/healthChecks.js +88 -0
  33. package/lib-commonjs/healthChecks.js.map +1 -0
  34. package/lib-commonjs/index.d.ts +5 -0
  35. package/lib-commonjs/index.js +24 -8
  36. package/lib-commonjs/index.js.map +1 -1
  37. package/lib-commonjs/runWindows/runWindows.js +211 -53
  38. package/lib-commonjs/runWindows/runWindows.js.map +1 -1
  39. package/lib-commonjs/runWindows/runWindowsOptions.d.ts +14 -10
  40. package/lib-commonjs/runWindows/runWindowsOptions.js +16 -12
  41. package/lib-commonjs/runWindows/runWindowsOptions.js.map +1 -1
  42. package/lib-commonjs/runWindows/utils/autolink.d.ts +88 -1
  43. package/lib-commonjs/runWindows/utils/autolink.js +596 -265
  44. package/lib-commonjs/runWindows/utils/autolink.js.map +1 -1
  45. package/lib-commonjs/runWindows/utils/build.d.ts +1 -2
  46. package/lib-commonjs/runWindows/utils/build.js +25 -32
  47. package/lib-commonjs/runWindows/utils/build.js.map +1 -1
  48. package/lib-commonjs/runWindows/utils/checkRequirements.js +12 -8
  49. package/lib-commonjs/runWindows/utils/checkRequirements.js.map +1 -1
  50. package/lib-commonjs/runWindows/utils/commandWithProgress.d.ts +11 -3
  51. package/lib-commonjs/runWindows/utils/commandWithProgress.js +60 -25
  52. package/lib-commonjs/runWindows/utils/commandWithProgress.js.map +1 -1
  53. package/lib-commonjs/runWindows/utils/deploy.d.ts +1 -1
  54. package/lib-commonjs/runWindows/utils/deploy.js +167 -85
  55. package/lib-commonjs/runWindows/utils/deploy.js.map +1 -1
  56. package/lib-commonjs/runWindows/utils/info.js +5 -2
  57. package/lib-commonjs/runWindows/utils/info.js.map +1 -1
  58. package/lib-commonjs/runWindows/utils/msbuildtools.d.ts +10 -5
  59. package/lib-commonjs/runWindows/utils/msbuildtools.js +98 -61
  60. package/lib-commonjs/runWindows/utils/msbuildtools.js.map +1 -1
  61. package/lib-commonjs/runWindows/utils/telemetryHelpers.d.ts +29 -0
  62. package/lib-commonjs/runWindows/utils/telemetryHelpers.js +109 -0
  63. package/lib-commonjs/runWindows/utils/telemetryHelpers.js.map +1 -0
  64. package/lib-commonjs/runWindows/utils/version.d.ts +4 -4
  65. package/lib-commonjs/runWindows/utils/version.js +1 -1
  66. package/lib-commonjs/runWindows/utils/version.js.map +1 -1
  67. package/lib-commonjs/runWindows/utils/vsInstalls.d.ts +4 -1
  68. package/lib-commonjs/runWindows/utils/vsInstalls.js +22 -7
  69. package/lib-commonjs/runWindows/utils/vsInstalls.js.map +1 -1
  70. package/lib-commonjs/runWindows/utils/vstools.d.ts +1 -0
  71. package/lib-commonjs/runWindows/utils/vstools.js +42 -29
  72. package/lib-commonjs/runWindows/utils/vstools.js.map +1 -1
  73. package/lib-commonjs/runWindows/utils/winappdeploytool.d.ts +3 -3
  74. package/lib-commonjs/runWindows/utils/winappdeploytool.js +19 -16
  75. package/lib-commonjs/runWindows/utils/winappdeploytool.js.map +1 -1
  76. package/package.json +42 -25
  77. package/powershell/Add-AppDevPackage.ps1 +2 -2
  78. package/powershell/WindowsStoreAppUtils.ps1 +10 -0
  79. package/CHANGELOG.json +0 -170
  80. package/CHANGELOG.md +0 -85
@@ -0,0 +1,162 @@
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
+ const fs_1 = __importDefault(require("@react-native-windows/fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const dependencyConfig_1 = require("../config/dependencyConfig");
14
+ const generator_common_1 = require("../generator-common");
15
+ const templateRoot = path_1.default.resolve('../../../vnext/template');
16
+ const testProjectGuid = '{416476D5-974A-4EE2-8145-4E331297247E}';
17
+ async function tryMkdir(dir) {
18
+ try {
19
+ await fs_1.default.mkdir(dir, { recursive: true });
20
+ }
21
+ catch (err) { }
22
+ }
23
+ function project(name, setup) {
24
+ return [name, setup];
25
+ }
26
+ const projects = [
27
+ // Nothing but a react-native.config.js, with nulls
28
+ project('BlankLib'),
29
+ // Nothing but a windows folder
30
+ project('MissingProjectFilesLib', async (folder) => {
31
+ const windowsDir = path_1.default.join(folder, 'windows');
32
+ await tryMkdir(windowsDir);
33
+ }),
34
+ // New C++ app project based on the template
35
+ project('SimpleCppApp', async (folder) => {
36
+ const windowsDir = path_1.default.join(folder, 'windows');
37
+ await tryMkdir(windowsDir);
38
+ const replacements = {
39
+ name: 'SimpleCppApp',
40
+ namespace: 'SimpleCppApp',
41
+ useMustache: true,
42
+ projectGuidUpper: testProjectGuid,
43
+ projectGuidLower: testProjectGuid.toLowerCase(),
44
+ };
45
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cpp-app/proj/MyApp.sln'), path_1.default.join(windowsDir, 'SimpleCppApp.sln'), replacements, null);
46
+ const projDir = path_1.default.join(windowsDir, 'SimpleCppApp');
47
+ await tryMkdir(projDir);
48
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cpp-app/proj/MyApp.vcxproj'), path_1.default.join(projDir, 'SimpleCppApp.vcxproj'), replacements, null);
49
+ }),
50
+ // New C++ project based on the template
51
+ project('SimpleCppLib', async (folder) => {
52
+ const windowsDir = path_1.default.join(folder, 'windows');
53
+ await tryMkdir(windowsDir);
54
+ const replacements = {
55
+ name: 'SimpleCppLib',
56
+ namespace: 'SimpleCppLib',
57
+ useMustache: true,
58
+ projectGuidUpper: testProjectGuid,
59
+ projectGuidLower: testProjectGuid.toLowerCase(),
60
+ };
61
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cpp-lib/proj/MyLib.sln'), path_1.default.join(windowsDir, 'SimpleCppLib.sln'), replacements, null);
62
+ const projDir = path_1.default.join(windowsDir, 'SimpleCppLib');
63
+ await tryMkdir(projDir);
64
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cpp-lib/proj/MyLib.vcxproj'), path_1.default.join(projDir, 'SimpleCppLib.vcxproj'), replacements, null);
65
+ }),
66
+ // New C# app project based on the template
67
+ project('SimpleCSharpApp', async (folder) => {
68
+ const windowsDir = path_1.default.join(folder, 'windows');
69
+ await tryMkdir(windowsDir);
70
+ const replacements = {
71
+ name: 'SimpleCSharpApp',
72
+ namespace: 'SimpleCSharpApp',
73
+ useMustache: true,
74
+ projectGuidUpper: testProjectGuid,
75
+ projectGuidLower: testProjectGuid.toLowerCase(),
76
+ };
77
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cs-app/proj/MyApp.sln'), path_1.default.join(windowsDir, 'SimpleCSharpApp.sln'), replacements, null);
78
+ const projDir = path_1.default.join(windowsDir, 'SimpleCSharpApp');
79
+ await tryMkdir(projDir);
80
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cs-app/proj/MyApp.csproj'), path_1.default.join(projDir, 'SimpleCSharpApp.csproj'), replacements, null);
81
+ }),
82
+ // New C# project based on the template
83
+ project('SimpleCSharpLib', async (folder) => {
84
+ const windowsDir = path_1.default.join(folder, 'windows');
85
+ await tryMkdir(windowsDir);
86
+ const replacements = {
87
+ name: 'SimpleCSharpLib',
88
+ namespace: 'SimpleCSharpLib',
89
+ useMustache: true,
90
+ projectGuidUpper: testProjectGuid,
91
+ projectGuidLower: testProjectGuid.toLowerCase(),
92
+ };
93
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cs-lib/proj/MyLib.sln'), path_1.default.join(windowsDir, 'SimpleCSharpLib.sln'), replacements, null);
94
+ const projDir = path_1.default.join(windowsDir, 'SimpleCSharpLib');
95
+ await tryMkdir(projDir);
96
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(templateRoot, 'cs-lib/proj/MyLib.csproj'), path_1.default.join(projDir, 'SimpleCSharpLib.csproj'), replacements, null);
97
+ }),
98
+ project('WithIndirectDependency'),
99
+ ];
100
+ // Tests that given userConfig is null, the result will always be null
101
+ test.each(projects)('dependencyConfig - %s (userConfig is null)', async (name, setup) => {
102
+ const folder = path_1.default.resolve('src/e2etest/projects/', name);
103
+ if (setup !== undefined) {
104
+ await setup(folder);
105
+ }
106
+ const userConfig = null;
107
+ expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toBeNull();
108
+ });
109
+ // Tests the result given a windows project config in react-native.config.js
110
+ test.each(projects)('dependencyConfig - %s (Use react-native.config.js)', async (name, setup) => {
111
+ const folder = path_1.default.resolve('src/e2etest/projects/', name);
112
+ const rnc = require(path_1.default.join(folder, 'react-native.config.js'));
113
+ if (setup !== undefined) {
114
+ await setup(folder);
115
+ }
116
+ const userConfig = rnc.dependency.platforms.windows;
117
+ if (name === 'BlankLib') {
118
+ expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot();
119
+ }
120
+ else if (name.endsWith('App')) {
121
+ expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
122
+ folder: expect.stringContaining(name),
123
+ projects: expect.arrayContaining([
124
+ expect.objectContaining({
125
+ projectFile: expect.stringMatching(/Error: .*\.(?:cs|vcx)proj is type '\w+'/),
126
+ }),
127
+ ]),
128
+ });
129
+ }
130
+ else {
131
+ expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
132
+ folder: expect.stringContaining(name),
133
+ });
134
+ }
135
+ });
136
+ // Tests the result of ignoring the windows project config in react-native.config.js
137
+ test.each(projects)('dependencyConfig - %s (Ignore react-native.config.js)', async (name, setup) => {
138
+ const folder = path_1.default.resolve('src/e2etest/projects/', name);
139
+ if (setup !== undefined) {
140
+ await setup(folder);
141
+ }
142
+ const userConfig = {};
143
+ if (name === 'BlankLib') {
144
+ expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot();
145
+ }
146
+ else if (name.endsWith('App')) {
147
+ expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
148
+ folder: expect.stringContaining(name),
149
+ projects: expect.arrayContaining([
150
+ expect.objectContaining({
151
+ projectFile: expect.stringMatching(/Error: .*\.(?:cs|vcx)proj is type '\w+'/),
152
+ }),
153
+ ]),
154
+ });
155
+ }
156
+ else {
157
+ expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
158
+ folder: expect.stringContaining(name),
159
+ });
160
+ }
161
+ });
162
+ //# sourceMappingURL=dependencyConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyConfig.test.js","sourceRoot":"","sources":["../../src/e2etest/dependencyConfig.test.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';\n\nimport {\n dependencyConfigWindows,\n WindowsDependencyConfig,\n} from '../config/dependencyConfig';\n\nimport {copyAndReplace} from '../generator-common';\n\nconst templateRoot = path.resolve('../../../vnext/template');\n\nconst testProjectGuid = '{416476D5-974A-4EE2-8145-4E331297247E}';\n\nasync function tryMkdir(dir: string): Promise<void> {\n try {\n await fs.mkdir(dir, {recursive: true});\n } catch (err) {}\n}\n\ntype TargetProject = [string, ((folder: string) => Promise<void>)?];\n\nfunction project(\n name: string,\n setup?: (folder: string) => Promise<void>,\n): TargetProject {\n return [name, setup];\n}\n\nconst projects: TargetProject[] = [\n // Nothing but a react-native.config.js, with nulls\n project('BlankLib'),\n // Nothing but a windows folder\n project('MissingProjectFilesLib', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n }),\n // New C++ app project based on the template\n project('SimpleCppApp', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n\n const replacements = {\n name: 'SimpleCppApp',\n namespace: 'SimpleCppApp',\n useMustache: true,\n projectGuidUpper: testProjectGuid,\n projectGuidLower: testProjectGuid.toLowerCase(),\n };\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-app/proj/MyApp.sln'),\n path.join(windowsDir, 'SimpleCppApp.sln'),\n replacements,\n null,\n );\n\n const projDir = path.join(windowsDir, 'SimpleCppApp');\n await tryMkdir(projDir);\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-app/proj/MyApp.vcxproj'),\n path.join(projDir, 'SimpleCppApp.vcxproj'),\n replacements,\n null,\n );\n }),\n // New C++ project based on the template\n project('SimpleCppLib', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n\n const replacements = {\n name: 'SimpleCppLib',\n namespace: 'SimpleCppLib',\n useMustache: true,\n projectGuidUpper: testProjectGuid,\n projectGuidLower: testProjectGuid.toLowerCase(),\n };\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-lib/proj/MyLib.sln'),\n path.join(windowsDir, 'SimpleCppLib.sln'),\n replacements,\n null,\n );\n\n const projDir = path.join(windowsDir, 'SimpleCppLib');\n await tryMkdir(projDir);\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-lib/proj/MyLib.vcxproj'),\n path.join(projDir, 'SimpleCppLib.vcxproj'),\n replacements,\n null,\n );\n }),\n // New C# app project based on the template\n project('SimpleCSharpApp', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n\n const replacements = {\n name: 'SimpleCSharpApp',\n namespace: 'SimpleCSharpApp',\n useMustache: true,\n projectGuidUpper: testProjectGuid,\n projectGuidLower: testProjectGuid.toLowerCase(),\n };\n\n await copyAndReplace(\n path.join(templateRoot, 'cs-app/proj/MyApp.sln'),\n path.join(windowsDir, 'SimpleCSharpApp.sln'),\n replacements,\n null,\n );\n\n const projDir = path.join(windowsDir, 'SimpleCSharpApp');\n await tryMkdir(projDir);\n\n await copyAndReplace(\n path.join(templateRoot, 'cs-app/proj/MyApp.csproj'),\n path.join(projDir, 'SimpleCSharpApp.csproj'),\n replacements,\n null,\n );\n }),\n // New C# project based on the template\n project('SimpleCSharpLib', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n\n const replacements = {\n name: 'SimpleCSharpLib',\n namespace: 'SimpleCSharpLib',\n useMustache: true,\n projectGuidUpper: testProjectGuid,\n projectGuidLower: testProjectGuid.toLowerCase(),\n };\n\n await copyAndReplace(\n path.join(templateRoot, 'cs-lib/proj/MyLib.sln'),\n path.join(windowsDir, 'SimpleCSharpLib.sln'),\n replacements,\n null,\n );\n\n const projDir = path.join(windowsDir, 'SimpleCSharpLib');\n await tryMkdir(projDir);\n\n await copyAndReplace(\n path.join(templateRoot, 'cs-lib/proj/MyLib.csproj'),\n path.join(projDir, 'SimpleCSharpLib.csproj'),\n replacements,\n null,\n );\n }),\n project('WithIndirectDependency'),\n];\n\n// Tests that given userConfig is null, the result will always be null\ntest.each(projects)(\n 'dependencyConfig - %s (userConfig is null)',\n async (name, setup) => {\n const folder = path.resolve('src/e2etest/projects/', name);\n\n if (setup !== undefined) {\n await setup(folder);\n }\n\n const userConfig = null;\n\n expect(dependencyConfigWindows(folder, userConfig)).toBeNull();\n },\n);\n\n// Tests the result given a windows project config in react-native.config.js\ntest.each(projects)(\n 'dependencyConfig - %s (Use react-native.config.js)',\n async (name, setup) => {\n const folder = path.resolve('src/e2etest/projects/', name);\n const rnc = require(path.join(folder, 'react-native.config.js'));\n\n if (setup !== undefined) {\n await setup(folder);\n }\n\n const userConfig: Partial<WindowsDependencyConfig> =\n rnc.dependency.platforms.windows;\n\n if (name === 'BlankLib') {\n expect(dependencyConfigWindows(folder, userConfig)).toMatchSnapshot();\n } else if (name.endsWith('App')) {\n expect(dependencyConfigWindows(folder, userConfig)).toMatchSnapshot({\n folder: expect.stringContaining(name),\n projects: expect.arrayContaining([\n expect.objectContaining({\n projectFile: expect.stringMatching(\n /Error: .*\\.(?:cs|vcx)proj is type '\\w+'/,\n ),\n }),\n ]),\n });\n } else {\n expect(dependencyConfigWindows(folder, userConfig)).toMatchSnapshot({\n folder: expect.stringContaining(name),\n });\n }\n },\n);\n\n// Tests the result of ignoring the windows project config in react-native.config.js\ntest.each(projects)(\n 'dependencyConfig - %s (Ignore react-native.config.js)',\n async (name, setup) => {\n const folder = path.resolve('src/e2etest/projects/', name);\n\n if (setup !== undefined) {\n await setup(folder);\n }\n\n const userConfig: Partial<WindowsDependencyConfig> = {};\n\n if (name === 'BlankLib') {\n expect(dependencyConfigWindows(folder, userConfig)).toMatchSnapshot();\n } else if (name.endsWith('App')) {\n expect(dependencyConfigWindows(folder, userConfig)).toMatchSnapshot({\n folder: expect.stringContaining(name),\n projects: expect.arrayContaining([\n expect.objectContaining({\n projectFile: expect.stringMatching(\n /Error: .*\\.(?:cs|vcx)proj is type '\\w+'/,\n ),\n }),\n ]),\n });\n } else {\n expect(dependencyConfigWindows(folder, userConfig)).toMatchSnapshot({\n folder: expect.stringContaining(name),\n });\n }\n },\n);\n"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ * @format
5
+ */
6
+ export {};
@@ -0,0 +1,123 @@
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
+ const fs_1 = __importDefault(require("@react-native-windows/fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const projectConfig_1 = require("../config/projectConfig");
14
+ const generator_common_1 = require("../generator-common");
15
+ const autolink_1 = require("../runWindows/utils/autolink");
16
+ const projectConfig_utils_1 = require("./projectConfig.utils");
17
+ function project(name, setup) {
18
+ return [name, setup];
19
+ }
20
+ const projects = [
21
+ // Nothing but a react-native.config.js, with nulls
22
+ project('BlankApp'),
23
+ // Nothing but a windows folder
24
+ project('MissingProjectFilesApp', async (folder) => {
25
+ const windowsDir = path_1.default.join(folder, 'windows');
26
+ await (0, projectConfig_utils_1.tryMkdir)(windowsDir);
27
+ }),
28
+ // New C++ project based on the template
29
+ project('SimpleCppApp', async (folder) => {
30
+ const windowsDir = path_1.default.join(folder, 'windows');
31
+ await (0, projectConfig_utils_1.tryMkdir)(windowsDir);
32
+ const replacements = {
33
+ name: 'SimpleCppApp',
34
+ namespace: 'SimpleCppApp',
35
+ useMustache: true,
36
+ projectGuidUpper: projectConfig_utils_1.testProjectGuid,
37
+ projectGuidLower: projectConfig_utils_1.testProjectGuid.toLowerCase(),
38
+ };
39
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cpp-app/proj/MyApp.sln'), path_1.default.join(windowsDir, 'SimpleCppApp.sln'), replacements, null);
40
+ const projDir = path_1.default.join(windowsDir, 'SimpleCppApp');
41
+ await (0, projectConfig_utils_1.tryMkdir)(projDir);
42
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cpp-app/proj/MyApp.vcxproj'), path_1.default.join(projDir, 'SimpleCppApp.vcxproj'), replacements, null);
43
+ }),
44
+ // New C# project based on the template
45
+ project('SimpleCSharpApp', async (folder) => {
46
+ const windowsDir = path_1.default.join(folder, 'windows');
47
+ await (0, projectConfig_utils_1.tryMkdir)(windowsDir);
48
+ const replacements = {
49
+ name: 'SimpleCSharpApp',
50
+ namespace: 'SimpleCSharpApp',
51
+ useMustache: true,
52
+ projectGuidUpper: projectConfig_utils_1.testProjectGuid,
53
+ projectGuidLower: projectConfig_utils_1.testProjectGuid.toLowerCase(),
54
+ };
55
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cs-app/proj/MyApp.sln'), path_1.default.join(windowsDir, 'SimpleCSharpApp.sln'), replacements, null);
56
+ const projDir = path_1.default.join(windowsDir, 'SimpleCSharpApp');
57
+ await (0, projectConfig_utils_1.tryMkdir)(projDir);
58
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cs-app/proj/MyApp.csproj'), path_1.default.join(projDir, 'SimpleCSharpApp.csproj'), replacements, null);
59
+ }),
60
+ project('WithWinUI3', async (folder) => {
61
+ await (0, projectConfig_utils_1.ensureWinUI3Project)(folder);
62
+ }),
63
+ project('WithIndirectDependency'),
64
+ project('WithExperimentalFeaturesProps'),
65
+ project('WithUseExperimentalNuget'),
66
+ project('WithUseExperimentalNugetSetInProject'),
67
+ ];
68
+ // Tests that given userConfig is null, the result will always be null
69
+ test.each(projects)('projectConfig - %s (userConfig is null)', async (name, setup) => {
70
+ const folder = path_1.default.resolve('src/e2etest/projects/', name);
71
+ if (setup !== undefined) {
72
+ await setup(folder);
73
+ }
74
+ const userConfig = null;
75
+ expect((0, projectConfig_1.projectConfigWindows)(folder, userConfig)).toBeNull();
76
+ });
77
+ // Tests the result given a windows project config in react-native.config.js
78
+ test.each(projects)('projectConfig - %s (Use react-native.config.js)', async (name, setup) => {
79
+ const folder = path_1.default.resolve('src/e2etest/projects/', name);
80
+ const rnc = require(path_1.default.join(folder, 'react-native.config.js'));
81
+ if (setup !== undefined) {
82
+ await setup(folder);
83
+ }
84
+ const userConfig = rnc.project.windows;
85
+ if (name === 'BlankApp') {
86
+ expect((0, projectConfig_1.projectConfigWindows)(folder, userConfig)).toMatchSnapshot();
87
+ }
88
+ else {
89
+ expect((0, projectConfig_1.projectConfigWindows)(folder, userConfig)).toMatchSnapshot({
90
+ folder: expect.stringContaining(name),
91
+ });
92
+ }
93
+ });
94
+ // Tests the result of ignoring the windows project config in react-native.config.js
95
+ test.each(projects)('projectConfig - %s (Ignore react-native.config.js)', async (name, setup) => {
96
+ const folder = path_1.default.resolve('src/e2etest/projects/', name);
97
+ if (setup !== undefined) {
98
+ await setup(folder);
99
+ }
100
+ const userConfig = {};
101
+ if (name === 'BlankApp') {
102
+ expect((0, projectConfig_1.projectConfigWindows)(folder, userConfig)).toMatchSnapshot();
103
+ }
104
+ else {
105
+ expect((0, projectConfig_1.projectConfigWindows)(folder, userConfig)).toMatchSnapshot({
106
+ folder: expect.stringContaining(name),
107
+ });
108
+ }
109
+ });
110
+ test('useWinUI3=true in react-native.config.js, useWinUI3=false in ExperimentalFeatures.props', async () => {
111
+ const folder = path_1.default.resolve('src/e2etest/projects/WithWinUI3');
112
+ const rnc = require(path_1.default.join(folder, 'react-native.config.js'));
113
+ const config = (0, projectConfig_1.projectConfigWindows)(folder, rnc.project.windows);
114
+ const al = new autolink_1.AutolinkWindows({ windows: config }, {}, {
115
+ check: false,
116
+ logging: false,
117
+ });
118
+ const exd = await al.ensureXAMLDialect();
119
+ expect(exd).toBeTruthy();
120
+ const experimentalFeatures = (await fs_1.default.readFile(path_1.default.join(folder, 'windows/ExperimentalFeatures.props'))).toString();
121
+ expect(experimentalFeatures.replace(/\r/g, '')).toMatchSnapshot();
122
+ });
123
+ //# sourceMappingURL=projectConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectConfig.test.js","sourceRoot":"","sources":["../../src/e2etest/projectConfig.test.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';\n\nimport {\n projectConfigWindows,\n WindowsProjectConfig,\n} from '../config/projectConfig';\n\nimport {copyAndReplace} from '../generator-common';\nimport {AutolinkWindows} from '../runWindows/utils/autolink';\nimport {\n ensureWinUI3Project,\n templateRoot,\n testProjectGuid,\n tryMkdir,\n} from './projectConfig.utils';\n\ntype TargetProject = [string, ((folder: string) => Promise<void>)?];\n\nfunction project(\n name: string,\n setup?: (folder: string) => Promise<void>,\n): TargetProject {\n return [name, setup];\n}\n\nconst projects: TargetProject[] = [\n // Nothing but a react-native.config.js, with nulls\n project('BlankApp'),\n // Nothing but a windows folder\n project('MissingProjectFilesApp', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n }),\n // New C++ project based on the template\n project('SimpleCppApp', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n\n const replacements = {\n name: 'SimpleCppApp',\n namespace: 'SimpleCppApp',\n useMustache: true,\n projectGuidUpper: testProjectGuid,\n projectGuidLower: testProjectGuid.toLowerCase(),\n };\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-app/proj/MyApp.sln'),\n path.join(windowsDir, 'SimpleCppApp.sln'),\n replacements,\n null,\n );\n\n const projDir = path.join(windowsDir, 'SimpleCppApp');\n await tryMkdir(projDir);\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-app/proj/MyApp.vcxproj'),\n path.join(projDir, 'SimpleCppApp.vcxproj'),\n replacements,\n null,\n );\n }),\n // New C# project based on the template\n project('SimpleCSharpApp', async (folder: string) => {\n const windowsDir = path.join(folder, 'windows');\n await tryMkdir(windowsDir);\n\n const replacements = {\n name: 'SimpleCSharpApp',\n namespace: 'SimpleCSharpApp',\n useMustache: true,\n projectGuidUpper: testProjectGuid,\n projectGuidLower: testProjectGuid.toLowerCase(),\n };\n\n await copyAndReplace(\n path.join(templateRoot, 'cs-app/proj/MyApp.sln'),\n path.join(windowsDir, 'SimpleCSharpApp.sln'),\n replacements,\n null,\n );\n\n const projDir = path.join(windowsDir, 'SimpleCSharpApp');\n await tryMkdir(projDir);\n\n await copyAndReplace(\n path.join(templateRoot, 'cs-app/proj/MyApp.csproj'),\n path.join(projDir, 'SimpleCSharpApp.csproj'),\n replacements,\n null,\n );\n }),\n project('WithWinUI3', async (folder: string) => {\n await ensureWinUI3Project(folder);\n }),\n project('WithIndirectDependency'),\n project('WithExperimentalFeaturesProps'),\n project('WithUseExperimentalNuget'),\n project('WithUseExperimentalNugetSetInProject'),\n];\n\n// Tests that given userConfig is null, the result will always be null\ntest.each(projects)(\n 'projectConfig - %s (userConfig is null)',\n async (name, setup) => {\n const folder = path.resolve('src/e2etest/projects/', name);\n\n if (setup !== undefined) {\n await setup(folder);\n }\n\n const userConfig = null;\n\n expect(projectConfigWindows(folder, userConfig)).toBeNull();\n },\n);\n\n// Tests the result given a windows project config in react-native.config.js\ntest.each(projects)(\n 'projectConfig - %s (Use react-native.config.js)',\n async (name, setup) => {\n const folder = path.resolve('src/e2etest/projects/', name);\n const rnc = require(path.join(folder, 'react-native.config.js'));\n\n if (setup !== undefined) {\n await setup(folder);\n }\n\n const userConfig: Partial<WindowsProjectConfig> = rnc.project.windows;\n\n if (name === 'BlankApp') {\n expect(projectConfigWindows(folder, userConfig)).toMatchSnapshot();\n } else {\n expect(projectConfigWindows(folder, userConfig)).toMatchSnapshot({\n folder: expect.stringContaining(name),\n });\n }\n },\n);\n\n// Tests the result of ignoring the windows project config in react-native.config.js\ntest.each(projects)(\n 'projectConfig - %s (Ignore react-native.config.js)',\n async (name, setup) => {\n const folder = path.resolve('src/e2etest/projects/', name);\n\n if (setup !== undefined) {\n await setup(folder);\n }\n\n const userConfig: Partial<WindowsProjectConfig> = {};\n\n if (name === 'BlankApp') {\n expect(projectConfigWindows(folder, userConfig)).toMatchSnapshot();\n } else {\n expect(projectConfigWindows(folder, userConfig)).toMatchSnapshot({\n folder: expect.stringContaining(name),\n });\n }\n },\n);\n\ntest('useWinUI3=true in react-native.config.js, useWinUI3=false in ExperimentalFeatures.props', async () => {\n const folder = path.resolve('src/e2etest/projects/WithWinUI3');\n\n const rnc = require(path.join(folder, 'react-native.config.js'));\n\n const config = projectConfigWindows(folder, rnc.project.windows)!;\n\n const al = new AutolinkWindows(\n {windows: config},\n {},\n {\n check: false,\n logging: false,\n },\n );\n\n const exd = await al.ensureXAMLDialect();\n expect(exd).toBeTruthy();\n\n const experimentalFeatures = (\n await fs.readFile(path.join(folder, 'windows/ExperimentalFeatures.props'))\n ).toString();\n\n expect(experimentalFeatures.replace(/\\r/g, '')).toMatchSnapshot();\n});\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const templateRoot: string;
2
+ export declare const testProjectGuid = "{416476D5-974A-4EE2-8145-4E331297247E}";
3
+ export declare function tryMkdir(dir: string): Promise<void>;
4
+ export declare function ensureWinUI3Project(folder: string): Promise<void>;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureWinUI3Project = exports.tryMkdir = exports.testProjectGuid = exports.templateRoot = void 0;
7
+ const fs_1 = __importDefault(require("@react-native-windows/fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const generator_common_1 = require("../generator-common");
10
+ exports.templateRoot = path_1.default.resolve('../../../vnext/template');
11
+ exports.testProjectGuid = '{416476D5-974A-4EE2-8145-4E331297247E}';
12
+ async function tryMkdir(dir) {
13
+ try {
14
+ await fs_1.default.mkdir(dir, { recursive: true });
15
+ }
16
+ catch (err) { }
17
+ }
18
+ exports.tryMkdir = tryMkdir;
19
+ async function ensureWinUI3Project(folder) {
20
+ const windowsDir = path_1.default.join(folder, 'windows');
21
+ if (fs_1.default.existsSync(windowsDir)) {
22
+ await fs_1.default.rmdir(windowsDir, { recursive: true });
23
+ }
24
+ await tryMkdir(windowsDir);
25
+ const replacements = {
26
+ name: 'WithWinUI3',
27
+ namespace: 'WithWinUI3',
28
+ useMustache: true,
29
+ projectGuidUpper: exports.testProjectGuid,
30
+ projectGuidLower: exports.testProjectGuid.toLowerCase(),
31
+ useWinUI3: false,
32
+ useHermes: false,
33
+ useExperimentalNuget: false,
34
+ packagesConfigCppNugetPackages: [
35
+ {
36
+ id: 'Microsoft.ReactNative.Cxx',
37
+ version: '1.0.0',
38
+ },
39
+ {
40
+ id: 'Microsoft.UI.Xaml',
41
+ version: '2.3.4.5',
42
+ },
43
+ {
44
+ id: 'Microsoft.WinUI',
45
+ version: '3.2.1.0',
46
+ },
47
+ ],
48
+ };
49
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(exports.templateRoot, 'cpp-app/proj/MyApp.sln'), path_1.default.join(windowsDir, 'WithWinUI3.sln'), replacements, null);
50
+ const projDir = path_1.default.join(windowsDir, 'WithWinUI3');
51
+ await tryMkdir(projDir);
52
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(exports.templateRoot, 'cpp-app/proj/MyApp.vcxproj'), path_1.default.join(projDir, 'WithWinUI3.vcxproj'), replacements, null);
53
+ await (0, generator_common_1.copyAndReplace)(path_1.default.join(exports.templateRoot, 'shared-app/proj/ExperimentalFeatures.props'), path_1.default.join(windowsDir, 'ExperimentalFeatures.props'), replacements, null);
54
+ }
55
+ exports.ensureWinUI3Project = ensureWinUI3Project;
56
+ //# sourceMappingURL=projectConfig.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectConfig.utils.js","sourceRoot":"","sources":["../../src/e2etest/projectConfig.utils.ts"],"names":[],"mappings":";;;;;;AAAA,kEAAyC;AACzC,gDAAwB;AACxB,0DAAqD;AAExC,QAAA,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;AAEvD,QAAA,eAAe,GAAG,wCAAwC,CAAC;AAEjE,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,IAAI;QACF,MAAM,YAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;KACxC;IAAC,OAAO,GAAG,EAAE,GAAE;AAClB,CAAC;AAJD,4BAIC;AAEM,KAAK,UAAU,mBAAmB,CAAC,MAAc;IACtD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;QAC7B,MAAM,YAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;KAC/C;IACD,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE3B,MAAM,YAAY,GAAG;QACnB,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,YAAY;QACvB,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,uBAAe;QACjC,gBAAgB,EAAE,uBAAe,CAAC,WAAW,EAAE;QAC/C,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,KAAK;QAChB,oBAAoB,EAAE,KAAK;QAC3B,8BAA8B,EAAE;YAC9B;gBACE,EAAE,EAAE,2BAA2B;gBAC/B,OAAO,EAAE,OAAO;aACjB;YACD;gBACE,EAAE,EAAE,mBAAmB;gBACvB,OAAO,EAAE,SAAS;aACnB;YACD;gBACE,EAAE,EAAE,iBAAiB;gBACrB,OAAO,EAAE,SAAS;aACnB;SACF;KACF,CAAC;IAEF,MAAM,IAAA,iCAAc,EAClB,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,wBAAwB,CAAC,EACjD,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EACvC,YAAY,EACZ,IAAI,CACL,CAAC;IAEF,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAExB,MAAM,IAAA,iCAAc,EAClB,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,4BAA4B,CAAC,EACrD,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,EACxC,YAAY,EACZ,IAAI,CACL,CAAC;IAEF,MAAM,IAAA,iCAAc,EAClB,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,4CAA4C,CAAC,EACrE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,4BAA4B,CAAC,EACnD,YAAY,EACZ,IAAI,CACL,CAAC;AACJ,CAAC;AAvDD,kDAuDC","sourcesContent":["import fs from '@react-native-windows/fs'\nimport path from 'path';\nimport { copyAndReplace } from '../generator-common';\n\nexport const templateRoot = path.resolve('../../../vnext/template');\n\nexport const testProjectGuid = '{416476D5-974A-4EE2-8145-4E331297247E}';\n\nexport async function tryMkdir(dir: string): Promise<void> {\n try {\n await fs.mkdir(dir, {recursive: true});\n } catch (err) {}\n}\n\nexport async function ensureWinUI3Project(folder: string) {\n const windowsDir = path.join(folder, 'windows');\n if (fs.existsSync(windowsDir)) {\n await fs.rmdir(windowsDir, {recursive: true});\n }\n await tryMkdir(windowsDir);\n\n const replacements = {\n name: 'WithWinUI3',\n namespace: 'WithWinUI3',\n useMustache: true,\n projectGuidUpper: testProjectGuid,\n projectGuidLower: testProjectGuid.toLowerCase(),\n useWinUI3: false,\n useHermes: false,\n useExperimentalNuget: false,\n packagesConfigCppNugetPackages: [\n {\n id: 'Microsoft.ReactNative.Cxx',\n version: '1.0.0',\n },\n {\n id: 'Microsoft.UI.Xaml',\n version: '2.3.4.5',\n },\n {\n id: 'Microsoft.WinUI',\n version: '3.2.1.0',\n },\n ],\n };\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-app/proj/MyApp.sln'),\n path.join(windowsDir, 'WithWinUI3.sln'),\n replacements,\n null\n );\n\n const projDir = path.join(windowsDir, 'WithWinUI3');\n await tryMkdir(projDir);\n\n await copyAndReplace(\n path.join(templateRoot, 'cpp-app/proj/MyApp.vcxproj'),\n path.join(projDir, 'WithWinUI3.vcxproj'),\n replacements,\n null\n );\n\n await copyAndReplace(\n path.join(templateRoot, 'shared-app/proj/ExperimentalFeatures.props'),\n path.join(windowsDir, 'ExperimentalFeatures.props'),\n replacements,\n null\n );\n}\n"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ * @format
5
+ */
6
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Microsoft Corporation. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ * @format
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const telemetry_1 = require("@react-native-windows/telemetry");
9
+ const runWindowsOptions_1 = require("../runWindows/runWindowsOptions");
10
+ // eslint-disable-next-line complexity
11
+ function validateOptionName(name, optionName) {
12
+ // Do not add a default case here. Every item must explicitly return true
13
+ switch (optionName) {
14
+ case 'release':
15
+ case 'root':
16
+ case 'arch':
17
+ case 'singleproc':
18
+ case 'emulator':
19
+ case 'device':
20
+ case 'target':
21
+ case 'remoteDebugging':
22
+ case 'logging':
23
+ case 'packager':
24
+ case 'bundle':
25
+ case 'launch':
26
+ case 'autolink':
27
+ case 'build':
28
+ case 'deploy':
29
+ case 'deployFromLayout':
30
+ case 'sln':
31
+ case 'proj':
32
+ case 'msbuildprops':
33
+ case 'buildLogDirectory':
34
+ case 'info':
35
+ case 'directDebugging':
36
+ case 'telemetry':
37
+ return true;
38
+ }
39
+ throw new Error(`Unable to find ${optionName} to match '${name}' in RunWindowsOptions.`);
40
+ }
41
+ test('runWindowsOptions - validate options', () => {
42
+ for (const commandOption of runWindowsOptions_1.runWindowsOptions) {
43
+ // Validate names
44
+ expect(commandOption.name).not.toBeNull();
45
+ expect(commandOption.name.startsWith('--')).toBe(true);
46
+ expect(commandOption.name).toBe(commandOption.name.trim());
47
+ // Validate defaults
48
+ if (!commandOption.name.endsWith(' [string]') &&
49
+ !commandOption.name.endsWith(' [number]')) {
50
+ // Commander ignores defaults for flags, so leave undefined to prevent confusion
51
+ expect(commandOption.default).toBeUndefined();
52
+ }
53
+ // Validate description
54
+ expect(commandOption.description).not.toBeNull();
55
+ expect(commandOption.description).toBe(commandOption.description.trim());
56
+ // Validate all command options are present in RunWindowsOptions
57
+ const optionName = (0, telemetry_1.commanderNameToOptionName)(commandOption.name);
58
+ expect(validateOptionName(commandOption.name, optionName)).toBe(true);
59
+ }
60
+ });
61
+ //# sourceMappingURL=runWindows.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runWindows.test.js","sourceRoot":"","sources":["../../src/e2etest/runWindows.test.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAEH,+DAA0E;AAE1E,uEAGyC;AAEzC,sCAAsC;AACtC,SAAS,kBAAkB,CACzB,IAAY,EACZ,UAAmC;IAEnC,yEAAyE;IACzE,QAAQ,UAAU,EAAE;QAClB,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,YAAY,CAAC;QAClB,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,iBAAiB,CAAC;QACvB,KAAK,SAAS,CAAC;QACf,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,kBAAkB,CAAC;QACxB,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,cAAc,CAAC;QACpB,KAAK,mBAAmB,CAAC;QACzB,KAAK,MAAM,CAAC;QACZ,KAAK,iBAAiB,CAAC;QACvB,KAAK,WAAW;YACd,OAAO,IAAI,CAAC;KACf;IACD,MAAM,IAAI,KAAK,CACb,kBAAkB,UAAU,cAAc,IAAI,yBAAyB,CACxE,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAChD,KAAK,MAAM,aAAa,IAAI,qCAAiB,EAAE;QAC7C,iBAAiB;QACjB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE3D,oBAAoB;QACpB,IACE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YACzC,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EACzC;YACA,gFAAgF;YAChF,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;SAC/C;QAED,uBAAuB;QACvB,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,CAAC,aAAa,CAAC,WAAY,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAE3E,gEAAgE;QAChE,MAAM,UAAU,GAAG,IAAA,qCAAyB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,CACJ,kBAAkB,CAChB,aAAa,CAAC,IAAI,EAClB,UAAqC,CACtC,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACd;AACH,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n * @format\n */\n\nimport {commanderNameToOptionName} from '@react-native-windows/telemetry';\n\nimport {\n runWindowsOptions,\n RunWindowsOptions,\n} from '../runWindows/runWindowsOptions';\n\n// eslint-disable-next-line complexity\nfunction validateOptionName(\n name: string,\n optionName: keyof RunWindowsOptions,\n): boolean {\n // Do not add a default case here. Every item must explicitly return true\n switch (optionName) {\n case 'release':\n case 'root':\n case 'arch':\n case 'singleproc':\n case 'emulator':\n case 'device':\n case 'target':\n case 'remoteDebugging':\n case 'logging':\n case 'packager':\n case 'bundle':\n case 'launch':\n case 'autolink':\n case 'build':\n case 'deploy':\n case 'deployFromLayout':\n case 'sln':\n case 'proj':\n case 'msbuildprops':\n case 'buildLogDirectory':\n case 'info':\n case 'directDebugging':\n case 'telemetry':\n return true;\n }\n throw new Error(\n `Unable to find ${optionName} to match '${name}' in RunWindowsOptions.`,\n );\n}\n\ntest('runWindowsOptions - validate options', () => {\n for (const commandOption of runWindowsOptions) {\n // Validate names\n expect(commandOption.name).not.toBeNull();\n expect(commandOption.name.startsWith('--')).toBe(true);\n expect(commandOption.name).toBe(commandOption.name.trim());\n\n // Validate defaults\n if (\n !commandOption.name.endsWith(' [string]') &&\n !commandOption.name.endsWith(' [number]')\n ) {\n // Commander ignores defaults for flags, so leave undefined to prevent confusion\n expect(commandOption.default).toBeUndefined();\n }\n\n // Validate description\n expect(commandOption.description).not.toBeNull();\n expect(commandOption.description!).toBe(commandOption.description!.trim());\n\n // Validate all command options are present in RunWindowsOptions\n const optionName = commanderNameToOptionName(commandOption.name);\n expect(\n validateOptionName(\n commandOption.name,\n optionName as keyof RunWindowsOptions,\n ),\n ).toBe(true);\n }\n});\n"]}
@@ -18,6 +18,22 @@ export declare type Replacements = {
18
18
  * @return The contents of the file with the replacements applied.
19
19
  */
20
20
  export declare function resolveContents(srcPath: string, replacements: Replacements): string;
21
+ declare type ContentChangedCallbackOption = 'identical' | 'changed' | 'new' | null;
22
+ declare type ContentChangedCallback = (path: string, option: ContentChangedCallbackOption) => Promise<'keep' | 'overwrite'>;
23
+ /**
24
+ * Copy a file to given destination, replacing parts of its contents.
25
+ * @param srcPath Path to a file to be copied.
26
+ * @param destPath Destination path.
27
+ * @param replacements: e.g. {'TextToBeReplaced': 'Replacement'}
28
+ * @param contentChangedCallback
29
+ * Used when upgrading projects. Based on if file contents would change
30
+ * when being replaced, allows the caller to specify whether the file
31
+ * should be replaced or not.
32
+ * If null, files will be overwritten.
33
+ * Function(path, 'identical' | 'changed' | 'new') => 'keep' | 'overwrite'
34
+ */
35
+ export declare function copyAndReplace(srcPath: string, destPath: string, replacements: Replacements, contentChangedCallback: ContentChangedCallback | null): Promise<void>;
21
36
  export declare function createDir(destPath: string): void;
22
37
  export declare function copyAndReplaceWithChangedCallback(srcPath: string, destRoot: string, relativeDestPath: string, replacements?: Record<string, string>, alwaysOverwrite?: boolean): Promise<void>;
23
38
  export declare function copyAndReplaceAll(srcPath: string, destPath: string, relativeDestDir: string, replacements: Replacements, alwaysOverwrite: boolean): Promise<void>;
39
+ export {};