7481ffda02
* `create-astro`: always create `tsconfig.json` Currently, we only make sure `tsconfig.json` exists when `strict` or `strictest` is selected. Both `default` & `optout` are intended to correspond to `base` -- and will do so for all [23 official templates](https://github.com/withastro/astro/tree/main/examples), but not necessarily for third-party templates. The [example command for installing a third-party template](https://github.com/withastro/astro/blob/a800bf7/packages/create-astro/README.md?plain=1#L31-L35) is (rather conveniently for the sake of this PR!) an example of a template without a `tsconfig.json` file, and installing it with the `default` ("Relaxed") Typescript option results in no `tsconfig.json` file, rather than a `tsconfig.json` file containing `{ "extends": "astro/tsconfigs/base" }` as would be expected. This PR addresses this scenario. It also explicitly sets the `tsconfig.json` file to `{ "extends": "astro/tsconfigs/base" }` when `default` (which I renamed to `base`, still presented to the user as "Relaxed") or `optout` is selected (`optout` has always printed a warning about the importance of `tsconfig.json` & `src/env.d.ts` but otherwise behaved identically to `default`). This is necessary in two scenarios: 1. When the `tsconfig.json` file was created by this script. 2. When it either didn't already include `"extends"`, or it extended a different config by default. For example, some third-party templates might default to `strict`, in which case I'm guessing we'd want to respect the user's choice and change that to `base`. * update `del` 6.1.1 --> 7.0.0 * test: prevent excess writes (without this it triggers many times) * test: create-astro typescript prompt * changeset * fix: recursive `mkdirSync` * test: longer timeout for `windows-latest` OS (see if this fixes failing tests) * better glob path creation, don't hardcode `/` * test: longer timeout for windows-latest OS (since I'm about to trigger another CI run by pushing a commit, might as well try this too) * create-astro test: show last CLI output on timeout * drop variable timeout Typescript tests are slower than directory tests, but they are all usually less than 5000 ms. Less complexity, easier to maintain. * DRY new error output * Update lockfile * Sync lockfile with main * Update lockfile Co-authored-by: Princesseuh <princssdev@gmail.com>
51 lines
1.3 KiB
JavaScript
51 lines
1.3 KiB
JavaScript
import { execa } from 'execa';
|
|
import { dirname } from 'path';
|
|
import stripAnsi from 'strip-ansi';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
export const testDir = dirname(__filename);
|
|
export const timeout = 5000;
|
|
|
|
const timeoutError = function (details) {
|
|
let errorMsg =
|
|
'Timed out waiting for create-astro to respond with expected output.';
|
|
if (details) {
|
|
errorMsg += '\nLast output: "' + details + '"';
|
|
}
|
|
return new Error(errorMsg);
|
|
}
|
|
|
|
export function promiseWithTimeout(testFn) {
|
|
return new Promise((resolve, reject) => {
|
|
let lastStdout;
|
|
function onStdout (chunk) {
|
|
lastStdout = stripAnsi(chunk.toString()).trim() || lastStdout;
|
|
}
|
|
|
|
const timeoutEvent = setTimeout(() => {
|
|
reject(timeoutError(lastStdout));
|
|
}, timeout);
|
|
function resolver() {
|
|
clearTimeout(timeoutEvent);
|
|
resolve();
|
|
}
|
|
|
|
testFn(resolver, onStdout);
|
|
});
|
|
}
|
|
|
|
export const PROMPT_MESSAGES = {
|
|
directory: 'Where would you like to create your new project?',
|
|
template: 'Which template would you like to use?',
|
|
typescript: 'How would you like to setup TypeScript?',
|
|
typescriptSucceed: 'Next steps'
|
|
};
|
|
|
|
export function setup(args = []) {
|
|
const { stdout, stdin } = execa('../create-astro.mjs', [...args, '--dryrun'], { cwd: testDir });
|
|
return {
|
|
stdin,
|
|
stdout,
|
|
};
|
|
}
|