Skip to content

Commit

Permalink
🚧 WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
xeho91 committed May 13, 2024
1 parent 9788bd4 commit 6e5ccae
Show file tree
Hide file tree
Showing 18 changed files with 1,736 additions and 984 deletions.
123 changes: 123 additions & 0 deletions context.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import type { Meta, StoryContext, StoryObj } from "@storybook/svelte";
import type { StoryName } from "@storybook/types";
import {
type ComponentProps,
type SvelteComponent,
getContext,
hasContext,
setContext,
} from "svelte";
import { type Writable, writable } from "svelte/store";
import type { SetOptional, SetRequired } from "type-fest";

const CONTEXT_KEY = "storybook-registration-context";
const CONTEXT_KEY_COMPONENT = "storybook-registration-context-component";

export type AddonTemplateObj<Component extends SvelteComponent> = Omit<
StoryObj<Component>,
"render"
> & {
id: string;
};

export type AddonStoryObj<Component extends SvelteComponent> = Omit<
SetRequired<StoryObj<Component>, "name">,
"render"
> & {
templateId?: AddonTemplateObj<Component>["id"];
};

export type Repositories<Component extends SvelteComponent> = {
meta: Meta<Component>;
templates: Map<string, AddonTemplateObj<Component>>;
stories: Map<StoryName, AddonStoryObj<Component>>;
};

export interface Context<Component extends SvelteComponent = SvelteComponent> {
render: boolean;
registerTemplate: (template: AddonTemplateObj<Component>) => void;
registerStory: (story: AddonStoryObj<Component>) => void;
}

export interface RegisterContext<
Component extends SvelteComponent = SvelteComponent,
> {
argsStore: Writable<ComponentProps<Component>>;
storyContextStore: Writable<StoryContext<ComponentProps<Component>>>;
currentTemplateId: Writable<AddonTemplateObj<Component>["id"] | undefined>;
currentStoryName: Writable<StoryName | undefined>;
}

export function createRenderContext<Component extends SvelteComponent>(
props: SetOptional<Context<Component>, "registerStory" | "registerTemplate">,
) {
setContext<Context<Component>>(CONTEXT_KEY, {
...props,
registerStory: props.registerStory ?? (() => {}),
registerTemplate: props.registerTemplate ?? (() => {}),
});

resetRenderContext();
}

export function createRegistrationContext<Component extends SvelteComponent>(
repositories: Repositories<Component>,
) {
const { templates, stories } = repositories;

createRenderContext<Component>({
render: false,
registerTemplate: (template) => {
templates.set(template.id, template);
},
registerStory: (story) => {
stories.set(story.name, story);
},
});
}

export function useContext<Component extends SvelteComponent>() {
if (!hasContext(CONTEXT_KEY)) {
createRenderContext<Component>({ render: true });
}

return getContext<Context<Component>>(CONTEXT_KEY);
}

function resetRenderContext<Component extends SvelteComponent>() {
setContext<RegisterContext<Component>>(CONTEXT_KEY_COMPONENT, {
argsStore: writable(),
storyContextStore: writable(),
currentTemplateId: writable(),
currentStoryName: writable(),
});
}

export function getRenderContext<
Component extends SvelteComponent,
>(): RegisterContext<Component> {
if (!hasContext(CONTEXT_KEY_COMPONENT)) {
resetRenderContext();
}

return getContext<RegisterContext<Component>>(CONTEXT_KEY_COMPONENT);
}

export function setRenderContext<Component extends SvelteComponent>({
args,
storyContext,
currentTemplateId,
currentStoryName,
}: {
args: ComponentProps<Component>;
storyContext: StoryContext<ComponentProps<Component>>;
currentTemplateId: AddonTemplateObj<Component>["id"] | undefined;
currentStoryName: StoryName | undefined;
}) {
const ctx = getRenderContext<Component>();

ctx.argsStore.set(args);
ctx.storyContextStore.set(storyContext);
ctx.currentStoryName.set(currentStoryName);
ctx.currentTemplateId.set(currentTemplateId);
}
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
"dependencies": {
"@babel/runtime": "^7.22.6",
"dedent": "^1.2.0",
"deepmerge-ts": "^5.1.0",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.1"
},
"devDependencies": {
Expand Down Expand Up @@ -82,10 +84,11 @@
"react-dom": "^18.2.0",
"rimraf": "^3.0.2",
"storybook": "^8.0.9",
"svelte": "^5.0.0-next.117",
"svelte": "5.0.0-next.131",
"svelte-check": "^3.5.0",
"svelte-jester": "^3.0.0",
"svelte-loader": "^3.1.7",
"type-fest": "^4.18.2",
"typescript": "^5.1.6",
"vite": "^5.2.10",
"vitest": "^1.5.2"
Expand Down
Loading

0 comments on commit 6e5ccae

Please sign in to comment.