@chromatic-com/vitest 0.0.0 → 0.12.8
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/bin/archive-storybook.cjs +210 -0
- package/dist/bin/build-archive-storybook.cjs +210 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.mjs +95 -0
- package/dist/plugin.d.ts +49 -0
- package/dist/plugin.mjs +789 -0
- package/dist/setupFile.mjs +109 -0
- package/dist/storybook-config/main.js +145 -0
- package/dist/storybook-config/manager.js +10 -0
- package/dist/storybook-config/preview.d.ts +278 -0
- package/dist/storybook-config/preview.mjs +81 -0
- package/package.json +79 -8
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/browser/setupFile.ts
|
|
5
|
+
import { beforeEach } from "vitest";
|
|
6
|
+
import { commands as commands3 } from "vitest/browser";
|
|
7
|
+
|
|
8
|
+
// src/browser/public/takeSnapshot.ts
|
|
9
|
+
import { assert } from "vitest";
|
|
10
|
+
import { commands } from "vitest/browser";
|
|
11
|
+
import { snapshot } from "@chromaui/rrweb-snapshot";
|
|
12
|
+
|
|
13
|
+
// src/browser/getCurrentTest.ts
|
|
14
|
+
import * as vitest from "vitest";
|
|
15
|
+
var hooks = vitest.TestRunner ? vitest.TestRunner : await import("vitest/suite");
|
|
16
|
+
function getCurrentTest() {
|
|
17
|
+
return hooks.getCurrentTest();
|
|
18
|
+
}
|
|
19
|
+
__name(getCurrentTest, "getCurrentTest");
|
|
20
|
+
|
|
21
|
+
// src/browser/public/takeSnapshot.ts
|
|
22
|
+
async function takeSnapshot(name) {
|
|
23
|
+
const test = getCurrentTest();
|
|
24
|
+
assert(test, "takeSnapshot() must be called within a test()");
|
|
25
|
+
test.meta.__chromatic_isTakeSnapshotCalled = true;
|
|
26
|
+
if (!test.meta.__chromatic_isRegistered) {
|
|
27
|
+
throw new Error("takeSnapshot() cannot be called in a test that is not registered for Chromatic plugin");
|
|
28
|
+
}
|
|
29
|
+
const domSnapshot = snapshot(document, {
|
|
30
|
+
recordCanvas: true
|
|
31
|
+
});
|
|
32
|
+
assert(domSnapshot, "Failed to capture DOM snapshot");
|
|
33
|
+
await replaceBlobUrls(domSnapshot);
|
|
34
|
+
await commands.__chromatic_uploadDOMSnapshot(test.id, domSnapshot, name);
|
|
35
|
+
}
|
|
36
|
+
__name(takeSnapshot, "takeSnapshot");
|
|
37
|
+
async function replaceBlobUrls(node) {
|
|
38
|
+
if (!("childNodes" in node)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await Promise.all(node.childNodes.map(async (childNode) => {
|
|
42
|
+
if ("tagName" in childNode && childNode.tagName === "img" && typeof childNode.attributes.src === "string" && childNode.attributes.src?.startsWith("blob:")) {
|
|
43
|
+
const base64Url = await toDataURL(childNode.attributes.src);
|
|
44
|
+
childNode.attributes.src = base64Url;
|
|
45
|
+
}
|
|
46
|
+
if ("childNodes" in childNode && childNode.childNodes?.length) {
|
|
47
|
+
await replaceBlobUrls(childNode);
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
__name(replaceBlobUrls, "replaceBlobUrls");
|
|
52
|
+
async function toDataURL(url) {
|
|
53
|
+
const blob = await fetch(url).then((res) => res.blob());
|
|
54
|
+
return new Promise((resolveFileRead, reject) => {
|
|
55
|
+
const reader = new FileReader();
|
|
56
|
+
reader.onloadend = () => resolveFileRead(reader.result?.toString() || "");
|
|
57
|
+
reader.onerror = reject;
|
|
58
|
+
reader.readAsDataURL(blob);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
__name(toDataURL, "toDataURL");
|
|
62
|
+
|
|
63
|
+
// src/browser/public/waitForIdleNetwork.ts
|
|
64
|
+
import { assert as assert2 } from "vitest";
|
|
65
|
+
import { commands as commands2 } from "vitest/browser";
|
|
66
|
+
async function waitForIdleNetwork(timeout) {
|
|
67
|
+
const test = getCurrentTest();
|
|
68
|
+
assert2(test, "waitForIdleNetwork() must be called within a test()");
|
|
69
|
+
assert2(test.meta.__chromatic_isRegistered, "Cannot call waitForIdleNetwork for a test that hasn't been registered with the Chromatic plugin");
|
|
70
|
+
return await commands2.__chromatic_waitForIdleNetwork(test.id, timeout);
|
|
71
|
+
}
|
|
72
|
+
__name(waitForIdleNetwork, "waitForIdleNetwork");
|
|
73
|
+
|
|
74
|
+
// src/browser/setupFile.ts
|
|
75
|
+
beforeEach(async ({ task }) => {
|
|
76
|
+
const options = await commands3.__chromatic_getOptions();
|
|
77
|
+
if (options.tags) {
|
|
78
|
+
const hasMatchingTag = task.tags?.some((tag) => options.tags?.includes(tag));
|
|
79
|
+
if (!hasMatchingTag) {
|
|
80
|
+
task.meta.__chromatic_isRegistered = false;
|
|
81
|
+
return cleanup;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
task.meta.__chromatic_isRegistered = true;
|
|
85
|
+
task.meta.__chromatic_isTakeSnapshotCalled = false;
|
|
86
|
+
task.meta.__chromatic_autoSnapshot ??= !options.disableAutoSnapshot;
|
|
87
|
+
await commands3.__chromatic_interceptFetch(task.id);
|
|
88
|
+
return /* @__PURE__ */ __name(async function afterEach() {
|
|
89
|
+
const { __chromatic_autoSnapshot: autoSnapshot, __chromatic_isTakeSnapshotCalled: isTakeSnapshotCalled } = task.meta;
|
|
90
|
+
if (!autoSnapshot && !isTakeSnapshotCalled) {
|
|
91
|
+
await commands3.__chromatic_stopWithoutSnapshots(task.id);
|
|
92
|
+
return cleanup();
|
|
93
|
+
}
|
|
94
|
+
if (options.resourceArchiveTimeout !== 0) {
|
|
95
|
+
await waitForIdleNetwork(options.resourceArchiveTimeout);
|
|
96
|
+
}
|
|
97
|
+
if (autoSnapshot) {
|
|
98
|
+
await takeSnapshot();
|
|
99
|
+
}
|
|
100
|
+
await commands3.__chromatic_writeTestResult(task.id);
|
|
101
|
+
return cleanup();
|
|
102
|
+
}, "afterEach");
|
|
103
|
+
function cleanup() {
|
|
104
|
+
task.meta.__chromatic_autoSnapshot = void 0;
|
|
105
|
+
task.meta.__chromatic_isTakeSnapshotCalled = void 0;
|
|
106
|
+
task.meta.__chromatic_isRegistered = void 0;
|
|
107
|
+
}
|
|
108
|
+
__name(cleanup, "cleanup");
|
|
109
|
+
});
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
|
|
31
|
+
// src/storybook-config/main.ts
|
|
32
|
+
var main_exports = {};
|
|
33
|
+
__export(main_exports, {
|
|
34
|
+
default: () => main_default
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(main_exports);
|
|
37
|
+
var import_path2 = __toESM(require("path"), 1);
|
|
38
|
+
|
|
39
|
+
// ../shared/dist/utils/filePaths.mjs
|
|
40
|
+
var import_fs = require("fs");
|
|
41
|
+
var import_promises = require("fs/promises");
|
|
42
|
+
var import_crypto = require("crypto");
|
|
43
|
+
var import_path = __toESM(require("path"), 1);
|
|
44
|
+
var v = Object.defineProperty;
|
|
45
|
+
var r = /* @__PURE__ */ __name((e, t) => v(e, "name", { value: t, configurable: true }), "r");
|
|
46
|
+
function L() {
|
|
47
|
+
return process.cwd();
|
|
48
|
+
}
|
|
49
|
+
__name(L, "L");
|
|
50
|
+
r(L, "rootDir");
|
|
51
|
+
function g() {
|
|
52
|
+
let { CHROMATIC_ARCHIVE_LOCATION: e } = process.env;
|
|
53
|
+
return e;
|
|
54
|
+
}
|
|
55
|
+
__name(g, "g");
|
|
56
|
+
r(g, "outputDirOverride");
|
|
57
|
+
function h(e) {
|
|
58
|
+
let t = g() || e;
|
|
59
|
+
return import_path.default.resolve(L(), t, "chromatic-archives");
|
|
60
|
+
}
|
|
61
|
+
__name(h, "h");
|
|
62
|
+
r(h, "archivesDir");
|
|
63
|
+
function k(e) {
|
|
64
|
+
return import_path.default.resolve(h(e), "archive");
|
|
65
|
+
}
|
|
66
|
+
__name(k, "k");
|
|
67
|
+
r(k, "assetsDir");
|
|
68
|
+
function J(e) {
|
|
69
|
+
let t = h(e);
|
|
70
|
+
if (!(0, import_fs.existsSync)(t))
|
|
71
|
+
throw new Error(`Chromatic archives directory cannot be found: ${t}
|
|
72
|
+
|
|
73
|
+
Please make sure that you have run your E2E tests, or have set the CHROMATIC_ARCHIVE_LOCATION env var if the output directory for the tests is not in the standard location.`);
|
|
74
|
+
}
|
|
75
|
+
__name(J, "J");
|
|
76
|
+
r(J, "checkArchivesDirExists");
|
|
77
|
+
function B(e) {
|
|
78
|
+
(0, import_fs.existsSync)(e) || (0, import_fs.mkdirSync)(e, { recursive: true });
|
|
79
|
+
}
|
|
80
|
+
__name(B, "B");
|
|
81
|
+
r(B, "ensureDir");
|
|
82
|
+
async function C(e, t) {
|
|
83
|
+
return B(import_path.default.dirname(e)), (0, import_promises.writeFile)(e, t, { mode: 511 });
|
|
84
|
+
}
|
|
85
|
+
__name(C, "C");
|
|
86
|
+
r(C, "outputFile");
|
|
87
|
+
async function M(e, t) {
|
|
88
|
+
return C(e, JSON.stringify(t));
|
|
89
|
+
}
|
|
90
|
+
__name(M, "M");
|
|
91
|
+
r(M, "outputJSONFile");
|
|
92
|
+
async function j(e) {
|
|
93
|
+
let t = await (0, import_promises.readFile)(e);
|
|
94
|
+
return JSON.parse(t.toString());
|
|
95
|
+
}
|
|
96
|
+
__name(j, "j");
|
|
97
|
+
r(j, "readJSONFile");
|
|
98
|
+
function w(e) {
|
|
99
|
+
return (0, import_crypto.createHash)("shake256", { outputLength: 2 }).update(e).digest("hex");
|
|
100
|
+
}
|
|
101
|
+
__name(w, "w");
|
|
102
|
+
r(w, "hash");
|
|
103
|
+
var D = 255;
|
|
104
|
+
function U(e, t = D) {
|
|
105
|
+
let n = new TextEncoder(), d = new TextDecoder(), a = e.split("/"), o = a.pop();
|
|
106
|
+
if (n.encode(o).byteLength <= t)
|
|
107
|
+
return e;
|
|
108
|
+
let i = w(o), [p, ...m] = o.split("."), l = n.encode(p), s = m.join("."), f = s.length === 0 ? 0 : n.encode(s).byteLength + 1, y = n.encode(i).byteLength + f, N = l.slice(0, t - y), x = [`${d.decode(N)}${i}`, s].filter(Boolean).join(".");
|
|
109
|
+
return [...a, x].join("/");
|
|
110
|
+
}
|
|
111
|
+
__name(U, "U");
|
|
112
|
+
r(U, "truncateFileName");
|
|
113
|
+
var $ = r((e) => {
|
|
114
|
+
let t;
|
|
115
|
+
try {
|
|
116
|
+
return t = new URL(e), t.hostname === "localhost" ? t.pathname + t.search + t.hash : e;
|
|
117
|
+
} catch {
|
|
118
|
+
return e;
|
|
119
|
+
}
|
|
120
|
+
}, "removeLocalhostFromBaseUrl");
|
|
121
|
+
|
|
122
|
+
// src/constants.ts
|
|
123
|
+
var DEFAULT_OUTPUT_DIR = process.cwd();
|
|
124
|
+
|
|
125
|
+
// src/storybook-config/main.ts
|
|
126
|
+
function getAbsolutePath(value) {
|
|
127
|
+
return import_path2.default.dirname(require.resolve(import_path2.default.join(value, "package.json")));
|
|
128
|
+
}
|
|
129
|
+
__name(getAbsolutePath, "getAbsolutePath");
|
|
130
|
+
var main_default = {
|
|
131
|
+
stories: [
|
|
132
|
+
import_path2.default.resolve(h(DEFAULT_OUTPUT_DIR), "*.stories.json")
|
|
133
|
+
],
|
|
134
|
+
addons: [
|
|
135
|
+
getAbsolutePath("@storybook/addon-essentials"),
|
|
136
|
+
"."
|
|
137
|
+
],
|
|
138
|
+
framework: {
|
|
139
|
+
name: getAbsolutePath("@storybook/server-webpack5"),
|
|
140
|
+
options: {}
|
|
141
|
+
},
|
|
142
|
+
staticDirs: [
|
|
143
|
+
import_path2.default.resolve(h(DEFAULT_OUTPUT_DIR), "archive")
|
|
144
|
+
]
|
|
145
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/storybook-config/shared/manager.ts
|
|
4
|
+
var import_manager_api = require("@storybook/manager-api");
|
|
5
|
+
import_manager_api.addons.setConfig({
|
|
6
|
+
sidebar: {
|
|
7
|
+
// this ensures we use folders at the root-level instead of categories
|
|
8
|
+
showRoots: false
|
|
9
|
+
}
|
|
10
|
+
});
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface SymbolConstructor {
|
|
3
|
+
readonly observable: symbol;
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
interface SBBaseType {
|
|
8
|
+
required?: boolean;
|
|
9
|
+
raw?: string;
|
|
10
|
+
}
|
|
11
|
+
type SBScalarType = SBBaseType & {
|
|
12
|
+
name: 'boolean' | 'string' | 'number' | 'function' | 'symbol';
|
|
13
|
+
};
|
|
14
|
+
type SBArrayType = SBBaseType & {
|
|
15
|
+
name: 'array';
|
|
16
|
+
value: SBType;
|
|
17
|
+
};
|
|
18
|
+
type SBObjectType = SBBaseType & {
|
|
19
|
+
name: 'object';
|
|
20
|
+
value: Record<string, SBType>;
|
|
21
|
+
};
|
|
22
|
+
type SBEnumType = SBBaseType & {
|
|
23
|
+
name: 'enum';
|
|
24
|
+
value: (string | number)[];
|
|
25
|
+
};
|
|
26
|
+
type SBIntersectionType = SBBaseType & {
|
|
27
|
+
name: 'intersection';
|
|
28
|
+
value: SBType[];
|
|
29
|
+
};
|
|
30
|
+
type SBUnionType = SBBaseType & {
|
|
31
|
+
name: 'union';
|
|
32
|
+
value: SBType[];
|
|
33
|
+
};
|
|
34
|
+
type SBOtherType = SBBaseType & {
|
|
35
|
+
name: 'other';
|
|
36
|
+
value: string;
|
|
37
|
+
};
|
|
38
|
+
type SBType = SBScalarType | SBEnumType | SBArrayType | SBObjectType | SBIntersectionType | SBUnionType | SBOtherType;
|
|
39
|
+
|
|
40
|
+
type StoryId = string;
|
|
41
|
+
type ComponentId = string;
|
|
42
|
+
type ComponentTitle = string;
|
|
43
|
+
type StoryName = string;
|
|
44
|
+
type Tag$1 = string;
|
|
45
|
+
interface StoryIdentifier {
|
|
46
|
+
componentId: ComponentId;
|
|
47
|
+
title: ComponentTitle;
|
|
48
|
+
/** @deprecated */
|
|
49
|
+
kind: ComponentTitle;
|
|
50
|
+
id: StoryId;
|
|
51
|
+
name: StoryName;
|
|
52
|
+
/** @deprecated */
|
|
53
|
+
story: StoryName;
|
|
54
|
+
tags: Tag$1[];
|
|
55
|
+
}
|
|
56
|
+
interface Parameters {
|
|
57
|
+
[name: string]: any;
|
|
58
|
+
}
|
|
59
|
+
type ControlType = 'object' | 'boolean' | 'check' | 'inline-check' | 'radio' | 'inline-radio' | 'select' | 'multi-select' | 'number' | 'range' | 'file' | 'color' | 'date' | 'text';
|
|
60
|
+
type ConditionalTest = {
|
|
61
|
+
truthy?: boolean;
|
|
62
|
+
} | {
|
|
63
|
+
exists: boolean;
|
|
64
|
+
} | {
|
|
65
|
+
eq: any;
|
|
66
|
+
} | {
|
|
67
|
+
neq: any;
|
|
68
|
+
};
|
|
69
|
+
type ConditionalValue = {
|
|
70
|
+
arg: string;
|
|
71
|
+
} | {
|
|
72
|
+
global: string;
|
|
73
|
+
};
|
|
74
|
+
type Conditional = ConditionalValue & ConditionalTest;
|
|
75
|
+
interface ControlBase {
|
|
76
|
+
[key: string]: any;
|
|
77
|
+
/**
|
|
78
|
+
* @see https://storybook.js.org/docs/api/arg-types#controltype
|
|
79
|
+
*/
|
|
80
|
+
type?: ControlType;
|
|
81
|
+
disable?: boolean;
|
|
82
|
+
}
|
|
83
|
+
type Control = ControlType | false | (ControlBase & (ControlBase | {
|
|
84
|
+
type: 'color';
|
|
85
|
+
/**
|
|
86
|
+
* @see https://storybook.js.org/docs/api/arg-types#controlpresetcolors
|
|
87
|
+
*/
|
|
88
|
+
presetColors?: string[];
|
|
89
|
+
} | {
|
|
90
|
+
type: 'file';
|
|
91
|
+
/**
|
|
92
|
+
* @see https://storybook.js.org/docs/api/arg-types#controlaccept
|
|
93
|
+
*/
|
|
94
|
+
accept?: string;
|
|
95
|
+
} | {
|
|
96
|
+
type: 'inline-check' | 'radio' | 'inline-radio' | 'select' | 'multi-select';
|
|
97
|
+
/**
|
|
98
|
+
* @see https://storybook.js.org/docs/api/arg-types#controllabels
|
|
99
|
+
*/
|
|
100
|
+
labels?: {
|
|
101
|
+
[options: string]: string;
|
|
102
|
+
};
|
|
103
|
+
} | {
|
|
104
|
+
type: 'number' | 'range';
|
|
105
|
+
/**
|
|
106
|
+
* @see https://storybook.js.org/docs/api/arg-types#controlmax
|
|
107
|
+
*/
|
|
108
|
+
max?: number;
|
|
109
|
+
/**
|
|
110
|
+
* @see https://storybook.js.org/docs/api/arg-types#controlmin
|
|
111
|
+
*/
|
|
112
|
+
min?: number;
|
|
113
|
+
/**
|
|
114
|
+
* @see https://storybook.js.org/docs/api/arg-types#controlstep
|
|
115
|
+
*/
|
|
116
|
+
step?: number;
|
|
117
|
+
}));
|
|
118
|
+
interface InputType {
|
|
119
|
+
/**
|
|
120
|
+
* @see https://storybook.js.org/docs/api/arg-types#control
|
|
121
|
+
*/
|
|
122
|
+
control?: Control;
|
|
123
|
+
/**
|
|
124
|
+
* @see https://storybook.js.org/docs/api/arg-types#description
|
|
125
|
+
*/
|
|
126
|
+
description?: string;
|
|
127
|
+
/**
|
|
128
|
+
* @see https://storybook.js.org/docs/api/arg-types#if
|
|
129
|
+
*/
|
|
130
|
+
if?: Conditional;
|
|
131
|
+
/**
|
|
132
|
+
* @see https://storybook.js.org/docs/api/arg-types#mapping
|
|
133
|
+
*/
|
|
134
|
+
mapping?: {
|
|
135
|
+
[key: string]: any;
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* @see https://storybook.js.org/docs/api/arg-types#name
|
|
139
|
+
*/
|
|
140
|
+
name?: string;
|
|
141
|
+
/**
|
|
142
|
+
* @see https://storybook.js.org/docs/api/arg-types#options
|
|
143
|
+
*/
|
|
144
|
+
options?: readonly any[];
|
|
145
|
+
/**
|
|
146
|
+
* @see https://storybook.js.org/docs/api/arg-types#table
|
|
147
|
+
*/
|
|
148
|
+
table?: {
|
|
149
|
+
[key: string]: unknown;
|
|
150
|
+
/**
|
|
151
|
+
* @see https://storybook.js.org/docs/api/arg-types#tablecategory
|
|
152
|
+
*/
|
|
153
|
+
category?: string;
|
|
154
|
+
/**
|
|
155
|
+
* @see https://storybook.js.org/docs/api/arg-types#tabledefaultvalue
|
|
156
|
+
*/
|
|
157
|
+
defaultValue?: {
|
|
158
|
+
summary?: string;
|
|
159
|
+
detail?: string;
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* @see https://storybook.js.org/docs/api/arg-types#tabledisable
|
|
163
|
+
*/
|
|
164
|
+
disable?: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* @see https://storybook.js.org/docs/api/arg-types#tablesubcategory
|
|
167
|
+
*/
|
|
168
|
+
subcategory?: string;
|
|
169
|
+
/**
|
|
170
|
+
* @see https://storybook.js.org/docs/api/arg-types#tabletype
|
|
171
|
+
*/
|
|
172
|
+
type?: {
|
|
173
|
+
summary?: string;
|
|
174
|
+
detail?: string;
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* @see https://storybook.js.org/docs/api/arg-types#type
|
|
179
|
+
*/
|
|
180
|
+
type?: SBType | SBScalarType['name'];
|
|
181
|
+
/**
|
|
182
|
+
* @see https://storybook.js.org/docs/api/arg-types#defaultvalue
|
|
183
|
+
*
|
|
184
|
+
* @deprecated Use `table.defaultValue.summary` instead.
|
|
185
|
+
*/
|
|
186
|
+
defaultValue?: any;
|
|
187
|
+
[key: string]: any;
|
|
188
|
+
}
|
|
189
|
+
interface StrictInputType extends InputType {
|
|
190
|
+
name: string;
|
|
191
|
+
type?: SBType;
|
|
192
|
+
}
|
|
193
|
+
interface Args {
|
|
194
|
+
[name: string]: any;
|
|
195
|
+
}
|
|
196
|
+
type StrictArgTypes<TArgs = Args> = {
|
|
197
|
+
[name in keyof TArgs]: StrictInputType;
|
|
198
|
+
};
|
|
199
|
+
interface Globals {
|
|
200
|
+
[name: string]: any;
|
|
201
|
+
}
|
|
202
|
+
type Renderer = {
|
|
203
|
+
/** What is the type of the `component` annotation in this renderer? */
|
|
204
|
+
component: unknown;
|
|
205
|
+
/** What does the story function return in this renderer? */
|
|
206
|
+
storyResult: unknown;
|
|
207
|
+
/** What type of element does this renderer render to? */
|
|
208
|
+
canvasElement: unknown;
|
|
209
|
+
T?: unknown;
|
|
210
|
+
};
|
|
211
|
+
interface StoryContextForEnhancers<TRenderer extends Renderer = Renderer, TArgs = Args> extends StoryIdentifier {
|
|
212
|
+
component?: (TRenderer & {
|
|
213
|
+
T: any;
|
|
214
|
+
})['component'];
|
|
215
|
+
subcomponents?: Record<string, (TRenderer & {
|
|
216
|
+
T: any;
|
|
217
|
+
})['component']>;
|
|
218
|
+
parameters: Parameters;
|
|
219
|
+
initialArgs: TArgs;
|
|
220
|
+
argTypes: StrictArgTypes<TArgs>;
|
|
221
|
+
}
|
|
222
|
+
interface StoryContextUpdate<TArgs = Args> {
|
|
223
|
+
args?: TArgs;
|
|
224
|
+
globals?: Globals;
|
|
225
|
+
[key: string]: any;
|
|
226
|
+
}
|
|
227
|
+
type ViewMode$1 = 'story' | 'docs';
|
|
228
|
+
interface StoryContextForLoaders<TRenderer extends Renderer = Renderer, TArgs = Args> extends StoryContextForEnhancers<TRenderer, TArgs>, Required<StoryContextUpdate<TArgs>> {
|
|
229
|
+
hooks: unknown;
|
|
230
|
+
viewMode: ViewMode$1;
|
|
231
|
+
originalStoryFn: StoryFn<TRenderer>;
|
|
232
|
+
}
|
|
233
|
+
interface StoryContext<TRenderer extends Renderer = Renderer, TArgs = Args> extends StoryContextForLoaders<TRenderer, TArgs> {
|
|
234
|
+
loaded: Record<string, any>;
|
|
235
|
+
abortSignal: AbortSignal;
|
|
236
|
+
canvasElement: TRenderer['canvasElement'];
|
|
237
|
+
}
|
|
238
|
+
type PartialStoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = (update?: StoryContextUpdate<Partial<TArgs>>) => TRenderer['storyResult'];
|
|
239
|
+
type LegacyStoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = (context: StoryContext<TRenderer, TArgs>) => TRenderer['storyResult'];
|
|
240
|
+
type ArgsStoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = (args: TArgs, context: StoryContext<TRenderer, TArgs>) => (TRenderer & {
|
|
241
|
+
T: TArgs;
|
|
242
|
+
})['storyResult'];
|
|
243
|
+
type StoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = LegacyStoryFn<TRenderer, TArgs> | ArgsStoryFn<TRenderer, TArgs>;
|
|
244
|
+
|
|
245
|
+
interface WebRenderer extends Renderer {
|
|
246
|
+
canvasElement: HTMLElement;
|
|
247
|
+
}
|
|
248
|
+
type MaybePromise<T> = Promise<T> | T;
|
|
249
|
+
type TeardownRenderToCanvas = () => MaybePromise<void>;
|
|
250
|
+
type RenderToCanvas<TRenderer extends Renderer> = (context: RenderContext<TRenderer>, element: TRenderer['canvasElement']) => MaybePromise<void | TeardownRenderToCanvas>;
|
|
251
|
+
declare type RenderContext<TRenderer extends Renderer = Renderer> = StoryIdentifier & {
|
|
252
|
+
showMain: () => void;
|
|
253
|
+
showError: (error: {
|
|
254
|
+
title: string;
|
|
255
|
+
description: string;
|
|
256
|
+
}) => void;
|
|
257
|
+
showException: (err: Error) => void;
|
|
258
|
+
forceRemount: boolean;
|
|
259
|
+
storyContext: StoryContext<TRenderer>;
|
|
260
|
+
storyFn: PartialStoryFn<TRenderer>;
|
|
261
|
+
unboundStoryFn: LegacyStoryFn<TRenderer>;
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
interface RRWebFramework extends WebRenderer {
|
|
265
|
+
component: undefined;
|
|
266
|
+
storyResult: Record<string, never>;
|
|
267
|
+
}
|
|
268
|
+
declare const _default: {
|
|
269
|
+
renderToCanvas: RenderToCanvas<RRWebFramework>;
|
|
270
|
+
parameters: {
|
|
271
|
+
server: {
|
|
272
|
+
url: string;
|
|
273
|
+
};
|
|
274
|
+
layout: string;
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
export { type RRWebFramework, _default as default };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// ../../node_modules/@rrweb/types/dist/types.js
|
|
5
|
+
var NodeType = /* @__PURE__ */ ((NodeType2) => {
|
|
6
|
+
NodeType2[NodeType2["Document"] = 0] = "Document";
|
|
7
|
+
NodeType2[NodeType2["DocumentType"] = 1] = "DocumentType";
|
|
8
|
+
NodeType2[NodeType2["Element"] = 2] = "Element";
|
|
9
|
+
NodeType2[NodeType2["Text"] = 3] = "Text";
|
|
10
|
+
NodeType2[NodeType2["CDATA"] = 4] = "CDATA";
|
|
11
|
+
NodeType2[NodeType2["Comment"] = 5] = "Comment";
|
|
12
|
+
return NodeType2;
|
|
13
|
+
})(NodeType || {});
|
|
14
|
+
|
|
15
|
+
// src/storybook-config/shared/preview.ts
|
|
16
|
+
import { rebuild } from "@chromaui/rrweb-snapshot";
|
|
17
|
+
var pageUrl = new URL(window.location.href);
|
|
18
|
+
pageUrl.pathname = "";
|
|
19
|
+
pageUrl.search = "";
|
|
20
|
+
var strippedUrl = pageUrl.toString().replace(/\/$/, "");
|
|
21
|
+
var findHtmlNode = /* @__PURE__ */ __name((node) => {
|
|
22
|
+
if (node.type === NodeType.Element && node.tagName === "html") {
|
|
23
|
+
return node;
|
|
24
|
+
}
|
|
25
|
+
if ("childNodes" in node) {
|
|
26
|
+
return node.childNodes.find((childNode) => {
|
|
27
|
+
return findHtmlNode(childNode);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return void 0;
|
|
31
|
+
}, "findHtmlNode");
|
|
32
|
+
function snapshotFileName(snapshotId, viewport) {
|
|
33
|
+
const fileNameParts = [
|
|
34
|
+
snapshotId,
|
|
35
|
+
viewport,
|
|
36
|
+
"snapshot.json"
|
|
37
|
+
];
|
|
38
|
+
return fileNameParts.join(".");
|
|
39
|
+
}
|
|
40
|
+
__name(snapshotFileName, "snapshotFileName");
|
|
41
|
+
async function fetchSnapshot(context) {
|
|
42
|
+
const { url, id } = context.storyContext.parameters.server;
|
|
43
|
+
const { viewport } = context.storyContext.globals;
|
|
44
|
+
let viewportName;
|
|
45
|
+
if (typeof viewport === "string") {
|
|
46
|
+
viewportName = viewport;
|
|
47
|
+
} else {
|
|
48
|
+
viewportName = `w${viewport.width}h${viewport.height}`;
|
|
49
|
+
}
|
|
50
|
+
let response = await fetch(`${url}/${snapshotFileName(id, viewportName)}`);
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const { defaultViewport } = context.storyContext.parameters.viewport;
|
|
53
|
+
response = await fetch(`${url}/${snapshotFileName(id, defaultViewport)}`);
|
|
54
|
+
}
|
|
55
|
+
return response.json();
|
|
56
|
+
}
|
|
57
|
+
__name(fetchSnapshot, "fetchSnapshot");
|
|
58
|
+
var renderToCanvas = /* @__PURE__ */ __name(async (context, element) => {
|
|
59
|
+
const snapshot = await fetchSnapshot(context);
|
|
60
|
+
const htmlNode = findHtmlNode(snapshot);
|
|
61
|
+
const html = await rebuild(htmlNode, {
|
|
62
|
+
doc: document
|
|
63
|
+
});
|
|
64
|
+
document.replaceChild(html, document.children[0]);
|
|
65
|
+
document.head.innerHTML += '<script id="storybook-root"><\/script><script id="storybook-docs"><\/script>';
|
|
66
|
+
context.showMain();
|
|
67
|
+
return () => {
|
|
68
|
+
};
|
|
69
|
+
}, "renderToCanvas");
|
|
70
|
+
var preview_default = {
|
|
71
|
+
renderToCanvas,
|
|
72
|
+
parameters: {
|
|
73
|
+
server: {
|
|
74
|
+
url: strippedUrl
|
|
75
|
+
},
|
|
76
|
+
layout: "fullscreen"
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
export {
|
|
80
|
+
preview_default as default
|
|
81
|
+
};
|