Repository navigation
Expand file tree
/
Copy pathsourcemap-upload.test.ts
More file actions
136 lines (129 loc) · 4.42 KB
/
Copy pathsourcemap-upload.test.ts
File metadata and controls
136 lines (129 loc) · 4.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import * as NodeFS from "node:fs";
import * as NodeHttp from "node:http";
import type * as NodeNet from "node:net";
import * as NodeOS from "node:os";
import * as NodePath from "node:path";
import { afterEach, describe, expect, it } from "vite-plus/test";
import {
buildDsymUpload,
buildSourceMapUpload,
otaSourceMapUploads,
uploadSourceMap,
} from "./sourcemap-upload.mts";
const directories: Array<string> = [];
const tempDir = () => {
const dir = NodeFS.mkdtempSync(NodePath.join(NodeOS.tmpdir(), "sourcemap-upload-"));
directories.push(dir);
return dir;
};
const writeFile = (path: string, contents: string) => {
NodeFS.mkdirSync(NodePath.dirname(path), { recursive: true });
NodeFS.writeFileSync(path, contents);
};
afterEach(() => {
for (const dir of directories.splice(0)) NodeFS.rmSync(dir, { recursive: true, force: true });
});
describe("uploadSourceMap", () => {
it("PUTs each published update's map, only what the relay reads, under its update id", async () => {
const dist = tempDir();
writeFile(
NodePath.join(dist, "metadata.json"),
JSON.stringify({
fileMetadata: {
android: { bundle: "_expo/static/js/android/index-abc.hbc" },
ios: { bundle: "_expo/static/js/ios/index-def.hbc" },
},
}),
);
writeFile(
NodePath.join(dist, "eas-update-metadata.json"),
JSON.stringify({
updates: [
{ id: "update-android", platform: "android" },
{ id: "update-ios", platform: "ios" },
{ id: "update-web", platform: "web" },
],
}),
);
for (const platform of ["android", "ios"]) {
writeFile(
NodePath.join(
dist,
`_expo/static/js/${platform}/index-${platform === "ios" ? "def" : "abc"}.hbc.map`,
),
JSON.stringify({
version: 3,
sources: [`${platform}.ts`],
sourcesContent: ["secret"],
names: ["render"],
x_facebook_sources: [[null]],
mappings: "",
}),
);
}
const requests: Array<{ method?: string; url?: string; auth?: string; body: string }> = [];
const server = NodeHttp.createServer((request, response) => {
let body = "";
request.on("data", (chunk) => (body += chunk));
request.on("end", () => {
requests.push({
method: request.method,
url: request.url,
auth: request.headers.authorization,
body,
});
response.end();
});
});
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
try {
const address = server.address() as NodeNet.AddressInfo;
const credentials = {
endpoint: `http://127.0.0.1:${address.port}`,
bucketName: "maps",
accessKeyId: "key-id",
secretAccessKey: "secret-key",
};
for (const upload of otaSourceMapUploads(dist)) {
await uploadSourceMap(credentials, upload);
}
expect(requests).toEqual(
["android", "ios"].map((platform) => ({
method: "PUT",
url: `/maps/${platform}/ota/update-${platform}.map`,
auth: expect.stringMatching(/^AWS4-HMAC-SHA256 Credential=key-id\/\d{8}\/auto\/s3\//),
body: JSON.stringify({ version: 3, sources: [`${platform}.ts`], mappings: "" }),
})),
);
} finally {
server.close();
}
});
});
describe("buildSourceMapUpload", () => {
it("names the EAS build's embedded bundle map under its build id", () => {
const project = tempDir();
const androidMap = NodePath.join(
project,
"android/app/build/generated/sourcemaps/react/release/index.android.bundle.map",
);
writeFile(androidMap, "{}");
expect(
buildSourceMapUpload({ EAS_BUILD_PLATFORM: "android", EAS_BUILD_ID: "build-1" }, project),
).toEqual({ key: "android/build/build-1.map", path: androidMap });
expect(
buildSourceMapUpload(
{ EAS_BUILD_PLATFORM: "ios", EAS_BUILD_ID: "build-2", SOURCEMAP_FILE: "/tmp/main.map" },
project,
),
).toEqual({ key: "ios/build/build-2.map", path: "/tmp/main.map" });
});
it("names an iOS build's dSYMs under its build id", () => {
const project = tempDir();
const dsym = NodePath.join(project, "ios/build/T3Code.app.dSYM.zip");
writeFile(dsym, "zip");
expect(
buildDsymUpload({ EAS_BUILD_PLATFORM: "ios", EAS_BUILD_ID: "build-3" }, project),
).toEqual({ key: "ios/dsym/build-3.zip", path: dsym });
});
});