From aed7a78825d16d752da616f0fcfb0ec297c0355e Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 13 Oct 2024 13:56:22 -0700 Subject: [PATCH 01/12] feat: improved homescreen for adding or creating projects --- .changeset/rude-seals-behave.md | 5 +++ community-adder-template/src/config/adder.js | 32 --------------- .../src/config/options.js | 9 ----- community-adder-template/src/index.js | 40 ++++++++++++++++++- community-adder-template/tests/tests.js | 2 +- community-adders/unocss.ts | 2 +- community-adders/unplugin-icons.ts | 2 +- packages/adders/_config/community.ts | 2 +- packages/adders/drizzle/index.ts | 2 +- packages/adders/eslint/index.ts | 2 +- packages/adders/lucia/index.ts | 2 +- packages/adders/mdsvex/index.ts | 2 +- packages/adders/paraglide/index.ts | 2 +- packages/adders/playwright/index.ts | 2 +- packages/adders/prettier/index.ts | 2 +- packages/adders/routify/index.ts | 2 +- packages/adders/storybook/index.ts | 2 +- packages/adders/tailwindcss/index.ts | 2 +- packages/adders/vitest/index.ts | 2 +- packages/cli/commands/add/index.ts | 33 +++++++-------- packages/core/adder/config.ts | 2 +- 21 files changed, 73 insertions(+), 78 deletions(-) create mode 100644 .changeset/rude-seals-behave.md delete mode 100644 community-adder-template/src/config/adder.js delete mode 100644 community-adder-template/src/config/options.js diff --git a/.changeset/rude-seals-behave.md b/.changeset/rude-seals-behave.md new file mode 100644 index 000000000..64429c070 --- /dev/null +++ b/.changeset/rude-seals-behave.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +feat: improved homescreen for adding or creating projects diff --git a/community-adder-template/src/config/adder.js b/community-adder-template/src/config/adder.js deleted file mode 100644 index 7439b7b83..000000000 --- a/community-adder-template/src/config/adder.js +++ /dev/null @@ -1,32 +0,0 @@ -import { options } from './options.js'; -import { defineAdder } from '@sveltejs/cli-core'; -import { imports } from '@sveltejs/cli-core/js'; -import { parseScript } from '@sveltejs/cli-core/parsers'; - -export const adder = defineAdder({ - id: 'community-adder-template', - name: 'Community Adder Template', - description: 'An adder template demo', - environments: { kit: true, svelte: true }, - options, - packages: [], - files: [ - { - name: () => 'adder-template-demo.txt', - content: ({ content, options }) => { - if (options.demo) { - return 'This is a text file made by the Community Adder Template demo!'; - } - return content; - } - }, - { - name: () => 'src/DemoComponent.svelte', - content: ({ content }) => { - const { ast, generateCode } = parseScript(content); - imports.addDefault(ast, '../adder-template-demo.txt?raw', 'Demo'); - return generateCode(); - } - } - ] -}); diff --git a/community-adder-template/src/config/options.js b/community-adder-template/src/config/options.js deleted file mode 100644 index 000c1bf0c..000000000 --- a/community-adder-template/src/config/options.js +++ /dev/null @@ -1,9 +0,0 @@ -import { defineAdderOptions } from '@sveltejs/cli-core'; - -export const options = defineAdderOptions({ - demo: { - question: 'Do you want to use a demo?', - type: 'boolean', - default: false - } -}); diff --git a/community-adder-template/src/index.js b/community-adder-template/src/index.js index b976c4970..a23acb79f 100644 --- a/community-adder-template/src/index.js +++ b/community-adder-template/src/index.js @@ -1,3 +1,39 @@ -import { adder } from './config/adder.js'; +import { defineAdder, defineAdderOptions } from '@sveltejs/cli-core'; +import { imports } from '@sveltejs/cli-core/js'; +import { parseScript } from '@sveltejs/cli-core/parsers'; -export default adder; +export const options = defineAdderOptions({ + demo: { + question: 'Do you want to use a demo?', + type: 'boolean', + default: false + } +}); + +export const adder = defineAdder({ + id: 'community-adder-template', + name: 'Community Adder Template', + description: 'An adder template demo', + environments: { kit: true, svelte: true }, + options, + packages: [], + files: [ + { + name: () => 'adder-template-demo.txt', + content: ({ content, options }) => { + if (options.demo) { + return 'This is a text file made by the Community Adder Template demo!'; + } + return content; + } + }, + { + name: () => 'src/DemoComponent.svelte', + content: ({ content }) => { + const { ast, generateCode } = parseScript(content); + imports.addDefault(ast, '../adder-template-demo.txt?raw', 'Demo'); + return generateCode(); + } + } + ] +}); diff --git a/community-adder-template/tests/tests.js b/community-adder-template/tests/tests.js index 314511723..373c556ba 100644 --- a/community-adder-template/tests/tests.js +++ b/community-adder-template/tests/tests.js @@ -1,5 +1,5 @@ import { defineAdderTests } from '@sveltejs/cli-core'; -import { options } from '../src/config/options.js'; +import { options } from '../src/index.js'; export const tests = defineAdderTests({ files: [], diff --git a/community-adders/unocss.ts b/community-adders/unocss.ts index 536a898db..03c38c616 100644 --- a/community-adders/unocss.ts +++ b/community-adders/unocss.ts @@ -6,5 +6,5 @@ export default { category: 'CSS', npm: 'unocss-svelte-integration', repo: 'https://github.com/owner-name/repo-name', - website: 'https://unocss.dev' + homepage: 'https://unocss.dev' } satisfies CommunityAdder; diff --git a/community-adders/unplugin-icons.ts b/community-adders/unplugin-icons.ts index c12bbbd13..ce3fa4e20 100644 --- a/community-adders/unplugin-icons.ts +++ b/community-adders/unplugin-icons.ts @@ -6,5 +6,5 @@ export default { category: 'Icon', npm: 'unplugin-icons-svelte-integration', repo: 'https://github.com/owner-name/repo-name', - website: 'https://github.com/unplugin/unplugin-icons' + homepage: 'https://github.com/unplugin/unplugin-icons' } satisfies CommunityAdder; diff --git a/packages/adders/_config/community.ts b/packages/adders/_config/community.ts index 182bb31b0..078e89e7c 100644 --- a/packages/adders/_config/community.ts +++ b/packages/adders/_config/community.ts @@ -6,7 +6,7 @@ export type CommunityAdder = { category: Category | CommunityCategory; npm: string; repo: string; - website: string; + homepage: string; }; /** EVALUATED AT BUILD TIME */ diff --git a/packages/adders/drizzle/index.ts b/packages/adders/drizzle/index.ts index 8b6519695..55a7ed089 100644 --- a/packages/adders/drizzle/index.ts +++ b/packages/adders/drizzle/index.ts @@ -68,7 +68,7 @@ export default defineAdder({ name: 'Drizzle', description: 'Headless ORM for NodeJS, TypeScript and JavaScript', environments: { svelte: false, kit: true }, - documentation: 'https://orm.drizzle.team/docs/overview', + homepage: 'https://orm.drizzle.team', options, packages: [ { name: 'drizzle-orm', version: '^0.33.0', dev: false }, diff --git a/packages/adders/eslint/index.ts b/packages/adders/eslint/index.ts index 00aede29c..5b27bc0a8 100644 --- a/packages/adders/eslint/index.ts +++ b/packages/adders/eslint/index.ts @@ -19,7 +19,7 @@ export default defineAdder({ name: 'ESLint', description: 'A configurable JavaScript linter', environments: { svelte: true, kit: true }, - documentation: 'https://eslint.org', + homepage: 'https://eslint.org', options: {}, packages: [ { name: 'eslint', version: '^9.7.0', dev: true }, diff --git a/packages/adders/lucia/index.ts b/packages/adders/lucia/index.ts index fd85e4c66..f119e6123 100644 --- a/packages/adders/lucia/index.ts +++ b/packages/adders/lucia/index.ts @@ -42,7 +42,7 @@ export default defineAdder({ name: 'Lucia', description: 'An auth library that abstracts away the complexity of handling sessions', environments: { svelte: false, kit: true }, - documentation: 'https://lucia-auth.com', + homepage: 'https://lucia-next.pages.dev', options, packages: [ { name: 'lucia', version: '^3.2.0', dev: false }, diff --git a/packages/adders/mdsvex/index.ts b/packages/adders/mdsvex/index.ts index 9157aefc6..c2e040ebc 100644 --- a/packages/adders/mdsvex/index.ts +++ b/packages/adders/mdsvex/index.ts @@ -7,7 +7,7 @@ export default defineAdder({ name: 'mdsvex', description: 'svelte in markdown', environments: { svelte: true, kit: true }, - documentation: 'https://mdsvex.pngwn.io/docs', + homepage: 'https://mdsvex.pngwn.io', options: {}, packages: [{ name: 'mdsvex', version: '^0.11.2', dev: true }], files: [ diff --git a/packages/adders/paraglide/index.ts b/packages/adders/paraglide/index.ts index 4ca4f1c27..5d9c256d7 100644 --- a/packages/adders/paraglide/index.ts +++ b/packages/adders/paraglide/index.ts @@ -66,7 +66,7 @@ export default defineAdder({ name: 'Paraglide', description: 'Typesafe i18n with localised routing', environments: { svelte: false, kit: true }, - documentation: 'https://inlang.com/m/dxnzrydw/paraglide-sveltekit-i18n', + homepage: 'https://inlang.com', options, packages: [ { diff --git a/packages/adders/playwright/index.ts b/packages/adders/playwright/index.ts index 69ea0c03d..1be577029 100644 --- a/packages/adders/playwright/index.ts +++ b/packages/adders/playwright/index.ts @@ -9,7 +9,7 @@ export default defineAdder({ name: 'Playwright', description: 'A testing framework for end-to-end testing', environments: { svelte: true, kit: true }, - documentation: 'https://playwright.dev', + homepage: 'https://playwright.dev', options: {}, packages: [{ name: '@playwright/test', version: '^1.45.3', dev: true }], files: [ diff --git a/packages/adders/prettier/index.ts b/packages/adders/prettier/index.ts index 860c12bdd..bba78bf55 100644 --- a/packages/adders/prettier/index.ts +++ b/packages/adders/prettier/index.ts @@ -7,7 +7,7 @@ export default defineAdder({ name: 'Prettier', description: 'An opinionated code formatter', environments: { svelte: true, kit: true }, - documentation: 'https://prettier.io', + homepage: 'https://prettier.io', options: {}, packages: [ { name: 'prettier', version: '^3.3.2', dev: true }, diff --git a/packages/adders/routify/index.ts b/packages/adders/routify/index.ts index 58962f938..0de997ff5 100644 --- a/packages/adders/routify/index.ts +++ b/packages/adders/routify/index.ts @@ -8,7 +8,7 @@ export default defineAdder({ name: 'Routify', description: 'The Router that Grows With You', environments: { svelte: true, kit: false }, - documentation: 'https://routify.dev', + homepage: 'https://routify.dev', options: {}, packages: [{ name: '@roxi/routify', version: 'next', dev: true }], files: [ diff --git a/packages/adders/storybook/index.ts b/packages/adders/storybook/index.ts index 54ec98c67..91213af64 100644 --- a/packages/adders/storybook/index.ts +++ b/packages/adders/storybook/index.ts @@ -5,7 +5,7 @@ export default defineAdder({ name: 'Storybook', description: 'Build UIs without the grunt work', environments: { kit: true, svelte: true }, - documentation: 'https://storybook.js.org/docs/get-started', + homepage: 'https://storybook.js.org', options: {}, packages: [], scripts: [ diff --git a/packages/adders/tailwindcss/index.ts b/packages/adders/tailwindcss/index.ts index 614cad01e..1b0fbd181 100644 --- a/packages/adders/tailwindcss/index.ts +++ b/packages/adders/tailwindcss/index.ts @@ -19,7 +19,7 @@ export default defineAdder({ name: 'Tailwind CSS', description: 'Rapidly build modern websites without ever leaving your HTML', environments: { svelte: true, kit: true }, - documentation: 'https://tailwindcss.com/docs', + homepage: 'https://tailwindcss.com', options, packages: [ { name: 'tailwindcss', version: '^3.4.9', dev: true }, diff --git a/packages/adders/vitest/index.ts b/packages/adders/vitest/index.ts index 2a9915605..3c58e0ab5 100644 --- a/packages/adders/vitest/index.ts +++ b/packages/adders/vitest/index.ts @@ -7,7 +7,7 @@ export default defineAdder({ name: 'Vitest', description: 'A testing framework powered by Vite', environments: { svelte: true, kit: true }, - documentation: 'https://vitest.dev', + homepage: 'https://vitest.dev', options: {}, packages: [{ name: 'vitest', version: '^2.0.4', dev: true }], files: [ diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 3c0f27a4b..631880950 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -169,31 +169,28 @@ export async function runAddCommand(options: Options, adders: string[]): Promise } } - type AdderChoices = Record>; + type AdderChoices = Array<{ value: string; label: string }>; // we'll let the user choose community adders when `--community` is specified without args if (options.community === true) { - const promptOptions: AdderChoices = {}; + let promptOptions: AdderChoices = []; const communityAdders = await Promise.all( communityAdderIds.map(async (id) => ({ id, ...(await getCommunityAdder(id)) })) ); const categories = new Set(communityAdders.map((adder) => adder.category)); - for (const category of categories) { - promptOptions[category] = communityAdders - .filter((adder) => adder.category === category) + for (const _category of categories) { + promptOptions = communityAdders .map((adder) => ({ value: adder.id, - label: adder.name, - hint: adder.repo + label: adder.id, + hint: adder.homepage })); } - const selected = await p.groupMultiselect({ + const selected = await p.multiselect({ message: 'Which community tools would you like to add to your project?', - options: promptOptions, - spacedGroups: true, - selectableGroups: false, + options: promptOptions.sort((a, b) => (a?.label || '').localeCompare(b?.label || '')), required: false }); @@ -281,7 +278,7 @@ export async function runAddCommand(options: Options, adders: string[]): Promise // prompt which adders to apply if (selectedAdders.length === 0) { - const adderOptions: AdderChoices = {}; + let adderOptions: AdderChoices = []; const workspace = createWorkspace(options.cwd); const projectType = workspace.kit ? 'kit' : 'svelte'; for (const category of categories) { @@ -294,23 +291,21 @@ export async function runAddCommand(options: Options, adders: string[]): Promise if (projectType === 'svelte' && !config.environments.svelte) return; return { - label: config.name, + label: config.id, value: config.id, - hint: config.documentation + hint: config.homepage }; }) .filter((c) => !!c); if (categoryOptions.length > 0) { - adderOptions[category] = categoryOptions; + adderOptions = [...adderOptions, ...categoryOptions]; } } - const selected = await p.groupMultiselect({ + const selected = await p.multiselect({ message: 'What would you like to add to your project?', - options: adderOptions, - spacedGroups: true, - selectableGroups: false, + options: adderOptions.sort((a, b) => (a?.label || '').localeCompare(b?.label || '')), required: false }); if (p.isCancel(selected)) { diff --git a/packages/core/adder/config.ts b/packages/core/adder/config.ts index 2d2b0ae43..5cf80d488 100644 --- a/packages/core/adder/config.ts +++ b/packages/core/adder/config.ts @@ -31,7 +31,7 @@ export type Adder = { name: string; description: string; environments: Environments; - documentation?: string; + homepage?: string; options: Args; dependsOn?: string[]; packages: Array>; From 3934b29d936ade7f45f7bf9f28f92a82dad0ecb7 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:35:45 -0700 Subject: [PATCH 02/12] format --- packages/cli/commands/add/index.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 631880950..76a8bc7ad 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -180,12 +180,11 @@ export async function runAddCommand(options: Options, adders: string[]): Promise const categories = new Set(communityAdders.map((adder) => adder.category)); for (const _category of categories) { - promptOptions = communityAdders - .map((adder) => ({ - value: adder.id, - label: adder.id, - hint: adder.homepage - })); + promptOptions = communityAdders.map((adder) => ({ + value: adder.id, + label: adder.id, + hint: adder.homepage + })); } const selected = await p.multiselect({ From 0aa713e28e339037f278412ea8dd5327ac3694cb Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:39:52 -0700 Subject: [PATCH 03/12] remove categories now that they're unused --- community-adders/unocss.ts | 1 - community-adders/unplugin-icons.ts | 1 - packages/adders/_config/categories.ts | 16 --------- packages/adders/_config/community.ts | 3 -- packages/adders/_config/index.ts | 8 +---- packages/adders/_config/official.ts | 47 ++++++++++----------------- packages/cli/commands/add/index.ts | 43 ++++++++++-------------- 7 files changed, 37 insertions(+), 82 deletions(-) delete mode 100644 packages/adders/_config/categories.ts diff --git a/community-adders/unocss.ts b/community-adders/unocss.ts index 03c38c616..c636f8567 100644 --- a/community-adders/unocss.ts +++ b/community-adders/unocss.ts @@ -3,7 +3,6 @@ import type { CommunityAdder } from '../packages/adders/_config/community.ts'; export default { name: 'UnoCSS', description: 'The instant on-demand Atomic CSS engine', - category: 'CSS', npm: 'unocss-svelte-integration', repo: 'https://github.com/owner-name/repo-name', homepage: 'https://unocss.dev' diff --git a/community-adders/unplugin-icons.ts b/community-adders/unplugin-icons.ts index ce3fa4e20..d0f2df308 100644 --- a/community-adders/unplugin-icons.ts +++ b/community-adders/unplugin-icons.ts @@ -3,7 +3,6 @@ import type { CommunityAdder } from '../packages/adders/_config/community.ts'; export default { name: 'unplugin-icons', description: 'Access thousands of icons as components on-demand universally', - category: 'Icon', npm: 'unplugin-icons-svelte-integration', repo: 'https://github.com/owner-name/repo-name', homepage: 'https://github.com/unplugin/unplugin-icons' diff --git a/packages/adders/_config/categories.ts b/packages/adders/_config/categories.ts deleted file mode 100644 index 1dd8d0c4d..000000000 --- a/packages/adders/_config/categories.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type Category = (typeof categories)[number]; -export type CommunityCategory = (typeof communityCategories)[number]; - -export type AdderCategories = Record; - -// the order defined here is how it'll be shown in the prompt -export const categories = [ - 'Code Quality', - 'Testing', - 'CSS', - 'Database', - 'Auth', - 'Additional Functionality' -] as const; - -export const communityCategories = ['Icon'] as const; diff --git a/packages/adders/_config/community.ts b/packages/adders/_config/community.ts index 078e89e7c..b1805a95c 100644 --- a/packages/adders/_config/community.ts +++ b/packages/adders/_config/community.ts @@ -1,9 +1,6 @@ -import type { Category, CommunityCategory } from './categories.ts'; - export type CommunityAdder = { name: string; description: string; - category: Category | CommunityCategory; npm: string; repo: string; homepage: string; diff --git a/packages/adders/_config/index.ts b/packages/adders/_config/index.ts index 27f4c5d6e..c2eccf5be 100644 --- a/packages/adders/_config/index.ts +++ b/packages/adders/_config/index.ts @@ -1,8 +1,2 @@ -export { adderIds, adderCategories, getAdderDetails } from './official.ts'; -export { - categories, - communityCategories, - type Category, - type CommunityCategory -} from './categories.ts'; +export { adders, getAdderDetails } from './official.ts'; export { getCommunityAdder, communityAdderIds } from './community.ts'; diff --git a/packages/adders/_config/official.ts b/packages/adders/_config/official.ts index 07cab770b..6171a43b3 100644 --- a/packages/adders/_config/official.ts +++ b/packages/adders/_config/official.ts @@ -1,7 +1,5 @@ -import type { AdderCategories, Category } from './categories.ts'; -import type { AdderWithoutExplicitArgs, Adder } from '@sveltejs/cli-core'; +import type { AdderWithoutExplicitArgs } from '@sveltejs/cli-core'; -// adders import drizzle from '../drizzle/index.ts'; import eslint from '../eslint/index.ts'; import lucia from '../lucia/index.ts'; @@ -14,33 +12,24 @@ import storybook from '../storybook/index.ts'; import tailwindcss from '../tailwindcss/index.ts'; import vitest from '../vitest/index.ts'; -const categories: Record>> = { - 'Code Quality': [prettier, eslint], - Testing: [vitest, playwright], - CSS: [tailwindcss], - Database: [drizzle], - Auth: [lucia], - 'Additional Functionality': [storybook, paraglide, mdsvex, routify] -}; - -export const adderCategories: AdderCategories = getCategoriesById(); - -function getCategoriesById(): AdderCategories { - const adderCategories: any = {}; - for (const [key, adders] of Object.entries(categories)) { - adderCategories[key] = adders.map((a) => a.id); - } - return adderCategories; -} - -export const adderIds: string[] = Object.values(adderCategories).flatMap((x) => x); - -const adderDetails = Object.values(categories).flat(); - -export function getAdderDetails(name: string): AdderWithoutExplicitArgs { - const details = adderDetails.find((a) => a.id === name); +export const adders = [ + drizzle, + eslint, + lucia, + mdsvex, + paraglide, + playwright, + prettier, + routify, + storybook, + tailwindcss, + vitest +]; + +export function getAdderDetails(id: string): AdderWithoutExplicitArgs { + const details = adders.find((a) => a.id === id); if (!details) { - throw new Error(`Invalid adder name: ${name}`); + throw new Error(`Invalid adder: ${id}`); } return details as AdderWithoutExplicitArgs; diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 76a8bc7ad..cae5e3946 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -9,9 +9,7 @@ import * as pkg from 'empathic/package'; import { resolveCommand } from 'package-manager-detector'; import pc from 'picocolors'; import { - adderCategories, - categories, - adderIds, + adders, getAdderDetails, communityAdderIds, getCommunityAdder @@ -39,7 +37,7 @@ const OptionsSchema = v.strictObject({ }); type Options = v.InferOutput; -const adderDetails = adderIds.map((id) => getAdderDetails(id)); +const adderDetails = adders.map((adder) => getAdderDetails(adder.id)); const aliases = adderDetails.map((c) => c.alias).filter((v) => v !== undefined); const addersOptions = getAdderOptionFlags(); const communityDetails: AdderWithoutExplicitArgs[] = []; @@ -71,16 +69,17 @@ export const add = new Command('add') process.exit(1); } - const adders = v.parse(AddersSchema, adderArgs); + const adderSchemas = v.parse(AddersSchema, adderArgs); const options = v.parse(OptionsSchema, opts); - const invalidAdders = adders.filter((a) => !adderIds.includes(a) && !aliases.includes(a)); + const adderIds = adders.map((adder) => adder.id); + const invalidAdders = adderSchemas.filter((a) => !adderIds.includes(a) && !aliases.includes(a)); if (invalidAdders.length > 0) { console.error(`Invalid adders specified: ${invalidAdders.join(', ')}`); process.exit(1); } - const selectedAdders = transformAliases(adders); + const selectedAdders = transformAliases(adderSchemas); common.runCommand(async () => { await runAddCommand(options, selectedAdders); }); @@ -92,8 +91,8 @@ for (const option of addersOptions) { } type SelectedAdder = { type: 'official' | 'community'; adder: AdderWithoutExplicitArgs }; -export async function runAddCommand(options: Options, adders: string[]): Promise { - const selectedAdders: SelectedAdder[] = adders.map((id) => ({ +export async function runAddCommand(options: Options, selectedAdderIds: string[]): Promise { + const selectedAdders: SelectedAdder[] = selectedAdderIds.map((id) => ({ type: 'official', adder: getAdderDetails(id) })); @@ -177,15 +176,12 @@ export async function runAddCommand(options: Options, adders: string[]): Promise const communityAdders = await Promise.all( communityAdderIds.map(async (id) => ({ id, ...(await getCommunityAdder(id)) })) ); - const categories = new Set(communityAdders.map((adder) => adder.category)); - - for (const _category of categories) { - promptOptions = communityAdders.map((adder) => ({ - value: adder.id, - label: adder.id, - hint: adder.homepage - })); - } + + promptOptions = communityAdders.map((adder) => ({ + value: adder.id, + label: adder.id, + hint: adder.homepage + })); const selected = await p.multiselect({ message: 'Which community tools would you like to add to your project?', @@ -280,11 +276,8 @@ export async function runAddCommand(options: Options, adders: string[]): Promise let adderOptions: AdderChoices = []; const workspace = createWorkspace(options.cwd); const projectType = workspace.kit ? 'kit' : 'svelte'; - for (const category of categories) { - const adderIds = adderCategories[category]; - const categoryOptions = adderIds - .map((id) => { - const config = getAdderDetails(id); + const categoryOptions = adders + .map((config) => { // we'll only display adders within their respective project types if (projectType === 'kit' && !config.environments.kit) return; if (projectType === 'svelte' && !config.environments.svelte) return; @@ -300,7 +293,6 @@ export async function runAddCommand(options: Options, adders: string[]): Promise if (categoryOptions.length > 0) { adderOptions = [...adderOptions, ...categoryOptions]; } - } const selected = await p.multiselect({ message: 'What would you like to add to your project?', @@ -591,7 +583,8 @@ function transformAliases(ids: string[]): string[] { function getAdderOptionFlags(): Option[] { const options: Option[] = []; - for (const id of adderIds) { + for (const adder of adders) { + const id = adder.id; const details = getAdderDetails(id); if (Object.values(details.options).length === 0) continue; From 178c3bbce1fd997c9764c3cd415e42454d013424 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:44:32 -0700 Subject: [PATCH 04/12] change sorting --- packages/adders/_config/official.ts | 16 ++++++++-------- packages/adders/lucia/index.ts | 6 +++--- packages/cli/commands/add/index.ts | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/adders/_config/official.ts b/packages/adders/_config/official.ts index 6171a43b3..f4c3bf2a1 100644 --- a/packages/adders/_config/official.ts +++ b/packages/adders/_config/official.ts @@ -2,7 +2,7 @@ import type { AdderWithoutExplicitArgs } from '@sveltejs/cli-core'; import drizzle from '../drizzle/index.ts'; import eslint from '../eslint/index.ts'; -import lucia from '../lucia/index.ts'; +import auth from '../lucia/index.ts'; import mdsvex from '../mdsvex/index.ts'; import paraglide from '../paraglide/index.ts'; import playwright from '../playwright/index.ts'; @@ -13,17 +13,17 @@ import tailwindcss from '../tailwindcss/index.ts'; import vitest from '../vitest/index.ts'; export const adders = [ - drizzle, + prettier, eslint, - lucia, + vitest, + playwright, + tailwindcss, + drizzle, + auth, mdsvex, paraglide, - playwright, - prettier, - routify, storybook, - tailwindcss, - vitest + routify ]; export function getAdderDetails(id: string): AdderWithoutExplicitArgs { diff --git a/packages/adders/lucia/index.ts b/packages/adders/lucia/index.ts index f119e6123..d899e3b2c 100644 --- a/packages/adders/lucia/index.ts +++ b/packages/adders/lucia/index.ts @@ -38,9 +38,9 @@ export const options = defineAdderOptions({ }); export default defineAdder({ - id: 'lucia', - name: 'Lucia', - description: 'An auth library that abstracts away the complexity of handling sessions', + id: 'auth', + name: 'Auth', + description: 'An auth setup that handles passwords and sessions', environments: { svelte: false, kit: true }, homepage: 'https://lucia-next.pages.dev', options, diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index cae5e3946..7630da740 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -296,7 +296,7 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] const selected = await p.multiselect({ message: 'What would you like to add to your project?', - options: adderOptions.sort((a, b) => (a?.label || '').localeCompare(b?.label || '')), + options: adderOptions, required: false }); if (p.isCancel(selected)) { From 6a941d3477c492c0a7ddf152614775334d2efdca Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:54:46 -0700 Subject: [PATCH 05/12] format --- packages/cli/commands/add/index.ts | 41 +++++++++++++----------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 7630da740..d35e0cd87 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -8,12 +8,7 @@ import * as p from '@sveltejs/clack-prompts'; import * as pkg from 'empathic/package'; import { resolveCommand } from 'package-manager-detector'; import pc from 'picocolors'; -import { - adders, - getAdderDetails, - communityAdderIds, - getCommunityAdder -} from '@sveltejs/adders'; +import { adders, getAdderDetails, communityAdderIds, getCommunityAdder } from '@sveltejs/adders'; import type { AdderWithoutExplicitArgs, OptionValues } from '@sveltejs/cli-core'; import * as common from '../../common.ts'; import { Directive, downloadPackage, getPackageJSON } from '../../utils/fetch-packages.ts'; @@ -276,23 +271,23 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] let adderOptions: AdderChoices = []; const workspace = createWorkspace(options.cwd); const projectType = workspace.kit ? 'kit' : 'svelte'; - const categoryOptions = adders - .map((config) => { - // we'll only display adders within their respective project types - if (projectType === 'kit' && !config.environments.kit) return; - if (projectType === 'svelte' && !config.environments.svelte) return; - - return { - label: config.id, - value: config.id, - hint: config.homepage - }; - }) - .filter((c) => !!c); - - if (categoryOptions.length > 0) { - adderOptions = [...adderOptions, ...categoryOptions]; - } + const categoryOptions = adders + .map((config) => { + // we'll only display adders within their respective project types + if (projectType === 'kit' && !config.environments.kit) return; + if (projectType === 'svelte' && !config.environments.svelte) return; + + return { + label: config.id, + value: config.id, + hint: config.homepage + }; + }) + .filter((c) => !!c); + + if (categoryOptions.length > 0) { + adderOptions = [...adderOptions, ...categoryOptions]; + } const selected = await p.multiselect({ message: 'What would you like to add to your project?', From a1845c0dd9041de128b68295be20e654ec0e55f7 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:15:22 -0400 Subject: [PATCH 06/12] small tweaks --- packages/cli/commands/add/index.ts | 46 ++++++++++++++---------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index d35e0cd87..5d7855cf6 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -64,17 +64,19 @@ export const add = new Command('add') process.exit(1); } - const adderSchemas = v.parse(AddersSchema, adderArgs); + const specifiedAdders = v.parse(AddersSchema, adderArgs); const options = v.parse(OptionsSchema, opts); const adderIds = adders.map((adder) => adder.id); - const invalidAdders = adderSchemas.filter((a) => !adderIds.includes(a) && !aliases.includes(a)); + const invalidAdders = specifiedAdders.filter( + (a) => !adderIds.includes(a) && !aliases.includes(a) + ); if (invalidAdders.length > 0) { console.error(`Invalid adders specified: ${invalidAdders.join(', ')}`); process.exit(1); } - const selectedAdders = transformAliases(adderSchemas); + const selectedAdders = transformAliases(specifiedAdders); common.runCommand(async () => { await runAddCommand(options, selectedAdders); }); @@ -163,24 +165,23 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] } } - type AdderChoices = Array<{ value: string; label: string }>; - // we'll let the user choose community adders when `--community` is specified without args if (options.community === true) { - let promptOptions: AdderChoices = []; const communityAdders = await Promise.all( communityAdderIds.map(async (id) => ({ id, ...(await getCommunityAdder(id)) })) ); - promptOptions = communityAdders.map((adder) => ({ - value: adder.id, - label: adder.id, - hint: adder.homepage - })); + const promptOptions = communityAdders + .map((adder) => ({ + value: adder.id, + label: adder.id, + hint: adder.homepage + })) + .sort((a, b) => (a?.label || '').localeCompare(b?.label || '')); const selected = await p.multiselect({ message: 'Which community tools would you like to add to your project?', - options: promptOptions.sort((a, b) => (a?.label || '').localeCompare(b?.label || '')), + options: promptOptions, required: false }); @@ -268,26 +269,21 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] // prompt which adders to apply if (selectedAdders.length === 0) { - let adderOptions: AdderChoices = []; const workspace = createWorkspace(options.cwd); const projectType = workspace.kit ? 'kit' : 'svelte'; - const categoryOptions = adders - .map((config) => { + const adderOptions = adders + .map((adder) => { // we'll only display adders within their respective project types - if (projectType === 'kit' && !config.environments.kit) return; - if (projectType === 'svelte' && !config.environments.svelte) return; + if (projectType === 'kit' && !adder.environments.kit) return; + if (projectType === 'svelte' && !adder.environments.svelte) return; return { - label: config.id, - value: config.id, - hint: config.homepage + label: adder.id, + value: adder.id, + hint: adder.homepage }; }) - .filter((c) => !!c); - - if (categoryOptions.length > 0) { - adderOptions = [...adderOptions, ...categoryOptions]; - } + .filter((a) => !!a); const selected = await p.multiselect({ message: 'What would you like to add to your project?', From f389b048b743d34f2803683ea883fd0fbe816c8f Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:49:22 -0700 Subject: [PATCH 07/12] add comment and rename variable to officialAdders --- packages/adders/_config/index.ts | 2 +- packages/adders/_config/official.ts | 6 +++-- packages/cli/commands/add/index.ts | 34 ++++++++++++++--------------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/adders/_config/index.ts b/packages/adders/_config/index.ts index c2eccf5be..80b647a80 100644 --- a/packages/adders/_config/index.ts +++ b/packages/adders/_config/index.ts @@ -1,2 +1,2 @@ -export { adders, getAdderDetails } from './official.ts'; +export { officialAdders, getAdderDetails } from './official.ts'; export { getCommunityAdder, communityAdderIds } from './community.ts'; diff --git a/packages/adders/_config/official.ts b/packages/adders/_config/official.ts index f4c3bf2a1..07ac3a75e 100644 --- a/packages/adders/_config/official.ts +++ b/packages/adders/_config/official.ts @@ -12,7 +12,9 @@ import storybook from '../storybook/index.ts'; import tailwindcss from '../tailwindcss/index.ts'; import vitest from '../vitest/index.ts'; -export const adders = [ +// The order of adders here determines the order they are displayed inside the CLI +// We generally try to order them by perceived popularity +export const officialAdders = [ prettier, eslint, vitest, @@ -27,7 +29,7 @@ export const adders = [ ]; export function getAdderDetails(id: string): AdderWithoutExplicitArgs { - const details = adders.find((a) => a.id === id); + const details = officialAdders.find((a) => a.id === id); if (!details) { throw new Error(`Invalid adder: ${id}`); } diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 5d7855cf6..dc1ee28a5 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -8,7 +8,12 @@ import * as p from '@sveltejs/clack-prompts'; import * as pkg from 'empathic/package'; import { resolveCommand } from 'package-manager-detector'; import pc from 'picocolors'; -import { adders, getAdderDetails, communityAdderIds, getCommunityAdder } from '@sveltejs/adders'; +import { + officialAdders, + getAdderDetails, + communityAdderIds, + getCommunityAdder +} from '@sveltejs/adders'; import type { AdderWithoutExplicitArgs, OptionValues } from '@sveltejs/cli-core'; import * as common from '../../common.ts'; import { Directive, downloadPackage, getPackageJSON } from '../../utils/fetch-packages.ts'; @@ -32,7 +37,7 @@ const OptionsSchema = v.strictObject({ }); type Options = v.InferOutput; -const adderDetails = adders.map((adder) => getAdderDetails(adder.id)); +const adderDetails = officialAdders.map((adder) => getAdderDetails(adder.id)); const aliases = adderDetails.map((c) => c.alias).filter((v) => v !== undefined); const addersOptions = getAdderOptionFlags(); const communityDetails: AdderWithoutExplicitArgs[] = []; @@ -66,11 +71,8 @@ export const add = new Command('add') const specifiedAdders = v.parse(AddersSchema, adderArgs); const options = v.parse(OptionsSchema, opts); - - const adderIds = adders.map((adder) => adder.id); - const invalidAdders = specifiedAdders.filter( - (a) => !adderIds.includes(a) && !aliases.includes(a) - ); + const adderIds = officialAdders.map((adder) => adder.id); + const invalidAdders = specifiedAdders.filter((a) => !adderIds.includes(a) && !aliases.includes(a)); if (invalidAdders.length > 0) { console.error(`Invalid adders specified: ${invalidAdders.join(', ')}`); process.exit(1); @@ -271,7 +273,7 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] if (selectedAdders.length === 0) { const workspace = createWorkspace(options.cwd); const projectType = workspace.kit ? 'kit' : 'svelte'; - const adderOptions = adders + const adderOptions = officialAdders .map((adder) => { // we'll only display adders within their respective project types if (projectType === 'kit' && !adder.environments.kit) return; @@ -300,14 +302,13 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] // add inter-adder dependencies for (const { adder } of selectedAdders) { - const name = adder.name; const dependents = adder.dependsOn?.filter((dep) => !selectedAdders.some((a) => a.adder.id === dep)) ?? []; const workspace = createWorkspace(options.cwd); for (const depId of dependents) { const dependent = adderDetails.find((a) => a.id === depId); - if (!dependent) throw new Error(`Adder '${name}' depends on an invalid '${depId}'`); + if (!dependent) throw new Error(`Adder '${adder.id}' depends on an invalid '${depId}'`); // check if the dependent adder has already been installed let installed = false; @@ -320,7 +321,7 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] // prompt to install the dependent const install = await p.confirm({ - message: `The ${pc.bold(pc.cyan(name))} adder requires ${pc.bold(pc.cyan(depId))} to also be installed. ${pc.green('Install it?')}` + message: `The ${pc.bold(pc.cyan(adder.id))} adder requires ${pc.bold(pc.cyan(depId))} to also be installed. ${pc.green('Install it?')}` }); if (install !== true) { p.cancel('Operation cancelled.'); @@ -365,7 +366,7 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] // ask remaining questions for (const { adder, type } of selectedAdders) { const adderId = adder.id; - const questionPrefix = selectedAdders.length > 1 ? `${adder.name}: ` : ''; + const questionPrefix = selectedAdders.length > 1 ? `${adder.id}: ` : ''; let values: QuestionValues = {}; if (type === 'official') { @@ -460,7 +461,7 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] .map(({ adder }) => { let adderMessage = ''; if (selectedAdders.length > 1) { - adderMessage = `${pc.green(adder.name)}:\n`; + adderMessage = `${pc.green(adder.id)}:\n`; } const adderNextSteps = adder.nextSteps!({ @@ -529,8 +530,7 @@ export async function installAdders({ await config.postInstall?.(workspace); if (config.scripts && config.scripts.length > 0) { - const name = config.name; - p.log.step(`Running external command ${pc.gray(`(${name})`)}`); + p.log.step(`Running external command ${pc.gray(`(${config.id})`)}`); for (const script of config.scripts) { if (script.condition?.(workspace) === false) continue; @@ -549,7 +549,7 @@ export async function installAdders({ } } - p.log.success(`Finished running ${name}`); + p.log.success(`Finished running ${config.id}`); } } @@ -574,7 +574,7 @@ function transformAliases(ids: string[]): string[] { function getAdderOptionFlags(): Option[] { const options: Option[] = []; - for (const adder of adders) { + for (const adder of officialAdders) { const id = adder.id; const details = getAdderDetails(id); if (Object.values(details.options).length === 0) continue; From 5452eb89441e938b88c479ad76bb2070da7fb87b Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:11:00 -0700 Subject: [PATCH 08/12] remove unnecessary adder properties --- community-adder-template/src/index.js | 2 -- community-adders/unocss.ts | 6 +----- community-adders/unplugin-icons.ts | 6 +----- packages/adders/_config/community.ts | 6 +----- packages/adders/drizzle/index.ts | 2 -- packages/adders/eslint/index.ts | 2 -- packages/adders/lucia/index.ts | 2 -- packages/adders/mdsvex/index.ts | 2 -- packages/adders/paraglide/index.ts | 2 -- packages/adders/playwright/index.ts | 2 -- packages/adders/prettier/index.ts | 2 -- packages/adders/routify/index.ts | 2 -- packages/adders/storybook/index.ts | 2 -- packages/adders/tailwindcss/index.ts | 2 -- packages/adders/vitest/index.ts | 2 -- packages/cli/commands/add/index.ts | 23 +++++++---------------- packages/cli/common.ts | 2 +- packages/core/adder/config.ts | 2 -- 18 files changed, 11 insertions(+), 58 deletions(-) diff --git a/community-adder-template/src/index.js b/community-adder-template/src/index.js index a23acb79f..9e4348aa3 100644 --- a/community-adder-template/src/index.js +++ b/community-adder-template/src/index.js @@ -12,8 +12,6 @@ export const options = defineAdderOptions({ export const adder = defineAdder({ id: 'community-adder-template', - name: 'Community Adder Template', - description: 'An adder template demo', environments: { kit: true, svelte: true }, options, packages: [], diff --git a/community-adders/unocss.ts b/community-adders/unocss.ts index c636f8567..b83720021 100644 --- a/community-adders/unocss.ts +++ b/community-adders/unocss.ts @@ -1,9 +1,5 @@ import type { CommunityAdder } from '../packages/adders/_config/community.ts'; export default { - name: 'UnoCSS', - description: 'The instant on-demand Atomic CSS engine', - npm: 'unocss-svelte-integration', - repo: 'https://github.com/owner-name/repo-name', - homepage: 'https://unocss.dev' + id: 'unocss-svelte-integration' } satisfies CommunityAdder; diff --git a/community-adders/unplugin-icons.ts b/community-adders/unplugin-icons.ts index d0f2df308..a0b343c92 100644 --- a/community-adders/unplugin-icons.ts +++ b/community-adders/unplugin-icons.ts @@ -1,9 +1,5 @@ import type { CommunityAdder } from '../packages/adders/_config/community.ts'; export default { - name: 'unplugin-icons', - description: 'Access thousands of icons as components on-demand universally', - npm: 'unplugin-icons-svelte-integration', - repo: 'https://github.com/owner-name/repo-name', - homepage: 'https://github.com/unplugin/unplugin-icons' + id: 'unplugin-icons-svelte-integration' } satisfies CommunityAdder; diff --git a/packages/adders/_config/community.ts b/packages/adders/_config/community.ts index b1805a95c..dc0cfd578 100644 --- a/packages/adders/_config/community.ts +++ b/packages/adders/_config/community.ts @@ -1,9 +1,5 @@ export type CommunityAdder = { - name: string; - description: string; - npm: string; - repo: string; - homepage: string; + id: string; // the npm package name }; /** EVALUATED AT BUILD TIME */ diff --git a/packages/adders/drizzle/index.ts b/packages/adders/drizzle/index.ts index 55a7ed089..d396b2e3c 100644 --- a/packages/adders/drizzle/index.ts +++ b/packages/adders/drizzle/index.ts @@ -65,8 +65,6 @@ export const options = defineAdderOptions({ export default defineAdder({ id: 'drizzle', - name: 'Drizzle', - description: 'Headless ORM for NodeJS, TypeScript and JavaScript', environments: { svelte: false, kit: true }, homepage: 'https://orm.drizzle.team', options, diff --git a/packages/adders/eslint/index.ts b/packages/adders/eslint/index.ts index 5b27bc0a8..086b722f3 100644 --- a/packages/adders/eslint/index.ts +++ b/packages/adders/eslint/index.ts @@ -16,8 +16,6 @@ import { parseJson, parseScript } from '@sveltejs/cli-core/parsers'; export default defineAdder({ id: 'eslint', - name: 'ESLint', - description: 'A configurable JavaScript linter', environments: { svelte: true, kit: true }, homepage: 'https://eslint.org', options: {}, diff --git a/packages/adders/lucia/index.ts b/packages/adders/lucia/index.ts index d899e3b2c..7056eb41c 100644 --- a/packages/adders/lucia/index.ts +++ b/packages/adders/lucia/index.ts @@ -39,8 +39,6 @@ export const options = defineAdderOptions({ export default defineAdder({ id: 'auth', - name: 'Auth', - description: 'An auth setup that handles passwords and sessions', environments: { svelte: false, kit: true }, homepage: 'https://lucia-next.pages.dev', options, diff --git a/packages/adders/mdsvex/index.ts b/packages/adders/mdsvex/index.ts index c2e040ebc..33316fe38 100644 --- a/packages/adders/mdsvex/index.ts +++ b/packages/adders/mdsvex/index.ts @@ -4,8 +4,6 @@ import { parseScript } from '@sveltejs/cli-core/parsers'; export default defineAdder({ id: 'mdsvex', - name: 'mdsvex', - description: 'svelte in markdown', environments: { svelte: true, kit: true }, homepage: 'https://mdsvex.pngwn.io', options: {}, diff --git a/packages/adders/paraglide/index.ts b/packages/adders/paraglide/index.ts index 5d9c256d7..7f9862f9c 100644 --- a/packages/adders/paraglide/index.ts +++ b/packages/adders/paraglide/index.ts @@ -63,8 +63,6 @@ export const options = defineAdderOptions({ export default defineAdder({ id: 'paraglide', - name: 'Paraglide', - description: 'Typesafe i18n with localised routing', environments: { svelte: false, kit: true }, homepage: 'https://inlang.com', options, diff --git a/packages/adders/playwright/index.ts b/packages/adders/playwright/index.ts index 1be577029..e05251ed6 100644 --- a/packages/adders/playwright/index.ts +++ b/packages/adders/playwright/index.ts @@ -6,8 +6,6 @@ import { parseJson, parseScript } from '@sveltejs/cli-core/parsers'; export default defineAdder({ id: 'playwright', - name: 'Playwright', - description: 'A testing framework for end-to-end testing', environments: { svelte: true, kit: true }, homepage: 'https://playwright.dev', options: {}, diff --git a/packages/adders/prettier/index.ts b/packages/adders/prettier/index.ts index bba78bf55..9be7b903e 100644 --- a/packages/adders/prettier/index.ts +++ b/packages/adders/prettier/index.ts @@ -4,8 +4,6 @@ import { parseJson } from '@sveltejs/cli-core/parsers'; export default defineAdder({ id: 'prettier', - name: 'Prettier', - description: 'An opinionated code formatter', environments: { svelte: true, kit: true }, homepage: 'https://prettier.io', options: {}, diff --git a/packages/adders/routify/index.ts b/packages/adders/routify/index.ts index 0de997ff5..4a30f254a 100644 --- a/packages/adders/routify/index.ts +++ b/packages/adders/routify/index.ts @@ -5,8 +5,6 @@ import { parseScript, parseSvelte } from '@sveltejs/cli-core/parsers'; export default defineAdder({ id: 'routify', - name: 'Routify', - description: 'The Router that Grows With You', environments: { svelte: true, kit: false }, homepage: 'https://routify.dev', options: {}, diff --git a/packages/adders/storybook/index.ts b/packages/adders/storybook/index.ts index 91213af64..9a76cbef8 100644 --- a/packages/adders/storybook/index.ts +++ b/packages/adders/storybook/index.ts @@ -2,8 +2,6 @@ import { defineAdder } from '@sveltejs/cli-core'; export default defineAdder({ id: 'storybook', - name: 'Storybook', - description: 'Build UIs without the grunt work', environments: { kit: true, svelte: true }, homepage: 'https://storybook.js.org', options: {}, diff --git a/packages/adders/tailwindcss/index.ts b/packages/adders/tailwindcss/index.ts index 1b0fbd181..63c9a5950 100644 --- a/packages/adders/tailwindcss/index.ts +++ b/packages/adders/tailwindcss/index.ts @@ -16,8 +16,6 @@ export const options = defineAdderOptions({ export default defineAdder({ id: 'tailwindcss', alias: 'tailwind', - name: 'Tailwind CSS', - description: 'Rapidly build modern websites without ever leaving your HTML', environments: { svelte: true, kit: true }, homepage: 'https://tailwindcss.com', options, diff --git a/packages/adders/vitest/index.ts b/packages/adders/vitest/index.ts index 3c58e0ab5..47706ee2a 100644 --- a/packages/adders/vitest/index.ts +++ b/packages/adders/vitest/index.ts @@ -4,8 +4,6 @@ import { parseJson, parseScript } from '@sveltejs/cli-core/parsers'; export default defineAdder({ id: 'vitest', - name: 'Vitest', - description: 'A testing framework powered by Vite', environments: { svelte: true, kit: true }, homepage: 'https://vitest.dev', options: {}, diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index dc1ee28a5..b2f5e111c 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -170,16 +170,14 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] // we'll let the user choose community adders when `--community` is specified without args if (options.community === true) { const communityAdders = await Promise.all( - communityAdderIds.map(async (id) => ({ id, ...(await getCommunityAdder(id)) })) + communityAdderIds.map(async (id) => await getCommunityAdder(id)) ); - const promptOptions = communityAdders - .map((adder) => ({ - value: adder.id, - label: adder.id, - hint: adder.homepage - })) - .sort((a, b) => (a?.label || '').localeCompare(b?.label || '')); + const promptOptions = communityAdders.map((adder) => ({ + value: adder.id, + label: adder.id, + hint: 'https://www.npmjs.com/package/' + adder.id + })); const selected = await p.multiselect({ message: 'Which community tools would you like to add to your project?', @@ -221,14 +219,7 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] start('Resolving community adder packages'); const pkgs = await Promise.all( adders.map(async (id) => { - const adder = await getCommunityAdder(id).catch(() => undefined); - const packageName = adder?.npm ?? id; - const details = await getPackageJSON({ cwd: options.cwd, packageName }); - return { - ...details, - // prioritize community adder defined repo urls - repo: adder?.repo ?? details.repo - }; + return await getPackageJSON({ cwd: options.cwd, packageName: id }); }) ); stop('Resolved community adder packages'); diff --git a/packages/cli/common.ts b/packages/cli/common.ts index f141abdae..829030bc7 100644 --- a/packages/cli/common.ts +++ b/packages/cli/common.ts @@ -169,7 +169,7 @@ export function getGlobalPreconditions( } const messages = addersForInvalidEnvironment.map( - (a) => `"${a.name}" does not support "${projectType}"` + (a) => `"${a.id}" does not support "${projectType}"` ); return { success: false, message: messages.join(' / ') }; } diff --git a/packages/core/adder/config.ts b/packages/core/adder/config.ts index 5cf80d488..f19cb1464 100644 --- a/packages/core/adder/config.ts +++ b/packages/core/adder/config.ts @@ -28,8 +28,6 @@ export type Scripts = { export type Adder = { id: string; alias?: string; - name: string; - description: string; environments: Environments; homepage?: string; options: Args; From d4bd1630c379fdc87b2e36a6c0e8f2d78c0d92d2 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:28:18 -0700 Subject: [PATCH 09/12] format --- packages/cli/commands/add/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index b2f5e111c..594568934 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -72,7 +72,9 @@ export const add = new Command('add') const specifiedAdders = v.parse(AddersSchema, adderArgs); const options = v.parse(OptionsSchema, opts); const adderIds = officialAdders.map((adder) => adder.id); - const invalidAdders = specifiedAdders.filter((a) => !adderIds.includes(a) && !aliases.includes(a)); + const invalidAdders = specifiedAdders.filter( + (a) => !adderIds.includes(a) && !aliases.includes(a) + ); if (invalidAdders.length > 0) { console.error(`Invalid adders specified: ${invalidAdders.join(', ')}`); process.exit(1); From f605098697152eca3a48069b14384178e2fb46ed Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:30:38 -0700 Subject: [PATCH 10/12] leave it called lucia for now --- packages/adders/_config/official.ts | 4 ++-- packages/adders/lucia/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/adders/_config/official.ts b/packages/adders/_config/official.ts index 07ac3a75e..9fb704b4f 100644 --- a/packages/adders/_config/official.ts +++ b/packages/adders/_config/official.ts @@ -2,7 +2,7 @@ import type { AdderWithoutExplicitArgs } from '@sveltejs/cli-core'; import drizzle from '../drizzle/index.ts'; import eslint from '../eslint/index.ts'; -import auth from '../lucia/index.ts'; +import lucia from '../lucia/index.ts'; import mdsvex from '../mdsvex/index.ts'; import paraglide from '../paraglide/index.ts'; import playwright from '../playwright/index.ts'; @@ -21,7 +21,7 @@ export const officialAdders = [ playwright, tailwindcss, drizzle, - auth, + lucia, mdsvex, paraglide, storybook, diff --git a/packages/adders/lucia/index.ts b/packages/adders/lucia/index.ts index 7056eb41c..9b5fcd4ed 100644 --- a/packages/adders/lucia/index.ts +++ b/packages/adders/lucia/index.ts @@ -38,7 +38,7 @@ export const options = defineAdderOptions({ }); export default defineAdder({ - id: 'auth', + id: 'lucia', environments: { svelte: false, kit: true }, homepage: 'https://lucia-next.pages.dev', options, From 13a1fcfa416d3a17a978ccb058fa1bdb1edeb03f Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:59:19 -0400 Subject: [PATCH 11/12] small tweaks --- packages/cli/commands/add/index.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 594568934..3ceb0ec4e 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -37,8 +37,7 @@ const OptionsSchema = v.strictObject({ }); type Options = v.InferOutput; -const adderDetails = officialAdders.map((adder) => getAdderDetails(adder.id)); -const aliases = adderDetails.map((c) => c.alias).filter((v) => v !== undefined); +const aliases = officialAdders.map((c) => c.alias).filter((v) => v !== undefined); const addersOptions = getAdderOptionFlags(); const communityDetails: AdderWithoutExplicitArgs[] = []; @@ -300,7 +299,7 @@ export async function runAddCommand(options: Options, selectedAdderIds: string[] const workspace = createWorkspace(options.cwd); for (const depId of dependents) { - const dependent = adderDetails.find((a) => a.id === depId); + const dependent = officialAdders.find((a) => a.id === depId) as AdderWithoutExplicitArgs; if (!dependent) throw new Error(`Adder '${adder.id}' depends on an invalid '${depId}'`); // check if the dependent adder has already been installed @@ -556,7 +555,7 @@ function transformAliases(ids: string[]): string[] { const set = new Set(); for (const id of ids) { if (aliases.includes(id)) { - const adder = adderDetails.find((a) => a.alias === id)!; + const adder = officialAdders.find((a) => a.alias === id)!; set.add(adder.id); } else { set.add(id); From 4206b6ba6d8f2ccc3644f9addac1095a57295de1 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:00:31 -0400 Subject: [PATCH 12/12] drive-by: dont be slow --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 63fabdfe4..1c24e0c2b 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,12 @@ "private": true, "type": "module", "scripts": { - "check": "pnpm -r check", - "lint": "pnpm -r lint && eslint --cache --cache-location node_modules/.eslintcache", - "format": "pnpm -r format", + "check": "pnpm --parallel check", + "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", + "format": "pnpm --parallel format", "dev": "rollup --config --watch", "build": "rollup -c", - "test": "pnpm -r test", + "test": "pnpm --parallel test", "changeset:publish": "changeset publish" }, "devDependencies": {