Skip to content

Commit

Permalink
Adds automatic, seasonally appropriate messages from Houston (#9476)
Browse files Browse the repository at this point in the history
* feat: allow Houston to wear Scarfs

* refactor: allow 1 object to be passed instead of separate

* set messages back to original state / add ties

* refactor to getClothes method

* refactor: add clothes per season

* refactor: add messages with timing too

* refactor to new file

* refactor: use `hat` & `tie` instead of `clothes`

* refactor: use `getSeasonalHouston` only once

* chore: upgrade dependencies

* fix mistake in date

* feat(create-astro): refactor seasonal logic

* chore: remove unused entrypoint

* refactor: simplify seasonal data

* chore: add changeset

---------

Co-authored-by: Nate Moore <[email protected]>
Co-authored-by: Nate Moore <[email protected]>
  • Loading branch information
3 people authored Jan 5, 2024
1 parent 75084b4 commit 651f45b
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 43 deletions.
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.

0 comments on commit 651f45b

Please sign in to comment.