@forgebook/testing 0.1.5 → 0.1.6
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/src/storyFiles.d.ts +2 -1
- package/dist/src/storyFiles.d.ts.map +1 -1
- package/dist/src/storyFiles.js +22 -12
- package/dist/src/storyFiles.js.map +1 -1
- package/dist/src/touchWindow.d.ts +8 -0
- package/dist/src/touchWindow.d.ts.map +1 -0
- package/dist/src/touchWindow.js +64 -0
- package/dist/src/touchWindow.js.map +1 -0
- package/package.json +8 -4
package/dist/src/storyFiles.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ export type StoryFilesOptions = {
|
|
|
11
11
|
readonly patterns: readonly string[];
|
|
12
12
|
};
|
|
13
13
|
/**
|
|
14
|
-
* The story files the patterns match, as the source's keys (
|
|
14
|
+
* The story files the patterns match, as the source's keys (the plugin's: relative to each pattern's folder once its
|
|
15
|
+
* leading `../` moved into it, `./src/x.stories.tsx`), sorted.
|
|
15
16
|
*
|
|
16
17
|
* @param options - where the files are.
|
|
17
18
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyFiles.d.ts","sourceRoot":"","sources":["../../src/storyFiles.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAMlF,yCAAyC;AACzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qHAAqH;IACrH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;
|
|
1
|
+
{"version":3,"file":"storyFiles.d.ts","sourceRoot":"","sources":["../../src/storyFiles.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAMlF,yCAAyC;AACzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qHAAqH;IACrH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAUF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,YAAa,iBAAiB,KAAG,MAAM,EACyC,CAAC;AAExG;;;;;GAKG;AACH,eAAO,MAAM,aAAa,YAAa,iBAAiB,KAAG,WAmB1D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,YAAa,iBAAiB,UAAU,WAAW,KAAG,MAAM,EAS1F,CAAC"}
|
package/dist/src/storyFiles.js
CHANGED
|
@@ -14,13 +14,20 @@ import { join } from "node:path";
|
|
|
14
14
|
import { sourceFiles } from "forgebook/source-files";
|
|
15
15
|
import { autoTitle, patternBase } from "forgebook/vite/auto-title";
|
|
16
16
|
import { indexStoryFile } from "forgebook/vite/index-story-file";
|
|
17
|
-
import { storyFileKeys } from "forgebook/vite/story-files-module";
|
|
17
|
+
import { storyFileKeys, storyFilesGroup } from "forgebook/vite/story-files-module";
|
|
18
18
|
/**
|
|
19
|
-
* The
|
|
19
|
+
* The groups the patterns make, each read as the catalogue's plugin reads it (`storyFilesGroup`): one per pattern.
|
|
20
20
|
*
|
|
21
21
|
* @param options - where the files are.
|
|
22
22
|
*/
|
|
23
|
-
|
|
23
|
+
const groupsOf = (options) => options.patterns.map((pattern) => storyFilesGroup(options.root, pattern));
|
|
24
|
+
/**
|
|
25
|
+
* The story files the patterns match, as the source's keys (the plugin's: relative to each pattern's folder once its
|
|
26
|
+
* leading `../` moved into it, `./src/x.stories.tsx`), sorted.
|
|
27
|
+
*
|
|
28
|
+
* @param options - where the files are.
|
|
29
|
+
*/
|
|
30
|
+
export const storyFiles = (options) => [...new Set(groupsOf(options).flatMap((group) => storyFileKeys(group.root, [group.pattern])))].sort();
|
|
24
31
|
/**
|
|
25
32
|
* A source with its index read from the disk and no loaders: enough for the story tree, the ids and the tests.
|
|
26
33
|
*
|
|
@@ -29,15 +36,18 @@ export const storyFiles = (options) => storyFileKeys(options.root, options.patte
|
|
|
29
36
|
*/
|
|
30
37
|
export const indexedSource = (options) => {
|
|
31
38
|
const index = {};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
// as the plugin does: each pattern is one group, and a file's title comes from the first group that matches it
|
|
40
|
+
for (const group of groupsOf(options)) {
|
|
41
|
+
for (const file of storyFileKeys(group.root, [group.pattern])) {
|
|
42
|
+
if (index[file] !== undefined)
|
|
43
|
+
continue;
|
|
44
|
+
const title = autoTitle(patternBase(group.pattern), file);
|
|
45
|
+
const text = readFileSync(join(group.root, file), "utf8");
|
|
46
|
+
const entry = indexStoryFile(file, text, title === undefined ? {} : { autoTitle: title });
|
|
47
|
+
if (typeof entry === "string")
|
|
48
|
+
throw new Error(entry);
|
|
49
|
+
index[file] = entry;
|
|
50
|
+
}
|
|
41
51
|
}
|
|
42
52
|
return {
|
|
43
53
|
id: options.sourceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyFiles.js","sourceRoot":"","sources":["../../src/storyFiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"storyFiles.js","sourceRoot":"","sources":["../../src/storyFiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TouchWindowRequest } from "forgebook/real-touch";
|
|
2
|
+
/**
|
|
3
|
+
* Opens the catalogue in a touch window and waits until the person closes it.
|
|
4
|
+
*
|
|
5
|
+
* @param request - the catalogue's address.
|
|
6
|
+
*/
|
|
7
|
+
export declare const openTouchWindow: (request: TouchWindowRequest) => Promise<void>;
|
|
8
|
+
//# sourceMappingURL=touchWindow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchWindow.d.ts","sourceRoot":"","sources":["../../src/touchWindow.ts"],"names":[],"mappings":"AAcA,OAAO,EAAmB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAwBhF;;;;GAIG;AACH,eAAO,MAAM,eAAe,YAAmB,kBAAkB,KAAG,OAAO,CAAC,IAAI,CAqB/E,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The window `forgebook dev --touch` opens: the catalogue in a Chromium of Playwright's, with Chromium's own touch
|
|
3
|
+
* emulation, so the mouse makes real touch events (trusted, with the browser's own scrolling) where the catalogue's
|
|
4
|
+
* Touch switch can only simulate them.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Loaded from the project by the command only when it runs, as the check is, so the core needs no browser. The
|
|
8
|
+
* emulation is turned on through the browser's protocol (CDP) in every page of the window, popups included, and the
|
|
9
|
+
* pages are marked (`forgebook/real-touch`) so the catalogue's simulated touch stays off there. Still a computer: no
|
|
10
|
+
* virtual keyboard, no viewport shrinking under it, no iOS Safari.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { chromium } from "@playwright/test";
|
|
15
|
+
import { REAL_TOUCH_FLAG } from "forgebook/real-touch";
|
|
16
|
+
/** How many fingers the emulation offers. */
|
|
17
|
+
const MAX_TOUCH_POINTS = 5;
|
|
18
|
+
/** The pages whose emulation is on: the first page is turned on before it loads, and the context then reports it. */
|
|
19
|
+
const emulated = new WeakSet();
|
|
20
|
+
/**
|
|
21
|
+
* Turns Chromium's touch emulation on in a page: the mouse's presses become touches, as in DevTools' device mode.
|
|
22
|
+
*
|
|
23
|
+
* @param page - the page.
|
|
24
|
+
*/
|
|
25
|
+
const emulateTouch = async (page) => {
|
|
26
|
+
if (emulated.has(page))
|
|
27
|
+
return;
|
|
28
|
+
emulated.add(page);
|
|
29
|
+
const session = await page.context().newCDPSession(page);
|
|
30
|
+
await session.send("Emulation.setTouchEmulationEnabled", {
|
|
31
|
+
enabled: true,
|
|
32
|
+
maxTouchPoints: MAX_TOUCH_POINTS
|
|
33
|
+
});
|
|
34
|
+
await session.send("Emulation.setEmitTouchEventsForMouse", { enabled: true, configuration: "mobile" });
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Opens the catalogue in a touch window and waits until the person closes it.
|
|
38
|
+
*
|
|
39
|
+
* @param request - the catalogue's address.
|
|
40
|
+
*/
|
|
41
|
+
export const openTouchWindow = async (request) => {
|
|
42
|
+
const browser = await chromium.launch({ headless: false });
|
|
43
|
+
// the window's own size, not a fixed viewport: the person resizes it as they like
|
|
44
|
+
const context = await browser.newContext({ viewport: null, hasTouch: true });
|
|
45
|
+
await context.addInitScript((flag) => {
|
|
46
|
+
Object.defineProperty(window, flag, { value: true });
|
|
47
|
+
}, REAL_TOUCH_FLAG);
|
|
48
|
+
context.on("page", (page) => {
|
|
49
|
+
void emulateTouch(page);
|
|
50
|
+
});
|
|
51
|
+
const page = await context.newPage();
|
|
52
|
+
await emulateTouch(page);
|
|
53
|
+
await page.goto(request.url);
|
|
54
|
+
await new Promise((done) => {
|
|
55
|
+
browser.on("disconnected", () => done());
|
|
56
|
+
// the last page closed closes the window
|
|
57
|
+
context.on("close", () => done());
|
|
58
|
+
page.on("close", () => {
|
|
59
|
+
if (context.pages().length === 0)
|
|
60
|
+
void browser.close();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=touchWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchWindow.js","sourceRoot":"","sources":["../../src/touchWindow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAA2B,MAAM,sBAAsB,CAAC;AAEhF,6CAA6C;AAC7C,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,qHAAqH;AACrH,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;AAErC;;;;GAIG;AACH,MAAM,YAAY,GAAG,KAAK,EAAE,IAAU,EAAiB,EAAE;IACvD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE;QACvD,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,gBAAgB;KACjC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;AACzG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAA2B,EAAiB,EAAE;IAClF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,kFAAkF;IAClF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,IAAY,EAAQ,EAAE;QACjD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,EAAE,eAAe,CAAC,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAU,EAAQ,EAAE;QACtC,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE;QAC/B,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,GAAS,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,yCAAyC;QACzC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAS,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAS,EAAE;YAC1B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgebook/testing",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Tests from a package's stories: each story and variant in the browser with axe, spills and overlays, screenshots, and each story rendered on the server.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -59,6 +59,10 @@
|
|
|
59
59
|
"types": "./dist/src/shotStories.d.ts",
|
|
60
60
|
"default": "./dist/src/shotStories.js"
|
|
61
61
|
},
|
|
62
|
+
"./touch": {
|
|
63
|
+
"types": "./dist/src/touchWindow.d.ts",
|
|
64
|
+
"default": "./dist/src/touchWindow.js"
|
|
65
|
+
},
|
|
62
66
|
"./fonts.css": "./dist/src/fonts/fonts.css"
|
|
63
67
|
},
|
|
64
68
|
"dependencies": {
|
|
@@ -70,7 +74,7 @@
|
|
|
70
74
|
"@playwright/test": "^1.64.0",
|
|
71
75
|
"vite": "^8.0.0",
|
|
72
76
|
"vitest": "^5.0.0",
|
|
73
|
-
"forgebook": "^0.1.
|
|
77
|
+
"forgebook": "^0.1.5"
|
|
74
78
|
},
|
|
75
79
|
"devDependencies": {
|
|
76
80
|
"@playwright/test": "1.64.1",
|
|
@@ -80,8 +84,8 @@
|
|
|
80
84
|
"vite": "8.3.5",
|
|
81
85
|
"vitest": "5.0.5",
|
|
82
86
|
"@forgebook/tools": "0.0.0",
|
|
83
|
-
"forgebook": "0.
|
|
84
|
-
"
|
|
87
|
+
"@forgebook/typescript-config": "0.0.0",
|
|
88
|
+
"forgebook": "0.1.5"
|
|
85
89
|
},
|
|
86
90
|
"publishConfig": {
|
|
87
91
|
"access": "public"
|