Add a TypeScript step to create-astro
(#4179)
* Add a TypeScript step to create-astro * Add changeset * fred pass Co-authored-by: Fred K. Schott <fkschott@gmail.com>
This commit is contained in:
parent
77cede720b
commit
d344f9e3ec
5 changed files with 125 additions and 1 deletions
5
.changeset/ninety-planets-work.md
Normal file
5
.changeset/ninety-planets-work.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'create-astro': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Add a step to configure how strict TypeScript should be
|
|
@ -25,7 +25,8 @@
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
"create-astro.js"
|
"create-astro.js",
|
||||||
|
"tsconfigs"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^5.0.1",
|
"chalk": "^5.0.1",
|
||||||
|
|
|
@ -7,6 +7,7 @@ import ora from 'ora';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import prompts from 'prompts';
|
import prompts from 'prompts';
|
||||||
|
import url from 'url';
|
||||||
import detectPackageManager from 'which-pm-runs';
|
import detectPackageManager from 'which-pm-runs';
|
||||||
import yargs from 'yargs-parser';
|
import yargs from 'yargs-parser';
|
||||||
import { loadWithRocketGradient, rocketAscii } from './gradient.js';
|
import { loadWithRocketGradient, rocketAscii } from './gradient.js';
|
||||||
|
@ -284,10 +285,75 @@ export async function main() {
|
||||||
ora().info(dim(`--dry-run enabled, skipping.`));
|
ora().info(dim(`--dry-run enabled, skipping.`));
|
||||||
} else if (gitResponse.git) {
|
} else if (gitResponse.git) {
|
||||||
await execaCommand('git init', { cwd });
|
await execaCommand('git init', { cwd });
|
||||||
|
ora().succeed('Git repository created!');
|
||||||
} else {
|
} else {
|
||||||
ora().info(dim(`Sounds good! You can come back and run ${cyan(`git init`)} later.`));
|
ora().info(dim(`Sounds good! You can come back and run ${cyan(`git init`)} later.`));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const tsResponse = await prompts(
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
name: 'typescript',
|
||||||
|
message: 'How would you like to setup TypeScript?',
|
||||||
|
choices: [
|
||||||
|
{
|
||||||
|
title: 'Relaxed',
|
||||||
|
value: 'default',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Strict (recommended)',
|
||||||
|
description: 'Enable `strict` typechecking rules',
|
||||||
|
value: 'strict',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Strictest',
|
||||||
|
description: 'Enable all typechecking rules',
|
||||||
|
value: 'stricter',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'I prefer not to use TypeScript',
|
||||||
|
description: `That's cool too!`,
|
||||||
|
value: 'optout',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
onCancel: () => {
|
||||||
|
ora().info(
|
||||||
|
dim(
|
||||||
|
'Operation cancelled. Your project folder has been created but no TypeScript configuration file was created.'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
process.exit(1);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (tsResponse.typescript === 'optout') {
|
||||||
|
console.log(``);
|
||||||
|
ora().warn(yellow(bold(`Astro ❤️ TypeScript!`)));
|
||||||
|
console.log(` Astro supports TypeScript inside of ".astro" component scripts, so`);
|
||||||
|
console.log(` we still need to create some TypeScript-related files in your project.`);
|
||||||
|
console.log(` You can safely ignore these files, but don't delete them!`);
|
||||||
|
console.log(dim(' (ex: tsconfig.json, src/types.d.ts)'));
|
||||||
|
console.log(``);
|
||||||
|
tsResponse.typescript = 'default';
|
||||||
|
await wait(300);
|
||||||
|
}
|
||||||
|
if (args.dryRun) {
|
||||||
|
ora().info(dim(`--dry-run enabled, skipping.`));
|
||||||
|
} else if (tsResponse.typescript) {
|
||||||
|
fs.copyFileSync(
|
||||||
|
path.join(
|
||||||
|
url.fileURLToPath(new URL('..', import.meta.url)),
|
||||||
|
'tsconfigs',
|
||||||
|
`tsconfig.${tsResponse.typescript}.json`
|
||||||
|
),
|
||||||
|
path.join(cwd, 'tsconfig.json')
|
||||||
|
);
|
||||||
|
ora().succeed('TypeScript settings applied!');
|
||||||
|
}
|
||||||
|
|
||||||
ora().succeed('Setup complete.');
|
ora().succeed('Setup complete.');
|
||||||
ora({ text: green('Ready for liftoff!') }).succeed();
|
ora({ text: green('Ready for liftoff!') }).succeed();
|
||||||
await wait(300);
|
await wait(300);
|
||||||
|
|
19
packages/create-astro/tsconfigs/tsconfig.strict.json
Normal file
19
packages/create-astro/tsconfigs/tsconfig.strict.json
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
// Enable top-level await, and other modern ESM features.
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "ESNext",
|
||||||
|
// Enable node-style module resolution, for things like npm package imports.
|
||||||
|
"moduleResolution": "node",
|
||||||
|
// Enable JSON imports.
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
// Enable stricter transpilation for better output.
|
||||||
|
"isolatedModules": true,
|
||||||
|
// Astro will directly run your TypeScript code, no transpilation needed.
|
||||||
|
"noEmit": true,
|
||||||
|
// Enable strict type checking.
|
||||||
|
"strict": true,
|
||||||
|
// Error when a value import is only used as a type.
|
||||||
|
"importsNotUsedAsValues": "error"
|
||||||
|
}
|
||||||
|
}
|
33
packages/create-astro/tsconfigs/tsconfig.stricter.json
Normal file
33
packages/create-astro/tsconfigs/tsconfig.stricter.json
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
// Enable top-level await, and other modern ESM features.
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "ESNext",
|
||||||
|
// Enable node-style module resolution, for things like npm package imports.
|
||||||
|
"moduleResolution": "node",
|
||||||
|
// Enable JSON imports.
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
// Enable stricter transpilation for better output.
|
||||||
|
"isolatedModules": true,
|
||||||
|
// Astro will directly run your TypeScript code, no transpilation needed.
|
||||||
|
"noEmit": true,
|
||||||
|
// Enable strict type checking.
|
||||||
|
"strict": true,
|
||||||
|
// Error when a value import is only used as a type.
|
||||||
|
"importsNotUsedAsValues": "error",
|
||||||
|
// Report errors for fallthrough cases in switch statements
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
// Force functions designed to override their parent class to be specified as `override`.
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
// Force functions to specify that they can return `undefined` if a possibe code path does not return a value.
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
// Report an error when a variable is declared but never used.
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
// Report an error when a parameter is declared but never used.
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
// Force the usage of the indexed syntax to access fields declared using an index signature.
|
||||||
|
"noUncheckedIndexedAccess": true,
|
||||||
|
// Report an error when the value `undefined` is given to an optional property that doesn't specify `undefined` as a valid value.
|
||||||
|
"exactOptionalPropertyTypes": true
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue