
Security News
November CVEs Fell 25% YoY, Driven by Slowdowns at Major CNAs
November CVE publications fell 25% YoY even as 2025 totals rose, showing how a few major CNAs can swing āglobalā counts and skew perceived risk.
@groundbrick/sveltekit-adapter
Advanced tools
SvelteKit integration adapter with API client, stores, hooks, analytics, and cookie consent system
SvelteKit integration adapter para o microframework TypeScript - fornece integração client-side com APIs Express, gerenciamento de estado reativo, autenticação JWT, hooks e sistema de consentimento de cookies.
npm install @groundbrick/sveltekit-adapter
npm install @sveltejs/kit svelte
// src/hooks.server.ts
import { sequence } from '@sveltejs/kit/hooks';
import { createSvelteKitHooks } from '@groundbrick/sveltekit-adapter';
const { hooks, handleError } = createSvelteKitHooks({
logger: {
logRequests: true,
logResponses: true,
includeHeaders: false,
excludePaths: ['/favicon.ico', '/robots.txt', '/health'],
context: 'my-app'
},
auth: {
tokenKey: 'auth_token',
publicPaths: ['/login', '/register', '/', '/api/public/*'],
redirectPath: '/login',
onAuthRequired: () => {
console.log('Authentication required');
}
},
errorHandler: {
logErrors: true,
context: 'my-app',
onError: (error, context) => {
// Custom error handling
console.error('App error:', error, context);
}
}
});
export const handle = sequence(...hooks);
export { handleError };
// src/lib/api.ts
import { createApiClient } from '@groundbrick/sveltekit-adapter';
export const apiClient = createApiClient({
baseUrl: 'http://localhost:3000/api',
timeout: 10000,
retries: 3,
defaultHeaders: {
'X-App-Version': '1.0.0',
'X-Client': 'sveltekit'
}
});
// src/routes/+layout.svelte
<script lang="ts">
import {
CookieConsent,
ConsentService,
createConsentAwareAnalytics
} from '@groundbrick/sveltekit-adapter/consent';
// Initialize consent service
const consentService = ConsentService.getInstance();
// Setup analytics with consent awareness
const analytics = createConsentAwareAnalytics(consentService, {
gaId: 'G-XXXXXXXXXX',
enableDebug: true
});
</script>
<!-- Your app content -->
<slot />
<!-- Cookie consent banner -->
<CookieConsent
theme="light"
position="bottom"
onConsentChange={(state) => {
console.log('Consent updated:', state);
}}
/>
// src/routes/+page.svelte
<script lang="ts">
import {
authStore,
apiStore,
isAuthenticated,
currentUser,
initializeStores
} from '@groundbrick/sveltekit-adapter';
// Initialize stores on app start
initializeStores();
// Reactive to authentication state
$: if ($isAuthenticated) {
console.log('User is logged in:', $currentUser);
}
</script>
{#if $isAuthenticated}
<h1>Welcome, {$currentUser?.name}!</h1>
{:else}
<a href="/login">Please log in</a>
{/if}
{#if $apiStore.loading}
<div class="spinner">Loading...</div>
{/if}
{#if $apiStore.error}
<div class="error">{$apiStore.error}</div>
{/if}
// Everything from client and hooks
import {
createApiClient,
authStore,
createSvelteKitHooks
} from '@groundbrick/sveltekit-adapter';
// Just client functionality
import {
ApiClient,
createApiClient,
authStore,
apiStore,
isAuthenticated,
currentUser,
isLoading,
currentError,
initializeStores,
clearErrors
} from '@groundbrick/sveltekit-adapter/client';
// Just hooks functionality
import {
createSvelteKitHooks,
createAuthHook,
createLoggerHook,
createErrorHandlerHook
} from '@groundbrick/sveltekit-adapter/hooks';
// Cookie consent system
import {
CookieConsent,
ConsentService,
createConsentAwareAnalytics,
GDPR_CONFIG,
CCPA_CONFIG
} from '@groundbrick/sveltekit-adapter/consent';
import { createApiClient } from '@groundbrick/sveltekit-adapter';
const client = createApiClient({
baseUrl: 'https://api.example.com',
timeout: 10000,
retries: 3
});
// GET request
const users = await client.get('/users');
// POST request with data
const newUser = await client.post('/users', {
name: 'John Doe',
email: 'john@example.com'
});
// Request with auth token
const profile = await client.get('/profile', {
headers: { Authorization: 'Bearer token' }
});
const client = createApiClient({
baseUrl: 'https://api.example.com',
timeout: 15000,
retries: 5,
retryDelay: 1000,
defaultHeaders: {
'Content-Type': 'application/json',
'X-API-Version': '2024-01-01'
},
interceptors: {
request: (config) => {
// Add timestamp to all requests
config.headers['X-Timestamp'] = new Date().toISOString();
return config;
},
response: (response) => {
// Log all successful responses
console.log('Response received:', response.status);
return response;
},
error: (error) => {
// Custom error handling
if (error.status === 401) {
// Redirect to login
window.location.href = '/login';
}
throw error;
}
}
});
The adapter provides secure authentication using HttpOnly cookies:
// src/hooks.server.ts
const { hooks, handleError } = createSvelteKitHooks({
auth: {
tokenKey: 'auth_token',
redirectPath: '/login',
publicPaths: [
'/login',
'/register',
'/',
'/landing',
'/api/*', // Allow API calls to pass through
'/favicon.ico',
'/robots.txt'
],
validateExpiration: true // Enable JWT expiration checking (default: true)
}
});
import {
ConsentService,
GDPR_CONFIG,
createConsentAwareAnalytics
} from '@groundbrick/sveltekit-adapter/consent';
// GDPR-compliant setup
const consentService = ConsentService.getInstance(GDPR_CONFIG);
// Analytics only loads with explicit consent
const analytics = createConsentAwareAnalytics(consentService, {
gaId: 'G-XXXXXXXXXX',
anonymizeIp: true
});
// Track events (respects consent automatically)
analytics.trackEvent({
action: 'button_click',
category: 'UI',
label: 'signup'
});
const customConfig = {
banner: {
title: 'šŖ Cookies',
message: 'We use cookies to improve your experience.',
acceptAllText: 'Accept All',
rejectAllText: 'Reject All'
},
categories: {
functional: {
required: true,
name: 'Essential',
description: 'Required for basic functionality'
},
analytics: {
required: false,
name: 'Analytics',
description: 'Help us improve our website'
}
}
};
const consentService = ConsentService.getInstance(customConfig);
import { authStore, isAuthenticated, currentUser } from '@groundbrick/sveltekit-adapter';
// Reactive authentication state
$: if ($isAuthenticated) {
console.log('User:', $currentUser);
}
// Login
authStore.login({
token: 'jwt-token',
user: { id: 1, name: 'John', email: 'john@example.com' }
});
// Logout
authStore.logout();
// Check if user has specific role
if ($currentUser?.roles?.includes('admin')) {
// Show admin content
}
import { apiStore, isLoading, currentError } from '@groundbrick/sveltekit-adapter';
// Loading states
$: if ($isLoading) {
// Show spinner
}
// Error handling
$: if ($currentError) {
// Show error message
console.error('API Error:', $currentError);
}
// Manual error clearing
apiStore.clearError();
import {
showSuccess,
showError,
showWarning,
showInfo,
clearAllNotifications,
useNavigationNotificationClear
} from '@groundbrick/sveltekit-adapter';
// Enable auto-clearing on navigation (add to your root layout)
useNavigationNotificationClear();
// Show different types of notifications
showSuccess('Data saved successfully!');
showError('Something went wrong!');
showWarning('This action cannot be undone!');
showInfo('New feature available!');
// With options
showSuccess('Operation complete!', {
title: 'Success',
duration: 3000,
persistent: false // won't clear on navigation if true
});
// Clear notifications
clearAllNotifications();
Add notification component to your layout:
<script>
import { useNavigationNotificationClear } from '@groundbrick/sveltekit-adapter';
import Notifications from '$lib/components/Notifications.svelte';
// Enable auto-clearing
useNavigationNotificationClear();
</script>
<main>
<slot />
</main>
<!-- Notifications -->
<Notifications />
// Configuração no hooks.server.ts
const loggerHook = createLoggerHook({
logRequests: true, // GET /api/users [timing: 245ms]
logResponses: true // GET /api/users 200 OK [duration: 245ms]
});
// Logs automƔticos no console/arquivo
// INFO: Incoming request { method: 'GET', url: '/api/users', duration: 245 }
// Contexto propagado automaticamente
const logger = createLogger().child('user-service');
// user-service: Processing user creation
// user-service: Database query completed
// user-service: User created successfully
// Metadados automƔticos em cada log
logger.info('User login', {
userId: 123,
ip: '192.168.1.1',
userAgent: 'Chrome/120.0',
timestamp: '2024-01-15T10:30:00Z',
requestId: 'req_abc123'
});
// Timing automƔtico de requests
const startTime = Date.now();
await apiClient.get('/heavy-endpoint');
// Log: Request completed { duration: 1247ms, status: 200 }
// Timing de hooks
// Log: Request processed { url: '/dashboard', duration: 89ms }
@groundbrick/logger - Sistema de logging@sveltejs/kit - SvelteKit framework (^2.0.0)svelte - Svelte framework (^5.0.0)MIT
During the package build we copy some source assets (for example, .svelte components) from src/ into the published dist/ folder. This is handled by the script scripts/copy-assets.js which runs after tsc in the package build script.
Why: some modules are intentionally re-exported as source Svelte components (for example analytics/components/GoogleAnalytics.svelte). The compiled TypeScript output in dist contains runtime imports to those .svelte files. To make the package consumable by apps that will compile Svelte components in their own build (SvelteKit apps), we ship the .svelte files alongside the compiled JS so imports resolve correctly.
Why not rsync: earlier we used rsync to copy files, but that requires rsync to be present on the build server. To make builds portable across environments we now use a small cross-platform Node script.
Alternatives:
svelte/compiler). This produces a distribution with JS only (no .svelte sources), which is cleaner for non-Svelte consumers but requires adding a Svelte compilation step to the package build..svelte files (the current approach). This is the simplest and lets SvelteKit apps compile components during app build time.If you prefer a precompiled distribution, open an issue or request and we can add a Rollup/Vite build step (low-risk, slightly larger change).
FAQs
SvelteKit integration adapter with API client, stores, hooks, analytics, and cookie consent system
The npm package @groundbrick/sveltekit-adapter receives a total of 0 weekly downloads. As such, @groundbrick/sveltekit-adapter popularity was classified as not popular.
We found that @groundbrick/sveltekit-adapter demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Ā It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
November CVE publications fell 25% YoY even as 2025 totals rose, showing how a few major CNAs can swing āglobalā counts and skew perceived risk.

Security News
React disclosed a CVSS 10.0 RCE in React Server Components and is advising users to upgrade affected packages and frameworks to patched versions now.

Research
/Security News
We spotted a wave of auto-generated āelf-*ā npm packages published every two minutes from new accounts, with simple malware variants and early takedowns underway.