Skip to content

Commit

Permalink
Another failed attempt to fix types
Browse files Browse the repository at this point in the history
  • Loading branch information
xeho91 committed Jun 12, 2024
1 parent e42f8b4 commit 16ded27
Show file tree
Hide file tree
Showing 10 changed files with 68 additions and 54 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
"storybook": "^8.1.6",
"svelte": "5.0.0-next.136",
"svelte-check": "^3.5.0",
"type-fest": "^4.20.0",
"typescript": "^5.4.5",
"typescript-svelte-plugin": "^0.3.38",
"vite": "^5.2.10",
Expand Down
9 changes: 9 additions & 0 deletions pnpm-lock.yaml

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

23 changes: 8 additions & 15 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,19 @@
import type { Meta, StoryContext as BaseStoryContext } from '@storybook/svelte';
import type { Meta } from '@storybook/svelte';
import type { ComponentType } from 'svelte';

import type { Args, StoryContext } from '#types';

import Story from './runtime/Story.svelte';
import type { StoryObj } from '#types';

export { setTemplate } from './runtime/contexts/template.svelte';

export function defineMeta<TOverrideArgs = unknown, const TMeta extends Meta = Meta>(meta: TMeta) {
export function defineMeta<const TOverrideArgs = unknown, const TMeta extends Meta = Meta>(
meta: TMeta
) {
return {
Story: Story as typeof Story<TMeta, TOverrideArgs>,
Story: Story as ComponentType<Story<TOverrideArgs, TMeta>>,
meta,
};
}

export type Args<TStory extends ComponentType> = TStory extends typeof Story<
infer TMeta extends Meta
>
? StoryObj<TMeta>
: never;

export type StoryContext<TStory extends ComponentType> = TStory extends typeof Story<
infer TMeta extends Meta
>
? BaseStoryContext<StoryObj<TMeta>>
: never;
export type { Args, StoryContext };
3 changes: 2 additions & 1 deletion src/runtime/StoriesExtractor.svelte
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<script lang="ts" generics="Component extends SvelteComponent = SvelteComponent">
import type { Meta } from '@storybook/svelte';
import type { ComponentType, SvelteComponent } from 'svelte';
import type { Meta } from '#types';
import {
type StoriesRepository,
createStoriesExtractorContext,
Expand Down
27 changes: 12 additions & 15 deletions src/runtime/Story.svelte
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
<script lang="ts" generics="TMeta extends Meta = Meta, TOverrideArgs = unknown">
import type { StoryObj, StoryContext, Meta } from '@storybook/svelte';
import type { ComponentProps, ComponentType, Snippet } from 'svelte';
<script lang="ts" generics="TOverrideArgs = unknown, const TMeta extends Meta = Meta">
import type { StoryObj } from '@storybook/svelte';
import type { ComponentType, Snippet } from 'svelte';
import type { Meta } from '#types';
import { useStoriesExtractor } from '#runtime/contexts/extractor.svelte';
import { useStoryRenderer } from '#runtime/contexts/renderer.svelte';
import { useStoryRenderer, type StoryRendererContext } from '#runtime/contexts/renderer.svelte';
import { useStoriesTemplate } from '#runtime/contexts/template.svelte';
import { storyNameToExportName } from '#utils/identifier-utils';
type SnippetsToPrimitives<Args> = {
[ArgKey in keyof Args]?: Args[ArgKey] extends Snippet
? Snippet | string | number | boolean | undefined
: Args[ArgKey];
};
type SnippetSchildrenArgs = [
StoryRendererContext<TMeta>['args'],
StoryRendererContext<TMeta>['storyContext'],
];
type Props = {
/**
Expand All @@ -22,7 +23,7 @@
* Can be omitted if a default template is set with setTemplate()
*
*/
children?: Snippet<[Omit<StoryObj<TMeta>['args'], 'children'>, StoryContext<TMeta['args']>]>;
children?: Snippet<SnippetSchildrenArgs>;
/**
* Name of the story. Can be omitted if `exportName` is provided.
*/
Expand Down Expand Up @@ -51,11 +52,7 @@
* The args for the story
*/
// args?: SnippetsToPrimitives<Omit<StoryObj<TMeta>['args'], keyof TOverrideArgs> & TOverrideArgs>;
} & Omit<StoryObj<TMeta>, 'args'> & {
args?: TMeta['component'] extends ComponentType<infer Component>
? Partial<SnippetsToPrimitives<ComponentProps<Component>>>
: unknown;
};
} & StoryObj<TMeta>;
const { children, name, exportName: exportNameProp, play, ...restProps }: Props = $props();
const exportName = exportNameProp ?? storyNameToExportName(name!);
Expand Down
4 changes: 1 addition & 3 deletions src/runtime/StoryRenderer.svelte
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
<script lang="ts" generics="TMeta extends Meta = Meta">
import type { Meta, StoryContext, StoryObj } from '@storybook/svelte';
import type { ComponentType, SvelteComponent } from 'svelte';
import type Story from './Story.svelte';
import type { ComponentType } from 'svelte';
import { useStoryRenderer } from '#runtime/contexts/renderer.svelte';
import { emitCode } from '#runtime/emit-code';
Expand Down
7 changes: 3 additions & 4 deletions src/runtime/contexts/extractor.svelte.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
// WARN: Temporary location. Feel free to move if needed.
// It is likely this file will be removed if we successfully get rid of `StoriesExtractor`.

import type { Meta, StoryObj } from '@storybook/svelte';
import type { StoryObj } from '@storybook/svelte';
import { getContext, hasContext, setContext } from 'svelte';

import type { Meta } from '#types';

import { storyNameToExportName } from '#utils/identifier-utils';

const CONTEXT_KEY = 'storybook-stories-extractor-context';
Expand Down
10 changes: 6 additions & 4 deletions src/runtime/contexts/renderer.svelte.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import type { Meta, StoryObj, StoryContext } from '@storybook/svelte';
import type { StoryContext, StoryObj } from '@storybook/svelte';
import { getContext, hasContext, setContext } from 'svelte';

import type { Meta } from '#types';

const CONTEXT_KEY = 'storybook-story-renderer-context';

interface StoryRendererContextProps<TMeta extends Meta> {
interface ContextProps<TMeta extends Meta> {
currentStoryExportName: string | undefined;
args: StoryObj<TMeta>['args'];
storyContext: StoryContext<StoryObj<TMeta>['args']>;
}

function buildContext<TMeta extends Meta>(props: StoryRendererContextProps<TMeta>) {
function buildContext<TMeta extends Meta>(props: ContextProps<TMeta>) {
let currentStoryExportName = $state(props.currentStoryExportName);
let args = $state(props.args);
let storyContext = $state(props.storyContext);

function set(props: StoryRendererContextProps<TMeta>) {
function set(props: ContextProps<TMeta>) {
currentStoryExportName = props.currentStoryExportName;
args = props.args;
storyContext = props.storyContext;
Expand Down
3 changes: 2 additions & 1 deletion src/runtime/contexts/template.svelte.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import type { Meta } from '@storybook/svelte';
import { getContext, hasContext, setContext, type ComponentProps } from 'svelte';

import type Story from '#runtime/Story.svelte';

import type { Meta } from '#types';

const CONTEXT_KEYS = 'storybook-stories-template-snippet-context';

function buildContext<TMeta extends Meta = Meta>() {
Expand Down
35 changes: 24 additions & 11 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
import type { Meta, StoryObj as BaseStoryObj } from '@storybook/svelte';
import type { ComponentProps, ComponentType, Snippet } from 'svelte';
import type {
Args as BaseArgs,
Meta as BaseMeta,
StoryContext as BaseStoryContext,
} from '@storybook/svelte';
import type { ComponentType, Snippet, SvelteComponent } from 'svelte';
import type { Primitive } from 'type-fest';

type SnippetsToPrimitives<Args> = {
[ArgKey in keyof Args]?: Args[ArgKey] extends Snippet
? Snippet | string | number | boolean | undefined
: Args[ArgKey];
};
import Story from './runtime/Story.svelte';

export type StoryObj<TMeta extends Meta> = Omit<BaseStoryObj<TMeta>, 'args'> & {
args?: TMeta['component'] extends ComponentType<infer Component>
? Partial<SnippetsToPrimitives<ComponentProps<Component>>>
: unknown;
type SnippetsToPrimitives<Props extends Record<string, unknown>> = {
[ArgKey in keyof Props]?: Props[ArgKey] extends Snippet ? Snippet | Primitive : Props[ArgKey];
};

export type Meta<CmpOrArgs = BaseArgs> =
CmpOrArgs extends SvelteComponent<infer Props extends Record<string, unknown>>
? BaseMeta<SvelteComponent<SnippetsToPrimitives<Props>>>
: BaseMeta<CmpOrArgs>;

export type Args<TStory extends ComponentType = ComponentType> =
TStory extends ComponentType<Story<infer TOverrideArgs, infer TMeta extends Meta>>
? TMeta['args']
: never;

export type StoryContext<TStory extends ComponentType = ComponentType> = BaseStoryContext<
Args<TStory>
>;

0 comments on commit 16ded27

Please sign in to comment.