Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 19 additions & 15 deletions .github/workflows/npm-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ jobs:

- name: Install
run: |
pnpm install --prefer-offline --frozen-lockfile --ignore-scripts
pnpm install --filter . --prefer-offline --frozen-lockfile --ignore-scripts --config.engine-strict=false

- name: Test
run: |
Expand Down Expand Up @@ -289,7 +289,7 @@ jobs:
node-version: 24

- name: Install
run: pnpm install --prefer-offline --frozen-lockfile --ignore-scripts
run: pnpm install --filter . --prefer-offline --frozen-lockfile --ignore-scripts --config.engine-strict=false

- name: Check Publishing Status
id: publish-check
Expand Down Expand Up @@ -444,21 +444,25 @@ jobs:
- name: Create Release
if: steps.publish-check.outputs.should_publish == 'true'
id: create_release
uses: softprops/action-gh-release@v2 # zizmor: ignore[unpinned-uses]
with:
tag_name: ${{ steps.version.outputs.new_version }}
name: Release ${{ steps.version.outputs.new_version }}
body: |
Changes in this Release
${{ github.event_name == 'workflow_dispatch' && github.event.inputs.custom_message || github.event.pull_request.title }}

${{ github.event_name == 'pull_request' && format('For more details, see the [Pull Request]({0})', github.event.pull_request.html_url) || '' }}
draft: false
prerelease: false
make_latest: true
generate_release_notes: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NEW_VERSION: ${{ steps.version.outputs.new_version }}
EVENT_NAME: ${{ github.event_name }}
CUSTOM_MESSAGE: ${{ github.event.inputs.custom_message }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_URL: ${{ github.event.pull_request.html_url }}
run: |
BODY="Changes in this Release
${CUSTOM_MESSAGE:-$PR_TITLE}"
if [[ "$EVENT_NAME" == "pull_request" ]]; then
BODY="$BODY

For more details, see the [Pull Request]($PR_URL)"
fi
gh release create "$NEW_VERSION" \
--title "Release $NEW_VERSION" \
--notes "$BODY" \
--latest
Comment on lines +454 to +465

@coderabbitai coderabbitai Bot Mar 15, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Edge case: empty release body on workflow_dispatch without custom message.

When triggered via workflow_dispatch without a custom_message input, PR_TITLE is empty, resulting in release notes that just say "Changes in this Release" with no actual content.

Consider adding a fallback or making custom_message required for manual dispatches:

Proposed fix
              run: |
-                 BODY="Changes in this Release
-                 ${CUSTOM_MESSAGE:-$PR_TITLE}"
+                 DESCRIPTION="${CUSTOM_MESSAGE:-$PR_TITLE}"
+                 if [[ -z "$DESCRIPTION" ]]; then
+                     DESCRIPTION="Manual release"
+                 fi
+                 BODY="Changes in this Release
+                 $DESCRIPTION"
                  if [[ "$EVENT_NAME" == "pull_request" ]]; then
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/npm-publish.yml around lines 454 - 465, The release BODY
sometimes ends up empty when EVENT_NAME is "workflow_dispatch" and both
CUSTOM_MESSAGE and PR_TITLE are empty; update the logic that builds BODY
(variables BODY, CUSTOM_MESSAGE, PR_TITLE, EVENT_NAME) to provide a sensible
fallback for manual dispatches—e.g., if CUSTOM_MESSAGE is empty and EVENT_NAME
== "workflow_dispatch", set BODY to include the NEW_VERSION and recent commit
message or a default string like "No release notes provided" before calling gh
release create, or alternatively require the custom_message input for
workflow_dispatch by validating it and failing early with a clear message.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentionally not addressing — this is an edge case for manual workflow_dispatch without a custom message. Low priority and the release still creates fine with just the version tag.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jaysin586, understood — acknowledged and moving on.


- name: Publish
if: steps.publish-check.outputs.should_publish == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile
run: pnpm install --filter . --frozen-lockfile --config.engine-strict=false

- name: Run build
run: pnpm build
Expand Down
5 changes: 3 additions & 2 deletions .trunk/trunk.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@ lint:
paths:
- '**/worker-configuration.d.ts'
- convex/_generated/**
- '**/sitemap-manifest.json'
enabled:
- shellcheck@0.11.0
- shfmt@3.6.0
- actionlint@1.7.11
- checkov@3.2.506
- eslint@10.0.2
- checkov@3.2.508
- eslint@10.0.3
- git-diff-check
- markdownlint@0.48.0
- osv-scanner@2.3.3
Expand Down
35 changes: 18 additions & 17 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"type": "module",
"scripts": {
"build": "tsx ./scripts/fetch-github-stats.ts && node ./scripts/generate-sitemap-manifest.mjs && tsx ./scripts/generate-social-cards.ts && vite build",
"cf-typegen": "wrangler types && mv worker-configuration.d.ts src/",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"deploy": "npm run build && wrangler pages deploy",
Expand All @@ -19,48 +20,48 @@
"preview": "vite preview"
},
"dependencies": {
"@humanspeak/docs-kit": "github:humanspeak/docs-kit#2026.3.13",
"@humanspeak/docs-kit": "github:humanspeak/docs-kit#2026.3.18",
"@humanspeak/memory-cache": "workspace:*",
"github-slugger": "^2.0.0",
"runed": "^0.37.1"
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20260305.1",
"@eslint/compat": "^2.0.2",
"@cloudflare/workers-types": "^4.20260313.1",
"@eslint/compat": "^2.0.3",
"@eslint/js": "^10.0.1",
"@humanspeak/svelte-motion": "^0.1.31",
"@humanspeak/svelte-motion": "^0.1.32",
"@sveltejs/adapter-cloudflare": "^7.2.8",
"@sveltejs/kit": "^2.53.4",
"@sveltejs/vite-plugin-svelte": "^6.2.4",
"@sveltejs/kit": "^2.55.0",
"@sveltejs/vite-plugin-svelte": "^7.0.0",
"@tailwindcss/postcss": "^4.2.1",
"@tailwindcss/typography": "^0.5.19",
"@tailwindcss/vite": "^4.2.1",
"@typescript-eslint/eslint-plugin": "^8.56.1",
"@typescript-eslint/parser": "^8.56.1",
"@typescript-eslint/eslint-plugin": "^8.57.0",
"@typescript-eslint/parser": "^8.57.0",
"autoprefixer": "^10.4.27",
"chokidar-cli": "^3.0.0",
"eslint": "^10.0.2",
"eslint": "^10.0.3",
"eslint-config-prettier": "10.1.8",
"eslint-plugin-svelte": "3.15.0",
"eslint-plugin-svelte": "3.15.2",
"globals": "^17.4.0",
"@lucide/svelte": "^0.577.0",
"mdsvex": "^0.12.6",
"mdsvex": "^0.12.7",
"mode-watcher": "^1.1.0",
"prettier": "^3.8.1",
"prettier-plugin-organize-imports": "^4.3.0",
"prettier-plugin-sort-json": "^4.2.0",
"prettier-plugin-svelte": "^3.5.1",
"prettier-plugin-tailwindcss": "^0.7.2",
"shiki": "^4.0.1",
"svelte": "^5.53.7",
"svelte-check": "^4.4.4",
"shiki": "^4.0.2",
"svelte": "^5.53.12",
"svelte-check": "^4.4.5",
"tailwind-merge": "^3.5.0",
"tailwindcss": "^4.2.1",
"tsx": "^4.21.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.56.1",
"vite": "^7.3.1",
"wrangler": "^4.70.0"
"typescript-eslint": "^8.57.0",
"vite": "^8.0.0",
"wrangler": "^4.73.0"
},
"volta": {
"node": "24.13.0"
Expand Down
40 changes: 20 additions & 20 deletions docs/src/lib/sitemap-manifest.json
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
{
"/": "2026-03-05",
"/docs/api/cached-decorator": "2026-03-05",
"/docs/api/memory-cache": "2026-03-05",
"/docs/examples": "2026-03-05",
"/docs/examples/api-caching": "2026-03-05",
"/docs/examples/async-fetching": "2026-03-05",
"/docs/examples/computed-values": "2026-03-05",
"/docs/examples/configuration": "2026-03-05",
"/docs/examples/database-caching": "2026-03-05",
"/docs/examples/monitoring": "2026-03-05",
"/docs/examples/multi-tenant": "2026-03-05",
"/docs/examples/rate-limiting": "2026-03-05",
"/docs/examples/service-class": "2026-03-05",
"/docs/examples/sessions": "2026-03-05",
"/docs/getting-started": "2026-03-05",
"/examples": "2026-03-05",
"/examples/basic-cache": "2026-03-05",
"/examples/cache-statistics": "2026-03-05",
"/examples/lru-eviction": "2026-03-05",
"/examples/ttl-expiration": "2026-03-05"
"/": "2026-03-05",
"/docs/api/cached-decorator": "2026-03-09",
"/docs/api/memory-cache": "2026-03-05",
"/docs/examples": "2026-03-05",
"/docs/examples/api-caching": "2026-03-15",
"/docs/examples/async-fetching": "2026-03-15",
"/docs/examples/computed-values": "2026-03-15",
"/docs/examples/configuration": "2026-03-15",
"/docs/examples/database-caching": "2026-03-15",
"/docs/examples/monitoring": "2026-03-15",
"/docs/examples/multi-tenant": "2026-03-15",
"/docs/examples/rate-limiting": "2026-03-15",
"/docs/examples/service-class": "2026-03-15",
"/docs/examples/sessions": "2026-03-15",
"/docs/getting-started": "2026-03-09",
"/examples": "2026-03-05",
"/examples/basic-cache": "2026-03-05",
"/examples/cache-statistics": "2026-03-05",
"/examples/lru-eviction": "2026-03-05",
"/examples/ttl-expiration": "2026-03-05"
}
13 changes: 7 additions & 6 deletions docs/src/routes/docs/api/cached-decorator/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,8 @@ The decorator works seamlessly with async methods:

```typescript
class DataService {
@cached<Promise<Data>>()
@cached<Data>()
async loadData(id: string): Promise<Data> {
// The Promise is cached, not the resolved value
return await expensiveOperation(id)
}
}
Expand Down Expand Up @@ -254,18 +253,20 @@ service.process({ id: '123' }) // Cached
service.process({ id: '456' })
```

### Class Instance Scope
### Shared Cache Across Instances

Each class instance has its own cache. Different instances don't share cached values:
All instances of a class share the same cache for a given decorated method. The cache is created once per `@cached()` declaration, so calls with the same arguments return cached results regardless of which instance makes the call:

```typescript
const service1 = new UserService()
const service2 = new UserService()

await service1.getUser('123') // Cached in service1
await service2.getUser('123') // Executes again (different instance)
await service1.getUser('123') // Executes the method
await service2.getUser('123') // Returns cached result (shared cache)
```

This provides cross-instance deduplication — if multiple instances call the same method with the same arguments, the underlying function only executes once. Note that cache keys are based solely on arguments, with no per-instance discrimination.

### TypeScript Decorators

Make sure you have `experimentalDecorators: true` in your `tsconfig.json`:
Expand Down
2 changes: 1 addition & 1 deletion docs/src/routes/docs/api/cached-decorator/+page.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const load = () => ({
title: '@cached Decorator API - Memory Cache',
description:
'API reference for the @cached decorator that adds automatic caching to class methods.'
'API reference for the @cached decorator that adds automatic caching to class methods. Covers configuration options, cache key strategies, TTL settings, and usage examples in TypeScript.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/api/memory-cache/+page.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const load = () => ({
title: 'MemoryCache API - Memory Cache',
description:
'Complete API reference for the MemoryCache class including all methods, options, and configuration.'
'Complete API reference for the MemoryCache class including all methods, options, and configuration. Covers get, set, delete, clear, stats, TTL, LRU eviction, and event listeners.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/+page.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const load = () => ({
title: 'Usage Examples | Memory Cache',
description:
'Practical examples showing how to use Memory Cache for API caching, sessions, rate limiting, and more.'
'Practical examples showing how to use Memory Cache for API caching, session storage, rate limiting, database query caching, and more real-world TypeScript use cases.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/api-caching/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Cache API responses to reduce network requests
const seo = getSeoContext()
if (seo) {
seo.title = 'API Response Caching - Memory Cache'
seo.description = 'Cache API responses to reduce network requests and improve response times with @humanspeak/memory-cache'
seo.description = 'Cache API responses to reduce network requests and improve response times. Learn TTL-based expiration and cache invalidation patterns with @humanspeak/memory-cache.'
seo.ogTitle = 'API Response Caching'
seo.ogTagline = 'Reduce network requests with cached API responses.'
seo.ogFeatures = ['TTL Expiration', 'Hooks Monitoring', 'Type Safety', 'Zero Dependencies']
Expand Down
3 changes: 2 additions & 1 deletion docs/src/routes/docs/examples/api-caching/+page.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export const load = () => ({
title: 'API Caching | Examples | Memory Cache',
description: 'Cache API responses to reduce latency and external API calls with Memory Cache.'
description:
'Cache API responses to reduce latency and minimize external API calls with Memory Cache. Learn patterns for TTL-based expiration and automatic cache invalidation in TypeScript.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/async-fetching/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Cache expensive async operations with getOrSet
const seo = getSeoContext()
if (seo) {
seo.title = 'Async Fetching - Memory Cache'
seo.description = 'Cache expensive async operations with getOrSet in @humanspeak/memory-cache for thundering herd prevention'
seo.description = 'Cache expensive async operations with getOrSet for thundering herd prevention and request deduplication. Includes error handling patterns using @humanspeak/memory-cache.'
seo.ogTitle = 'Async Fetching'
seo.ogTagline = 'Cache async operations with getOrSet.'
seo.ogFeatures = ['getOrSet', 'Thundering Herd', 'Error Handling', 'Sync Fetchers']
Expand Down
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/async-fetching/+page.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const load = () => ({
title: 'Async Fetching | Examples | Memory Cache',
description:
'Cache async fetch results with automatic deduplication and stale-while-revalidate patterns.'
'Cache async fetch results with automatic request deduplication and thundering herd prevention using Memory Cache. Prevent redundant network calls in your TypeScript backend.'
Comment on lines 3 to +4

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Trim this fallback description to ≤170 chars.

Current copy is about 174 characters, so it still misses the PR’s SEO range.

✏️ Suggested edit
-        'Cache async fetch results with automatic request deduplication and thundering herd prevention using Memory Cache. Prevent redundant network calls in your TypeScript backend.'
+        'Cache async fetch results with request deduplication and thundering herd prevention using Memory Cache. Reduce redundant network calls in your TypeScript backend.'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
description:
'Cache async fetch results with automatic deduplication and stale-while-revalidate patterns.'
'Cache async fetch results with automatic request deduplication and thundering herd prevention using Memory Cache. Prevent redundant network calls in your TypeScript backend.'
description:
'Cache async fetch results with request deduplication and thundering herd prevention using Memory Cache. Reduce redundant network calls in your TypeScript backend.'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/routes/docs/examples/async-fetching/`+page.ts around lines 3 - 4,
The fallback description string in the description property (in +page.ts) is too
long; shorten it to 170 characters or fewer by trimming redundant words and
keeping the core message (cache async fetch results, request deduplication,
thundering herd prevention, Memory Cache, prevent redundant network calls) —
update the description value to a concise single-sentence version under 170
chars (e.g., remove "automatic" or "TypeScript backend" if needed) and verify
the final character count.

})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/computed-values/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Cache expensive computations
const seo = getSeoContext()
if (seo) {
seo.title = 'Computed Value Caching - Memory Cache'
seo.description = 'Cache expensive computations to avoid redundant processing with @humanspeak/memory-cache'
seo.description = 'Cache expensive computations to avoid redundant processing and speed up repeated calculations. Includes performance tracking and hooks monitoring with @humanspeak/memory-cache.'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Trim this meta description back under the 170-char target.

This copy is about 176 characters, so it still misses the SEO range called out in the PR.

✏️ Suggested edit
-      seo.description = 'Cache expensive computations to avoid redundant processing and speed up repeated calculations. Includes performance tracking and hooks monitoring with `@humanspeak/memory-cache`.'
+      seo.description = 'Cache expensive computations to avoid redundant work and speed up repeated calculations. Covers performance tracking and cache hooks with `@humanspeak/memory-cache`.'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
seo.description = 'Cache expensive computations to avoid redundant processing and speed up repeated calculations. Includes performance tracking and hooks monitoring with @humanspeak/memory-cache.'
seo.description = 'Cache expensive computations to avoid redundant work and speed up repeated calculations. Covers performance tracking and cache hooks with `@humanspeak/memory-cache`.'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/routes/docs/examples/computed-values/`+page.svx at line 11, The meta
description assigned to seo.description is 176 characters and exceeds the
170-char SEO target; shorten the string in seo.description to ≤170 characters by
removing or condensing nonessential words (e.g., drop "Includes" or "with
`@humanspeak/memory-cache`" or rephrase to "with `@humanspeak/memory-cache`" as
shorter alternate) so the resulting description stays under the 170-char limit
while preserving the core message about caching expensive computations,
performance tracking, and hooks monitoring.

seo.ogTitle = 'Computed Value Caching'
seo.ogTagline = 'Cache expensive computations efficiently.'
seo.ogFeatures = ['Deterministic Results', 'Performance Tracking', 'TTL Support', 'Hooks']
Expand Down
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/computed-values/+page.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const load = () => ({
title: 'Computed Values | Examples | Memory Cache',
description:
'Cache expensive computed values and derived data with automatic TTL-based refresh.'
'Cache expensive computed values and derived data with automatic memoization using Memory Cache. Avoid redundant calculations and improve performance in TypeScript applications.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/configuration/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Cache configuration that rarely changes
const seo = getSeoContext()
if (seo) {
seo.title = 'Configuration Cache - Memory Cache'
seo.description = 'Cache configuration that rarely changes for faster application startup with @humanspeak/memory-cache'
seo.description = 'Cache configuration that rarely changes for faster application startup. Covers force refresh, change detection, and TTL strategies with @humanspeak/memory-cache.'
seo.ogTitle = 'Configuration Cache'
seo.ogTagline = 'Cache config for faster startup.'
seo.ogFeatures = ['Force Refresh', 'Change Detection', 'TTL Support', 'Hooks']
Expand Down
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/configuration/+page.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const load = () => ({
title: 'Configuration | Examples | Memory Cache',
description:
'Configure Memory Cache with custom TTL, max size, eviction policies, and other options.'
'Configure Memory Cache with custom TTL durations, max size limits, LRU eviction policies, and advanced options to fine-tune caching behavior for your application.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/database-caching/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Cache expensive database queries with the @cached decorator
const seo = getSeoContext()
if (seo) {
seo.title = 'Database Query Caching - Memory Cache'
seo.description = 'Cache expensive database queries with the @cached decorator in @humanspeak/memory-cache'
seo.description = 'Cache expensive database queries with the @cached decorator to reduce latency and database load. Includes query monitoring and TTL examples with @humanspeak/memory-cache.'
seo.ogTitle = 'Database Query Caching'
seo.ogTagline = 'Cache expensive DB queries with @cached.'
seo.ogFeatures = ['@cached Decorator', 'Query Monitoring', 'TTL Expiration', 'Type Safety']
Expand Down
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/database-caching/+page.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const load = () => ({
title: 'Database Caching | Examples | Memory Cache',
description:
'Speed up database queries by caching results in memory with automatic invalidation.'
'Speed up database queries by caching results in memory with automatic TTL-based invalidation. Reduce database load and improve response times in your TypeScript application.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/monitoring/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Integrate with metrics and logging systems
const seo = getSeoContext()
if (seo) {
seo.title = 'Monitoring with Hooks - Memory Cache'
seo.description = 'Integrate @humanspeak/memory-cache with metrics and logging systems using hooks for observability'
seo.description = 'Integrate @humanspeak/memory-cache with DataDog, Prometheus, and custom logging systems. Use hooks to track hit rates, evictions, and cache health for observability.'
seo.ogTitle = 'Monitoring with Hooks'
seo.ogTagline = 'Integrate with metrics and logging systems.'
seo.ogFeatures = ['DataDog', 'Prometheus', 'Debug Logging', 'Hit Rate Dashboard']
Expand Down
3 changes: 2 additions & 1 deletion docs/src/routes/docs/examples/monitoring/+page.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export const load = () => ({
title: 'Monitoring | Examples | Memory Cache',
description: 'Monitor cache health with hit rates, memory usage, and performance metrics.'
description:
'Monitor cache health with hit rates, eviction counts, and performance metrics. Integrate Memory Cache with DataDog, Prometheus, or custom dashboards.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/multi-tenant/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Use prefix and wildcard deletion for multi-tenant applications
const seo = getSeoContext()
if (seo) {
seo.title = 'Multi-Tenant Cache Invalidation - Memory Cache'
seo.description = 'Use prefix and wildcard deletion for multi-tenant cache invalidation with @humanspeak/memory-cache'
seo.description = 'Use prefix and wildcard deletion for multi-tenant cache invalidation. Isolate tenant data with hierarchical keys and scoped cleanup using @humanspeak/memory-cache.'
seo.ogTitle = 'Multi-Tenant Invalidation'
seo.ogTagline = 'Prefix and wildcard deletion for multi-tenant apps.'
seo.ogFeatures = ['Prefix Deletion', 'Wildcard Patterns', 'Hierarchical Keys', 'Hooks']
Expand Down
3 changes: 2 additions & 1 deletion docs/src/routes/docs/examples/multi-tenant/+page.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export const load = () => ({
title: 'Multi-Tenant Caching | Examples | Memory Cache',
description: 'Implement isolated per-tenant caches with namespace support in Memory Cache.'
description:
'Implement per-tenant cache isolation using namespaced key prefixes in Memory Cache. Logically separate tenant data with scoped invalidation via prefix and wildcard deletion.'
})
2 changes: 1 addition & 1 deletion docs/src/routes/docs/examples/rate-limiting/+page.svx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Simple rate limiting using cache
const seo = getSeoContext()
if (seo) {
seo.title = 'Rate Limiting - Memory Cache'
seo.description = 'Implement simple rate limiting using cache TTL with @humanspeak/memory-cache'
seo.description = 'Implement simple rate limiting using cache TTL with @humanspeak/memory-cache. Includes Express middleware, configurable thresholds, and monitoring for API endpoint protection.'
seo.ogTitle = 'Rate Limiting'
seo.ogTagline = 'Simple rate limiting using cache TTL.'
seo.ogFeatures = ['TTL-Based', 'Express Middleware', 'Monitoring', 'Configurable']
Expand Down
3 changes: 2 additions & 1 deletion docs/src/routes/docs/examples/rate-limiting/+page.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export const load = () => ({
title: 'Rate Limiting | Examples | Memory Cache',
description: 'Implement simple rate limiting using Memory Cache with TTL-based sliding windows.'
description:
'Implement simple rate limiting using Memory Cache with TTL-based sliding windows. Protect your API endpoints from abuse without external dependencies like Redis in TypeScript.'
})
Loading
Loading