@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.
- package/README.md +335 -2
- package/dist/delivery/index.d.ts +3 -1
- package/dist/delivery/index.js +3 -1
- package/dist/delivery/injectable-dependencies/AsyncHelpers.d.ts +2 -4
- package/dist/delivery/injectable-dependencies/AsyncHelpers.js +96 -92
- package/dist/delivery/presenter/Bound.d.ts +1 -0
- package/dist/delivery/presenter/Bound.js +9 -0
- package/dist/delivery/presenter/RegisterProvider.d.ts +16 -0
- package/dist/delivery/presenter/RegisterProvider.js +99 -0
- package/dist/delivery/schema/Schema.js +1 -1
- package/dist/delivery/schema/rules/Rules.js +2 -1
- package/dist/delivery.d.ts +0 -1
- package/dist/delivery.js +0 -1
- package/dist/i18n/Internal.d.ts +15 -0
- package/dist/i18n/Internal.js +11 -0
- package/dist/i18n/TranslationManager.d.ts +19 -0
- package/dist/i18n/TranslationManager.js +26 -0
- package/dist/i18n/Translations.svelte.d.ts +20 -0
- package/dist/i18n/Translations.svelte.js +254 -0
- package/dist/i18n/Types.d.ts +30 -0
- package/dist/i18n/Types.js +1 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.js +2 -0
- package/dist/infra/datasource/BaseDatasource.d.ts +19 -6
- package/dist/infra/datasource/BaseDatasource.js +4 -4
- package/dist/infra/http-service/HttpServiceInstance.d.ts +26 -16
- package/dist/infra/http-service/HttpServiceInstance.js +29 -17
- package/dist/infra/index.d.ts +2 -2
- package/dist/infra/index.js +2 -2
- package/dist/infra/query/QueryBuilder.d.ts +6 -1
- package/dist/infra/query/QueryBuilder.js +14 -12
- package/dist/plugin/AzureNetPlugin.d.ts +1 -4
- package/dist/plugin/AzureNetPlugin.js +21 -64
- package/dist/plugin/index.d.ts +1 -1
- package/dist/server/Context/Runtime.d.ts +3 -0
- package/dist/server/Context/Runtime.js +109 -0
- package/dist/shared/app/App.d.ts +47 -77
- package/dist/shared/app/App.js +80 -106
- package/dist/shared/app/index.d.ts +5 -3
- package/dist/shared/app/middleware/ClientMiddleware.d.ts +14 -8
- package/dist/shared/app/middleware/ClientMiddleware.js +32 -11
- package/dist/shared/app/middleware/ServerMiddleware.d.ts +10 -5
- package/dist/shared/app/middleware/ServerMiddleware.js +3 -3
- package/dist/shared/app/middleware/Types.d.ts +4 -0
- package/dist/shared/app/middleware/Types.js +1 -0
- package/dist/shared/app-error/ErrorRuntime.d.ts +1 -1
- package/dist/shared/app-error/ErrorRuntime.js +4 -3
- package/dist/shared/boundary-provider/CompositionRoot.d.ts +21 -0
- package/dist/shared/boundary-provider/CompositionRoot.js +11 -0
- package/dist/shared/boundary-provider/Provider.d.ts +4 -3
- package/dist/shared/boundary-provider/Provider.js +56 -39
- package/dist/shared/boundary-provider/index.d.ts +1 -0
- package/dist/shared/boundary-provider/index.js +1 -0
- package/dist/shared/cookie/UniversalCookie.js +1 -1
- package/dist/shared/index.d.ts +2 -3
- package/dist/shared/index.js +2 -3
- package/dist/shared/logger/index.js +1 -1
- package/dist/shared/request-context/Internal.d.ts +16 -0
- package/dist/shared/request-context/Internal.js +24 -0
- package/dist/shared/request-context/index.d.ts +1 -0
- package/dist/shared/request-context/index.js +2 -0
- package/dist/svelte/async-signal/AsyncSignal.svelte.d.ts +20 -4
- package/dist/svelte/async-signal/AsyncSignal.svelte.js +53 -13
- package/dist/svelte/async-signal/README.md +89 -0
- package/dist/svelte/index.d.ts +1 -0
- package/dist/svelte/index.js +1 -0
- package/dist/svelte/query/Query.svelte.d.ts +1 -1
- package/dist/svelte/query/Query.svelte.js +14 -6
- package/dist/svelte/query/SearchParamsSync.js +11 -3
- package/dist/{shared → svelte}/redirect/index.d.ts +2 -8
- package/package.json +35 -26
- package/dist/external/edges/Dev.d.ts +0 -1
- package/dist/external/edges/Dev.js +0 -1
- package/dist/external/edges/Edges.d.ts +0 -1
- package/dist/external/edges/Edges.js +0 -1
- package/dist/external/edges/ServerContext.d.ts +0 -1
- package/dist/external/edges/ServerContext.js +0 -1
- package/dist/external/edges/_edges.d.ts +0 -1
- package/dist/external/edges/_edges.js +0 -1
- package/dist/external/i18n/index.d.ts +0 -1
- package/dist/external/i18n/index.js +0 -1
- package/dist/shared/event-bus/EventBus.d.ts +0 -12
- package/dist/shared/event-bus/EventBus.js +0 -3
- package/dist/shared/event-bus/index.d.ts +0 -1
- package/dist/shared/event-bus/index.js +0 -1
- /package/dist/{shared → svelte}/redirect/index.js +0 -0
package/dist/shared/app/App.js
CHANGED
|
@@ -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 '../../
|
|
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.
|
|
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 = (
|
|
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
|
|
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(
|
|
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
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 = (
|
|
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
|
-
|
|
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 = (
|
|
207
|
+
const runClientError = (input) => {
|
|
242
208
|
if (!BROWSER)
|
|
243
209
|
return undefined;
|
|
244
210
|
bindErrorResolver();
|
|
245
211
|
return callbacks.useClientError?.({
|
|
246
|
-
|
|
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
|
|
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
|
|
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 {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
}
|
|
10
|
-
export
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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 '
|
|
4
|
-
|
|
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
|
|
9
|
+
event: RequestEvent;
|
|
9
10
|
ensureRoute: EnsureRoute;
|
|
10
|
-
}
|
|
11
|
-
export
|
|
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 '../../../
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ContextData } from '../../
|
|
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 '../../
|
|
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
|
|
10
|
+
return getContextInternals(requestContext);
|
|
10
11
|
try {
|
|
11
|
-
return RequestContext.current()
|
|
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>) =>
|
|
17
|
+
boot?: (services: ResolvedServices<T>) => undefined;
|
|
17
18
|
register: ProviderFactory<T, D>;
|
|
18
19
|
}
|
|
19
|
-
export declare const
|
|
20
|
-
export declare function cleanupProvider(name:
|
|
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 {};
|