@storybook/addon-vitest 10.1.0-alpha.11 → 10.1.0-alpha.13

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.
@@ -1,33 +1,32 @@
1
- import CJS_COMPAT_NODE_URL_zfiyucf8tb from 'node:url';
2
- import CJS_COMPAT_NODE_PATH_zfiyucf8tb from 'node:path';
3
- import CJS_COMPAT_NODE_MODULE_zfiyucf8tb from "node:module";
1
+ import CJS_COMPAT_NODE_URL_4nt6o51r4ah from 'node:url';
2
+ import CJS_COMPAT_NODE_PATH_4nt6o51r4ah from 'node:path';
3
+ import CJS_COMPAT_NODE_MODULE_4nt6o51r4ah from "node:module";
4
4
 
5
- var __filename = CJS_COMPAT_NODE_URL_zfiyucf8tb.fileURLToPath(import.meta.url);
6
- var __dirname = CJS_COMPAT_NODE_PATH_zfiyucf8tb.dirname(__filename);
7
- var require = CJS_COMPAT_NODE_MODULE_zfiyucf8tb.createRequire(import.meta.url);
5
+ var __filename = CJS_COMPAT_NODE_URL_4nt6o51r4ah.fileURLToPath(import.meta.url);
6
+ var __dirname = CJS_COMPAT_NODE_PATH_4nt6o51r4ah.dirname(__filename);
7
+ var require = CJS_COMPAT_NODE_MODULE_4nt6o51r4ah.createRequire(import.meta.url);
8
8
 
9
9
  // ------------------------------------------------------------
10
10
  // end of CJS compatibility banner, injected by Storybook's esbuild configuration
11
11
  // ------------------------------------------------------------
12
12
  import {
13
- execa,
14
13
  resolvePackageDir
15
- } from "./_node-chunks/chunk-BEGZGAUW.js";
14
+ } from "./_node-chunks/chunk-HKZ24UC3.js";
16
15
  import {
17
- any,
18
- getAddonNames,
19
- up
20
- } from "./_node-chunks/chunk-FD2MOKYY.js";
16
+ any
17
+ } from "./_node-chunks/chunk-25N73QA4.js";
21
18
  import {
22
- DOCUMENTATION_LINK,
23
- SUPPORTED_FRAMEWORKS
24
- } from "./_node-chunks/chunk-TCQNKRGF.js";
19
+ DOCUMENTATION_LINK
20
+ } from "./_node-chunks/chunk-FJKQJ53U.js";
21
+ import {
22
+ require_dist
23
+ } from "./_node-chunks/chunk-IZMDFVYT.js";
25
24
  import {
26
25
  dirname,
27
26
  join,
28
27
  relative,
29
28
  resolve
30
- } from "./_node-chunks/chunk-L7WYCUSW.js";
29
+ } from "./_node-chunks/chunk-F3U6JEPX.js";
31
30
  import {
32
31
  require_compare,
33
32
  require_constants,
@@ -37,11 +36,11 @@ import {
37
36
  require_parse_options,
38
37
  require_re,
39
38
  require_semver
40
- } from "./_node-chunks/chunk-CHRIX3Z2.js";
39
+ } from "./_node-chunks/chunk-CWEKNW53.js";
41
40
  import {
42
41
  __commonJS,
43
42
  __toESM
44
- } from "./_node-chunks/chunk-FCFZB5YS.js";
43
+ } from "./_node-chunks/chunk-6K4PB6ZM.js";
45
44
 
46
45
  // ../../node_modules/semver/functions/parse.js
47
46
  var require_parse = __commonJS({
@@ -295,7 +294,7 @@ var require_cmp = __commonJS({
295
294
  var require_coerce = __commonJS({
296
295
  "../../node_modules/semver/functions/coerce.js"(exports, module) {
297
296
  "use strict";
298
- var SemVer = require_semver(), parse = require_parse(), { safeRe: re, t } = require_re(), coerce2 = (version, options) => {
297
+ var SemVer = require_semver(), parse = require_parse(), { safeRe: re, t } = require_re(), coerce = (version, options) => {
299
298
  if (version instanceof SemVer)
300
299
  return version;
301
300
  if (typeof version == "number" && (version = String(version)), typeof version != "string")
@@ -315,7 +314,7 @@ var require_coerce = __commonJS({
315
314
  let major = match[2], minor = match[3] || "0", patch = match[4] || "0", prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : "", build = options.includePrerelease && match[6] ? `+${match[6]}` : "";
316
315
  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options);
317
316
  };
318
- module.exports = coerce2;
317
+ module.exports = coerce;
319
318
  }
320
319
  });
321
320
 
@@ -820,7 +819,7 @@ var require_subset = __commonJS({
820
819
  var require_semver2 = __commonJS({
821
820
  "../../node_modules/semver/index.js"(exports, module) {
822
821
  "use strict";
823
- var internalRe = require_re(), constants = require_constants(), SemVer = require_semver(), identifiers = require_identifiers(), parse = require_parse(), valid = require_valid(), clean = require_clean(), inc = require_inc(), diff = require_diff(), major = require_major(), minor = require_minor(), patch = require_patch(), prerelease = require_prerelease(), compare = require_compare(), rcompare = require_rcompare(), compareLoose = require_compare_loose(), compareBuild = require_compare_build(), sort = require_sort(), rsort = require_rsort(), gt = require_gt(), lt = require_lt(), eq = require_eq(), neq = require_neq(), gte = require_gte(), lte = require_lte(), cmp = require_cmp(), coerce2 = require_coerce(), Comparator = require_comparator(), Range = require_range(), satisfies2 = require_satisfies(), toComparators = require_to_comparators(), maxSatisfying = require_max_satisfying(), minSatisfying = require_min_satisfying(), minVersion = require_min_version(), validRange = require_valid2(), outside = require_outside(), gtr = require_gtr(), ltr = require_ltr(), intersects = require_intersects(), simplifyRange = require_simplify(), subset = require_subset();
822
+ var internalRe = require_re(), constants = require_constants(), SemVer = require_semver(), identifiers = require_identifiers(), parse = require_parse(), valid = require_valid(), clean = require_clean(), inc = require_inc(), diff = require_diff(), major = require_major(), minor = require_minor(), patch = require_patch(), prerelease = require_prerelease(), compare = require_compare(), rcompare = require_rcompare(), compareLoose = require_compare_loose(), compareBuild = require_compare_build(), sort = require_sort(), rsort = require_rsort(), gt = require_gt(), lt = require_lt(), eq = require_eq(), neq = require_neq(), gte = require_gte(), lte = require_lte(), cmp = require_cmp(), coerce = require_coerce(), Comparator = require_comparator(), Range = require_range(), satisfies2 = require_satisfies(), toComparators = require_to_comparators(), maxSatisfying = require_max_satisfying(), minSatisfying = require_min_satisfying(), minVersion = require_min_version(), validRange = require_valid2(), outside = require_outside(), gtr = require_gtr(), ltr = require_ltr(), intersects = require_intersects(), simplifyRange = require_simplify(), subset = require_subset();
824
823
  module.exports = {
825
824
  parse,
826
825
  valid,
@@ -844,7 +843,7 @@ var require_semver2 = __commonJS({
844
843
  gte,
845
844
  lte,
846
845
  cmp,
847
- coerce: coerce2,
846
+ coerce,
848
847
  Comparator,
849
848
  Range,
850
849
  satisfies: satisfies2,
@@ -875,42 +874,21 @@ var require_semver2 = __commonJS({
875
874
  import { existsSync } from "node:fs";
876
875
  import * as fs2 from "node:fs/promises";
877
876
  import { writeFile } from "node:fs/promises";
878
- import { isAbsolute, posix, sep } from "node:path";
879
- import { fileURLToPath, pathToFileURL } from "node:url";
880
- import { babelParse, generate, traverse } from "storybook/internal/babel";
877
+ import { babelParse, generate } from "storybook/internal/babel";
878
+ import { AddonVitestService } from "storybook/internal/cli";
881
879
  import {
882
880
  JsPackageManagerFactory,
883
881
  formatFileContent,
884
- getInterpretedFile,
885
882
  getProjectRoot,
886
- isCI as isCI2,
887
- loadMainConfig,
888
- scanAndTransformFiles,
889
- transformImportFiles
883
+ getStorybookInfo
890
884
  } from "storybook/internal/common";
891
- import { experimental_loadStorybook } from "storybook/internal/core-server";
892
- import { readConfig, writeConfig } from "storybook/internal/csf-tools";
893
- import { logger as logger2 } from "storybook/internal/node-logger";
894
-
895
- // ../../node_modules/empathic/package.mjs
896
- function up2(options) {
897
- return up("package.json", options);
898
- }
899
-
900
- // src/postinstall.ts
901
- var import_semver = __toESM(require_semver2(), 1);
902
- import prompts from "prompts";
903
- import { dedent } from "ts-dedent";
904
-
905
- // src/postinstall-logger.ts
906
- import { isCI } from "storybook/internal/common";
907
- import { colors, logger } from "storybook/internal/node-logger";
908
- var fancy = process.platform !== "win32" || isCI() || process.env.TERM === "xterm-256color", step = colors.gray("\u203A"), info = colors.blue(fancy ? "\u2139" : "i"), success = colors.green(fancy ? "\u2714" : "\u221A"), warning = colors.orange(fancy ? "\u26A0" : "\u203C"), error = colors.red(fancy ? "\u2716" : "\xD7"), baseOptions = {
909
- borderStyle: "round",
910
- padding: 1
911
- }, print = (message, options) => {
912
- logger.line(1), logger.logBox(message, { ...baseOptions, ...options });
913
- }, printInfo = (title, message, options) => print(message, { borderColor: "blue", title, ...options }), printWarning = (title, message, options) => print(message, { borderColor: "yellow", title, ...options }), printError = (title, message, options) => print(message, { borderColor: "red", title, ...options }), printSuccess = (title, message, options) => print(message, { borderColor: "green", title, ...options });
885
+ import { CLI_COLORS } from "storybook/internal/node-logger";
886
+ import {
887
+ AddonVitestPostinstallError,
888
+ AddonVitestPostinstallPrerequisiteCheckError
889
+ } from "storybook/internal/server-errors";
890
+ import { SupportedFramework } from "storybook/internal/types";
891
+ var import_semver = __toESM(require_semver2(), 1), import_ts_dedent = __toESM(require_dist(), 1);
914
892
 
915
893
  // src/updateVitestFile.ts
916
894
  import * as fs from "node:fs/promises";
@@ -1060,167 +1038,91 @@ var loadTemplate = async (name, replacements) => {
1060
1038
  };
1061
1039
 
1062
1040
  // src/postinstall.ts
1063
- var ADDON_NAME = "@storybook/addon-vitest", EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".cts", ".mts", ".cjs", ".mjs"], addonA11yName = "@storybook/addon-a11y", hasErrors = !1;
1064
- function nameMatches(name, pattern) {
1065
- return !!(name === pattern || name.includes(`${pattern}${sep}`) || name.includes(`${pattern}${posix.sep}`));
1066
- }
1067
- var logErrors = (...args) => {
1068
- hasErrors = !0, printError(...args);
1069
- }, findFile = (basename, extensions = EXTENSIONS) => any(
1070
- extensions.map((ext) => basename + ext),
1071
- { last: getProjectRoot() }
1072
- );
1041
+ var ADDON_NAME = "@storybook/addon-vitest", EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".cts", ".mts", ".cjs", ".mjs"], addonA11yName = "@storybook/addon-a11y";
1073
1042
  async function postInstall(options) {
1074
- printSuccess(
1075
- "\u{1F44B} Howdy!",
1076
- dedent`
1077
- I'm the installation helper for ${ADDON_NAME}
1078
-
1079
- Hold on for a moment while I look at your project and get it set up...
1080
- `
1081
- );
1082
- let packageManager = JsPackageManagerFactory.getPackageManager({
1043
+ let errors = [], { logger, prompt } = options, packageManager = JsPackageManagerFactory.getPackageManager({
1083
1044
  force: options.packageManager
1084
- }), vitestVersionSpecifier = await packageManager.getInstalledVersion("vitest"), coercedVitestVersion = vitestVersionSpecifier ? (0, import_semver.coerce)(vitestVersionSpecifier) : null, isVitest3_2To4 = vitestVersionSpecifier ? (0, import_semver.satisfies)(vitestVersionSpecifier, ">=3.2.0 <4.0.0") : !1, isVitest4OrNewer = vitestVersionSpecifier ? (0, import_semver.satisfies)(vitestVersionSpecifier, ">=4.0.0") : !0, info2 = await getStorybookInfo(options), allDeps = packageManager.getAllDependencies(), uniqueDependencies = [
1085
- "vitest",
1086
- "playwright",
1087
- isVitest4OrNewer ? "@vitest/browser-playwright" : "@vitest/browser"
1088
- ].filter((p) => !allDeps[p]), mainJsPath = getInterpretedFile(resolve(options.configDir, "main")), config = await readConfig(mainJsPath), hasCustomWebpackConfig = !!config.getFieldNode(["webpackFinal"]), isInteractive = process.stdout.isTTY && !isCI2();
1089
- nameMatches(info2.frameworkPackageName, "@storybook/nextjs") && !hasCustomWebpackConfig && (options.yes || !isInteractive ? { migrateToNextjsVite: !!options.yes } : await prompts({
1090
- type: "confirm",
1091
- name: "migrateToNextjsVite",
1092
- message: dedent`
1093
- The addon requires the use of @storybook/nextjs-vite to work with Next.js.
1094
- https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#install-and-set-up
1045
+ }), findFile = (basename, extensions = EXTENSIONS) => any(
1046
+ extensions.map((ext) => basename + ext),
1047
+ { last: getProjectRoot(), cwd: options.configDir }
1048
+ ), vitestVersionSpecifier = await packageManager.getInstalledVersion("vitest");
1049
+ logger.debug(`Vitest version specifier: ${vitestVersionSpecifier}`);
1050
+ let isVitest3_2To4 = vitestVersionSpecifier ? (0, import_semver.satisfies)(vitestVersionSpecifier, ">=3.2.0 <4.0.0") : !1, isVitest4OrNewer = vitestVersionSpecifier ? (0, import_semver.satisfies)(vitestVersionSpecifier, ">=4.0.0") : !0, info = await getStorybookInfo(options.configDir), allDeps = packageManager.getAllDependencies(), addonVitestService = new AddonVitestService(), compatibilityResult = await addonVitestService.validateCompatibility({
1051
+ packageManager,
1052
+ framework: info.framework,
1053
+ builder: info.builder
1054
+ }), result = null;
1055
+ if (!compatibilityResult.compatible && compatibilityResult.reasons) {
1056
+ let reasons = compatibilityResult.reasons.map((r) => `\u2022 ${CLI_COLORS.error(r)}`);
1057
+ reasons.unshift(import_ts_dedent.dedent`
1058
+ Automated setup failed
1059
+ The following packages have incompatibilities that prevent automated setup:
1060
+ `), reasons.push(
1061
+ import_ts_dedent.dedent`
1062
+ You can fix these issues and rerun the command to reinstall. If you wish to roll back the installation, remove ${ADDON_NAME} from the "addons" array
1063
+ in your main Storybook config file and remove the dependency from your package.json file.
1095
1064
 
1096
- Do you want to migrate?
1097
- `,
1098
- initial: !0
1099
- })).migrateToNextjsVite && (await packageManager.addDependencies({ type: "devDependencies", skipInstall: !0 }, [
1100
- "@storybook/nextjs-vite"
1101
- ]), await packageManager.removeDependencies(["@storybook/nextjs"]), traverse(config._ast, {
1102
- StringLiteral(path) {
1103
- path.node.value === "@storybook/nextjs" && (path.node.value = "@storybook/nextjs-vite");
1104
- }
1105
- }), await writeConfig(config, mainJsPath), info2.frameworkPackageName = "@storybook/nextjs-vite", info2.builderPackageName = "@storybook/builder-vite", await scanAndTransformFiles({
1106
- promptMessage: "Enter a glob to scan for all @storybook/nextjs imports to substitute with @storybook/nextjs-vite:",
1107
- force: options.yes,
1108
- dryRun: !1,
1109
- transformFn: (files, options2, dryRun) => transformImportFiles(files, options2, dryRun),
1110
- transformOptions: {
1111
- "@storybook/nextjs": "@storybook/nextjs-vite"
1112
- }
1113
- }));
1114
- let annotationsImport = SUPPORTED_FRAMEWORKS.find(
1115
- (f) => nameMatches(info2.frameworkPackageName, f)
1116
- ) ? info2.frameworkPackageName === "@storybook/nextjs" ? "@storybook/nextjs-vite" : info2.frameworkPackageName : null, isRendererSupported = !!annotationsImport, result = await (async () => {
1117
- let reasons = [];
1118
- hasCustomWebpackConfig && reasons.push("\u2022 The addon can not be used with a custom Webpack configuration."), !nameMatches(info2.frameworkPackageName, "@storybook/nextjs") && !nameMatches(info2.builderPackageName, "@storybook/builder-vite") && reasons.push(
1119
- "\u2022 The addon can only be used with a Vite-based Storybook framework or Next.js."
1120
- ), isRendererSupported || reasons.push(dedent`
1121
- • The addon cannot yet be used with ${info2.frameworkPackageName}
1122
- `), coercedVitestVersion && !(0, import_semver.satisfies)(coercedVitestVersion, ">=3.0.0") && reasons.push(dedent`
1123
- • The addon requires Vitest 3.0.0 or higher. You are currently using ${vitestVersionSpecifier}.
1124
- Please update all of your Vitest dependencies and try again.
1125
- `);
1126
- let mswVersionSpecifier = await packageManager.getInstalledVersion("msw"), coercedMswVersion = mswVersionSpecifier ? (0, import_semver.coerce)(mswVersionSpecifier) : null;
1127
- return coercedMswVersion && !(0, import_semver.satisfies)(coercedMswVersion, ">=2.0.0") && reasons.push(dedent`
1128
- • The addon uses Vitest behind the scenes, which supports only version 2 and above of MSW. However, we have detected version ${coercedMswVersion.version} in this project.
1129
- Please update the 'msw' package and try again.
1130
- `), nameMatches(info2.frameworkPackageName, "@storybook/nextjs") && (await packageManager.getInstalledVersion("next") || reasons.push(dedent`
1131
- • You are using @storybook/nextjs without having "next" installed.
1132
- Please install "next" or use a different Storybook framework integration and try again.
1133
- `)), reasons.length > 0 ? (reasons.unshift(
1134
- "@storybook/addon-vitest's automated setup failed due to the following package incompatibilities:"
1135
- ), reasons.push("--------------------------------"), reasons.push(
1136
- dedent`
1137
- You can fix these issues and rerun the command to reinstall. If you wish to roll back the installation, remove ${ADDON_NAME} from the "addons" array
1138
- in your main Storybook config file and remove the dependency from your package.json file.
1139
- `
1140
- ), isRendererSupported ? reasons.push(
1141
- dedent`
1142
- Fear not, however, you can follow the manual installation process instead at:
1143
- https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
1144
- `
1145
- ) : reasons.push(
1146
- dedent`
1147
- Please check the documentation for more information about its requirements and installation:
1148
- https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}
1149
- `
1150
- ), reasons.map((r) => r.trim()).join(`
1065
+ Please check the documentation for more information about its requirements and installation:
1066
+ https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}
1067
+ `
1068
+ ), result = reasons.map((r) => r.trim()).join(`
1151
1069
 
1152
- `)) : null;
1153
- })();
1154
- if (result) {
1155
- logErrors("\u26D4\uFE0F Sorry!", result), logger2.line(1);
1156
- return;
1070
+ `);
1157
1071
  }
1158
- if (info2.frameworkPackageName === "@storybook/nextjs") {
1159
- printInfo(
1160
- "\u{1F37F} Just so you know...",
1161
- dedent`
1162
- It looks like you're using Next.js.
1163
-
1164
- Adding "@storybook/nextjs-vite/vite-plugin" so you can use it with Vitest.
1072
+ if (result)
1073
+ throw logger.error(result), new AddonVitestPostinstallPrerequisiteCheckError({
1074
+ reasons: compatibilityResult.reasons
1075
+ });
1076
+ if (!options.skipDependencyManagement) {
1077
+ let versionedDependencies = await addonVitestService.collectDependencies(packageManager);
1078
+ info.framework === SupportedFramework.NEXTJS && packageManager.getAllDependencies()["@storybook/nextjs-vite"];
1079
+ let v8Version = await packageManager.getInstalledVersion("@vitest/coverage-v8"), istanbulVersion = await packageManager.getInstalledVersion("@vitest/coverage-istanbul");
1080
+ !v8Version && !istanbulVersion && logger.step(
1081
+ import_ts_dedent.dedent`
1082
+ You don't seem to have a coverage reporter installed. Vitest needs either V8 or Istanbul to generate coverage reports.
1165
1083
 
1166
- More info about the plugin at https://github.com/storybookjs/vite-plugin-storybook-nextjs
1167
- `
1168
- );
1169
- try {
1170
- let storybookVersion = await packageManager.getInstalledVersion("storybook");
1171
- uniqueDependencies.push(`@storybook/nextjs-vite@^${storybookVersion}`);
1172
- } catch {
1173
- console.error("Failed to install @storybook/nextjs-vite. Please install it manually");
1174
- }
1084
+ Adding "@vitest/coverage-v8" to enable coverage reporting.
1085
+ Read more about Vitest coverage providers at https://vitest.dev/guide/coverage.html#coverage-providers
1086
+ `
1087
+ ), versionedDependencies.length > 0 && (logger.step("Adding dependencies to your package.json"), logger.log(" " + versionedDependencies.join(", ")), await packageManager.addDependencies(
1088
+ { type: "devDependencies", skipInstall: !0 },
1089
+ versionedDependencies
1090
+ )), options.skipInstall || await packageManager.installDependencies();
1175
1091
  }
1176
- let v8Version = await packageManager.getInstalledVersion("@vitest/coverage-v8"), istanbulVersion = await packageManager.getInstalledVersion("@vitest/coverage-istanbul");
1177
- !v8Version && !istanbulVersion && (printInfo(
1178
- "\u{1F648} Let me cover this for you",
1179
- dedent`
1180
- You don't seem to have a coverage reporter installed. Vitest needs either V8 or Istanbul to generate coverage reports.
1181
-
1182
- Adding "@vitest/coverage-v8" to enable coverage reporting.
1183
- Read more about Vitest coverage providers at https://vitest.dev/guide/coverage.html#coverage-providers
1184
- `
1185
- ), uniqueDependencies.push("@vitest/coverage-v8"));
1186
- let versionedDependencies = uniqueDependencies.map((p) => p.includes("vitest") && vitestVersionSpecifier ? `${p}@${vitestVersionSpecifier}` : p);
1187
- if (versionedDependencies.length > 0 && (await packageManager.addDependencies(
1188
- { type: "devDependencies", skipInstall: !0 },
1189
- versionedDependencies
1190
- ), logger2.line(1), logger2.plain(`${step} Installing dependencies:`), logger2.plain(" " + versionedDependencies.join(", "))), await packageManager.installDependencies(), logger2.line(1), options.skipInstall)
1191
- logger2.plain("Skipping Playwright installation, please run this command manually:"), logger2.plain(" npx playwright install chromium --with-deps");
1192
- else {
1193
- logger2.plain(`${step} Configuring Playwright with Chromium (this might take some time):`), logger2.plain(" npx playwright install chromium --with-deps");
1194
- try {
1195
- await packageManager.executeCommand({
1196
- command: "npx",
1197
- args: ["playwright", "install", "chromium", "--with-deps"]
1198
- });
1199
- } catch {
1200
- console.error("Failed to install Playwright. Please install it manually");
1092
+ if (!options.skipDependencyManagement)
1093
+ if (options.skipInstall)
1094
+ logger.warn(import_ts_dedent.dedent`
1095
+ Playwright browser binaries installation skipped. Please run the following command manually later:
1096
+ ${CLI_COLORS.cta("npx playwright install chromium --with-deps")}
1097
+ `);
1098
+ else {
1099
+ let { errors: playwrightErrors } = await addonVitestService.installPlaywright(
1100
+ packageManager,
1101
+ {
1102
+ yes: options.yes
1103
+ }
1104
+ );
1105
+ errors.push(...playwrightErrors);
1201
1106
  }
1202
- }
1203
1107
  let fileExtension = allDeps.typescript || findFile("tsconfig", [...EXTENSIONS, ".json"]) ? "ts" : "js", vitestSetupFile = resolve(options.configDir, `vitest.setup.${fileExtension}`);
1204
1108
  if (existsSync(vitestSetupFile)) {
1205
- logErrors(
1206
- "\u{1F6A8} Oh no!",
1207
- dedent`
1208
- Found an existing Vitest setup file:
1209
- ${vitestSetupFile}
1210
-
1211
- Please refer to the documentation to complete the setup manually:
1212
- https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
1213
- `
1214
- ), logger2.line(1);
1215
- return;
1216
- }
1217
- logger2.line(1), logger2.plain(`${step} Creating a Vitest setup file for Storybook:`), logger2.plain(` ${vitestSetupFile}`);
1218
- let previewExists = EXTENSIONS.map((ext) => resolve(options.configDir, `preview${ext}`)).some(
1219
- existsSync
1220
- ), imports = [`import { setProjectAnnotations } from '${annotationsImport}';`], projectAnnotations = [];
1221
- previewExists && (imports.push("import * as projectAnnotations from './preview';"), projectAnnotations.push("projectAnnotations")), await writeFile(
1222
- vitestSetupFile,
1223
- dedent`
1109
+ let errorMessage = import_ts_dedent.dedent`
1110
+ Found an existing Vitest setup file:
1111
+ ${vitestSetupFile}
1112
+ Please refer to the documentation to complete the setup manually:
1113
+ https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
1114
+ `;
1115
+ logger.line(), logger.error(`${errorMessage}
1116
+ `), errors.push("Found existing Vitest setup file");
1117
+ } else {
1118
+ logger.step("Creating a Vitest setup file for Storybook:"), logger.log(`${vitestSetupFile}
1119
+ `);
1120
+ let previewExists = EXTENSIONS.map((ext) => resolve(options.configDir, `preview${ext}`)).some(
1121
+ existsSync
1122
+ ), imports = [`import { setProjectAnnotations } from '${info.frameworkPackage}';`], projectAnnotations = [];
1123
+ previewExists && (imports.push("import * as projectAnnotations from './preview';"), projectAnnotations.push("projectAnnotations")), await writeFile(
1124
+ vitestSetupFile,
1125
+ import_ts_dedent.dedent`
1224
1126
  ${imports.join(`
1225
1127
  `)}
1226
1128
 
@@ -1228,7 +1130,8 @@ async function postInstall(options) {
1228
1130
  // More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations
1229
1131
  setProjectAnnotations([${projectAnnotations.join(", ")}]);
1230
1132
  `
1231
- );
1133
+ );
1134
+ }
1232
1135
  let vitestWorkspaceFile = findFile("vitest.workspace", [".ts", ".js", ".json"]), viteConfigFile = findFile("vite.config"), vitestConfigFile = findFile("vitest.config"), vitestShimFile = findFile("vitest.shims.d"), rootConfig = vitestConfigFile || viteConfigFile;
1233
1136
  fileExtension === "ts" && !vitestShimFile && await writeFile(
1234
1137
  "vitest.shims.d.ts",
@@ -1243,13 +1146,12 @@ async function postInstall(options) {
1243
1146
  }).then((t) => t.replace(`
1244
1147
  'ROOT_CONFIG',`, "").replace(/\s+extends: '',/, "")), workspaceFile = await fs2.readFile(vitestWorkspaceFile, "utf8"), source = babelParse(workspaceTemplate), target = babelParse(workspaceFile);
1245
1148
  if (updateWorkspaceFile(source, target)) {
1246
- logger2.line(1), logger2.plain(`${step} Updating your Vitest workspace file:`), logger2.plain(` ${vitestWorkspaceFile}`);
1149
+ logger.step("Updating your Vitest workspace file..."), logger.log(`${vitestWorkspaceFile}`);
1247
1150
  let formattedContent = await formatFileContent(vitestWorkspaceFile, generate(target).code);
1248
1151
  await writeFile(vitestWorkspaceFile, formattedContent);
1249
- } else {
1250
- logErrors(
1251
- "\u{1F6A8} Oh no!",
1252
- dedent`
1152
+ } else
1153
+ logger.error(
1154
+ import_ts_dedent.dedent`
1253
1155
  Could not update existing Vitest workspace file:
1254
1156
  ${vitestWorkspaceFile}
1255
1157
 
@@ -1259,9 +1161,7 @@ async function postInstall(options) {
1259
1161
  Please refer to the documentation to complete the setup manually:
1260
1162
  https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
1261
1163
  `
1262
- ), logger2.line(1);
1263
- return;
1264
- }
1164
+ ), errors.push("Unable to update existing Vitest workspace file");
1265
1165
  } else if (rootConfig) {
1266
1166
  let target, updated, configFile = await fs2.readFile(rootConfig, "utf8"), configFileHasTypeReference = configFile.match(
1267
1167
  /\/\/\/\s*<reference\s+types=["']vitest\/config["']\s*\/>/
@@ -1274,7 +1174,7 @@ async function postInstall(options) {
1274
1174
  target = babelParse(configFile), updated = updateConfigFile(source, target);
1275
1175
  }
1276
1176
  if (target && updated) {
1277
- logger2.line(1), logger2.plain(`${step} Updating your ${vitestConfigFile ? "Vitest" : "Vite"} config file:`), logger2.plain(` ${rootConfig}`);
1177
+ logger.step(`Updating your ${vitestConfigFile ? "Vitest" : "Vite"} config file:`), logger.log(` ${rootConfig}`);
1278
1178
  let formattedContent = await formatFileContent(rootConfig, generate(target).code);
1279
1179
  await writeFile(
1280
1180
  rootConfig,
@@ -1282,108 +1182,70 @@ async function postInstall(options) {
1282
1182
  ` + formattedContent : formattedContent
1283
1183
  );
1284
1184
  } else
1285
- logErrors(
1286
- "\u{1F6A8} Oh no!",
1287
- dedent`
1185
+ logger.error(import_ts_dedent.dedent`
1288
1186
  We were unable to update your existing ${vitestConfigFile ? "Vitest" : "Vite"} config file.
1289
1187
 
1290
1188
  Please refer to the documentation to complete the setup manually:
1291
1189
  https://storybook.js.org/docs/writing-tests/integrations/vitest-addon#manual-setup
1292
- `
1293
- );
1190
+ `), errors.push("Unable to update existing Vitest config file");
1294
1191
  } else {
1295
- let newConfigFile = resolve(`vitest.config.${fileExtension}`), configTemplate = await loadTemplate(getTemplateName(), {
1192
+ let parentDir = dirname(options.configDir), newConfigFile = resolve(parentDir, `vitest.config.${fileExtension}`), configTemplate = await loadTemplate(getTemplateName(), {
1296
1193
  CONFIG_DIR: options.configDir,
1297
1194
  SETUP_FILE: relative(dirname(newConfigFile), vitestSetupFile)
1298
1195
  });
1299
- logger2.line(1), logger2.plain(`${step} Creating a Vitest config file:`), logger2.plain(` ${newConfigFile}`);
1196
+ logger.step("Creating a Vitest config file:"), logger.log(`${newConfigFile}`);
1300
1197
  let formattedContent = await formatFileContent(newConfigFile, configTemplate);
1301
1198
  await writeFile(newConfigFile, formattedContent);
1302
1199
  }
1303
- if (info2.addons.find((addon) => addon.includes(addonA11yName)))
1200
+ if (info.addons.find((addon) => addon.includes(addonA11yName)))
1304
1201
  try {
1305
- logger2.plain(`${step} Setting up ${addonA11yName} for @storybook/addon-vitest:`), await execa(
1202
+ let command = [
1306
1203
  "storybook",
1307
- [
1308
- "automigrate",
1309
- "addon-a11y-addon-test",
1310
- "--loglevel",
1311
- "silent",
1312
- "--yes",
1313
- "--skip-doctor",
1314
- ...options.packageManager ? ["--package-manager", options.packageManager] : [],
1315
- ...options.skipInstall ? ["--skip-install"] : [],
1316
- ...options.configDir !== ".storybook" ? ["--config-dir", `"${options.configDir}"`] : []
1317
- ],
1204
+ "automigrate",
1205
+ "addon-a11y-addon-test",
1206
+ "--loglevel",
1207
+ "silent",
1208
+ "--yes",
1209
+ "--skip-doctor"
1210
+ ];
1211
+ options.packageManager && command.push("--package-manager", options.packageManager), options.skipInstall && command.push("--skip-install"), options.configDir !== ".storybook" && command.push("--config-dir", options.configDir), await prompt.executeTask(
1212
+ // TODO: Remove stdio: 'ignore' once we have a way to log the output of the command properly
1213
+ () => packageManager.runPackageCommand({ args: command, stdio: "ignore" }),
1318
1214
  {
1319
- stdio: "inherit"
1215
+ intro: "Setting up a11y addon for @storybook/addon-vitest",
1216
+ error: "Failed to setup a11y addon for @storybook/addon-vitest",
1217
+ success: "a11y addon setup successfully"
1320
1218
  }
1321
1219
  );
1322
1220
  } catch (e) {
1323
- logErrors(
1324
- "\u{1F6A8} Oh no!",
1325
- dedent`
1326
- We have detected that you have ${addonA11yName} installed but could not automatically set it up for @storybook/addon-vitest:
1327
-
1328
- ${e instanceof Error ? e.message : String(e)}
1329
-
1221
+ logger.error(import_ts_dedent.dedent`
1222
+ Could not automatically set up ${addonA11yName} for @storybook/addon-vitest.
1330
1223
  Please refer to the documentation to complete the setup manually:
1331
1224
  https://storybook.js.org/docs/writing-tests/accessibility-testing#test-addon-integration
1332
- `
1225
+ `), errors.push(
1226
+ "The @storybook/addon-a11y couldn't be set up for the Vitest addon" + (e instanceof Error ? e.stack : String(e))
1333
1227
  );
1334
1228
  }
1335
- hasErrors ? printWarning(
1336
- "\u26A0\uFE0F Done, but with errors!",
1337
- dedent`
1338
- @storybook/addon-vitest was installed successfully, but there were some errors during the setup process.
1339
-
1340
- Please refer to the documentation to complete the setup manually and check the errors above:
1341
- https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
1342
- `
1343
- ) : printSuccess(
1344
- "\u{1F389} All done!",
1345
- dedent`
1229
+ let runCommand = rootConfig ? "npx vitest --project=storybook" : "npx vitest";
1230
+ if (errors.length === 0)
1231
+ logger.step(CLI_COLORS.success("@storybook/addon-vitest setup completed successfully")), logger.log(import_ts_dedent.dedent`
1346
1232
  @storybook/addon-vitest is now configured and you're ready to run your tests!
1347
-
1348
1233
  Here are a couple of tips to get you started:
1349
- • You can run tests with "${rootConfig ? "npx vitest --project=storybook" : "npx vitest"}"
1350
- When using the Vitest extension in your editor, all of your stories will be shown as tests!
1351
-
1234
+
1235
+ You can run tests with "${CLI_COLORS.cta(runCommand)}"
1236
+ • Vitest IDE extension shows all stories as tests in your editor!
1237
+
1352
1238
  Check the documentation for more information about its features and options at:
1353
1239
  https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}
1240
+ `);
1241
+ else
1242
+ throw logger.warn(
1243
+ import_ts_dedent.dedent`
1244
+ Done, but with errors!
1245
+ @storybook/addon-vitest was installed successfully, but there were some errors during the setup process. Please refer to the documentation to complete the setup manually and check the errors above:
1246
+ https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
1354
1247
  `
1355
- ), logger2.line(1);
1356
- }
1357
- async function getPackageNameFromPath(input) {
1358
- let path = input.startsWith("file://") ? fileURLToPath(input) : input;
1359
- if (!isAbsolute(path))
1360
- return path;
1361
- let packageJsonPath = up2({ cwd: path });
1362
- if (!packageJsonPath)
1363
- throw new Error(`Could not find package.json in path: ${path}`);
1364
- let { default: packageJson } = await import(pathToFileURL(packageJsonPath).href, {
1365
- with: { type: "json" }
1366
- });
1367
- return packageJson.name;
1368
- }
1369
- async function getStorybookInfo({ configDir, packageManager: pkgMgr }) {
1370
- let packageManager = JsPackageManagerFactory.getPackageManager({ force: pkgMgr, configDir }), { packageJson } = packageManager.primaryPackageJson, config = await loadMainConfig({ configDir }), { presets } = await experimental_loadStorybook({
1371
- configDir,
1372
- packageJson
1373
- }), framework = await presets.apply("framework", {}), core = await presets.apply("core", {}), { builder, renderer } = core;
1374
- if (!builder)
1375
- throw new Error("Could not detect your Storybook builder.");
1376
- let frameworkPackageName = await getPackageNameFromPath(
1377
- typeof framework == "string" ? framework : framework.name
1378
- ), builderPackageName = await getPackageNameFromPath(
1379
- typeof builder == "string" ? builder : builder.name
1380
- ), rendererPackageName;
1381
- return renderer && (rendererPackageName = await getPackageNameFromPath(renderer)), {
1382
- frameworkPackageName,
1383
- builderPackageName,
1384
- rendererPackageName,
1385
- addons: getAddonNames(config)
1386
- };
1248
+ ), new AddonVitestPostinstallError({ errors });
1387
1249
  }
1388
1250
  export {
1389
1251
  postInstall as default