reflection-check 0.0.3 → 0.0.5
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/cli.js +1 -1
- package/dist/commands/doctor.js +24 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/contracts/component/component-visual-contract.d.ts +15 -2
- package/dist/contracts/component/component-visual-contract.js +224 -52
- package/dist/contracts/component/component-visual-contract.js.map +1 -1
- package/dist/contracts/component/portal-entry.d.ts +17 -0
- package/dist/contracts/component/portal-entry.js +2 -0
- package/dist/contracts/component/portal-entry.js.map +1 -0
- package/dist/core/config.d.ts +24 -3
- package/dist/core/config.js +100 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/target-ir.d.ts +10 -3
- package/dist/core/target-ir.js +11 -3
- package/dist/core/target-ir.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/integrations/playwright/context-factory.d.ts +3 -2
- package/dist/integrations/playwright/context-factory.js +6 -3
- package/dist/integrations/playwright/context-factory.js.map +1 -1
- package/dist/integrations/portal/server.d.ts +25 -0
- package/dist/integrations/portal/server.js +186 -0
- package/dist/integrations/portal/server.js.map +1 -0
- package/docs/artifacts-and-gc.md +4 -1
- package/docs/configuration.md +82 -1
- package/docs/target-ir-and-adapters.md +4 -4
- package/docs/visual-contract.md +47 -2
- package/package.json +3 -2
package/dist/core/config.js
CHANGED
|
@@ -22,6 +22,16 @@ const VisualThresholdSchema = z.object({
|
|
|
22
22
|
maxDiffPixels: z.number().int().nonnegative().optional(),
|
|
23
23
|
maxDiffPixelRatio: z.number().min(0).max(1).optional()
|
|
24
24
|
});
|
|
25
|
+
const ViewportSizeSchema = z.object({
|
|
26
|
+
width: z.number().int().positive(),
|
|
27
|
+
height: z.number().int().positive()
|
|
28
|
+
});
|
|
29
|
+
const ComponentFramingSchema = z.object({
|
|
30
|
+
rootSelector: z.string().min(1).optional(),
|
|
31
|
+
background: z.string().min(1).optional(),
|
|
32
|
+
align: z.enum(['center', 'start']).default('center'),
|
|
33
|
+
padding: z.number().int().nonnegative().default(0)
|
|
34
|
+
});
|
|
25
35
|
const RouteVisualSmokeCaseSchema = z.object({
|
|
26
36
|
id: z.string().min(1),
|
|
27
37
|
route: z.string().min(1),
|
|
@@ -92,10 +102,14 @@ const ComponentBrowserStateSchema = z
|
|
|
92
102
|
});
|
|
93
103
|
}
|
|
94
104
|
});
|
|
95
|
-
const ComponentVisualCaseSchema = z
|
|
105
|
+
const ComponentVisualCaseSchema = z
|
|
106
|
+
.object({
|
|
96
107
|
id: z.string().min(1),
|
|
97
|
-
storyId: z.string().min(1),
|
|
108
|
+
storyId: z.string().min(1).optional(),
|
|
109
|
+
path: z.string().min(1).optional(),
|
|
98
110
|
viewport: z.string().min(1).default('component'),
|
|
111
|
+
viewportSize: ViewportSizeSchema.optional(),
|
|
112
|
+
framing: ComponentFramingSchema.optional(),
|
|
99
113
|
baseline: z.string().min(1),
|
|
100
114
|
baselineRoot: z.string().optional(),
|
|
101
115
|
threshold: VisualThresholdSchema.optional(),
|
|
@@ -103,16 +117,69 @@ const ComponentVisualCaseSchema = z.object({
|
|
|
103
117
|
strict: z.boolean().optional(),
|
|
104
118
|
stateNote: z.string().min(1).optional(),
|
|
105
119
|
browserState: ComponentBrowserStateSchema.optional()
|
|
120
|
+
})
|
|
121
|
+
.superRefine((value, context) => {
|
|
122
|
+
if (value.storyId && value.path) {
|
|
123
|
+
context.addIssue({
|
|
124
|
+
code: z.ZodIssueCode.custom,
|
|
125
|
+
path: ['storyId'],
|
|
126
|
+
message: 'component visual cases must define either storyId or path, not both'
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (!value.storyId && !value.path) {
|
|
130
|
+
context.addIssue({
|
|
131
|
+
code: z.ZodIssueCode.custom,
|
|
132
|
+
path: ['storyId'],
|
|
133
|
+
message: 'component visual cases must define storyId for Storybook or path for portal'
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (value.path && !value.viewportSize) {
|
|
137
|
+
context.addIssue({
|
|
138
|
+
code: z.ZodIssueCode.custom,
|
|
139
|
+
path: ['viewportSize'],
|
|
140
|
+
message: 'portal component visual cases require viewportSize'
|
|
141
|
+
});
|
|
142
|
+
}
|
|
106
143
|
});
|
|
107
|
-
const ComponentContractSchema = z
|
|
144
|
+
const ComponentContractSchema = z
|
|
145
|
+
.object({
|
|
108
146
|
enabled: z.boolean().default(true),
|
|
109
|
-
storybook: z
|
|
147
|
+
storybook: z
|
|
148
|
+
.object({
|
|
110
149
|
command: z.string(),
|
|
111
150
|
readyUrl: z.string().url(),
|
|
112
151
|
reuseExisting: z.boolean().default(true),
|
|
113
152
|
timeoutMs: z.number().int().positive().default(60_000)
|
|
114
|
-
})
|
|
153
|
+
})
|
|
154
|
+
.optional(),
|
|
155
|
+
portal: z
|
|
156
|
+
.object({
|
|
157
|
+
entry: z.string().min(1),
|
|
158
|
+
readyUrl: z.string().url(),
|
|
159
|
+
reuseExisting: z.boolean().default(true),
|
|
160
|
+
timeoutMs: z.number().int().positive().default(60_000),
|
|
161
|
+
viteConfig: z.string().min(1).optional()
|
|
162
|
+
})
|
|
163
|
+
.optional(),
|
|
115
164
|
cases: z.array(ComponentVisualCaseSchema).default([])
|
|
165
|
+
})
|
|
166
|
+
.superRefine((value, context) => {
|
|
167
|
+
for (const [index, visualCase] of value.cases.entries()) {
|
|
168
|
+
if (visualCase.storyId && !value.storybook) {
|
|
169
|
+
context.addIssue({
|
|
170
|
+
code: z.ZodIssueCode.custom,
|
|
171
|
+
path: ['cases', index, 'storyId'],
|
|
172
|
+
message: 'storyId component visual cases require component.storybook'
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (visualCase.path && !value.portal) {
|
|
176
|
+
context.addIssue({
|
|
177
|
+
code: z.ZodIssueCode.custom,
|
|
178
|
+
path: ['cases', index, 'path'],
|
|
179
|
+
message: 'path component visual cases require component.portal'
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
116
183
|
});
|
|
117
184
|
const ReflectionConfigSchema = z.object({
|
|
118
185
|
project: z.string().min(1),
|
|
@@ -138,7 +205,34 @@ export function validateReflectionConfig(input) {
|
|
|
138
205
|
const details = parsed.error.issues.map((issue) => `${issue.path.join('.') || 'config'}: ${issue.message}`).join('; ');
|
|
139
206
|
throw new Error(`Invalid Reflection config: ${details}`);
|
|
140
207
|
}
|
|
141
|
-
return parsed.data;
|
|
208
|
+
return normalizeReflectionConfig(parsed.data);
|
|
209
|
+
}
|
|
210
|
+
function normalizeReflectionConfig(config) {
|
|
211
|
+
const component = config.contracts.component;
|
|
212
|
+
if (!component) {
|
|
213
|
+
return config;
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
...config,
|
|
217
|
+
contracts: {
|
|
218
|
+
...config.contracts,
|
|
219
|
+
component: {
|
|
220
|
+
...component,
|
|
221
|
+
cases: component.cases.map((visualCase) => {
|
|
222
|
+
if (!visualCase.framing) {
|
|
223
|
+
return visualCase;
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
...visualCase,
|
|
227
|
+
framing: {
|
|
228
|
+
...visualCase.framing,
|
|
229
|
+
rootSelector: visualCase.framing.rootSelector ?? (visualCase.path ? '#reflection-root' : '#storybook-root')
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
})
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
};
|
|
142
236
|
}
|
|
143
237
|
export async function loadReflectionConfig(configPath) {
|
|
144
238
|
const resolvedConfigPath = resolve(configPath);
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/target-ir.d.ts
CHANGED
|
@@ -40,14 +40,21 @@ export type RouteVisualTarget = TargetBase & {
|
|
|
40
40
|
};
|
|
41
41
|
export type ComponentVisualTarget = TargetBase & {
|
|
42
42
|
family: 'component-visual';
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
component: {
|
|
44
|
+
source: 'storybook' | 'portal';
|
|
45
|
+
storyId?: string | undefined;
|
|
46
|
+
path?: string | undefined;
|
|
47
|
+
statePolicy: 'story-controlled' | 'portal-controlled' | 'browser-forced-with-stabilization';
|
|
46
48
|
stateNote?: string | undefined;
|
|
47
49
|
browserState?: unknown;
|
|
48
50
|
};
|
|
49
51
|
visual: {
|
|
50
52
|
viewport: string;
|
|
53
|
+
viewportSize?: {
|
|
54
|
+
width: number;
|
|
55
|
+
height: number;
|
|
56
|
+
} | undefined;
|
|
57
|
+
framing?: unknown;
|
|
51
58
|
baseline: string;
|
|
52
59
|
baselineRoot?: string | undefined;
|
|
53
60
|
threshold?: unknown;
|
package/dist/core/target-ir.js
CHANGED
|
@@ -49,14 +49,22 @@ export function compileReflectionTargets(config) {
|
|
|
49
49
|
source: 'reflection-config',
|
|
50
50
|
runModes: ['visual', 'full'],
|
|
51
51
|
blocking: componentCase.blocking === true || componentCase.strict === true,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
component: {
|
|
53
|
+
source: componentCase.path ? 'portal' : 'storybook',
|
|
54
|
+
...(componentCase.storyId ? { storyId: componentCase.storyId } : {}),
|
|
55
|
+
...(componentCase.path ? { path: componentCase.path } : {}),
|
|
56
|
+
statePolicy: componentCase.browserState
|
|
57
|
+
? 'browser-forced-with-stabilization'
|
|
58
|
+
: componentCase.path
|
|
59
|
+
? 'portal-controlled'
|
|
60
|
+
: 'story-controlled',
|
|
55
61
|
...(componentCase.stateNote ? { stateNote: componentCase.stateNote } : {}),
|
|
56
62
|
...(componentCase.browserState ? { browserState: componentCase.browserState } : {})
|
|
57
63
|
},
|
|
58
64
|
visual: {
|
|
59
65
|
viewport: componentCase.viewport ?? 'component',
|
|
66
|
+
...(componentCase.viewportSize ? { viewportSize: componentCase.viewportSize } : {}),
|
|
67
|
+
...(componentCase.framing ? { framing: componentCase.framing } : {}),
|
|
60
68
|
baseline: componentCase.baseline,
|
|
61
69
|
...(componentCase.baselineRoot ? { baselineRoot: componentCase.baselineRoot } : {}),
|
|
62
70
|
...(componentCase.threshold !== undefined ? { threshold: componentCase.threshold } : {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target-ir.js","sourceRoot":"","sources":["../../src/core/target-ir.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"target-ir.js","sourceRoot":"","sources":["../../src/core/target-ir.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { defineReflection } from './core/define-reflection.js';
|
|
2
2
|
export type { ReflectionConfig, ReflectionConfigInput, RunMode } from './core/config.js';
|
|
3
|
+
export type { ReflectionPortalCleanup, ReflectionPortalFraming, ReflectionPortalMount, ReflectionPortalMountInput, ReflectionPortalMountResult } from './contracts/component/portal-entry.js';
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Browser, BrowserContext } from 'playwright';
|
|
2
2
|
export type ViewportName = 'desktop' | 'mobile' | 'tablet' | 'component';
|
|
3
|
-
export
|
|
3
|
+
export type ViewportSize = {
|
|
4
4
|
width: number;
|
|
5
5
|
height: number;
|
|
6
6
|
};
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function resolveViewport(viewport: string, viewportSize?: ViewportSize | undefined): ViewportSize;
|
|
8
|
+
export declare function createBrowserContext(browser: Browser, viewport: string, viewportSize?: ViewportSize | undefined): Promise<BrowserContext>;
|
|
@@ -4,12 +4,15 @@ const viewportPresets = {
|
|
|
4
4
|
tablet: { width: 820, height: 1180 },
|
|
5
5
|
component: { width: 390, height: 220 }
|
|
6
6
|
};
|
|
7
|
-
export function resolveViewport(viewport) {
|
|
7
|
+
export function resolveViewport(viewport, viewportSize) {
|
|
8
|
+
if (viewportSize) {
|
|
9
|
+
return viewportSize;
|
|
10
|
+
}
|
|
8
11
|
return viewportPresets[viewport] ?? viewportPresets.desktop;
|
|
9
12
|
}
|
|
10
|
-
export async function createBrowserContext(browser, viewport) {
|
|
13
|
+
export async function createBrowserContext(browser, viewport, viewportSize) {
|
|
11
14
|
return browser.newContext({
|
|
12
|
-
viewport: resolveViewport(viewport),
|
|
15
|
+
viewport: resolveViewport(viewport, viewportSize),
|
|
13
16
|
deviceScaleFactor: 1,
|
|
14
17
|
locale: 'en-US',
|
|
15
18
|
timezoneId: 'Europe/Stockholm',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../../../src/integrations/playwright/context-factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../../../src/integrations/playwright/context-factory.ts"],"names":[],"mappings":"AAKA,MAAM,eAAe,GAAuC;IAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACrC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACnC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACpC,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CACvC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,YAAuC;IACvF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,eAAe,CAAC,QAAwB,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAgB,EAAE,QAAgB,EAAE,YAAuC;IACpH,OAAO,OAAO,CAAC,UAAU,CAAC;QACxB,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC;QACjD,iBAAiB,EAAE,CAAC;QACpB,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ManagedServer } from '../../core/server-manager.js';
|
|
2
|
+
import type { ViewportSize } from '../playwright/context-factory.js';
|
|
3
|
+
import type { ComponentFraming } from '../../contracts/component/component-visual-contract.js';
|
|
4
|
+
export type PortalComponentCase = {
|
|
5
|
+
id: string;
|
|
6
|
+
path: string;
|
|
7
|
+
viewport: string;
|
|
8
|
+
viewportSize: ViewportSize;
|
|
9
|
+
framing?: ComponentFraming | undefined;
|
|
10
|
+
};
|
|
11
|
+
export type PortalConfig = {
|
|
12
|
+
entry: string;
|
|
13
|
+
readyUrl: string;
|
|
14
|
+
reuseExisting?: boolean | undefined;
|
|
15
|
+
timeoutMs?: number | undefined;
|
|
16
|
+
viteConfig?: string | undefined;
|
|
17
|
+
};
|
|
18
|
+
export type ReflectionPortalServer = {
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
server: ManagedServer;
|
|
21
|
+
};
|
|
22
|
+
export declare function startReflectionPortalServer(config: PortalConfig, cases: PortalComponentCase[], options: {
|
|
23
|
+
cwd: string;
|
|
24
|
+
rootDir: string;
|
|
25
|
+
}): Promise<ReflectionPortalServer>;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { createServer } from 'vite';
|
|
4
|
+
import { waitForUrl } from '../../core/server-manager.js';
|
|
5
|
+
export async function startReflectionPortalServer(config, cases, options) {
|
|
6
|
+
if ((config.reuseExisting ?? true) && (await isUrlReachable(config.readyUrl))) {
|
|
7
|
+
return {
|
|
8
|
+
baseUrl: config.readyUrl,
|
|
9
|
+
server: {
|
|
10
|
+
readyUrl: config.readyUrl,
|
|
11
|
+
reused: true,
|
|
12
|
+
started: false,
|
|
13
|
+
pid: undefined,
|
|
14
|
+
stop: async () => undefined
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const rootDir = resolve(options.rootDir);
|
|
19
|
+
await mkdir(rootDir, { recursive: true });
|
|
20
|
+
await writePortalFiles({
|
|
21
|
+
rootDir,
|
|
22
|
+
entryPath: resolve(options.cwd, config.entry),
|
|
23
|
+
cases
|
|
24
|
+
});
|
|
25
|
+
const readyUrl = new URL(config.readyUrl);
|
|
26
|
+
const port = Number(readyUrl.port || (readyUrl.protocol === 'https:' ? 443 : 80));
|
|
27
|
+
const host = readyUrl.hostname || '127.0.0.1';
|
|
28
|
+
const vite = await createServer(createViteConfig({ config, rootDir, host, port, cwd: options.cwd }));
|
|
29
|
+
try {
|
|
30
|
+
await vite.listen();
|
|
31
|
+
await waitForUrl(config.readyUrl, { timeoutMs: config.timeoutMs ?? 60_000 });
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
await vite.close();
|
|
35
|
+
await rm(rootDir, { recursive: true, force: true });
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
throw new Error(`Reflection portal did not become ready at ${config.readyUrl}: ${message}`);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
baseUrl: config.readyUrl,
|
|
41
|
+
server: {
|
|
42
|
+
readyUrl: config.readyUrl,
|
|
43
|
+
reused: false,
|
|
44
|
+
started: true,
|
|
45
|
+
pid: undefined,
|
|
46
|
+
stop: async () => {
|
|
47
|
+
await vite.close();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function createViteConfig(input) {
|
|
53
|
+
return {
|
|
54
|
+
root: input.rootDir,
|
|
55
|
+
configFile: input.config.viteConfig ? resolve(input.cwd, input.config.viteConfig) : false,
|
|
56
|
+
appType: 'spa',
|
|
57
|
+
logLevel: 'silent',
|
|
58
|
+
server: {
|
|
59
|
+
host: input.host,
|
|
60
|
+
port: input.port,
|
|
61
|
+
strictPort: true,
|
|
62
|
+
hmr: false,
|
|
63
|
+
fs: {
|
|
64
|
+
allow: [input.cwd, input.rootDir, dirname(resolve(input.cwd, input.config.entry))]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function writePortalFiles(input) {
|
|
70
|
+
await writeFile(resolve(input.rootDir, 'index.html'), [
|
|
71
|
+
'<!doctype html>',
|
|
72
|
+
'<html>',
|
|
73
|
+
'<head>',
|
|
74
|
+
' <meta charset="utf-8" />',
|
|
75
|
+
' <meta name="viewport" content="width=device-width, initial-scale=1" />',
|
|
76
|
+
' <title>Reflection Portal</title>',
|
|
77
|
+
'</head>',
|
|
78
|
+
'<body>',
|
|
79
|
+
' <script type="module" src="/reflection-portal.js"></script>',
|
|
80
|
+
'</body>',
|
|
81
|
+
'</html>',
|
|
82
|
+
''
|
|
83
|
+
].join('\n'), 'utf8');
|
|
84
|
+
await writeFile(resolve(input.rootDir, 'reflection-portal.js'), renderPortalScript(input), 'utf8');
|
|
85
|
+
}
|
|
86
|
+
function renderPortalScript(input) {
|
|
87
|
+
return `
|
|
88
|
+
import { mountReflectionCase } from "${toViteFsImport(input.entryPath)}";
|
|
89
|
+
|
|
90
|
+
const cases = ${JSON.stringify(input.cases.map((visualCase) => serializePortalCase(visualCase)))};
|
|
91
|
+
|
|
92
|
+
const state = globalThis;
|
|
93
|
+
state.__reflectionPortalReady = false;
|
|
94
|
+
state.__reflectionPortalError = undefined;
|
|
95
|
+
|
|
96
|
+
function normalizePath(path) {
|
|
97
|
+
if (!path.startsWith("/")) return \`/\${path}\`;
|
|
98
|
+
return path;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function setPortalError(error) {
|
|
102
|
+
state.__reflectionPortalError = error instanceof Error ? error.message : String(error);
|
|
103
|
+
state.__reflectionPortalReady = false;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function applyFrame(frame, caseRoot, visualCase) {
|
|
107
|
+
const framing = visualCase.framing;
|
|
108
|
+
const background = framing.background || "transparent";
|
|
109
|
+
document.documentElement.style.cssText = "margin:0;width:100%;height:100%;overflow:hidden;background:" + background;
|
|
110
|
+
document.body.style.cssText = "margin:0;width:100%;height:100%;overflow:hidden;background:" + background;
|
|
111
|
+
|
|
112
|
+
frame.style.boxSizing = "border-box";
|
|
113
|
+
frame.style.width = visualCase.viewportSize.width + "px";
|
|
114
|
+
frame.style.height = visualCase.viewportSize.height + "px";
|
|
115
|
+
frame.style.margin = "0";
|
|
116
|
+
frame.style.padding = framing.padding + "px";
|
|
117
|
+
frame.style.background = background;
|
|
118
|
+
frame.style.overflow = "hidden";
|
|
119
|
+
|
|
120
|
+
if (framing.align === "center") {
|
|
121
|
+
frame.style.display = "grid";
|
|
122
|
+
frame.style.placeItems = "center";
|
|
123
|
+
} else {
|
|
124
|
+
frame.style.display = "block";
|
|
125
|
+
caseRoot.style.width = "100%";
|
|
126
|
+
caseRoot.style.height = "100%";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function boot() {
|
|
131
|
+
const currentPath = normalizePath(window.location.pathname);
|
|
132
|
+
const visualCase = cases.find((entry) => normalizePath(entry.path) === currentPath);
|
|
133
|
+
if (!visualCase) {
|
|
134
|
+
throw new Error("No Reflection portal case configured for " + currentPath);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
document.body.innerHTML = '<main id="reflection-root"><div id="reflection-case-root"></div></main>';
|
|
138
|
+
const frame = document.getElementById("reflection-root");
|
|
139
|
+
const caseRoot = document.getElementById("reflection-case-root");
|
|
140
|
+
applyFrame(frame, caseRoot, visualCase);
|
|
141
|
+
|
|
142
|
+
const cleanup = await mountReflectionCase({
|
|
143
|
+
id: visualCase.id,
|
|
144
|
+
path: visualCase.path,
|
|
145
|
+
root: caseRoot,
|
|
146
|
+
viewport: visualCase.viewport,
|
|
147
|
+
viewportSize: visualCase.viewportSize,
|
|
148
|
+
framing: {
|
|
149
|
+
background: visualCase.framing.background,
|
|
150
|
+
align: visualCase.framing.align,
|
|
151
|
+
padding: visualCase.framing.padding
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
state.__reflectionPortalCleanup = cleanup;
|
|
156
|
+
state.__reflectionPortalReady = true;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
boot().catch(setPortalError);
|
|
160
|
+
`;
|
|
161
|
+
}
|
|
162
|
+
function serializePortalCase(visualCase) {
|
|
163
|
+
return {
|
|
164
|
+
...visualCase,
|
|
165
|
+
framing: {
|
|
166
|
+
rootSelector: visualCase.framing?.rootSelector ?? '#reflection-root',
|
|
167
|
+
background: visualCase.framing?.background,
|
|
168
|
+
align: visualCase.framing?.align ?? 'center',
|
|
169
|
+
padding: visualCase.framing?.padding ?? 0
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function toViteFsImport(path) {
|
|
174
|
+
return `/@fs/${path.replaceAll('\\', '/')}`;
|
|
175
|
+
}
|
|
176
|
+
async function isUrlReachable(url) {
|
|
177
|
+
try {
|
|
178
|
+
const response = await fetch(url, { cache: 'no-store' });
|
|
179
|
+
await response.body?.cancel();
|
|
180
|
+
return response.status >= 200 && response.status < 500;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/integrations/portal/server.ts"],"names":[],"mappings":"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"}
|
package/docs/artifacts-and-gc.md
CHANGED
|
@@ -44,9 +44,12 @@ Typical files:
|
|
|
44
44
|
server/
|
|
45
45
|
app.log
|
|
46
46
|
storybook.log
|
|
47
|
+
portal/
|
|
48
|
+
index.html
|
|
49
|
+
reflection-portal.js
|
|
47
50
|
```
|
|
48
51
|
|
|
49
|
-
Not every run contains every folder. For example, a browser-only run may have screenshots but no component visual artifacts.
|
|
52
|
+
Not every run contains every folder. For example, a browser-only run may have screenshots but no component visual artifacts. Portal component runs keep the generated wrapper under `server/portal/` so the exact runtime shell used for the capture is available for inspection.
|
|
50
53
|
|
|
51
54
|
## `report.json`
|
|
52
55
|
|
package/docs/configuration.md
CHANGED
|
@@ -187,6 +187,10 @@ Each design command runs as a project-owned process and writes stdout/stderr evi
|
|
|
187
187
|
|
|
188
188
|
## Component visual contract
|
|
189
189
|
|
|
190
|
+
Component visuals can render from Storybook or from a Reflection-generated portal. Storybook remains useful for existing projects; the portal is intended for strict design-system baselines where a dedicated route should render exactly one component state.
|
|
191
|
+
|
|
192
|
+
### Storybook runtime
|
|
193
|
+
|
|
190
194
|
```ts
|
|
191
195
|
component: {
|
|
192
196
|
enabled: true,
|
|
@@ -201,6 +205,12 @@ component: {
|
|
|
201
205
|
id: 'primary-button',
|
|
202
206
|
storyId: 'atoms-button--primary',
|
|
203
207
|
viewport: 'component',
|
|
208
|
+
viewportSize: { width: 390, height: 220 },
|
|
209
|
+
framing: {
|
|
210
|
+
background: '#ffffff',
|
|
211
|
+
align: 'center',
|
|
212
|
+
padding: 0
|
|
213
|
+
},
|
|
204
214
|
baselineRoot: 'tests/fixtures/baselines',
|
|
205
215
|
baseline: 'components/button/primary.chromium-linux.light.png',
|
|
206
216
|
threshold: { maxDiffPixelRatio: 0.005 },
|
|
@@ -223,9 +233,80 @@ component: {
|
|
|
223
233
|
|
|
224
234
|
Component visual cases resolve Storybook `/index.json`, open the story iframe, capture an actual screenshot, and compare it against the configured baseline.
|
|
225
235
|
|
|
236
|
+
### Generated portal runtime
|
|
237
|
+
|
|
238
|
+
```ts
|
|
239
|
+
component: {
|
|
240
|
+
enabled: true,
|
|
241
|
+
portal: {
|
|
242
|
+
entry: './tests/reflection/react-portal.tsx',
|
|
243
|
+
readyUrl: 'http://127.0.0.1:6106',
|
|
244
|
+
reuseExisting: true,
|
|
245
|
+
timeoutMs: 60_000,
|
|
246
|
+
viteConfig: './vite.config.ts'
|
|
247
|
+
},
|
|
248
|
+
cases: [
|
|
249
|
+
{
|
|
250
|
+
id: 'primary-button',
|
|
251
|
+
path: '/reflection/button/primary/light',
|
|
252
|
+
viewport: 'button-default',
|
|
253
|
+
viewportSize: { width: 390, height: 220 },
|
|
254
|
+
framing: {
|
|
255
|
+
rootSelector: '#reflection-root',
|
|
256
|
+
background: '#ffffff',
|
|
257
|
+
align: 'center',
|
|
258
|
+
padding: 0
|
|
259
|
+
},
|
|
260
|
+
baselineRoot: 'tests/fixtures/baselines',
|
|
261
|
+
baseline: 'components/button/primary.chromium-linux.light.png',
|
|
262
|
+
threshold: { maxDiffPixels: 0, maxDiffPixelRatio: 0 },
|
|
263
|
+
strict: true
|
|
264
|
+
}
|
|
265
|
+
]
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Portal cases use `path` instead of `storyId`. Reflection generates a Vite-backed portal for the run, creates `#reflection-root` and `#reflection-case-root`, imports the configured `portal.entry`, and calls `mountReflectionCase` for the matching path.
|
|
270
|
+
|
|
271
|
+
The portal entry exports a mount function:
|
|
272
|
+
|
|
273
|
+
```ts
|
|
274
|
+
import type { ReflectionPortalMountInput } from 'reflection-check';
|
|
275
|
+
|
|
276
|
+
export function mountReflectionCase(input: ReflectionPortalMountInput) {
|
|
277
|
+
input.root.textContent = input.id;
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Portal cases must define `viewportSize`. Reflection uses that exact size for the browser viewport and for the generated portal frame. This keeps the config as the source of truth for frame dimensions.
|
|
282
|
+
|
|
283
|
+
### Shared case fields
|
|
284
|
+
|
|
285
|
+
`viewport` accepts the built-in presets (`desktop`, `tablet`, `mobile`, `component`) and any custom string label. When `viewportSize` is provided, Reflection captures at that exact `{ width, height }` instead of resolving the string preset. Use this for exported Figma baselines: the PNG dimensions must match `viewportSize` exactly or the check fails with `visual-dimension-mismatch`.
|
|
286
|
+
|
|
287
|
+
`framing` lets a component visual case normalize the runtime frame before the screenshot:
|
|
288
|
+
|
|
289
|
+
```ts
|
|
290
|
+
framing: {
|
|
291
|
+
rootSelector: '#storybook-root',
|
|
292
|
+
background: '#ffffff',
|
|
293
|
+
align: 'center',
|
|
294
|
+
padding: 0
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Use it when the approved baseline is a fixed Figma frame: `background` should match the Figma frame fill, `align: 'center'` centers the component in the frame, and `padding` reserves explicit frame padding. `rootSelector` defaults to `#storybook-root` for Storybook cases and `#reflection-root` for portal cases.
|
|
299
|
+
|
|
300
|
+
Case/runtime rules:
|
|
301
|
+
|
|
302
|
+
- Storybook cases use `storyId` and require `component.storybook`.
|
|
303
|
+
- Portal cases use `path` and require `component.portal`.
|
|
304
|
+
- A case cannot define both `storyId` and `path`.
|
|
305
|
+
- Portal cases require `viewportSize`; strict Figma baselines should not rely on implicit preset dimensions.
|
|
306
|
+
|
|
226
307
|
Pseudo-state policy:
|
|
227
308
|
|
|
228
|
-
- Prefer
|
|
309
|
+
- Prefer runtime-controlled variants for hover, focus, active, selected, open, and disabled states.
|
|
229
310
|
- If a browser-forced state is necessary, configure `browserState` with `kind: 'hover' | 'focus'`, a selector, and effective animation stabilization.
|
|
230
311
|
- Reflection records `statePolicy` metadata in reports so reviewers can tell whether the state came from the story or was forced in the browser.
|
|
231
312
|
|