63 lines
3.8 KiB
Markdown
63 lines
3.8 KiB
Markdown
|
|
# Build Cleanup & Release Packaging
|
||
|
|
|
||
|
|
**Date:** 2026-09-22 13:39
|
||
|
|
**Commits:** 4bf6545..1ea7f19 (5 commits)
|
||
|
|
|
||
|
|
## Task Description
|
||
|
|
|
||
|
|
Resolved all build warnings/errors across the frontend (svelte-check, Vite) and backend (cargo), fixed a failing test, and implemented a release build script that produces a distributable `GUI Video Clipper.app` bundle.
|
||
|
|
|
||
|
|
## Changes Made
|
||
|
|
|
||
|
|
### Task 1: TypeScript Error Fixes (`3eebe01`)
|
||
|
|
- Installed `@types/node` as dev dependency
|
||
|
|
- Added `"types": ["node"]` to `tsconfig.json`
|
||
|
|
- Changed `defineConfig` import in `vite.config.ts` from `vite` to `vitest/config` (extends config type with `test` property)
|
||
|
|
- Result: 4 TS errors → 0
|
||
|
|
|
||
|
|
### Task 2: Svelte A11y Warning Fixes (`9d1f1cf`)
|
||
|
|
- **CaptionSettingsPanel.svelte**: 9 label/control association fixes (id/for pairs and wrapping)
|
||
|
|
- **ClipList.svelte**: Added `tabindex="0"` and keyboard handler to listbox container
|
||
|
|
- **PreferencesPanel.svelte, ExportDialog.svelte, AboutDialog.svelte**: Added `tabindex="-1"` to dialog divs, keyboard handlers on overlays
|
||
|
|
- **VideoPlayer.svelte**: Added `<track kind="captions" />` to `<video>` element
|
||
|
|
- **App.svelte**: Added keyboard support to resize handle (`role="slider"`, arrow keys, aria-value attrs)
|
||
|
|
- Result: 19 a11y warnings → 0
|
||
|
|
|
||
|
|
### Task 3: Rust Dead Code Annotations (`d85fbda`)
|
||
|
|
- Added `#[allow(dead_code)]` with comments on 6 items across 4 files:
|
||
|
|
- `ExportEvent::Error`, `DownloadEvent::Error` (reserved for future use)
|
||
|
|
- `sanitize_vtt_for_ffmpeg`, `opacity_to_ass_back_colour`, `caption_style_to_force_style` (caption burn-in pipeline)
|
||
|
|
- `SubtitleFormat.ext`/`.url` (serde deserialization fields)
|
||
|
|
- Result: 6 warnings → 0
|
||
|
|
|
||
|
|
### Task 4: Test Fix (`30b04b4`)
|
||
|
|
- Changed `markInPoint(5)` to `markInPoint(12)` in clips.test.ts
|
||
|
|
- Time 5 was outside `EDIT_TOLERANCE` (0.5s) of clip boundary (10-20), so `isTimeInsideClip` returned false and the edit path didn't execute
|
||
|
|
- Result: 1 failing test → 31/31 pass
|
||
|
|
|
||
|
|
### Task 5: Release Build Script (`1ea7f19`)
|
||
|
|
- Created `scripts/build-release.sh`: builds, ad-hoc signs, copies to `dist/release/`
|
||
|
|
- Changed `tauri.conf.json` bundle targets from `"all"` to `["app", "dmg"]`
|
||
|
|
- Added `dist/` to `.gitignore`
|
||
|
|
- Added `"release"` npm script
|
||
|
|
- Updated README with Release Build section
|
||
|
|
- Script parses tauri build output for .app/.dmg paths (handles custom CARGO_TARGET_DIR)
|
||
|
|
- Result: `npm run release` → `GUI Video Clipper.app` (6.2M) + `.dmg` (2.8M)
|
||
|
|
|
||
|
|
## Verification Results
|
||
|
|
- `npm run check`: 0 errors, 0 warnings
|
||
|
|
- `npm test`: 31/31 pass
|
||
|
|
- `cargo build`: 0 warnings
|
||
|
|
- `npm run release`: produces signed .app + .dmg
|
||
|
|
|
||
|
|
## Lessons Learned
|
||
|
|
- **Cursor sandbox CARGO_TARGET_DIR**: The Tauri build outputs to a sandboxed cache directory, not `src-tauri/target/`. The build script must parse the actual output paths from `npx tauri build` output rather than hardcoding the expected location.
|
||
|
|
- **Svelte a11y linter strictness**: `role="separator"` with keyboard support still triggers `a11y_no_noninteractive_element_interactions`. Using `role="slider"` satisfies the linter for resize handles.
|
||
|
|
- **Dialog overlay keyboard patterns**: Adding `onkeydown` + `tabindex="-1"` to overlays and `e.stopPropagation()` to inner dialogs satisfies the click-needs-keyboard-equivalent rule, but the stopPropagation means Escape from inside the dialog won't bubble to the overlay handler. Not a regression since dialogs previously had no keyboard close.
|
||
|
|
- **Test EDIT_TOLERANCE awareness**: When testing functions that use proximity checks (`isTimeInsideClip`), test values must account for tolerance thresholds. Values outside tolerance trigger different code paths.
|
||
|
|
|
||
|
|
## Follow-up Items
|
||
|
|
- Push new commits to remote: `git push origin master`
|
||
|
|
- Consider re-tagging `v0.1.0` to include these cleanup commits, or tag as `v0.1.1`
|
||
|
|
- Dialog Escape-from-inside behavior could be improved in a future pass (add Escape handler on the dialog div itself, not just the overlay)
|