@storybook/addon-vitest 0.0.0-pr-32810-sha-b3901628 → 0.0.0-pr-32717-sha-6b32df73
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/_node-chunks/{chunk-LZCJ7HPK.js → chunk-7U3E5OTZ.js} +7 -7
- package/dist/_node-chunks/chunk-C3FRTXFF.js +348 -0
- package/dist/_node-chunks/{chunk-6MS5DPHO.js → chunk-KIUHNMC3.js} +6 -18
- package/dist/_node-chunks/chunk-NC7DRZM4.js +60 -0
- package/dist/_node-chunks/{chunk-SQGILNIE.js → chunk-OQHY5QS2.js} +7 -7
- package/dist/_node-chunks/chunk-REWDQMPP.js +40 -0
- package/dist/_node-chunks/{chunk-UHNP62OV.js → chunk-RU4LPJPR.js} +6 -6
- package/dist/_node-chunks/{chunk-RYSV2QII.js → chunk-WKSVA3OK.js} +7 -7
- package/dist/manager.js +1 -1
- package/dist/node/coverage-reporter.js +8 -8
- package/dist/node/vitest.js +25 -14
- package/dist/postinstall.js +184 -412
- package/dist/preset.js +2239 -15
- package/dist/vitest-plugin/global-setup.js +7 -7
- package/dist/vitest-plugin/index.js +9 -9
- package/dist/vitest-plugin/setup-file.js +1 -1
- package/package.json +2 -4
- package/dist/_node-chunks/chunk-GYWWM3SC.js +0 -37
- package/dist/_node-chunks/chunk-H6JZJZLI.js +0 -98
- package/dist/_node-chunks/chunk-HLYWN43O.js +0 -2574
- /package/dist/_browser-chunks/{chunk-CAYLRBRX.js → chunk-RPDOPHZX.js} +0 -0
package/dist/postinstall.js
CHANGED
|
@@ -1,33 +1,29 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import CJS_COMPAT_NODE_URL_hwd9utotfy8 from 'node:url';
|
|
2
|
+
import CJS_COMPAT_NODE_PATH_hwd9utotfy8 from 'node:path';
|
|
3
|
+
import CJS_COMPAT_NODE_MODULE_hwd9utotfy8 from "node:module";
|
|
4
4
|
|
|
5
|
-
var __filename =
|
|
6
|
-
var __dirname =
|
|
7
|
-
var require =
|
|
5
|
+
var __filename = CJS_COMPAT_NODE_URL_hwd9utotfy8.fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = CJS_COMPAT_NODE_PATH_hwd9utotfy8.dirname(__filename);
|
|
7
|
+
var require = CJS_COMPAT_NODE_MODULE_hwd9utotfy8.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-
|
|
14
|
+
} from "./_node-chunks/chunk-C3FRTXFF.js";
|
|
16
15
|
import {
|
|
17
|
-
any
|
|
18
|
-
|
|
19
|
-
up
|
|
20
|
-
} from "./_node-chunks/chunk-H6JZJZLI.js";
|
|
16
|
+
any
|
|
17
|
+
} from "./_node-chunks/chunk-NC7DRZM4.js";
|
|
21
18
|
import {
|
|
22
|
-
DOCUMENTATION_LINK
|
|
23
|
-
|
|
24
|
-
} from "./_node-chunks/chunk-6MS5DPHO.js";
|
|
19
|
+
DOCUMENTATION_LINK
|
|
20
|
+
} from "./_node-chunks/chunk-KIUHNMC3.js";
|
|
25
21
|
import {
|
|
26
22
|
dirname,
|
|
27
23
|
join,
|
|
28
24
|
relative,
|
|
29
25
|
resolve
|
|
30
|
-
} from "./_node-chunks/chunk-
|
|
26
|
+
} from "./_node-chunks/chunk-7U3E5OTZ.js";
|
|
31
27
|
import {
|
|
32
28
|
require_compare,
|
|
33
29
|
require_constants,
|
|
@@ -37,12 +33,12 @@ import {
|
|
|
37
33
|
require_parse_options,
|
|
38
34
|
require_re,
|
|
39
35
|
require_semver
|
|
40
|
-
} from "./_node-chunks/chunk-
|
|
36
|
+
} from "./_node-chunks/chunk-OQHY5QS2.js";
|
|
41
37
|
import {
|
|
42
38
|
__commonJS,
|
|
43
39
|
__name,
|
|
44
40
|
__toESM
|
|
45
|
-
} from "./_node-chunks/chunk-
|
|
41
|
+
} from "./_node-chunks/chunk-RU4LPJPR.js";
|
|
46
42
|
|
|
47
43
|
// ../../node_modules/semver/functions/parse.js
|
|
48
44
|
var require_parse = __commonJS({
|
|
@@ -364,7 +360,7 @@ var require_coerce = __commonJS({
|
|
|
364
360
|
var SemVer = require_semver();
|
|
365
361
|
var parse = require_parse();
|
|
366
362
|
var { safeRe: re, t } = require_re();
|
|
367
|
-
var
|
|
363
|
+
var coerce = /* @__PURE__ */ __name((version, options) => {
|
|
368
364
|
if (version instanceof SemVer) {
|
|
369
365
|
return version;
|
|
370
366
|
}
|
|
@@ -399,7 +395,7 @@ var require_coerce = __commonJS({
|
|
|
399
395
|
const build = options.includePrerelease && match[6] ? `+${match[6]}` : "";
|
|
400
396
|
return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options);
|
|
401
397
|
}, "coerce");
|
|
402
|
-
module.exports =
|
|
398
|
+
module.exports = coerce;
|
|
403
399
|
}
|
|
404
400
|
});
|
|
405
401
|
|
|
@@ -972,7 +968,7 @@ var require_max_satisfying = __commonJS({
|
|
|
972
968
|
"use strict";
|
|
973
969
|
var SemVer = require_semver();
|
|
974
970
|
var Range = require_range();
|
|
975
|
-
var maxSatisfying = /* @__PURE__ */ __name((
|
|
971
|
+
var maxSatisfying = /* @__PURE__ */ __name((versions2, range, options) => {
|
|
976
972
|
let max = null;
|
|
977
973
|
let maxSV = null;
|
|
978
974
|
let rangeObj = null;
|
|
@@ -981,7 +977,7 @@ var require_max_satisfying = __commonJS({
|
|
|
981
977
|
} catch (er) {
|
|
982
978
|
return null;
|
|
983
979
|
}
|
|
984
|
-
|
|
980
|
+
versions2.forEach((v) => {
|
|
985
981
|
if (rangeObj.test(v)) {
|
|
986
982
|
if (!max || maxSV.compare(v) === -1) {
|
|
987
983
|
max = v;
|
|
@@ -1001,7 +997,7 @@ var require_min_satisfying = __commonJS({
|
|
|
1001
997
|
"use strict";
|
|
1002
998
|
var SemVer = require_semver();
|
|
1003
999
|
var Range = require_range();
|
|
1004
|
-
var minSatisfying = /* @__PURE__ */ __name((
|
|
1000
|
+
var minSatisfying = /* @__PURE__ */ __name((versions2, range, options) => {
|
|
1005
1001
|
let min = null;
|
|
1006
1002
|
let minSV = null;
|
|
1007
1003
|
let rangeObj = null;
|
|
@@ -1010,7 +1006,7 @@ var require_min_satisfying = __commonJS({
|
|
|
1010
1006
|
} catch (er) {
|
|
1011
1007
|
return null;
|
|
1012
1008
|
}
|
|
1013
|
-
|
|
1009
|
+
versions2.forEach((v) => {
|
|
1014
1010
|
if (rangeObj.test(v)) {
|
|
1015
1011
|
if (!min || minSV.compare(v) === 1) {
|
|
1016
1012
|
min = v;
|
|
@@ -1208,11 +1204,11 @@ var require_simplify = __commonJS({
|
|
|
1208
1204
|
"use strict";
|
|
1209
1205
|
var satisfies2 = require_satisfies();
|
|
1210
1206
|
var compare = require_compare();
|
|
1211
|
-
module.exports = (
|
|
1207
|
+
module.exports = (versions2, range, options) => {
|
|
1212
1208
|
const set = [];
|
|
1213
1209
|
let first = null;
|
|
1214
1210
|
let prev = null;
|
|
1215
|
-
const v =
|
|
1211
|
+
const v = versions2.sort((a, b) => compare(a, b, options));
|
|
1216
1212
|
for (const version of v) {
|
|
1217
1213
|
const included = satisfies2(version, range, options);
|
|
1218
1214
|
if (included) {
|
|
@@ -1444,7 +1440,7 @@ var require_semver2 = __commonJS({
|
|
|
1444
1440
|
var gte = require_gte();
|
|
1445
1441
|
var lte = require_lte();
|
|
1446
1442
|
var cmp = require_cmp();
|
|
1447
|
-
var
|
|
1443
|
+
var coerce = require_coerce();
|
|
1448
1444
|
var Comparator = require_comparator();
|
|
1449
1445
|
var Range = require_range();
|
|
1450
1446
|
var satisfies2 = require_satisfies();
|
|
@@ -1482,7 +1478,7 @@ var require_semver2 = __commonJS({
|
|
|
1482
1478
|
gte,
|
|
1483
1479
|
lte,
|
|
1484
1480
|
cmp,
|
|
1485
|
-
coerce
|
|
1481
|
+
coerce,
|
|
1486
1482
|
Comparator,
|
|
1487
1483
|
Range,
|
|
1488
1484
|
satisfies: satisfies2,
|
|
@@ -1513,56 +1509,24 @@ var require_semver2 = __commonJS({
|
|
|
1513
1509
|
import { existsSync } from "node:fs";
|
|
1514
1510
|
import * as fs2 from "node:fs/promises";
|
|
1515
1511
|
import { writeFile } from "node:fs/promises";
|
|
1516
|
-
import {
|
|
1517
|
-
import {
|
|
1518
|
-
import { babelParse, generate, traverse } from "storybook/internal/babel";
|
|
1512
|
+
import { babelParse, generate } from "storybook/internal/babel";
|
|
1513
|
+
import { AddonVitestService } from "storybook/internal/cli";
|
|
1519
1514
|
import {
|
|
1520
1515
|
JsPackageManagerFactory,
|
|
1521
1516
|
formatFileContent,
|
|
1522
|
-
getInterpretedFile,
|
|
1523
1517
|
getProjectRoot,
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
scanAndTransformFiles,
|
|
1527
|
-
transformImportFiles
|
|
1518
|
+
getStorybookInfo,
|
|
1519
|
+
versions
|
|
1528
1520
|
} from "storybook/internal/common";
|
|
1529
|
-
import {
|
|
1530
|
-
import {
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
return up("package.json", options);
|
|
1536
|
-
}
|
|
1537
|
-
__name(up2, "up");
|
|
1538
|
-
|
|
1539
|
-
// src/postinstall.ts
|
|
1521
|
+
import { CLI_COLORS } from "storybook/internal/node-logger";
|
|
1522
|
+
import {
|
|
1523
|
+
AddonVitestPostinstallError,
|
|
1524
|
+
AddonVitestPostinstallPrerequisiteCheckError
|
|
1525
|
+
} from "storybook/internal/server-errors";
|
|
1526
|
+
import { SupportedFramework } from "storybook/internal/types";
|
|
1540
1527
|
var import_semver = __toESM(require_semver2(), 1);
|
|
1541
|
-
import prompts from "prompts";
|
|
1542
1528
|
import { dedent } from "ts-dedent";
|
|
1543
1529
|
|
|
1544
|
-
// src/postinstall-logger.ts
|
|
1545
|
-
import { isCI } from "storybook/internal/common";
|
|
1546
|
-
import { colors, logger } from "storybook/internal/node-logger";
|
|
1547
|
-
var fancy = process.platform !== "win32" || isCI() || process.env.TERM === "xterm-256color";
|
|
1548
|
-
var step = colors.gray("\u203A");
|
|
1549
|
-
var info = colors.blue(fancy ? "\u2139" : "i");
|
|
1550
|
-
var success = colors.green(fancy ? "\u2714" : "\u221A");
|
|
1551
|
-
var warning = colors.orange(fancy ? "\u26A0" : "\u203C");
|
|
1552
|
-
var error = colors.red(fancy ? "\u2716" : "\xD7");
|
|
1553
|
-
var baseOptions = {
|
|
1554
|
-
borderStyle: "round",
|
|
1555
|
-
padding: 1
|
|
1556
|
-
};
|
|
1557
|
-
var print = /* @__PURE__ */ __name((message, options) => {
|
|
1558
|
-
logger.line(1);
|
|
1559
|
-
logger.logBox(message, { ...baseOptions, ...options });
|
|
1560
|
-
}, "print");
|
|
1561
|
-
var printInfo = /* @__PURE__ */ __name((title, message, options) => print(message, { borderColor: "blue", title, ...options }), "printInfo");
|
|
1562
|
-
var printWarning = /* @__PURE__ */ __name((title, message, options) => print(message, { borderColor: "yellow", title, ...options }), "printWarning");
|
|
1563
|
-
var printError = /* @__PURE__ */ __name((title, message, options) => print(message, { borderColor: "red", title, ...options }), "printError");
|
|
1564
|
-
var printSuccess = /* @__PURE__ */ __name((title, message, options) => print(message, { borderColor: "green", title, ...options }), "printSuccess");
|
|
1565
|
-
|
|
1566
1530
|
// src/updateVitestFile.ts
|
|
1567
1531
|
import * as fs from "node:fs/promises";
|
|
1568
1532
|
var loadTemplate = /* @__PURE__ */ __name(async (name, replacements) => {
|
|
@@ -1771,274 +1735,133 @@ var updateWorkspaceFile = /* @__PURE__ */ __name((source, target) => {
|
|
|
1771
1735
|
var ADDON_NAME = "@storybook/addon-vitest";
|
|
1772
1736
|
var EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".cts", ".mts", ".cjs", ".mjs"];
|
|
1773
1737
|
var addonA11yName = "@storybook/addon-a11y";
|
|
1774
|
-
var hasErrors = false;
|
|
1775
|
-
function nameMatches(name, pattern) {
|
|
1776
|
-
if (name === pattern) {
|
|
1777
|
-
return true;
|
|
1778
|
-
}
|
|
1779
|
-
if (name.includes(`${pattern}${sep}`)) {
|
|
1780
|
-
return true;
|
|
1781
|
-
}
|
|
1782
|
-
if (name.includes(`${pattern}${posix.sep}`)) {
|
|
1783
|
-
return true;
|
|
1784
|
-
}
|
|
1785
|
-
return false;
|
|
1786
|
-
}
|
|
1787
|
-
__name(nameMatches, "nameMatches");
|
|
1788
|
-
var logErrors = /* @__PURE__ */ __name((...args) => {
|
|
1789
|
-
hasErrors = true;
|
|
1790
|
-
printError(...args);
|
|
1791
|
-
}, "logErrors");
|
|
1792
|
-
var findFile = /* @__PURE__ */ __name((basename, extensions = EXTENSIONS) => any(
|
|
1793
|
-
extensions.map((ext) => basename + ext),
|
|
1794
|
-
{ last: getProjectRoot() }
|
|
1795
|
-
), "findFile");
|
|
1796
1738
|
async function postInstall(options) {
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
dedent`
|
|
1800
|
-
I'm the installation helper for ${ADDON_NAME}
|
|
1801
|
-
|
|
1802
|
-
Hold on for a moment while I look at your project and get it set up...
|
|
1803
|
-
`
|
|
1804
|
-
);
|
|
1739
|
+
const errors = [];
|
|
1740
|
+
const { logger, prompt } = options;
|
|
1805
1741
|
const packageManager = JsPackageManagerFactory.getPackageManager({
|
|
1806
1742
|
force: options.packageManager
|
|
1807
1743
|
});
|
|
1744
|
+
const findFile = /* @__PURE__ */ __name((basename, extensions = EXTENSIONS) => any(
|
|
1745
|
+
extensions.map((ext) => basename + ext),
|
|
1746
|
+
{ last: getProjectRoot(), cwd: options.configDir }
|
|
1747
|
+
), "findFile");
|
|
1808
1748
|
const vitestVersionSpecifier = await packageManager.getInstalledVersion("vitest");
|
|
1809
|
-
const coercedVitestVersion = vitestVersionSpecifier ? (0, import_semver.coerce)(vitestVersionSpecifier) : null;
|
|
1810
1749
|
const isVitest3_2To4 = vitestVersionSpecifier ? (0, import_semver.satisfies)(vitestVersionSpecifier, ">=3.2.0 <4.0.0") : false;
|
|
1811
1750
|
const isVitest4OrNewer = vitestVersionSpecifier ? (0, import_semver.satisfies)(vitestVersionSpecifier, ">=4.0.0") : true;
|
|
1812
|
-
const
|
|
1751
|
+
const info = await getStorybookInfo(options.configDir);
|
|
1813
1752
|
const allDeps = packageManager.getAllDependencies();
|
|
1814
|
-
const
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1753
|
+
const addonVitestService = new AddonVitestService();
|
|
1754
|
+
const compatibilityResult = await addonVitestService.validateCompatibility({
|
|
1755
|
+
packageManager,
|
|
1756
|
+
framework: info.framework,
|
|
1757
|
+
builder: info.builder
|
|
1758
|
+
});
|
|
1759
|
+
let result = null;
|
|
1760
|
+
if (!compatibilityResult.compatible && compatibilityResult.reasons) {
|
|
1761
|
+
const reasons = compatibilityResult.reasons.map((r) => `\u2022 ${CLI_COLORS.error(r)}`);
|
|
1762
|
+
reasons.unshift(dedent`
|
|
1763
|
+
Automated setup failed
|
|
1764
|
+
We have found incompatibilities due to the following package incompatibilities:
|
|
1765
|
+
`);
|
|
1766
|
+
reasons.push(
|
|
1767
|
+
dedent`
|
|
1768
|
+
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
|
|
1769
|
+
in your main Storybook config file and remove the dependency from your package.json file.
|
|
1831
1770
|
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1771
|
+
Please check the documentation for more information about its requirements and installation:
|
|
1772
|
+
https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}
|
|
1773
|
+
`
|
|
1774
|
+
);
|
|
1775
|
+
result = reasons.map((r) => r.trim()).join("\n\n");
|
|
1776
|
+
}
|
|
1777
|
+
if (result) {
|
|
1778
|
+
logger.error(result);
|
|
1779
|
+
throw new AddonVitestPostinstallPrerequisiteCheckError({
|
|
1780
|
+
reasons: compatibilityResult.reasons
|
|
1835
1781
|
});
|
|
1836
|
-
if (out.migrateToNextjsVite) {
|
|
1837
|
-
await packageManager.addDependencies({ type: "devDependencies", skipInstall: true }, [
|
|
1838
|
-
"@storybook/nextjs-vite"
|
|
1839
|
-
]);
|
|
1840
|
-
await packageManager.removeDependencies(["@storybook/nextjs"]);
|
|
1841
|
-
traverse(config._ast, {
|
|
1842
|
-
StringLiteral(path) {
|
|
1843
|
-
if (path.node.value === "@storybook/nextjs") {
|
|
1844
|
-
path.node.value = "@storybook/nextjs-vite";
|
|
1845
|
-
}
|
|
1846
|
-
}
|
|
1847
|
-
});
|
|
1848
|
-
await writeConfig(config, mainJsPath);
|
|
1849
|
-
info2.frameworkPackageName = "@storybook/nextjs-vite";
|
|
1850
|
-
info2.builderPackageName = "@storybook/builder-vite";
|
|
1851
|
-
await scanAndTransformFiles({
|
|
1852
|
-
promptMessage: "Enter a glob to scan for all @storybook/nextjs imports to substitute with @storybook/nextjs-vite:",
|
|
1853
|
-
force: options.yes,
|
|
1854
|
-
dryRun: false,
|
|
1855
|
-
transformFn: /* @__PURE__ */ __name((files, options2, dryRun) => transformImportFiles(files, options2, dryRun), "transformFn"),
|
|
1856
|
-
transformOptions: {
|
|
1857
|
-
"@storybook/nextjs": "@storybook/nextjs-vite"
|
|
1858
|
-
}
|
|
1859
|
-
});
|
|
1860
|
-
}
|
|
1861
1782
|
}
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
const reasons = [];
|
|
1868
|
-
if (hasCustomWebpackConfig) {
|
|
1869
|
-
reasons.push("\u2022 The addon can not be used with a custom Webpack configuration.");
|
|
1870
|
-
}
|
|
1871
|
-
if (!nameMatches(info2.frameworkPackageName, "@storybook/nextjs") && !nameMatches(info2.builderPackageName, "@storybook/builder-vite")) {
|
|
1872
|
-
reasons.push(
|
|
1873
|
-
"\u2022 The addon can only be used with a Vite-based Storybook framework or Next.js."
|
|
1874
|
-
);
|
|
1875
|
-
}
|
|
1876
|
-
if (!isRendererSupported) {
|
|
1877
|
-
reasons.push(dedent`
|
|
1878
|
-
• The addon cannot yet be used with ${info2.frameworkPackageName}
|
|
1879
|
-
`);
|
|
1880
|
-
}
|
|
1881
|
-
if (coercedVitestVersion && !(0, import_semver.satisfies)(coercedVitestVersion, ">=3.0.0")) {
|
|
1882
|
-
reasons.push(dedent`
|
|
1883
|
-
• The addon requires Vitest 3.0.0 or higher. You are currently using ${vitestVersionSpecifier}.
|
|
1884
|
-
Please update all of your Vitest dependencies and try again.
|
|
1885
|
-
`);
|
|
1886
|
-
}
|
|
1887
|
-
const mswVersionSpecifier = await packageManager.getInstalledVersion("msw");
|
|
1888
|
-
const coercedMswVersion = mswVersionSpecifier ? (0, import_semver.coerce)(mswVersionSpecifier) : null;
|
|
1889
|
-
if (coercedMswVersion && !(0, import_semver.satisfies)(coercedMswVersion, ">=2.0.0")) {
|
|
1890
|
-
reasons.push(dedent`
|
|
1891
|
-
• 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.
|
|
1892
|
-
Please update the 'msw' package and try again.
|
|
1893
|
-
`);
|
|
1894
|
-
}
|
|
1895
|
-
if (nameMatches(info2.frameworkPackageName, "@storybook/nextjs")) {
|
|
1896
|
-
const nextVersion = await packageManager.getInstalledVersion("next");
|
|
1897
|
-
if (!nextVersion) {
|
|
1898
|
-
reasons.push(dedent`
|
|
1899
|
-
• You are using @storybook/nextjs without having "next" installed.
|
|
1900
|
-
Please install "next" or use a different Storybook framework integration and try again.
|
|
1901
|
-
`);
|
|
1783
|
+
if (!options.skipDependencyManagement) {
|
|
1784
|
+
const versionedDependencies = await addonVitestService.collectDependencies(packageManager);
|
|
1785
|
+
if (info.framework === SupportedFramework.NEXTJS) {
|
|
1786
|
+
const allDeps2 = packageManager.getAllDependencies();
|
|
1787
|
+
if (!allDeps2["@storybook/nextjs-vite"]) {
|
|
1902
1788
|
}
|
|
1903
1789
|
}
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
reasons.push("--------------------------------");
|
|
1909
|
-
reasons.push(
|
|
1790
|
+
const v8Version = await packageManager.getInstalledVersion("@vitest/coverage-v8");
|
|
1791
|
+
const istanbulVersion = await packageManager.getInstalledVersion("@vitest/coverage-istanbul");
|
|
1792
|
+
if (!v8Version && !istanbulVersion) {
|
|
1793
|
+
logger.step(
|
|
1910
1794
|
dedent`
|
|
1911
|
-
You
|
|
1912
|
-
|
|
1795
|
+
You don't seem to have a coverage reporter installed. Vitest needs either V8 or Istanbul to generate coverage reports.
|
|
1796
|
+
|
|
1797
|
+
Adding "@vitest/coverage-v8" to enable coverage reporting.
|
|
1798
|
+
Read more about Vitest coverage providers at https://vitest.dev/guide/coverage.html#coverage-providers
|
|
1913
1799
|
`
|
|
1914
1800
|
);
|
|
1915
|
-
if (!isRendererSupported) {
|
|
1916
|
-
reasons.push(
|
|
1917
|
-
dedent`
|
|
1918
|
-
Please check the documentation for more information about its requirements and installation:
|
|
1919
|
-
https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}
|
|
1920
|
-
`
|
|
1921
|
-
);
|
|
1922
|
-
} else {
|
|
1923
|
-
reasons.push(
|
|
1924
|
-
dedent`
|
|
1925
|
-
Fear not, however, you can follow the manual installation process instead at:
|
|
1926
|
-
https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
|
|
1927
|
-
`
|
|
1928
|
-
);
|
|
1929
|
-
}
|
|
1930
|
-
return reasons.map((r) => r.trim()).join("\n\n");
|
|
1931
1801
|
}
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
}
|
|
1940
|
-
if (info2.frameworkPackageName === "@storybook/nextjs") {
|
|
1941
|
-
printInfo(
|
|
1942
|
-
"\u{1F37F} Just so you know...",
|
|
1943
|
-
dedent`
|
|
1944
|
-
It looks like you're using Next.js.
|
|
1945
|
-
|
|
1946
|
-
Adding "@storybook/nextjs-vite/vite-plugin" so you can use it with Vitest.
|
|
1947
|
-
|
|
1948
|
-
More info about the plugin at https://github.com/storybookjs/vite-plugin-storybook-nextjs
|
|
1949
|
-
`
|
|
1950
|
-
);
|
|
1951
|
-
try {
|
|
1952
|
-
const storybookVersion = await packageManager.getInstalledVersion("storybook");
|
|
1953
|
-
uniqueDependencies.push(`@storybook/nextjs-vite@^${storybookVersion}`);
|
|
1954
|
-
} catch (e) {
|
|
1955
|
-
console.error("Failed to install @storybook/nextjs-vite. Please install it manually");
|
|
1802
|
+
if (versionedDependencies.length > 0) {
|
|
1803
|
+
logger.step("Adding dependencies to your package.json");
|
|
1804
|
+
logger.log(" " + versionedDependencies.join(", "));
|
|
1805
|
+
await packageManager.addDependencies(
|
|
1806
|
+
{ type: "devDependencies", skipInstall: true },
|
|
1807
|
+
versionedDependencies
|
|
1808
|
+
);
|
|
1956
1809
|
}
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
const istanbulVersion = await packageManager.getInstalledVersion("@vitest/coverage-istanbul");
|
|
1960
|
-
if (!v8Version && !istanbulVersion) {
|
|
1961
|
-
printInfo(
|
|
1962
|
-
"\u{1F648} Let me cover this for you",
|
|
1963
|
-
dedent`
|
|
1964
|
-
You don't seem to have a coverage reporter installed. Vitest needs either V8 or Istanbul to generate coverage reports.
|
|
1965
|
-
|
|
1966
|
-
Adding "@vitest/coverage-v8" to enable coverage reporting.
|
|
1967
|
-
Read more about Vitest coverage providers at https://vitest.dev/guide/coverage.html#coverage-providers
|
|
1968
|
-
`
|
|
1969
|
-
);
|
|
1970
|
-
uniqueDependencies.push(`@vitest/coverage-v8`);
|
|
1971
|
-
}
|
|
1972
|
-
const versionedDependencies = uniqueDependencies.map((p) => {
|
|
1973
|
-
if (p.includes("vitest")) {
|
|
1974
|
-
return vitestVersionSpecifier ? `${p}@${vitestVersionSpecifier}` : p;
|
|
1810
|
+
if (!options.skipInstall) {
|
|
1811
|
+
await packageManager.installDependencies();
|
|
1975
1812
|
}
|
|
1976
|
-
return p;
|
|
1977
|
-
});
|
|
1978
|
-
if (versionedDependencies.length > 0) {
|
|
1979
|
-
await packageManager.addDependencies(
|
|
1980
|
-
{ type: "devDependencies", skipInstall: true },
|
|
1981
|
-
versionedDependencies
|
|
1982
|
-
);
|
|
1983
|
-
logger2.line(1);
|
|
1984
|
-
logger2.plain(`${step} Installing dependencies:`);
|
|
1985
|
-
logger2.plain(" " + versionedDependencies.join(", "));
|
|
1986
1813
|
}
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
logger2.plain(" npx playwright install chromium --with-deps");
|
|
1992
|
-
} else {
|
|
1993
|
-
logger2.plain(`${step} Configuring Playwright with Chromium (this might take some time):`);
|
|
1994
|
-
logger2.plain(" npx playwright install chromium --with-deps");
|
|
1995
|
-
try {
|
|
1996
|
-
await packageManager.executeCommand({
|
|
1997
|
-
command: "npx",
|
|
1998
|
-
args: ["playwright", "install", "chromium", "--with-deps"]
|
|
1814
|
+
if (!options.skipDependencyManagement) {
|
|
1815
|
+
if (!options.skipInstall) {
|
|
1816
|
+
const playwrightErrors = await addonVitestService.installPlaywright(packageManager, {
|
|
1817
|
+
yes: options.yes
|
|
1999
1818
|
});
|
|
2000
|
-
|
|
2001
|
-
|
|
1819
|
+
errors.push(...playwrightErrors);
|
|
1820
|
+
} else {
|
|
1821
|
+
logger.warn(dedent`
|
|
1822
|
+
Playwright browser binaries installation skipped. Please run the following command manually later:
|
|
1823
|
+
${CLI_COLORS.cta("npx playwright install chromium --with-deps")}
|
|
1824
|
+
`);
|
|
2002
1825
|
}
|
|
2003
1826
|
}
|
|
2004
1827
|
const fileExtension = allDeps.typescript || findFile("tsconfig", [...EXTENSIONS, ".json"]) ? "ts" : "js";
|
|
2005
1828
|
const vitestSetupFile = resolve(options.configDir, `vitest.setup.${fileExtension}`);
|
|
2006
1829
|
if (existsSync(vitestSetupFile)) {
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
1830
|
+
const errorMessage = dedent`
|
|
1831
|
+
Found an existing Vitest setup file:
|
|
1832
|
+
${vitestSetupFile}
|
|
1833
|
+
Please refer to the documentation to complete the setup manually:
|
|
1834
|
+
https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
|
|
1835
|
+
`;
|
|
1836
|
+
logger.line();
|
|
1837
|
+
logger.error(`${errorMessage}
|
|
1838
|
+
`);
|
|
1839
|
+
errors.push("Found existing Vitest setup file");
|
|
1840
|
+
} else {
|
|
1841
|
+
logger.step(`Creating a Vitest setup file for Storybook:`);
|
|
1842
|
+
logger.log(`${vitestSetupFile}
|
|
1843
|
+
`);
|
|
1844
|
+
const previewExists = EXTENSIONS.map((ext) => resolve(options.configDir, `preview${ext}`)).some(
|
|
1845
|
+
existsSync
|
|
2016
1846
|
);
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
const projectAnnotations = [];
|
|
2028
|
-
if (previewExists) {
|
|
2029
|
-
imports.push(`import * as projectAnnotations from './preview';`);
|
|
2030
|
-
projectAnnotations.push("projectAnnotations");
|
|
2031
|
-
}
|
|
2032
|
-
await writeFile(
|
|
2033
|
-
vitestSetupFile,
|
|
2034
|
-
dedent`
|
|
1847
|
+
const annotationsImport = info.frameworkPackage;
|
|
1848
|
+
const imports = [`import { setProjectAnnotations } from '${annotationsImport}';`];
|
|
1849
|
+
const projectAnnotations = [];
|
|
1850
|
+
if (previewExists) {
|
|
1851
|
+
imports.push(`import * as projectAnnotations from './preview';`);
|
|
1852
|
+
projectAnnotations.push("projectAnnotations");
|
|
1853
|
+
}
|
|
1854
|
+
await writeFile(
|
|
1855
|
+
vitestSetupFile,
|
|
1856
|
+
dedent`
|
|
2035
1857
|
${imports.join("\n")}
|
|
2036
1858
|
|
|
2037
1859
|
// This is an important step to apply the right configuration when testing your stories.
|
|
2038
1860
|
// More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations
|
|
2039
1861
|
setProjectAnnotations([${projectAnnotations.join(", ")}]);
|
|
2040
1862
|
`
|
|
2041
|
-
|
|
1863
|
+
);
|
|
1864
|
+
}
|
|
2042
1865
|
const vitestWorkspaceFile = findFile("vitest.workspace", [".ts", ".js", ".json"]);
|
|
2043
1866
|
const viteConfigFile = findFile("vite.config");
|
|
2044
1867
|
const vitestConfigFile = findFile("vitest.config");
|
|
@@ -2070,14 +1893,12 @@ async function postInstall(options) {
|
|
|
2070
1893
|
const target = babelParse(workspaceFile);
|
|
2071
1894
|
const updated = updateWorkspaceFile(source, target);
|
|
2072
1895
|
if (updated) {
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
logger2.plain(` ${vitestWorkspaceFile}`);
|
|
1896
|
+
logger.step(`Updating your Vitest workspace file...`);
|
|
1897
|
+
logger.log(`${vitestWorkspaceFile}`);
|
|
2076
1898
|
const formattedContent = await formatFileContent(vitestWorkspaceFile, generate(target).code);
|
|
2077
1899
|
await writeFile(vitestWorkspaceFile, formattedContent);
|
|
2078
1900
|
} else {
|
|
2079
|
-
|
|
2080
|
-
"\u{1F6A8} Oh no!",
|
|
1901
|
+
logger.error(
|
|
2081
1902
|
dedent`
|
|
2082
1903
|
Could not update existing Vitest workspace file:
|
|
2083
1904
|
${vitestWorkspaceFile}
|
|
@@ -2089,8 +1910,7 @@ async function postInstall(options) {
|
|
|
2089
1910
|
https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
|
|
2090
1911
|
`
|
|
2091
1912
|
);
|
|
2092
|
-
|
|
2093
|
-
return;
|
|
1913
|
+
errors.push("Unable to update existing Vitest workspace file");
|
|
2094
1914
|
}
|
|
2095
1915
|
} else if (rootConfig) {
|
|
2096
1916
|
let target, updated;
|
|
@@ -2109,9 +1929,8 @@ async function postInstall(options) {
|
|
|
2109
1929
|
updated = updateConfigFile(source, target);
|
|
2110
1930
|
}
|
|
2111
1931
|
if (target && updated) {
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
logger2.plain(` ${rootConfig}`);
|
|
1932
|
+
logger.step(`Updating your ${vitestConfigFile ? "Vitest" : "Vite"} config file:`);
|
|
1933
|
+
logger.log(` ${rootConfig}`);
|
|
2115
1934
|
const formattedContent = await formatFileContent(rootConfig, generate(target).code);
|
|
2116
1935
|
const shouldAddReference = !configFileHasTypeReference && !vitestConfigFile;
|
|
2117
1936
|
await writeFile(
|
|
@@ -2119,139 +1938,92 @@ async function postInstall(options) {
|
|
|
2119
1938
|
shouldAddReference ? '/// <reference types="vitest/config" />\n' + formattedContent : formattedContent
|
|
2120
1939
|
);
|
|
2121
1940
|
} else {
|
|
2122
|
-
|
|
2123
|
-
"\u{1F6A8} Oh no!",
|
|
2124
|
-
dedent`
|
|
1941
|
+
logger.error(dedent`
|
|
2125
1942
|
We were unable to update your existing ${vitestConfigFile ? "Vitest" : "Vite"} config file.
|
|
2126
1943
|
|
|
2127
1944
|
Please refer to the documentation to complete the setup manually:
|
|
2128
1945
|
https://storybook.js.org/docs/writing-tests/integrations/vitest-addon#manual-setup
|
|
2129
|
-
`
|
|
2130
|
-
);
|
|
1946
|
+
`);
|
|
1947
|
+
errors.push("Unable to update existing Vitest config file");
|
|
2131
1948
|
}
|
|
2132
1949
|
} else {
|
|
2133
|
-
const
|
|
1950
|
+
const parentDir = dirname(options.configDir);
|
|
1951
|
+
const newConfigFile = resolve(parentDir, `vitest.config.${fileExtension}`);
|
|
2134
1952
|
const configTemplate = await loadTemplate(getTemplateName(), {
|
|
2135
1953
|
CONFIG_DIR: options.configDir,
|
|
2136
1954
|
SETUP_FILE: relative(dirname(newConfigFile), vitestSetupFile)
|
|
2137
1955
|
});
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
logger2.plain(` ${newConfigFile}`);
|
|
1956
|
+
logger.step(`Creating a Vitest config file:`);
|
|
1957
|
+
logger.log(`${newConfigFile}`);
|
|
2141
1958
|
const formattedContent = await formatFileContent(newConfigFile, configTemplate);
|
|
2142
1959
|
await writeFile(newConfigFile, formattedContent);
|
|
2143
1960
|
}
|
|
2144
|
-
const a11yAddon =
|
|
1961
|
+
const a11yAddon = info.addons.find((addon) => addon.includes(addonA11yName));
|
|
2145
1962
|
if (a11yAddon) {
|
|
2146
1963
|
try {
|
|
2147
|
-
|
|
2148
|
-
|
|
1964
|
+
const command = ["automigrate", "addon-a11y-addon-test"];
|
|
1965
|
+
command.push("--loglevel", "silent");
|
|
1966
|
+
command.push("--yes", "--skip-doctor");
|
|
1967
|
+
if (options.packageManager) {
|
|
1968
|
+
command.push("--package-manager", options.packageManager);
|
|
1969
|
+
}
|
|
1970
|
+
if (options.skipInstall) {
|
|
1971
|
+
command.push("--skip-install");
|
|
1972
|
+
}
|
|
1973
|
+
if (options.configDir !== ".storybook") {
|
|
1974
|
+
command.push("--config-dir", `"${options.configDir}"`);
|
|
1975
|
+
}
|
|
1976
|
+
const remoteCommand = packageManager.getRemoteRunCommand(
|
|
2149
1977
|
"storybook",
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
"addon-a11y-addon-test",
|
|
2153
|
-
"--loglevel",
|
|
2154
|
-
"silent",
|
|
2155
|
-
"--yes",
|
|
2156
|
-
"--skip-doctor",
|
|
2157
|
-
...options.packageManager ? ["--package-manager", options.packageManager] : [],
|
|
2158
|
-
...options.skipInstall ? ["--skip-install"] : [],
|
|
2159
|
-
...options.configDir !== ".storybook" ? ["--config-dir", `"${options.configDir}"`] : []
|
|
2160
|
-
],
|
|
2161
|
-
{
|
|
2162
|
-
stdio: "inherit"
|
|
2163
|
-
}
|
|
1978
|
+
command,
|
|
1979
|
+
versions.storybook
|
|
2164
1980
|
);
|
|
1981
|
+
const [cmd, ...args] = remoteCommand.split(" ");
|
|
1982
|
+
await prompt.executeTask(() => packageManager.executeCommand({ command: cmd, args }), {
|
|
1983
|
+
id: "a11y-addon-setup",
|
|
1984
|
+
intro: "Setting up a11y addon for @storybook/addon-vitest",
|
|
1985
|
+
error: "Failed to setup a11y addon for @storybook/addon-vitest",
|
|
1986
|
+
success: "a11y addon setup successfully"
|
|
1987
|
+
});
|
|
2165
1988
|
} catch (e) {
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
${e instanceof Error ? e.message : String(e)}
|
|
2172
|
-
|
|
1989
|
+
console.log(e);
|
|
1990
|
+
logger.line();
|
|
1991
|
+
logger.error(dedent`
|
|
1992
|
+
Could not automatically set up ${addonA11yName} for @storybook/addon-vitest.
|
|
2173
1993
|
Please refer to the documentation to complete the setup manually:
|
|
2174
1994
|
https://storybook.js.org/docs/writing-tests/accessibility-testing#test-addon-integration
|
|
2175
|
-
`
|
|
1995
|
+
`);
|
|
1996
|
+
errors.push(
|
|
1997
|
+
"The @storybook/addon-a11y couldn't be set up for the Vitest addon" + (e instanceof Error ? e.stack : String(e))
|
|
2176
1998
|
);
|
|
2177
1999
|
}
|
|
2178
2000
|
}
|
|
2179
2001
|
const runCommand = rootConfig ? `npx vitest --project=storybook` : `npx vitest`;
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2002
|
+
logger.line();
|
|
2003
|
+
if (errors.length === 0) {
|
|
2004
|
+
logger.step(CLI_COLORS.success("All done!"));
|
|
2005
|
+
logger.log(dedent`
|
|
2184
2006
|
@storybook/addon-vitest is now configured and you're ready to run your tests!
|
|
2185
|
-
|
|
2186
2007
|
Here are a couple of tips to get you started:
|
|
2187
|
-
|
|
2188
|
-
•
|
|
2189
|
-
|
|
2008
|
+
|
|
2009
|
+
• You can run tests with "${CLI_COLORS.cta(runCommand)}"
|
|
2010
|
+
• Vitest IDE extension shows all stories as tests in your editor!
|
|
2011
|
+
|
|
2190
2012
|
Check the documentation for more information about its features and options at:
|
|
2191
2013
|
https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}
|
|
2192
|
-
`
|
|
2193
|
-
);
|
|
2014
|
+
`);
|
|
2194
2015
|
} else {
|
|
2195
|
-
|
|
2196
|
-
"\u26A0\uFE0F Done, but with errors!",
|
|
2016
|
+
logger.warn(
|
|
2197
2017
|
dedent`
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
Please refer to the documentation to complete the setup manually and check the errors above:
|
|
2018
|
+
Done, but with errors!
|
|
2019
|
+
@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:
|
|
2201
2020
|
https://storybook.js.org/docs/next/${DOCUMENTATION_LINK}#manual-setup
|
|
2202
2021
|
`
|
|
2203
2022
|
);
|
|
2023
|
+
throw new AddonVitestPostinstallError({ errors });
|
|
2204
2024
|
}
|
|
2205
|
-
logger2.line(1);
|
|
2206
2025
|
}
|
|
2207
2026
|
__name(postInstall, "postInstall");
|
|
2208
|
-
async function getPackageNameFromPath(input) {
|
|
2209
|
-
const path = input.startsWith("file://") ? fileURLToPath(input) : input;
|
|
2210
|
-
if (!isAbsolute(path)) {
|
|
2211
|
-
return path;
|
|
2212
|
-
}
|
|
2213
|
-
const packageJsonPath = up2({ cwd: path });
|
|
2214
|
-
if (!packageJsonPath) {
|
|
2215
|
-
throw new Error(`Could not find package.json in path: ${path}`);
|
|
2216
|
-
}
|
|
2217
|
-
const { default: packageJson } = await import(pathToFileURL(packageJsonPath).href, {
|
|
2218
|
-
with: { type: "json" }
|
|
2219
|
-
});
|
|
2220
|
-
return packageJson.name;
|
|
2221
|
-
}
|
|
2222
|
-
__name(getPackageNameFromPath, "getPackageNameFromPath");
|
|
2223
|
-
async function getStorybookInfo({ configDir, packageManager: pkgMgr }) {
|
|
2224
|
-
const packageManager = JsPackageManagerFactory.getPackageManager({ force: pkgMgr, configDir });
|
|
2225
|
-
const { packageJson } = packageManager.primaryPackageJson;
|
|
2226
|
-
const config = await loadMainConfig({ configDir });
|
|
2227
|
-
const { presets } = await experimental_loadStorybook({
|
|
2228
|
-
configDir,
|
|
2229
|
-
packageJson
|
|
2230
|
-
});
|
|
2231
|
-
const framework = await presets.apply("framework", {});
|
|
2232
|
-
const core = await presets.apply("core", {});
|
|
2233
|
-
const { builder, renderer } = core;
|
|
2234
|
-
if (!builder) {
|
|
2235
|
-
throw new Error("Could not detect your Storybook builder.");
|
|
2236
|
-
}
|
|
2237
|
-
const frameworkPackageName = await getPackageNameFromPath(
|
|
2238
|
-
typeof framework === "string" ? framework : framework.name
|
|
2239
|
-
);
|
|
2240
|
-
const builderPackageName = await getPackageNameFromPath(
|
|
2241
|
-
typeof builder === "string" ? builder : builder.name
|
|
2242
|
-
);
|
|
2243
|
-
let rendererPackageName;
|
|
2244
|
-
if (renderer) {
|
|
2245
|
-
rendererPackageName = await getPackageNameFromPath(renderer);
|
|
2246
|
-
}
|
|
2247
|
-
return {
|
|
2248
|
-
frameworkPackageName,
|
|
2249
|
-
builderPackageName,
|
|
2250
|
-
rendererPackageName,
|
|
2251
|
-
addons: getAddonNames(config)
|
|
2252
|
-
};
|
|
2253
|
-
}
|
|
2254
|
-
__name(getStorybookInfo, "getStorybookInfo");
|
|
2255
2027
|
export {
|
|
2256
2028
|
postInstall as default
|
|
2257
2029
|
};
|