@slugkit/sdk
Version:
SlugKit SDK for JavaScript/TypeScript applications
209 lines (161 loc) • 5.91 kB
Markdown
# SlugKit SDK
A TypeScript SDK for generating human-readable IDs using SlugKit patterns.
## Features
- **Pattern Parsing**: Parse and validate SlugKit patterns using the EBNF grammar
- **ID Generation**: Generate random slugs from patterns
- **Dictionary Management**: Fetch dictionary statistics and tags
- **Type Safety**: Full TypeScript support with comprehensive type definitions
## Installation
```bash
npm install @slugkit/sdk
```
## Usage
### Basic Setup
```typescript
import { SlugKit } from '@slugkit/sdk';
// Create a SlugKit instance with API key (recommended for MCP servers)
const slugkit = SlugKit.fromApiKey('https://your-backend.com', 'your-api-key');
// Or create from JWK for SDK authentication
const slugkit = await SlugKit.fromJwk('https://your-backend.com', 'your-sdk-slug', jwkObject);
// Or use automatic key fetching from backend
const slugkit = await SlugKit.fromBackend('https://your-backend.com', 'your-sdk-slug');
```
### Pattern Parsing
```typescript
import { PatternParser } from '@slugkit/sdk';
// Parse a pattern
const parsed = PatternParser.parse('{noun} {adjective}');
console.log(parsed.elements); // Array of pattern elements
// Validate a pattern without throwing
const isValid = PatternParser.validate('{noun}');
console.log(isValid); // true/false
```
### Dictionary Management
```typescript
// Get dictionary statistics (cached after first call)
const stats = await slugkit.getDictionaries();
console.log(stats);
// [
// { kind: 'noun', lang: 'en', word_count: 1000, tag_count: 15 },
// { kind: 'adjective', lang: 'en', word_count: 500, tag_count: 12 }
// ]
// Get dictionary tags (cached after first call)
const tags = await slugkit.getDictionaryTags();
console.log(tags);
// [
// {
// kind: 'noun',
// tag: 'formal',
// description: 'Formal language',
// opt_in: true,
// word_count: 100
// }
// ]
// Force fresh data (bypass cache)
const freshStats = await slugkit.fetchDictionaries();
const freshTags = await slugkit.fetchDictionaryTags();
```
### ID Generation
```typescript
// Generate random slugs using forge
const slugs = await slugkit.forgeSlugs('{noun}', 5);
console.log(slugs); // Array of 5 random nouns
// Generate with seed for reproducible results
const deterministicSlugs = await slugkit.forgeSlugs('{noun}', 3, 'my-seed');
// Generate with sequence offset
const offsetSlugs = await slugkit.forgeSlugs('{noun}', 2, undefined, 100);
// Mint slugs from a series (if available)
const mintedSlugs = await slugkit.mintSlugs('my-series', 5);
// Slice slugs (dry-run preview)
const slicedSlugs = await slugkit.sliceSlugs('my-series', 3, 1000, 0);
// Get pattern info (includes capacity and more details)
const patternInfo = await slugkit.getPatternInfo('{noun}');
console.log(patternInfo.capacity); // Number of possible combinations
console.log(patternInfo.max_slug_length); // Maximum length of generated slugs
console.log(patternInfo.complexity); // Pattern complexity score
console.log(patternInfo.components); // Number of components in pattern
```
## API Reference
### PatternParser
- `parse(pattern: string): ParsedPattern` - Parse a pattern string
- `validate(pattern: string): boolean` - Validate a pattern without throwing
### SlugKit
#### Static Factory Methods
- `SlugKit.fromApiKey(backend: string, apiKey: string): SlugKit` - Create instance with API key
- `SlugKit.fromJwk(backend: string, sdkSlug: string, jwk: JsonWebKey): Promise<SlugKit>` - Create from JWK
- `SlugKit.fromBackend(backend: string, sdkSlug: string): Promise<SlugKit>` - Create with auto key fetching
#### Dictionary Methods
- `getDictionaries(): Promise<DictionaryStats[]>` - Get dictionary statistics (cached)
- `getDictionaryTags(): Promise<DictionaryTag[]>` - Get dictionary tags (cached)
- `fetchDictionaries(): Promise<DictionaryStats[]>` - Get dictionary statistics (fresh)
- `fetchDictionaryTags(): Promise<DictionaryTag[]>` - Get dictionary tags (fresh)
#### Generation Methods
- `forgeSlugs(pattern: string, count: number, seed?: string, sequence?: number): Promise<string[]>` - Generate random slugs
- `mintSlugs(seriesSlug?: string, count: number, batchSize?: number): Promise<string[]>` - Mint from series
- `sliceSlugs(seriesSlug?: string, count: number, batchSize?: number, sequence?: number): Promise<string[]>` - Slice preview
- `getPatternInfo(pattern: string): Promise<PatternInfo>` - Get pattern analysis
## Types
### DictionaryStats
```typescript
interface DictionaryStats {
kind: string;
lang: string;
word_count: number;
tag_count: number;
}
```
### DictionaryTag
```typescript
interface DictionaryTag {
kind: string;
tag: string;
description: string;
opt_in: boolean;
word_count: number;
}
```
### PatternInfo
```typescript
interface PatternInfo {
pattern: string;
capacity: string;
max_slug_length: number;
complexity: number;
components: number;
}
```
## Pattern Grammar
The SDK supports the full SlugKit EBNF grammar for patterns:
- **Selectors**: `{noun@en:+formal -nsfw >3,case=lower}`
- **Number Generators**: `{number:5,hex}` or `{number:5d}`
- **Special Characters**: `{special:3-5}`
- **Global Settings**: `[@en +formal >3,case=lower]`
## Error Handling
The SDK provides comprehensive error handling:
```typescript
try {
const result = await slugkit.getDictionaries();
} catch (error) {
if (error.message.includes('Authentication failed')) {
// Handle auth errors - may trigger automatic key refresh
} else if (error.message.includes('Network error')) {
// Handle network errors
} else if (error.message.includes('Rate limit')) {
// Handle rate limiting
}
}
// Pattern validation errors
try {
const info = await slugkit.getPatternInfo('{invalid-pattern}');
} catch (error) {
console.log('Pattern validation failed:', error.message);
}
```
## Testing
```bash
npm test
```
## Building
```bash
npm run build
```