Files
SwipeAnything/adapters/registry.js
T
ilia 0c9919f93c Add second adapter, thumbnails, a11y pass, and a real test suite
- Immich adapter (adapters/immich.js): swipe a self-hosted photo library
  over its REST API, proving the adapter contract works for remote
  sources, not just the filesystem.
- Refactor the preview contract from resolvePreviewPath() to
  streamPreview()/streamThumbnail(), so adapters can serve previews from
  anywhere (local file, proxied fetch, etc).
- macOS Quick Look-backed thumbnail cache (lib/thumbnails.js): real
  resized thumbnails, HEIC/HEIF, and video poster frames, with a hard
  timeout and graceful fallback to the original file everywhere else.
- Native "Browse..." folder picker (osascript) in Settings, with manual
  typing as the fallback on other platforms.
- Confirm-guarded "Empty trash" action -- the only place this project
  permanently deletes anything.
- Session resume: progress now survives a server restart and an
  unchanged Rescan via .swipeanything-session.json.
- Accessibility pass: live region item announcements, aria-labels on
  action buttons, focus-trapped shortcuts dialog with focus restore,
  visible focus rings, a real role="progressbar", and <button>s instead
  of <a href="#"> in the header.
- node:test suite (23 tests) covering the folder adapter, the Immich
  adapter (mocked fetch, no live server needed), and the HTTP API
  end-to-end; wired up as `npm test`.
- Also includes the keyboard shortcuts (up/down undo/skip), swipe stamps,
  and shortcuts modal from the previous session that hadn't been
  committed yet.
2026-07-25 19:41:47 -04:00

27 lines
660 B
JavaScript

'use strict';
const { FolderAdapter } = require('./folder');
const { ImmichAdapter } = require('./immich');
// Register new adapters here. See CONTRIBUTING.md for the full guide.
const ADAPTERS = {
[FolderAdapter.id]: FolderAdapter,
[ImmichAdapter.id]: ImmichAdapter,
};
function getAdapter(id) {
return ADAPTERS[id];
}
function listAdapters() {
return Object.values(ADAPTERS).map((AdapterClass) => ({
id: AdapterClass.id,
label: AdapterClass.label,
description: AdapterClass.description,
configSchema: AdapterClass.configSchema,
actions: AdapterClass.actions,
}));
}
module.exports = { ADAPTERS, getAdapter, listAdapters };