@azure-net/kit 5.4.0 → 6.0.0-next
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/index.d.ts +1 -1
- package/dist/delivery/index.js +1 -1
- package/dist/delivery/injectable-dependencies/AsyncHelpers.d.ts +1 -11
- package/dist/delivery/injectable-dependencies/AsyncHelpers.js +8 -34
- package/dist/delivery/injectable-dependencies/index.d.ts +0 -1
- package/dist/delivery/injectable-dependencies/index.js +0 -1
- package/dist/delivery/schema/Schema.d.ts +4 -4
- package/dist/delivery/schema/Schema.js +6 -6
- package/dist/delivery/schema/rules/Rules.js +14 -6
- package/dist/errors.d.ts +1 -2
- package/dist/errors.js +1 -2
- package/dist/infra/response/BaseResponse.d.ts +1 -1
- package/dist/infra/response/BaseResponse.js +1 -1
- package/dist/plugin/AzureNetPlugin.js +1 -1
- package/dist/shared/app/App.d.ts +17 -1
- package/dist/shared/app/App.js +79 -34
- package/dist/shared/app/index.d.ts +1 -1
- package/dist/shared/app/middleware/ClientMiddleware.d.ts +3 -3
- package/dist/shared/app/middleware/ClientMiddleware.js +4 -5
- package/dist/shared/app-error/AppError.d.ts +2 -0
- package/dist/shared/app-error/AppError.js +2 -1
- package/dist/shared/app-error/ErrorRuntime.d.ts +11 -0
- package/dist/shared/app-error/ErrorRuntime.js +57 -0
- package/dist/shared/app-error/index.d.ts +1 -0
- package/dist/shared/app-error/index.js +1 -0
- package/dist/shared/boundary-provider/Provider.js +24 -4
- package/dist/svelte/active-form/ActiveForm.svelte.d.ts +1 -1
- package/dist/svelte/active-form/ActiveForm.svelte.js +14 -4
- package/dist/svelte/async-signal/AsyncSignal.svelte.d.ts +12 -1
- package/dist/svelte/async-signal/AsyncSignal.svelte.js +158 -7
- package/dist/svelte/effect/Effect.svelte.d.ts +4 -0
- package/dist/svelte/effect/Effect.svelte.js +27 -0
- package/dist/svelte/effect/index.d.ts +1 -0
- package/dist/svelte/effect/index.js +1 -0
- package/dist/svelte/index.d.ts +3 -2
- package/dist/svelte/index.js +2 -1
- package/dist/svelte/query/Query.svelte.d.ts +14 -11
- package/dist/svelte/query/Query.svelte.js +78 -68
- package/dist/svelte/query/SearchParamsSync.d.ts +2 -0
- package/dist/svelte/query/SearchParamsSync.js +119 -0
- package/package.json +1 -1
- package/dist/delivery/injectable-dependencies/ErrorHandler.d.ts +0 -7
- package/dist/delivery/injectable-dependencies/ErrorHandler.js +0 -15
|
@@ -1,97 +1,106 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { replaceState } from '$app/navigation';
|
|
2
|
+
import { page } from '$app/state';
|
|
3
|
+
import { createEffect } from '../effect/Effect.svelte.js';
|
|
3
4
|
import { cloneStateValue } from '../shared/cloneStateValue.js';
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
import { fromSearchParams, toSearchParams } from './SearchParamsSync.js';
|
|
6
|
+
const trackDeep = (value, seen) => {
|
|
7
|
+
if (value === null || typeof value !== 'object')
|
|
6
8
|
return;
|
|
7
|
-
seen
|
|
9
|
+
const visited = seen ?? new WeakSet();
|
|
10
|
+
if (visited.has(value))
|
|
11
|
+
return;
|
|
12
|
+
visited.add(value);
|
|
8
13
|
if (Array.isArray(value)) {
|
|
9
14
|
for (const item of value)
|
|
10
|
-
trackDeep(item,
|
|
15
|
+
trackDeep(item, visited);
|
|
11
16
|
return;
|
|
12
17
|
}
|
|
13
18
|
if (value instanceof Map) {
|
|
14
19
|
for (const [key, item] of value) {
|
|
15
|
-
trackDeep(key,
|
|
16
|
-
trackDeep(item,
|
|
20
|
+
trackDeep(key, visited);
|
|
21
|
+
trackDeep(item, visited);
|
|
17
22
|
}
|
|
18
23
|
return;
|
|
19
24
|
}
|
|
20
25
|
if (value instanceof Set) {
|
|
21
26
|
for (const item of value)
|
|
22
|
-
trackDeep(item,
|
|
27
|
+
trackDeep(item, visited);
|
|
23
28
|
return;
|
|
24
29
|
}
|
|
25
30
|
const prototype = Object.getPrototypeOf(value);
|
|
26
31
|
if (prototype !== Object.prototype && prototype !== null)
|
|
27
32
|
return;
|
|
28
|
-
for (const key of Reflect.ownKeys(value))
|
|
29
|
-
trackDeep(Reflect.get(value, key),
|
|
33
|
+
for (const key of Reflect.ownKeys(value))
|
|
34
|
+
trackDeep(Reflect.get(value, key), visited);
|
|
35
|
+
};
|
|
36
|
+
const readPath = (source, path) => {
|
|
37
|
+
let value = source;
|
|
38
|
+
for (const key of path.split('.')) {
|
|
39
|
+
if (value === null || typeof value !== 'object')
|
|
40
|
+
return undefined;
|
|
41
|
+
value = Reflect.get(value, key);
|
|
30
42
|
}
|
|
43
|
+
return value;
|
|
44
|
+
};
|
|
45
|
+
const createDeepDependency = (read) => {
|
|
46
|
+
let version = 0;
|
|
47
|
+
return () => {
|
|
48
|
+
const value = read();
|
|
49
|
+
if (value === null || typeof value !== 'object')
|
|
50
|
+
return value;
|
|
51
|
+
trackDeep(value);
|
|
52
|
+
return ++version;
|
|
53
|
+
};
|
|
31
54
|
};
|
|
32
55
|
export const createQuery = (initialValue, options) => {
|
|
33
56
|
const baseInitial = cloneStateValue(initialValue);
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
includeKeys.forEach((key) => {
|
|
42
|
-
lastSnapshots.set(key, cloneStateValue(data[key]));
|
|
43
|
-
});
|
|
44
|
-
$effect(() => {
|
|
45
|
-
const changedKeys = [];
|
|
46
|
-
includeKeys.forEach((key) => {
|
|
47
|
-
const nextValue = data[key];
|
|
48
|
-
trackDeep(nextValue);
|
|
49
|
-
const nextSnapshot = cloneStateValue(nextValue);
|
|
50
|
-
if (!ObjectUtil.equals(lastSnapshots.get(key), nextSnapshot)) {
|
|
51
|
-
changedKeys.push(key);
|
|
52
|
-
lastSnapshots.set(key, nextSnapshot);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
if (!changedKeys.length)
|
|
56
|
-
return;
|
|
57
|
-
const previousController = onChangeController;
|
|
58
|
-
if (previousController)
|
|
59
|
-
previousController.abort();
|
|
60
|
-
const localController = new AbortController();
|
|
61
|
-
onChangeController = localController;
|
|
62
|
-
const localRunId = ++onChangeRunId;
|
|
63
|
-
const run = async () => {
|
|
64
|
-
await options.onChange.handler({
|
|
65
|
-
changedKeys,
|
|
66
|
-
signal: localController.signal,
|
|
67
|
-
snapshot: cloneStateValue(data)
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
untrack(() => {
|
|
71
|
-
void run()
|
|
72
|
-
.catch(() => undefined)
|
|
73
|
-
.finally(() => {
|
|
74
|
-
if (onChangeRunId === localRunId && onChangeController === localController) {
|
|
75
|
-
onChangeController = null;
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
$effect(() => {
|
|
81
|
-
return () => {
|
|
82
|
-
if (onChangeController)
|
|
83
|
-
onChangeController.abort();
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
}
|
|
57
|
+
const searchParamsSync = options?.syncWithSearchParams;
|
|
58
|
+
const syncSettings = typeof searchParamsSync === 'object' ? searchParamsSync : undefined;
|
|
59
|
+
const syncEnabled = Boolean(searchParamsSync);
|
|
60
|
+
const parseSearchParams = syncSettings?.fromSearchParams ?? (fromSearchParams);
|
|
61
|
+
const serializeSearchParams = syncSettings?.toSearchParams ?? (toSearchParams);
|
|
62
|
+
const parsedInitial = syncEnabled ? parseSearchParams(new URLSearchParams(page.url.searchParams), cloneStateValue(baseInitial)) : undefined;
|
|
63
|
+
let data = $state(parsedInitial ? { ...cloneStateValue(baseInitial), ...cloneStateValue(parsedInitial) } : cloneStateValue(baseInitial));
|
|
87
64
|
const reset = () => {
|
|
88
65
|
data = cloneStateValue(baseInitial);
|
|
89
66
|
};
|
|
90
67
|
const patch = (value) => {
|
|
91
68
|
data = { ...data, ...value };
|
|
92
69
|
};
|
|
93
|
-
const
|
|
94
|
-
const
|
|
70
|
+
const createSnapshot = () => cloneStateValue(data);
|
|
71
|
+
const getInitial = () => cloneStateValue(baseInitial);
|
|
72
|
+
const createQueryEffect = (callback, dependencies) => {
|
|
73
|
+
const effectDependencies = dependencies === undefined
|
|
74
|
+
? [createDeepDependency(() => data)]
|
|
75
|
+
: [...new Set(dependencies)].map((path) => createDeepDependency(() => readPath(data, path)));
|
|
76
|
+
createEffect(callback, effectDependencies);
|
|
77
|
+
};
|
|
78
|
+
if (syncEnabled) {
|
|
79
|
+
const managedKeys = new Set(Object.keys(baseInitial));
|
|
80
|
+
const captureInitialSyncedData = () => cloneStateValue(data);
|
|
81
|
+
const initialSyncedData = captureInitialSyncedData();
|
|
82
|
+
let initialized = false;
|
|
83
|
+
createEffect(() => {
|
|
84
|
+
const nextParams = serializeSearchParams(data, baseInitial);
|
|
85
|
+
for (const key of nextParams.keys())
|
|
86
|
+
managedKeys.add(key);
|
|
87
|
+
if (!initialized) {
|
|
88
|
+
initialized = true;
|
|
89
|
+
const initialParams = serializeSearchParams(initialSyncedData, baseInitial);
|
|
90
|
+
for (const key of initialParams.keys())
|
|
91
|
+
managedKeys.add(key);
|
|
92
|
+
if (nextParams.toString() === initialParams.toString())
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const url = new URL(page.url);
|
|
96
|
+
for (const key of managedKeys)
|
|
97
|
+
url.searchParams.delete(key);
|
|
98
|
+
for (const [key, value] of nextParams)
|
|
99
|
+
url.searchParams.append(key, value);
|
|
100
|
+
if (url.search !== page.url.search)
|
|
101
|
+
replaceState(url, page.state);
|
|
102
|
+
}, [createDeepDependency(() => data)]);
|
|
103
|
+
}
|
|
95
104
|
return {
|
|
96
105
|
get data() {
|
|
97
106
|
return data;
|
|
@@ -101,7 +110,8 @@ export const createQuery = (initialValue, options) => {
|
|
|
101
110
|
},
|
|
102
111
|
patch,
|
|
103
112
|
reset,
|
|
104
|
-
|
|
105
|
-
|
|
113
|
+
createSnapshot,
|
|
114
|
+
getInitial,
|
|
115
|
+
createEffect: createQueryEffect
|
|
106
116
|
};
|
|
107
117
|
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const INVALID_VALUE = Symbol('invalid-query-search-param');
|
|
2
|
+
const isPlainObject = (value) => {
|
|
3
|
+
if (value === null || typeof value !== 'object')
|
|
4
|
+
return false;
|
|
5
|
+
const prototype = Object.getPrototypeOf(value);
|
|
6
|
+
return prototype === Object.prototype || prototype === null;
|
|
7
|
+
};
|
|
8
|
+
const parseScalar = (value, initial) => {
|
|
9
|
+
if (typeof initial === 'string')
|
|
10
|
+
return value;
|
|
11
|
+
if (typeof initial === 'number') {
|
|
12
|
+
if (!value.trim())
|
|
13
|
+
return INVALID_VALUE;
|
|
14
|
+
const parsed = Number(value);
|
|
15
|
+
return Number.isFinite(parsed) ? parsed : INVALID_VALUE;
|
|
16
|
+
}
|
|
17
|
+
if (typeof initial === 'boolean') {
|
|
18
|
+
const normalized = value.toLowerCase();
|
|
19
|
+
if (normalized === 'true' || normalized === '1')
|
|
20
|
+
return true;
|
|
21
|
+
if (normalized === 'false' || normalized === '0')
|
|
22
|
+
return false;
|
|
23
|
+
return INVALID_VALUE;
|
|
24
|
+
}
|
|
25
|
+
if (typeof initial === 'bigint') {
|
|
26
|
+
if (!value.trim())
|
|
27
|
+
return INVALID_VALUE;
|
|
28
|
+
try {
|
|
29
|
+
return BigInt(value);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return INVALID_VALUE;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (initial instanceof Date) {
|
|
36
|
+
const parsed = new Date(value);
|
|
37
|
+
return Number.isNaN(parsed.getTime()) ? INVALID_VALUE : parsed;
|
|
38
|
+
}
|
|
39
|
+
if (initial instanceof URL) {
|
|
40
|
+
try {
|
|
41
|
+
return new URL(value, initial);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return INVALID_VALUE;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (initial instanceof URLSearchParams)
|
|
48
|
+
return new URLSearchParams(value);
|
|
49
|
+
if (isPlainObject(initial)) {
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(value);
|
|
52
|
+
return isPlainObject(parsed) ? parsed : INVALID_VALUE;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return INVALID_VALUE;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return INVALID_VALUE;
|
|
59
|
+
};
|
|
60
|
+
const parseValue = (params, key, initial) => {
|
|
61
|
+
if (Array.isArray(initial)) {
|
|
62
|
+
const values = params.getAll(key);
|
|
63
|
+
if (!values.length)
|
|
64
|
+
return INVALID_VALUE;
|
|
65
|
+
if (!initial.length)
|
|
66
|
+
return values;
|
|
67
|
+
const parsed = values.map((value) => parseScalar(value, initial[0]));
|
|
68
|
+
return parsed.some((value) => value === INVALID_VALUE) ? INVALID_VALUE : parsed;
|
|
69
|
+
}
|
|
70
|
+
const value = params.get(key);
|
|
71
|
+
return value === null ? INVALID_VALUE : parseScalar(value, initial);
|
|
72
|
+
};
|
|
73
|
+
const serializeScalar = (value) => {
|
|
74
|
+
if (typeof value === 'string' || typeof value === 'boolean' || typeof value === 'bigint')
|
|
75
|
+
return String(value);
|
|
76
|
+
if (typeof value === 'number')
|
|
77
|
+
return Number.isFinite(value) ? String(value) : undefined;
|
|
78
|
+
if (value instanceof Date)
|
|
79
|
+
return Number.isNaN(value.getTime()) ? undefined : value.toISOString();
|
|
80
|
+
if (value instanceof URL || value instanceof URLSearchParams)
|
|
81
|
+
return value.toString();
|
|
82
|
+
if (isPlainObject(value)) {
|
|
83
|
+
try {
|
|
84
|
+
return JSON.stringify(value);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
};
|
|
92
|
+
export const fromSearchParams = (params, initial) => {
|
|
93
|
+
const result = {};
|
|
94
|
+
for (const key of Object.keys(initial)) {
|
|
95
|
+
if (!params.has(key))
|
|
96
|
+
continue;
|
|
97
|
+
const parsed = parseValue(params, key, initial[key]);
|
|
98
|
+
if (parsed !== INVALID_VALUE)
|
|
99
|
+
Reflect.set(result, key, parsed);
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
};
|
|
103
|
+
export const toSearchParams = (data) => {
|
|
104
|
+
const params = new URLSearchParams();
|
|
105
|
+
for (const [key, value] of Object.entries(data)) {
|
|
106
|
+
if (Array.isArray(value)) {
|
|
107
|
+
for (const item of value) {
|
|
108
|
+
const serialized = serializeScalar(item);
|
|
109
|
+
if (serialized !== undefined)
|
|
110
|
+
params.append(key, serialized);
|
|
111
|
+
}
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const serialized = serializeScalar(value);
|
|
115
|
+
if (serialized !== undefined)
|
|
116
|
+
params.set(key, serialized);
|
|
117
|
+
}
|
|
118
|
+
return params;
|
|
119
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { AppError, type IAppError } from '../../shared/app-error/AppError.js';
|
|
2
|
-
import { AppEvents } from '../../shared/event-bus/EventBus.js';
|
|
3
|
-
import type { AsyncHelperRetry } from './AsyncHelpers.js';
|
|
4
|
-
export type ErrorHandlerContext = {
|
|
5
|
-
AppEvents: typeof AppEvents;
|
|
6
|
-
};
|
|
7
|
-
export declare const createErrorHandler: <CustomData extends object>(handle?: <T = unknown>(error: AppError<T>, asyncHelperRetry: AsyncHelperRetry, context: ErrorHandlerContext) => Promise<IAppError<T> & CustomData>) => <T = unknown>(error: Error, asyncHelperRetry?: AsyncHelperRetry) => Promise<IAppError<T> & CustomData>;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { AppError } from '../../shared/app-error/AppError.js';
|
|
2
|
-
import { AppEvents } from '../../shared/event-bus/EventBus.js';
|
|
3
|
-
export const createErrorHandler = (handle) => {
|
|
4
|
-
return async (error, asyncHelperRetry) => {
|
|
5
|
-
const appError = new AppError(error);
|
|
6
|
-
if (handle) {
|
|
7
|
-
const handled = await handle(appError, asyncHelperRetry ?? { can: false }, { AppEvents });
|
|
8
|
-
if (handled?.appErrorConvert) {
|
|
9
|
-
return handled;
|
|
10
|
-
}
|
|
11
|
-
throw new Error('Method "handle" must return result of "toPlainObject" method in AppError');
|
|
12
|
-
}
|
|
13
|
-
return appError.toPlainObject();
|
|
14
|
-
};
|
|
15
|
-
};
|