open-index/open-npm huggingface dataset:
npm package: @heilbaum/heilbaum-ionic-blur-change
Description: Ionic 2 directive to detect changes on input blur and emits an event
Author: Jonathan Heilmann
Latest version: 0.1.0

# @heilbaum/heilbaum-ionic-blur-change
`@heilbaum/heilbaum-ionic-blur-change` provides an Ionic 2 directive to detect changes on input blur and emits an event.

## Example
See [demo.heilbaum.de/heilbaum-ionic-blur-change/](https://demo.heilbaum.de/heilbaum-ionic-blur-change/)

## Installation
1. Install via npm
    npm install @heilbaum/heilbaum-ionic-blur-change --save
2. Add `BlurChangeModule` to `src/app/app.modules.ts`
    ```typescript
    @NgModule({
     imports: [
         BlurChangeModule
     ]
    })
    ```

## Usage
Add `(blurChange)` attribute to `ion-input` component assigning a method to be called on
blurChange.  
`(blurChange)` passes an object `$event` of type `BlurChangeEvent` containing 
properties `oldValue` and `newValue`.

Example:
```html
<ion-input id="someInput"
           name="someInput"
           placeholder="Some input"
           type="text"
           value="Some input"
           (blurChange)="onBlurChange($event)">
</ion-input>
```

## Contribute
Having trouble, found a bug or got some improvements?  
You are welcome to create an issue on [GitHub](https://github.com/jonathanheilmann/heilbaum-ionic-blur-change) or submit
a pull-request.

## License
MIT License

Copyright (c) 2017 HeilBaum (Carsten Baumhögger & Jonathan Heilmann)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
npm package: @heilgar/file-storage-adapter-core
Description: Core types and interfaces for storage adapters
Author: Oleh Hrebeniuk
Latest version: 1.0.4

# File Storage Adapter Core

Interfaces and base adapter helpers for storage providers.

## Install

```sh
npm install @heilgar/file-storage-adapter-core
```

## Usage

```ts
import type { FileStorageAdapter, FileStorageAdapterConfig } from '@heilgar/file-storage-adapter-core';
import { BaseAdapter } from '@heilgar/file-storage-adapter-core';
```

## Configuration

**Base config type:**
```ts
interface FileStorageAdapterConfig {
  basePath?: string;  // Optional prefix for all keys
}
```

All adapter implementations extend this base configuration.

## API

The core package exports the `FileStorageAdapter` interface and `BaseAdapter`
helper. Implementations should provide:

- `upload`, `download`, `getMetadata`, `delete`, `exists`, `list`
- `getSignedUrl`, `getSignedUrlUpload`
- `copy`, `move`

### FileStorageAdapter Interface

```ts
interface FileStorageAdapter {
  upload(key: string, file: Buffer | NodeJS.ReadableStream | File, options?: UploadOptions): Promise<FileMetadata>;
  download(key: string, options?: DownloadOptions): Promise<FileObject>;
  getMetadata(key: string): Promise<FileMetadata | null>;
  delete(key: string): Promise<boolean>;
  exists(key: string): Promise<boolean>;
  list(options?: ListOptions): Promise<ListResult>;
  getSignedUrl(key: string, options: SignedUrlOptions): Promise<string>;
  getSignedUrlUpload(key: string, options: SignedUrlOptions): Promise<SignedUrlUploadResult>;
  copy(sourceKey: string, destinationKey: string): Promise<FileMetadata>;
  move(sourceKey: string, destinationKey: string): Promise<FileMetadata>;
}
```
npm package: @heilgar/file-storage-adapter-fs
Description: Filesystem storage adapter
Author: Oleh Hrebeniuk
Latest version: 1.0.4

# File Storage Adapter FS

Filesystem implementation of the file storage adapter.

## Install

```sh
npm install @heilgar/file-storage-adapter-fs
```

## Usage

```ts
import { FsAdapter } from '@heilgar/file-storage-adapter-fs';

const adapter = new FsAdapter({
  rootDir: '/tmp/storage',      // required: root directory for file storage
  basePath: 'uploads',           // optional: prefix for all keys
  baseUrl: 'https://files.example.com', // optional: base URL for getSignedUrl
});

const metadata = await adapter.upload('images/logo.png', Buffer.from('...'));
const file = await adapter.download('images/logo.png');
const list = await adapter.list({ prefix: 'images' });
const url = await adapter.getSignedUrl('images/logo.png', { expiresIn: 3600 });
```

## Configuration

**Config type:**
```ts
interface FsAdapterConfig {
  rootDir: string;    // Root directory for file storage
  basePath?: string;  // Optional prefix for all keys
  baseUrl?: string;   // Optional base URL for public access (required for getSignedUrl)
}
```

## Notes

- Files are stored in the local filesystem at `rootDir`
- Metadata is stored alongside files in `.meta.json` files
- `basePath` (optional) prefixes all keys
- `baseUrl` (optional) enables `getSignedUrl` as a public URL
- Signed upload URLs are not supported
npm package: @heilgar/file-storage-adapter-s3
Description: S3 storage adapter
Author: Your Name
Latest version: 1.0.1

# File Storage Adapter S3

S3-compatible storage implementation of the file storage adapter. Works with AWS S3, LocalStack, and other S3-compatible services.

## Install

```sh
npm install @heilgar/file-storage-adapter-s3
```

## Usage

```ts
import { S3Adapter } from '@heilgar/file-storage-adapter-s3';

const adapter = new S3Adapter({
  bucket: 'my-bucket',
  region: 'us-east-1',
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  },
  basePath: 'uploads',
});

const metadata = await adapter.upload('images/logo.png', Buffer.from('...'));
const file = await adapter.download('images/logo.png');
const list = await adapter.list({ prefix: 'images' });
const url = await adapter.getSignedUrl('images/logo.png', { expiresIn: 3600 });
```

## Configuration

**Config type:**
```ts
interface S3AdapterConfig {
  bucket: string;       // S3 bucket name
  region: string;       // AWS region
  basePath?: string;    // Optional prefix for all keys
  endpoint?: string;    // Optional custom endpoint (for LocalStack, MinIO, etc.)
  credentials?: {       // Optional AWS credentials
    accessKeyId: string;
    secretAccessKey: string;
  };
  forcePathStyle?: boolean; // Optional: use path-style URLs
}
```

**Required fields:**
- `bucket` - S3 bucket name
- `region` - AWS region

**Optional fields:**
- `credentials` - AWS credentials object with `accessKeyId` and `secretAccessKey`
- `endpoint` - Custom S3 endpoint (for LocalStack or S3-compatible services)
- `forcePathStyle` - Use path-style URLs instead of virtual-hosted-style (required for LocalStack)
- `basePath` - Prefix for all keys

## LocalStack Development

For local development and testing, you can use LocalStack:

```ts
const adapter = new S3Adapter({
  bucket: 'local-storage-bucket',
  region: 'us-east-1',
  endpoint: 'http://localhost:4566',
  credentials: {
    accessKeyId: 'dev',
    secretAccessKey: 'dev',
  },
  forcePathStyle: true,
});
```


## Notes

- Custom metadata values are stored as S3 object metadata (converted to strings)
- Signed URLs support both download (GetObject) and upload (PutObject) operations
- Pagination is supported via continuation tokens
- Range downloads allow fetching partial file content
npm package: @heilgar/file-storage-adapter-vercel-blob
Description: Vercel Blob storage adapter
Author: Your Name
Latest version: 1.0.3

# File Storage Adapter Vercel Blob

Vercel Blob implementation of the file storage adapter.

## Install

```sh
npm install @heilgar/file-storage-adapter-vercel-blob
```

## Usage

```ts
import { VercelBlobAdapter } from '@heilgar/file-storage-adapter-vercel-blob';

const adapter = new VercelBlobAdapter({
  token: process.env.BLOB_READ_WRITE_TOKEN, // required: Vercel Blob token
  basePath: 'uploads',                       // optional: prefix for all keys
});

const metadata = await adapter.upload('images/logo.png', Buffer.from('...'));
const file = await adapter.download('images/logo.png');
const list = await adapter.list({ prefix: 'images' });
const url = await adapter.getSignedUrl('images/logo.png', { expiresIn: 3600 });
```

## Configuration

**Config type:**
```ts
interface VercelBlobAdapterConfig {
  token: string;      // Vercel Blob read/write token
  basePath?: string;  // Optional prefix for all keys
}
```

## Notes

- `token` (required) is your Vercel Blob read/write token
- `basePath` (optional) prefixes all keys
- All files are uploaded with `public` access (private is not available)
- Range downloads are not supported
- Signed upload URLs are not supported - use `upload()` method directly
npm package: @heilgar/pest-cli
Description: Prompt Evaluation & Scoring Toolkit - CLI
Latest version: 0.0.5

# @heilgar/pest-cli

CLI for **pest** (Prompt Evaluation & Scoring Toolkit) — run LLM prompt tests from the command line. Shells out to Vitest or Jest, so your existing test config works out of the box.

## Features

- **`pest` command** — run prompt tests with a single command
- **Framework auto-detection** — detects Vitest or Jest in your project and delegates to it
- **QA generation** — `pest qa` generates test cases for your prompts using an LLM
- **Zero config** — works with your existing `vitest.config.ts` or `jest.config.ts`

## Install

```bash
npm install -g @heilgar/pest-cli
# or
npx @heilgar/pest-cli
```

## Usage

```bash
# Run all prompt tests
pest

# Generate QA test cases
pest qa
```

## Documentation

Full docs at [heilgar.github.io/pest](https://heilgar.github.io/pest/)

## License

MIT
npm package: @heilgar/pest-core
Description: Prompt Evaluation & Scoring Toolkit - Core library
Latest version: 0.0.5

# @heilgar/pest-core

Core library for **pest** (Prompt Evaluation & Scoring Toolkit) — a lightweight TypeScript framework for testing LLM prompts with familiar `expect()` matchers.

## Features

- **Multi-provider support** — OpenAI, Anthropic Claude, Google Gemini, xAI Grok, Ollama, and any OpenAI-compatible API
- **`send()` helper** — call any LLM provider with a consistent interface, including system prompts and tool definitions
- **Deterministic matchers** — `containsToolCall`, `callsToolsInOrder`, `matchesResponseSchema`, `containsText`, `hasToolCallCount`, `respondsWithinTokens`
- **LLM-judged matchers** — `satisfiesCriteria`, `matchesSemanticMeaning`, `classifiedAs`, `doesNotDisclose`
- **Consistency testing** — `assertConsistent` for verifying response stability across multiple runs
- **Schema validation** — validate LLM responses against JSON schemas using valibot, with optional zod support
- **Zero global state** — explicit provider passing, no singletons

## Install

```bash
npm install @heilgar/pest-core
```

## Usage

```typescript
import { send, createProvider } from '@heilgar/pest-core';

const provider = createProvider({ type: 'openai', model: 'gpt-4o', apiKey: '...' });
const response = await send(provider, 'Hello', { systemPrompt: 'You are a helpful assistant.' });
```

Use with `@heilgar/pest-vitest`, `@heilgar/pest-jest`, or `@heilgar/pest-playwright` for test framework integration.

## Documentation

Full docs at [heilgar.github.io/pest](https://heilgar.github.io/pest/)

## License

MIT
npm package: @heilgar/pest-jest
Description: Prompt Evaluation & Scoring Toolkit - Jest integration
Latest version: 0.0.5

# @heilgar/pest-jest

Jest integration for **pest** (Prompt Evaluation & Scoring Toolkit) — add LLM prompt testing to your Jest test suite with custom `expect()` matchers.

## Features

- **Custom Jest matchers** — `expect(response).toContainToolCall(...)`, `expect(response).toSatisfyCriteria(...)`, and more via `expect.extend()`
- **LLM-as-judge** — use a powerful model to score responses against plain-language criteria
- **Deterministic + semantic assertions** — verify tool calls, response schemas, text content, and semantic meaning
- **Custom reporter** — optional reporter for prompt test results
- **TypeScript support** — full type definitions for all matchers

## Install

```bash
npm install @heilgar/pest-jest @heilgar/pest-core
```

## Quick Start

```typescript
// jest.config.ts
export default {
  setupFilesAfterFramework: ['@heilgar/pest-jest/setup'],
};
```

```typescript
// tests/prompt.test.ts
import { send, createProvider } from '@heilgar/pest-core';
import { setJudge } from '@heilgar/pest-jest';

const provider = createProvider({ type: 'openai', model: 'gpt-4o', apiKey: '...' });
setJudge(provider);

test('responds helpfully', async () => {
  const res = await send(provider, 'Help me');
  await expect(res).toSatisfyCriteria('Response is helpful and friendly');
});
```

## Documentation

Full docs at [heilgar.github.io/pest](https://heilgar.github.io/pest/)

## License

MIT
npm package: @heilgar/pest-mcp
Description: Prompt Evaluation & Scoring Toolkit - MCP server testing
Latest version: 0.0.6

# @heilgar/pest-mcp

MCP (Model Context Protocol) server testing for **pest** (Prompt Evaluation & Scoring Toolkit) — test your MCP servers with tool discovery, execution validation, and LLM-driven end-to-end scenarios.

## Features

- **MCP tool discovery testing** — verify your server exposes the expected tools, resources, and prompts
- **Tool execution validation** — call MCP tools and assert on their responses with deterministic matchers
- **LLM + MCP end-to-end tests** — send prompts to an LLM with your MCP server connected, verify the LLM calls the right tools
- **QA generation** — automatically generate test cases for your MCP server using an LLM
- **Works with Vitest and Jest** — setup files for both test frameworks

## Install

```bash
npm install @heilgar/pest-mcp @heilgar/pest-core
```

## Quick Start

```typescript
// vitest.config.ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    setupFiles: ['@heilgar/pest-mcp/setup/vitest'],
  },
});
```

```typescript
// tests/mcp-server.test.ts
import { describe, test, expect } from 'vitest';
import { createMcpClient } from '@heilgar/pest-mcp';

describe('My MCP Server', () => {
  test('exposes expected tools', async () => {
    const client = await createMcpClient({ command: 'node', args: ['./dist/server.js'] });
    const tools = await client.listTools();
    expect(tools).toContainEqual(expect.objectContaining({ name: 'search' }));
  });
});
```

## Documentation

Full docs at [heilgar.github.io/pest](https://heilgar.github.io/pest/)

## License

MIT
npm package: @heilgar/pest-playwright
Description: Prompt Evaluation & Scoring Toolkit - Playwright integration
Latest version: 0.0.5

# @heilgar/pest-playwright

Playwright integration for **pest** (Prompt Evaluation & Scoring Toolkit) — add LLM-judged assertions to your Playwright E2E tests. Evaluate page content, element text, and AI-generated UI against semantic criteria.

## Features

- **LLM-judged Playwright assertions** — `expect(locator).toSatisfyCriteria('...')` works on strings and Playwright locators
- **Semantic page testing** — verify that AI-generated or dynamic content meets quality criteria using an LLM judge
- **Works with locators** — pass a Playwright `Locator` directly; pest extracts the text content automatically
- **Extends Playwright's `expect()`** — integrates naturally with Playwright's assertion API

## Install

```bash
npm install @heilgar/pest-playwright @heilgar/pest-core
```

## Quick Start

```typescript
// playwright.config.ts
import { pestSetup } from '@heilgar/pest-playwright/setup';

pestSetup({ judge: { type: 'openai', model: 'gpt-4o', apiKey: '...' } });
```

```typescript
// tests/page.spec.ts
import { test, expect } from '@playwright/test';

test('AI chatbot responds helpfully', async ({ page }) => {
  await page.goto('/chat');
  await page.fill('input', 'How do I reset my password?');
  await page.click('button[type=submit]');
  const response = page.locator('.chat-response');
  await expect(response).toSatisfyCriteria('Provides clear password reset instructions');
});
```

## Documentation

Full docs at [heilgar.github.io/pest](https://heilgar.github.io/pest/)

## License

MIT
npm package: @heilgar/pest-vitest
Description: Prompt Evaluation & Scoring Toolkit - Vitest integration
Latest version: 0.0.5

# @heilgar/pest-vitest

Vitest integration for **pest** (Prompt Evaluation & Scoring Toolkit) — add LLM prompt testing to your Vitest test suite with custom `expect()` matchers.

## Features

- **Custom Vitest matchers** — `expect(response).toContainToolCall(...)`, `expect(response).toSatisfyCriteria(...)`, and more via `expect.extend()`
- **LLM-as-judge** — use a powerful model to score responses against plain-language criteria
- **Deterministic + semantic assertions** — verify tool calls, response schemas, text content, and semantic meaning
- **Vitest plugin & reporter** — optional plugin for automatic setup and a custom reporter for prompt test results
- **TypeScript-native** — full type safety and IDE autocomplete for all matchers

## Install

```bash
npm install @heilgar/pest-vitest @heilgar/pest-core
```

## Quick Start

```typescript
// vitest.config.ts
import { pestPlugin } from '@heilgar/pest-vitest/plugin';

export default defineConfig({
  plugins: [pestPlugin()],
});
```

```typescript
// tests/prompt.test.ts
import { send, createProvider } from '@heilgar/pest-core';
import { setJudge } from '@heilgar/pest-vitest';

const provider = createProvider({ type: 'openai', model: 'gpt-4o', apiKey: '...' });
setJudge(provider);

test('responds helpfully', async () => {
  const res = await send(provider, 'Help me');
  await expect(res).toSatisfyCriteria('Response is helpful and friendly');
});
```

## Documentation

Full docs at [heilgar.github.io/pest](https://heilgar.github.io/pest/)

## License

MIT