2023-10-23 17:14:33 -05:00
|
|
|
import fs from 'node:fs';
|
2023-02-06 11:19:37 -05:00
|
|
|
import { setStdout } from '../dist/index.js';
|
`create-astro`: always create `tsconfig.json` (#4810)
* `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>
2022-09-22 13:37:01 -05:00
|
|
|
import stripAnsi from 'strip-ansi';
|
2022-04-26 10:24:24 -05:00
|
|
|
|
2023-02-06 11:19:37 -05:00
|
|
|
export function setup() {
|
|
|
|
const ctx = { messages: [] };
|
|
|
|
before(() => {
|
2023-02-06 11:21:48 -05:00
|
|
|
setStdout(
|
|
|
|
Object.assign({}, process.stdout, {
|
|
|
|
write(buf) {
|
|
|
|
ctx.messages.push(stripAnsi(String(buf)).trim());
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
})
|
|
|
|
);
|
2022-04-26 10:24:24 -05:00
|
|
|
});
|
2023-02-06 11:19:37 -05:00
|
|
|
beforeEach(() => {
|
|
|
|
ctx.messages = [];
|
2023-02-06 11:21:48 -05:00
|
|
|
});
|
2022-04-26 10:24:24 -05:00
|
|
|
|
|
|
|
return {
|
2023-02-06 11:19:37 -05:00
|
|
|
messages() {
|
2023-02-06 11:21:48 -05:00
|
|
|
return ctx.messages;
|
2023-02-06 11:19:37 -05:00
|
|
|
},
|
|
|
|
length() {
|
2023-02-06 11:21:48 -05:00
|
|
|
return ctx.messages.length;
|
2023-02-06 11:19:37 -05:00
|
|
|
},
|
|
|
|
hasMessage(content) {
|
2023-02-06 11:21:48 -05:00
|
|
|
return !!ctx.messages.find((msg) => msg.includes(content));
|
|
|
|
},
|
2022-04-26 10:24:24 -05:00
|
|
|
};
|
|
|
|
}
|
2023-10-23 17:14:33 -05:00
|
|
|
|
|
|
|
const resetEmptyFixture = () =>
|
|
|
|
fs.promises.rm(new URL('./fixtures/empty/tsconfig.json', import.meta.url));
|
|
|
|
const resetNotEmptyFixture = async () => {
|
|
|
|
const packagePath = new URL('./fixtures/not-empty/package.json', import.meta.url);
|
|
|
|
const tsconfigPath = new URL('./fixtures/not-empty/tsconfig.json', import.meta.url);
|
|
|
|
|
|
|
|
const overriddenPackageJson = Object.assign(
|
|
|
|
JSON.parse(await fs.promises.readFile(packagePath, { encoding: 'utf-8' })),
|
|
|
|
{
|
|
|
|
scripts: {
|
|
|
|
build: 'astro build',
|
|
|
|
},
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
return Promise.all([
|
|
|
|
fs.promises.writeFile(packagePath, JSON.stringify(overriddenPackageJson, null, 2), {
|
|
|
|
encoding: 'utf-8',
|
|
|
|
}),
|
|
|
|
fs.promises.writeFile(tsconfigPath, '{}', { encoding: 'utf-8' }),
|
|
|
|
]);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const resetFixtures = () =>
|
|
|
|
Promise.allSettled([resetEmptyFixture(), resetNotEmptyFixture()]);
|