Skip to content

Commit 393b827

Browse files
committed
Add support for monorepo to e2e suite utilities
1 parent f7c26d3 commit 393b827

File tree

2 files changed

+70
-34
lines changed

2 files changed

+70
-34
lines changed

packages/cli-v3/e2e/fixtures.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export interface TestCase {
22
resolveEnv?: { [key: string]: string };
33
id: string;
4-
rootDir?: string;
4+
workspaceRelativeDir?: string;
55
skipTypecheck?: boolean;
66
wantConfigNotFoundError?: boolean;
77
wantConfigInvalidError?: boolean;
@@ -15,7 +15,7 @@ export const fixturesConfig: TestCase[] = [
1515
{
1616
id: "compile-monorepo-packages",
1717
skipTypecheck: true,
18-
rootDir: "packages/trigger",
18+
workspaceRelativeDir: "packages/trigger",
1919
// TODO remove
2020
wantInstallationError: true,
2121
},

packages/cli-v3/e2e/index.test.ts

Lines changed: 68 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ import { handleDependencies } from "./handleDependencies";
1919
import { E2EOptions, E2EOptionsSchema } from "./schemas";
2020
import { fixturesConfig, TestCase } from "./fixtures.config";
2121
import { Metafile, OutputFile } from "esbuild";
22+
import { findUp, findUpMultiple } from "find-up";
2223

2324
interface E2EFixtureTest extends TestCase {
24-
dir: string;
25+
fixtureDir: string;
2526
packageManager: PackageManager;
2627
tempDir: string;
28+
workspaceDir: string;
2729
}
2830

2931
const TIMEOUT = 120_000;
@@ -49,31 +51,40 @@ logger.loggerLevel = options.logLevel;
4951

5052
if (testCases.length > 0) {
5153
describe.concurrent("bundling", async () => {
52-
beforeEach<E2EFixtureTest>(async ({ dir, packageManager }) => {
53-
await rimraf(join(dir, "**/node_modules"), {
54+
beforeEach<E2EFixtureTest>(async ({ fixtureDir, packageManager, workspaceDir }) => {
55+
await rimraf(join(workspaceDir, "**/node_modules"), {
5456
glob: true,
5557
});
56-
await rimraf(join(dir, ".yarn"), { glob: true });
58+
await rimraf(join(workspaceDir, ".yarn"), { glob: true });
5759
if (
5860
packageManager === "npm" &&
59-
(existsSync(resolve(join(dir, "yarn.lock"))) ||
60-
existsSync(resolve(join(dir, "yarn.lock.copy"))))
61+
(existsSync(resolve(join(workspaceDir, "yarn.lock"))) ||
62+
existsSync(resolve(join(workspaceDir, "yarn.lock.copy"))))
6163
) {
6264
// `npm ci` & `npm install` will update an existing yarn.lock
6365
try {
64-
await rename(resolve(join(dir, "yarn.lock")), resolve(join(dir, "yarn.lock.copy")));
66+
await rename(
67+
resolve(join(workspaceDir, "yarn.lock")),
68+
resolve(join(workspaceDir, "yarn.lock.copy"))
69+
);
6570
} catch (e) {
66-
await rename(resolve(join(dir, "yarn.lock.copy")), resolve(join(dir, "yarn.lock")));
71+
await rename(
72+
resolve(join(workspaceDir, "yarn.lock.copy")),
73+
resolve(join(workspaceDir, "yarn.lock"))
74+
);
6775
}
6876
}
6977

70-
await installFixtureDeps(dir, packageManager);
78+
await installFixtureDeps({ fixtureDir, packageManager, workspaceDir });
7179
}, TIMEOUT);
7280

73-
afterEach<E2EFixtureTest>(async ({ dir, packageManager }) => {
81+
afterEach<E2EFixtureTest>(async ({ packageManager, workspaceDir }) => {
7482
if (packageManager === "npm") {
7583
try {
76-
await rename(resolve(join(dir, "yarn.lock.copy")), resolve(join(dir, "yarn.lock")));
84+
await rename(
85+
resolve(join(workspaceDir, "yarn.lock.copy")),
86+
resolve(join(workspaceDir, "yarn.lock"))
87+
);
7788
} catch {}
7889
}
7990

@@ -83,22 +94,25 @@ if (testCases.length > 0) {
8394
for (let testCase of testCases) {
8495
test.extend<E2EFixtureTest>({
8596
...testCase,
86-
dir: async ({ id, rootDir = "" }, use) =>
87-
await use(resolve(join(process.cwd(), "e2e/fixtures", id, rootDir))),
88-
packageManager: async ({ dir }, use) => await use(await parsePackageManager(options, dir)),
89-
tempDir: async ({ dir }, use) => {
90-
const existingTempDir = resolve(join(dir, ".trigger"));
97+
fixtureDir: async ({ id }, use) =>
98+
await use(resolve(join(process.cwd(), "e2e/fixtures", id))),
99+
workspaceDir: async ({ fixtureDir, workspaceRelativeDir = "" }, use) =>
100+
await use(resolve(join(fixtureDir, workspaceRelativeDir))),
101+
packageManager: async ({ workspaceDir }, use) =>
102+
await use(await parsePackageManager(options, workspaceDir)),
103+
tempDir: async ({ workspaceDir }, use) => {
104+
const existingTempDir = resolve(join(workspaceDir, ".trigger"));
91105

92106
if (existsSync(existingTempDir)) {
93107
await rm(existingTempDir, { force: true, recursive: true });
94108
}
95-
await use((await mkdir(join(dir, ".trigger"), { recursive: true })) as string);
109+
await use((await mkdir(join(workspaceDir, ".trigger"), { recursive: true })) as string);
96110
},
97111
})(
98112
`fixture '${testCase.id}'`,
99113
{ timeout: TIMEOUT },
100114
async ({
101-
dir,
115+
fixtureDir,
102116
packageManager,
103117
resolveEnv,
104118
skip,
@@ -110,18 +124,19 @@ if (testCases.length > 0) {
110124
wantDependenciesError,
111125
wantInstallationError,
112126
wantWorkerError,
127+
workspaceDir,
113128
}) => {
114-
// if (
115-
// options.packageManager &&
116-
// !existsSync(resolve(dir, LOCKFILES[options.packageManager]))
117-
// ) {
118-
// skip();
119-
// }
129+
if (
130+
options.packageManager &&
131+
!existsSync(resolve(fixtureDir, LOCKFILES[options.packageManager]))
132+
) {
133+
skip();
134+
}
120135

121136
let resolvedConfig: ReadConfigResult;
122137
const configExpect = expect(
123138
(async () => {
124-
resolvedConfig = await readConfig(dir, { cwd: dir });
139+
resolvedConfig = await readConfig(workspaceDir, { cwd: workspaceDir });
125140
})(),
126141
wantConfigNotFoundError || wantConfigInvalidError
127142
? "does not resolve config"
@@ -289,27 +304,48 @@ function debug(message: string) {
289304
}
290305
}
291306

292-
async function installFixtureDeps(dir: string, packageManager: PackageManager) {
307+
async function installFixtureDeps(options: {
308+
fixtureDir: string;
309+
packageManager: PackageManager;
310+
workspaceDir: string;
311+
}) {
312+
const { packageManager, workspaceDir } = options;
293313
if (["pnpm", "yarn"].includes(packageManager)) {
294-
const buffer = readFileSync(resolve(join(dir, "package.json")), "utf8");
295-
const pkgJSON = JSON.parse(buffer.toString());
296-
const version = pkgJSON.engines[packageManager];
314+
const version = await detectPackageManagerVersion(options);
297315
debug(`Detected ${packageManager}@${version} from package.json 'engines' field`);
298316
const { stdout, stderr } = await execa("corepack", ["use", `${packageManager}@${version}`], {
299-
cwd: dir,
317+
cwd: workspaceDir,
300318
});
301319
debug(stdout);
302320
if (stderr) console.error(stderr);
303321
} else {
304322
const { stdout, stderr } = await execa(packageManager, installArgs(packageManager), {
305-
cwd: dir,
306-
NODE_PATH: resolve(join(dir, "node_modules")),
323+
cwd: workspaceDir,
324+
NODE_PATH: resolve(join(workspaceDir, "node_modules")),
307325
});
308326
debug(stdout);
309327
if (stderr) console.error(stderr);
310328
}
311329
}
312330

331+
async function detectPackageManagerVersion(options: {
332+
fixtureDir: string;
333+
packageManager: PackageManager;
334+
workspaceDir: string;
335+
}): Promise<string> {
336+
const { fixtureDir, packageManager, workspaceDir } = options;
337+
const pkgPaths = await findUpMultiple("package.json", { cwd: workspaceDir, stopAt: fixtureDir });
338+
for (let pkgPath of pkgPaths) {
339+
const buffer = readFileSync(pkgPath, "utf8");
340+
const pkgJSON = JSON.parse(buffer.toString());
341+
if (!pkgJSON.engines) continue;
342+
const version = pkgJSON.engines[packageManager];
343+
if (version) return version;
344+
}
345+
346+
throw new Error(`No version found for package manager ${packageManager}`);
347+
}
348+
313349
function installArgs(packageManager: string) {
314350
switch (packageManager) {
315351
case "bun":

0 commit comments

Comments
 (0)