@azure-net/kit 5.0.0-3 → 5.0.0
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/dist/delivery/injectable-dependencies/AsyncHelpers.d.ts +3 -3
- package/dist/delivery/injectable-dependencies/AsyncHelpers.js +26 -3
- package/dist/shared/app/index.d.ts +1 -1
- package/dist/shared/app/middleware/ClientMiddleware.d.ts +2 -1
- package/dist/shared/app/middleware/ClientMiddleware.js +3 -1
- package/dist/shared/app/middleware/ServerMiddleware.d.ts +2 -1
- package/dist/shared/app/middleware/ServerMiddleware.js +3 -1
- package/dist/shared/app/middleware/Shared.d.ts +4 -0
- package/dist/shared/app/middleware/Shared.js +31 -1
- package/package.json +2 -1
|
@@ -10,6 +10,7 @@ export interface AsyncHelperRetry {
|
|
|
10
10
|
call?: () => Promise<Error | void>;
|
|
11
11
|
}
|
|
12
12
|
type Action<Res> = () => Promise<Res>;
|
|
13
|
+
type ErrorParser<ErrorResult extends object> = ReturnType<typeof createErrorHandler<ErrorResult>>;
|
|
13
14
|
export interface AsyncActionSettings<Res = never, Req = never, ErrorResult = AppError<Error>> {
|
|
14
15
|
beforeSend?: (actions: {
|
|
15
16
|
next: () => void;
|
|
@@ -24,11 +25,10 @@ export interface AsyncResourceSettings<Res = never, Req = never, ErrorResult = A
|
|
|
24
25
|
}
|
|
25
26
|
export declare class AsyncHelperError extends Error {
|
|
26
27
|
}
|
|
27
|
-
export declare const createAsyncHelpers: <ErrorResult extends object>(
|
|
28
|
-
handler?: ReturnType<typeof createErrorHandler<ErrorResult>>;
|
|
29
|
-
}) => {
|
|
28
|
+
export declare const createAsyncHelpers: <ErrorResult extends object>() => {
|
|
30
29
|
createAsyncAction: <Res = never, Req = never>(action: Action<Res>, args?: AsyncActionSettings<Res, Req, ErrorResult>) => Promise<AsyncActionResponse<Res, Req, ErrorResult>>;
|
|
31
30
|
createAsyncResource: <Res = never, Req_1 = never>(action: Action<Res>, args?: AsyncResourceSettings<Res, Req_1, ErrorResult>) => Promise<Res>;
|
|
32
31
|
errorParser: <T = unknown>(error: Error, asyncHelperRetry?: AsyncHelperRetry) => Promise<IAppError<T> & ErrorResult>;
|
|
32
|
+
useHandler: (parser: ErrorParser<ErrorResult>) => void;
|
|
33
33
|
};
|
|
34
34
|
export {};
|
|
@@ -1,9 +1,31 @@
|
|
|
1
1
|
import { createErrorHandler } from './ErrorHandler.js';
|
|
2
2
|
import {} from '../../shared/app-error/AppError.js';
|
|
3
|
+
import { BROWSER } from '../../external/tools/index.js';
|
|
4
|
+
import { RequestContext } from '../../external/edges/ServerContext.js';
|
|
5
|
+
const HANDLER_CONTEXT_KEY = '__azureNetAsyncHelperErrorParser__';
|
|
3
6
|
export class AsyncHelperError extends Error {
|
|
4
7
|
}
|
|
5
|
-
export const createAsyncHelpers = (
|
|
6
|
-
const
|
|
8
|
+
export const createAsyncHelpers = () => {
|
|
9
|
+
const defaultErrorParser = createErrorHandler();
|
|
10
|
+
let clientErrorParser;
|
|
11
|
+
const getErrorParser = () => {
|
|
12
|
+
if (BROWSER)
|
|
13
|
+
return clientErrorParser ?? defaultErrorParser;
|
|
14
|
+
try {
|
|
15
|
+
return RequestContext.current().data[HANDLER_CONTEXT_KEY] ?? defaultErrorParser;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return defaultErrorParser;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const errorParser = async (error, asyncHelperRetry) => await getErrorParser()(error, asyncHelperRetry);
|
|
22
|
+
const useHandler = (parser) => {
|
|
23
|
+
if (BROWSER) {
|
|
24
|
+
clientErrorParser = parser;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
RequestContext.current().data[HANDLER_CONTEXT_KEY] = parser;
|
|
28
|
+
};
|
|
7
29
|
const normalizeError = (err) => (err instanceof Error ? err : new Error(String(err)));
|
|
8
30
|
const prepareErrors = async (error, retry) => {
|
|
9
31
|
let retryResult = undefined;
|
|
@@ -101,6 +123,7 @@ export const createAsyncHelpers = (opts) => {
|
|
|
101
123
|
return {
|
|
102
124
|
createAsyncAction,
|
|
103
125
|
createAsyncResource,
|
|
104
|
-
errorParser
|
|
126
|
+
errorParser,
|
|
127
|
+
useHandler
|
|
105
128
|
};
|
|
106
129
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { createApp, type AppClientErrorCallback, type AppClientErrorContext, type AppClientInitLifecycleCallback, type AppClientInitLifecycleContext, type AppClientLifecycleCallback, type AppClientLifecycleContext, type AppContainer, type AppRegistrar, type AppServerErrorCallback, type AppServerErrorContext, type AppServerInitLifecycleCallback, type AppServerInitLifecycleContext, type AppServerLifecycleCallback, type AppServerLifecycleContext, type AppUniversalLifecycleCallback, type AppUniversalLifecycleContext, type CreateAppInstance } from './App.js';
|
|
2
2
|
export type { IClientMiddleware } from './middleware/ClientMiddleware.js';
|
|
3
3
|
export type { IServerMiddleware } from './middleware/ServerMiddleware.js';
|
|
4
|
-
export type { RedirectStatus } from './middleware/Shared.js';
|
|
4
|
+
export type { EnsureRoute, EnsureRouteSource, EnsureRouteTarget, RedirectStatus } from './middleware/Shared.js';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type BeforeNavigate } from '@sveltejs/kit';
|
|
2
|
-
import type
|
|
2
|
+
import { type EnsureRoute, type RedirectStatus } from './Shared.js';
|
|
3
3
|
export type IClientMiddleware = (middlewareData: {
|
|
4
4
|
to: URL;
|
|
5
5
|
from?: URL;
|
|
6
6
|
next: (location?: string | URL, status?: RedirectStatus) => void;
|
|
7
|
+
ensureRoute: EnsureRoute;
|
|
7
8
|
}) => Promise<void> | void;
|
|
8
9
|
export declare const executeClientMiddlewares: (middlewares: IClientMiddleware[], navigation?: BeforeNavigate) => Promise<void>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {} from '@sveltejs/kit';
|
|
2
|
+
import { ensureRoute } from './Shared.js';
|
|
2
3
|
import { page } from '$app/state';
|
|
3
4
|
import { goto } from '$app/navigation';
|
|
4
5
|
export const executeClientMiddlewares = async (middlewares, navigation) => {
|
|
@@ -18,7 +19,8 @@ export const executeClientMiddlewares = async (middlewares, navigation) => {
|
|
|
18
19
|
await middleware({
|
|
19
20
|
to,
|
|
20
21
|
from,
|
|
21
|
-
next
|
|
22
|
+
next,
|
|
23
|
+
ensureRoute
|
|
22
24
|
});
|
|
23
25
|
if (!shouldContinue) {
|
|
24
26
|
navigation?.cancel();
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type RequestEvent } from '@sveltejs/kit';
|
|
2
|
-
import type
|
|
2
|
+
import { type EnsureRoute, type RedirectStatus } from './Shared.js';
|
|
3
3
|
export type IServerMiddleware = (middlewareData: {
|
|
4
4
|
to: RequestEvent['url'];
|
|
5
5
|
from?: RequestEvent['url'];
|
|
6
6
|
next: (location?: string | URL, status?: RedirectStatus) => void;
|
|
7
7
|
event?: RequestEvent;
|
|
8
|
+
ensureRoute: EnsureRoute;
|
|
8
9
|
}) => Promise<void> | void;
|
|
9
10
|
export declare const executeServerMiddlewares: (middlewares: IServerMiddleware[]) => Promise<void>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { error, redirect } from '@sveltejs/kit';
|
|
2
|
+
import { ensureRoute } from './Shared.js';
|
|
2
3
|
import { BROWSER } from '../../../external/tools/index.js';
|
|
3
4
|
import { RequestContext } from '../../../external/edges/ServerContext.js';
|
|
4
5
|
export const executeServerMiddlewares = async (middlewares) => {
|
|
@@ -20,7 +21,8 @@ export const executeServerMiddlewares = async (middlewares) => {
|
|
|
20
21
|
event,
|
|
21
22
|
to,
|
|
22
23
|
from,
|
|
23
|
-
next
|
|
24
|
+
next,
|
|
25
|
+
ensureRoute
|
|
24
26
|
});
|
|
25
27
|
if (!shouldContinue) {
|
|
26
28
|
error(403, 'Navigation blocked: middleware chain stopped (next() not called).');
|
|
@@ -1 +1,5 @@
|
|
|
1
1
|
export type RedirectStatus = 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308;
|
|
2
|
+
export type EnsureRouteSource = string | readonly string[];
|
|
3
|
+
export type EnsureRouteTarget = string | URL;
|
|
4
|
+
export type EnsureRoute = (route: EnsureRouteSource, target: EnsureRouteTarget) => boolean;
|
|
5
|
+
export declare const ensureRoute: EnsureRoute;
|
|
@@ -1 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
const trimSlashes = (value) => value.replace(/^\/+|\/+$/g, '');
|
|
2
|
+
const normalizePathname = (value) => {
|
|
3
|
+
const pathname = value instanceof URL ? value.pathname : value;
|
|
4
|
+
const normalized = `/${trimSlashes(pathname.split('?')[0] ?? '/')}`;
|
|
5
|
+
return normalized === '//' ? '/' : normalized;
|
|
6
|
+
};
|
|
7
|
+
const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
8
|
+
const routeToRegex = (route) => {
|
|
9
|
+
const normalizedRoute = normalizePathname(route);
|
|
10
|
+
if (normalizedRoute === '/')
|
|
11
|
+
return /^\/$/;
|
|
12
|
+
const segments = trimSlashes(normalizedRoute).split('/');
|
|
13
|
+
const pattern = segments
|
|
14
|
+
.map((segment) => {
|
|
15
|
+
if (/^\{[^/{}]+\}$/.test(segment)) {
|
|
16
|
+
return '[^/]+';
|
|
17
|
+
}
|
|
18
|
+
return escapeRegex(segment).replace(/\\\{[^/{}]+\\\}/g, '[^/]+');
|
|
19
|
+
})
|
|
20
|
+
.join('\\/');
|
|
21
|
+
return new RegExp(`^\\/${pattern}$`);
|
|
22
|
+
};
|
|
23
|
+
export const ensureRoute = (route, target) => {
|
|
24
|
+
const pathname = normalizePathname(target);
|
|
25
|
+
const routes = Array.isArray(route) ? route : [route];
|
|
26
|
+
for (const item of routes) {
|
|
27
|
+
if (routeToRegex(item).test(pathname))
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azure-net/kit",
|
|
3
|
-
"version": "5.0.0
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Pixel1917",
|
|
6
6
|
"description": "Universal toolkit and library collection, developed as part of the Azure-net ecosystem",
|
|
@@ -88,6 +88,7 @@
|
|
|
88
88
|
"@testing-library/jest-dom": "^6.9.1",
|
|
89
89
|
"@testing-library/svelte": "^5.3.1",
|
|
90
90
|
"commitizen": "^4.3.1",
|
|
91
|
+
"env-cmd": "^11.0.0",
|
|
91
92
|
"eslint": "^10.2.1",
|
|
92
93
|
"eslint-config-prettier": "^10.1.8",
|
|
93
94
|
"eslint-plugin-svelte": "^3.17.0",
|