plum-e2e 2.9.13 → 2.9.17

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/CLAUDE.md CHANGED
@@ -137,7 +137,7 @@ Never write comments that:
137
137
  - Describe the current task or fix ("added for the live page", "handles issue #123")
138
138
  - Are multi-line docblocks explaining parameters
139
139
 
140
- The GPL license header at the top of every file is a legal requirement — do not remove it.
140
+ The MIT license header at the top of every file is a legal requirement — do not remove it. `npm run add-license` (config: `license-config.json`) applies and verifies it and runs in the pre-commit hook. Match the existing style for the file type: `/* … */` for JS/TS/CSS, `<!-- … -->` for Svelte, `# …` for shell/YAML/Dockerfiles/dotfiles, `// …` for `schema.prisma` (Prisma's formatter rewrites `/* */`, so it's kept out of `add-license` and headered by hand). JSON files carry no header.
141
141
 
142
142
  ---
143
143
 
package/README.md CHANGED
@@ -79,25 +79,28 @@ Full documentation is available at:
79
79
 
80
80
  ## Command Reference
81
81
 
82
- | Command | Description |
83
- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------- |
84
- | `plum init` | Initialize a new project in the current folder |
85
- | `plum server start` | Start the full UI stack via Docker |
86
- | `plum server restart` | Rebuild Docker images and restart the server without prompts |
87
- | `plum server stop` | Stop the server (data preserved) |
88
- | `plum server reconfig` | Re-enter server settings without starting |
89
- | `plum update` | Update Plum, then restart each registered server/node on this machine (asks before each, in an interactive shell) |
90
- | `plum node start` | Set up connectivity, start a runner node, and open the runner menu |
91
- | `plum node restart` | Stop, refresh dependencies, and restart the runner node |
92
- | `plum node stop` | Stop the runner node started from this folder |
93
- | `plum node reconfig` | Re-enter node settings and re-register |
94
- | `plum run-test` | Run all tests locally without Docker |
95
- | `plum run-test @tag` | Run tests matching a tag |
96
- | `plum run-test --parallel N` | Run tests across N parallel workers |
97
- | `plum run-test --browser <b>` | Run in `chromium` (default) or `firefox` |
98
- | `plum run-test --help` | Show usage for `run-test` |
99
- | `plum create-step` | Interactively scaffold a new step definition |
100
- | `plum manage-runners` | Open the interactive runner management menu |
82
+ | Command | Description |
83
+ | ----------------------------- | --------------------------------------------------------------------------------------------- |
84
+ | `plum init` | Initialize a new project in the current folder |
85
+ | `plum server start` | Start the full UI stack via Docker |
86
+ | `plum server restart` | Rebuild Docker images and restart the server without prompts |
87
+ | `plum server stop` | Stop the server (data preserved) |
88
+ | `plum server reconfig` | Re-enter server settings without starting |
89
+ | `plum update` | Update Plum, then restart every registered server and node on this machine (asks before each) |
90
+ | `plum node start [name]` | Register a runner node with the server and start it on this machine |
91
+ | `plum node list` | List this machine's nodes and their status |
92
+ | `plum node restart [name]` | Stop, refresh dependencies, and restart a node |
93
+ | `plum node stop [name]` | Stop a node |
94
+ | `plum node delete <name>` | Stop the node, delete its local config, and unregister it from the server |
95
+ | `plum node reconfig [name]` | Re-enter a node's settings and re-register, without starting it |
96
+ | `plum run-test` | Run all tests locally without Docker |
97
+ | `plum run-test @tag` | Run tests matching a tag |
98
+ | `plum run-test --parallel N` | Run tests across N parallel workers |
99
+ | `plum run-test --browser <b>` | Run in `chromium` (default) or `firefox` |
100
+ | `plum run-test --help` | Show usage for `run-test` |
101
+ | `plum create-step` | Interactively scaffold a new step definition |
102
+ | `plum create-test` | Interactively scaffold a full feature (`.feature` + Page + Steps) |
103
+ | `plum manage-runners` | Open the interactive runner management menu |
101
104
 
102
105
  ---
103
106
 
@@ -126,7 +129,7 @@ npm run dev # available at http://localhost:5173
126
129
  ```bash
127
130
  cd backend
128
131
  npm test # run all tests
129
- npm test -- @test-1 # run a specific scenario
132
+ npm test -- @TC-001 # run a specific scenario
130
133
  npm test -- --parallel 4 # run in parallel
131
134
  npm run create-step # scaffold a step definition
132
135
  npm run create-test # scaffold a full test from template
@@ -1,18 +1,6 @@
1
1
  /*
2
2
  * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
3
+ * Licensed under the MIT License. See LICENSE file in the project root for details.
16
4
  */
17
5
 
18
6
  // Wires up Plum's session recording — removing or reordering code here can silently break report replay.
@@ -1,18 +1,6 @@
1
1
  /*
2
2
  * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
3
+ * Licensed under the MIT License. See LICENSE file in the project root for details.
16
4
  */
17
5
 
18
6
  // Wires up Plum's session recording — removing or reordering code here can silently break report replay.
@@ -1,16 +1,6 @@
1
- /**
2
- * This file is part of Plum.
3
- * Plum is free software: you can redistribute it and/or modify
4
- * it under the terms of the GNU General Public License as published by
5
- * the Free Software Foundation, either version 3 of the License, or
6
- * (at your option) any later version.
7
- * Plum is distributed in the hope that it will be useful,
8
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
- * GNU General Public License for more details.
11
- * You should have received a copy of the GNU General Public License
12
- * along with Plum. If not, see https://www.gnu.org/licenses/.
13
- */
1
+ // This file is part of Plum.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for details.
3
+
14
4
  generator client {
15
5
  provider = "prisma-client-js"
16
6
  }
@@ -15,6 +15,7 @@
15
15
 
16
16
  const META_EVENT_TYPE = 4;
17
17
 
18
+ let viewport;
18
19
  let stage;
19
20
  let container;
20
21
  let player = null;
@@ -23,14 +24,18 @@
23
24
  let nativeHeight = 0;
24
25
  let resizeObserver;
25
26
 
26
- // rrweb-player renders at the recording's native resolution scale-and-crop
27
- // it to fill the stage (object-fit: cover); letterboxing left visible bars
28
- // when the aspect ratios didn't match. Re-run on every stage resize, since
29
- // the panel's own layout can still shift its size after the player is built.
27
+ // rrweb-player renders at the recording's native resolution. Scale it to the
28
+ // full panel width and anchor it to the top: the browser frame is shown at
29
+ // true proportions (never zoomed or cropped), and any leftover space is a
30
+ // single region below the page not the symmetric top+bottom letterbox
31
+ // bars a contain-fit leaves. Re-run on every resize.
30
32
  function updateScale() {
31
- if (!nativeWidth || !nativeHeight) return;
32
- const rect = stage.getBoundingClientRect();
33
- const scale = Math.max(rect.width / nativeWidth, rect.height / nativeHeight);
33
+ if (!nativeWidth || !nativeHeight || !viewport) return;
34
+ const vp = viewport.getBoundingClientRect();
35
+ const scale = vp.width / nativeWidth || 0;
36
+ stage.style.width = `${vp.width}px`;
37
+ stage.style.height = `${nativeHeight * scale}px`;
38
+ container.style.transformOrigin = 'top left';
34
39
  container.style.transform = `scale(${scale})`;
35
40
  }
36
41
 
@@ -38,8 +43,8 @@
38
43
  // construction) reads events[0].timestamp unconditionally, so the initial
39
44
  // batch must be passed in props rather than fed empty and via addEvent.
40
45
  function buildPlayer() {
41
- const rect = stage.getBoundingClientRect();
42
- const meta = events[0]?.type === META_EVENT_TYPE ? events[0].data : null;
46
+ const rect = viewport.getBoundingClientRect();
47
+ const meta = events.find((e) => e?.type === META_EVENT_TYPE)?.data ?? null;
43
48
  nativeWidth = meta?.width > 0 ? meta.width : rect.width;
44
49
  nativeHeight = meta?.height > 0 ? meta.height : rect.height;
45
50
 
@@ -68,8 +73,9 @@
68
73
 
69
74
  onMount(() => {
70
75
  buildPlayer();
76
+ // Observe the viewport, not the stage — the stage's size is what we set.
71
77
  resizeObserver = new ResizeObserver(updateScale);
72
- resizeObserver.observe(stage);
78
+ resizeObserver.observe(viewport);
73
79
  });
74
80
  onDestroy(() => {
75
81
  resizeObserver?.disconnect();
@@ -81,25 +87,41 @@
81
87
  });
82
88
  </script>
83
89
 
84
- <div class="live-stage" bind:this={stage}>
85
- <div class="live-mount" bind:this={container}></div>
90
+ <div class="live-viewport" bind:this={viewport}>
91
+ <div class="live-stage" bind:this={stage}>
92
+ <div class="live-mount" bind:this={container}></div>
93
+ </div>
86
94
  </div>
87
95
 
88
96
  <style>
89
- .live-stage {
90
- position: relative;
97
+ /* Fills the panel; the stage is sized in JS to the panel width at the
98
+ recording's true aspect ratio, pinned to the top. */
99
+ .live-viewport {
91
100
  flex: 1;
101
+ width: 100%;
102
+ height: 100%;
92
103
  min-width: 0;
93
104
  min-height: 0;
94
105
  display: flex;
95
- align-items: center;
106
+ align-items: flex-start;
96
107
  justify-content: center;
97
- background: var(--bg-subtle);
108
+ overflow: hidden;
109
+ }
110
+
111
+ .live-stage {
112
+ position: relative;
98
113
  overflow: hidden;
99
114
  }
100
115
 
101
116
  .live-mount {
102
- display: flex;
117
+ position: absolute;
118
+ top: 0;
119
+ left: 0;
120
+ }
121
+
122
+ .live-mount :global(.rr-player) {
123
+ border-radius: 0 !important;
124
+ box-shadow: none !important;
103
125
  }
104
126
 
105
127
  /* Sandboxed iframe (no allow-scripts/forms/top-navigation) — safe to always
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plum-e2e",
3
- "version": "2.9.13",
3
+ "version": "2.9.17",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/silverlunah/plum.git"