-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* `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 <[email protected]>
- Loading branch information
1 parent
e5f7114
commit 7481ffd
Showing
11 changed files
with
327 additions
and
162 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
--- | ||
'create-astro': minor | ||
--- | ||
|
||
Alway write chosen config to `tsconfig.json`. | ||
|
||
- Before: Only when `strict` & `strictest` was selected | ||
- After: Also when `base` is selected (via "Relaxed" or "I prefer not to use TypeScript") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
import { expect } from 'chai'; | ||
import { deleteSync } from 'del'; | ||
import { existsSync, mkdirSync, readdirSync, readFileSync } from 'fs'; | ||
import path from 'path'; | ||
import { | ||
PROMPT_MESSAGES, testDir, setup, promiseWithTimeout, timeout | ||
} from './utils.js'; | ||
|
||
const inputs = { | ||
emptyDir: './fixtures/select-typescript/empty-dir', | ||
}; | ||
|
||
function isEmpty(dirPath) { | ||
return !existsSync(dirPath) || readdirSync(dirPath).length === 0; | ||
} | ||
|
||
function ensureEmptyDir() { | ||
const dirPath = path.resolve(testDir, inputs.emptyDir); | ||
if (!existsSync(dirPath)) { | ||
mkdirSync(dirPath, { recursive: true }); | ||
} else if (!isEmpty(dirPath)) { | ||
const globPath = path.resolve(dirPath, '*'); | ||
deleteSync(globPath, { dot: true }); | ||
} | ||
} | ||
|
||
function getTsConfig(installDir) { | ||
const filePath = path.resolve(testDir, installDir, 'tsconfig.json'); | ||
return JSON.parse(readFileSync(filePath, 'utf-8')); | ||
} | ||
|
||
describe('[create-astro] select typescript', function () { | ||
this.timeout(timeout); | ||
|
||
beforeEach(ensureEmptyDir); | ||
|
||
afterEach(ensureEmptyDir); | ||
|
||
it('should prompt for typescript when none is provided', async function () { | ||
return promiseWithTimeout((resolve, onStdout) => { | ||
const { stdout } = setup([ | ||
inputs.emptyDir, | ||
'--template', 'minimal', | ||
'--install', '0', | ||
'--git', '0' | ||
]); | ||
stdout.on('data', (chunk) => { | ||
onStdout(chunk); | ||
if (chunk.includes(PROMPT_MESSAGES.typescript)) { | ||
resolve(); | ||
} | ||
}); | ||
}, () => lastStdout); | ||
}); | ||
|
||
it('should not prompt for typescript when provided', async function () { | ||
return promiseWithTimeout((resolve, onStdout) => { | ||
const { stdout } = setup([ | ||
inputs.emptyDir, | ||
'--template', 'minimal', | ||
'--install', '0', | ||
'--git', '0', | ||
'--typescript', 'base' | ||
]); | ||
stdout.on('data', (chunk) => { | ||
onStdout(chunk); | ||
if (chunk.includes(PROMPT_MESSAGES.typescriptSucceed)) { | ||
resolve(); | ||
} | ||
}); | ||
}, () => lastStdout); | ||
}); | ||
|
||
it('should use "strict" config when specified', async function () { | ||
return promiseWithTimeout((resolve, onStdout) => { | ||
let wrote = false; | ||
const { stdout, stdin } = setup([ | ||
inputs.emptyDir, | ||
'--template', 'minimal', | ||
'--install', '0', | ||
'--git', '0' | ||
]); | ||
stdout.on('data', (chunk) => { | ||
onStdout(chunk); | ||
if (!wrote && chunk.includes(PROMPT_MESSAGES.typescript)) { | ||
stdin.write('\x1B\x5B\x42\x0D'); | ||
wrote = true; | ||
} | ||
if (chunk.includes(PROMPT_MESSAGES.typescriptSucceed)) { | ||
const tsConfigJson = getTsConfig(inputs.emptyDir); | ||
expect(tsConfigJson).to.deep.equal({'extends': 'astro/tsconfigs/strict'}); | ||
resolve(); | ||
} | ||
}); | ||
}, () => lastStdout); | ||
}); | ||
|
||
it('should create tsconfig.json when missing', async function () { | ||
return promiseWithTimeout((resolve, onStdout) => { | ||
const { stdout } = setup([ | ||
inputs.emptyDir, | ||
'--template', 'cassidoo/shopify-react-astro', | ||
'--install', '0', | ||
'--git', '0', | ||
'--typescript', 'base' | ||
]); | ||
stdout.on('data', (chunk) => { | ||
onStdout(chunk); | ||
if (chunk.includes(PROMPT_MESSAGES.typescriptSucceed)) { | ||
const tsConfigJson = getTsConfig(inputs.emptyDir); | ||
expect(tsConfigJson).to.deep.equal({'extends': 'astro/tsconfigs/base'}); | ||
resolve(); | ||
} | ||
}); | ||
}, () => lastStdout); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.