@react-native-windows/cli 0.0.0-canary.13 → 0.0.0-canary.130
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 +47 -0
- package/lib-commonjs/config/configUtils.d.ts +25 -2
- package/lib-commonjs/config/configUtils.js +138 -30
- package/lib-commonjs/config/configUtils.js.map +1 -1
- package/lib-commonjs/config/dependencyConfig.js +104 -43
- package/lib-commonjs/config/dependencyConfig.js.map +1 -1
- package/lib-commonjs/config/projectConfig.d.ts +4 -1
- package/lib-commonjs/config/projectConfig.js +72 -12
- package/lib-commonjs/config/projectConfig.js.map +1 -1
- package/lib-commonjs/e2etest/autolink.test.d.ts +6 -0
- package/lib-commonjs/e2etest/autolink.test.js +386 -0
- package/lib-commonjs/e2etest/autolink.test.js.map +1 -0
- package/lib-commonjs/e2etest/dependencyConfig.test.d.ts +6 -0
- package/lib-commonjs/e2etest/dependencyConfig.test.js +130 -0
- package/lib-commonjs/e2etest/dependencyConfig.test.js.map +1 -0
- package/lib-commonjs/e2etest/projectConfig.test.d.ts +6 -0
- package/lib-commonjs/e2etest/projectConfig.test.js +111 -0
- package/lib-commonjs/e2etest/projectConfig.test.js.map +1 -0
- package/lib-commonjs/e2etest/projectConfig.utils.d.ts +8 -0
- package/lib-commonjs/e2etest/projectConfig.utils.js +77 -0
- package/lib-commonjs/e2etest/projectConfig.utils.js.map +1 -0
- package/lib-commonjs/e2etest/runWindows.test.d.ts +6 -0
- package/lib-commonjs/e2etest/runWindows.test.js +61 -0
- package/lib-commonjs/e2etest/runWindows.test.js.map +1 -0
- package/lib-commonjs/generator-common/index.d.ts +16 -0
- package/lib-commonjs/generator-common/index.js +60 -39
- package/lib-commonjs/generator-common/index.js.map +1 -1
- package/lib-commonjs/generator-windows/index.d.ts +2 -2
- package/lib-commonjs/generator-windows/index.js +265 -182
- package/lib-commonjs/generator-windows/index.js.map +1 -1
- package/lib-commonjs/healthChecks.d.ts +2 -0
- package/lib-commonjs/healthChecks.js +88 -0
- package/lib-commonjs/healthChecks.js.map +1 -0
- package/lib-commonjs/index.d.ts +5 -0
- package/lib-commonjs/index.js +28 -8
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/runWindows/runWindows.js +239 -52
- package/lib-commonjs/runWindows/runWindows.js.map +1 -1
- package/lib-commonjs/runWindows/runWindowsOptions.d.ts +14 -10
- package/lib-commonjs/runWindows/runWindowsOptions.js +15 -11
- package/lib-commonjs/runWindows/runWindowsOptions.js.map +1 -1
- package/lib-commonjs/runWindows/utils/autolink.d.ts +88 -1
- package/lib-commonjs/runWindows/utils/autolink.js +594 -260
- package/lib-commonjs/runWindows/utils/autolink.js.map +1 -1
- package/lib-commonjs/runWindows/utils/build.d.ts +1 -2
- package/lib-commonjs/runWindows/utils/build.js +24 -31
- package/lib-commonjs/runWindows/utils/build.js.map +1 -1
- package/lib-commonjs/runWindows/utils/checkRequirements.js +11 -7
- package/lib-commonjs/runWindows/utils/checkRequirements.js.map +1 -1
- package/lib-commonjs/runWindows/utils/commandWithProgress.d.ts +11 -3
- package/lib-commonjs/runWindows/utils/commandWithProgress.js +58 -22
- package/lib-commonjs/runWindows/utils/commandWithProgress.js.map +1 -1
- package/lib-commonjs/runWindows/utils/deploy.d.ts +1 -1
- package/lib-commonjs/runWindows/utils/deploy.js +168 -82
- package/lib-commonjs/runWindows/utils/deploy.js.map +1 -1
- package/lib-commonjs/runWindows/utils/info.js +5 -2
- package/lib-commonjs/runWindows/utils/info.js.map +1 -1
- package/lib-commonjs/runWindows/utils/msbuildtools.d.ts +11 -5
- package/lib-commonjs/runWindows/utils/msbuildtools.js +148 -64
- package/lib-commonjs/runWindows/utils/msbuildtools.js.map +1 -1
- package/lib-commonjs/runWindows/utils/telemetryHelpers.d.ts +29 -0
- package/lib-commonjs/runWindows/utils/telemetryHelpers.js +113 -0
- package/lib-commonjs/runWindows/utils/telemetryHelpers.js.map +1 -0
- package/lib-commonjs/runWindows/utils/version.d.ts +4 -4
- package/lib-commonjs/runWindows/utils/version.js.map +1 -1
- package/lib-commonjs/runWindows/utils/vsInstalls.d.ts +4 -1
- package/lib-commonjs/runWindows/utils/vsInstalls.js +22 -7
- package/lib-commonjs/runWindows/utils/vsInstalls.js.map +1 -1
- package/lib-commonjs/runWindows/utils/vstools.d.ts +1 -0
- package/lib-commonjs/runWindows/utils/vstools.js +40 -27
- package/lib-commonjs/runWindows/utils/vstools.js.map +1 -1
- package/lib-commonjs/runWindows/utils/winappdeploytool.d.ts +3 -3
- package/lib-commonjs/runWindows/utils/winappdeploytool.js +17 -14
- package/lib-commonjs/runWindows/utils/winappdeploytool.js.map +1 -1
- package/package.json +40 -22
- package/powershell/Add-AppDevPackage.ps1 +2 -2
- package/powershell/Eval-MsBuildProperties.ps1 +156 -0
- package/powershell/WindowsStoreAppUtils.ps1 +10 -0
- package/CHANGELOG.json +0 -185
- package/CHANGELOG.md +0 -93
|
@@ -0,0 +1,386 @@
|
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const telemetry_1 = require("@react-native-windows/telemetry");
|
|
13
|
+
const projectConfig_1 = require("../config/projectConfig");
|
|
14
|
+
const autolink_1 = require("../runWindows/utils/autolink");
|
|
15
|
+
const xmldom_1 = require("@xmldom/xmldom");
|
|
16
|
+
const projectConfig_utils_1 = require("./projectConfig.utils");
|
|
17
|
+
test('autolink with no windows project', () => {
|
|
18
|
+
expect(() => {
|
|
19
|
+
// eslint-disable-next-line no-new
|
|
20
|
+
new AutolinkTest({}, {}, { check: true, logging: false });
|
|
21
|
+
}).toThrowError();
|
|
22
|
+
});
|
|
23
|
+
test('autolink with incomplete windows project', () => {
|
|
24
|
+
expect(() => {
|
|
25
|
+
const autolink = new AutolinkTest({ windows: {} }, {}, { check: true, logging: false });
|
|
26
|
+
autolink.validateRequiredAppProperties();
|
|
27
|
+
}).toThrowError();
|
|
28
|
+
});
|
|
29
|
+
class AutolinkTest extends autolink_1.AutolinkWindows {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.packagesConfig = '';
|
|
33
|
+
this.experimentalFeaturesProps = '';
|
|
34
|
+
}
|
|
35
|
+
getWindowsProjectConfig() {
|
|
36
|
+
return this.windowsAppConfig;
|
|
37
|
+
}
|
|
38
|
+
getPackagesConfigXml() {
|
|
39
|
+
return {
|
|
40
|
+
path: 'packages.config',
|
|
41
|
+
content: new xmldom_1.DOMParser().parseFromString(this.packagesConfig, 'application/xml'),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
getExperimentalFeaturesPropsXml() {
|
|
45
|
+
return {
|
|
46
|
+
path: 'ExperimentalFeatures.props',
|
|
47
|
+
content: new xmldom_1.DOMParser().parseFromString(this.experimentalFeaturesProps, 'application/xml'),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async updateFile(filepath, content) {
|
|
51
|
+
if (filepath === 'packages.config') {
|
|
52
|
+
this.packagesConfig = content;
|
|
53
|
+
}
|
|
54
|
+
else if (filepath === 'ExperimentalFeatures.props') {
|
|
55
|
+
this.experimentalFeaturesProps = content;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
throw new Error(`Unknown path: ${filepath}`);
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
test('autolink fixup sln', () => {
|
|
64
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.' } }, {}, { check: true, logging: false, sln: 'foo' });
|
|
65
|
+
expect(autolink.getWindowsProjectConfig().solutionFile).toBeUndefined();
|
|
66
|
+
expect(() => {
|
|
67
|
+
autolink.validateRequiredAppProperties();
|
|
68
|
+
}).toThrow();
|
|
69
|
+
autolink.fixUpForSlnOption();
|
|
70
|
+
expect(autolink.getWindowsProjectConfig().solutionFile).toEqual('foo');
|
|
71
|
+
expect(() => {
|
|
72
|
+
autolink.validateRequiredAppProperties();
|
|
73
|
+
}).toThrow();
|
|
74
|
+
});
|
|
75
|
+
test('autolink fixup proj', async (done) => {
|
|
76
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln' } }, {}, {
|
|
77
|
+
check: true,
|
|
78
|
+
logging: false,
|
|
79
|
+
proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',
|
|
80
|
+
});
|
|
81
|
+
expect(autolink.getWindowsProjectConfig().solutionFile).toEqual('foo.sln');
|
|
82
|
+
expect(autolink.getWindowsProjectConfig().project).toBeUndefined();
|
|
83
|
+
const folder = path_1.default.resolve('src/e2etest/projects/', 'WithWinUI3');
|
|
84
|
+
await (0, projectConfig_utils_1.ensureWinUI3Project)(folder);
|
|
85
|
+
expect(() => {
|
|
86
|
+
autolink.validateRequiredProjectProperties();
|
|
87
|
+
}).toThrow();
|
|
88
|
+
autolink.fixUpForProjOption();
|
|
89
|
+
const projectConfig = autolink.getWindowsProjectConfig().project;
|
|
90
|
+
expect(projectConfig).not.toBeUndefined();
|
|
91
|
+
expect(projectConfig.projectName).toEqual('WithWinUI3');
|
|
92
|
+
autolink.validateRequiredProjectProperties();
|
|
93
|
+
done();
|
|
94
|
+
});
|
|
95
|
+
test('empty cpp autolink dependencies', () => {
|
|
96
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln' } }, {}, {
|
|
97
|
+
check: true,
|
|
98
|
+
logging: false,
|
|
99
|
+
proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',
|
|
100
|
+
});
|
|
101
|
+
const replacements = autolink.getCppReplacements();
|
|
102
|
+
expect(replacements.cppIncludes).toEqual('');
|
|
103
|
+
expect(replacements.cppPackageProviders).toEqual('\n UNREFERENCED_PARAMETER(packageProviders);');
|
|
104
|
+
});
|
|
105
|
+
test('one invalid cpp autolink dependency', () => {
|
|
106
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln' } }, {
|
|
107
|
+
superModule: {
|
|
108
|
+
name: 'superModule',
|
|
109
|
+
root: 'theRoot',
|
|
110
|
+
platforms: {
|
|
111
|
+
windows: {},
|
|
112
|
+
},
|
|
113
|
+
assets: [],
|
|
114
|
+
hooks: {},
|
|
115
|
+
params: [],
|
|
116
|
+
},
|
|
117
|
+
}, {
|
|
118
|
+
check: true,
|
|
119
|
+
logging: false,
|
|
120
|
+
proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',
|
|
121
|
+
});
|
|
122
|
+
const replacements = autolink.getCppReplacements();
|
|
123
|
+
expect(replacements.cppIncludes).toEqual('');
|
|
124
|
+
expect(replacements.cppPackageProviders).toEqual('\n UNREFERENCED_PARAMETER(packageProviders);');
|
|
125
|
+
});
|
|
126
|
+
test('one invalid cs autolink dependency', () => {
|
|
127
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln' } }, {
|
|
128
|
+
superModule: {
|
|
129
|
+
name: 'superModule',
|
|
130
|
+
root: 'theRoot',
|
|
131
|
+
platforms: {
|
|
132
|
+
windows: {},
|
|
133
|
+
},
|
|
134
|
+
assets: [],
|
|
135
|
+
hooks: {},
|
|
136
|
+
params: [],
|
|
137
|
+
},
|
|
138
|
+
}, {
|
|
139
|
+
check: true,
|
|
140
|
+
logging: false,
|
|
141
|
+
proj: 'projects/SimpleCSharpApp/windows/SimpleCSharpApp/SimpleCSharpApp.csproj',
|
|
142
|
+
});
|
|
143
|
+
const replacements = autolink.getCsReplacements();
|
|
144
|
+
expect(replacements.csUsingNamespaces).toEqual('');
|
|
145
|
+
expect(replacements.csReactPackageProviders).toEqual('');
|
|
146
|
+
});
|
|
147
|
+
test('one valid cpp autolink dependency', () => {
|
|
148
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln' } }, {
|
|
149
|
+
superModule: {
|
|
150
|
+
name: 'superModule',
|
|
151
|
+
root: 'theRoot',
|
|
152
|
+
platforms: {
|
|
153
|
+
windows: {
|
|
154
|
+
sourceDir: __dirname,
|
|
155
|
+
projects: [
|
|
156
|
+
{
|
|
157
|
+
directDependency: true,
|
|
158
|
+
projectFile: 'superModule.vcxproj',
|
|
159
|
+
cppHeaders: ['Garfield.h', 'Snoopy.h'],
|
|
160
|
+
cppPackageProviders: ['FamousAnimalCartoons'],
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
assets: [],
|
|
166
|
+
hooks: {},
|
|
167
|
+
params: [],
|
|
168
|
+
},
|
|
169
|
+
}, {
|
|
170
|
+
check: true,
|
|
171
|
+
logging: false,
|
|
172
|
+
proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',
|
|
173
|
+
});
|
|
174
|
+
const replacements = autolink.getCppReplacements();
|
|
175
|
+
expect(replacements.cppIncludes).toMatch(/#include <Garfield.h>/);
|
|
176
|
+
expect(replacements.cppIncludes).toMatch(/#include <Snoopy.h>/);
|
|
177
|
+
expect(replacements.cppPackageProviders).toContain('packageProviders.Append(winrt::FamousAnimalCartoons())');
|
|
178
|
+
});
|
|
179
|
+
test('one valid cs autolink dependency', () => {
|
|
180
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln' } }, {
|
|
181
|
+
superModule: {
|
|
182
|
+
name: 'superModule',
|
|
183
|
+
root: 'theRoot',
|
|
184
|
+
platforms: {
|
|
185
|
+
windows: {
|
|
186
|
+
sourceDir: __dirname,
|
|
187
|
+
projects: [
|
|
188
|
+
{
|
|
189
|
+
directDependency: true,
|
|
190
|
+
csNamespaces: ['Garfield'],
|
|
191
|
+
projectFile: 'superModule.vcxproj',
|
|
192
|
+
cppHeaders: ['Garfield.h', 'Snoopy.h'],
|
|
193
|
+
csPackageProviders: ['FamousAnimalCartoons'],
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
assets: [],
|
|
199
|
+
hooks: {},
|
|
200
|
+
params: [],
|
|
201
|
+
},
|
|
202
|
+
}, {
|
|
203
|
+
check: true,
|
|
204
|
+
logging: false,
|
|
205
|
+
proj: 'projects/SimpleCSharpApp/windows/SimpleCSharpApp/SimpleCSharpApp.csproj',
|
|
206
|
+
});
|
|
207
|
+
const replacements = autolink.getCsReplacements();
|
|
208
|
+
expect(replacements.csUsingNamespaces).toContain('using Garfield;');
|
|
209
|
+
expect(replacements.csReactPackageProviders).toContain('packageProviders.Add(new FamousAnimalCartoons())');
|
|
210
|
+
});
|
|
211
|
+
test('ensureXAMLDialect - useWinUI3=true in react-native.config.js, useWinUI3=false in ExperimentalFeatures.props', async (done) => {
|
|
212
|
+
const folder = path_1.default.resolve('src/e2etest/projects/WithWinUI3');
|
|
213
|
+
// Create project with UseWinUI3 == false in ExperimentalFeatures.props
|
|
214
|
+
await (0, projectConfig_utils_1.ensureCppAppProject)(folder, 'WithWinUI3', false, false, false);
|
|
215
|
+
const rnc = require(path_1.default.join(folder, 'react-native.config.js'));
|
|
216
|
+
const config = (0, projectConfig_1.projectConfigWindows)(folder, rnc.project.windows);
|
|
217
|
+
// Set useWinUI3=true in react-native.config.js
|
|
218
|
+
config.useWinUI3 = true;
|
|
219
|
+
const al = new AutolinkTest({ windows: config }, {}, {
|
|
220
|
+
check: false,
|
|
221
|
+
logging: false,
|
|
222
|
+
});
|
|
223
|
+
al.experimentalFeaturesProps = `<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>`;
|
|
224
|
+
al.packagesConfig = `<packages><package id="SuperPkg" version="42"/></packages>`;
|
|
225
|
+
const exd = await al.ensureXAMLDialect();
|
|
226
|
+
expect(exd).toBeTruthy();
|
|
227
|
+
const expectedExperimentalFeatures = '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>';
|
|
228
|
+
expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);
|
|
229
|
+
// example packages.config:
|
|
230
|
+
// <packages>
|
|
231
|
+
// <package id="SuperPkg" version="42"/>
|
|
232
|
+
// <package id="Microsoft.WindowsAppSDK" version="1.0.0" targetFramework="native"/>
|
|
233
|
+
// </packages>
|
|
234
|
+
//
|
|
235
|
+
expect(al.packagesConfig).toContain('Microsoft.WindowsAppSDK');
|
|
236
|
+
expect(al.packagesConfig).toContain('<package id="SuperPkg" version="42"/>');
|
|
237
|
+
expect(al.packagesConfig).not.toContain('Microsoft.UI.Xaml');
|
|
238
|
+
done();
|
|
239
|
+
});
|
|
240
|
+
test('ensureXAMLDialect - useWinUI3=false in react-native.config.js, useWinUI3=true in ExperimentalFeatures.props', async (done) => {
|
|
241
|
+
const folder = path_1.default.resolve('src/e2etest/projects/WithWinUI3');
|
|
242
|
+
const rnc = require(path_1.default.join(folder, 'react-native.config.js'));
|
|
243
|
+
const config = (0, projectConfig_1.projectConfigWindows)(folder, rnc.project.windows);
|
|
244
|
+
config.useWinUI3 = false;
|
|
245
|
+
const al = new AutolinkTest({ windows: config }, {}, {
|
|
246
|
+
check: false,
|
|
247
|
+
logging: false,
|
|
248
|
+
});
|
|
249
|
+
al.experimentalFeaturesProps = `<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>`;
|
|
250
|
+
al.packagesConfig = `<packages><package id="SuperPkg" version="42"/></packages>`;
|
|
251
|
+
const exd = await al.ensureXAMLDialect();
|
|
252
|
+
expect(exd).toBeTruthy();
|
|
253
|
+
const expectedExperimentalFeatures = '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>';
|
|
254
|
+
expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);
|
|
255
|
+
// example packages.config:
|
|
256
|
+
// <packages>
|
|
257
|
+
// <package id="SuperPkg" version="42"/>
|
|
258
|
+
// <package id="Microsoft.WindowsAppSDK" version="1.0.0" targetFramework="native"/>
|
|
259
|
+
// </packages>
|
|
260
|
+
//
|
|
261
|
+
expect(al.packagesConfig).not.toContain('Microsoft.WindowsAppSDK');
|
|
262
|
+
expect(al.packagesConfig).toContain('<package id="SuperPkg" version="42"/>');
|
|
263
|
+
expect(al.packagesConfig).toContain('Microsoft.UI.Xaml');
|
|
264
|
+
done();
|
|
265
|
+
});
|
|
266
|
+
test('ensureXAMLDialect - useWinUI3 not in react-native.config.js, useWinUI3=true in ExperimentalFeatures.props', async (done) => {
|
|
267
|
+
const folder = path_1.default.resolve('src/e2etest/projects/WithWinUI3');
|
|
268
|
+
const rnc = require(path_1.default.join(folder, 'react-native.config.js'));
|
|
269
|
+
const config = (0, projectConfig_1.projectConfigWindows)(folder, rnc.project.windows);
|
|
270
|
+
delete config.useWinUI3;
|
|
271
|
+
const al = new AutolinkTest({ windows: config }, {}, {
|
|
272
|
+
check: false,
|
|
273
|
+
logging: false,
|
|
274
|
+
});
|
|
275
|
+
al.experimentalFeaturesProps = `<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>`;
|
|
276
|
+
al.packagesConfig = `<packages><package id="SuperPkg" version="42"/></packages>`;
|
|
277
|
+
const exd = await al.ensureXAMLDialect();
|
|
278
|
+
expect(exd).toBeTruthy();
|
|
279
|
+
const expectedExperimentalFeatures = '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>';
|
|
280
|
+
expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);
|
|
281
|
+
// example packages.config:
|
|
282
|
+
// <packages>
|
|
283
|
+
// <package id="SuperPkg" version="42"/>
|
|
284
|
+
// <package id="Microsoft.WindowsAppSDK" version="1.0.0" targetFramework="native"/>
|
|
285
|
+
// </packages>
|
|
286
|
+
//
|
|
287
|
+
expect(al.packagesConfig).toContain('Microsoft.WindowsAppSDK');
|
|
288
|
+
expect(al.packagesConfig).toContain('<package id="SuperPkg" version="42"/>');
|
|
289
|
+
expect(al.packagesConfig).not.toContain('Microsoft.UI.Xaml');
|
|
290
|
+
done();
|
|
291
|
+
});
|
|
292
|
+
test('ensureXAMLDialect - useWinUI3 not in react-native.config.js, useWinUI3=false in ExperimentalFeatures.props', async (done) => {
|
|
293
|
+
const folder = path_1.default.resolve('src/e2etest/projects/WithWinUI3');
|
|
294
|
+
const rnc = require(path_1.default.join(folder, 'react-native.config.js'));
|
|
295
|
+
const config = (0, projectConfig_1.projectConfigWindows)(folder, rnc.project.windows);
|
|
296
|
+
delete config.useWinUI3;
|
|
297
|
+
const al = new AutolinkTest({ windows: config }, {}, {
|
|
298
|
+
check: false,
|
|
299
|
+
logging: false,
|
|
300
|
+
});
|
|
301
|
+
al.experimentalFeaturesProps = `<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>`;
|
|
302
|
+
al.packagesConfig = `<packages><package id="SuperPkg" version="42"/><package id="Microsoft.WindowsAppSDK"/></packages>`;
|
|
303
|
+
const exd = await al.ensureXAMLDialect();
|
|
304
|
+
expect(exd).toBeTruthy();
|
|
305
|
+
const expectedExperimentalFeatures = `<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>`;
|
|
306
|
+
expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);
|
|
307
|
+
// example packages.config:
|
|
308
|
+
// <packages>
|
|
309
|
+
// <package id="SuperPkg" version="42"/>
|
|
310
|
+
// <package id="Microsoft.WindowsAppSDK" version="1.0.0" targetFramework="native"/>
|
|
311
|
+
// </packages>
|
|
312
|
+
//
|
|
313
|
+
expect(al.packagesConfig).not.toContain('Microsoft.WindowsAppSDK');
|
|
314
|
+
expect(al.packagesConfig).toContain('<package id="SuperPkg" version="42"/>');
|
|
315
|
+
expect(al.packagesConfig).toContain('Microsoft.UI.Xaml');
|
|
316
|
+
done();
|
|
317
|
+
});
|
|
318
|
+
test('Indirect autolink dependency', () => {
|
|
319
|
+
const autolink = new AutolinkTest({ windows: { folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln' } }, {
|
|
320
|
+
superModule: {
|
|
321
|
+
name: 'superModule',
|
|
322
|
+
root: 'theRoot',
|
|
323
|
+
platforms: {
|
|
324
|
+
windows: {
|
|
325
|
+
sourceDir: __dirname,
|
|
326
|
+
projects: [
|
|
327
|
+
{
|
|
328
|
+
directDependency: true,
|
|
329
|
+
projectFile: 'superModule.vcxproj',
|
|
330
|
+
cppHeaders: ['Garfield.h', 'Snoopy.h'],
|
|
331
|
+
cppPackageProviders: ['FamousAnimalCartoons'],
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
directDependency: false,
|
|
335
|
+
projectFile: 'indirect.vcxproj',
|
|
336
|
+
},
|
|
337
|
+
],
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
assets: [],
|
|
341
|
+
hooks: {},
|
|
342
|
+
params: [],
|
|
343
|
+
},
|
|
344
|
+
}, {
|
|
345
|
+
check: true,
|
|
346
|
+
logging: false,
|
|
347
|
+
proj: 'projects/WithIndirectDependency/windows/WithIndirectDependency/WithIndirectDependency.vcxproj',
|
|
348
|
+
});
|
|
349
|
+
const replacements = autolink.getCppReplacements();
|
|
350
|
+
expect(replacements.cppIncludes).toMatch(/#include <Garfield.h>/);
|
|
351
|
+
expect(replacements.cppIncludes).toMatch(/#include <Snoopy.h>/);
|
|
352
|
+
expect(replacements.cppPackageProviders).toContain('packageProviders.Append(winrt::FamousAnimalCartoons())');
|
|
353
|
+
});
|
|
354
|
+
function validateOptionName(name, optionName) {
|
|
355
|
+
// Do not add a default case here. Every item must explicitly return true
|
|
356
|
+
switch (optionName) {
|
|
357
|
+
case 'check':
|
|
358
|
+
case 'logging':
|
|
359
|
+
case 'sln':
|
|
360
|
+
case 'proj':
|
|
361
|
+
case 'telemetry':
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
throw new Error(`Unable to find ${optionName} to match '${name}' in AutoLinkOptions.`);
|
|
365
|
+
}
|
|
366
|
+
test('autolinkOptions - validate options', () => {
|
|
367
|
+
for (const commandOption of autolink_1.autolinkOptions) {
|
|
368
|
+
// Validate names
|
|
369
|
+
expect(commandOption.name).not.toBeNull();
|
|
370
|
+
expect(commandOption.name.startsWith('--')).toBe(true);
|
|
371
|
+
expect(commandOption.name).toBe(commandOption.name.trim());
|
|
372
|
+
// Validate defaults
|
|
373
|
+
if (!commandOption.name.endsWith(' [string]') &&
|
|
374
|
+
!commandOption.name.endsWith(' [number]')) {
|
|
375
|
+
// Commander ignores defaults for flags, so leave undefined to prevent confusion
|
|
376
|
+
expect(commandOption.default).toBeUndefined();
|
|
377
|
+
}
|
|
378
|
+
// Validate description
|
|
379
|
+
expect(commandOption.description).not.toBeNull();
|
|
380
|
+
expect(commandOption.description).toBe(commandOption.description.trim());
|
|
381
|
+
// Validate all command options are present in AutoLinkOptions
|
|
382
|
+
const optionName = (0, telemetry_1.commanderNameToOptionName)(commandOption.name);
|
|
383
|
+
expect(validateOptionName(commandOption.name, optionName)).toBe(true);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
//# sourceMappingURL=autolink.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autolink.test.js","sourceRoot":"","sources":["../../src/e2etest/autolink.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n * @format\n */\n\nimport path from 'path';\nimport {commanderNameToOptionName} from '@react-native-windows/telemetry';\nimport {projectConfigWindows} from '../config/projectConfig';\nimport {\n AutolinkWindows,\n autolinkOptions,\n AutoLinkOptions,\n} from '../runWindows/utils/autolink';\nimport {DOMParser} from '@xmldom/xmldom';\nimport {ensureCppAppProject, ensureWinUI3Project} from './projectConfig.utils';\n\ntest('autolink with no windows project', () => {\n expect(() => {\n // eslint-disable-next-line no-new\n new AutolinkTest({}, {}, {check: true, logging: false});\n }).toThrowError();\n});\n\ntest('autolink with incomplete windows project', () => {\n expect(() => {\n const autolink = new AutolinkTest(\n {windows: {}},\n {},\n {check: true, logging: false},\n );\n autolink.validateRequiredAppProperties();\n }).toThrowError();\n});\n\nclass AutolinkTest extends AutolinkWindows {\n public getWindowsProjectConfig() {\n return this.windowsAppConfig;\n }\n public packagesConfig = '';\n public experimentalFeaturesProps = '';\n protected getPackagesConfigXml() {\n return {\n path: 'packages.config',\n content: new DOMParser().parseFromString(\n this.packagesConfig,\n 'application/xml',\n ),\n };\n }\n protected getExperimentalFeaturesPropsXml() {\n return {\n path: 'ExperimentalFeatures.props',\n content: new DOMParser().parseFromString(\n this.experimentalFeaturesProps,\n 'application/xml',\n ),\n };\n }\n protected async updateFile(filepath: string, content: string) {\n if (filepath === 'packages.config') {\n this.packagesConfig = content;\n } else if (filepath === 'ExperimentalFeatures.props') {\n this.experimentalFeaturesProps = content;\n } else {\n throw new Error(`Unknown path: ${filepath}`);\n }\n return true;\n }\n}\n\ntest('autolink fixup sln', () => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.'}},\n {},\n {check: true, logging: false, sln: 'foo'},\n );\n expect(autolink.getWindowsProjectConfig().solutionFile).toBeUndefined();\n expect(() => {\n autolink.validateRequiredAppProperties();\n }).toThrow();\n autolink.fixUpForSlnOption();\n expect(autolink.getWindowsProjectConfig().solutionFile).toEqual('foo');\n expect(() => {\n autolink.validateRequiredAppProperties();\n }).toThrow();\n});\n\ntest('autolink fixup proj', async done => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln'}},\n {},\n {\n check: true,\n logging: false,\n proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',\n },\n );\n expect(autolink.getWindowsProjectConfig().solutionFile).toEqual('foo.sln');\n expect(autolink.getWindowsProjectConfig().project).toBeUndefined();\n\n const folder = path.resolve('src/e2etest/projects/', 'WithWinUI3');\n await ensureWinUI3Project(folder);\n expect(() => {\n autolink.validateRequiredProjectProperties();\n }).toThrow();\n autolink.fixUpForProjOption();\n\n const projectConfig = autolink.getWindowsProjectConfig().project;\n expect(projectConfig).not.toBeUndefined();\n expect(projectConfig.projectName).toEqual('WithWinUI3');\n autolink.validateRequiredProjectProperties();\n done();\n});\n\ntest('empty cpp autolink dependencies', () => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln'}},\n {},\n {\n check: true,\n logging: false,\n proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',\n },\n );\n const replacements = autolink.getCppReplacements();\n expect(replacements.cppIncludes).toEqual('');\n expect(replacements.cppPackageProviders).toEqual(\n '\\n UNREFERENCED_PARAMETER(packageProviders);',\n );\n});\n\ntest('one invalid cpp autolink dependency', () => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln'}},\n {\n superModule: {\n name: 'superModule',\n root: 'theRoot',\n platforms: {\n windows: {},\n },\n assets: [],\n hooks: {},\n params: [],\n },\n },\n {\n check: true,\n logging: false,\n proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',\n },\n );\n const replacements = autolink.getCppReplacements();\n expect(replacements.cppIncludes).toEqual('');\n expect(replacements.cppPackageProviders).toEqual(\n '\\n UNREFERENCED_PARAMETER(packageProviders);',\n );\n});\n\ntest('one invalid cs autolink dependency', () => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln'}},\n {\n superModule: {\n name: 'superModule',\n root: 'theRoot',\n platforms: {\n windows: {},\n },\n assets: [],\n hooks: {},\n params: [],\n },\n },\n {\n check: true,\n logging: false,\n proj: 'projects/SimpleCSharpApp/windows/SimpleCSharpApp/SimpleCSharpApp.csproj',\n },\n );\n const replacements = autolink.getCsReplacements();\n expect(replacements.csUsingNamespaces).toEqual('');\n expect(replacements.csReactPackageProviders).toEqual('');\n});\n\ntest('one valid cpp autolink dependency', () => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln'}},\n {\n superModule: {\n name: 'superModule',\n root: 'theRoot',\n platforms: {\n windows: {\n sourceDir: __dirname,\n projects: [\n {\n directDependency: true,\n projectFile: 'superModule.vcxproj',\n cppHeaders: ['Garfield.h', 'Snoopy.h'],\n cppPackageProviders: ['FamousAnimalCartoons'],\n },\n ],\n },\n },\n assets: [],\n hooks: {},\n params: [],\n },\n },\n {\n check: true,\n logging: false,\n proj: 'projects/WithWinUI3/windows/WithWinUI3/WithWinUI3.vcxproj',\n },\n );\n const replacements = autolink.getCppReplacements();\n expect(replacements.cppIncludes).toMatch(/#include <Garfield.h>/);\n expect(replacements.cppIncludes).toMatch(/#include <Snoopy.h>/);\n expect(replacements.cppPackageProviders).toContain(\n 'packageProviders.Append(winrt::FamousAnimalCartoons())',\n );\n});\n\ntest('one valid cs autolink dependency', () => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln'}},\n {\n superModule: {\n name: 'superModule',\n root: 'theRoot',\n platforms: {\n windows: {\n sourceDir: __dirname,\n projects: [\n {\n directDependency: true,\n csNamespaces: ['Garfield'],\n projectFile: 'superModule.vcxproj',\n cppHeaders: ['Garfield.h', 'Snoopy.h'],\n csPackageProviders: ['FamousAnimalCartoons'],\n },\n ],\n },\n },\n assets: [],\n hooks: {},\n params: [],\n },\n },\n {\n check: true,\n logging: false,\n proj: 'projects/SimpleCSharpApp/windows/SimpleCSharpApp/SimpleCSharpApp.csproj',\n },\n );\n const replacements = autolink.getCsReplacements();\n expect(replacements.csUsingNamespaces).toContain('using Garfield;');\n expect(replacements.csReactPackageProviders).toContain(\n 'packageProviders.Add(new FamousAnimalCartoons())',\n );\n});\n\ntest('ensureXAMLDialect - useWinUI3=true in react-native.config.js, useWinUI3=false in ExperimentalFeatures.props', async done => {\n const folder = path.resolve('src/e2etest/projects/WithWinUI3');\n\n // Create project with UseWinUI3 == false in ExperimentalFeatures.props\n await ensureCppAppProject(folder, 'WithWinUI3', false, false, false);\n\n const rnc = require(path.join(folder, 'react-native.config.js'));\n\n const config = projectConfigWindows(folder, rnc.project.windows)!;\n // Set useWinUI3=true in react-native.config.js\n config.useWinUI3 = true;\n\n const al = new AutolinkTest(\n {windows: config},\n {},\n {\n check: false,\n logging: false,\n },\n );\n al.experimentalFeaturesProps = `<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>`;\n al.packagesConfig = `<packages><package id=\"SuperPkg\" version=\"42\"/></packages>`;\n\n const exd = await al.ensureXAMLDialect();\n expect(exd).toBeTruthy();\n\n const expectedExperimentalFeatures =\n '<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>';\n expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);\n\n // example packages.config:\n // <packages>\n // <package id=\"SuperPkg\" version=\"42\"/>\n // <package id=\"Microsoft.WindowsAppSDK\" version=\"1.0.0\" targetFramework=\"native\"/>\n // </packages>\n //\n expect(al.packagesConfig).toContain('Microsoft.WindowsAppSDK');\n expect(al.packagesConfig).toContain('<package id=\"SuperPkg\" version=\"42\"/>');\n expect(al.packagesConfig).not.toContain('Microsoft.UI.Xaml');\n\n done();\n});\n\ntest('ensureXAMLDialect - useWinUI3=false in react-native.config.js, useWinUI3=true in ExperimentalFeatures.props', async done => {\n const folder = path.resolve('src/e2etest/projects/WithWinUI3');\n const rnc = require(path.join(folder, 'react-native.config.js'));\n\n const config = projectConfigWindows(folder, rnc.project.windows)!;\n config.useWinUI3 = false;\n const al = new AutolinkTest(\n {windows: config},\n {},\n {\n check: false,\n logging: false,\n },\n );\n al.experimentalFeaturesProps = `<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>`;\n al.packagesConfig = `<packages><package id=\"SuperPkg\" version=\"42\"/></packages>`;\n\n const exd = await al.ensureXAMLDialect();\n expect(exd).toBeTruthy();\n\n const expectedExperimentalFeatures =\n '<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>';\n expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);\n\n // example packages.config:\n // <packages>\n // <package id=\"SuperPkg\" version=\"42\"/>\n // <package id=\"Microsoft.WindowsAppSDK\" version=\"1.0.0\" targetFramework=\"native\"/>\n // </packages>\n //\n expect(al.packagesConfig).not.toContain('Microsoft.WindowsAppSDK');\n expect(al.packagesConfig).toContain('<package id=\"SuperPkg\" version=\"42\"/>');\n expect(al.packagesConfig).toContain('Microsoft.UI.Xaml');\n\n done();\n});\n\ntest('ensureXAMLDialect - useWinUI3 not in react-native.config.js, useWinUI3=true in ExperimentalFeatures.props', async done => {\n const folder = path.resolve('src/e2etest/projects/WithWinUI3');\n const rnc = require(path.join(folder, 'react-native.config.js'));\n\n const config = projectConfigWindows(folder, rnc.project.windows)!;\n delete config.useWinUI3;\n const al = new AutolinkTest(\n {windows: config},\n {},\n {\n check: false,\n logging: false,\n },\n );\n al.experimentalFeaturesProps = `<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>`;\n al.packagesConfig = `<packages><package id=\"SuperPkg\" version=\"42\"/></packages>`;\n\n const exd = await al.ensureXAMLDialect();\n expect(exd).toBeTruthy();\n\n const expectedExperimentalFeatures =\n '<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>true</UseWinUI3></PropertyGroup></Project>';\n expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);\n\n // example packages.config:\n // <packages>\n // <package id=\"SuperPkg\" version=\"42\"/>\n // <package id=\"Microsoft.WindowsAppSDK\" version=\"1.0.0\" targetFramework=\"native\"/>\n // </packages>\n //\n expect(al.packagesConfig).toContain('Microsoft.WindowsAppSDK');\n expect(al.packagesConfig).toContain('<package id=\"SuperPkg\" version=\"42\"/>');\n expect(al.packagesConfig).not.toContain('Microsoft.UI.Xaml');\n\n done();\n});\n\ntest('ensureXAMLDialect - useWinUI3 not in react-native.config.js, useWinUI3=false in ExperimentalFeatures.props', async done => {\n const folder = path.resolve('src/e2etest/projects/WithWinUI3');\n const rnc = require(path.join(folder, 'react-native.config.js'));\n\n const config = projectConfigWindows(folder, rnc.project.windows)!;\n delete config.useWinUI3;\n const al = new AutolinkTest(\n {windows: config},\n {},\n {\n check: false,\n logging: false,\n },\n );\n al.experimentalFeaturesProps = `<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>`;\n al.packagesConfig = `<packages><package id=\"SuperPkg\" version=\"42\"/><package id=\"Microsoft.WindowsAppSDK\"/></packages>`;\n\n const exd = await al.ensureXAMLDialect();\n expect(exd).toBeTruthy();\n\n const expectedExperimentalFeatures = `<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><UseWinUI3>false</UseWinUI3></PropertyGroup></Project>`;\n expect(al.experimentalFeaturesProps).toEqual(expectedExperimentalFeatures);\n\n // example packages.config:\n // <packages>\n // <package id=\"SuperPkg\" version=\"42\"/>\n // <package id=\"Microsoft.WindowsAppSDK\" version=\"1.0.0\" targetFramework=\"native\"/>\n // </packages>\n //\n expect(al.packagesConfig).not.toContain('Microsoft.WindowsAppSDK');\n expect(al.packagesConfig).toContain('<package id=\"SuperPkg\" version=\"42\"/>');\n expect(al.packagesConfig).toContain('Microsoft.UI.Xaml');\n\n done();\n});\n\ntest('Indirect autolink dependency', () => {\n const autolink = new AutolinkTest(\n {windows: {folder: __dirname, sourceDir: '.', solutionFile: 'foo.sln'}},\n {\n superModule: {\n name: 'superModule',\n root: 'theRoot',\n platforms: {\n windows: {\n sourceDir: __dirname,\n projects: [\n {\n directDependency: true,\n projectFile: 'superModule.vcxproj',\n cppHeaders: ['Garfield.h', 'Snoopy.h'],\n cppPackageProviders: ['FamousAnimalCartoons'],\n },\n {\n directDependency: false,\n projectFile: 'indirect.vcxproj',\n },\n ],\n },\n },\n assets: [],\n hooks: {},\n params: [],\n },\n },\n {\n check: true,\n logging: false,\n proj: 'projects/WithIndirectDependency/windows/WithIndirectDependency/WithIndirectDependency.vcxproj',\n },\n );\n const replacements = autolink.getCppReplacements();\n expect(replacements.cppIncludes).toMatch(/#include <Garfield.h>/);\n expect(replacements.cppIncludes).toMatch(/#include <Snoopy.h>/);\n expect(replacements.cppPackageProviders).toContain(\n 'packageProviders.Append(winrt::FamousAnimalCartoons())',\n );\n});\n\nfunction validateOptionName(\n name: string,\n optionName: keyof AutoLinkOptions,\n): boolean {\n // Do not add a default case here. Every item must explicitly return true\n switch (optionName) {\n case 'check':\n case 'logging':\n case 'sln':\n case 'proj':\n case 'telemetry':\n return true;\n }\n throw new Error(\n `Unable to find ${optionName} to match '${name}' in AutoLinkOptions.`,\n );\n}\n\ntest('autolinkOptions - validate options', () => {\n for (const commandOption of autolinkOptions) {\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 // 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 // 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 AutoLinkOptions\n const optionName = commanderNameToOptionName(commandOption.name);\n expect(\n validateOptionName(\n commandOption.name,\n optionName as keyof AutoLinkOptions,\n ),\n ).toBe(true);\n }\n});\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
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 path_1 = __importDefault(require("path"));
|
|
12
|
+
const dependencyConfig_1 = require("../config/dependencyConfig");
|
|
13
|
+
const projectConfig_utils_1 = require("./projectConfig.utils");
|
|
14
|
+
const generator_common_1 = require("../generator-common");
|
|
15
|
+
function project(name, setup) {
|
|
16
|
+
return [name, setup];
|
|
17
|
+
}
|
|
18
|
+
const projects = [
|
|
19
|
+
// Nothing but a react-native.config.js, with nulls
|
|
20
|
+
project('BlankLib'),
|
|
21
|
+
// Nothing but a windows folder
|
|
22
|
+
project('MissingProjectFilesLib', async (folder) => {
|
|
23
|
+
const windowsDir = path_1.default.join(folder, 'windows');
|
|
24
|
+
await (0, projectConfig_utils_1.tryMkdir)(windowsDir);
|
|
25
|
+
}),
|
|
26
|
+
// New C++ app project based on the template
|
|
27
|
+
project('SimpleCppApp', async (folder) => {
|
|
28
|
+
await (0, projectConfig_utils_1.ensureCppAppProject)(folder, 'SimpleCppApp');
|
|
29
|
+
}),
|
|
30
|
+
// New C++ project based on the template
|
|
31
|
+
project('SimpleCppLib', async (folder) => {
|
|
32
|
+
const windowsDir = path_1.default.join(folder, 'windows');
|
|
33
|
+
await (0, projectConfig_utils_1.tryMkdir)(windowsDir);
|
|
34
|
+
const replacements = {
|
|
35
|
+
name: 'SimpleCppLib',
|
|
36
|
+
namespace: 'SimpleCppLib',
|
|
37
|
+
useMustache: true,
|
|
38
|
+
projectGuidUpper: projectConfig_utils_1.testProjectGuid,
|
|
39
|
+
projectGuidLower: projectConfig_utils_1.testProjectGuid.toLowerCase(),
|
|
40
|
+
};
|
|
41
|
+
await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cpp-lib/proj/MyLib.sln'), path_1.default.join(windowsDir, 'SimpleCppLib.sln'), replacements, null);
|
|
42
|
+
const projDir = path_1.default.join(windowsDir, 'SimpleCppLib');
|
|
43
|
+
await (0, projectConfig_utils_1.tryMkdir)(projDir);
|
|
44
|
+
await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cpp-lib/proj/MyLib.vcxproj'), path_1.default.join(projDir, 'SimpleCppLib.vcxproj'), replacements, null);
|
|
45
|
+
}),
|
|
46
|
+
// New C# app project based on the template
|
|
47
|
+
project('SimpleCSharpApp', async (folder) => {
|
|
48
|
+
await (0, projectConfig_utils_1.ensureCSharpAppProject)(folder, 'SimpleCSharpApp');
|
|
49
|
+
}),
|
|
50
|
+
// New C# project based on the template
|
|
51
|
+
project('SimpleCSharpLib', async (folder) => {
|
|
52
|
+
const windowsDir = path_1.default.join(folder, 'windows');
|
|
53
|
+
await (0, projectConfig_utils_1.tryMkdir)(windowsDir);
|
|
54
|
+
const replacements = {
|
|
55
|
+
name: 'SimpleCSharpLib',
|
|
56
|
+
namespace: 'SimpleCSharpLib',
|
|
57
|
+
useMustache: true,
|
|
58
|
+
projectGuidUpper: projectConfig_utils_1.testProjectGuid,
|
|
59
|
+
projectGuidLower: projectConfig_utils_1.testProjectGuid.toLowerCase(),
|
|
60
|
+
};
|
|
61
|
+
await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cs-lib/proj/MyLib.sln'), path_1.default.join(windowsDir, 'SimpleCSharpLib.sln'), replacements, null);
|
|
62
|
+
const projDir = path_1.default.join(windowsDir, 'SimpleCSharpLib');
|
|
63
|
+
await (0, projectConfig_utils_1.tryMkdir)(projDir);
|
|
64
|
+
await (0, generator_common_1.copyAndReplace)(path_1.default.join(projectConfig_utils_1.templateRoot, 'cs-lib/proj/MyLib.csproj'), path_1.default.join(projDir, 'SimpleCSharpLib.csproj'), replacements, null);
|
|
65
|
+
}),
|
|
66
|
+
project('WithIndirectDependency'),
|
|
67
|
+
];
|
|
68
|
+
// Tests that given userConfig is null, the result will always be null
|
|
69
|
+
test.each(projects)('dependencyConfig - %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, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
// Tests the result given a windows project config in react-native.config.js
|
|
78
|
+
test.each(projects)('dependencyConfig - %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.dependency.platforms.windows;
|
|
85
|
+
if (name === 'BlankLib') {
|
|
86
|
+
expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot();
|
|
87
|
+
}
|
|
88
|
+
else if (name.endsWith('App')) {
|
|
89
|
+
expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
|
|
90
|
+
folder: expect.stringContaining(name),
|
|
91
|
+
projects: expect.arrayContaining([
|
|
92
|
+
expect.objectContaining({
|
|
93
|
+
projectFile: expect.stringMatching(/Error: .*\.(?:cs|vcx)proj is type '\w+'/),
|
|
94
|
+
}),
|
|
95
|
+
]),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
|
|
100
|
+
folder: expect.stringContaining(name),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// Tests the result of ignoring the windows project config in react-native.config.js
|
|
105
|
+
test.each(projects)('dependencyConfig - %s (Ignore react-native.config.js)', async (name, setup) => {
|
|
106
|
+
const folder = path_1.default.resolve('src/e2etest/projects/', name);
|
|
107
|
+
if (setup !== undefined) {
|
|
108
|
+
await setup(folder);
|
|
109
|
+
}
|
|
110
|
+
const userConfig = {};
|
|
111
|
+
if (name === 'BlankLib') {
|
|
112
|
+
expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot();
|
|
113
|
+
}
|
|
114
|
+
else if (name.endsWith('App')) {
|
|
115
|
+
expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
|
|
116
|
+
folder: expect.stringContaining(name),
|
|
117
|
+
projects: expect.arrayContaining([
|
|
118
|
+
expect.objectContaining({
|
|
119
|
+
projectFile: expect.stringMatching(/Error: .*\.(?:cs|vcx)proj is type '\w+'/),
|
|
120
|
+
}),
|
|
121
|
+
]),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
expect((0, dependencyConfig_1.dependencyConfigWindows)(folder, userConfig)).toMatchSnapshot({
|
|
126
|
+
folder: expect.stringContaining(name),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
//# 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 path from 'path';\n\nimport {\n dependencyConfigWindows,\n WindowsDependencyConfig,\n} from '../config/dependencyConfig';\n\nimport {\n ensureCppAppProject,\n ensureCSharpAppProject,\n tryMkdir,\n templateRoot,\n testProjectGuid,\n} from './projectConfig.utils';\n\nimport {copyAndReplace} from '../generator-common';\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 await ensureCppAppProject(folder, 'SimpleCppApp');\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 await ensureCSharpAppProject(folder, 'SimpleCSharpApp');\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"]}
|