import assert from 'node:assert/strict';
import { existsSync } from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { createServer } from 'vite';
import react from '@vitejs/plugin-react';
import { chromium } from 'playwright';
// List rows on real pages; only HTTP, toasts, confirm and translation are
// stubbed.
// - Row actions inside memoized columns: the columns were memoized without
// the state their delete handlers read, so a delete after opening a vault
// or a variable group used first-render values (a null vault, group null).
// - Keyboard: a clickable row opens with Enter like it does with a click.
// - A label can name a server picker: the picker puts its id on its trigger.
const root = fileURLToPath(new URL('../', import.meta.url));
const fixture = `
import React from 'react';
import {createRoot} from 'react-dom/client';
import {MemoryRouter} from 'react-router-dom';
import Vaults from '/src/pages/Vaults.jsx';
import SharedVariableGroups from '/src/components/shared/SharedVariableGroups.jsx';
import ServerPicker from '/src/components/ServerPicker.jsx';
const log=(...a)=>(window.calls=window.calls||[]).push(a);
const vault={id:11,name:'alpha-vault',description:'',secret_count:1,workspace_id:null};
window.testApi={
listVaults:()=>Promise.resolve({vaults:[vault]}),
getWorkspaces:()=>Promise.resolve({workspaces:[]}),
getVault:(id)=>{log('getVault',id);return Promise.resolve({vault});},
listSecrets:()=>Promise.resolve({secrets:[{id:5,name:'API_TOKEN',value:'••••',updated_at:null}]}),
deleteSecret:(id)=>{log('deleteSecret',id);return Promise.resolve({});},
listVariableGroups:()=>Promise.resolve({groups:[{id:21,name:'shared-env',variable_count:1,attachment_count:0}]}),
getVariableGroup:(id)=>Promise.resolve({id,name:'shared-env',variables:[{id:31,key:'REGION',value:'x',is_secret:false}],attachments:[]}),
deleteGroupVariable:(gid,vid)=>{log('deleteGroupVariable',gid,vid);return Promise.resolve({});},
};
const which=new URLSearchParams(location.search).get('page');
const picker=