Skip to main content

sv

sv expose une API programmatique permettant de créer des projets et d’exécuter des add-ons.

defineAddon

Crée une définition d’add-on. Consultez la section créez le votre pour trouver un guide complet.

import { transforms } from '@sveltejs/sv-utils';
import { defineAddon, defineAddonOptions } from 'sv';

export default defineAddon({
	id: 'my-addon',
	options: defineAddonOptions().build(),

	// appelé avant l'exécution — déclarer des dépendances, des prérequis d'environnement et des options dynamiques
	setup: ({ dependsOn, unsupported, isKit }) => {
		if (!isKit) unsupported('Nécessite SvelteKit');
		dependsOn('eslint');

		// ajoute dynamiquement des options (par ex. basé sur l'état du workspace ou des données récupérées)
		addOption('theme', {
			question: 'Which theme?',
			type: 'select',
			default: 'dark',
			options: [{ value: 'dark' }, { value: 'light' }]
		});
	},

	// le travail effectif — ajouter, modifier des fichiers, déclarer des dépendances
	run: ({ sv, options, cancel }) => {
		// ajouter une dépendance
		sv.devDependency('my-lib', '^1.0.0');

		// créer ou ajouter des fichiers en utilisant des transformations de @sveltejs/sv-utils
		sv.file('src/lib/foo.ts', (content) => {
			return 'export const foo = true;';
		});

		sv.file(
			'src/routes/+page.svelte',
			transforms.svelte(({ ast, svelte }) => {
				svelte.addFragment(ast, '<p>Hello!</p>');
			})
		);

		// annuler à tout moment si quelque chose se passe mal
		// cancel('reason');
	},

	// affiché après l'exécution de l'add-on
	nextSteps: ({ options }) => ['Lancer `npm run dev` pour commencer']
});

L’objet sv dans run fournit file, dependency, devDependency, et execute. Pour les transformations (l’édition de scripts, de composants Svelte, de CSS, de JSON,... basée sur des AST), et les utilitaires de gestion de paquets, consultez @sveltejs/sv-utils.

Options typées dynamiques

Si votre add-on ajoute des options dynamiquement dans setup, (par ex, depuis un appel fetch), vous pouvez fournir un paramètre de type à defineAddon pour obtenir un typage fort pour ces options :

const addon = defineAddon<{ theme: string }>()({
	id: 'my-addon',
	options: defineAddonOptions().build(),
	setup: ({ addOption }) => {
		addOption('theme', {
			question: 'Quel thème ?',
			type: 'string',
			default: 'dark'
		});
	},
	run: ({ options }) => {
		options.theme; // string
	}
});

Le paramètre de type fait correspondre le type (boolean, string, number) aux définitions des questions. Sans ce paramètre, defineAddon reste strict et autorise uniquement des options définies de manière statique.

defineAddonOptions

Permet de construire des options pour les add-ons. Chaîné avec .add() et finalisé par .build().

import { defineAddonOptions } from 'sv';

const options = defineAddonOptions()
	.add('database', {
		question: 'Quelle base de données ?',
		type: 'select',
		default: 'postgresql',
		options: [
			{ value: 'postgresql' },
			{ value: 'mysql' },
			{ value: 'sqlite' }
		]
	})
	.add('docker', {
		question: 'Ajouter un fichier docker-compose ?',
		type: 'boolean',
		default: false,
		// ne poser la question que lorsque la base de données n'est pas sqlite
		condition: (opts) => opts.database !== 'sqlite'
	})
	.build();

Les options sont posées dans l’ordre. Le callback condition reçoit les réponses collectées jusque là — renvoyez false pour éviter la question (sa valeur sera undefined).

create

Crée programmatiquement un nouveau projet Svelte.

import { create } from 'sv';

create({
	cwd: './my-app',
	name: 'my-app',
	template: 'minimal',
	types: 'typescript'
});

add

Exécute programmatiquement des add-ons sur un projet existant.

import { add, officialAddons } from 'sv';

await add({
	cwd: './my-app',
	addons: { prettier: officialAddons.prettier },
	options: { prettier: {} },
	packageManager: 'npm'
});

Modifier cette page sur Github llms.txt

précédent suivant