Rules & engine: - 22 presets (was 11): split status into okstate/warnstate/badstate, add delop, createop, danger, secret, level, exitcode, percent, http; status words are case-insensitive and cover the ✓ ✔ ✅ ✗ ✘ ✖ ❌ ⚠ symbol set - value bands: the first number in a match picks the colour (percent: <20% red / 20-50% yellow / 50-80% light green / >=80% green) - optional per-rule `caseInsensitive`, `category`, `bands`; load-time `refreshBuiltinRules` upgrades untouched built-in patterns in place Settings page: - three-way master switch `highlightMode` (all / basic / off); `basic` runs only the five safety+status rules and `off` empties the rule set rather than bypassing HighlightStream (which would drop the held tail) - category column + grouping (`highlightGroupByCategory`), per-rule hit/duration stats (`highlightStats`, opt-in sink, snapshot once a second), theme-following colours (`highlightThemeColors`, hue-bucket mapping onto the ANSI palette), import/export JSON envelope, live preview through the real engine - named rule subsets bound per host (`highlightPerHost` + `highlightProfiles` + `SshConnection.highlightProfileId`); empty ruleIds = every rule Tests: new tests/hl-rules.mjs (word boundaries, case flag, negative words, bands, import/export, preview, basic mode, categories, stats, theme colours, profiles) + profile round-trip in tests/settings-store.mjs
46 lines
2.0 KiB
JavaScript
46 lines
2.0 KiB
JavaScript
/* Rebuild every esbuild bundle the tests load, so a test run can never exercise
|
|
a stale bundle. `npm test` calls this first; run it standalone when you only
|
|
want fresh bundles.
|
|
|
|
The aliases live here (and nowhere else) so every bundle resolves `electron`
|
|
and `@shared` the same way. A bundle built without
|
|
`--alias:@shared=./src/shared` does not even compile: pty.ts reaches
|
|
@shared/theme through settingsStore.ts -> windowChrome.ts.
|
|
|
|
Usage: node tests/build-bundles.cjs */
|
|
const path = require('node:path')
|
|
const esbuild = require('esbuild')
|
|
|
|
const ROOT = path.join(__dirname, '..')
|
|
|
|
const BUNDLES = [
|
|
// Real session layer: pty.ts also re-exports the ssh + sysinfo engines.
|
|
{ entry: 'src/main/pty.ts', out: 'tests/.session-e2e.cjs', external: ['@lydell/node-pty', 'ssh2'] },
|
|
// ESM (`.mjs`): tests/sftp-*.mjs load it with `await import()`.
|
|
{ entry: 'src/main/sftp.ts', out: 'tests/.sftp-svc.mjs', format: 'esm', external: ['ssh2'] },
|
|
{ entry: 'src/main/commands.ts', out: 'tests/.commands-store.cjs' },
|
|
{ entry: 'src/main/settingsStore.ts', out: 'tests/.settings-store.cjs' },
|
|
// zmodem.js stays bundled (NOT external) — the test drives a second in-process
|
|
// Sentry from the same library.
|
|
{ entry: 'src/main/zmodem.ts', out: 'tests/.zmodem-e2e.cjs', external: ['ssh2'] },
|
|
// The smoke test imports the renderer engine (.ts), so it needs bundling too.
|
|
{ entry: 'tests/hl-split-smoke.mjs', out: 'tests/.hl-split-smoke.cjs' },
|
|
// Preset-rule assertions (word boundaries, case flag) over the same engine.
|
|
{ entry: 'tests/hl-rules.mjs', out: 'tests/.hl-rules.cjs' }
|
|
]
|
|
|
|
for (const { entry, out, format = 'cjs', external = [] } of BUNDLES) {
|
|
esbuild.buildSync({
|
|
absWorkingDir: ROOT,
|
|
entryPoints: [path.join(ROOT, entry)],
|
|
outfile: path.join(ROOT, out),
|
|
bundle: true,
|
|
platform: 'node',
|
|
format,
|
|
external,
|
|
alias: { electron: './tests/electron-stub.cjs', '@shared': './src/shared' },
|
|
logLevel: 'warning'
|
|
})
|
|
console.log(`built ${out}`)
|
|
}
|