storybook-solidjs-vite 10.0.13 → 10.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -4
- package/dist/chunk-2DIRFC5W.js +134 -0
- package/dist/chunk-2DIRFC5W.js.map +1 -0
- package/dist/chunk-7HMQHLZ6.js +90 -0
- package/dist/chunk-7HMQHLZ6.js.map +1 -0
- package/dist/chunk-FRAIA7MB.js +34 -0
- package/dist/chunk-FRAIA7MB.js.map +1 -0
- package/dist/chunk-NNSMHFZY.js +42 -0
- package/dist/chunk-NNSMHFZY.js.map +1 -0
- package/dist/chunk-P43SJLUM.js +87 -0
- package/dist/chunk-P43SJLUM.js.map +1 -0
- package/dist/{chunk-DY54VIKM.js → chunk-R46BQ22I.js} +43 -44
- package/dist/chunk-R46BQ22I.js.map +1 -0
- package/dist/chunk-T3EBLI6L.js +8 -0
- package/dist/chunk-T3EBLI6L.js.map +1 -0
- package/dist/{chunk-745IQ3F5.js → chunk-W3QB2KPF.js} +6 -8
- package/dist/chunk-W3QB2KPF.js.map +1 -0
- package/dist/{renderer/entry-preview-argtypes.d.ts → entry-preview/argtypes.d.ts} +1 -2
- package/dist/entry-preview/argtypes.js +4 -0
- package/dist/entry-preview/argtypes.js.map +1 -0
- package/dist/{renderer/entry-preview-docs.d.ts → entry-preview/docs.d.ts} +1 -4
- package/dist/entry-preview/docs.js +4 -0
- package/dist/entry-preview/docs.js.map +1 -0
- package/dist/entry-preview/solid-1.d.ts +16 -0
- package/dist/entry-preview/solid-1.js +5 -0
- package/dist/entry-preview/solid-1.js.map +1 -0
- package/dist/entry-preview/solid-2.d.ts +16 -0
- package/dist/entry-preview/solid-2.js +5 -0
- package/dist/entry-preview/solid-2.js.map +1 -0
- package/dist/{node/index.d.ts → framework/node.d.ts} +1 -1
- package/dist/framework/node.js +4 -0
- package/dist/framework/node.js.map +1 -0
- package/dist/{preset.d.ts → framework/preset.d.ts} +1 -1
- package/dist/{preset.js → framework/preset.js} +9 -4
- package/dist/framework/preset.js.map +1 -0
- package/dist/index.d.ts +54 -9
- package/dist/index.js +21 -7
- package/dist/index.js.map +1 -1
- package/dist/next.d.ts +57 -0
- package/dist/next.js +24 -0
- package/dist/next.js.map +1 -0
- package/dist/preview-annotations-D06K0F7B.d.ts +13 -0
- package/dist/public-types-Cr0kLSZG.d.ts +83 -0
- package/dist/public-types-Dgk4zHE_.d.ts +33 -0
- package/dist/public-types-DsEAs0AM.d.ts +33 -0
- package/dist/renderer/playwright.d.ts +1 -0
- package/dist/renderer/playwright.js +4 -0
- package/dist/renderer/playwright.js.map +1 -0
- package/dist/renderer.js +24 -0
- package/dist/renderer.js.map +1 -0
- package/dist/{applyDecorators-bBQQC6C7.d.ts → set-optional.d-CLuS_wjB.d.ts} +10 -151
- package/dist/{types-CGyZsZD6.d.ts → types-CixQ_ttK.d.ts} +11 -8
- package/package.json +70 -33
- package/src/framework/node.ts +5 -0
- package/src/framework/preset.ts +86 -0
- package/src/framework/solidVersion.ts +61 -0
- package/src/framework/types.ts +47 -0
- package/src/index.ts +4 -0
- package/src/next.ts +15 -0
- package/src/renderer/docs/entry-preview-argtypes.ts +15 -0
- package/src/renderer/docs/entry-preview.ts +22 -0
- package/src/renderer/docs/extractArgTypes.ts +86 -0
- package/src/renderer/docs/lib/captions.ts +6 -0
- package/src/renderer/docs/lib/defaultValues/createDefaultValue.ts +87 -0
- package/src/renderer/docs/lib/defaultValues/createFromRawDefaultProp.ts +183 -0
- package/src/renderer/docs/lib/defaultValues/generateArray.ts +24 -0
- package/src/renderer/docs/lib/defaultValues/generateObject.ts +24 -0
- package/src/renderer/docs/lib/defaultValues/index.ts +2 -0
- package/src/renderer/docs/lib/defaultValues/prettyIdentifier.ts +28 -0
- package/src/renderer/docs/lib/generateCode.ts +70 -0
- package/src/renderer/docs/lib/inspection/acornParser.test.ts +257 -0
- package/src/renderer/docs/lib/inspection/acornParser.ts +241 -0
- package/src/renderer/docs/lib/inspection/index.ts +2 -0
- package/src/renderer/docs/lib/inspection/inspectValue.ts +17 -0
- package/src/renderer/docs/lib/inspection/types.ts +65 -0
- package/src/renderer/docs/lib/isHtmlTag.ts +5 -0
- package/src/renderer/docs/propTypes/createType.ts +433 -0
- package/src/renderer/docs/propTypes/generateFuncSignature.ts +70 -0
- package/src/renderer/docs/propTypes/handleProp.ts +51 -0
- package/src/renderer/docs/propTypes/rawDefaultPropResolvers.ts +36 -0
- package/src/renderer/docs/propTypes/sortProps.ts +18 -0
- package/src/renderer/docs/typeScript/handleProp.ts +31 -0
- package/src/renderer/index.ts +46 -0
- package/src/renderer/playwright.ts +1 -0
- package/src/renderer/shared/apply-decorators.ts +55 -0
- package/src/renderer/shared/create-define-preview.ts +46 -0
- package/src/renderer/shared/preview-annotations.ts +54 -0
- package/src/renderer/shared/public-types.ts +43 -0
- package/src/renderer/shared/story-store.ts +103 -0
- package/src/renderer/v1/define-preview.ts +100 -0
- package/src/renderer/v1/entry-preview.ts +115 -0
- package/src/renderer/v1/index.ts +5 -0
- package/src/renderer/v1/public-api.ts +29 -0
- package/src/renderer/v1/public-types.ts +76 -0
- package/src/renderer/v2/define-preview.ts +100 -0
- package/src/renderer/v2/entry-preview.ts +118 -0
- package/src/renderer/v2/index.ts +5 -0
- package/src/renderer/v2/public-api.ts +29 -0
- package/src/renderer/v2/public-types.ts +76 -0
- package/dist/chunk-3NQOL5RP.js +0 -168
- package/dist/chunk-3NQOL5RP.js.map +0 -1
- package/dist/chunk-64ZBL7FG.js +0 -32
- package/dist/chunk-64ZBL7FG.js.map +0 -1
- package/dist/chunk-745IQ3F5.js.map +0 -1
- package/dist/chunk-DY54VIKM.js.map +0 -1
- package/dist/chunk-TRRHAJUQ.js +0 -52
- package/dist/chunk-TRRHAJUQ.js.map +0 -1
- package/dist/chunk-Z2N7T5KU.js +0 -18
- package/dist/chunk-Z2N7T5KU.js.map +0 -1
- package/dist/chunk-ZOEBJPOX.js +0 -8
- package/dist/chunk-ZOEBJPOX.js.map +0 -1
- package/dist/entry-preview-DMjIkfe9.d.ts +0 -56
- package/dist/node/index.js +0 -4
- package/dist/node/index.js.map +0 -1
- package/dist/preset.js.map +0 -1
- package/dist/renderer/entry-preview-argtypes.js +0 -4
- package/dist/renderer/entry-preview-argtypes.js.map +0 -1
- package/dist/renderer/entry-preview-docs.js +0 -5
- package/dist/renderer/entry-preview-docs.js.map +0 -1
- package/dist/renderer/entry-preview.d.ts +0 -6
- package/dist/renderer/entry-preview.js +0 -5
- package/dist/renderer/entry-preview.js.map +0 -1
- package/dist/renderer/index.d.ts +0 -31
- package/dist/renderer/index.js +0 -9
- package/dist/renderer/index.js.map +0 -1
- package/dist/renderer/preset.js +0 -20
- package/dist/renderer/preset.js.map +0 -1
- package/dist/renderer/preview.d.ts +0 -39
- package/dist/renderer/preview.js +0 -8
- package/dist/renderer/preview.js.map +0 -1
- package/dist/types-vFmObJUf.d.ts +0 -11
- package/preset.js +0 -1
- package/preview.js +0 -1
- /package/dist/{renderer/preset.d.ts → renderer.d.ts} +0 -0
- /package/src/{renderer/typings.d.ts → typings.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -15,10 +15,11 @@ Adds SolidJS support to Storybook.
|
|
|
15
15
|
|
|
16
16
|
## ✨ Features
|
|
17
17
|
|
|
18
|
-
-
|
|
18
|
+
- Solid 1 and Solid 2 support
|
|
19
19
|
- Vite-powered builder
|
|
20
20
|
- TypeScript-first setup
|
|
21
21
|
- ArgTypes generation from TypeScript
|
|
22
|
+
- [CSF Next](https://storybook.js.org/docs/api/csf/csf-next) factory API (optional)
|
|
22
23
|
- Compatible with Storybook addons
|
|
23
24
|
- Integrated testing (Vitest, Playwright)
|
|
24
25
|
|
|
@@ -45,6 +46,77 @@ You can customize Vite and Storybook as usual.
|
|
|
45
46
|
- Add stories in `src/**/*.stories.tsx` or `src/**/*.stories.js`
|
|
46
47
|
- Use Storybook addons for additional functionality
|
|
47
48
|
|
|
49
|
+
### Solid 1
|
|
50
|
+
|
|
51
|
+
On Solid 1, import from `storybook-solidjs-vite` in config, preview, and stories:
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
// .storybook/main.ts
|
|
55
|
+
import type { StorybookConfig } from 'storybook-solidjs-vite';
|
|
56
|
+
|
|
57
|
+
const config: StorybookConfig = {
|
|
58
|
+
framework: 'storybook-solidjs-vite',
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export default config;
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
// .storybook/preview.tsx & stories
|
|
66
|
+
import type { Preview, Meta, StoryObj } from 'storybook-solidjs-vite';
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Solid 2
|
|
70
|
+
|
|
71
|
+
On Solid 2, use `storybook-solidjs-vite/next` in preview and stories — the types there match the Solid 2 renderer:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import type { Preview, Meta, StoryObj } from 'storybook-solidjs-vite/next';
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Imports without `/next` often still run, but TypeScript may complain because those types describe the Solid 1 renderer.
|
|
78
|
+
|
|
79
|
+
In `main.ts` either framework name is fine: `storybook-solidjs-vite` reads the major version from your installed `solid-js`, and `storybook-solidjs-vite/next` forces Solid 2.
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
framework: 'storybook-solidjs-vite'
|
|
83
|
+
framework: 'storybook-solidjs-vite/next'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### CSF Next
|
|
87
|
+
|
|
88
|
+
[CSF Next](https://storybook.js.org/docs/api/csf/csf-next) works on Solid 1 and Solid 2.
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
// .storybook/main.ts
|
|
92
|
+
import { defineMain } from 'storybook-solidjs-vite/node';
|
|
93
|
+
|
|
94
|
+
export default defineMain({
|
|
95
|
+
framework: { name: 'storybook-solidjs-vite' },
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
// .storybook/preview.tsx
|
|
101
|
+
import { definePreview } from 'storybook-solidjs-vite';
|
|
102
|
+
// for Solid 2, use:
|
|
103
|
+
// import { definePreview } from 'storybook-solidjs-vite/next';
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
// src/Button.stories.ts
|
|
108
|
+
import preview from '../.storybook/preview';
|
|
109
|
+
import { Button } from './Button';
|
|
110
|
+
|
|
111
|
+
const meta = preview.meta({
|
|
112
|
+
component: Button,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
export const Primary = meta.story({
|
|
116
|
+
args: { label: 'Button' },
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
48
120
|
### TypeScript docgen
|
|
49
121
|
|
|
50
122
|
TypeScript props for docs and controls are generated with [@joshwooding/vite-plugin-react-docgen-typescript](https://github.com/joshwooding/vite-plugin-react-docgen-typescript).
|
|
@@ -77,13 +149,13 @@ export default config;
|
|
|
77
149
|
|
|
78
150
|
## 🎨 Decorators
|
|
79
151
|
|
|
80
|
-
Storybook re-
|
|
152
|
+
On args or globals changes, Storybook re-runs decorators and stories — the same model as React, where each update calls your functions again. Solid updates through fine-grained signals and usually does not need that.
|
|
81
153
|
|
|
82
|
-
|
|
154
|
+
If a decorator returns JSX, the extra runs can leave duplicate nodes in the DOM.
|
|
83
155
|
|
|
84
156
|
### createJSXDecorator
|
|
85
157
|
|
|
86
|
-
Use for decorators that return JSX. Ensures they run only once.
|
|
158
|
+
Use for decorators that return JSX. Ensures they run only once per story mount.
|
|
87
159
|
|
|
88
160
|
```tsx
|
|
89
161
|
import { createJSXDecorator } from 'storybook-solidjs-vite';
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { defaultDecorateStory } from 'storybook/preview-api';
|
|
2
|
+
import { global } from '@storybook/global';
|
|
3
|
+
import { createComponent } from 'solid-js';
|
|
4
|
+
import { configure } from 'storybook/test';
|
|
5
|
+
|
|
6
|
+
// src/renderer/shared/public-types.ts
|
|
7
|
+
var IS_SOLID_JSX_FLAG = "__isJSX";
|
|
8
|
+
|
|
9
|
+
// src/renderer/shared/story-store.ts
|
|
10
|
+
var getStoryId = (context) => {
|
|
11
|
+
const canvasId = context.canvasElement?.id;
|
|
12
|
+
if (!canvasId || canvasId === "storybook-root") {
|
|
13
|
+
return context.id;
|
|
14
|
+
}
|
|
15
|
+
return canvasId;
|
|
16
|
+
};
|
|
17
|
+
function createStoryState(createStore) {
|
|
18
|
+
const [globals, setGlobals] = createStore({});
|
|
19
|
+
const renderedStories = /* @__PURE__ */ new Set();
|
|
20
|
+
const argsStores = /* @__PURE__ */ new Map();
|
|
21
|
+
const disposers = /* @__PURE__ */ new Map();
|
|
22
|
+
const getArgsStore = (storyId) => {
|
|
23
|
+
let store = argsStores.get(storyId);
|
|
24
|
+
if (!store) {
|
|
25
|
+
store = createStore({});
|
|
26
|
+
argsStores.set(storyId, store);
|
|
27
|
+
}
|
|
28
|
+
return store;
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
isStoryRendered(storyId) {
|
|
32
|
+
return renderedStories.has(storyId);
|
|
33
|
+
},
|
|
34
|
+
resetStory(storyId) {
|
|
35
|
+
renderedStories.delete(storyId);
|
|
36
|
+
disposers.delete(storyId);
|
|
37
|
+
argsStores.delete(storyId);
|
|
38
|
+
},
|
|
39
|
+
setRendered(storyId, isRendered) {
|
|
40
|
+
if (isRendered) {
|
|
41
|
+
renderedStories.add(storyId);
|
|
42
|
+
} else {
|
|
43
|
+
renderedStories.delete(storyId);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
setDisposeFn(storyId, disposeFn) {
|
|
47
|
+
if (disposeFn) {
|
|
48
|
+
disposers.set(storyId, disposeFn);
|
|
49
|
+
} else {
|
|
50
|
+
disposers.delete(storyId);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
makeContextReactive(context) {
|
|
54
|
+
const storyId = getStoryId(context);
|
|
55
|
+
if (!storyId) {
|
|
56
|
+
throw new Error("Story ID is required");
|
|
57
|
+
}
|
|
58
|
+
const [args, setArgs] = getArgsStore(storyId);
|
|
59
|
+
setArgs(() => context.args);
|
|
60
|
+
setGlobals(() => context.globals);
|
|
61
|
+
context.args = args;
|
|
62
|
+
context.globals = globals;
|
|
63
|
+
},
|
|
64
|
+
disposeStory(storyId) {
|
|
65
|
+
disposers.get(storyId)?.();
|
|
66
|
+
disposers.delete(storyId);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function createApplyDecorators(store, createComponent2) {
|
|
71
|
+
return (storyFn, rawDecorators) => {
|
|
72
|
+
const decorators = rawDecorators.map(
|
|
73
|
+
(decorator) => {
|
|
74
|
+
const originalFn = decorator.originalFn;
|
|
75
|
+
const isJSX = Boolean(
|
|
76
|
+
decorator[IS_SOLID_JSX_FLAG] || originalFn?.[IS_SOLID_JSX_FLAG]
|
|
77
|
+
);
|
|
78
|
+
return (StoryFn, context) => {
|
|
79
|
+
if (isJSX) {
|
|
80
|
+
const storyId = getStoryId(context);
|
|
81
|
+
if (storyId && store.isStoryRendered(storyId)) {
|
|
82
|
+
return StoryFn(context);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return decorator(StoryFn, context);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
return defaultDecorateStory((context) => {
|
|
90
|
+
const storyId = getStoryId(context);
|
|
91
|
+
if (storyId && store.isStoryRendered(storyId)) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return createComponent2(storyFn, context);
|
|
95
|
+
}, decorators);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (global.window) {
|
|
99
|
+
global.window.STORYBOOK_ENV = "solid";
|
|
100
|
+
}
|
|
101
|
+
var parameters = {
|
|
102
|
+
renderer: "solid"
|
|
103
|
+
};
|
|
104
|
+
var render = (_, context) => {
|
|
105
|
+
if (!context.component) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
`Unable to render story ${context.id} as the component annotation is missing from the default export`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
return createComponent(context.component, context.args);
|
|
111
|
+
};
|
|
112
|
+
var beforeAll = async () => {
|
|
113
|
+
try {
|
|
114
|
+
configure({
|
|
115
|
+
unstable_advanceTimersWrapper: (cb) => cb(),
|
|
116
|
+
asyncWrapper: async (cb) => {
|
|
117
|
+
const result = await cb();
|
|
118
|
+
await new Promise((resolve) => {
|
|
119
|
+
setTimeout(() => resolve(), 0);
|
|
120
|
+
if (typeof jest !== "undefined" && jest != null && (setTimeout._isMockFunction === true || Object.prototype.hasOwnProperty.call(setTimeout, "clock"))) {
|
|
121
|
+
jest.advanceTimersByTime(0);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return result;
|
|
125
|
+
},
|
|
126
|
+
eventWrapper: (cb) => cb()
|
|
127
|
+
});
|
|
128
|
+
} catch {
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export { IS_SOLID_JSX_FLAG, beforeAll, createApplyDecorators, createStoryState, getStoryId, parameters, render };
|
|
133
|
+
//# sourceMappingURL=chunk-2DIRFC5W.js.map
|
|
134
|
+
//# sourceMappingURL=chunk-2DIRFC5W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/renderer/shared/public-types.ts","../src/renderer/shared/story-store.ts","../src/renderer/shared/apply-decorators.ts","../src/renderer/shared/preview-annotations.ts"],"names":["createComponent"],"mappings":"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","file":"chunk-2DIRFC5W.js","sourcesContent":["import type {\n Canvas,\n DecoratorFunction,\n RenderContext as GenericRenderContext,\n StoryContext as GenericStoryContext,\n StrictArgs,\n WebRenderer,\n} from 'storybook/internal/types';\nimport type { Simplify } from 'type-fest';\n\nexport type { Args, ArgTypes, Parameters, StrictArgs } from 'storybook/internal/types';\n\n/**\n * Marks decorators that return JSX so they are not re-run on every Storybook update.\n * Prefer `createJSXDecorator` over setting this flag manually.\n */\nexport const IS_SOLID_JSX_FLAG = '__isJSX';\n\n// This performs a downcast to function types that are mocks, when a mock fn is given to meta args.\nexport type AddMocks<TArgs, DefaultArgs> = Simplify<{\n [T in keyof TArgs]: T extends keyof DefaultArgs\n ? DefaultArgs[T] extends (...args: any) => any & { mock: object }\n ? DefaultArgs[T]\n : TArgs[T]\n : TArgs[T];\n}>;\n\n/** Loose renderer shape for shared runtime code (v1 entry-preview and v2 entry-preview). */\nexport interface SolidRenderer extends WebRenderer {\n component: (props: Record<string, any>) => any;\n storyResult: any;\n mount: (ui?: any) => Promise<Canvas>;\n}\n\nexport type Decorator<TArgs = StrictArgs> = DecoratorFunction<SolidRenderer, TArgs> & {\n [IS_SOLID_JSX_FLAG]?: boolean;\n};\n\nexport type StoryContext<TArgs = StrictArgs> = GenericStoryContext<SolidRenderer, TArgs> & {\n renderToCanvas: () => Promise<void>;\n};\n\nexport type RenderContext = GenericRenderContext<SolidRenderer>;\n","import type { Args, Globals, StoryContext as InternalStoryContext } from 'storybook/internal/types';\nimport type { SolidRenderer } from './public-types';\n\n/** Update store via `(prev) => next` (version layer applies reconcile/draft setter). */\ntype SetStoreFn<T extends object> = (update: (prev: T) => T) => void;\n\n/** Reactive store tuple returned by `createStore` (state + setter). */\ntype SolidStore<T extends object> = readonly [\n state: T,\n setState: SetStoreFn<T>\n];\n\ntype CreateStoreFn = <T extends object>(initial: T) => SolidStore<T>;\n\nexport interface StoryStateStore {\n isStoryRendered: (storyId: string) => boolean;\n resetStory: (storyId: string) => void;\n setRendered: (storyId: string, rendered: boolean) => void;\n setDisposeFn: (storyId: string, disposeFn: (() => void) | null) => void;\n makeContextReactive: (context: InternalStoryContext<SolidRenderer, Args>) => void;\n disposeStory: (storyId: string) => void;\n}\n\nexport const getStoryId = (context: { id?: string; canvasElement?: { id?: string } }): string | undefined => {\n const canvasId = context.canvasElement?.id;\n\n if (!canvasId || canvasId === 'storybook-root') {\n return context.id;\n }\n\n return canvasId;\n};\n\nexport function createStoryState(createStore: CreateStoreFn): StoryStateStore {\n const [globals, setGlobals] = createStore<Globals>({});\n const renderedStories = new Set<string>();\n const argsStores = new Map<string, SolidStore<Args>>();\n const disposers = new Map<string, () => void>();\n\n const getArgsStore = (storyId: string): SolidStore<Args> => {\n let store = argsStores.get(storyId);\n\n if (!store) {\n store = createStore({} as Args);\n argsStores.set(storyId, store);\n }\n\n return store;\n };\n\n return {\n isStoryRendered(storyId) {\n return renderedStories.has(storyId);\n },\n\n resetStory(storyId) {\n renderedStories.delete(storyId);\n disposers.delete(storyId);\n argsStores.delete(storyId);\n },\n\n setRendered(storyId, isRendered) {\n if (isRendered) {\n renderedStories.add(storyId);\n }\n else {\n renderedStories.delete(storyId);\n }\n },\n\n setDisposeFn(storyId, disposeFn) {\n if (disposeFn) {\n disposers.set(storyId, disposeFn);\n }\n else {\n disposers.delete(storyId);\n }\n },\n\n makeContextReactive(context) {\n const storyId = getStoryId(context);\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n const [args, setArgs] = getArgsStore(storyId);\n\n // Update reactive stores with the new values\n setArgs(() => context.args);\n setGlobals(() => context.globals);\n\n // Sync the reactive stores to the context\n context.args = args;\n context.globals = globals;\n },\n\n disposeStory(storyId) {\n disposers.get(storyId)?.();\n disposers.delete(storyId);\n },\n };\n}\n","import { defaultDecorateStory } from 'storybook/preview-api';\n\nimport { IS_SOLID_JSX_FLAG } from './public-types';\nimport { getStoryId } from './story-store';\n\nimport type { Args, StoryContext as InternalStoryContext, LegacyStoryFn } from 'storybook/internal/types';\nimport type {\n Decorator,\n SolidRenderer,\n} from './public-types';\nimport type { StoryStateStore } from './story-store';\n\nexport function createApplyDecorators(\n store: StoryStateStore,\n createComponent: (\n storyFn: LegacyStoryFn<SolidRenderer>,\n context: InternalStoryContext<SolidRenderer, Args>\n ) => SolidRenderer['storyResult']\n): (\n storyFn: LegacyStoryFn<SolidRenderer>,\n rawDecorators: Decorator[]\n) => LegacyStoryFn<SolidRenderer> {\n return (storyFn, rawDecorators) => {\n const decorators = rawDecorators.map(\n (decorator): Decorator => {\n const originalFn = (decorator as Decorator & { originalFn?: Decorator }).originalFn;\n const isJSX = Boolean(\n decorator[IS_SOLID_JSX_FLAG] || originalFn?.[IS_SOLID_JSX_FLAG]\n );\n\n return (StoryFn, context) => {\n if (isJSX) {\n const storyId = getStoryId(context);\n\n if (storyId && store.isStoryRendered(storyId)) {\n return StoryFn(context);\n }\n }\n\n return decorator(StoryFn, context);\n };\n }\n );\n\n return defaultDecorateStory((context) => {\n const storyId = getStoryId(context);\n\n if (storyId && store.isStoryRendered(storyId)) {\n return null;\n }\n\n return createComponent(storyFn, context);\n }, decorators);\n };\n}\n","import { global } from '@storybook/global';\nimport { createComponent } from 'solid-js';\nimport { configure } from 'storybook/test';\n\nimport type { ArgsStoryFn } from 'storybook/internal/types';\nimport type { SolidRenderer } from './public-types';\n\nif (global.window) {\n global.window.STORYBOOK_ENV = 'solid';\n}\n\n/** Preview-wide parameters for the Solid renderer. */\nexport const parameters = {\n renderer: 'solid',\n};\n\n/** Default render for meta/stories with `component` + `args` and no custom `render` (CSF 3+). */\nexport const render: ArgsStoryFn<SolidRenderer> = (_, context) => {\n if (!context.component) {\n throw new Error(\n `Unable to render story ${ context.id } as the component annotation is missing from the default export`\n );\n }\n\n return createComponent(context.component, context.args);\n};\n\n/** Configures `storybook/test` wrappers so Solid updates flush after async play steps. */\nexport const beforeAll = async() => {\n try {\n configure({\n unstable_advanceTimersWrapper: (cb: () => any) => cb(),\n asyncWrapper: async(cb: () => any) => {\n const result = await cb();\n\n await new Promise<void>((resolve) => {\n setTimeout(() => resolve(), 0);\n\n // @ts-expect-error global jest\n if (typeof jest !== 'undefined' && jest != null && ((setTimeout as any)._isMockFunction === true || Object.prototype.hasOwnProperty.call(setTimeout, 'clock'))) {\n // @ts-expect-error global jest\n jest!.advanceTimersByTime(0);\n }\n });\n\n return result;\n },\n eventWrapper: (cb: () => any) => cb(),\n });\n }\n catch {\n // storybook/test might not be available; noop\n }\n};\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { render, parameters, beforeAll, createApplyDecorators, createStoryState, getStoryId } from './chunk-2DIRFC5W.js';
|
|
2
|
+
import { __export } from './chunk-G3PMV62Z.js';
|
|
3
|
+
import { render as render$1 } from '@solidjs/web';
|
|
4
|
+
import { createComponent, onSettled, Errored, createStore as createStore$1 } from 'solid-js';
|
|
5
|
+
|
|
6
|
+
// src/renderer/v2/entry-preview.ts
|
|
7
|
+
var entry_preview_exports = {};
|
|
8
|
+
__export(entry_preview_exports, {
|
|
9
|
+
applyDecorators: () => applyDecorators,
|
|
10
|
+
beforeAll: () => beforeAll,
|
|
11
|
+
mount: () => mount,
|
|
12
|
+
parameters: () => parameters,
|
|
13
|
+
render: () => render,
|
|
14
|
+
renderToCanvas: () => renderToCanvas
|
|
15
|
+
});
|
|
16
|
+
var createStore = (initial) => {
|
|
17
|
+
const [state, setStore] = createStore$1(initial);
|
|
18
|
+
const setState = (update) => {
|
|
19
|
+
setStore(() => update(state));
|
|
20
|
+
};
|
|
21
|
+
return [state, setState];
|
|
22
|
+
};
|
|
23
|
+
var storyStore = createStoryState(createStore);
|
|
24
|
+
var applyDecorators = createApplyDecorators(
|
|
25
|
+
storyStore,
|
|
26
|
+
createComponent
|
|
27
|
+
);
|
|
28
|
+
var renderToCanvas = async (renderContext, canvasElement) => {
|
|
29
|
+
const storyId = getStoryId({ ...renderContext, canvasElement });
|
|
30
|
+
if (!storyId) {
|
|
31
|
+
throw new Error("Story ID is required");
|
|
32
|
+
}
|
|
33
|
+
const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;
|
|
34
|
+
const Story = StoryFn;
|
|
35
|
+
if (!storyStore.isStoryRendered(storyId)) {
|
|
36
|
+
const App = (() => {
|
|
37
|
+
onSettled(() => {
|
|
38
|
+
showMain();
|
|
39
|
+
storyStore.setRendered(storyId, true);
|
|
40
|
+
return () => {
|
|
41
|
+
storyStore.setRendered(storyId, false);
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
if (storyContext?.parameters?.["__isPortableStory"]) {
|
|
45
|
+
return createComponent(Story, {});
|
|
46
|
+
}
|
|
47
|
+
return createComponent(Errored, {
|
|
48
|
+
fallback: (err, _reset) => {
|
|
49
|
+
const error = err();
|
|
50
|
+
showException(error);
|
|
51
|
+
return error;
|
|
52
|
+
},
|
|
53
|
+
children: createComponent(Story, {})
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
const disposeFn = render$1(() => createComponent(App, {}), canvasElement);
|
|
57
|
+
storyStore.setDisposeFn(storyId, disposeFn);
|
|
58
|
+
} else {
|
|
59
|
+
StoryFn();
|
|
60
|
+
}
|
|
61
|
+
return () => {
|
|
62
|
+
storyStore.disposeStory(storyId);
|
|
63
|
+
storyStore.resetStory(storyId);
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
var mount = (context) => {
|
|
67
|
+
const storyId = getStoryId(context);
|
|
68
|
+
const { forceRemount } = context;
|
|
69
|
+
if (!storyId) {
|
|
70
|
+
throw new Error("Story ID is required");
|
|
71
|
+
}
|
|
72
|
+
return async (ui) => {
|
|
73
|
+
if (ui != null) {
|
|
74
|
+
context.originalStoryFn = () => ui;
|
|
75
|
+
}
|
|
76
|
+
if (forceRemount) {
|
|
77
|
+
storyStore.disposeStory(storyId);
|
|
78
|
+
}
|
|
79
|
+
if (!storyStore.isStoryRendered(storyId) || forceRemount) {
|
|
80
|
+
storyStore.resetStory(storyId);
|
|
81
|
+
}
|
|
82
|
+
storyStore.makeContextReactive(context);
|
|
83
|
+
await context.renderToCanvas();
|
|
84
|
+
return context.canvas;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export { applyDecorators, entry_preview_exports, mount, renderToCanvas };
|
|
89
|
+
//# sourceMappingURL=chunk-7HMQHLZ6.js.map
|
|
90
|
+
//# sourceMappingURL=chunk-7HMQHLZ6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/renderer/v2/entry-preview.ts"],"names":["solidCreateStore","solidRender"],"mappings":"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","file":"chunk-7HMQHLZ6.js","sourcesContent":["import { render as solidRender } from '@solidjs/web';\nimport {\n createComponent,\n Errored,\n onSettled,\n createStore as solidCreateStore,\n} from 'solid-js-v2';\n\nimport { createApplyDecorators } from '../shared/apply-decorators.ts';\nimport { createStoryState, getStoryId } from '../shared/story-store';\n\nimport type { Args } from 'storybook/internal/types';\nimport type { RenderContext, SolidComponent, SolidRenderer, StoryContext, StoryFnReturnType } from './public-types';\n\nexport * from '../shared/preview-annotations';\n\nconst createStore = <T extends object>(initial: T) => {\n const [state, setStore] = solidCreateStore(initial as any);\n\n const setState = (update: (prev: T) => T) => {\n setStore(() => update(state as unknown as T));\n };\n\n return [state as T, setState] as const;\n};\n\nconst storyStore = createStoryState(createStore);\n\n/** Wraps the story fn with decorators, JSX decorators skip re-render when the story is already mounted. */\nexport const applyDecorators = createApplyDecorators(\n storyStore,\n createComponent as Parameters<typeof createApplyDecorators>[1]\n);\n\n/** Mounts or updates the story in the preview canvas. Returns cleanup when the story changes. */\nexport const renderToCanvas = async(\n renderContext: RenderContext,\n canvasElement: SolidRenderer['canvasElement']\n) => {\n const storyId = getStoryId({ ...renderContext, canvasElement });\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;\n const Story = StoryFn as SolidComponent;\n\n if (!storyStore.isStoryRendered(storyId)) {\n const App = (() => {\n onSettled(() => {\n showMain();\n storyStore.setRendered(storyId, true);\n\n return () => {\n storyStore.setRendered(storyId, false);\n };\n });\n\n if (storyContext?.parameters?.['__isPortableStory']) {\n return createComponent(Story, {});\n }\n\n return createComponent(Errored, {\n fallback: (err: () => unknown, _reset: () => void) => {\n const error = err() as Error;\n\n showException(error);\n\n return error as any;\n },\n children: createComponent(Story, {}),\n });\n }) as SolidComponent;\n\n const disposeFn = solidRender(() => createComponent(App, {}), canvasElement);\n\n storyStore.setDisposeFn(storyId, disposeFn);\n }\n else {\n StoryFn();\n }\n\n return () => {\n storyStore.disposeStory(storyId);\n storyStore.resetStory(storyId);\n };\n};\n\n/** Play/mount API: sync reactive args and globals, then render via `renderToCanvas`. */\nexport const mount = (context: StoryContext<Args>) => {\n const storyId = getStoryId(context);\n const { forceRemount } = context;\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n return async(ui: StoryFnReturnType) => {\n if (ui != null) {\n context.originalStoryFn = () => ui;\n }\n\n if (forceRemount) {\n storyStore.disposeStory(storyId);\n }\n\n if (!storyStore.isStoryRendered(storyId) || forceRemount) {\n storyStore.resetStory(storyId);\n }\n\n storyStore.makeContextReactive(context);\n\n await context.renderToCanvas();\n\n return context.canvas;\n };\n};\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { entry_preview_argtypes_exports } from './chunk-R46BQ22I.js';
|
|
2
|
+
import { entry_preview_exports } from './chunk-W3QB2KPF.js';
|
|
3
|
+
import { definePreview } from 'storybook/internal/csf';
|
|
4
|
+
|
|
5
|
+
function createDefinePreview(solidAnnotations) {
|
|
6
|
+
return function definePreview$1(input) {
|
|
7
|
+
const { addons, ...projectAnnotations } = input;
|
|
8
|
+
const preview = definePreview({
|
|
9
|
+
...projectAnnotations,
|
|
10
|
+
addons: [
|
|
11
|
+
solidAnnotations,
|
|
12
|
+
entry_preview_argtypes_exports,
|
|
13
|
+
entry_preview_exports,
|
|
14
|
+
...addons ?? []
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
const defineMeta = preview.meta.bind(preview);
|
|
18
|
+
preview.meta = (_input) => {
|
|
19
|
+
const meta = defineMeta(_input);
|
|
20
|
+
const defineStory = meta.story.bind(meta);
|
|
21
|
+
meta.story = (__input) => {
|
|
22
|
+
const story = defineStory(__input);
|
|
23
|
+
story.Component = story.__compose();
|
|
24
|
+
return story;
|
|
25
|
+
};
|
|
26
|
+
return meta;
|
|
27
|
+
};
|
|
28
|
+
return preview;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { createDefinePreview };
|
|
33
|
+
//# sourceMappingURL=chunk-FRAIA7MB.js.map
|
|
34
|
+
//# sourceMappingURL=chunk-FRAIA7MB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/renderer/shared/create-define-preview.ts"],"names":["definePreview","definePreviewBase"],"mappings":";;;;AAQO,SAAS,oBAAoB,gBAAA,EAAuC;AACvE,EAAA,OAAO,SAASA,gBACZ,KAAA,EACF;AACE,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,kBAAA,EAAmB,GAAI,KAAA;AAE1C,IAAA,MAAM,UAAUC,aAAA,CAAkB;AAAA,MAC9B,GAAG,kBAAA;AAAA,MACH,MAAA,EAAQ;AAAA,QACJ,gBAAA;AAAA,QACA,8BAAA;AAAA,QACA,qBAAA;AAAA,QACA,GAAI,UAAU;AAAC;AACnB,KACH,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAE5C,IAAA,OAAA,CAAQ,IAAA,GAAO,CAAC,MAAA,KAAW;AACvB,MAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAGxC,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,OAAA,KAAiB;AAC3B,QAAA,MAAM,KAAA,GAAQ,YAAY,OAAO,CAAA;AAGjC,QAAA,KAAA,CAAM,SAAA,GAAY,MAAM,SAAA,EAAU;AAElC,QAAA,OAAO,KAAA;AAAA,MACX,CAAA;AAEA,MAAA,OAAO,IAAA;AAAA,IACX,CAAA;AAEA,IAAA,OAAO,OAAA;AAAA,EACX,CAAA;AACJ","file":"chunk-FRAIA7MB.js","sourcesContent":["import { definePreview as definePreviewBase } from 'storybook/internal/csf';\n\nimport * as solidDocsAnnotations from '../docs/entry-preview';\nimport * as solidArgTypesAnnotations from '../docs/entry-preview-argtypes';\n\nimport type { PreviewAddon } from 'storybook/internal/csf';\nimport type { ProjectAnnotations } from 'storybook/internal/types';\n\nexport function createDefinePreview(solidAnnotations: PreviewAddon<never>) {\n return function definePreview<Addons extends PreviewAddon<never>[] = []>(\n input: { addons?: Addons } & ProjectAnnotations<any>\n ) {\n const { addons, ...projectAnnotations } = input;\n\n const preview = definePreviewBase({\n ...projectAnnotations,\n addons: [\n solidAnnotations,\n solidArgTypesAnnotations,\n solidDocsAnnotations,\n ...(addons ?? []),\n ],\n });\n\n const defineMeta = preview.meta.bind(preview);\n\n preview.meta = (_input) => {\n const meta = defineMeta(_input);\n const defineStory = meta.story.bind(meta);\n\n // @ts-expect-error internal code that is hard to type\n meta.story = (__input: any) => {\n const story = defineStory(__input);\n\n // @ts-ignore this is a private property used only here\n story.Component = story.__compose();\n\n return story;\n };\n\n return meta;\n };\n\n return preview;\n };\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { createRequire } from 'module';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import semver from 'semver';
|
|
5
|
+
|
|
6
|
+
// src/framework/solidVersion.ts
|
|
7
|
+
function getFrameworkName(framework) {
|
|
8
|
+
return typeof framework === "string" ? framework : framework.name;
|
|
9
|
+
}
|
|
10
|
+
function detectInstalledSolidVersion(configDir) {
|
|
11
|
+
const projectRequire = createRequire(join(configDir, "package.json"));
|
|
12
|
+
let pkgPath;
|
|
13
|
+
try {
|
|
14
|
+
pkgPath = projectRequire.resolve("solid-js/package.json");
|
|
15
|
+
} catch {
|
|
16
|
+
throw new Error("Could not detect Solid version: `solid-js` is not installed.");
|
|
17
|
+
}
|
|
18
|
+
const { version } = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
19
|
+
return semver.major(version ?? "1.9.0");
|
|
20
|
+
}
|
|
21
|
+
function resolveSolidVersion(framework, configDir) {
|
|
22
|
+
const name = getFrameworkName(framework);
|
|
23
|
+
if (name === "storybook-solidjs-vite/next") {
|
|
24
|
+
return 2;
|
|
25
|
+
}
|
|
26
|
+
return detectInstalledSolidVersion(configDir);
|
|
27
|
+
}
|
|
28
|
+
var SOLID_DEDUPE_PACKAGES = [
|
|
29
|
+
"solid-js",
|
|
30
|
+
"@solidjs/web",
|
|
31
|
+
"@solidjs/signals",
|
|
32
|
+
"@solidjs/router",
|
|
33
|
+
"@solidjs/meta"
|
|
34
|
+
];
|
|
35
|
+
function mergeSolidDedupe(existing) {
|
|
36
|
+
const base = existing == null ? [] : [...existing];
|
|
37
|
+
return [.../* @__PURE__ */ new Set([...base, ...SOLID_DEDUPE_PACKAGES])];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { mergeSolidDedupe, resolveSolidVersion };
|
|
41
|
+
//# sourceMappingURL=chunk-NNSMHFZY.js.map
|
|
42
|
+
//# sourceMappingURL=chunk-NNSMHFZY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/framework/solidVersion.ts"],"names":[],"mappings":";;;;;;AAOA,SAAS,iBAAiB,SAAA,EAAoC;AAC1D,EAAA,OAAO,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,SAAA,CAAU,IAAA;AACjE;AAEA,SAAS,4BAA4B,SAAA,EAAiC;AAClE,EAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,cAAc,CAAC,CAAA;AAEpE,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI;AACA,IAAA,OAAA,GAAU,cAAA,CAAe,QAAQ,uBAAuB,CAAA;AAAA,EAC5D,CAAA,CAAA,MACM;AACF,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,EAAE,SAAQ,GAAI,IAAA,CAAK,MAAM,YAAA,CAAa,OAAA,EAAS,MAAM,CAAC,CAAA;AAE5D,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW,OAAO,CAAA;AAC1C;AAQO,SAAS,mBAAA,CACZ,WACA,SAAA,EACY;AACZ,EAAA,MAAM,IAAA,GAAO,iBAAiB,SAAS,CAAA;AAEvC,EAAA,IAAI,SAAS,6BAAA,EAA+B;AACxC,IAAA,OAAO,CAAA;AAAA,EACX;AAEA,EAAA,OAAO,4BAA4B,SAAS,CAAA;AAChD;AAGO,IAAM,qBAAA,GAAwB;AAAA,EACjC,UAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACJ,CAAA;AAEO,SAAS,iBAAiB,QAAA,EAAiD;AAC9E,EAAA,MAAM,OAAO,QAAA,IAAY,IAAA,GAAO,EAAC,GAAI,CAAC,GAAG,QAAQ,CAAA;AAEjD,EAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,GAAG,qBAAqB,CAAC,CAAC,CAAA;AAC3D","file":"chunk-NNSMHFZY.js","sourcesContent":["import { readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join } from 'node:path';\nimport semver from 'semver';\n\nimport type { FrameworkConfig, SolidVersion } from './types';\n\nfunction getFrameworkName(framework: FrameworkConfig): string {\n return typeof framework === 'string' ? framework : framework.name;\n}\n\nfunction detectInstalledSolidVersion(configDir: string): SolidVersion {\n const projectRequire = createRequire(join(configDir, 'package.json'));\n\n let pkgPath: string;\n\n try {\n pkgPath = projectRequire.resolve('solid-js/package.json');\n }\n catch {\n throw new Error('Could not detect Solid version: `solid-js` is not installed.');\n }\n\n const { version } = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version?: string };\n\n return semver.major(version ?? '1.9.0') as SolidVersion;\n}\n\n/**\n * Resolves the Solid major version for the Storybook renderer.\n *\n * - `storybook-solidjs-vite/next` → Solid 2\n * - `storybook-solidjs-vite` → detected from installed `solid-js`\n */\nexport function resolveSolidVersion(\n framework: FrameworkConfig,\n configDir: string\n): SolidVersion {\n const name = getFrameworkName(framework);\n\n if (name === 'storybook-solidjs-vite/next') {\n return 2;\n }\n\n return detectInstalledSolidVersion(configDir);\n}\n\n/** Force a single copy of Solid packages (renderer + app + linked deps). */\nexport const SOLID_DEDUPE_PACKAGES = [\n 'solid-js',\n '@solidjs/web',\n '@solidjs/signals',\n '@solidjs/router',\n '@solidjs/meta',\n] as const;\n\nexport function mergeSolidDedupe(existing?: string | readonly string[]): string[] {\n const base = existing == null ? [] : [...existing];\n\n return [...new Set([...base, ...SOLID_DEDUPE_PACKAGES])];\n}\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { render, parameters, beforeAll, createApplyDecorators, createStoryState, getStoryId } from './chunk-2DIRFC5W.js';
|
|
2
|
+
import { __export } from './chunk-G3PMV62Z.js';
|
|
3
|
+
import { createComponent, onMount, onCleanup, ErrorBoundary } from 'solid-js';
|
|
4
|
+
import { createStore as createStore$1, reconcile } from 'solid-js/store';
|
|
5
|
+
import { render as render$1 } from 'solid-js/web';
|
|
6
|
+
|
|
7
|
+
// src/renderer/v1/entry-preview.ts
|
|
8
|
+
var entry_preview_exports = {};
|
|
9
|
+
__export(entry_preview_exports, {
|
|
10
|
+
applyDecorators: () => applyDecorators,
|
|
11
|
+
beforeAll: () => beforeAll,
|
|
12
|
+
mount: () => mount,
|
|
13
|
+
parameters: () => parameters,
|
|
14
|
+
render: () => render,
|
|
15
|
+
renderToCanvas: () => renderToCanvas
|
|
16
|
+
});
|
|
17
|
+
var createStore = (initial) => {
|
|
18
|
+
const [state, setStore] = createStore$1(initial);
|
|
19
|
+
const setState = (update) => {
|
|
20
|
+
setStore(reconcile(update(state)));
|
|
21
|
+
};
|
|
22
|
+
return [state, setState];
|
|
23
|
+
};
|
|
24
|
+
var storyStore = createStoryState(createStore);
|
|
25
|
+
var applyDecorators = createApplyDecorators(storyStore, createComponent);
|
|
26
|
+
var renderToCanvas = async (renderContext, canvasElement) => {
|
|
27
|
+
const storyId = getStoryId({ ...renderContext, canvasElement });
|
|
28
|
+
if (!storyId) {
|
|
29
|
+
throw new Error("Story ID is required");
|
|
30
|
+
}
|
|
31
|
+
const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;
|
|
32
|
+
const Story = StoryFn;
|
|
33
|
+
if (!storyStore.isStoryRendered(storyId)) {
|
|
34
|
+
const App = () => {
|
|
35
|
+
onMount(() => {
|
|
36
|
+
showMain();
|
|
37
|
+
storyStore.setRendered(storyId, true);
|
|
38
|
+
});
|
|
39
|
+
onCleanup(() => {
|
|
40
|
+
storyStore.setRendered(storyId, false);
|
|
41
|
+
});
|
|
42
|
+
if (storyContext?.parameters?.["__isPortableStory"]) {
|
|
43
|
+
return createComponent(Story, {});
|
|
44
|
+
}
|
|
45
|
+
return createComponent(ErrorBoundary, {
|
|
46
|
+
fallback: (err) => {
|
|
47
|
+
showException(err);
|
|
48
|
+
return err;
|
|
49
|
+
},
|
|
50
|
+
children: createComponent(Story, {})
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
const disposeFn = render$1(() => createComponent(App, {}), canvasElement);
|
|
54
|
+
storyStore.setDisposeFn(storyId, disposeFn);
|
|
55
|
+
} else {
|
|
56
|
+
StoryFn();
|
|
57
|
+
}
|
|
58
|
+
return () => {
|
|
59
|
+
storyStore.disposeStory(storyId);
|
|
60
|
+
storyStore.resetStory(storyId);
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
var mount = (context) => {
|
|
64
|
+
const storyId = getStoryId(context);
|
|
65
|
+
const { forceRemount } = context;
|
|
66
|
+
if (!storyId) {
|
|
67
|
+
throw new Error("Story ID is required");
|
|
68
|
+
}
|
|
69
|
+
return async (ui) => {
|
|
70
|
+
if (ui != null) {
|
|
71
|
+
context.originalStoryFn = () => ui;
|
|
72
|
+
}
|
|
73
|
+
if (forceRemount) {
|
|
74
|
+
storyStore.disposeStory(storyId);
|
|
75
|
+
}
|
|
76
|
+
if (!storyStore.isStoryRendered(storyId) || forceRemount) {
|
|
77
|
+
storyStore.resetStory(storyId);
|
|
78
|
+
}
|
|
79
|
+
storyStore.makeContextReactive(context);
|
|
80
|
+
await context.renderToCanvas();
|
|
81
|
+
return context.canvas;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { applyDecorators, entry_preview_exports, mount, renderToCanvas };
|
|
86
|
+
//# sourceMappingURL=chunk-P43SJLUM.js.map
|
|
87
|
+
//# sourceMappingURL=chunk-P43SJLUM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/renderer/v1/entry-preview.ts"],"names":["solidCreateStore","solidRender"],"mappings":"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","file":"chunk-P43SJLUM.js","sourcesContent":["import {\n createComponent,\n ErrorBoundary,\n onCleanup,\n onMount,\n} from 'solid-js-v1';\nimport { reconcile, createStore as solidCreateStore } from 'solid-js-v1/store';\nimport { render as solidRender } from 'solid-js-v1/web';\n\nimport { createApplyDecorators } from '../shared/apply-decorators.ts';\nimport { createStoryState, getStoryId } from '../shared/story-store';\n\nimport type { Args } from 'storybook/internal/types';\nimport type { RenderContext, SolidComponent, SolidRenderer, StoryContext, StoryFnReturnType } from './public-types';\n\nexport * from '../shared/preview-annotations';\n\n// Story state to control rendered stories and do not remount already rendered stories\nconst createStore = <T extends object>(initial: T) => {\n const [state, setStore] = solidCreateStore<T>(initial);\n\n const setState = (update: (prev: T) => T) => {\n setStore(reconcile(update(state)));\n };\n\n return [state, setState] as const;\n};\n\nconst storyStore = createStoryState(createStore);\n\n/** Wraps the story fn with decorators, JSX decorators skip re-render when the story is already mounted. */\nexport const applyDecorators = createApplyDecorators(storyStore, createComponent);\n\n/** Mounts or updates the story in the preview canvas. Returns cleanup when the story changes. */\nexport const renderToCanvas = async(\n renderContext: RenderContext,\n canvasElement: SolidRenderer['canvasElement']\n) => {\n const storyId = getStoryId({ ...renderContext, canvasElement });\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;\n const Story = StoryFn as SolidComponent;\n\n if (!storyStore.isStoryRendered(storyId)) {\n const App: SolidComponent = () => {\n onMount(() => {\n showMain();\n storyStore.setRendered(storyId, true);\n });\n\n onCleanup(() => {\n storyStore.setRendered(storyId, false);\n });\n\n if (storyContext?.parameters?.['__isPortableStory']) {\n return createComponent(Story, {});\n }\n\n return createComponent(ErrorBoundary, {\n fallback: (err: Error) => {\n showException(err);\n\n return err as any;\n },\n children: createComponent(Story, {}),\n });\n };\n\n const disposeFn = solidRender(() => createComponent(App, {}), canvasElement);\n\n storyStore.setDisposeFn(storyId, disposeFn);\n }\n else {\n StoryFn();\n }\n\n return () => {\n storyStore.disposeStory(storyId);\n storyStore.resetStory(storyId);\n };\n};\n\n/** Play/mount API: sync reactive args and globals, then render via `renderToCanvas`. */\nexport const mount = (context: StoryContext<Args>) => {\n const storyId = getStoryId(context);\n const { forceRemount } = context;\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n return async(ui: StoryFnReturnType) => {\n if (ui != null) {\n context.originalStoryFn = () => ui;\n }\n\n if (forceRemount) {\n storyStore.disposeStory(storyId);\n }\n\n if (!storyStore.isStoryRendered(storyId) || forceRemount) {\n storyStore.resetStory(storyId);\n }\n\n storyStore.makeContextReactive(context);\n\n await context.renderToCanvas();\n\n return context.canvas;\n };\n};\n"]}
|