Fixes a couple of issues with config files in websnacks projects. First, config files are no longer required and the dev and build commands will no longer error out if a websnacks.ts/js file doesn't exist. Second, all optional user config params are now actually optional - before some parameters were assumed to exist and would error out if not present (e.g. the "watch" parameter). Finally, e2e tests were added to prevent regressions on these issues and test helpers were extracted to a separate file.
131 lines
4.6 KiB
TypeScript
131 lines
4.6 KiB
TypeScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
import { promises as fs } from "fs";
|
|
import * as path from "path";
|
|
|
|
import {
|
|
runCommand, wait, WEBSNACKS_BIN_PATH, WEBSNACKS_REPO_ROOT, withTempDir
|
|
} from "../helpers/e2e";
|
|
import { testSuite } from "../lib";
|
|
|
|
testSuite("dev command", ({ test, expect }) => {
|
|
test("starts without throwing error", async () => {
|
|
await withTempDir(async (tempDirPath) => {
|
|
await fs.writeFile(
|
|
path.join(tempDirPath, "tsconfig.json"),
|
|
JSON.stringify({
|
|
compilerOptions: {
|
|
esModuleInterop: true,
|
|
module: "CommonJS",
|
|
moduleResolution: "node",
|
|
jsx: "react",
|
|
jsxFactory: "createElement",
|
|
target: "ES2018",
|
|
lib: ["ES2018"],
|
|
strict: true,
|
|
noUnusedLocals: true,
|
|
noUnusedParameters: true,
|
|
noImplicitReturns: true,
|
|
noFallthroughCasesInSwitch: true,
|
|
},
|
|
include: ["components/**/*", "pages/**/*"],
|
|
}),
|
|
{
|
|
encoding: "utf8",
|
|
}
|
|
);
|
|
await fs.writeFile(
|
|
path.join(tempDirPath, "websnacks.ts"),
|
|
`
|
|
import { Config } from "${WEBSNACKS_REPO_ROOT}";
|
|
const config: Config = {
|
|
watch: [],
|
|
};
|
|
export = config;
|
|
`,
|
|
{
|
|
encoding: "utf8",
|
|
}
|
|
);
|
|
const pagesPath = path.join(tempDirPath, "pages");
|
|
await fs.mkdir(pagesPath);
|
|
await fs.writeFile(
|
|
path.join(pagesPath, "index.tsx"),
|
|
`
|
|
import { createElement } from "${WEBSNACKS_REPO_ROOT}";
|
|
export const page = () => <html />;
|
|
`,
|
|
{
|
|
encoding: "utf8",
|
|
}
|
|
);
|
|
const cmd = runCommand(
|
|
"node",
|
|
[WEBSNACKS_BIN_PATH, "-r", "ts-node/register", "dev"],
|
|
{
|
|
cwd: tempDirPath,
|
|
}
|
|
);
|
|
// FIXME: This test is a bit brittle due to relying on timeouts.
|
|
await wait(10_000);
|
|
cmd.process.kill();
|
|
const stdout = await cmd.complete;
|
|
expect(stdout).toStartWith("Listening at");
|
|
});
|
|
});
|
|
|
|
test("works without config file", async () => {
|
|
await withTempDir(async (tempDirPath) => {
|
|
await fs.writeFile(
|
|
path.join(tempDirPath, "tsconfig.json"),
|
|
JSON.stringify({
|
|
compilerOptions: {
|
|
esModuleInterop: true,
|
|
module: "CommonJS",
|
|
moduleResolution: "node",
|
|
jsx: "react",
|
|
jsxFactory: "createElement",
|
|
target: "ES2018",
|
|
lib: ["ES2018"],
|
|
strict: true,
|
|
noUnusedLocals: true,
|
|
noUnusedParameters: true,
|
|
noImplicitReturns: true,
|
|
noFallthroughCasesInSwitch: true,
|
|
},
|
|
include: ["components/**/*", "pages/**/*"],
|
|
}),
|
|
{
|
|
encoding: "utf8",
|
|
}
|
|
);
|
|
const pagesPath = path.join(tempDirPath, "pages");
|
|
await fs.mkdir(pagesPath);
|
|
await fs.writeFile(
|
|
path.join(pagesPath, "index.tsx"),
|
|
`
|
|
import { createElement } from "${WEBSNACKS_REPO_ROOT}";
|
|
export const page = () => <html />;
|
|
`,
|
|
{
|
|
encoding: "utf8",
|
|
}
|
|
);
|
|
const cmd = runCommand(
|
|
"node",
|
|
[WEBSNACKS_BIN_PATH, "-r", "ts-node/register", "dev"],
|
|
{
|
|
cwd: tempDirPath,
|
|
}
|
|
);
|
|
// FIXME: This test is a bit brittle due to relying on timeouts.
|
|
await wait(10_000);
|
|
cmd.process.kill();
|
|
const stdout = await cmd.complete;
|
|
expect(stdout).toStartWith("Listening at");
|
|
});
|
|
});
|
|
});
|