@azure-net/kit 3.9.1 → 3.9.3

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 (43) hide show
  1. package/dist/core/delivery/index.d.ts +1 -4
  2. package/dist/core/delivery/index.js +1 -4
  3. package/dist/core/delivery/injectableDependencies/AsyncHelpers.d.ts +28 -36
  4. package/dist/core/delivery/injectableDependencies/AsyncHelpers.js +79 -137
  5. package/dist/core/delivery/injectableDependencies/ErrorHandler.d.ts +3 -21
  6. package/dist/core/delivery/injectableDependencies/ErrorHandler.js +11 -42
  7. package/dist/core/delivery/schema/Schema.d.ts +13 -4
  8. package/dist/core/delivery/schema/Schema.js +11 -2
  9. package/dist/core/delivery/schema/rules/messages/index.d.ts +1 -0
  10. package/dist/core/delivery/schema/rules/messages/index.js +1 -0
  11. package/dist/core/delivery.d.ts +5 -0
  12. package/dist/core/delivery.js +5 -0
  13. package/dist/core/errors.d.ts +4 -0
  14. package/dist/core/errors.js +4 -0
  15. package/dist/core/index.d.ts +7 -8
  16. package/dist/core/index.js +7 -8
  17. package/dist/core/infra/httpService/HttpServiceInstance.d.ts +16 -8
  18. package/dist/core/infra/httpService/HttpServiceInstance.js +47 -49
  19. package/dist/core/infra/query/QueryBuilder.js +2 -1
  20. package/dist/core/infra/response/BaseResponse.js +3 -2
  21. package/dist/core/infra.d.ts +6 -0
  22. package/dist/core/infra.js +6 -0
  23. package/dist/core/shared/appError/AppError.d.ts +30 -0
  24. package/dist/core/shared/appError/AppError.js +66 -0
  25. package/dist/core/shared/appEventBus/EventBus.js +1 -1
  26. package/dist/core/shared/boundaryProvider/Provider.js +4 -3
  27. package/dist/core/shared/classMirror/ClassMirror.d.ts +7 -2
  28. package/dist/core/shared/classMirror/ClassMirror.js +34 -15
  29. package/dist/core/shared/cookie/UniversalCookie.js +8 -10
  30. package/dist/core/svelte/ActiveForm/ActiveForm.svelte.d.ts +6 -5
  31. package/dist/core/svelte/ActiveForm/ActiveForm.svelte.js +31 -26
  32. package/dist/core/svelte/AsyncSignal/AsyncSignal.svelte.d.ts +0 -1
  33. package/dist/core/svelte/AsyncSignal/AsyncSignal.svelte.js +21 -30
  34. package/dist/core/svelte/Query/Query.svelte.d.ts +11 -12
  35. package/dist/core/svelte/Query/Query.svelte.js +42 -54
  36. package/dist/core/ui/scrollTo/index.js +2 -2
  37. package/dist/edges/index.d.ts +1 -1
  38. package/dist/edges/index.js +1 -1
  39. package/package.json +13 -9
  40. package/dist/core/delivery/serverAction/CreateServerAction.d.ts +0 -15
  41. package/dist/core/delivery/serverAction/CreateServerAction.js +0 -22
  42. package/dist/core/delivery/serverAction/index.d.ts +0 -1
  43. package/dist/core/delivery/serverAction/index.js +0 -1
@@ -1,7 +1,7 @@
1
1
  import { untrack } from 'svelte';
2
- import { EnvironmentUtil } from '@azure-net/tools';
2
+ import { BROWSER } from '@azure-net/tools/environment';
3
3
  const createAsyncSignalManager = () => {
4
- const instances = EnvironmentUtil.isBrowser ? new Map() : undefined;
4
+ const instances = BROWSER ? new Map() : undefined;
5
5
  const generateUid = () => {
6
6
  return Math.random().toString(36).substring(2, 9);
7
7
  };
@@ -46,7 +46,7 @@ const createAsyncSignalManager = () => {
46
46
  };
47
47
  const asyncSignalManager = createAsyncSignalManager();
48
48
  export const createAsyncSignal = (handler, options = {}) => {
49
- const { server = false, immediate = true, watch = [], initialData = undefined, key } = options;
49
+ const { server = false, immediate = true, initialData = undefined, key } = options;
50
50
  const resolvedInitialData = typeof initialData === 'function' ? initialData() : initialData;
51
51
  let data = $state(resolvedInitialData);
52
52
  let error = $state();
@@ -59,24 +59,29 @@ export const createAsyncSignal = (handler, options = {}) => {
59
59
  const run = async (runId, source) => {
60
60
  const initial = !started;
61
61
  started = true;
62
- if (abortController) {
63
- abortController.abort();
62
+ const prevController = abortController;
63
+ if (prevController) {
64
+ prevController.abort();
64
65
  }
65
- abortController = new AbortController();
66
+ const localController = new AbortController();
67
+ abortController = localController;
66
68
  if (options.beforeSend) {
67
69
  await options.beforeSend({ initial, source });
68
70
  }
71
+ if (runId !== currentRunId || abortController !== localController || localController.signal.aborted) {
72
+ return undefined;
73
+ }
69
74
  status = 'pending';
70
75
  error = undefined;
71
76
  try {
72
- const result = await handler(abortController.signal);
73
- if (abortController.signal.aborted) {
77
+ const result = await handler(localController.signal);
78
+ if (runId !== currentRunId || abortController !== localController || localController.signal.aborted) {
74
79
  return undefined;
75
80
  }
76
81
  data = result;
77
82
  status = 'success';
78
83
  if (options.onSuccess) {
79
- options.onSuccess(result);
84
+ await options.onSuccess(result);
80
85
  }
81
86
  return result;
82
87
  }
@@ -84,10 +89,13 @@ export const createAsyncSignal = (handler, options = {}) => {
84
89
  if (err instanceof Error && err.name === 'AbortError') {
85
90
  return undefined;
86
91
  }
92
+ if (runId !== currentRunId || abortController !== localController || localController.signal.aborted) {
93
+ return undefined;
94
+ }
87
95
  error = err;
88
96
  status = 'error';
89
97
  if (options.onError) {
90
- options.onError(err);
98
+ await options.onError(err);
91
99
  }
92
100
  return undefined;
93
101
  }
@@ -98,9 +106,6 @@ export const createAsyncSignal = (handler, options = {}) => {
98
106
  }
99
107
  };
100
108
  const start = (source) => {
101
- if (currentPromise) {
102
- return currentPromise;
103
- }
104
109
  const runId = ++currentRunId;
105
110
  const localPromise = run(runId, source);
106
111
  currentPromise = localPromise;
@@ -113,7 +118,7 @@ export const createAsyncSignal = (handler, options = {}) => {
113
118
  }
114
119
  await start('manual');
115
120
  };
116
- if (EnvironmentUtil.isBrowser) {
121
+ if (BROWSER) {
117
122
  const signalKey = key ?? asyncSignalManager.generateKey();
118
123
  const callback = (source) => start(source);
119
124
  asyncSignalManager.register(signalKey, callback);
@@ -122,28 +127,14 @@ export const createAsyncSignal = (handler, options = {}) => {
122
127
  asyncSignalManager.unregister(signalKey, callback);
123
128
  };
124
129
  });
125
- if (watch.length > 0) {
126
- let isFirst = true;
127
- $effect(() => {
128
- watch.forEach((dep) => dep());
129
- if (isFirst && !immediate) {
130
- isFirst = false;
131
- return;
132
- }
133
- if (!isFirst) {
134
- void start('auto');
135
- }
136
- isFirst = false;
137
- });
138
- }
139
130
  }
140
131
  if (immediate) {
141
- if (EnvironmentUtil.isServer && server) {
132
+ if (!BROWSER && server) {
142
133
  untrack(() => {
143
134
  void start('auto');
144
135
  });
145
136
  }
146
- else if (EnvironmentUtil.isBrowser) {
137
+ else if (BROWSER) {
147
138
  void start('auto');
148
139
  }
149
140
  }
@@ -1,20 +1,19 @@
1
- export type QuerySignal = {
2
- refresh: () => Promise<void>;
3
- };
1
+ export interface QueryOnChangeContext<T extends Record<string, unknown>> {
2
+ snapshot: T;
3
+ changedKeys: (keyof T)[];
4
+ signal: AbortSignal;
5
+ }
6
+ export interface QueryOnChangeOptions<T extends Record<string, unknown>> {
7
+ include: (keyof T)[];
8
+ handler: (ctx: QueryOnChangeContext<T>) => Promise<void> | void;
9
+ }
4
10
  export interface CreateQueryOptions<T extends Record<string, unknown>> {
5
- initial: T;
6
- signal?: QuerySignal;
7
- excludeKeys?: (keyof T)[];
8
- debounceMs?: number;
9
- autoRefresh?: boolean;
11
+ onChange?: QueryOnChangeOptions<T>;
10
12
  }
11
13
  export interface QueryController<T extends Record<string, unknown>> {
12
14
  data: T;
13
- patch: (values: Partial<T>) => void;
14
- set: <K extends keyof T>(key: K, value: T[K]) => void;
15
15
  reset: () => void;
16
16
  snapshot: () => T;
17
17
  initial: () => T;
18
- attachSignal: (signal?: QuerySignal) => void;
19
18
  }
20
- export declare const createQuery: <T extends Record<string, unknown>>(options: CreateQueryOptions<T>) => QueryController<T>;
19
+ export declare const createQuery: <T extends Record<string, unknown>>(initialValue: T, options?: CreateQueryOptions<T>) => QueryController<T>;
@@ -1,72 +1,63 @@
1
1
  import { ObjectUtil } from '@azure-net/tools';
2
2
  import { untrack } from 'svelte';
3
- export const createQuery = (options) => {
4
- const { initial: initialValue, signal: initialSignal, excludeKeys, debounceMs = 0, autoRefresh = true } = options;
3
+ export const createQuery = (initialValue, options) => {
5
4
  const baseInitial = ObjectUtil.deepClone(initialValue);
6
- let signal = initialSignal;
7
5
  let data = $state(ObjectUtil.deepClone(baseInitial));
8
- const resolveKeys = () => {
9
- const keys = Object.keys(baseInitial).slice();
10
- if (excludeKeys?.length) {
11
- return keys.filter((key) => !excludeKeys.includes(key));
12
- }
13
- return keys;
14
- };
15
- const keys = resolveKeys();
16
- let isFirstRun = true;
17
- let debounceTimer = null;
6
+ const includeKeys = options?.onChange?.include ?? [];
7
+ const hasWatch = Boolean(options?.onChange?.handler) && includeKeys.length > 0;
18
8
  const lastValues = new Map();
19
- const scheduleRefresh = () => {
20
- if (!signal)
21
- return;
22
- if (debounceTimer)
23
- clearTimeout(debounceTimer);
24
- if (debounceMs > 0) {
25
- debounceTimer = setTimeout(() => {
26
- untrack(() => {
27
- void signal?.refresh();
28
- });
29
- }, debounceMs);
30
- }
31
- else {
32
- untrack(() => {
33
- void signal?.refresh();
34
- });
35
- }
36
- };
37
- if (autoRefresh) {
9
+ let onChangeController = null;
10
+ let onChangeRunId = 0;
11
+ if (hasWatch) {
12
+ includeKeys.forEach((key) => {
13
+ lastValues.set(key, data[key]);
14
+ });
38
15
  $effect(() => {
39
- let hasChanged = false;
40
- keys.forEach((key) => {
16
+ const changedKeys = [];
17
+ includeKeys.forEach((key) => {
41
18
  const nextValue = data[key];
42
19
  if (!Object.is(lastValues.get(key), nextValue)) {
43
- hasChanged = true;
20
+ changedKeys.push(key);
44
21
  lastValues.set(key, nextValue);
45
22
  }
46
23
  });
47
- if (isFirstRun) {
48
- isFirstRun = false;
24
+ if (!changedKeys.length)
49
25
  return;
50
- }
51
- if (hasChanged) {
52
- scheduleRefresh();
53
- }
26
+ const previousController = onChangeController;
27
+ if (previousController)
28
+ previousController.abort();
29
+ const localController = new AbortController();
30
+ onChangeController = localController;
31
+ const localRunId = ++onChangeRunId;
32
+ const run = async () => {
33
+ await options.onChange.handler({
34
+ changedKeys,
35
+ signal: localController.signal,
36
+ snapshot: ObjectUtil.deepClone(data)
37
+ });
38
+ };
39
+ untrack(() => {
40
+ void run()
41
+ .catch(() => undefined)
42
+ .finally(() => {
43
+ if (onChangeRunId === localRunId && onChangeController === localController) {
44
+ onChangeController = null;
45
+ }
46
+ });
47
+ });
48
+ });
49
+ $effect(() => {
50
+ return () => {
51
+ if (onChangeController)
52
+ onChangeController.abort();
53
+ };
54
54
  });
55
55
  }
56
- const patch = (values) => {
57
- data = { ...data, ...values };
58
- };
59
- const set = (key, value) => {
60
- data = { ...data, [key]: value };
61
- };
62
56
  const reset = () => {
63
57
  data = ObjectUtil.deepClone(baseInitial);
64
58
  };
65
59
  const snapshot = () => ObjectUtil.deepClone(data);
66
60
  const initial = () => ObjectUtil.deepClone(baseInitial);
67
- const attachSignal = (nextSignal) => {
68
- signal = nextSignal;
69
- };
70
61
  return {
71
62
  get data() {
72
63
  return data;
@@ -74,11 +65,8 @@ export const createQuery = (options) => {
74
65
  set data(value) {
75
66
  data = value;
76
67
  },
77
- patch,
78
- set,
79
68
  reset,
80
69
  snapshot,
81
- initial,
82
- attachSignal
70
+ initial
83
71
  };
84
72
  };
@@ -1,6 +1,6 @@
1
- import { EnvironmentUtil } from '@azure-net/tools';
1
+ import { BROWSER } from '@azure-net/tools/environment';
2
2
  export const scrollTo = (nodeOrName, offset = 220) => {
3
- if (EnvironmentUtil.isBrowser) {
3
+ if (BROWSER) {
4
4
  setTimeout(() => { }, 1);
5
5
  let element;
6
6
  if (typeof nodeOrName === 'string') {
@@ -1 +1 @@
1
- export { createPresenter, createPresenterFactory, createStore, createStoreFactory, batch, transaction, __withEdgesUniversalLoad } from '@azure-net/edges';
1
+ export { clearCache, createPresenter, createPresenterFactory, createStore, createStoreFactory, batch, transaction, __withEdgesUniversalLoad } from '@azure-net/edges';
@@ -1 +1 @@
1
- export { createPresenter, createPresenterFactory, createStore, createStoreFactory, batch, transaction, __withEdgesUniversalLoad } from '@azure-net/edges';
1
+ export { clearCache, createPresenter, createPresenterFactory, createStore, createStoreFactory, batch, transaction, __withEdgesUniversalLoad } from '@azure-net/edges';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure-net/kit",
3
- "version": "3.9.1",
3
+ "version": "3.9.3",
4
4
  "files": [
5
5
  "dist",
6
6
  "!dist/**/*.test.*",
@@ -22,12 +22,16 @@
22
22
  "svelte": "./dist/core/constants/index.js"
23
23
  },
24
24
  "./infra": {
25
- "types": "./dist/core/infra/index.d.ts",
26
- "svelte": "./dist/core/infra/index.js"
25
+ "types": "./dist/core/infra.d.ts",
26
+ "svelte": "./dist/core/infra.js"
27
27
  },
28
- "./schema": {
29
- "types": "./dist/core/delivery/schema/rules/index.d.ts",
30
- "svelte": "./dist/core/delivery/schema/rules/index.js"
28
+ "./delivery": {
29
+ "types": "./dist/core/delivery.d.ts",
30
+ "svelte": "./dist/core/delivery.js"
31
+ },
32
+ "./errors": {
33
+ "types": "./dist/core/errors.d.ts",
34
+ "svelte": "./dist/core/errors.js"
31
35
  },
32
36
  "./edges": {
33
37
  "types": "./dist/edges/index.d.ts",
@@ -106,9 +110,9 @@
106
110
  "svelte"
107
111
  ],
108
112
  "dependencies": {
109
- "@azure-net/edges": "^1.2.0",
110
- "@azure-net/edges-translations": "^1.2.0",
111
- "@azure-net/tools": "^1.2.0"
113
+ "@azure-net/edges": "^1.2.2",
114
+ "@azure-net/edges-translations": "^1.2.2",
115
+ "@azure-net/tools": "^1.2.2"
112
116
  },
113
117
  "scripts": {
114
118
  "dev": "vite dev",
@@ -1,15 +0,0 @@
1
- import { error, fail, redirect, type RequestEvent } from '@sveltejs/kit';
2
- type NoConflict<I, D> = {
3
- [K in keyof I]: K extends keyof D ? never : I[K];
4
- };
5
- type Deps = {
6
- context: RequestEvent;
7
- utils: {
8
- fail: typeof fail;
9
- redirect: typeof redirect;
10
- error: typeof error;
11
- };
12
- };
13
- export declare const createServerAction: <T, I extends Record<string, unknown> = Record<string, unknown>>(factory: (args: Deps & NoConflict<I, Deps>) => T, inject?: I) => (() => T);
14
- export declare const createServerActionFactory: <I extends Record<string, unknown>>(inject: I) => <T>(factory: (args: Deps & NoConflict<I, Deps>) => T) => () => T;
15
- export {};
@@ -1,22 +0,0 @@
1
- import { RequestContext } from '../../../edges/context/index.js';
2
- import { error, fail, redirect } from '@sveltejs/kit';
3
- import { EnvironmentUtil } from '@azure-net/tools';
4
- export const createServerAction = (factory, inject) => {
5
- return () => {
6
- if (EnvironmentUtil.isBrowser) {
7
- throw Error('Do not use actions on client side');
8
- }
9
- const context = RequestContext.current().event;
10
- const deps = {
11
- context,
12
- utils: { fail, redirect, error },
13
- ...inject
14
- };
15
- return factory(deps);
16
- };
17
- };
18
- export const createServerActionFactory = (inject) => {
19
- return function createInjectedServerAction(factory) {
20
- return createServerAction(factory, inject);
21
- };
22
- };
@@ -1 +0,0 @@
1
- export * from './CreateServerAction.js';
@@ -1 +0,0 @@
1
- export * from './CreateServerAction.js';