@analogjs/storybook-angular 3.0.0-alpha.9 → 3.0.0-alpha.90

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/storybook-angular",
3
- "version": "3.0.0-alpha.9",
3
+ "version": "3.0.0-alpha.90",
4
4
  "description": "Storybook Integration for Angular & Vite",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -34,20 +34,21 @@
34
34
  "default": "./src/lib/testing.js"
35
35
  }
36
36
  },
37
- "main": "src/index.js",
37
+ "main": "./src/index.js",
38
38
  "dependencies": {
39
- "@storybook/builder-vite": "^10.0.0"
39
+ "@storybook/builder-vite": "^10.3.5",
40
+ "obug": "^2.1.1"
40
41
  },
41
42
  "peerDependencies": {
42
43
  "@storybook/angular": "^10.0.0",
43
44
  "@analogjs/vite-plugin-angular": "*",
44
45
  "storybook": "^10.0.0",
45
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
46
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
46
47
  },
47
48
  "engines": {
48
- "node": ">=20.0.0"
49
+ "node": ">=22.18.0 || >=24.3.0"
49
50
  },
50
- "builders": "src/lib/builders.json",
51
+ "builders": "./src/lib/builders.json",
51
52
  "ng-add": {
52
53
  "save": "devDependencies"
53
54
  },
package/preset.js CHANGED
@@ -1 +1 @@
1
- export * from './src/lib/preset.js';
1
+ export * from './dist/src/lib/preset.js';
package/src/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export { type AngularOptions, type Parameters as AngularParameters, type AngularRenderer, type Decorator, type IStory, type Loader, type Meta, type Preview, type StoryContext, type StoryFn, type StoryObj, applicationConfig, argsToTemplate, componentWrapperDecorator, moduleMetadata, setProjectAnnotations, } from '@storybook/angular';
2
- export { type FrameworkOptions, type StorybookConfig } from './types';
1
+ export { type AngularOptions, type Parameters as AngularParameters, type AngularRenderer, type Decorator, type IStory, type Loader, type Meta, type Preview, type StoryContext, type StoryFn, type StoryObj, applicationConfig, argsToTemplate, moduleMetadata, setProjectAnnotations } from "@storybook/angular";
2
+ export { componentWrapperDecorator } from "./lib/component-wrapper-decorator";
3
+ export { type FrameworkOptions, type StorybookConfig } from "./types";
package/src/index.js CHANGED
@@ -1,2 +1,3 @@
1
- import { applicationConfig, argsToTemplate, componentWrapperDecorator, moduleMetadata, setProjectAnnotations } from "@storybook/angular";
1
+ import { componentWrapperDecorator } from "./lib/component-wrapper-decorator.js";
2
+ import { applicationConfig, argsToTemplate, moduleMetadata, setProjectAnnotations } from "@storybook/angular";
2
3
  export { applicationConfig, argsToTemplate, componentWrapperDecorator, moduleMetadata, setProjectAnnotations };
@@ -1,2 +1,2 @@
1
- import BuildStorybookBuilder from '@storybook/angular/builders/build-storybook';
1
+ import BuildStorybookBuilder from "@storybook/angular/builders/build-storybook";
2
2
  export default BuildStorybookBuilder;
@@ -1 +1 @@
1
- {"version":3,"file":"build-storybook.js","names":[],"sources":["../../../../../../packages/storybook-angular/src/lib/build-storybook/build-storybook.ts"],"sourcesContent":["import BuildStorybookBuilder from '@storybook/angular/builders/build-storybook';\n\nexport default BuildStorybookBuilder;\n"],"mappings":";;AAEA,IAAA,0BAAe"}
1
+ {"version":3,"file":"build-storybook.js","names":[],"sources":["../../../../src/lib/build-storybook/build-storybook.ts"],"sourcesContent":["import BuildStorybookBuilder from '@storybook/angular/builders/build-storybook';\n\nexport default BuildStorybookBuilder;\n"],"mappings":";;AAEA,IAAA,0BAAe"}
@@ -0,0 +1,6 @@
1
+ import { type Type } from "@angular/core";
2
+ import { type AngularRenderer, type StoryContext } from "@storybook/angular";
3
+ import type { DecoratorFunction } from "storybook/internal/types";
4
+ type StoryProps = Record<string, unknown>;
5
+ export declare function componentWrapperDecorator<TArgs = any>(element: Type<unknown> | ((story: string) => string), props?: StoryProps | ((storyContext: StoryContext<TArgs>) => StoryProps)): DecoratorFunction<AngularRenderer, TArgs>;
6
+ export {};
@@ -0,0 +1,66 @@
1
+ import { argsToTemplate, componentWrapperDecorator } from "@storybook/angular";
2
+ import { reflectComponentType } from "@angular/core";
3
+ //#region packages/storybook-angular/src/lib/component-wrapper-decorator.ts
4
+ var VOID_ELEMENTS = new Set([
5
+ "area",
6
+ "base",
7
+ "br",
8
+ "col",
9
+ "command",
10
+ "embed",
11
+ "hr",
12
+ "img",
13
+ "input",
14
+ "keygen",
15
+ "link",
16
+ "meta",
17
+ "param",
18
+ "source",
19
+ "track",
20
+ "wbr"
21
+ ]);
22
+ function componentWrapperDecorator$1(element, props) {
23
+ const decorator = componentWrapperDecorator(element, props);
24
+ return (storyFn, storyContext) => decorator(() => ensureStoryTemplate(storyFn(), storyContext), storyContext);
25
+ }
26
+ function ensureStoryTemplate(story, storyContext) {
27
+ if (story.template || !storyContext.component) return story;
28
+ const component = reflectComponentType(storyContext.component);
29
+ if (!component) return story;
30
+ return {
31
+ ...story,
32
+ template: createTemplate(component, story.props ?? storyContext.args),
33
+ userDefinedTemplate: false
34
+ };
35
+ }
36
+ function createTemplate(component, props) {
37
+ const selector = component.selector.split(",")[0]?.trim();
38
+ if (!selector) return "<ng-container *ngComponentOutlet=\"storyComponent\"></ng-container>";
39
+ return buildTemplate(selector, argsToTemplate(filterTemplateBindings(component, props)));
40
+ }
41
+ function filterTemplateBindings(component, props) {
42
+ if (!props || typeof props !== "object") return {};
43
+ const supportedBindings = new Set([...component.inputs.map((input) => input.templateName), ...component.outputs.map((output) => output.templateName)]);
44
+ return Object.fromEntries(Object.entries(props).filter(([key, value]) => {
45
+ return value !== void 0 && supportedBindings.has(key);
46
+ }));
47
+ }
48
+ function buildTemplate(selector, attributes) {
49
+ const tagName = selector.match(/^[A-Za-z][\w-]*/)?.[0] ?? "div";
50
+ const id = selector.match(/#([\w-]+)/)?.[1];
51
+ const classes = [...selector.matchAll(/\.([\w-]+)/g)].map((match) => match[1]);
52
+ const selectorAttributes = [...selector.matchAll(/\[([^\]]+)\]/g)].map((match) => match[1].trim());
53
+ const parts = [
54
+ id ? `id="${id}"` : "",
55
+ classes.length > 0 ? `class="${classes.join(" ")}"` : "",
56
+ ...selectorAttributes,
57
+ attributes
58
+ ].filter(Boolean);
59
+ const openingTag = parts.length > 0 ? `<${tagName} ${parts.join(" ")}>` : `<${tagName}>`;
60
+ if (VOID_ELEMENTS.has(tagName)) return openingTag.replace(/>$/, " />");
61
+ return `${openingTag}</${tagName}>`;
62
+ }
63
+ //#endregion
64
+ export { componentWrapperDecorator$1 as componentWrapperDecorator };
65
+
66
+ //# sourceMappingURL=component-wrapper-decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-wrapper-decorator.js","names":[],"sources":["../../../src/lib/component-wrapper-decorator.ts"],"sourcesContent":["import {\n reflectComponentType,\n type ComponentMirror,\n type Type,\n} from '@angular/core';\nimport {\n argsToTemplate,\n componentWrapperDecorator as originalComponentWrapperDecorator,\n type AngularRenderer,\n type IStory,\n type StoryContext,\n} from '@storybook/angular';\nimport type { DecoratorFunction } from 'storybook/internal/types';\n\ntype StoryProps = Record<string, unknown>;\n\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nexport function componentWrapperDecorator<TArgs = any>(\n element: Type<unknown> | ((story: string) => string),\n props?: StoryProps | ((storyContext: StoryContext<TArgs>) => StoryProps),\n): DecoratorFunction<AngularRenderer, TArgs> {\n const decorator = originalComponentWrapperDecorator(element, props);\n\n return (storyFn, storyContext) =>\n decorator(() => ensureStoryTemplate(storyFn(), storyContext), storyContext);\n}\n\nfunction ensureStoryTemplate<TArgs>(\n story: IStory,\n storyContext: StoryContext<TArgs>,\n): IStory {\n if (story.template || !storyContext.component) {\n return story;\n }\n\n const component = reflectComponentType(\n storyContext.component as Type<unknown>,\n );\n\n if (!component) {\n return story;\n }\n\n return {\n ...story,\n template: createTemplate(component, story.props ?? storyContext.args),\n userDefinedTemplate: false,\n };\n}\n\nfunction createTemplate(\n component: ComponentMirror<unknown>,\n props: unknown,\n): string {\n const selector = component.selector.split(',')[0]?.trim();\n if (!selector) {\n return '<ng-container *ngComponentOutlet=\"storyComponent\"></ng-container>';\n }\n\n const bindings = filterTemplateBindings(component, props);\n const attributes = argsToTemplate(bindings);\n\n return buildTemplate(selector, attributes);\n}\n\nfunction filterTemplateBindings(\n component: ComponentMirror<unknown>,\n props: unknown,\n): StoryProps {\n if (!props || typeof props !== 'object') {\n return {};\n }\n\n const supportedBindings = new Set([\n ...component.inputs.map((input) => input.templateName),\n ...component.outputs.map((output) => output.templateName),\n ]);\n\n return Object.fromEntries(\n Object.entries(props).filter(([key, value]) => {\n return value !== undefined && supportedBindings.has(key);\n }),\n );\n}\n\nfunction buildTemplate(selector: string, attributes: string): string {\n const elementMatch = selector.match(/^[A-Za-z][\\w-]*/);\n const tagName = elementMatch?.[0] ?? 'div';\n const id = selector.match(/#([\\w-]+)/)?.[1];\n const classes = [...selector.matchAll(/\\.([\\w-]+)/g)].map(\n (match) => match[1],\n );\n const selectorAttributes = [...selector.matchAll(/\\[([^\\]]+)\\]/g)].map(\n (match) => match[1].trim(),\n );\n const parts = [\n id ? `id=\"${id}\"` : '',\n classes.length > 0 ? `class=\"${classes.join(' ')}\"` : '',\n ...selectorAttributes,\n attributes,\n ].filter(Boolean);\n const openingTag =\n parts.length > 0 ? `<${tagName} ${parts.join(' ')}>` : `<${tagName}>`;\n\n if (VOID_ELEMENTS.has(tagName)) {\n return openingTag.replace(/>$/, ' />');\n }\n\n return `${openingTag}</${tagName}>`;\n}\n"],"mappings":";;;AAgBA,IAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,4BACd,SACA,OAC2C;CAC3C,MAAM,YAAY,0BAAkC,SAAS,MAAM;AAEnE,SAAQ,SAAS,iBACf,gBAAgB,oBAAoB,SAAS,EAAE,aAAa,EAAE,aAAa;;AAG/E,SAAS,oBACP,OACA,cACQ;AACR,KAAI,MAAM,YAAY,CAAC,aAAa,UAClC,QAAO;CAGT,MAAM,YAAY,qBAChB,aAAa,UACd;AAED,KAAI,CAAC,UACH,QAAO;AAGT,QAAO;EACL,GAAG;EACH,UAAU,eAAe,WAAW,MAAM,SAAS,aAAa,KAAK;EACrE,qBAAqB;EACtB;;AAGH,SAAS,eACP,WACA,OACQ;CACR,MAAM,WAAW,UAAU,SAAS,MAAM,IAAI,CAAC,IAAI,MAAM;AACzD,KAAI,CAAC,SACH,QAAO;AAMT,QAAO,cAAc,UAFF,eADF,uBAAuB,WAAW,MAAM,CACd,CAED;;AAG5C,SAAS,uBACP,WACA,OACY;AACZ,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO,EAAE;CAGX,MAAM,oBAAoB,IAAI,IAAI,CAChC,GAAG,UAAU,OAAO,KAAK,UAAU,MAAM,aAAa,EACtD,GAAG,UAAU,QAAQ,KAAK,WAAW,OAAO,aAAa,CAC1D,CAAC;AAEF,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;AAC7C,SAAO,UAAU,KAAA,KAAa,kBAAkB,IAAI,IAAI;GACxD,CACH;;AAGH,SAAS,cAAc,UAAkB,YAA4B;CAEnE,MAAM,UADe,SAAS,MAAM,kBAAkB,GACvB,MAAM;CACrC,MAAM,KAAK,SAAS,MAAM,YAAY,GAAG;CACzC,MAAM,UAAU,CAAC,GAAG,SAAS,SAAS,cAAc,CAAC,CAAC,KACnD,UAAU,MAAM,GAClB;CACD,MAAM,qBAAqB,CAAC,GAAG,SAAS,SAAS,gBAAgB,CAAC,CAAC,KAChE,UAAU,MAAM,GAAG,MAAM,CAC3B;CACD,MAAM,QAAQ;EACZ,KAAK,OAAO,GAAG,KAAK;EACpB,QAAQ,SAAS,IAAI,UAAU,QAAQ,KAAK,IAAI,CAAC,KAAK;EACtD,GAAG;EACH;EACD,CAAC,OAAO,QAAQ;CACjB,MAAM,aACJ,MAAM,SAAS,IAAI,IAAI,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI,QAAQ;AAErE,KAAI,cAAc,IAAI,QAAQ,CAC5B,QAAO,WAAW,QAAQ,MAAM,MAAM;AAGxC,QAAO,GAAG,WAAW,IAAI,QAAQ"}
@@ -0,0 +1 @@
1
+ export declare const debugStyles: unknown;
@@ -0,0 +1,7 @@
1
+ import { createDebug } from "../../node_modules/.pnpm/obug@2.1.1/node_modules/obug/dist/browser.js";
2
+ //#region packages/storybook-angular/src/lib/debug.ts
3
+ var debugStyles = createDebug("analog-storybook:styles");
4
+ //#endregion
5
+ export { debugStyles };
6
+
7
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","names":[],"sources":["../../../src/lib/debug.ts"],"sourcesContent":["import { createDebug } from 'obug';\n\nexport const debugStyles = createDebug('analog-storybook:styles');\n"],"mappings":";;AAEA,IAAa,cAAc,YAAY,0BAA0B"}
@@ -1,4 +1,4 @@
1
1
  export declare const previewAnnotations: (entries: string[] | undefined, options: any) => Promise<string[]>;
2
2
  export declare const core: (config: any, options: any) => Promise<any>;
3
3
  export declare const viteFinal: (config: any, options: any) => Promise<any>;
4
- export { addons } from '@storybook/angular/preset';
4
+ export { addons } from "@storybook/angular/preset";
package/src/lib/preset.js CHANGED
@@ -1,7 +1,11 @@
1
+ import { debugStyles } from "./debug.js";
2
+ import { existsSync } from "node:fs";
1
3
  import { resolve } from "node:path";
2
- import { addons, core as core$1 } from "@storybook/angular/preset";
4
+ import * as angularPreset from "@storybook/angular/preset";
5
+ import { addons } from "@storybook/angular/preset";
3
6
  import { fileURLToPath } from "node:url";
4
7
  import * as vite from "vite";
8
+ import angular from "@analogjs/vite-plugin-angular";
5
9
  //#region packages/storybook-angular/src/lib/preset.ts
6
10
  var previewAnnotations = async (entries = [], options) => {
7
11
  const config = fileURLToPath(import.meta.resolve("@storybook/angular/client/config"));
@@ -18,7 +22,10 @@ var previewAnnotations = async (entries = [], options) => {
18
22
  return annotations;
19
23
  };
20
24
  var core = async (config, options) => {
21
- const presetCore = await core$1(config, options);
25
+ const presetCore = typeof angularPreset.core === "function" ? await angularPreset.core(config, options) : {
26
+ ...config,
27
+ ...angularPreset.core
28
+ };
22
29
  return {
23
30
  ...presetCore,
24
31
  builder: {
@@ -38,12 +45,11 @@ async function resolveExperimentalZoneless(frameworkOptions, angularBuilderOptio
38
45
  }
39
46
  }
40
47
  var viteFinal = async (config, options) => {
41
- config.plugins = (config.plugins ?? []).flat().filter((plugin) => !plugin.name.includes("analogjs"));
42
- const { mergeConfig, normalizePath } = await import("vite");
43
- const { default: angular } = await import("@analogjs/vite-plugin-angular");
44
- const framework = await options.presets.apply("framework");
45
- const experimentalZoneless = await resolveExperimentalZoneless(framework.options, options?.angularBuilderOptions);
46
- return mergeConfig(config, {
48
+ config.plugins = (config.plugins ?? []).flat().filter((plugin) => !plugin?.name?.includes?.("analogjs"));
49
+ const { hmr: _removedHmrOption, ...frameworkOptions } = (await options.presets.apply("framework")).options ?? {};
50
+ const experimentalZoneless = await resolveExperimentalZoneless(frameworkOptions, options?.angularBuilderOptions);
51
+ const liveReload = typeof frameworkOptions.liveReload !== "undefined" ? frameworkOptions.liveReload : false;
52
+ return vite.mergeConfig(config, {
47
53
  optimizeDeps: { include: [
48
54
  "@storybook/angular/client",
49
55
  "@analogjs/storybook-angular",
@@ -53,15 +59,16 @@ var viteFinal = async (config, options) => {
53
59
  "tslib",
54
60
  ...experimentalZoneless ? [] : ["zone.js"]
55
61
  ] },
62
+ resolve: { alias: { "@storybook/globalThis": "@storybook/global" } },
56
63
  plugins: [
57
64
  angular({
58
- jit: typeof framework.options?.jit !== "undefined" ? framework.options?.jit : true,
59
- liveReload: typeof framework.options?.liveReload !== "undefined" ? framework.options?.liveReload : false,
60
- tsconfig: typeof framework.options?.tsconfig !== "undefined" ? framework.options?.tsconfig : options?.tsConfig ?? "./.storybook/tsconfig.json",
61
- inlineStylesExtension: typeof framework.options?.inlineStylesExtension !== "undefined" ? framework.options?.inlineStylesExtension : "css"
65
+ jit: typeof frameworkOptions.jit !== "undefined" ? frameworkOptions.jit : true,
66
+ liveReload,
67
+ tsconfig: typeof frameworkOptions.tsconfig !== "undefined" ? frameworkOptions.tsconfig : options?.tsConfig ?? "./.storybook/tsconfig.json",
68
+ inlineStylesExtension: typeof frameworkOptions.inlineStylesExtension !== "undefined" ? frameworkOptions.inlineStylesExtension : "css"
62
69
  }),
63
70
  angularOptionsPlugin(options, {
64
- normalizePath,
71
+ normalizePath: vite.normalizePath,
65
72
  experimentalZoneless
66
73
  }),
67
74
  storybookTransformConfigPlugin()
@@ -71,6 +78,22 @@ var viteFinal = async (config, options) => {
71
78
  };
72
79
  function angularOptionsPlugin(options, { normalizePath, experimentalZoneless }) {
73
80
  let resolvedConfig;
81
+ const resolveStyleImport = (extraImport, projectRoot, workspaceRoot) => {
82
+ const resolvedProjectImport = resolve(projectRoot, extraImport);
83
+ const resolvedWorkspaceImport = resolve(workspaceRoot, extraImport);
84
+ if (extraImport.startsWith(".") || extraImport.startsWith("src") || existsSync(resolvedProjectImport)) return {
85
+ specifier: resolvedProjectImport,
86
+ source: "project"
87
+ };
88
+ if (existsSync(resolvedWorkspaceImport)) return {
89
+ specifier: resolvedWorkspaceImport,
90
+ source: "workspace"
91
+ };
92
+ return {
93
+ specifier: extraImport,
94
+ source: "bare"
95
+ };
96
+ };
74
97
  return {
75
98
  name: "analogjs-storybook-options-plugin",
76
99
  config(userConfig) {
@@ -79,9 +102,17 @@ function angularOptionsPlugin(options, { normalizePath, experimentalZoneless })
79
102
  const sassOptions = options?.angularBuilderOptions?.stylePreprocessorOptions?.sass;
80
103
  if (Array.isArray(loadPaths)) {
81
104
  const workspaceRoot = options.angularBuilderContext?.workspaceRoot ?? userConfig?.root ?? process.cwd();
105
+ const resolvedLoadPaths = loadPaths.map((loadPath) => `${resolve(workspaceRoot, loadPath)}`);
106
+ debugStyles("resolved SCSS load paths", {
107
+ configDir: options.configDir,
108
+ workspaceRoot,
109
+ projectRoot: userConfig?.root ?? process.cwd(),
110
+ loadPaths,
111
+ resolvedLoadPaths
112
+ });
82
113
  return { css: { preprocessorOptions: { scss: {
83
114
  ...sassOptions,
84
- loadPaths: loadPaths.map((loadPath) => `${resolve(workspaceRoot, loadPath)}`)
115
+ loadPaths: resolvedLoadPaths
85
116
  } } } };
86
117
  }
87
118
  },
@@ -89,15 +120,29 @@ function angularOptionsPlugin(options, { normalizePath, experimentalZoneless })
89
120
  if (normalizePath(id).endsWith(normalizePath(`${options.configDir}/preview.ts`))) {
90
121
  const imports = [];
91
122
  const styles = options?.angularBuilderOptions?.styles;
92
- if (Array.isArray(styles)) styles.forEach((style) => {
93
- imports.push(style);
94
- });
123
+ const workspaceRoot = options?.angularBuilderContext?.workspaceRoot ?? process.cwd();
124
+ if (Array.isArray(styles)) {
125
+ debugStyles("injecting Storybook global styles", {
126
+ configDir: options.configDir,
127
+ workspaceRoot,
128
+ projectRoot: resolvedConfig?.root ?? process.cwd(),
129
+ styles
130
+ });
131
+ styles.forEach((style) => {
132
+ imports.push(style);
133
+ });
134
+ }
95
135
  if (!experimentalZoneless) imports.push("zone.js");
96
136
  const projectRoot = resolvedConfig?.root ?? process.cwd();
97
137
  return { code: `
98
138
  ${imports.map((extraImport) => {
99
- if (extraImport.startsWith(".") || extraImport.startsWith("src")) return `import '${resolve(projectRoot, extraImport)}';`;
100
- return `import '${extraImport}';`;
139
+ const resolved = resolveStyleImport(extraImport, projectRoot, workspaceRoot);
140
+ debugStyles("resolved Storybook style import", {
141
+ input: extraImport,
142
+ source: resolved.source,
143
+ specifier: resolved.specifier
144
+ });
145
+ return `import '${resolved.specifier}';`;
101
146
  }).join("\n")}
102
147
  ${code}
103
148
  ` };
@@ -106,11 +151,12 @@ function angularOptionsPlugin(options, { normalizePath, experimentalZoneless })
106
151
  };
107
152
  }
108
153
  function storybookTransformConfigPlugin() {
154
+ const configKey = vite.rolldownVersion ? "oxc" : "esbuild";
109
155
  return {
110
156
  name: "analogjs-storybook-transform-config",
111
157
  apply: "build",
112
158
  config() {
113
- return { [vite.rolldownVersion ? "oxc" : "esbuild"]: { keepNames: true } };
159
+ return { [configKey]: { keepNames: true } };
114
160
  }
115
161
  };
116
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"preset.js","names":[],"sources":["../../../../../packages/storybook-angular/src/lib/preset.ts"],"sourcesContent":["import { resolve } from 'node:path';\nimport { core as PresetCore } from '@storybook/angular/preset';\nimport { fileURLToPath } from 'node:url';\nimport type { Plugin, UserConfig } from 'vite';\nimport * as vite from 'vite';\n\nexport const previewAnnotations = async (\n entries: string[] = [],\n options: any,\n): Promise<string[]> => {\n const config = fileURLToPath(\n import.meta.resolve('@storybook/angular/client/config'),\n );\n const annotations = [...entries, config];\n\n if (options.enableProdMode) {\n const previewProdPath = fileURLToPath(\n import.meta.resolve('@storybook/angular/client/preview-prod'),\n );\n annotations.unshift(previewProdPath);\n }\n\n const docsConfig = await options.presets.apply('docs', {}, options);\n const docsEnabled = Object.keys(docsConfig).length > 0;\n if (docsEnabled) {\n const docsConfigPath = fileURLToPath(\n import.meta.resolve('@storybook/angular/client/docs/config'),\n );\n annotations.push(docsConfigPath);\n }\n return annotations;\n};\n\nexport const core = async (config: any, options: any): Promise<any> => {\n const presetCore = await PresetCore(config, options);\n return {\n ...presetCore,\n builder: {\n name: import.meta.resolve('@storybook/builder-vite'),\n options: { ...presetCore.options },\n },\n };\n};\n\nasync function resolveExperimentalZoneless(\n frameworkOptions: any,\n angularBuilderOptions: any,\n) {\n // 1. Explicit framework option (user's .storybook/main.ts)\n if (typeof frameworkOptions?.experimentalZoneless === 'boolean') {\n return frameworkOptions.experimentalZoneless;\n }\n\n // 2. Angular builder options (set by start-storybook/build-storybook)\n if (typeof angularBuilderOptions?.experimentalZoneless === 'boolean') {\n return angularBuilderOptions.experimentalZoneless;\n }\n\n // 3. Auto-detect Angular 21+ (matches @storybook/angular builder behavior)\n try {\n const { VERSION } = await import('@angular/core');\n return !!(VERSION.major && Number(VERSION.major) >= 21);\n } catch {\n return false;\n }\n}\n\nexport const viteFinal = async (config: any, options: any): Promise<any> => {\n // Remove any loaded analogjs plugins from a vite.config.(m)ts file\n config.plugins = (config.plugins ?? [])\n .flat()\n .filter((plugin: any) => !plugin.name.includes('analogjs'));\n\n // Merge custom configuration into the default config\n const { mergeConfig, normalizePath } = await import('vite');\n const { default: angular } = await import('@analogjs/vite-plugin-angular');\n const framework = await options.presets.apply('framework');\n const experimentalZoneless = await resolveExperimentalZoneless(\n framework.options,\n options?.angularBuilderOptions,\n );\n return mergeConfig(config, {\n // Add dependencies to pre-optimization\n optimizeDeps: {\n include: [\n '@storybook/angular/client',\n '@analogjs/storybook-angular',\n '@angular/compiler',\n '@angular/platform-browser',\n '@angular/platform-browser/animations',\n 'tslib',\n ...(experimentalZoneless ? [] : ['zone.js']),\n ],\n },\n plugins: [\n angular({\n jit:\n typeof framework.options?.jit !== 'undefined'\n ? framework.options?.jit\n : true,\n liveReload:\n typeof framework.options?.liveReload !== 'undefined'\n ? framework.options?.liveReload\n : false,\n tsconfig:\n typeof framework.options?.tsconfig !== 'undefined'\n ? framework.options?.tsconfig\n : (options?.tsConfig ?? './.storybook/tsconfig.json'),\n inlineStylesExtension:\n typeof framework.options?.inlineStylesExtension !== 'undefined'\n ? framework.options?.inlineStylesExtension\n : 'css',\n }),\n angularOptionsPlugin(options, { normalizePath, experimentalZoneless }),\n storybookTransformConfigPlugin(),\n ],\n define: {\n STORYBOOK_ANGULAR_OPTIONS: JSON.stringify({\n experimentalZoneless: !!experimentalZoneless,\n }),\n },\n });\n};\n\nfunction angularOptionsPlugin(\n options: any,\n {\n normalizePath,\n experimentalZoneless,\n }: { normalizePath: (path: string) => string; experimentalZoneless: boolean },\n): Plugin {\n let resolvedConfig: UserConfig | undefined;\n return {\n name: 'analogjs-storybook-options-plugin',\n config(userConfig: UserConfig) {\n resolvedConfig = userConfig;\n const loadPaths =\n options?.angularBuilderOptions?.stylePreprocessorOptions?.loadPaths;\n const sassOptions =\n options?.angularBuilderOptions?.stylePreprocessorOptions?.sass;\n\n if (Array.isArray(loadPaths)) {\n const workspaceRoot =\n options.angularBuilderContext?.workspaceRoot ??\n userConfig?.root ??\n process.cwd();\n return {\n css: {\n preprocessorOptions: {\n scss: {\n ...sassOptions,\n loadPaths: loadPaths.map(\n (loadPath) => `${resolve(workspaceRoot, loadPath)}`,\n ),\n },\n },\n },\n };\n }\n\n return;\n },\n async transform(code: string, id: string) {\n if (\n normalizePath(id).endsWith(\n normalizePath(`${options.configDir}/preview.ts`),\n )\n ) {\n const imports = [];\n const styles = options?.angularBuilderOptions?.styles;\n\n if (Array.isArray(styles)) {\n styles.forEach((style) => {\n imports.push(style);\n });\n }\n\n if (!experimentalZoneless) {\n imports.push('zone.js');\n }\n\n // Use vite config root when angularBuilderContext is not available\n // (e.g., when running via Vitest instead of Angular builders)\n const projectRoot = resolvedConfig?.root ?? process.cwd();\n\n return {\n code: `\n ${imports\n .map((extraImport) => {\n if (\n extraImport.startsWith('.') ||\n extraImport.startsWith('src')\n ) {\n // relative to root\n return `import '${resolve(projectRoot, extraImport)}';`;\n }\n\n // absolute import\n return `import '${extraImport}';`;\n })\n .join('\\n')}\n ${code}\n `,\n };\n }\n\n return;\n },\n };\n}\n\nfunction storybookTransformConfigPlugin(): Plugin {\n return {\n name: 'analogjs-storybook-transform-config',\n apply: 'build',\n config() {\n return {\n [vite.rolldownVersion ? 'oxc' : 'esbuild']: {\n // Don't mangle class names during the build\n // This fixes display of compodoc argtypes\n keepNames: true,\n },\n };\n },\n };\n}\n\nexport { addons } from '@storybook/angular/preset';\n//# sourceMappingURL=preset.js.map\n"],"mappings":"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"}
1
+ {"version":3,"file":"preset.js","names":[],"sources":["../../../src/lib/preset.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport * as angularPreset from '@storybook/angular/preset';\nimport { fileURLToPath } from 'node:url';\nimport type { Plugin, UserConfig } from 'vite';\nimport * as vite from 'vite';\nimport angular from '@analogjs/vite-plugin-angular';\nimport { debugStyles } from './debug';\n\nexport const previewAnnotations = async (\n entries: string[] = [],\n options: any,\n): Promise<string[]> => {\n const config = fileURLToPath(\n import.meta.resolve('@storybook/angular/client/config'),\n );\n const annotations = [...entries, config];\n\n if (options.enableProdMode) {\n const previewProdPath = fileURLToPath(\n import.meta.resolve('@storybook/angular/client/preview-prod'),\n );\n annotations.unshift(previewProdPath);\n }\n\n const docsConfig = await options.presets.apply('docs', {}, options);\n const docsEnabled = Object.keys(docsConfig).length > 0;\n if (docsEnabled) {\n const docsConfigPath = fileURLToPath(\n import.meta.resolve('@storybook/angular/client/docs/config'),\n );\n annotations.push(docsConfigPath);\n }\n return annotations;\n};\n\nexport const core = async (config: any, options: any): Promise<any> => {\n const presetCore =\n typeof angularPreset.core === 'function'\n ? await angularPreset.core(config, options)\n : { ...config, ...angularPreset.core };\n return {\n ...presetCore,\n builder: {\n name: import.meta.resolve('@storybook/builder-vite'),\n options: { ...presetCore.options },\n },\n };\n};\n\nasync function resolveExperimentalZoneless(\n frameworkOptions: any,\n angularBuilderOptions: any,\n) {\n // 1. Explicit framework option (user's .storybook/main.ts)\n if (typeof frameworkOptions?.experimentalZoneless === 'boolean') {\n return frameworkOptions.experimentalZoneless;\n }\n\n // 2. Angular builder options (set by start-storybook/build-storybook)\n if (typeof angularBuilderOptions?.experimentalZoneless === 'boolean') {\n return angularBuilderOptions.experimentalZoneless;\n }\n\n // 3. Auto-detect Angular 21+ (matches @storybook/angular builder behavior)\n try {\n const { VERSION } = await import('@angular/core');\n return !!(VERSION.major && Number(VERSION.major) >= 21);\n } catch {\n return false;\n }\n}\n\nexport const viteFinal = async (config: any, options: any): Promise<any> => {\n // Remove any loaded analogjs plugins from a vite.config.(m)ts file.\n // Anonymous plugin entries (no `name` property) and falsy entries from\n // conditional plugin arrays must pass through untouched — only filter\n // plugins whose name explicitly contains \"analogjs\".\n config.plugins = (config.plugins ?? [])\n .flat()\n .filter((plugin: any) => !plugin?.name?.includes?.('analogjs'));\n\n // @ts-expect-error - untyped storybook presets API\n const framework = await options.presets.apply('framework');\n const { hmr: _removedHmrOption, ...frameworkOptions } =\n framework.options ?? {};\n const experimentalZoneless = await resolveExperimentalZoneless(\n frameworkOptions,\n options?.angularBuilderOptions,\n );\n const liveReload =\n typeof frameworkOptions.liveReload !== 'undefined'\n ? frameworkOptions.liveReload\n : false;\n return vite.mergeConfig(config, {\n // Add dependencies to pre-optimization\n optimizeDeps: {\n include: [\n '@storybook/angular/client',\n '@analogjs/storybook-angular',\n '@angular/compiler',\n '@angular/platform-browser',\n '@angular/platform-browser/animations',\n 'tslib',\n ...(experimentalZoneless ? [] : ['zone.js']),\n ],\n },\n resolve: {\n alias: {\n '@storybook/globalThis': '@storybook/global',\n },\n },\n plugins: [\n angular({\n jit:\n typeof frameworkOptions.jit !== 'undefined'\n ? frameworkOptions.jit\n : true,\n liveReload,\n tsconfig:\n typeof frameworkOptions.tsconfig !== 'undefined'\n ? frameworkOptions.tsconfig\n : (options?.tsConfig ?? './.storybook/tsconfig.json'),\n inlineStylesExtension:\n typeof frameworkOptions.inlineStylesExtension !== 'undefined'\n ? frameworkOptions.inlineStylesExtension\n : 'css',\n }),\n angularOptionsPlugin(options, {\n normalizePath: vite.normalizePath,\n experimentalZoneless,\n }),\n storybookTransformConfigPlugin(),\n ],\n define: {\n STORYBOOK_ANGULAR_OPTIONS: JSON.stringify({\n experimentalZoneless: !!experimentalZoneless,\n }),\n },\n });\n};\n\nfunction angularOptionsPlugin(\n options: any,\n {\n normalizePath,\n experimentalZoneless,\n }: { normalizePath: (path: string) => string; experimentalZoneless: boolean },\n): Plugin {\n let resolvedConfig: UserConfig | undefined;\n\n const resolveStyleImport = (\n extraImport: string,\n projectRoot: string,\n workspaceRoot: string,\n ) => {\n const resolvedProjectImport = resolve(projectRoot, extraImport);\n const resolvedWorkspaceImport = resolve(workspaceRoot, extraImport);\n\n if (\n extraImport.startsWith('.') ||\n extraImport.startsWith('src') ||\n existsSync(resolvedProjectImport)\n ) {\n return {\n specifier: resolvedProjectImport,\n source: 'project',\n } as const;\n }\n\n if (existsSync(resolvedWorkspaceImport)) {\n return {\n specifier: resolvedWorkspaceImport,\n source: 'workspace',\n } as const;\n }\n\n return {\n specifier: extraImport,\n source: 'bare',\n } as const;\n };\n\n return {\n name: 'analogjs-storybook-options-plugin',\n config(userConfig: UserConfig) {\n resolvedConfig = userConfig;\n const loadPaths =\n options?.angularBuilderOptions?.stylePreprocessorOptions?.loadPaths;\n const sassOptions =\n options?.angularBuilderOptions?.stylePreprocessorOptions?.sass;\n\n if (Array.isArray(loadPaths)) {\n const workspaceRoot =\n options.angularBuilderContext?.workspaceRoot ??\n userConfig?.root ??\n process.cwd();\n const resolvedLoadPaths = loadPaths.map(\n (loadPath) => `${resolve(workspaceRoot, loadPath)}`,\n );\n\n debugStyles('resolved SCSS load paths', {\n configDir: options.configDir,\n workspaceRoot,\n projectRoot: userConfig?.root ?? process.cwd(),\n loadPaths,\n resolvedLoadPaths,\n });\n\n return {\n css: {\n preprocessorOptions: {\n scss: {\n ...sassOptions,\n loadPaths: resolvedLoadPaths,\n },\n },\n },\n };\n }\n\n return;\n },\n async transform(code: string, id: string) {\n if (\n normalizePath(id).endsWith(\n normalizePath(`${options.configDir}/preview.ts`),\n )\n ) {\n const imports = [];\n const styles = options?.angularBuilderOptions?.styles;\n const workspaceRoot =\n options?.angularBuilderContext?.workspaceRoot ?? process.cwd();\n\n if (Array.isArray(styles)) {\n debugStyles('injecting Storybook global styles', {\n configDir: options.configDir,\n workspaceRoot,\n projectRoot: resolvedConfig?.root ?? process.cwd(),\n styles,\n });\n\n styles.forEach((style) => {\n imports.push(style);\n });\n }\n\n if (!experimentalZoneless) {\n imports.push('zone.js');\n }\n\n // Use vite config root when angularBuilderContext is not available\n // (e.g., when running via Vitest instead of Angular builders)\n const projectRoot = resolvedConfig?.root ?? process.cwd();\n\n return {\n code: `\n ${imports\n .map((extraImport) => {\n const resolved = resolveStyleImport(\n extraImport,\n projectRoot,\n workspaceRoot,\n );\n\n debugStyles('resolved Storybook style import', {\n input: extraImport,\n source: resolved.source,\n specifier: resolved.specifier,\n });\n\n return `import '${resolved.specifier}';`;\n })\n .join('\\n')}\n ${code}\n `,\n };\n }\n\n return;\n },\n };\n}\n\nfunction storybookTransformConfigPlugin() {\n const configKey = vite.rolldownVersion ? 'oxc' : 'esbuild';\n\n return {\n name: 'analogjs-storybook-transform-config',\n apply: 'build',\n config() {\n return {\n [configKey]: {\n // Don't mangle class names during the build\n // This fixes display of compodoc argtypes\n keepNames: true,\n },\n };\n },\n };\n}\n\nexport { addons } from '@storybook/angular/preset';\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import StartStorybookBuilder from '@storybook/angular/builders/start-storybook';
1
+ import StartStorybookBuilder from "@storybook/angular/builders/start-storybook";
2
2
  export default StartStorybookBuilder;
@@ -1 +1 @@
1
- {"version":3,"file":"start-storybook.js","names":[],"sources":["../../../../../../packages/storybook-angular/src/lib/start-storybook/start-storybook.ts"],"sourcesContent":["import StartStorybookBuilder from '@storybook/angular/builders/start-storybook';\n\nexport default StartStorybookBuilder;\n"],"mappings":";;AAEA,IAAA,0BAAe"}
1
+ {"version":3,"file":"start-storybook.js","names":[],"sources":["../../../../src/lib/start-storybook/start-storybook.ts"],"sourcesContent":["import StartStorybookBuilder from '@storybook/angular/builders/start-storybook';\n\nexport default StartStorybookBuilder;\n"],"mappings":";;AAEA,IAAA,0BAAe"}
@@ -1,7 +1,7 @@
1
- import '@angular/compiler';
2
- import type { AngularRenderer } from '@storybook/angular';
3
- import { NamedOrDefaultProjectAnnotations, NormalizedProjectAnnotations, RenderContext } from 'storybook/internal/types';
4
- import * as configAnnotations from '@storybook/angular/client/config';
1
+ import "@angular/compiler";
2
+ import type { AngularRenderer } from "@storybook/angular";
3
+ import { NamedOrDefaultProjectAnnotations, NormalizedProjectAnnotations, RenderContext } from "storybook/internal/types";
4
+ import * as configAnnotations from "@storybook/angular/client/config";
5
5
  export declare const render: typeof configAnnotations.render;
6
6
  export declare function renderToCanvas(context: RenderContext<AngularRenderer>, element: HTMLElement): Promise<void>;
7
7
  export declare function setProjectAnnotations(projectAnnotations: NamedOrDefaultProjectAnnotations<any> | NamedOrDefaultProjectAnnotations<any>[]): NormalizedProjectAnnotations<AngularRenderer>;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","names":[],"sources":["../../../../../packages/storybook-angular/src/lib/testing.ts"],"sourcesContent":["import '@angular/compiler';\nimport type { AngularRenderer } from '@storybook/angular';\nimport { setProjectAnnotations as originalSetProjectAnnotations } from '@storybook/angular/client';\nimport {\n NamedOrDefaultProjectAnnotations,\n NormalizedProjectAnnotations,\n RenderContext,\n} from 'storybook/internal/types';\nimport * as configAnnotations from '@storybook/angular/client/config';\n\nexport const render: typeof configAnnotations.render = configAnnotations.render;\n\nexport async function renderToCanvas(\n context: RenderContext<AngularRenderer>,\n element: HTMLElement,\n): Promise<void> {\n element.id = context.id;\n await configAnnotations.renderToCanvas(context, element);\n}\n\nconst renderAnnotations = {\n render,\n renderToCanvas,\n};\n\nexport function setProjectAnnotations(\n projectAnnotations:\n | NamedOrDefaultProjectAnnotations<any>\n | NamedOrDefaultProjectAnnotations<any>[],\n): NormalizedProjectAnnotations<AngularRenderer> {\n return originalSetProjectAnnotations([\n renderAnnotations,\n ...(Array.isArray(projectAnnotations)\n ? projectAnnotations\n : [projectAnnotations]),\n ]) as NormalizedProjectAnnotations<AngularRenderer>;\n}\n"],"mappings":";;;;AAUA,IAAa,SAA0C,kBAAkB;AAEzE,eAAsB,eACpB,SACA,SACe;AACf,SAAQ,KAAK,QAAQ;AACrB,OAAM,kBAAkB,eAAe,SAAS,QAAQ;;AAG1D,IAAM,oBAAoB;CACxB;CACA;CACD;AAED,SAAgB,sBACd,oBAG+C;AAC/C,QAAO,wBAA8B,CACnC,mBACA,GAAI,MAAM,QAAQ,mBAAmB,GACjC,qBACA,CAAC,mBAAmB,CACzB,CAAC"}
1
+ {"version":3,"file":"testing.js","names":[],"sources":["../../../src/lib/testing.ts"],"sourcesContent":["import '@angular/compiler';\nimport type { AngularRenderer } from '@storybook/angular';\nimport { setProjectAnnotations as originalSetProjectAnnotations } from '@storybook/angular/client';\nimport {\n NamedOrDefaultProjectAnnotations,\n NormalizedProjectAnnotations,\n RenderContext,\n} from 'storybook/internal/types';\nimport * as configAnnotations from '@storybook/angular/client/config';\n\nexport const render: typeof configAnnotations.render = configAnnotations.render;\n\nexport async function renderToCanvas(\n context: RenderContext<AngularRenderer>,\n element: HTMLElement,\n): Promise<void> {\n element.id = context.id;\n await configAnnotations.renderToCanvas(context, element);\n}\n\nconst renderAnnotations = {\n render,\n renderToCanvas,\n};\n\nexport function setProjectAnnotations(\n projectAnnotations:\n | NamedOrDefaultProjectAnnotations<any>\n | NamedOrDefaultProjectAnnotations<any>[],\n): NormalizedProjectAnnotations<AngularRenderer> {\n return originalSetProjectAnnotations([\n renderAnnotations,\n ...(Array.isArray(projectAnnotations)\n ? projectAnnotations\n : [projectAnnotations]),\n ]) as NormalizedProjectAnnotations<AngularRenderer>;\n}\n"],"mappings":";;;;AAUA,IAAa,SAA0C,kBAAkB;AAEzE,eAAsB,eACpB,SACA,SACe;AACf,SAAQ,KAAK,QAAQ;AACrB,OAAM,kBAAkB,eAAe,SAAS,QAAQ;;AAG1D,IAAM,oBAAoB;CACxB;CACA;CACD;AAED,SAAgB,sBACd,oBAG+C;AAC/C,QAAO,wBAA8B,CACnC,mBACA,GAAI,MAAM,QAAQ,mBAAmB,GACjC,qBACA,CAAC,mBAAmB,CACzB,CAAC"}
@@ -1,9 +1,9 @@
1
- import { BuilderOptions, CLIOptions, LoadOptions } from 'storybook/internal/types';
1
+ import { BuilderOptions, CLIOptions, LoadOptions } from "storybook/internal/types";
2
2
  export type StandaloneOptions = CLIOptions & LoadOptions & BuilderOptions & {
3
- mode?: 'static' | 'dev';
4
- enableProdMode: boolean;
5
- angularBuilderOptions?: Record<string, any> & {
6
- experimentalZoneless?: boolean;
7
- };
8
- tsConfig?: string;
3
+ mode?: "static" | "dev";
4
+ enableProdMode: boolean;
5
+ angularBuilderOptions?: Record<string, any> & {
6
+ experimentalZoneless?: boolean;
7
+ };
8
+ tsConfig?: string;
9
9
  };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Ambient declarations for `@storybook/angular` deep-import subpaths.
3
+ *
4
+ * As of `@storybook/angular@10.2.x` these subpath entry points ship as
5
+ * `.js` without accompanying `.d.ts`, so `tsc` reports TS7016
6
+ * ("could not find a declaration file for module …"). The runtime exports
7
+ * are unchanged; these shims restore type resolution for the build.
8
+ */
9
+ declare module '@storybook/angular/preset';
10
+ declare module '@storybook/angular/client';
11
+ declare module '@storybook/angular/client/config';
12
+ declare module '@storybook/angular/client/docs/config';
13
+ declare module '@storybook/angular/client/preview-prod';
14
+ declare module '@storybook/angular/builders/start-storybook';
15
+ declare module '@storybook/angular/builders/build-storybook';
package/src/types.d.ts CHANGED
@@ -1,27 +1,33 @@
1
- import { CompatibleString } from 'storybook/internal/types';
2
- import { StorybookConfig as StorybookConfigBase } from '@storybook/angular';
3
- import { BuilderOptions, StorybookConfigVite } from '@storybook/builder-vite';
4
- type FrameworkName = CompatibleString<'@analogjs/storybook-angular'>;
5
- type BuilderName = CompatibleString<'@storybook/builder-vite'>;
1
+ import { CompatibleString } from "storybook/internal/types";
2
+ import { StorybookConfig as StorybookConfigBase } from "@storybook/angular";
3
+ import { BuilderOptions, StorybookConfigVite } from "@storybook/builder-vite";
4
+ type FrameworkName = CompatibleString<"@analogjs/storybook-angular">;
5
+ type BuilderName = CompatibleString<"@storybook/builder-vite">;
6
6
  export type FrameworkOptions = {
7
- builder?: BuilderOptions;
8
- jit?: boolean;
9
- liveReload?: boolean;
10
- inlineStylesExtension?: string;
11
- tsconfig?: string;
12
- experimentalZoneless?: boolean;
7
+ builder?: BuilderOptions;
8
+ jit?: boolean;
9
+ /**
10
+ * Enables Analog's Angular live-reload/HMR pipeline for Storybook.
11
+ *
12
+ * This is separate from Vite's `server.hmr` option, which configures the
13
+ * HMR client transport.
14
+ */
15
+ liveReload?: boolean;
16
+ inlineStylesExtension?: string;
17
+ tsconfig?: string;
18
+ experimentalZoneless?: boolean;
13
19
  };
14
20
  type StorybookConfigFramework = {
15
- framework: FrameworkName | {
16
- name: FrameworkName;
17
- options: FrameworkOptions;
18
- };
19
- core?: StorybookConfigBase['core'] & {
20
- builder?: BuilderName | {
21
- name: BuilderName;
22
- options: BuilderOptions;
23
- };
24
- };
21
+ framework: FrameworkName | {
22
+ name: FrameworkName;
23
+ options: FrameworkOptions;
24
+ };
25
+ core?: StorybookConfigBase["core"] & {
26
+ builder?: BuilderName | {
27
+ name: BuilderName;
28
+ options: BuilderOptions;
29
+ };
30
+ };
25
31
  };
26
32
  /** The interface for Storybook configuration in `main.ts` files. */
27
33
  export type StorybookConfig = Omit<StorybookConfigBase, keyof StorybookConfigVite | keyof StorybookConfigFramework> & StorybookConfigVite & StorybookConfigFramework;
File without changes
package/src/types.js DELETED
File without changes