Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds automatic, seasonally appropriate messages from Houston #9476

Merged
merged 18 commits into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/afraid-ligers-add.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"create-astro": patch
---

Improves seasonal message handling by automatically detecting the local date
2 changes: 1 addition & 1 deletion packages/create-astro/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"//a": "MOST PACKAGES SHOULD GO IN DEV_DEPENDENCIES! THEY WILL BE BUNDLED.",
"//b": "DEPENDENCIES IS FOR UNBUNDLED PACKAGES",
"dependencies": {
"@astrojs/cli-kit": "^0.4.0",
"@astrojs/cli-kit": "^0.4.1",
"giget": "1.1.3"
},
"devDependencies": {
Expand Down
9 changes: 8 additions & 1 deletion packages/create-astro/src/actions/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import arg from 'arg';
import os from 'node:os';

import { getName, getVersion } from '../messages.js';
import getSeasonalData from '../data/seasonal.js';

export interface Context {
help: boolean;
Expand All @@ -25,7 +26,9 @@ export interface Context {
stdin?: typeof process.stdin;
stdout?: typeof process.stdout;
exit(code: number): never;
welcome?: string;
hat?: string;
tie?: string;
tasks: Task[];
}

Expand Down Expand Up @@ -83,6 +86,8 @@ export async function getContext(argv: string[]): Promise<Context> {
((os.platform() === 'win32' && !fancy) || skipHouston) ??
[yes, no, install, git, typescript].some((v) => v !== undefined);

const { messages, hats, ties } = getSeasonalData({ fancy });

const context: Context = {
help,
prompt,
Expand All @@ -95,7 +100,9 @@ export async function getContext(argv: string[]): Promise<Context> {
projectName,
template,
ref: ref ?? 'latest',
hat: random(['❄️', '🎄', '🎁']), // fancy ? random(['🎩', '🎩', '🎩', '🎩', '🎓', '👑', '🧢', '🍦']) : undefined,
welcome: random(messages),
hat: hats ? random(hats) : undefined,
tie: ties ? random(ties) : undefined,
yes,
install: install ?? (noInstall ? false : undefined),
git: git ?? (noGit ? false : undefined),
Expand Down
12 changes: 6 additions & 6 deletions packages/create-astro/src/actions/intro.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import type { Context } from './context.js';

import { color, label } from '@astrojs/cli-kit';
import { random } from '@astrojs/cli-kit/utils';
import { banner, say, welcome } from '../messages.js';
import { banner, say } from '../messages.js';

export async function intro(
ctx: Pick<Context, 'hat' | 'skipHouston' | 'version' | 'username' | 'fancy'>
ctx: Pick<Context, 'skipHouston' | 'welcome' | 'hat' | 'tie' | 'version' | 'username' | 'fancy'>
) {
banner();

if (!ctx.skipHouston) {
const { welcome, hat, tie } = ctx;
await say(
[
[
Expand All @@ -21,9 +21,9 @@ export async function intro(
),
Promise.resolve(ctx.username).then((username) => `${username}!`),
],
random(welcome),
],
{ clear: true, hat: ctx.hat }
welcome ?? 'Let\'s build something awesome!',
] as string[],
{ clear: true, hat, tie }
);
}
}
4 changes: 2 additions & 2 deletions packages/create-astro/src/actions/next-steps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { Context } from './context.js';

import { nextSteps, say } from '../messages.js';

export async function next(ctx: Pick<Context, 'hat' | 'cwd' | 'packageManager' | 'skipHouston'>) {
export async function next(ctx: Pick<Context, 'hat' | 'tie' | 'cwd' | 'packageManager' | 'skipHouston'>) {
let projectDir = path.relative(process.cwd(), ctx.cwd);

const commandMap: { [key: string]: string } = {
Expand All @@ -17,7 +17,7 @@ export async function next(ctx: Pick<Context, 'hat' | 'cwd' | 'packageManager' |
await nextSteps({ projectDir, devCmd });

if (!ctx.skipHouston) {
await say(['Good luck out there, astronaut! 🚀'], { hat: ctx.hat });
await say(['Good luck out there, astronaut! 🚀'], { hat: ctx.hat, tie: ctx.tie });
}
return;
}
108 changes: 108 additions & 0 deletions packages/create-astro/src/data/seasonal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
interface SeasonalHouston {
hats?: string[];
ties?: string[];
messages: string[]
}

export default function getSeasonalHouston({ fancy }: { fancy?: boolean }): SeasonalHouston {
const season = getSeason();
switch (season) {
case 'new-year': {
const year = new Date().getFullYear();
return {
hats: rarity(0.5, ['🎩']),
ties: rarity(0.25, ['🎊', '🎀', '🎉']),
messages: [
`New year, new Astro site!`,
`Kicking ${year} off with Astro?! What an honor!`,
`Happy ${year}! Let's make something cool.`,
`${year} is your year! Let's build something awesome.`,
`${year} is the year of Astro!`,
`${year} is clearly off to a great start!`,
`Thanks for starting ${year} with Astro!`
]
}
}
case 'spooky': return {
hats: rarity(0.5, ['🎃', '👻', '☠️', '💀', '🕷️', '🔮']),
ties: rarity(0.25, ['🦴', '🍬', '🍫']),
messages: [
`I'm afraid I can't help you... Just kidding!`,
`Boo! Just kidding. Let's make a website!`,
`Let's haunt the internet. OooOooOOoo!`,
`No tricks here. Seeing you is always treat!`,
`Spiders aren't the only ones building the web!`,
`Let's conjure up some web magic!`,
`Let's harness the power of Astro to build a frightful new site!`,
`We're conjuring up a spooktacular website!`,
`Prepare for a web of spooky wonders to be woven.`,
`Chills and thrills await you on your new project!`,
]
}
case 'holiday': return {
hats: rarity(0.75, ['🎁', '🎄', '🌲']),
ties: rarity(0.75, ['🧣']),
messages: [
`'Tis the season to code and create.`,
`Jingle all the way through your web creation journey!`,
`Bells are ringing, and so are your creative ideas!`,
`Let's make the internet our own winter wonderland!`,
`It's time to decorate a brand new website!`,
`Let's unwrap the magic of the web together!`,
`Hope you're enjoying the holiday season!`,
`I'm dreaming of a brand new website!`,
`No better holiday gift than a new site!`,
`Your creativity is the gift that keeps on giving!`,
]
}
default: return {
hats: fancy ? ['🎩', '🎩', '🎩', '🎩', '🎓', '👑', '🧢', '🍦'] : undefined,
ties: fancy ? rarity(0.33, ['🎀', '🧣']) : undefined,
messages: [
`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 build the web we want.`,
`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.`,
]
}
}
}

type Season = 'spooky' | 'holiday' | 'new-year';
function getSeason(): Season | undefined {
const date = new Date();
const month = date.getMonth() + 1;
const day = date.getDate() + 1;

if (month === 1 && day <= 7) {
return 'new-year';
}
if (month === 10 && day > 7) {
return 'spooky'
}
if (month === 12 && day > 7 && day < 25) {
return 'holiday'
}
}

// Generates an array padded with empty strings to make decorations more rare
function rarity(frequency: number, emoji: string[]) {
if (frequency === 1) return emoji;
if (frequency === 0) return [''];
const empty = Array.from({ length: Math.round(emoji.length * frequency) }, () => '')
return [...emoji, ...empty];
}
31 changes: 2 additions & 29 deletions packages/create-astro/src/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ export function setStdout(writable: typeof process.stdout) {
stdout = writable;
}

export async function say(messages: string | string[], { clear = false, hat = '' } = {}) {
return houston(messages, { clear, hat, stdout });
export async function say(messages: string | string[], { clear = false, hat = '', tie = ''} = {}) {
return houston(messages, { clear, hat, tie, stdout });
}

export async function spinner(args: {
Expand All @@ -39,33 +39,6 @@ export async function spinner(args: {

export const title = (text: string) => align(label(text), 'end', 7) + ' ';

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 build the web we want.`,
// `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.`,
`Ho, ho, ho! 'Tis the season to code and create.`,
`Jingle all the way through your web creation journey!`,
`Let's unwrap the magic of the web together!`,
`Bells are ringing, and so are your creative ideas!`,
`It's starting to look a lot like Christmas on the internet.`,
`It's time to decorate the web with your festive ideas!`,
];

export const getName = () =>
new Promise<string>((resolve) => {
exec('git config user.name', { encoding: 'utf-8' }, (_1, gitName) => {
Expand Down
8 changes: 4 additions & 4 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.