summaryrefslogtreecommitdiff
path: root/packages/create-astro/src/messages.ts
blob: 2ed0608e50e8fb319649161e03f42e8b3004138c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* eslint no-console: 'off' */
import { color, label } from '@astrojs/cli-kit';
import { sleep } from '@astrojs/cli-kit/utils';
import { exec } from 'node:child_process';
import { get } from 'node:https';
import stripAnsi from 'strip-ansi';

export const welcome = [
	`Let's claim your corner of the internet.`,
	`I'll be your assistant today.`,
	`Let's build something awesome!`,
	`Let's build something great!`,
	`Let's build something fast!`,
	`Let's make the web weird!`,
	`Let's make the web a better place!`,
	`Let's create a new project!`,
	`Let's create something unique!`,
	`Time to build a new website.`,
	`Time to build a faster website.`,
	`Time to build a sweet new website.`,
	`We're glad to have you on board.`,
	`Keeping the internet weird since 2021.`,
	`Initiating launch sequence...`,
	`Initiating launch sequence... right... now!`,
	`Awaiting further instructions.`,
];

export function getName() {
	return new Promise((resolve) => {
		exec('git config user.name', { encoding: 'utf-8' }, (_1, gitName, _2) => {
			if (gitName.trim()) {
				return resolve(gitName.split(' ')[0].trim());
			}
			exec('whoami', { encoding: 'utf-8' }, (_3, whoami, _4) => {
				if (whoami.trim()) {
					return resolve(whoami.split(' ')[0].trim());
				}
				return resolve('astronaut');
			});
		});
	});
}

let v: string;
export function getVersion() {
	return new Promise<string>((resolve) => {
		if (v) return resolve(v);
		get('https://registry.npmjs.org/astro/latest', (res) => {
			let body = '';
			res.on('data', (chunk) => (body += chunk));
			res.on('end', () => {
				const { version } = JSON.parse(body);
				v = version;
				resolve(version);
			});
		});
	});
}

export async function banner(version: string) {
	return console.log(
		`\n${label('astro', color.bgGreen, color.black)}  ${color.green(
			color.bold(`v${version}`)
		)} ${color.bold('Launch sequence initiated.')}\n`
	);
}

export async function info(prefix: string, text: string) {
	await sleep(100);
	if (process.stdout.columns < 80) {
		console.log(`${color.cyan('◼')}  ${color.cyan(prefix)}`);
		console.log(`${' '.repeat(3)}${color.dim(text)}\n`);
	} else {
		console.log(`${color.cyan('◼')}  ${color.cyan(prefix)} ${color.dim(text)}\n`);
	}
}

export async function error(prefix: string, text: string) {
	if (process.stdout.columns < 80) {
		console.log(`${' '.repeat(5)} ${color.red('▲')}  ${color.red(prefix)}`);
		console.log(`${' '.repeat(9)}${color.dim(text)}`);
	} else {
		console.log(`${' '.repeat(5)} ${color.red('▲')}  ${color.red(prefix)} ${color.dim(text)}`);
	}
}

export async function typescriptByDefault() {
	await info(`Cool!`, 'Astro comes with TypeScript support enabled by default.');
	console.log(
		`${' '.repeat(3)}${color.dim(`We'll default to the most relaxed settings for you.`)}`
	);
	await sleep(300);
}

export async function nextSteps({ projectDir, devCmd }: { projectDir: string; devCmd: string }) {
	const max = process.stdout.columns;
	const prefix = max < 80 ? ' ' : ' '.repeat(9);
	await sleep(200);
	console.log(
		`\n ${color.bgCyan(` ${color.black('next')} `)}  ${color.bold(
			'Liftoff confirmed. Explore your project!'
		)}`
	);

	await sleep(100);
	if (projectDir !== '') {
		const enter = [
			`\n${prefix}Enter your project directory using`,
			color.cyan(`cd ./${projectDir}`, ''),
		];
		const len = enter[0].length + stripAnsi(enter[1]).length;
		console.log(enter.join(len > max ? '\n' + prefix : ' '));
	}
	console.log(
		`${prefix}Run ${color.cyan(devCmd)} to start the dev server. ${color.cyan('CTRL+C')} to stop.`
	);
	await sleep(100);
	console.log(
		`${prefix}Add frameworks like ${color.cyan(`react`)} or ${color.cyan(
			'tailwind'
		)} using ${color.cyan('astro add')}.`
	);
	await sleep(100);
	console.log(`\n${prefix}Stuck? Join us at ${color.cyan(`https://astro.build/chat`)}`);
	await sleep(200);
}