Skip to content

Commit e552990

Browse files
committed
move assets to .wapproj
1 parent 6e13d30 commit e552990

9 files changed

Lines changed: 313 additions & 141 deletions

File tree

packages/app/scripts/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ export type Assets = {
221221
assetItems: string;
222222
assetItemFilters: string;
223223
assetFilters: string;
224+
contentItems: string;
224225
};
225226

226227
export type AppManifest = {
@@ -245,6 +246,7 @@ export type AppxBundle = {
245246
assetItems: string;
246247
assetItemFilters: string;
247248
assetFilters: string;
249+
contentItems: string;
248250
packageCertificate: string;
249251
singleApp?: string;
250252
};

packages/app/test/windows/getBundleResources.test.mts

Lines changed: 125 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,100 @@ import { getBundleResources as getBundleResourcesActual } from "../../windows/pr
55
import { fs, setMockFiles } from "../fs.mock.mts";
66

77
describe("getBundleResources()", () => {
8-
const getBundleResources: typeof getBundleResourcesActual = (p) =>
9-
getBundleResourcesActual(p, fs);
8+
const getBundleResources: typeof getBundleResourcesActual = (p, opts) =>
9+
getBundleResourcesActual(p, opts, fs);
10+
11+
const legacyOpts = { useFabric: false };
12+
const newArchOpts = { useFabric: true };
1013

1114
afterEach(() => setMockFiles());
1215

13-
it("returns app name and bundle resources", () => {
16+
for (const opts of [legacyOpts, newArchOpts]) {
17+
const arch = opts.useFabric ? "new" : "old";
18+
19+
it(`returns package manifest (${arch} arch)`, () => {
20+
setMockFiles({
21+
"app.json": JSON.stringify({
22+
windows: {
23+
appxManifest: "windows/Example/Package.appxmanifest",
24+
},
25+
}),
26+
});
27+
28+
deepEqual(getBundleResources("app.json", opts), {
29+
appName: "ReactTestApp",
30+
singleApp: undefined,
31+
appxManifest: "windows\\Example\\Package.appxmanifest",
32+
assetItems: "",
33+
assetItemFilters: "",
34+
assetFilters: "",
35+
contentItems: "",
36+
packageCertificate: "",
37+
});
38+
});
39+
40+
it(`handles missing manifest (${arch} arch)`, (t) => {
41+
const warnMock = t.mock.method(console, "warn", () => null);
42+
43+
deepEqual(getBundleResources("", opts), {
44+
appName: "ReactTestApp",
45+
appxManifest: "windows/Package.appxmanifest",
46+
assetItems: "",
47+
assetItemFilters: "",
48+
assetFilters: "",
49+
contentItems: "",
50+
packageCertificate: "",
51+
});
52+
53+
equal(
54+
warnMock.mock.calls[0].arguments[1],
55+
"Could not find 'app.json' file."
56+
);
57+
});
58+
59+
it(`handles invalid manifest (${arch} arch)`, (t) => {
60+
const warnMock = t.mock.method(console, "warn", () => null);
61+
setMockFiles({ "app.json": "-" });
62+
63+
deepEqual(getBundleResources("app.json", opts), {
64+
appName: "ReactTestApp",
65+
appxManifest: "windows/Package.appxmanifest",
66+
assetItems: "",
67+
assetItemFilters: "",
68+
assetFilters: "",
69+
contentItems: "",
70+
packageCertificate: "",
71+
});
72+
73+
match(
74+
warnMock.mock.calls[0].arguments[1],
75+
/^Could not parse 'app.json':\n/
76+
);
77+
});
78+
79+
it(`returns package certificate (${arch} arch)`, () => {
80+
setMockFiles({
81+
"app.json": JSON.stringify({
82+
windows: {
83+
certificateKeyFile: "windows/ReactTestApp_TemporaryKey.pfx",
84+
certificateThumbprint: "thumbprint",
85+
certificatePassword: "password",
86+
},
87+
}),
88+
});
89+
90+
const { packageCertificate } = getBundleResources("app.json", opts);
91+
equal(
92+
packageCertificate,
93+
`<AppxPackageSigningEnabled>true</AppxPackageSigningEnabled>
94+
<PackageCertificateKeyFile>$(ProjectRootDir)\\windows\\ReactTestApp_TemporaryKey.pfx</PackageCertificateKeyFile>
95+
<PackageCertificateThumbprint>thumbprint</PackageCertificateThumbprint>
96+
<PackageCertificatePassword>password</PackageCertificatePassword>`
97+
);
98+
});
99+
}
100+
101+
it("returns app name and bundle resources (old arch)", () => {
14102
const assets = path.join("dist", "assets");
15103
const bundle = path.join("dist", "main.bundle");
16104
setMockFiles({
@@ -28,17 +116,18 @@ describe("getBundleResources()", () => {
28116
assetItems,
29117
assetItemFilters,
30118
assetFilters,
31-
} = getBundleResources("app.json");
119+
contentItems,
120+
} = getBundleResources("app.json", legacyOpts);
32121

33122
equal(appName, "Example");
34123
equal(appxManifest, "windows\\Package.appxmanifest");
35124
equal(
36125
assetItems,
37126
`<CopyFileToFolders Include="$(ProjectRootDir)\\dist\\assets\\app.json">
38-
<DestinationFolders>$(BundleDir)\\assets</DestinationFolders>
127+
<DestinationFolders>$(OutDir)\\Bundle\\assets</DestinationFolders>
39128
</CopyFileToFolders>
40129
<CopyFileToFolders Include="$(ProjectRootDir)\\dist\\main.bundle">
41-
<DestinationFolders>$(BundleDir)</DestinationFolders>
130+
<DestinationFolders>$(OutDir)\\Bundle</DestinationFolders>
42131
</CopyFileToFolders>`
43132
);
44133
equal(
@@ -54,83 +143,45 @@ describe("getBundleResources()", () => {
54143
assetFilters,
55144
/^<Filter Include="Assets\\assets">\s+<UniqueIdentifier>{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}<\/UniqueIdentifier>\s+<\/Filter>$/
56145
);
146+
equal(contentItems, "");
57147
});
58148

59-
it("returns package manifest", () => {
149+
it("returns app name and bundle resources (new arch)", () => {
150+
const assets = path.join("dist", "assets");
151+
const bundle = path.join("dist", "main.bundle");
60152
setMockFiles({
61153
"app.json": JSON.stringify({
62-
windows: {
63-
appxManifest: "windows/Example/Package.appxmanifest",
64-
},
154+
name: "Example",
155+
resources: [assets, bundle],
65156
}),
157+
[path.join(assets, "app.json")]: "{}",
158+
[bundle]: "'use strict';",
66159
});
67160

68-
deepEqual(getBundleResources("app.json"), {
69-
appName: "ReactTestApp",
70-
singleApp: undefined,
71-
appxManifest: "windows\\Example\\Package.appxmanifest",
72-
assetItems: "",
73-
assetItemFilters: "",
74-
assetFilters: "",
75-
packageCertificate: "",
76-
});
77-
});
78-
79-
it("handles missing manifest", (t) => {
80-
const warnMock = t.mock.method(console, "warn", () => null);
81-
82-
deepEqual(getBundleResources(""), {
83-
appName: "ReactTestApp",
84-
appxManifest: "windows/Package.appxmanifest",
85-
assetItems: "",
86-
assetItemFilters: "",
87-
assetFilters: "",
88-
packageCertificate: "",
89-
});
90-
91-
equal(
92-
warnMock.mock.calls[0].arguments[1],
93-
"Could not find 'app.json' file."
94-
);
95-
});
96-
97-
it("handles invalid manifest", (t) => {
98-
const warnMock = t.mock.method(console, "warn", () => null);
99-
setMockFiles({ "app.json": "-" });
100-
101-
deepEqual(getBundleResources("app.json"), {
102-
appName: "ReactTestApp",
103-
appxManifest: "windows/Package.appxmanifest",
104-
assetItems: "",
105-
assetItemFilters: "",
106-
assetFilters: "",
107-
packageCertificate: "",
108-
});
109-
110-
match(
111-
warnMock.mock.calls[0].arguments[1],
112-
/^Could not parse 'app.json':\n/
113-
);
114-
});
115-
116-
it("returns package certificate", () => {
117-
setMockFiles({
118-
"app.json": JSON.stringify({
119-
windows: {
120-
certificateKeyFile: "windows/ReactTestApp_TemporaryKey.pfx",
121-
certificateThumbprint: "thumbprint",
122-
certificatePassword: "password",
123-
},
124-
}),
125-
});
161+
const {
162+
appName,
163+
appxManifest,
164+
assetItems,
165+
assetItemFilters,
166+
assetFilters,
167+
contentItems,
168+
} = getBundleResources("app.json", newArchOpts);
126169

127-
const { packageCertificate } = getBundleResources("app.json");
170+
equal(appName, "Example");
171+
equal(appxManifest, "windows\\Package.appxmanifest");
172+
equal(assetItems, "");
173+
equal(assetItemFilters, "");
174+
equal(assetFilters, "");
128175
equal(
129-
packageCertificate,
130-
`<AppxPackageSigningEnabled>true</AppxPackageSigningEnabled>
131-
<PackageCertificateKeyFile>$(ProjectRootDir)\\windows\\ReactTestApp_TemporaryKey.pfx</PackageCertificateKeyFile>
132-
<PackageCertificateThumbprint>thumbprint</PackageCertificateThumbprint>
133-
<PackageCertificatePassword>password</PackageCertificatePassword>`
176+
contentItems,
177+
`<Content Include="$(ProjectRootDir)\\dist\\assets\\app.json">
178+
<Link>Bundle\\assets\\app.json</Link>
179+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
180+
</Content>
181+
<Content Include="$(ProjectRootDir)\\dist\\main.bundle">
182+
<Link>Bundle\\main.bundle</Link>
183+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
184+
</Content>`
134185
);
135186
});
136187
});

packages/app/test/windows/parseResources.test.mts

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,69 @@ import { parseResources as parseResourcesActual } from "../../windows/project.mj
44
import { fs, setMockFiles } from "../fs.mock.mts";
55

66
describe("parseResources()", () => {
7-
const parseResources: typeof parseResourcesActual = (r, p) =>
8-
parseResourcesActual(r, p, fs);
7+
const parseResources: typeof parseResourcesActual = (r, p, opts) =>
8+
parseResourcesActual(r, p, opts, fs);
99

10-
const empty = { assetFilters: "", assetItemFilters: "", assetItems: "" };
10+
const empty = {
11+
assetFilters: "",
12+
assetItemFilters: "",
13+
assetItems: "",
14+
contentItems: "",
15+
};
16+
17+
const legacyOpts = { useFabric: false };
18+
const newArchOpts = { useFabric: true };
1119

1220
afterEach(() => setMockFiles());
1321

14-
it("returns empty strings for no resources", () => {
15-
deepEqual(parseResources(undefined, ""), empty);
16-
deepEqual(parseResources([], ""), empty);
17-
deepEqual(parseResources({}, ""), empty);
18-
deepEqual(parseResources({ windows: [] }, ""), empty);
19-
});
22+
for (const opts of [legacyOpts, newArchOpts]) {
23+
const arch = opts.useFabric ? "new" : "old";
24+
25+
it(`returns empty strings for no resources (${arch} arch)`, () => {
26+
deepEqual(parseResources(undefined, "", opts), empty);
27+
deepEqual(parseResources([], "", opts), empty);
28+
deepEqual(parseResources({}, "", opts), empty);
29+
deepEqual(parseResources({ windows: [] }, "", opts), empty);
30+
});
31+
32+
it(`skips missing assets (${arch} arch)`, (t) => {
33+
const warnMock = t.mock.method(console, "warn", () => null);
34+
35+
const resources = ["dist/assets", "dist/main.bundle"];
36+
37+
deepEqual(parseResources(resources, ".", opts), empty);
38+
39+
equal(
40+
warnMock.mock.calls[0].arguments[1],
41+
"Resource not found: dist/assets"
42+
);
43+
equal(
44+
warnMock.mock.calls[1].arguments[1],
45+
"Resource not found: dist/main.bundle"
46+
);
47+
});
48+
}
2049

21-
it("returns references to existing assets", () => {
50+
it("returns references to existing assets (old arch)", () => {
2251
setMockFiles({
2352
"dist/assets/node_modules/arnold/portrait.png": "{}",
2453
"dist/assets/splash.png": "{}",
2554
"dist/main.jsbundle": "'use strict';",
2655
});
2756

28-
const { assetItems, assetItemFilters, assetFilters } = parseResources(
29-
["dist/assets", "dist/main.jsbundle"],
30-
"."
31-
);
57+
const { assetItems, assetItemFilters, assetFilters, contentItems } =
58+
parseResources(["dist/assets", "dist/main.jsbundle"], ".", legacyOpts);
59+
3260
equal(
3361
assetItems,
3462
`<CopyFileToFolders Include="$(ProjectRootDir)\\dist\\assets\\node_modules\\arnold\\portrait.png">
35-
<DestinationFolders>$(BundleDir)\\assets\\node_modules\\arnold</DestinationFolders>
63+
<DestinationFolders>$(OutDir)\\Bundle\\assets\\node_modules\\arnold</DestinationFolders>
3664
</CopyFileToFolders>
3765
<CopyFileToFolders Include="$(ProjectRootDir)\\dist\\assets\\splash.png">
38-
<DestinationFolders>$(BundleDir)\\assets</DestinationFolders>
66+
<DestinationFolders>$(OutDir)\\Bundle\\assets</DestinationFolders>
3967
</CopyFileToFolders>
4068
<CopyFileToFolders Include="$(ProjectRootDir)\\dist\\main.jsbundle">
41-
<DestinationFolders>$(BundleDir)</DestinationFolders>
69+
<DestinationFolders>$(OutDir)\\Bundle</DestinationFolders>
4270
</CopyFileToFolders>`
4371
);
4472
equal(
@@ -57,20 +85,36 @@ describe("parseResources()", () => {
5785
assetFilters,
5886
/^<Filter Include="Assets\\assets">\s+<UniqueIdentifier>{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}<\/UniqueIdentifier>\s+<\/Filter>\s+<Filter Include="Assets\\assets\\node_modules">\s+<UniqueIdentifier>{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}<\/UniqueIdentifier>\s+<\/Filter>\s+<Filter Include="Assets\\assets\\node_modules\\arnold">\s+<UniqueIdentifier>{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}<\/UniqueIdentifier>\s+<\/Filter>$/
5987
);
88+
equal(contentItems, "");
6089
});
6190

62-
it("skips missing assets", (t) => {
63-
const warnMock = t.mock.method(console, "warn", () => null);
91+
it("returns references to existing assets (new arch)", () => {
92+
setMockFiles({
93+
"dist/assets/node_modules/arnold/portrait.png": "{}",
94+
"dist/assets/splash.png": "{}",
95+
"dist/main.jsbundle": "'use strict';",
96+
});
6497

65-
deepEqual(parseResources(["dist/assets", "dist/main.bundle"], "."), empty);
98+
const { assetItems, assetItemFilters, assetFilters, contentItems } =
99+
parseResources(["dist/assets", "dist/main.jsbundle"], ".", newArchOpts);
66100

101+
equal(assetItems, "");
102+
equal(assetItemFilters, "");
103+
equal(assetFilters, "");
67104
equal(
68-
warnMock.mock.calls[0].arguments[1],
69-
"Resource not found: dist/assets"
70-
);
71-
equal(
72-
warnMock.mock.calls[1].arguments[1],
73-
"Resource not found: dist/main.bundle"
105+
contentItems,
106+
`<Content Include="$(ProjectRootDir)\\dist\\assets\\node_modules\\arnold\\portrait.png">
107+
<Link>Bundle\\assets\\node_modules\\arnold\\portrait.png</Link>
108+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
109+
</Content>
110+
<Content Include="$(ProjectRootDir)\\dist\\assets\\splash.png">
111+
<Link>Bundle\\assets\\splash.png</Link>
112+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
113+
</Content>
114+
<Content Include="$(ProjectRootDir)\\dist\\main.jsbundle">
115+
<Link>Bundle\\main.jsbundle</Link>
116+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
117+
</Content>`
74118
);
75119
});
76120
});

0 commit comments

Comments
 (0)