storybook-builder-rsbuild 0.1.1 → 0.1.3

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/dist/index.js CHANGED
@@ -122,10 +122,9 @@ module.exports = __toCommonJS(src_exports);
122
122
  var import_node_net = require("net");
123
123
  var import_node_path5 = require("path");
124
124
  var rsbuildReal = __toESM(require("@rsbuild/core"));
125
- var import_core2 = require("@rsbuild/core");
126
- var import_express = __toESM(require("express"));
127
125
  var import_fs_extra = __toESM(require("fs-extra"));
128
126
  var import_pretty_hrtime = __toESM(require_pretty_hrtime());
127
+ var import_sirv = __toESM(require("sirv"));
129
128
  var import_core_path = require("storybook/core-path");
130
129
  var import_common3 = require("storybook/internal/common");
131
130
  var import_server_errors = require("storybook/internal/server-errors");
@@ -162,7 +161,15 @@ var import_ts_dedent = require("ts-dedent");
162
161
  var getVirtualModules = async (options) => {
163
162
  const virtualModules = {};
164
163
  const cwd = process.cwd();
165
- const workingDir = options.cache?.basePath || process.cwd();
164
+ const workingDir = options.cache ? import_node_path.default.resolve(
165
+ process.cwd(),
166
+ // TODO: This is a hard code cache dir, as Rspack doesn't support virtual modules now.
167
+ // Remove this when Rspack supports virtual modules.
168
+ "./node_modules/.cache/storybook/storybook-rsbuild-builder"
169
+ ) : process.cwd();
170
+ if (!import_node_fs.default.existsSync(workingDir)) {
171
+ import_node_fs.default.mkdirSync(workingDir, { recursive: true });
172
+ }
166
173
  const isProd = options.configType === "PRODUCTION";
167
174
  const nonNormalizedStories = await options.presets.apply("stories", []);
168
175
  const entries = [];
@@ -192,15 +199,14 @@ var getVirtualModules = async (options) => {
192
199
  needPipelinedImport
193
200
  });
194
201
  const configEntryPath = (0, import_node_path2.resolve)((0, import_node_path2.join)(workingDir, "storybook-config-entry.js"));
195
- virtualModules[configEntryPath] = (0, import_common.handlebars)(
196
- await (0, import_common.readTemplate)(
197
- require.resolve("storybook-builder-rsbuild/templates/virtualModuleModernEntry.js.handlebars")
198
- ),
199
- {
200
- storiesFilename,
201
- previewAnnotations
202
- }
203
- // We need to double escape `\` for webpack. We may have some in windows paths
202
+ virtualModules[configEntryPath] = (await (0, import_common.readTemplate)(
203
+ require.resolve("storybook-builder-rsbuild/templates/virtualModuleModernEntry.js")
204
+ )).replaceAll(`'{{storiesFilename}}'`, `'./${storiesFilename}'`).replaceAll(
205
+ `'{{previewAnnotations}}'`,
206
+ previewAnnotations.filter(Boolean).map((entry) => `'${entry}'`).join(",")
207
+ ).replaceAll(
208
+ `'{{previewAnnotations_requires}}'`,
209
+ previewAnnotations.filter(Boolean).map((entry) => `require('${entry}')`).join(",")
204
210
  ).replace(/\\/g, "\\\\");
205
211
  entries.push(configEntryPath);
206
212
  for (const [key, value] of Object.entries(virtualModules)) {
@@ -327,7 +333,7 @@ var iframe_rsbuild_config_default = async (options, extraWebpackConfig) => {
327
333
  docsOptions,
328
334
  entries,
329
335
  nonNormalizedStories,
330
- // modulesCount = 1000,
336
+ _modulesCount,
331
337
  build2,
332
338
  tagsOptions
333
339
  ] = await Promise.all([
@@ -341,8 +347,7 @@ var iframe_rsbuild_config_default = async (options, extraWebpackConfig) => {
341
347
  presets.apply("docs"),
342
348
  presets.apply("entries", []),
343
349
  presets.apply("stories", []),
344
- options.cache?.get("modulesCount").catch(() => {
345
- }),
350
+ options.cache?.get("modulesCount", 1e3),
346
351
  options.presets.apply("build"),
347
352
  presets.apply("tags", {})
348
353
  ]);
@@ -655,7 +660,7 @@ var rsbuild = async (_, options) => {
655
660
  );
656
661
  let defaultConfig = await iframe_rsbuild_config_default(options, webpackAddonsConfig);
657
662
  const shimsConfig = await applyReactShims(defaultConfig, options);
658
- defaultConfig = (0, import_core2.mergeRsbuildConfig)(
663
+ defaultConfig = rsbuildReal.mergeRsbuildConfig(
659
664
  defaultConfig,
660
665
  shimsConfig
661
666
  );
@@ -725,7 +730,7 @@ var start = async ({
725
730
  const previewDirOrigin = previewResolvedDir;
726
731
  router.use(
727
732
  "/sb-preview",
728
- import_express.default.static(previewDirOrigin, { immutable: true, maxAge: "5m" })
733
+ (0, import_sirv.default)(previewDirOrigin, { maxAge: 3e5, dev: true, immutable: true })
729
734
  );
730
735
  router.use(rsbuildServer.middlewares);
731
736
  rsbuildServer.connectWebSocket({ server: storybookServer });
package/dist/index.mjs CHANGED
@@ -2,11 +2,11 @@ import { __commonJS, __toESM, __require } from './chunk-TTFRSOOU.mjs';
2
2
  import { createServer } from 'net';
3
3
  import path, { join, resolve, parse, dirname, isAbsolute } from 'path';
4
4
  import * as rsbuildReal from '@rsbuild/core';
5
- import { mergeRsbuildConfig, loadConfig } from '@rsbuild/core';
6
- import express from 'express';
5
+ import { loadConfig, mergeRsbuildConfig } from '@rsbuild/core';
7
6
  import fs2 from 'fs-extra';
7
+ import sirv from 'sirv';
8
8
  import { corePath } from 'storybook/core-path';
9
- import { normalizeStories, loadPreviewOrConfigFile, getBuilderOptions, handlebars, readTemplate, resolveAddonName, getPresets, stringifyProcessEnvs, isPreservingSymlinks } from 'storybook/internal/common';
9
+ import { normalizeStories, loadPreviewOrConfigFile, getBuilderOptions, readTemplate, resolveAddonName, getPresets, stringifyProcessEnvs, isPreservingSymlinks } from 'storybook/internal/common';
10
10
  import { WebpackInvocationError } from 'storybook/internal/server-errors';
11
11
  import { pluginTypeCheck } from '@rsbuild/plugin-type-check';
12
12
  import { webpack } from '@storybook/addon-docs/dist/preset';
@@ -103,7 +103,15 @@ function slash(path2) {
103
103
  var getVirtualModules = async (options) => {
104
104
  const virtualModules = {};
105
105
  const cwd = process.cwd();
106
- const workingDir = options.cache?.basePath || process.cwd();
106
+ const workingDir = options.cache ? path.resolve(
107
+ process.cwd(),
108
+ // TODO: This is a hard code cache dir, as Rspack doesn't support virtual modules now.
109
+ // Remove this when Rspack supports virtual modules.
110
+ "./node_modules/.cache/storybook/storybook-rsbuild-builder"
111
+ ) : process.cwd();
112
+ if (!fs.existsSync(workingDir)) {
113
+ fs.mkdirSync(workingDir, { recursive: true });
114
+ }
107
115
  const isProd = options.configType === "PRODUCTION";
108
116
  const nonNormalizedStories = await options.presets.apply("stories", []);
109
117
  const entries = [];
@@ -133,17 +141,16 @@ var getVirtualModules = async (options) => {
133
141
  needPipelinedImport
134
142
  });
135
143
  const configEntryPath = resolve(join(workingDir, "storybook-config-entry.js"));
136
- virtualModules[configEntryPath] = handlebars(
137
- await readTemplate(
138
- __require.resolve(
139
- "storybook-builder-rsbuild/templates/virtualModuleModernEntry.js.handlebars"
140
- )
141
- ),
142
- {
143
- storiesFilename,
144
- previewAnnotations
145
- }
146
- // We need to double escape `\` for webpack. We may have some in windows paths
144
+ virtualModules[configEntryPath] = (await readTemplate(
145
+ __require.resolve(
146
+ "storybook-builder-rsbuild/templates/virtualModuleModernEntry.js"
147
+ )
148
+ )).replaceAll(`'{{storiesFilename}}'`, `'./${storiesFilename}'`).replaceAll(
149
+ `'{{previewAnnotations}}'`,
150
+ previewAnnotations.filter(Boolean).map((entry) => `'${entry}'`).join(",")
151
+ ).replaceAll(
152
+ `'{{previewAnnotations_requires}}'`,
153
+ previewAnnotations.filter(Boolean).map((entry) => `require('${entry}')`).join(",")
147
154
  ).replace(/\\/g, "\\\\");
148
155
  entries.push(configEntryPath);
149
156
  for (const [key, value] of Object.entries(virtualModules)) {
@@ -270,7 +277,7 @@ var iframe_rsbuild_config_default = async (options, extraWebpackConfig) => {
270
277
  docsOptions,
271
278
  entries,
272
279
  nonNormalizedStories,
273
- // modulesCount = 1000,
280
+ _modulesCount,
274
281
  build2,
275
282
  tagsOptions
276
283
  ] = await Promise.all([
@@ -284,8 +291,7 @@ var iframe_rsbuild_config_default = async (options, extraWebpackConfig) => {
284
291
  presets.apply("docs"),
285
292
  presets.apply("entries", []),
286
293
  presets.apply("stories", []),
287
- options.cache?.get("modulesCount").catch(() => {
288
- }),
294
+ options.cache?.get("modulesCount", 1e3),
289
295
  options.presets.apply("build"),
290
296
  presets.apply("tags", {})
291
297
  ]);
@@ -596,7 +602,7 @@ var rsbuild = async (_, options) => {
596
602
  );
597
603
  let defaultConfig = await iframe_rsbuild_config_default(options, webpackAddonsConfig);
598
604
  const shimsConfig = await applyReactShims(defaultConfig, options);
599
- defaultConfig = mergeRsbuildConfig(
605
+ defaultConfig = rsbuildReal.mergeRsbuildConfig(
600
606
  defaultConfig,
601
607
  shimsConfig
602
608
  );
@@ -666,7 +672,7 @@ var start = async ({
666
672
  const previewDirOrigin = previewResolvedDir;
667
673
  router.use(
668
674
  "/sb-preview",
669
- express.static(previewDirOrigin, { immutable: true, maxAge: "5m" })
675
+ sirv(previewDirOrigin, { maxAge: 3e5, dev: true, immutable: true })
670
676
  );
671
677
  router.use(rsbuildServer.middlewares);
672
678
  rsbuildServer.connectWebSocket({ server: storybookServer });
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "storybook-builder-rsbuild",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Rsbuild builder for Storybook",
5
5
  "keywords": [
6
6
  "storybook",
7
7
  "rsbuild",
8
8
  "rspack"
9
9
  ],
10
+ "homepage": "https://storybook-rsbuild.netlify.app",
10
11
  "bugs": {
11
12
  "url": "https://github.com/rspack-contrib/storybook-rsbuild/issues"
12
13
  },
@@ -38,7 +39,7 @@
38
39
  "node": "./dist/loaders/export-order-loader.js",
39
40
  "require": "./dist/loaders/export-order-loader.js"
40
41
  },
41
- "./templates/virtualModuleModernEntry.js.handlebars": "./templates/virtualModuleModernEntry.js.handlebars",
42
+ "./templates/virtualModuleModernEntry.js": "./templates/virtualModuleModernEntry.js",
42
43
  "./templates/preview.ejs": "./templates/preview.ejs",
43
44
  "./templates/virtualModuleEntry.template.js": "./templates/virtualModuleEntry.template.js",
44
45
  "./templates/virtualModuleStory.template.js": "./templates/virtualModuleStory.template.js",
@@ -64,27 +65,26 @@
64
65
  "cjs-module-lexer": "^1.4.1",
65
66
  "constants-browserify": "^1.0.0",
66
67
  "es-module-lexer": "^1.5.4",
67
- "express": "^4.21.0",
68
68
  "fs-extra": "^11.2.0",
69
- "magic-string": "^0.30.11",
69
+ "magic-string": "^0.30.12",
70
70
  "path-browserify": "^1.0.1",
71
71
  "process": "^0.11.10",
72
72
  "rsbuild-plugin-html-minifier-terser": "^1.1.1",
73
+ "sirv": "^2.0.4",
73
74
  "ts-dedent": "^2.2.0",
74
75
  "url": "^0.11.4",
75
76
  "util": "^0.12.5",
76
77
  "util-deprecate": "^1.0.2"
77
78
  },
78
79
  "devDependencies": {
79
- "@rsbuild/core": "1.0.8",
80
- "@types/express": "^4.17.21",
80
+ "@rsbuild/core": "1.0.19",
81
81
  "@types/fs-extra": "^11.0.4",
82
82
  "@types/node": "^18.0.0",
83
83
  "@types/pretty-hrtime": "^1.0.3",
84
84
  "pretty-hrtime": "^1.0.3",
85
85
  "slash": "^5.1.0",
86
- "storybook": "8.4.0-alpha.0",
87
- "typescript": "^5.6.2"
86
+ "storybook": "8.4.0-alpha.7",
87
+ "typescript": "^5.6.3"
88
88
  },
89
89
  "peerDependencies": {
90
90
  "@rsbuild/core": "^1.0.1",
@@ -0,0 +1,38 @@
1
+ import { createBrowserChannel } from 'storybook/internal/channels'
2
+ import {
3
+ PreviewWeb,
4
+ addons,
5
+ composeConfigs,
6
+ } from 'storybook/internal/preview-api'
7
+
8
+ import { global } from '@storybook/global'
9
+
10
+ import { importFn } from '{{storiesFilename}}'
11
+
12
+ const getProjectAnnotations = () =>
13
+ composeConfigs(['{{previewAnnotations_requires}}'])
14
+
15
+ const channel = createBrowserChannel({ page: 'preview' })
16
+ addons.setChannel(channel)
17
+
18
+ if (global.CONFIG_TYPE === 'DEVELOPMENT') {
19
+ window.__STORYBOOK_SERVER_CHANNEL__ = channel
20
+ }
21
+
22
+ const preview = new PreviewWeb(importFn, getProjectAnnotations)
23
+
24
+ window.__STORYBOOK_PREVIEW__ = preview
25
+ window.__STORYBOOK_STORY_STORE__ = preview.storyStore
26
+ window.__STORYBOOK_ADDONS_CHANNEL__ = channel
27
+
28
+ if (import.meta.webpackHot) {
29
+ import.meta.webpackHot.accept('{{storiesFilename}}', () => {
30
+ // importFn has changed so we need to patch the new one in
31
+ preview.onStoriesChanged({ importFn })
32
+ })
33
+
34
+ import.meta.webpackHot.accept(['{{previewAnnotations}}'], () => {
35
+ // getProjectAnnotations has changed so we need to patch the new one in
36
+ preview.onGetProjectAnnotationsChanged({ getProjectAnnotations })
37
+ })
38
+ }
@@ -1,34 +0,0 @@
1
- import { global } from '@storybook/global';
2
-
3
- import { ClientApi, PreviewWeb, addons, composeConfigs } from 'storybook/internal/preview-api';
4
- import { createBrowserChannel } from 'storybook/internal/channels';
5
-
6
- import { importFn } from './{{storiesFilename}}';
7
-
8
- const getProjectAnnotations = () =>
9
- composeConfigs([{{#each previewAnnotations}}require('{{this}}'),{{/each}}]);
10
-
11
- const channel = createBrowserChannel({ page: 'preview' });
12
- addons.setChannel(channel);
13
-
14
- if (global.CONFIG_TYPE === 'DEVELOPMENT'){
15
- window.__STORYBOOK_SERVER_CHANNEL__ = channel;
16
- }
17
-
18
- const preview = new PreviewWeb(importFn, getProjectAnnotations);
19
-
20
- window.__STORYBOOK_PREVIEW__ = preview;
21
- window.__STORYBOOK_STORY_STORE__ = preview.storyStore;
22
- window.__STORYBOOK_ADDONS_CHANNEL__ = channel;
23
-
24
- if (import.meta.webpackHot) {
25
- import.meta.webpackHot.accept('./{{storiesFilename}}', () => {
26
- // importFn has changed so we need to patch the new one in
27
- preview.onStoriesChanged({ importFn });
28
- });
29
-
30
- import.meta.webpackHot.accept([{{#each previewAnnotations}}'{{this}}',{{/each}}], () => {
31
- // getProjectAnnotations has changed so we need to patch the new one in
32
- preview.onGetProjectAnnotationsChanged({ getProjectAnnotations });
33
- });
34
- }