@azure-net/kit 6.0.0-next.15 → 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 +16 -9
- package/dist/shared/app/App.d.ts +14 -29
- package/dist/shared/app/App.js +33 -56
- package/dist/shared/app/index.d.ts +1 -1
- package/dist/shared/app/middleware/ClientMiddleware.d.ts +1 -0
- package/dist/shared/app/middleware/ClientMiddleware.js +1 -0
- package/dist/shared/app/middleware/ServerMiddleware.d.ts +3 -2
- package/dist/shared/app/middleware/ServerMiddleware.js +4 -3
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/logger/index.d.ts +3 -1
- package/dist/shared/logger/index.js +26 -24
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
293
|
+
import { RemoteLogger } from '@azure-net/kit';
|
|
294
|
+
|
|
295
|
+
app.useServerError(({ kind, error }) => {
|
|
289
296
|
if (kind === 'unknown') {
|
|
290
|
-
|
|
297
|
+
RemoteLogger.log(error, {});
|
|
291
298
|
return { status: 500, message: 'Internal Error' };
|
|
292
299
|
}
|
|
293
300
|
return error;
|
package/dist/shared/app/App.d.ts
CHANGED
|
@@ -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
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
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:
|
|
62
|
+
export declare const createApp: (callback: (app: AppConfiguration) => void) => CreateAppInstance;
|
|
78
63
|
export {};
|
package/dist/shared/app/App.js
CHANGED
|
@@ -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
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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';
|
|
@@ -5,6 +5,7 @@ import type { IMiddleware, MiddlewareClass } from './Types.js';
|
|
|
5
5
|
export interface ServerMiddlewareContext {
|
|
6
6
|
to: RequestEvent['url'];
|
|
7
7
|
from?: RequestEvent['url'];
|
|
8
|
+
byRedirect: boolean;
|
|
8
9
|
next: (location?: string | URL, status?: RedirectStatus) => void;
|
|
9
10
|
event: RequestEvent;
|
|
10
11
|
ensureRoute: EnsureRoute;
|
|
@@ -17,6 +18,6 @@ export type ServerMiddlewareClass = MiddlewareClass<IServerMiddleware>;
|
|
|
17
18
|
export declare class ServerMiddlewareManager {
|
|
18
19
|
private readonly middlewares;
|
|
19
20
|
constructor(middlewares: readonly ServerMiddlewareClass[]);
|
|
20
|
-
execute(): Promise<void>;
|
|
21
|
+
execute(byRedirect?: boolean): Promise<void>;
|
|
21
22
|
}
|
|
22
|
-
export declare const executeServerMiddlewares: (middlewares: readonly ServerMiddlewareClass[]) => Promise<void>;
|
|
23
|
+
export declare const executeServerMiddlewares: (middlewares: readonly ServerMiddlewareClass[], byRedirect?: boolean) => Promise<void>;
|
|
@@ -8,11 +8,11 @@ export class ServerMiddlewareManager {
|
|
|
8
8
|
constructor(middlewares) {
|
|
9
9
|
this.middlewares = [...middlewares];
|
|
10
10
|
}
|
|
11
|
-
execute() {
|
|
12
|
-
return executeServerMiddlewares(this.middlewares);
|
|
11
|
+
execute(byRedirect = true) {
|
|
12
|
+
return executeServerMiddlewares(this.middlewares, byRedirect);
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
export const executeServerMiddlewares = async (middlewares) => {
|
|
15
|
+
export const executeServerMiddlewares = async (middlewares, byRedirect = true) => {
|
|
16
16
|
if (!BROWSER && middlewares.length) {
|
|
17
17
|
const event = RequestContext.current().event;
|
|
18
18
|
if (event) {
|
|
@@ -31,6 +31,7 @@ export const executeServerMiddlewares = async (middlewares) => {
|
|
|
31
31
|
event,
|
|
32
32
|
to,
|
|
33
33
|
from,
|
|
34
|
+
byRedirect,
|
|
34
35
|
next,
|
|
35
36
|
ensureRoute
|
|
36
37
|
});
|
package/dist/shared/index.d.ts
CHANGED
|
@@ -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 {
|
|
7
|
+
export { RemoteLogger, LoggerErrors, type ILoggerError, type ILoggerSettings } from './logger/index.js';
|
package/dist/shared/index.js
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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.
|
|
68
|
+
await getFetcher()(collector.request(preparedError));
|
|
72
69
|
}
|
|
73
|
-
catch {
|
|
74
|
-
|
|
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