Merge pull request #28918 from storybookjs/yann/add-sveltekit-portable-stories

SvelteKit: Introduce portable stories support
This commit is contained in:
Yann Braga 2024-08-19 04:07:51 -07:00 committed by GitHub
commit 31c9141ec9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 46 additions and 22 deletions

View File

@ -723,7 +723,7 @@ workflows:
requires:
- build-sandboxes
- vitest-integration:
parallelism: 4
parallelism: 5
requires:
- create-sandboxes
- bench:
@ -789,7 +789,7 @@ workflows:
requires:
- build-sandboxes
- vitest-integration:
parallelism: 4
parallelism: 5
requires:
- create-sandboxes
- test-portable-stories:
@ -856,7 +856,7 @@ workflows:
requires:
- build-sandboxes
- vitest-integration:
parallelism: 8
parallelism: 11
requires:
- create-sandboxes
- test-portable-stories:

View File

@ -25,8 +25,8 @@
"exports": {
".": {
"types": "./dist/index.d.ts",
"node": "./dist/index.js",
"import": "./dist/index.mjs",
"node": "./dist/index.js",
"require": "./dist/index.js"
},
"./dist/preview.mjs": {
@ -36,6 +36,11 @@
"types": "./dist/preset.d.ts",
"require": "./dist/preset.js"
},
"./vite": {
"types": "./dist/vite.d.ts",
"require": "./dist/vite.js",
"import": "./dist/vite.mjs"
},
"./package.json": "./package.json"
},
"main": "dist/index.js",
@ -78,7 +83,8 @@
"entries": [
"./src/index.ts",
"./src/preview.ts",
"./src/preset.ts"
"./src/preset.ts",
"./src/vite.ts"
],
"platform": "node"
},

View File

@ -0,0 +1,5 @@
import { mockSveltekitStores } from './plugins/mock-sveltekit-stores';
export const storybookSveltekitPlugin = () => {
return [mockSveltekitStores()];
};

View File

@ -2,6 +2,6 @@
import { enhance } from '$app/forms';
</script>
<form use:enhance>
<form use:enhance method="post">
<button>enhance</button>
</form>

View File

@ -449,8 +449,7 @@ const baseTemplates = {
renderer: '@storybook/svelte',
builder: '@storybook/builder-vite',
},
// TODO: remove vitest-integration filter once project annotations exist for sveltekit
skipTasks: ['e2e-tests-dev', 'bench', 'vitest-integration'],
skipTasks: ['e2e-tests-dev', 'bench'],
},
'svelte-kit/skeleton-ts': {
name: 'SvelteKit Latest (Vite | TypeScript)',
@ -461,8 +460,7 @@ const baseTemplates = {
renderer: '@storybook/svelte',
builder: '@storybook/builder-vite',
},
// TODO: remove vitest-integration filter once project annotations exist for sveltekit
skipTasks: ['e2e-tests-dev', 'bench', 'vitest-integration'],
skipTasks: ['e2e-tests-dev', 'bench'],
},
'svelte-kit/prerelease-ts': {
name: 'SvelteKit Prerelease (Vite | TypeScript)',
@ -473,7 +471,7 @@ const baseTemplates = {
renderer: '@storybook/svelte',
builder: '@storybook/builder-vite',
},
skipTasks: ['e2e-tests-dev', 'bench', 'vitest-integration'],
skipTasks: ['e2e-tests-dev', 'bench'],
},
'lit-vite/default-js': {
name: 'Lit Latest (Vite | JavaScript)',

View File

@ -360,17 +360,40 @@ async function linkPackageStories(
);
}
const getVitestPluginInfo = (details: TemplateDetails) => {
let frameworkPluginImport = '';
let frameworkPluginCall = '';
const framework = details.template.expected.framework;
const isNextjs = framework.includes('nextjs');
const isSveltekit = framework.includes('sveltekit');
if (isNextjs) {
frameworkPluginImport = "import vitePluginNext from 'vite-plugin-storybook-nextjs'";
frameworkPluginCall = 'vitePluginNext()';
}
if (isSveltekit) {
frameworkPluginImport = "import { storybookSveltekitPlugin } from '@storybook/sveltekit/vite'";
frameworkPluginCall = 'storybookSveltekitPlugin()';
}
return { frameworkPluginImport, frameworkPluginCall };
};
export async function setupVitest(details: TemplateDetails, options: PassedOptionValues) {
const { sandboxDir, template } = details;
const isVue = template.expected.renderer === '@storybook/vue3';
const isNextjs = template.expected.framework.includes('nextjs');
const { frameworkPluginCall, frameworkPluginImport } = getVitestPluginInfo(details);
// const isAngular = template.expected.framework === '@storybook/angular';
const portableStoriesFrameworks = [
'@storybook/nextjs',
'@storybook/experimental-nextjs-vite',
// TODO: add sveltekit and angular once we enable their sandboxes
'@storybook/sveltekit',
// TODO: add angular once we enable their sandboxes
];
const storybookPackage = portableStoriesFrameworks.includes(template.expected.framework)
? template.expected.framework
@ -409,7 +432,7 @@ export async function setupVitest(details: TemplateDetails, options: PassedOptio
dedent`
import { defineWorkspace, defaultExclude } from "vitest/config";
import { storybookTest } from "@storybook/experimental-addon-vitest/plugin";
${isNextjs ? "import vitePluginNext from 'vite-plugin-storybook-nextjs'" : ''}
${frameworkPluginImport}
export default defineWorkspace([
{
@ -421,7 +444,7 @@ export async function setupVitest(details: TemplateDetails, options: PassedOptio
include: ["vitest"],
},
}),
${isNextjs ? 'vitePluginNext(),' : ''}
${frameworkPluginCall}
],
${
isNextjs
@ -452,14 +475,6 @@ export async function setupVitest(details: TemplateDetails, options: PassedOptio
...defaultExclude,
// TODO: investigate TypeError: Cannot read properties of null (reading 'useContext')
"**/*argtypes*",
// TODO (SVELTEKIT): Failures related to missing framework annotations
"**/frameworks/sveltekit_svelte-kit-skeleton-ts/navigation.stories*",
"**/frameworks/sveltekit_svelte-kit-skeleton-ts/hrefs.stories*",
// TODO (SVELTEKIT): Investigate Error: use:enhance can only be used on <form> fields with method="POST"
"**/frameworks/sveltekit_svelte-kit-skeleton-ts/forms.stories*",
// TODO (SVELTE|SVELTEKIT): Typescript preprocessor issue
"**/frameworks/svelte-vite_svelte-vite-default-ts/ts-docs.stories.*",
"**/frameworks/sveltekit_svelte-kit-skeleton-ts/ts-docs.stories.*",
],
/**
* TODO: Either fix or acknowledge limitation of: