@azure-net/kit 6.0.0-next.16 → 6.0.0-next.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -79,8 +79,8 @@ export const useOrdersPresenter = RegisterProvider(
79
79
  const { Orders } = ApplicationProvider();
80
80
  return new OrdersPresenter(Orders);
81
81
  },
82
- { lifecycle: 'scoped', bindMethods: true }
83
- );
82
+ { lifecycle: 'scoped', bindMethods: true };
83
+ });
84
84
  ```
85
85
 
86
86
  Call `useOrdersPresenter()` during component initialization, not at module scope.
@@ -192,18 +192,23 @@ export {};
192
192
  import { createApp, ServerMiddlewareManager } from '@azure-net/kit';
193
193
  import { RequestContext } from '@azure-net/kit/server-context';
194
194
 
195
- export const { register } = createApp((app) =>
196
- app
197
- .useServer(async ({ event, resolve }) => {
195
+ export const { register } = createApp((app) => {
196
+ app.useServer(async ({ event, resolve }) => {
198
197
  await new ServerMiddlewareManager([ServerAuth]).execute();
199
198
  return resolve(event);
200
- })
201
- .useBoot(({ state }) => {
199
+ });
200
+ app.useBoot(({ state }) => {
202
201
  useCurrentUser().setUser(state.currentUser ?? null);
203
202
  })
204
203
  );
205
204
  ```
206
205
 
206
+ The configuration callback is synchronous. Each `app.useX(...)` returns `void`;
207
+ register hooks with separate statements, without chaining or `return app`.
208
+ Duplicate registrations and registrations after the callback completes throw.
209
+ Hook execution still follows the framework lifecycle, not registration order.
210
+ Hooks that support async work keep their existing async contracts.
211
+
207
212
  In the root layout call `register()` before resolving presenters or state classes.
208
213
  `useBoot` is synchronous and runs once per server request render and once per
209
214
  browser app initialization, before client lifecycle callbacks. Await all server
@@ -285,9 +290,11 @@ to override the public response, or return nothing to retain SvelteKit defaults.
285
290
  The removed `handleValidationError` hook is not generated.
286
291
 
287
292
  ```ts
288
- app.useServerError(({ kind, error, useLogger }) => {
293
+ import { RemoteLogger } from '@azure-net/kit';
294
+
295
+ app.useServerError(({ kind, error }) => {
289
296
  if (kind === 'unknown') {
290
- useLogger(error, {});
297
+ RemoteLogger.log(error, {});
291
298
  return { status: 500, message: 'Internal Error' };
292
299
  }
293
300
  return error;
@@ -2,13 +2,9 @@ import { type TranslationManagerSource } from '../../i18n/Internal.js';
2
2
  import { type ContextData } from '../../shared/request-context/Internal.js';
3
3
  import type { Handle, HandleFetch, HandleServerError, HandleClientError, Reroute, ServerInit, Transport } from '@sveltejs/kit/hooks';
4
4
  import type { RequestEvent } from '@sveltejs/kit';
5
- import { useLogger } from '../logger/index.js';
6
5
  type MaybePromise<T> = T | Promise<T>;
7
6
  type HandleInput = Parameters<Handle>[0];
8
7
  type Resolve = HandleInput['resolve'];
9
- type BuilderFlags = Partial<Record<'useTranslations' | 'useBoot' | 'useClient' | 'useClientInit' | 'useClientError' | 'useServerInit' | 'useServer' | 'useServerError' | 'useServerFetch' | 'useReroute' | 'useTransport', true>>;
10
- type WithFlag<TFlags extends BuilderFlags, TKey extends keyof BuilderFlags> = TFlags & Record<TKey, true>;
11
- type OnceMethod<TFlags extends BuilderFlags, TKey extends keyof BuilderFlags, TMethod> = TFlags[TKey] extends true ? object : TMethod;
12
8
  export type AppClientLifecycleContext = void;
13
9
  export type AppClientInitLifecycleContext = void;
14
10
  export type AppClientErrorContext = Parameters<HandleClientError>[0];
@@ -20,7 +16,6 @@ export interface AppServerLifecycleContext {
20
16
  }
21
17
  export type AppServerErrorContext = Parameters<HandleServerError>[0] & {
22
18
  requestContext: ContextData;
23
- useLogger: typeof useLogger;
24
19
  };
25
20
  export type AppServerFetchContext = Parameters<HandleFetch>[0] & {
26
21
  requestContext: ContextData;
@@ -37,29 +32,19 @@ export interface AppBootContext {
37
32
  state: App.RequestContextState;
38
33
  }
39
34
  export type AppBootCallback = (context: AppBootContext) => undefined;
40
- export type CreateAppBuilder<TFlags extends BuilderFlags = object> = OnceMethod<TFlags, 'useBoot', {
41
- useBoot(callback: AppBootCallback): CreateAppBuilder<WithFlag<TFlags, 'useBoot'>>;
42
- }> & OnceMethod<TFlags, 'useTranslations', {
43
- useTranslations(manager: TranslationManagerSource): CreateAppBuilder<WithFlag<TFlags, 'useTranslations'>>;
44
- }> & OnceMethod<TFlags, 'useClient', {
45
- useClient(callback: AppClientLifecycleCallback): CreateAppBuilder<WithFlag<TFlags, 'useClient'>>;
46
- }> & OnceMethod<TFlags, 'useClientInit', {
47
- useClientInit(callback: AppClientInitLifecycleCallback): CreateAppBuilder<WithFlag<TFlags, 'useClientInit'>>;
48
- }> & OnceMethod<TFlags, 'useClientError', {
49
- useClientError(callback: AppClientErrorCallback): CreateAppBuilder<WithFlag<TFlags, 'useClientError'>>;
50
- }> & OnceMethod<TFlags, 'useServerInit', {
51
- useServerInit(callback: AppServerInitLifecycleCallback): CreateAppBuilder<WithFlag<TFlags, 'useServerInit'>>;
52
- }> & OnceMethod<TFlags, 'useServer', {
53
- useServer(callback: AppServerLifecycleCallback): CreateAppBuilder<WithFlag<TFlags, 'useServer'>>;
54
- }> & OnceMethod<TFlags, 'useServerError', {
55
- useServerError(callback: AppServerErrorCallback): CreateAppBuilder<WithFlag<TFlags, 'useServerError'>>;
56
- }> & OnceMethod<TFlags, 'useServerFetch', {
57
- useServerFetch(callback: AppServerFetchCallback): CreateAppBuilder<WithFlag<TFlags, 'useServerFetch'>>;
58
- }> & OnceMethod<TFlags, 'useReroute', {
59
- useReroute(callback: AppRerouteCallback): CreateAppBuilder<WithFlag<TFlags, 'useReroute'>>;
60
- }> & OnceMethod<TFlags, 'useTransport', {
61
- useTransport(transport: Transport): CreateAppBuilder<WithFlag<TFlags, 'useTransport'>>;
62
- }>;
35
+ export interface AppConfiguration {
36
+ useTranslations(manager: TranslationManagerSource): void;
37
+ useBoot(callback: AppBootCallback): void;
38
+ useClient(callback: AppClientLifecycleCallback): void;
39
+ useClientInit(callback: AppClientInitLifecycleCallback): void;
40
+ useClientError(callback: AppClientErrorCallback): void;
41
+ useServerInit(callback: AppServerInitLifecycleCallback): void;
42
+ useServer(callback: AppServerLifecycleCallback): void;
43
+ useServerError(callback: AppServerErrorCallback): void;
44
+ useServerFetch(callback: AppServerFetchCallback): void;
45
+ useReroute(callback: AppRerouteCallback): void;
46
+ useTransport(transport: Transport): void;
47
+ }
63
48
  export interface AppRegistrar {
64
49
  (): MaybePromise<void>;
65
50
  clientInit(): MaybePromise<void>;
@@ -74,5 +59,5 @@ export interface AppRegistrar {
74
59
  export interface CreateAppInstance {
75
60
  register: AppRegistrar;
76
61
  }
77
- export declare const createApp: (callback: (app: CreateAppBuilder) => unknown) => CreateAppInstance;
62
+ export declare const createApp: (callback: (app: AppConfiguration) => void) => CreateAppInstance;
78
63
  export {};
@@ -4,7 +4,6 @@ import { getContextInternals } from '../../shared/request-context/Internal.js';
4
4
  import { BROWSER } from '../../external/tools/index.js';
5
5
  import { RequestContext } from '../../shared/request-context/Internal.js';
6
6
  import { AzureNetKitInternalError } from '../app-error/AppError.js';
7
- import { useLogger } from '../logger/index.js';
8
7
  const clientLifecycleFlags = new WeakMap();
9
8
  const getRequestContext = () => {
10
9
  try {
@@ -41,67 +40,45 @@ const getLifecycleFlags = (appKey, requestContext) => {
41
40
  }
42
41
  return flags;
43
42
  };
44
- const setCallback = (callbacks, key, callback) => {
45
- if (callbacks[key]) {
46
- throw new AzureNetKitInternalError(`[createApp] '${key}' can be registered only once.`);
47
- }
48
- callbacks[key] = callback;
49
- };
50
- const createBuilder = (callbacks) => {
51
- const builder = {
52
- useTranslations(manager) {
53
- setCallback(callbacks, 'useTranslations', manager);
54
- return builder;
55
- },
56
- useBoot(callback) {
57
- setCallback(callbacks, 'useBoot', callback);
58
- return builder;
59
- },
60
- useClient(callback) {
61
- setCallback(callbacks, 'useClient', callback);
62
- return builder;
63
- },
64
- useClientInit(callback) {
65
- setCallback(callbacks, 'useClientInit', callback);
66
- return builder;
67
- },
68
- useClientError(callback) {
69
- setCallback(callbacks, 'useClientError', callback);
70
- return builder;
71
- },
72
- useServerInit(callback) {
73
- setCallback(callbacks, 'useServerInit', callback);
74
- return builder;
75
- },
76
- useServer(callback) {
77
- setCallback(callbacks, 'useServer', callback);
78
- return builder;
79
- },
80
- useServerError(callback) {
81
- setCallback(callbacks, 'useServerError', callback);
82
- return builder;
83
- },
84
- useServerFetch(callback) {
85
- setCallback(callbacks, 'useServerFetch', callback);
86
- return builder;
87
- },
88
- useReroute(callback) {
89
- setCallback(callbacks, 'useReroute', callback);
90
- return builder;
91
- },
92
- useTransport(transport) {
93
- setCallback(callbacks, 'useTransport', transport);
94
- return builder;
95
- }
43
+ const configureApp = (callbacks, configure) => {
44
+ let open = true;
45
+ const set = (key, value) => {
46
+ if (!open)
47
+ throw new AzureNetKitInternalError('[createApp] Configuration is closed. Register hooks synchronously inside createApp.');
48
+ if (Object.hasOwn(callbacks, key))
49
+ throw new AzureNetKitInternalError(`[createApp] '${key}' can be registered only once.`);
50
+ callbacks[key] = value;
96
51
  };
97
- return builder;
52
+ const app = {
53
+ useTranslations: (value) => set('useTranslations', value),
54
+ useBoot: (value) => set('useBoot', value),
55
+ useClient: (value) => set('useClient', value),
56
+ useClientInit: (value) => set('useClientInit', value),
57
+ useClientError: (value) => set('useClientError', value),
58
+ useServerInit: (value) => set('useServerInit', value),
59
+ useServer: (value) => set('useServer', value),
60
+ useServerError: (value) => set('useServerError', value),
61
+ useServerFetch: (value) => set('useServerFetch', value),
62
+ useReroute: (value) => set('useReroute', value),
63
+ useTransport: (value) => set('useTransport', value)
64
+ };
65
+ try {
66
+ const result = configure(app);
67
+ if (result && typeof result.then === 'function') {
68
+ void Promise.resolve(result).catch(() => undefined);
69
+ throw new AzureNetKitInternalError('[createApp] Configuration must be synchronous.');
70
+ }
71
+ }
72
+ finally {
73
+ open = false;
74
+ }
98
75
  };
99
76
  export const createApp = (callback) => {
100
77
  const appKey = {};
101
78
  const callbacks = {};
102
79
  let translationInitPromise;
103
80
  let serverInitPromise;
104
- callback(createBuilder(callbacks));
81
+ configureApp(callbacks, callback);
105
82
  const runClient = (kind) => {
106
83
  if (!BROWSER)
107
84
  return undefined;
@@ -134,7 +111,7 @@ export const createApp = (callback) => {
134
111
  const runServerError = (input) => {
135
112
  if (BROWSER)
136
113
  return undefined;
137
- return callbacks.useServerError?.({ requestContext: getServerRequestContext(), ...input, useLogger });
114
+ return callbacks.useServerError?.({ requestContext: getServerRequestContext(), ...input });
138
115
  };
139
116
  const runClientError = (input) => {
140
117
  if (!BROWSER)
@@ -1,4 +1,4 @@
1
- export { createApp, type AppClientErrorCallback, type AppClientErrorContext, type AppClientInitLifecycleCallback, type AppClientInitLifecycleContext, type AppClientLifecycleCallback, type AppClientLifecycleContext, type AppRegistrar, type AppServerErrorCallback, type AppServerErrorContext, type AppServerFetchCallback, type AppServerFetchContext, type AppServerInitLifecycleCallback, type AppServerInitLifecycleContext, type AppServerLifecycleCallback, type AppServerLifecycleContext, type AppRerouteCallback, type CreateAppInstance } from './App.js';
1
+ export { createApp, type AppClientErrorCallback, type AppClientErrorContext, type AppClientInitLifecycleCallback, type AppClientInitLifecycleContext, type AppClientLifecycleCallback, type AppClientLifecycleContext, type AppRegistrar, type AppConfiguration, type AppServerErrorCallback, type AppServerErrorContext, type AppServerFetchCallback, type AppServerFetchContext, type AppServerInitLifecycleCallback, type AppServerInitLifecycleContext, type AppServerLifecycleCallback, type AppServerLifecycleContext, type AppRerouteCallback, type CreateAppInstance } from './App.js';
2
2
  export type { IClientMiddleware, ClientMiddlewareContext, ClientMiddlewareClass } from './middleware/ClientMiddleware.js';
3
3
  export { ClientMiddlewareManager } from './middleware/ClientMiddleware.js';
4
4
  export type { IServerMiddleware, ServerMiddlewareContext, ServerMiddlewareClass } from './middleware/ServerMiddleware.js';
@@ -4,4 +4,4 @@ export { ClassMirror } from './class-mirror/index.js';
4
4
  export { CreateServiceContainer, cleanupProvider, type ProviderSettings, type ProviderKey } from './boundary-provider/index.js';
5
5
  export { CompositionRoot, type CompositionRootSettings } from './boundary-provider/index.js';
6
6
  export * from './app/index.js';
7
- export { useLogger, LoggerErrors, type ILoggerError, type ILoggerSettings } from './logger/index.js';
7
+ export { RemoteLogger, LoggerErrors, type ILoggerError, type ILoggerSettings } from './logger/index.js';
@@ -4,4 +4,4 @@ export { ClassMirror } from './class-mirror/index.js';
4
4
  export { CreateServiceContainer, cleanupProvider } from './boundary-provider/index.js';
5
5
  export { CompositionRoot } from './boundary-provider/index.js';
6
6
  export * from './app/index.js';
7
- export { useLogger, LoggerErrors } from './logger/index.js';
7
+ export { RemoteLogger, LoggerErrors } from './logger/index.js';
@@ -21,4 +21,6 @@ export interface ILoggerSettings {
21
21
  filterLog?: (error: ILoggerError) => boolean;
22
22
  includeOnly?: LoggerErrors[];
23
23
  }
24
- export declare const useLogger: (error: unknown, settings: ILoggerSettings) => BackgroundTask<void>;
24
+ export declare class RemoteLogger {
25
+ static log(error: unknown, settings: ILoggerSettings): BackgroundTask<void>;
26
+ }
@@ -48,31 +48,33 @@ const getFetcher = () => {
48
48
  return fetch;
49
49
  }
50
50
  };
51
- export const useLogger = (error, settings) => {
52
- const preparedError = prepareError(error);
53
- if (settings.filterLog && settings.filterLog(preparedError)) {
54
- return BackgroundTask.run(() => undefined);
55
- }
56
- if (settings.includeOnly && !settings.includeOnly.includes(preparedError.type)) {
57
- return BackgroundTask.run(() => undefined);
58
- }
59
- const prefix = settings?.prefix ?? '[Logger]';
60
- const errorMessage = prefix + preparedError.message + (settings?.joinToLog ? settings.joinToLog(preparedError) : '');
61
- console.log(errorMessage);
62
- if (!settings.collector)
63
- return BackgroundTask.run(() => undefined);
64
- const { collector } = settings;
65
- return BackgroundTask.run(async () => {
66
- try {
67
- await getFetcher()(collector.request(preparedError));
51
+ export class RemoteLogger {
52
+ static log(error, settings) {
53
+ const preparedError = prepareError(error);
54
+ if (settings.filterLog && settings.filterLog(preparedError)) {
55
+ return BackgroundTask.run(() => undefined);
56
+ }
57
+ if (settings.includeOnly && !settings.includeOnly.includes(preparedError.type)) {
58
+ return BackgroundTask.run(() => undefined);
68
59
  }
69
- catch (err) {
60
+ const prefix = settings?.prefix ?? '[Logger]';
61
+ const errorMessage = prefix + preparedError.message + (settings?.joinToLog ? settings.joinToLog(preparedError) : '');
62
+ console.log(errorMessage);
63
+ if (!settings.collector)
64
+ return BackgroundTask.run(() => undefined);
65
+ const { collector } = settings;
66
+ return BackgroundTask.run(async () => {
70
67
  try {
71
- collector.onError?.(err);
68
+ await getFetcher()(collector.request(preparedError));
72
69
  }
73
- catch {
74
- return;
70
+ catch (err) {
71
+ try {
72
+ collector.onError?.(err);
73
+ }
74
+ catch {
75
+ return;
76
+ }
75
77
  }
76
- }
77
- });
78
- };
78
+ });
79
+ }
80
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure-net/kit",
3
- "version": "6.0.0-next.16",
3
+ "version": "6.0.0-next.17",
4
4
  "license": "MIT",
5
5
  "author": "Pixel1917",
6
6
  "description": "Universal toolkit and library collection, developed as part of the Azure-net ecosystem",