B2B-88: add starter kit structure and elements

This commit is contained in:
devmc-ee
2025-06-08 16:18:30 +03:00
parent 657a36a298
commit e7b25600cb
1280 changed files with 77893 additions and 5688 deletions

View File

@@ -0,0 +1,17 @@
import { MonitoringContext } from '@kit/monitoring-core';
import { SentryMonitoringService } from '../services/sentry-monitoring.service';
const sentry = new SentryMonitoringService();
export function SentryProvider({ children }: React.PropsWithChildren) {
return <MonitoringProvider>{children}</MonitoringProvider>;
}
function MonitoringProvider(props: React.PropsWithChildren) {
return (
<MonitoringContext.Provider value={sentry}>
{props.children}
</MonitoringContext.Provider>
);
}

View File

@@ -0,0 +1 @@
export * from './services/sentry-monitoring.service';

View File

@@ -0,0 +1,42 @@
import { init } from '@sentry/nextjs';
type Parameters<T extends (args: never) => unknown> = T extends (
...args: infer P
) => unknown
? P
: never;
/**
* @name initializeSentryBrowserClient
* @description Initialize the Sentry client
* @param props
*/
export function initializeSentryBrowserClient(
props: Parameters<typeof init>[0] = {},
) {
return init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
// Replay may only be enabled for the client-side
integrations: [
// add your desired integrations here
// https://docs.sentry.io/platforms/javascript/configuration/integrations/
],
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production
tracesSampleRate: props?.tracesSampleRate ?? 1.0,
// Capture Replay for 10% of all sessions,
// plus for 100% of sessions with an error
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
// ...
// Note: if you want to override the automatic release value, do not set a
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
// that it will also get attached to your source maps,
...props,
});
}

View File

@@ -0,0 +1,27 @@
import { init } from '@sentry/nextjs';
type Parameters<T extends (args: never) => unknown> = T extends (
...args: infer P
) => unknown
? P
: never;
/**
* @name initializeSentryServerClient
* @description Initialize the Sentry client in the server
* @param props
*/
export function initializeSentryServerClient(
props: Parameters<typeof init>[0] = {},
) {
return init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
// ...
// Note: if you want to override the automatic release value, do not set a
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
// that it will also get attached to your source maps,
...props,
});
}

View File

@@ -0,0 +1,71 @@
import {
Event as SentryEvent,
User as SentryUser,
captureEvent,
captureException,
setUser,
} from '@sentry/nextjs';
import { MonitoringService } from '@kit/monitoring-core';
/**
* @class
* @implements {MonitoringService}
* ServerSentryMonitoringService is responsible for capturing exceptions and identifying users using the Sentry monitoring service.
*/
export class SentryMonitoringService implements MonitoringService {
private readonly readyPromise: Promise<unknown>;
private readyResolver?: (value?: unknown) => void;
constructor() {
this.readyPromise = new Promise(
(resolve) => (this.readyResolver = resolve),
);
void this.initialize();
}
async ready() {
return this.readyPromise;
}
captureException(error: Error | null) {
return captureException(error);
}
captureEvent<Extra extends SentryEvent>(event: string, extra?: Extra) {
return captureEvent({
message: event,
...(extra ?? {}),
});
}
identifyUser(user: SentryUser) {
setUser(user);
}
private async initialize() {
const environment =
process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT ?? process.env.VERCEL_ENV;
if (typeof document !== 'undefined') {
const { initializeSentryBrowserClient } = await import(
'../sentry.client.config'
);
initializeSentryBrowserClient({
environment,
});
} else {
const { initializeSentryServerClient } = await import(
'../sentry.server.config'
);
initializeSentryServerClient({
environment,
});
}
this.readyResolver?.();
}
}