110 lines
2.9 KiB
Markdown
110 lines
2.9 KiB
Markdown
# ts-pykeepass-wrapper
|
|
|
|
TypeScript wrapper around `pykeepass` for reading and modifying KeePass `.kdbx` files.
|
|
|
|
## Overview
|
|
|
|
This project uses:
|
|
- TypeScript as the public API
|
|
- Python as the runtime backend
|
|
- `pykeepass` to read and update KeePass databases
|
|
|
|
The TypeScript layer launches a Python bridge per request and exchanges JSON through stdin/stdout.
|
|
|
|
## Requirements
|
|
|
|
- Node.js or Bun
|
|
- Python 3
|
|
- `pykeepass` installed in the Python environment used by the bridge (the project provides `bun run setup:python`)
|
|
- The bridge defaults to `.venv/bin/python3`, or you can override with `PYTHON_PATH`
|
|
|
|
## Python setup
|
|
|
|
Install `pykeepass` in the Python environment used by the bridge:
|
|
|
|
```bash
|
|
bun run setup:python
|
|
```
|
|
|
|
If you prefer manual installation:
|
|
|
|
```bash
|
|
python3 -m venv .venv && .venv/bin/pip install pykeepass
|
|
```
|
|
|
|
The bridge also works with a project-local virtual environment such as `.venv`.
|
|
|
|
## Usage
|
|
|
|
```ts
|
|
import { openKeePassDatabase } from "./src/keepass";
|
|
|
|
const db = openKeePassDatabase("tests/fixtures/data.kdbx", {
|
|
password: "123",
|
|
});
|
|
|
|
const entries = await db.listEntries();
|
|
console.log(entries);
|
|
```
|
|
|
|
## Example
|
|
|
|
Run the example using the bundled data fixture credentials:
|
|
|
|
```bash
|
|
bun run src/example.ts
|
|
```
|
|
|
|
## API
|
|
|
|
### `openKeePassDatabase(path, options)`
|
|
|
|
Creates a database wrapper.
|
|
|
|
#### Options
|
|
- `password`: KeePass master password
|
|
- `keyFile`: optional key file path
|
|
|
|
### `listEntries()`
|
|
Returns all entries in the database, with every entry field exposed by the bridge (`title`, `username`, `password`, `url`, `notes`, `groupPath`, `otp` when present).
|
|
|
|
### `findEntries(query)`
|
|
Finds entries by partial match and returns the full entry objects.
|
|
|
|
### `listGroups()`
|
|
Returns all groups, including their names and paths.
|
|
|
|
### `createEntry(entry)`
|
|
Creates a new entry in the target database and persists it immediately.
|
|
|
|
#### Entry input
|
|
- `title`: entry title
|
|
- `username`: optional username
|
|
- `password`: optional password
|
|
- `url`: optional URL
|
|
- `notes`: optional notes
|
|
- `groupPath`: optional target group path
|
|
|
|
### `createGroup(group)`
|
|
Creates a new group and persists it immediately.
|
|
|
|
#### Group input
|
|
- `name`: group name
|
|
- `path`: optional parent group path
|
|
|
|
### `save()`
|
|
Persists the current database state.
|
|
|
|
### `close()`
|
|
No-op for now.
|
|
|
|
## Notes
|
|
|
|
- The bridge currently launches a Python process per call.
|
|
- This is simple and robust for a first version.
|
|
- Errors from the Python bridge are propagated to the TypeScript API, including invalid or empty output.
|
|
- A persistent Python process can be added later if needed.
|
|
- Write operations currently open, modify, and save the database per command.
|
|
- Bundled fixtures include `tests/fixtures/data.kdbx` and `tests/fixtures/empty.kdbx`; the companion JSON file stores the password and expected content for tests/examples.
|
|
- Integration tests validate the bundled `data.kdbx` entry-by-entry and group-by-group against `tests/fixtures/data.kdbx.json`, and may skip cleanly when `pykeepass` is unavailable.
|