@azure-net/kit 6.0.0-next → 6.0.0-next.10

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.
Files changed (86) hide show
  1. package/README.md +335 -2
  2. package/dist/delivery/index.d.ts +3 -1
  3. package/dist/delivery/index.js +3 -1
  4. package/dist/delivery/injectable-dependencies/AsyncHelpers.d.ts +2 -4
  5. package/dist/delivery/injectable-dependencies/AsyncHelpers.js +96 -92
  6. package/dist/delivery/presenter/Bound.d.ts +1 -0
  7. package/dist/delivery/presenter/Bound.js +9 -0
  8. package/dist/delivery/presenter/RegisterProvider.d.ts +16 -0
  9. package/dist/delivery/presenter/RegisterProvider.js +99 -0
  10. package/dist/delivery/schema/Schema.js +1 -1
  11. package/dist/delivery/schema/rules/Rules.js +2 -1
  12. package/dist/delivery.d.ts +0 -1
  13. package/dist/delivery.js +0 -1
  14. package/dist/i18n/Internal.d.ts +15 -0
  15. package/dist/i18n/Internal.js +11 -0
  16. package/dist/i18n/TranslationManager.d.ts +19 -0
  17. package/dist/i18n/TranslationManager.js +26 -0
  18. package/dist/i18n/Translations.svelte.d.ts +20 -0
  19. package/dist/i18n/Translations.svelte.js +254 -0
  20. package/dist/i18n/Types.d.ts +30 -0
  21. package/dist/i18n/Types.js +1 -0
  22. package/dist/i18n/index.d.ts +3 -0
  23. package/dist/i18n/index.js +2 -0
  24. package/dist/infra/datasource/BaseDatasource.d.ts +19 -6
  25. package/dist/infra/datasource/BaseDatasource.js +4 -4
  26. package/dist/infra/http-service/HttpServiceInstance.d.ts +26 -16
  27. package/dist/infra/http-service/HttpServiceInstance.js +29 -17
  28. package/dist/infra/index.d.ts +2 -2
  29. package/dist/infra/index.js +2 -2
  30. package/dist/infra/query/QueryBuilder.d.ts +6 -1
  31. package/dist/infra/query/QueryBuilder.js +14 -12
  32. package/dist/plugin/AzureNetPlugin.d.ts +1 -4
  33. package/dist/plugin/AzureNetPlugin.js +21 -64
  34. package/dist/plugin/index.d.ts +1 -1
  35. package/dist/server/Context/Runtime.d.ts +3 -0
  36. package/dist/server/Context/Runtime.js +109 -0
  37. package/dist/shared/app/App.d.ts +47 -77
  38. package/dist/shared/app/App.js +80 -106
  39. package/dist/shared/app/index.d.ts +5 -3
  40. package/dist/shared/app/middleware/ClientMiddleware.d.ts +14 -8
  41. package/dist/shared/app/middleware/ClientMiddleware.js +32 -11
  42. package/dist/shared/app/middleware/ServerMiddleware.d.ts +10 -5
  43. package/dist/shared/app/middleware/ServerMiddleware.js +3 -3
  44. package/dist/shared/app/middleware/Types.d.ts +4 -0
  45. package/dist/shared/app/middleware/Types.js +1 -0
  46. package/dist/shared/app-error/ErrorRuntime.d.ts +1 -1
  47. package/dist/shared/app-error/ErrorRuntime.js +4 -3
  48. package/dist/shared/boundary-provider/CompositionRoot.d.ts +21 -0
  49. package/dist/shared/boundary-provider/CompositionRoot.js +11 -0
  50. package/dist/shared/boundary-provider/Provider.d.ts +4 -3
  51. package/dist/shared/boundary-provider/Provider.js +56 -39
  52. package/dist/shared/boundary-provider/index.d.ts +1 -0
  53. package/dist/shared/boundary-provider/index.js +1 -0
  54. package/dist/shared/cookie/UniversalCookie.js +1 -1
  55. package/dist/shared/index.d.ts +2 -3
  56. package/dist/shared/index.js +2 -3
  57. package/dist/shared/logger/index.js +1 -1
  58. package/dist/shared/request-context/Internal.d.ts +16 -0
  59. package/dist/shared/request-context/Internal.js +24 -0
  60. package/dist/shared/request-context/index.d.ts +1 -0
  61. package/dist/shared/request-context/index.js +2 -0
  62. package/dist/svelte/async-signal/AsyncSignal.svelte.d.ts +20 -4
  63. package/dist/svelte/async-signal/AsyncSignal.svelte.js +53 -13
  64. package/dist/svelte/async-signal/README.md +89 -0
  65. package/dist/svelte/index.d.ts +1 -0
  66. package/dist/svelte/index.js +1 -0
  67. package/dist/svelte/query/Query.svelte.d.ts +1 -1
  68. package/dist/svelte/query/Query.svelte.js +14 -6
  69. package/dist/svelte/query/SearchParamsSync.js +11 -3
  70. package/dist/{shared → svelte}/redirect/index.d.ts +2 -8
  71. package/package.json +35 -26
  72. package/dist/external/edges/Dev.d.ts +0 -1
  73. package/dist/external/edges/Dev.js +0 -1
  74. package/dist/external/edges/Edges.d.ts +0 -1
  75. package/dist/external/edges/Edges.js +0 -1
  76. package/dist/external/edges/ServerContext.d.ts +0 -1
  77. package/dist/external/edges/ServerContext.js +0 -1
  78. package/dist/external/edges/_edges.d.ts +0 -1
  79. package/dist/external/edges/_edges.js +0 -1
  80. package/dist/external/i18n/index.d.ts +0 -1
  81. package/dist/external/i18n/index.js +0 -1
  82. package/dist/shared/event-bus/EventBus.d.ts +0 -12
  83. package/dist/shared/event-bus/EventBus.js +0 -3
  84. package/dist/shared/event-bus/index.d.ts +0 -1
  85. package/dist/shared/event-bus/index.js +0 -1
  86. /package/dist/{shared → svelte}/redirect/index.js +0 -0
@@ -1,14 +1,14 @@
1
+ import { getTranslationManagerLifecycle } from '../../i18n/Internal.js';
2
+ import { hydratable } from 'svelte';
3
+ import { getContextInternals } from '../../shared/request-context/Internal.js';
1
4
  import { BROWSER } from '../../external/tools/index.js';
2
- import { RequestContext } from '../../external/edges/ServerContext.js';
3
- import { createBoundaryProvider } from '../boundary-provider/Provider.js';
5
+ import { RequestContext } from '../../shared/request-context/Internal.js';
4
6
  import { AppError, AzureNetKitInternalError } from '../app-error/AppError.js';
5
7
  import { bindAzureNetKitErrorResolver } from '../app-error/ErrorRuntime.js';
6
- import { AppEvents } from '../event-bus/EventBus.js';
7
8
  import { executeServerMiddlewares } from './middleware/ServerMiddleware.js';
8
9
  import { beforeNavigate } from '$app/navigation';
9
10
  import { executeClientMiddlewares } from './middleware/ClientMiddleware.js';
10
11
  import { useLogger } from '../logger/index.js';
11
- const DEFAULT_APP_NAME = '__AzureNetKitGlobalAppContainer__';
12
12
  const clientLifecycleFlags = new WeakMap();
13
13
  const getRequestContext = () => {
14
14
  try {
@@ -37,7 +37,7 @@ const getLifecycleFlags = (appKey, requestContext) => {
37
37
  if (!context) {
38
38
  throw new AzureNetKitInternalError('[createApp] RequestContext is not initialized on server.');
39
39
  }
40
- const flagsMap = (context.data.appLifecycleFlags ??= new WeakMap());
40
+ const flagsMap = (getContextInternals(context).appLifecycleFlags ??= new WeakMap());
41
41
  let flags = flagsMap.get(appKey);
42
42
  if (!flags) {
43
43
  flags = {};
@@ -51,8 +51,16 @@ const setCallback = (callbacks, key, callback) => {
51
51
  }
52
52
  callbacks[key] = callback;
53
53
  };
54
- const createBuilder = (dependencies, callbacks) => {
54
+ const createBuilder = (callbacks) => {
55
55
  const builder = {
56
+ useTranslations(manager) {
57
+ setCallback(callbacks, 'useTranslations', manager);
58
+ return builder;
59
+ },
60
+ useBoot(callback) {
61
+ setCallback(callbacks, 'useBoot', callback);
62
+ return builder;
63
+ },
56
64
  use(callback) {
57
65
  setCallback(callbacks, 'use', callback);
58
66
  return builder;
@@ -85,10 +93,6 @@ const createBuilder = (dependencies, callbacks) => {
85
93
  setCallback(callbacks, 'useServerFetch', callback);
86
94
  return builder;
87
95
  },
88
- useServerValidationError(callback) {
89
- setCallback(callbacks, 'useServerValidationError', callback);
90
- return builder;
91
- },
92
96
  useAzureNetKitError(callback) {
93
97
  setCallback(callbacks, 'useAzureNetKitError', callback);
94
98
  return builder;
@@ -100,60 +104,21 @@ const createBuilder = (dependencies, callbacks) => {
100
104
  useTransport(transport) {
101
105
  setCallback(callbacks, 'useTransport', transport);
102
106
  return builder;
103
- },
104
- dependencies(nextDependencies) {
105
- for (const [key, factory] of Object.entries(nextDependencies)) {
106
- dependencies.set(key, factory);
107
- }
108
- return builder;
109
107
  }
110
108
  };
111
109
  return builder;
112
110
  };
113
- export const createApp = (callback, name = DEFAULT_APP_NAME) => {
111
+ export const createApp = (callback) => {
114
112
  const appKey = {};
115
- const dependencies = new Map();
116
113
  const callbacks = {};
117
114
  let clientInitialized = false;
115
+ let translationInitPromise;
118
116
  let serverInitPromise;
119
- callback(createBuilder(dependencies, callbacks));
120
- const AppProvider = createBoundaryProvider(name, {
121
- register: () => {
122
- const factories = {};
123
- for (const [key, factory] of dependencies.entries()) {
124
- factories[key] = () => factory(Container);
125
- }
126
- return factories;
127
- }
128
- });
129
- const Container = new Proxy({}, {
130
- get(_, key) {
131
- if (typeof key === 'symbol')
132
- return undefined;
133
- return AppProvider()[key];
134
- },
135
- has(_, key) {
136
- return typeof key === 'string' && key in AppProvider();
137
- },
138
- ownKeys() {
139
- return Reflect.ownKeys(AppProvider());
140
- },
141
- getOwnPropertyDescriptor(_, key) {
142
- if (typeof key !== 'string' || !(key in AppProvider()))
143
- return undefined;
144
- return {
145
- configurable: true,
146
- enumerable: true,
147
- value: AppProvider()[key]
148
- };
149
- }
150
- });
117
+ callback(createBuilder(callbacks));
151
118
  const errorResolver = callbacks.useAzureNetKitError
152
119
  ? (error, retry) => {
153
120
  const requestContext = BROWSER ? undefined : getRequestContext();
154
121
  return callbacks.useAzureNetKitError({
155
- Container,
156
- AppEvents,
157
122
  error,
158
123
  retry,
159
124
  isClient: BROWSER,
@@ -172,39 +137,44 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
172
137
  bindErrorResolver();
173
138
  const flags = getLifecycleFlags(appKey);
174
139
  if (flags[kind])
175
- return undefined;
140
+ return kind === 'clientInit' ? translationInitPromise : undefined;
176
141
  flags[kind] = true;
177
142
  if (kind === 'clientInit') {
178
- const universalContext = {
179
- Container,
180
- isClient: true,
181
- isServer: false
143
+ const initialize = () => {
144
+ const universalContext = {
145
+ isClient: true,
146
+ isServer: false
147
+ };
148
+ const universalResult = callbacks.use?.(universalContext);
149
+ if (universalResult && typeof universalResult.then === 'function') {
150
+ return universalResult.then(() => callbacks.useClientInit?.());
151
+ }
152
+ return callbacks.useClientInit?.();
182
153
  };
183
- const universalResult = callbacks.use?.(universalContext);
184
- if (universalResult && typeof universalResult.then === 'function') {
185
- return universalResult.then(() => callbacks.useClientInit?.({ Container }));
186
- }
187
- return callbacks.useClientInit?.({ Container });
154
+ if (!callbacks.useTranslations)
155
+ return initialize();
156
+ translationInitPromise = getTranslationManagerLifecycle(callbacks.useTranslations)
157
+ .initializeClient()
158
+ .then(initialize)
159
+ .catch((error) => {
160
+ delete flags.clientInit;
161
+ translationInitPromise = undefined;
162
+ throw error;
163
+ });
164
+ return translationInitPromise;
188
165
  }
189
166
  let internalMiddlewares = [];
190
- const clientResult = callbacks.useClient?.({
191
- Container,
192
- useMiddlewares: (middlewares) => {
193
- internalMiddlewares = middlewares;
194
- }
195
- });
196
- const registerNavigation = () => {
197
- if (clientInitialized)
198
- return;
199
- clientInitialized = true;
167
+ if (!clientInitialized) {
200
168
  beforeNavigate((navigation) => {
201
169
  executeClientMiddlewares(internalMiddlewares, navigation);
202
170
  });
203
- };
204
- if (clientResult && typeof clientResult.then === 'function') {
205
- return clientResult.then(registerNavigation);
171
+ clientInitialized = true;
206
172
  }
207
- registerNavigation();
173
+ return callbacks.useClient?.({
174
+ useMiddlewares: (middlewares) => {
175
+ internalMiddlewares = middlewares;
176
+ }
177
+ });
208
178
  };
209
179
  const runServerInit = () => {
210
180
  if (BROWSER)
@@ -212,19 +182,15 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
212
182
  serverInitPromise ??= Promise.resolve().then(() => callbacks.useServerInit?.());
213
183
  return serverInitPromise;
214
184
  };
215
- const runServerError = ({ error, event, status, message }) => {
185
+ const runServerError = (input) => {
216
186
  if (BROWSER)
217
187
  return undefined;
218
188
  const requestContext = getServerRequestContext();
219
189
  bindErrorResolver(requestContext);
220
190
  try {
221
191
  const result = callbacks.useServerError?.({
222
- Container,
223
192
  requestContext,
224
- error,
225
- event,
226
- status,
227
- message,
193
+ ...input,
228
194
  useLogger
229
195
  });
230
196
  if (result && typeof result.then === 'function') {
@@ -238,16 +204,12 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
238
204
  throw error;
239
205
  }
240
206
  };
241
- const runClientError = ({ error, event, status, message }) => {
207
+ const runClientError = (input) => {
242
208
  if (!BROWSER)
243
209
  return undefined;
244
210
  bindErrorResolver();
245
211
  return callbacks.useClientError?.({
246
- Container,
247
- error,
248
- event,
249
- status,
250
- message
212
+ ...input
251
213
  });
252
214
  };
253
215
  const runServerFetch = (input) => {
@@ -255,31 +217,27 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
255
217
  return input.fetch(input.request);
256
218
  return callbacks.useServerFetch({
257
219
  ...input,
258
- Container,
259
- requestContext: getServerRequestContext()
260
- });
261
- };
262
- const runServerValidationError = (input) => {
263
- if (!callbacks.useServerValidationError) {
264
- console.error('Remote function schema validation failed:', input.issues);
265
- return { message: 'Bad Request' };
266
- }
267
- return callbacks.useServerValidationError({
268
- ...input,
269
- Container,
270
220
  requestContext: getServerRequestContext()
271
221
  });
272
222
  };
273
223
  const reroute = (input) => callbacks.useReroute?.(input);
274
- const handle = async ({ event, resolve }) => {
224
+ const handle = async ({ event, resolve: originalResolve }) => {
225
+ const translations = callbacks.useTranslations ? getTranslationManagerLifecycle(callbacks.useTranslations) : undefined;
226
+ const resolve = translations
227
+ ? (event, options) => originalResolve(event, {
228
+ ...options,
229
+ transformPageChunk: async (chunk) => translations.transformHtml((await options?.transformPageChunk?.(chunk)) ?? chunk.html)
230
+ })
231
+ : originalResolve;
275
232
  const requestContext = getServerRequestContext();
276
233
  bindErrorResolver(requestContext);
277
234
  try {
278
235
  const flags = getLifecycleFlags(appKey, requestContext);
279
236
  if (!flags.server) {
280
237
  flags.server = true;
238
+ if (translations)
239
+ await translations.preloadTranslation();
281
240
  const universalResult = callbacks.use?.({
282
- Container,
283
241
  isClient: false,
284
242
  isServer: true,
285
243
  requestContext,
@@ -289,7 +247,6 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
289
247
  await universalResult;
290
248
  }
291
249
  const serverResult = await callbacks.useServer?.({
292
- Container,
293
250
  requestContext,
294
251
  event,
295
252
  resolve,
@@ -304,19 +261,36 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
304
261
  bindAzureNetKitErrorResolver(undefined, requestContext);
305
262
  }
306
263
  };
307
- const register = Object.assign(() => runClient('client'), {
264
+ const runBoot = () => {
265
+ if (!callbacks.useBoot && !callbacks.useTranslations)
266
+ return;
267
+ const flags = getLifecycleFlags(appKey);
268
+ if (flags.boot)
269
+ return;
270
+ flags.boot = true;
271
+ const state = hydratable('@azure-net/kit:initial-state:v1', () => (BROWSER ? {} : RequestContext.current().state));
272
+ if (callbacks.useTranslations)
273
+ getTranslationManagerLifecycle(callbacks.useTranslations).syncFromState(state);
274
+ const result = callbacks.useBoot?.({ state });
275
+ if (result && typeof result.then === 'function') {
276
+ void Promise.resolve(result).catch(() => undefined);
277
+ throw new AzureNetKitInternalError('[createApp] useBoot must be synchronous.');
278
+ }
279
+ };
280
+ const register = Object.assign(() => {
281
+ runBoot();
282
+ return runClient('client');
283
+ }, {
308
284
  clientInit: () => runClient('clientInit'),
309
285
  clientError: runClientError,
310
286
  serverInit: runServerInit,
311
287
  serverError: runServerError,
312
288
  serverFetch: runServerFetch,
313
- serverValidationError: runServerValidationError,
314
289
  handle,
315
290
  reroute,
316
291
  transport: callbacks.useTransport ?? {}
317
292
  });
318
293
  return {
319
- Container,
320
294
  register
321
295
  };
322
296
  };
@@ -1,4 +1,6 @@
1
- export { createApp, type AppAzureNetKitErrorCallback, type AppAzureNetKitErrorContext, type AppClientErrorCallback, type AppClientErrorContext, type AppClientInitLifecycleCallback, type AppClientInitLifecycleContext, type AppClientLifecycleCallback, type AppClientLifecycleContext, type AppContainer, type AppRegistrar, type AppServerErrorCallback, type AppServerErrorContext, type AppServerFetchCallback, type AppServerFetchContext, type AppServerInitLifecycleCallback, type AppServerInitLifecycleContext, type AppServerLifecycleCallback, type AppServerLifecycleContext, type AppServerValidationErrorCallback, type AppServerValidationErrorContext, type AppRerouteCallback, type AppUniversalLifecycleCallback, type AppUniversalLifecycleContext, type CreateAppInstance } from './App.js';
2
- export type { IClientMiddleware } from './middleware/ClientMiddleware.js';
3
- export type { IServerMiddleware } from './middleware/ServerMiddleware.js';
1
+ export { createApp, type AppAzureNetKitErrorCallback, type AppAzureNetKitErrorContext, 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 AppUniversalLifecycleCallback, type AppUniversalLifecycleContext, type CreateAppInstance } from './App.js';
2
+ export type { IClientMiddleware, ClientMiddlewareContext, ClientMiddlewareClass } from './middleware/ClientMiddleware.js';
3
+ export type { IServerMiddleware, ServerMiddlewareContext, ServerMiddlewareClass } from './middleware/ServerMiddleware.js';
4
+ export type { IMiddleware, MiddlewareClass } from './middleware/Types.js';
4
5
  export type { EnsureRoute, EnsureRouteSource, EnsureRouteTarget } from './middleware/Shared.js';
6
+ export type { AppBootContext, AppBootCallback } from './App.js';
@@ -1,10 +1,16 @@
1
- import { type BeforeNavigate } from '@sveltejs/kit';
2
1
  import { type EnsureRoute } from './Shared.js';
3
- import type { RedirectStatus } from '../../redirect/index.js';
4
- export type IClientMiddleware = (middlewareData: {
5
- to: URL;
6
- from?: URL;
7
- next: (location?: string | URL, status?: RedirectStatus) => undefined;
2
+ import type { BeforeNavigate, GotoOptions } from '$app/navigation';
3
+ import type { ReadonlyURL } from '$app/state';
4
+ import type { IMiddleware, MiddlewareClass } from './Types.js';
5
+ export interface ClientMiddlewareContext {
6
+ to: ReadonlyURL;
7
+ from?: ReadonlyURL;
8
+ navigation?: BeforeNavigate;
9
+ next: (location?: string | URL, options?: GotoOptions) => undefined;
8
10
  ensureRoute: EnsureRoute;
9
- }) => undefined;
10
- export declare const executeClientMiddlewares: (middlewares: IClientMiddleware[], navigation?: BeforeNavigate) => void;
11
+ }
12
+ export interface IClientMiddleware extends IMiddleware<ClientMiddlewareContext, undefined> {
13
+ execute(context: ClientMiddlewareContext): undefined;
14
+ }
15
+ export type ClientMiddlewareClass = MiddlewareClass<IClientMiddleware>;
16
+ export declare const executeClientMiddlewares: (middlewares: readonly ClientMiddlewareClass[], navigation?: BeforeNavigate) => void;
@@ -1,27 +1,48 @@
1
- import {} from '@sveltejs/kit';
2
1
  import { ensureRoute } from './Shared.js';
3
2
  import { page } from '$app/state';
4
3
  import { goto } from '$app/navigation';
5
4
  export const executeClientMiddlewares = (middlewares, navigation) => {
6
5
  const from = navigation?.from?.url ?? undefined;
7
- const to = navigation?.to?.url ?? page?.url;
6
+ const to = navigation?.to?.url ?? page.url;
8
7
  for (const middleware of middlewares) {
9
8
  let shouldContinue = false;
10
9
  let redirectTo;
11
- const next = (location) => {
10
+ let redirectOptions;
11
+ let active = true;
12
+ const next = (location, options) => {
13
+ if (!active)
14
+ throw new Error('[Middleware] next() must be called synchronously and only once.');
15
+ active = false;
12
16
  shouldContinue = true;
13
17
  redirectTo = location;
18
+ redirectOptions = options;
14
19
  return undefined;
15
20
  };
16
- middleware({
17
- to,
18
- from,
19
- next,
20
- ensureRoute
21
- });
22
- if (redirectTo) {
21
+ let result;
22
+ try {
23
+ result = new middleware().execute({
24
+ to,
25
+ from,
26
+ next,
27
+ ensureRoute,
28
+ navigation
29
+ });
30
+ }
31
+ catch (error) {
32
+ navigation?.cancel();
33
+ throw error;
34
+ }
35
+ finally {
36
+ active = false;
37
+ }
38
+ if (result && typeof result.then === 'function') {
39
+ navigation?.cancel();
40
+ void Promise.resolve(result).catch(() => undefined);
41
+ throw new Error('[Middleware] Client execute() must be synchronous.');
42
+ }
43
+ if (redirectTo !== undefined) {
23
44
  navigation?.cancel();
24
- void goto(redirectTo);
45
+ void goto(redirectTo, redirectOptions).catch((error) => console.error('[Middleware] Redirect failed:', error));
25
46
  return;
26
47
  }
27
48
  if (!shouldContinue) {
@@ -1,11 +1,16 @@
1
1
  import { type RequestEvent } from '@sveltejs/kit';
2
2
  import { type EnsureRoute } from './Shared.js';
3
- import type { RedirectStatus } from '../../redirect/index.js';
4
- export type IServerMiddleware = (middlewareData: {
3
+ import type { RedirectStatus } from '../../../svelte/redirect/index.js';
4
+ import type { IMiddleware, MiddlewareClass } from './Types.js';
5
+ export interface ServerMiddlewareContext {
5
6
  to: RequestEvent['url'];
6
7
  from?: RequestEvent['url'];
7
8
  next: (location?: string | URL, status?: RedirectStatus) => void;
8
- event?: RequestEvent;
9
+ event: RequestEvent;
9
10
  ensureRoute: EnsureRoute;
10
- }) => Promise<void> | void;
11
- export declare const executeServerMiddlewares: (middlewares: IServerMiddleware[]) => Promise<void>;
11
+ }
12
+ export interface IServerMiddleware extends IMiddleware<ServerMiddlewareContext, Promise<void> | void> {
13
+ execute(context: ServerMiddlewareContext): Promise<void> | void;
14
+ }
15
+ export type ServerMiddlewareClass = MiddlewareClass<IServerMiddleware>;
16
+ export declare const executeServerMiddlewares: (middlewares: readonly ServerMiddlewareClass[]) => Promise<void>;
@@ -1,13 +1,13 @@
1
1
  import { error, redirect } from '@sveltejs/kit';
2
2
  import { ensureRoute } from './Shared.js';
3
3
  import { BROWSER } from '../../../external/tools/index.js';
4
- import { RequestContext } from '../../../external/edges/ServerContext.js';
4
+ import { RequestContext } from '../../../shared/request-context/Internal.js';
5
5
  export const executeServerMiddlewares = async (middlewares) => {
6
6
  if (!BROWSER && middlewares.length) {
7
7
  const event = RequestContext.current().event;
8
8
  if (event) {
9
9
  const referer = event?.request.headers.get('referer');
10
- const from = referer ? new URL(referer) : undefined;
10
+ const from = referer && URL.canParse(referer) ? new URL(referer) : undefined;
11
11
  const to = event?.url;
12
12
  for (const middleware of middlewares) {
13
13
  let shouldContinue = false;
@@ -17,7 +17,7 @@ export const executeServerMiddlewares = async (middlewares) => {
17
17
  return redirect(status, location);
18
18
  }
19
19
  };
20
- await middleware({
20
+ await new middleware().execute({
21
21
  event,
22
22
  to,
23
23
  from,
@@ -0,0 +1,4 @@
1
+ export interface IMiddleware<TContext, TResult = void> {
2
+ execute(context: TContext): TResult;
3
+ }
4
+ export type MiddlewareClass<T> = new () => T;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,4 @@
1
- import { type ContextData } from '../../external/edges/ServerContext.js';
1
+ import { type ContextData } from '../../shared/request-context/Internal.js';
2
2
  import { AppError, type IAppError } from './AppError.js';
3
3
  type MaybePromise<T> = T | Promise<T>;
4
4
  export interface AsyncHelperRetry {
@@ -1,14 +1,15 @@
1
+ import { getContextInternals } from '../../shared/request-context/Internal.js';
1
2
  import { BROWSER } from '../../external/tools/index.js';
2
- import { RequestContext } from '../../external/edges/ServerContext.js';
3
+ import { RequestContext } from '../../shared/request-context/Internal.js';
3
4
  import { AppError, AzureNetKitInternalError } from './AppError.js';
4
5
  const SERVER_BINDING_KEY = Symbol('azureNetKitErrorResolver');
5
6
  let clientBinding;
6
7
  const createBinding = (resolver) => ({ resolver });
7
8
  const getServerData = (requestContext) => {
8
9
  if (requestContext)
9
- return requestContext.data;
10
+ return getContextInternals(requestContext);
10
11
  try {
11
- return RequestContext.current().data;
12
+ return getContextInternals(RequestContext.current());
12
13
  }
13
14
  catch {
14
15
  return undefined;
@@ -0,0 +1,21 @@
1
+ import { type ProviderSettings, type ProviderWithType } from './Provider.js';
2
+ type Services = Record<string, () => unknown>;
3
+ type Dependency = ProviderWithType<Services> | {
4
+ readonly resolve: ProviderWithType<Services>;
5
+ };
6
+ type Dependencies = Record<string, Dependency>;
7
+ type Providers<D extends Dependencies> = {
8
+ [K in keyof D]: D[K] extends {
9
+ readonly resolve: infer P extends ProviderWithType<Services>;
10
+ } ? P : D[K] extends ProviderWithType<Services> ? D[K] : never;
11
+ };
12
+ export type CompositionRootSettings<T extends Services, D extends Dependencies = Record<never, never>> = Omit<ProviderSettings<T, Providers<D>>, 'dependsOn'> & {
13
+ dependsOn?: D;
14
+ };
15
+ /** Holds registration metadata only. Resolving always uses the current request's container. */
16
+ export declare class CompositionRoot<T extends Services, D extends Dependencies = Record<never, never>> {
17
+ readonly name: symbol;
18
+ readonly resolve: ProviderWithType<T>;
19
+ constructor(settings: CompositionRootSettings<T, D>);
20
+ }
21
+ export {};
@@ -0,0 +1,11 @@
1
+ import { CreateServiceContainer } from './Provider.js';
2
+ const toProvider = (dependency) => typeof dependency === 'function' ? dependency : dependency.resolve;
3
+ /** Holds registration metadata only. Resolving always uses the current request's container. */
4
+ export class CompositionRoot {
5
+ name = Symbol('@azure-net/kit:CompositionRoot');
6
+ resolve;
7
+ constructor(settings) {
8
+ const dependsOn = Object.fromEntries(Object.entries(settings.dependsOn ?? {}).map(([key, dependency]) => [key, toProvider(dependency)]));
9
+ this.resolve = CreateServiceContainer(this.name, { ...settings, dependsOn });
10
+ }
11
+ }
@@ -1,3 +1,4 @@
1
+ export type ProviderKey = string | symbol;
1
2
  type ServiceFactory<T> = () => T;
2
3
  type ServiceMap = Record<string, ServiceFactory<unknown>>;
3
4
  type ResolvedServices<T extends ServiceMap> = {
@@ -13,9 +14,9 @@ type ProviderFactory<T extends ServiceMap, D extends Record<string, ProviderWith
13
14
  }) => T;
14
15
  export interface ProviderSettings<T extends ServiceMap, D extends Record<string, ProviderWithType<ServiceMap>>> {
15
16
  dependsOn?: D;
16
- boot?: (services: ResolvedServices<T>) => void | Promise<void>;
17
+ boot?: (services: ResolvedServices<T>) => undefined;
17
18
  register: ProviderFactory<T, D>;
18
19
  }
19
- export declare const createBoundaryProvider: <T extends ServiceMap, D extends Record<string, ProviderWithType<ServiceMap>>>(name: string, settings: ProviderSettings<T, D>) => ProviderWithType<T>;
20
- export declare function cleanupProvider(name: string): Promise<void>;
20
+ export declare const CreateServiceContainer: <T extends ServiceMap, D extends Record<string, ProviderWithType<ServiceMap>>>(name: ProviderKey, settings: ProviderSettings<T, D>) => ProviderWithType<T>;
21
+ export declare function cleanupProvider(name: ProviderKey): Promise<void>;
21
22
  export {};