{"id":45317548,"url":"https://github.com/litepacks/liteflow","last_synced_at":"2026-02-21T07:53:02.722Z","repository":{"id":291642543,"uuid":"973074285","full_name":"litepacks/liteflow","owner":"litepacks","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-15T20:04:55.000Z","size":879,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-16T00:57:32.276Z","etag":null,"topics":["experimental","nodejs","sqlite3","workflow-engine","workflow-tracking"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/litepacks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-04-26T07:43:57.000Z","updated_at":"2026-02-15T20:04:59.000Z","dependencies_parsed_at":"2025-05-05T20:26:41.869Z","dependency_job_id":"2bff9dfe-5880-47cb-9423-a3d262f4d6a1","html_url":"https://github.com/litepacks/liteflow","commit_stats":null,"previous_names":["litepacks/liteflow"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/litepacks/liteflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litepacks%2Fliteflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litepacks%2Fliteflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litepacks%2Fliteflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litepacks%2Fliteflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/litepacks","download_url":"https://codeload.github.com/litepacks/liteflow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litepacks%2Fliteflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29676856,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T06:23:40.028Z","status":"ssl_error","status_checked_at":"2026-02-21T06:23:39.222Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["experimental","nodejs","sqlite3","workflow-engine","workflow-tracking"],"created_at":"2026-02-21T07:53:02.647Z","updated_at":"2026-02-21T07:53:02.715Z","avatar_url":"https://github.com/litepacks.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Liteflow\n\n\u003e ⚠️ **Experimental Package**: This package is currently under development and should not be used in production. The API may change.\n\nA lightweight workflow tracker for Node.js applications with multi-database support.\n\n## Features\n\n- Simple workflow management\n- Step tracking\n- Identifier-based workflow lookup\n- Workflow statistics\n- **CLI tool for real-time statistics monitoring**\n- **Advanced filtering** (name, status, date range, step, identifier)\n- **Multi-database support** (SQLite, PostgreSQL, MySQL)\n- **Batch insert architecture** for high-performance writes\n- TypeScript support\n- Async/await API\n- Bulk operations support\n- Performance optimizations\n- Centralized error handling\n- Graceful error recovery\n\n## Installation\n\n```bash\nnpm install liteflow\n```\n\n## Quick Start\n\n```typescript\nimport { Liteflow } from 'liteflow';\n\n// Initialize with a database path (SQLite)\nconst liteflow = new Liteflow('path/to/database.db');\nawait liteflow.init();\n\n// Start a new workflow - returns a WorkflowInstance\nconst workflow = liteflow.startWorkflow('test-workflow', [\n  { key: 'test', value: '123' }\n]);\n\n// Add steps to the workflow\nworkflow.addStep('step1', { data: 'test1' });\nworkflow.addStep('step2', { data: 'test2' });\n\n// Flush batch inserts (optional - done automatically)\nawait liteflow.flushBatchInserts();\n\n// Mark workflow as complete\nworkflow.complete();\n\n// Get workflow steps\nconst steps = await workflow.getSteps();\n\n// Clean up when done\nawait liteflow.destroy();\n```\n\n## Database Configuration\n\n### SQLite (Default)\n\n```typescript\n// Simple path (backward compatible)\nconst liteflow = new Liteflow('./database.db');\n\n// Or with config object\nconst liteflow = new Liteflow({\n  client: 'sqlite3',\n  connection: {\n    filename: './database.db'\n  },\n  useNullAsDefault: true\n});\n```\n\n### PostgreSQL\n\n```typescript\nconst liteflow = new Liteflow({\n  client: 'pg',\n  connection: {\n    host: 'localhost',\n    port: 5432,\n    user: 'username',\n    password: 'password',\n    database: 'mydb'\n  }\n});\n```\n\n### MySQL\n\n```typescript\nconst liteflow = new Liteflow({\n  client: 'mysql2',\n  connection: {\n    host: 'localhost',\n    port: 3306,\n    user: 'username',\n    password: 'password',\n    database: 'mydb'\n  }\n});\n```\n\n## Usage\n\n```typescript\nimport { Liteflow } from 'liteflow';\n\n// Initialize with a database path\nconst liteflow = new Liteflow('path/to/database.db');\nawait liteflow.init();\n\n// Start a new workflow - returns a WorkflowInstance\nconst workflow = liteflow.startWorkflow('test-workflow', [\n  { key: 'test', value: '123' }\n]);\n\n// Use the workflow instance methods directly\nworkflow.addStep('step1', { data: 'test1' });\nworkflow.addStep('step2', { data: 'test2' });\nworkflow.complete();\n\n// Or use the traditional API (still supported)\nconst workflowId = workflow.id; // Get the workflow ID\nliteflow.addStep(workflowId, 'step1', { data: 'test1' });\nliteflow.addStep(workflowId, 'step2', { data: 'test2' });\nliteflow.completeWorkflow(workflowId);\n\n// Batch insert multiple steps (more efficient)\nawait liteflow.addSteps(workflowId, [\n  { step: 'step3', data: { value: 3 } },\n  { step: 'step4', data: { value: 4 } },\n  { step: 'step5', data: { value: 5 } }\n]);\n\n// Manual flush of pending batch inserts\nawait liteflow.flushBatchInserts();\n\n// Get workflow by identifier\nconst foundWorkflow = await liteflow.getWorkflowByIdentifier('test', '123');\n\n// Get workflow steps\nconst steps = await workflow.getSteps(); // Using instance method\n// or\nconst stepsById = await liteflow.getSteps(workflowId); // Using traditional method\n\n// Get steps by identifier\nconst stepsByIdentifier = await liteflow.getStepsByIdentifier('test', '123');\n\n// Get workflow statistics\nconst stats = await liteflow.getWorkflowStats();\n\n// Get workflows with pagination and filtering\nconst workflows = await liteflow.getWorkflows({\n  status: 'completed',\n  page: 1,\n  pageSize: 10,\n  orderBy: 'started_at',\n  order: 'desc'\n});\n\n// Advanced filtering\nconst filtered = await liteflow.getWorkflows({\n  name: 'user-registration',       // Filter by name (partial match)\n  status: 'completed',             // Filter by status\n  startDate: '2026-01-01',         // Filter by start date\n  endDate: '2026-12-31',           // Filter by end date\n  step: 'validate-email',          // Filter by step name\n  identifier: { key: 'userId', value: '1001' } // Filter by identifier\n});\n\n// Delete a workflow\nconst deleted = await workflow.delete(); // Using instance method\n// or\nconst deletedById = await liteflow.deleteWorkflow(workflowId); // Using traditional method\nif (deleted) {\n  console.log('Workflow deleted successfully');\n}\n\n// Delete all workflows\nconst allDeleted = await liteflow.deleteAllWorkflows();\nif (allDeleted) {\n  console.log('All workflows deleted successfully');\n}\n\n// Attach additional identifiers\nawait liteflow.attachIdentifier('test', '123', { key: 'test2', value: '456' });\n\n// Get most frequent steps\nconst frequentSteps = await liteflow.getMostFrequentSteps(5);\n\n// Get average step duration\nconst stepDurations = await liteflow.getAverageStepDuration();\n\n// Clean up database connection\nawait liteflow.destroy();\n```\n\n## CLI Usage\n\nLiteflow includes a powerful CLI tool for monitoring workflow statistics in real-time.\n\n### Installation\n\nAfter installing the package, the CLI is available as `liteflow`:\n\n```bash\nnpm install -g liteflow\n# or use npx\nnpx liteflow stats --db ./path/to/database.db\n```\n\n### Commands\n\n#### `stats` - Display Workflow Statistics\n\nDisplay general workflow statistics with various filtering and monitoring options:\n\n```bash\n# Basic usage - show statistics\nliteflow stats --db ./liteflow.db\n\n# Show verbose output with workflow details\nliteflow stats --db ./liteflow.db --verbose\n\n# Filter by workflow status\nliteflow stats --db ./liteflow.db --status pending\nliteflow stats --db ./liteflow.db --status completed\nliteflow stats --db ./liteflow.db --status failed\n\n# Filter by identifier\nliteflow stats --db ./liteflow.db --key userId --value 1001\n\n# Filter by workflow name (partial match)\nliteflow stats --db ./liteflow.db --name user-registration\n\n# Filter by step name\nliteflow stats --db ./liteflow.db --step validate-email\n\n# Filter by date range\nliteflow stats --db ./liteflow.db --start-date 2026-01-01 --end-date 2026-12-31\n\n# Combine multiple filters\nliteflow stats --db ./liteflow.db --name user --status completed --step validate-email\n\n# Real-time monitoring (refreshes every 2 seconds)\nliteflow stats --db ./liteflow.db --watch\n\n# Real-time monitoring with custom interval (5 seconds)\nliteflow stats --db ./liteflow.db --watch --interval 5\n\n# Combine filters with real-time monitoring\nliteflow stats --db ./liteflow.db --status pending --watch --verbose\n```\n\n#### `list` - List Workflows\n\nList workflows with pagination, sorting and filtering:\n\n```bash\n# List all workflows\nliteflow list --db ./liteflow.db\n\n# List with pagination\nliteflow list --db ./liteflow.db --page 1 --page-size 20\n\n# List with sorting\nliteflow list --db ./liteflow.db --order-by started_at --order asc\n\n# List with filters\nliteflow list --db ./liteflow.db --status completed --name user\n```\n\n#### `watch` - Real-Time Monitoring\n\nDedicated real-time monitoring command with change detection:\n\n```bash\n# Start monitoring\nliteflow watch --db ./liteflow.db\n\n# Monitor with custom interval\nliteflow watch --db ./liteflow.db --interval 5\n\n# Monitor with filters\nliteflow watch --db ./liteflow.db --status pending --name order\n```\n\nThe watch command provides:\n- Real-time statistics with change indicators (+/- diffs)\n- New workflow detection alerts\n- Cycle counter for monitoring uptime\n- All filter options supported\n\n### CLI Options\n\n#### Common Options (all commands)\n\n- `-d, --db \u003cpath\u003e` - Path to database file (default: `./liteflow.db`)\n- `-s, --status \u003cstatus\u003e` - Filter by status (`pending`, `completed`, `failed`)\n- `-k, --key \u003ckey\u003e` - Filter by identifier key\n- `-v, --value \u003cvalue\u003e` - Filter by identifier value\n- `-n, --name \u003cpattern\u003e` - Filter by workflow name (partial match)\n- `--start-date \u003cdate\u003e` - Filter workflows started after this date (ISO 8601)\n- `--end-date \u003cdate\u003e` - Filter workflows started before this date (ISO 8601)\n- `--step \u003cstep-name\u003e` - Filter workflows containing this step\n- `--verbose` - Show detailed information including workflows and steps\n- `-h, --help` - Display help information\n\n#### Stats Options\n\n- `-w, --watch` - Enable real-time monitoring\n- `-i, --interval \u003cseconds\u003e` - Refresh interval for watch mode in seconds (default: `2`)\n\n#### List Options\n\n- `-p, --page \u003cnumber\u003e` - Page number (default: `1`)\n- `--page-size \u003cnumber\u003e` - Number of items per page (default: `20`)\n- `--order-by \u003cfield\u003e` - Order by field: `started_at`, `ended_at` (default: `started_at`)\n- `--order \u003cdirection\u003e` - Sort direction: `asc`, `desc` (default: `desc`)\n\n#### Watch Options\n\n- `-i, --interval \u003cseconds\u003e` - Refresh interval in seconds (default: `2`)\n\n### CLI Output\n\nThe CLI displays:\n\n1. **General Statistics**: Total workflows, completed, pending, failed counts, and average steps per workflow\n2. **Change Indicators** (watch mode): Shows +/- diffs between refresh cycles\n3. **Active Filters**: Displays currently active filter parameters\n4. **Workflow List** (with `--verbose` or filters): Detailed list of workflows with status, start time, and duration\n5. **Most Frequent Steps**: Top 5 most frequently executed steps across all workflows\n\n## API Reference\n\n### `Liteflow(config: string | LiteflowConfig, options?: { batchInsertDelay?: number })`\n\nCreates a new Liteflow instance.\n\n**Parameters:**\n- `config`: Database path (string) for SQLite, or configuration object for other databases\n- `options.batchInsertDelay`: Delay in milliseconds before flushing batch inserts (default: 100)\n\n**Example:**\n```typescript\n// SQLite with string path\nconst liteflow = new Liteflow('./database.db');\n\n// PostgreSQL with config\nconst liteflow = new Liteflow({\n  client: 'pg',\n  connection: {\n    host: 'localhost',\n    database: 'mydb',\n    user: 'user',\n    password: 'pass'\n  }\n});\n\n// Custom batch delay\nconst liteflow = new Liteflow('./database.db', { batchInsertDelay: 200 });\n```\n\n### `init(): Promise\u003cvoid\u003e`\n\nInitializes the database schema. Must be called before using other methods.\n\n### `destroy(): Promise\u003cvoid\u003e`\n\nCloses the database connection and flushes any pending batch inserts. Should be called when done using the instance.\n\n### Error Handling\n\nLiteflow implements a centralized error handling mechanism through the `wrap` function. This ensures that:\n\n- All database operations are wrapped in try-catch blocks\n- Errors are logged to the console\n- Operations return fallback values instead of throwing errors\n- System stability is maintained even when errors occur\n\nFallback values for different operations:\n- `getWorkflows`: `{ workflows: [], total: 0, page: 1, pageSize: 10, totalPages: 0 }`\n- `getSteps` and `getStepsByIdentifier`: `[]`\n- `getWorkflowStats`: `{ total: 0, completed: 0, pending: 0, avgSteps: 0 }`\n- `getMostFrequentSteps` and `getAverageStepDuration`: `[]`\n- `attachIdentifier`, `deleteWorkflow`, `deleteAllWorkflows`: `false`\n\n### `startWorkflow(name: string, identifiers: Identifier[]): WorkflowInstance`\n\nStarts a new workflow and returns a WorkflowInstance object that provides convenient instance methods.\n\n### Batch Insert Methods\n\n### `addSteps(workflowId: string | WorkflowInstance, steps: Array\u003c{ step: string, data: any }\u003e): Promise\u003cvoid\u003e`\n\nAdds multiple steps to a workflow in a single batch operation. More efficient than calling `addStep` multiple times.\n\n**Example:**\n```typescript\nawait liteflow.addSteps(workflowId, [\n  { step: 'step1', data: { value: 1 } },\n  { step: 'step2', data: { value: 2 } },\n  { step: 'step3', data: { value: 3 } }\n]);\n```\n\n### `flushBatchInserts(): Promise\u003cvoid\u003e`\n\nManually flushes any pending batch inserts to the database. Normally happens automatically after the configured delay, but can be called to ensure immediate persistence.\n\n**Example:**\n```typescript\nliteflow.addStep(workflowId, 'step1', { data: 'test' });\nawait liteflow.flushBatchInserts(); // Ensure step is persisted\n```\n\n### WorkflowInstance Methods\n\nThe `WorkflowInstance` returned by `startWorkflow` provides the following methods:\n\n- `workflow.id`: Get the workflow ID (string)\n- `workflow.addStep(step: string, data: any)`: Add a step to this workflow\n- `workflow.addSteps(steps: Array\u003c{ step: string, data: any }\u003e)`: Add multiple steps in batch (Promise)\n- `workflow.complete()`: Mark this workflow as completed\n- `workflow.fail(reason?: string)`: Mark this workflow as failed\n- `workflow.getSteps()`: Get all steps for this workflow (Promise)\n- `workflow.delete()`: Delete this workflow (Promise)\n\n### `addStep(workflowId: string | WorkflowInstance, step: string, data: any): void`\n\nAdds a step to a workflow. Steps are queued and inserted in batches for performance. Accepts either a workflow ID string or a WorkflowInstance.\n\n### `completeWorkflow(workflowId: string | WorkflowInstance): void`\n\nMarks a workflow as completed. Accepts either a workflow ID string or a WorkflowInstance.\n\n### `getWorkflowByIdentifier(key: string, value: string): Promise\u003cWorkflow | undefined\u003e`\n\nRetrieves a workflow by its identifier.\n\n### `getSteps(workflowId: string): Promise\u003cWorkflowStep[]\u003e`\n\nGets all steps for a workflow.\n\n### `getStepsByIdentifier(key: string, value: string): Promise\u003cWorkflowStep[]\u003e`\n\nGets all steps for workflows matching the given identifier key and value.\n\n### `getWorkflowStats(): Promise\u003cWorkflowStats\u003e`\n\nReturns workflow statistics.\n\n### `attachIdentifier(existingKey: string, existingValue: string, newIdentifier: Identifier): Promise\u003cboolean\u003e`\n\nAttaches a new identifier to an existing workflow. Returns true if successful, false if the workflow doesn't exist or if the identifier already exists.\n\n### `getMostFrequentSteps(limit?: number): Promise\u003c{ step: string, count: number }[]\u003e`\n\nReturns the most frequent steps across all workflows, limited by the specified number.\n\n### `getAverageStepDuration(): Promise\u003c{ workflow_id: string, total_duration: number, step_count: number }[]\u003e`\n\nReturns average step duration for workflows.\n\n### `getWorkflows(options?: GetWorkflowsOptions): Promise\u003c{ workflows: Workflow[], total: number, page: number, pageSize: number, totalPages: number }\u003e`\n\nRetrieves workflows with pagination, filtering and sorting options.\n\nOptions:\n- `status?: 'pending' | 'completed' | 'failed'` - Filter by workflow status\n- `page?: number` - Page number (default: 1)\n- `pageSize?: number` - Items per page (default: 10)\n- `orderBy?: 'started_at' | 'ended_at'` - Field to sort by (default: 'started_at')\n- `order?: 'asc' | 'desc'` - Sort order (default: 'desc')\n- `identifier?: { key: string, value: string }` - Filter by identifier key and value\n- `name?: string` - Filter by workflow name (partial match / LIKE)\n- `startDate?: string` - Filter workflows started after this date (ISO 8601)\n- `endDate?: string` - Filter workflows started before this date (ISO 8601)\n- `step?: string` - Filter workflows that contain this step name\n\nAll filters are combined with AND logic when multiple are provided.\n\n**Example:**\n```typescript\n// Basic pagination\nconst result = await liteflow.getWorkflows({ page: 1, pageSize: 10 });\n\n// Filter by status\nconst completed = await liteflow.getWorkflows({ status: 'completed' });\n\n// Advanced filtering\nconst filtered = await liteflow.getWorkflows({\n  name: 'user',\n  status: 'completed',\n  step: 'validate-email',\n  startDate: '2026-01-01',\n  endDate: '2026-12-31',\n  identifier: { key: 'userId', value: '1001' }\n});\n```\n\n### `deleteWorkflow(workflowId: string): Promise\u003cboolean\u003e`\n\nDeletes a workflow and all its steps. Returns true if the workflow was deleted successfully, false if the workflow doesn't exist or if there was an error.\n\n### `deleteAllWorkflows(): Promise\u003cboolean\u003e`\n\nDeletes all workflows and their steps. Returns true if the operation was successful, false if there was an error.\n\n## Types\n\n```typescript\ninterface LiteflowConfig {\n  client: 'sqlite3' | 'pg' | 'mysql' | 'mysql2';\n  connection: string | {\n    host?: string;\n    port?: number;\n    user?: string;\n    password?: string;\n    database?: string;\n    filename?: string;\n  };\n  useNullAsDefault?: boolean;\n}\n\ninterface Identifier {\n  key: string;\n  value: string;\n}\n\ninterface Workflow {\n  id: string;\n  name: string;\n  identifiers: string;\n  status: 'pending' | 'completed' | 'failed';\n  started_at: string;\n  ended_at?: string;\n}\n\ninterface WorkflowStep {\n  id: string;\n  workflow_id: string;\n  step: string;\n  data: string;\n  created_at: string;\n}\n\ninterface WorkflowStats {\n  total: number;\n  completed: number;\n  pending: number;\n  avgSteps: number;\n}\n\ninterface GetWorkflowsOptions {\n  status?: 'pending' | 'completed' | 'failed';\n  page?: number;\n  pageSize?: number;\n  orderBy?: 'started_at' | 'ended_at';\n  order?: 'asc' | 'desc';\n  identifier?: {\n    key: string;\n    value: string;\n  };\n  name?: string;\n  startDate?: string;\n  endDate?: string;\n  step?: string;\n}\n```\n\n## Performance\n\n### Batch Insert Architecture\n\nLiteflow uses an automatic batch insert system for workflow steps:\n\n- **Automatic Batching**: Steps added with `addStep()` are queued and inserted in batches\n- **Configurable Delay**: Default 100ms delay before flushing (configurable via constructor)\n- **Manual Control**: Use `flushBatchInserts()` for immediate persistence\n- **Explicit Batching**: Use `addSteps()` for bulk operations\n\n**Performance Benefits:**\n- Reduces database round trips\n- Improves throughput for high-volume workflows\n- Maintains ACID guarantees\n\n**Example:**\n```typescript\n// Automatic batching (100ms delay)\nworkflow.addStep('step1', { data: 1 });\nworkflow.addStep('step2', { data: 2 });\n// Steps will be inserted together after 100ms\n\n// Manual flush for immediate persistence\nawait liteflow.flushBatchInserts();\n\n// Explicit batch insert\nawait liteflow.addSteps(workflowId, [\n  { step: 'step1', data: { value: 1 } },\n  { step: 'step2', data: { value: 2 } }\n]);\n```\n\n## Migration Guide\n\n### Upgrading from 1.0.x to 2.0.x\n\nThe main change is that all database methods are now asynchronous. Add `await` to all method calls:\n\n```typescript\n// Before (1.0.x)\nconst liteflow = new Liteflow('./database.db');\nliteflow.init();\nconst steps = liteflow.getSteps(workflowId);\nconst stats = liteflow.getWorkflowStats();\n\n// After (2.0.x)\nconst liteflow = new Liteflow('./database.db');\nawait liteflow.init();\nconst steps = await liteflow.getSteps(workflowId);\nconst stats = await liteflow.getWorkflowStats();\n\n// Don't forget to clean up\nawait liteflow.destroy();\n```\n\n**Key Changes:**\n1. All database methods return Promises (use `await`)\n2. `init()` is now async\n3. New `destroy()` method for cleanup\n4. New batch insert methods (`addSteps`, `flushBatchInserts`)\n5. Multi-database support (SQLite, PostgreSQL, MySQL)\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/indatawetrust/liteflow.git\ncd liteflow\nnpm install\n```\n\n### Testing\n\nTests are powered by [Vitest](https://vitest.dev/).\n\n```bash\n# Run tests once\nnpm test\n\n# Run tests in watch mode\nnpm run test:watch\n```\n\n### Benchmarking\n\n```bash\nnpm run benchmark\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitepacks%2Fliteflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flitepacks%2Fliteflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitepacks%2Fliteflow/lists"}