@azure-net/kit 5.0.4 → 5.1.1

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.
@@ -7,8 +7,11 @@ export const createActiveForm = (onSubmit, config) => {
7
7
  let formData = $state(ObjectUtil.deepClone(initial));
8
8
  let formErrors = $state({});
9
9
  let pending = $state(false);
10
+ let submitRunId = 0;
11
+ let initialLoadRunId = 0;
10
12
  const dirty = $derived(!ObjectUtil.equals(formData, initial));
11
13
  const loadInitialData = async () => {
14
+ const runId = ++initialLoadRunId;
12
15
  const source = config?.initialData;
13
16
  if (!source) {
14
17
  initial = {};
@@ -18,33 +21,63 @@ export const createActiveForm = (onSubmit, config) => {
18
21
  }
19
22
  const value = source();
20
23
  const nextInitial = isPromise(value) ? await value : value;
24
+ if (runId !== initialLoadRunId)
25
+ return initial;
21
26
  initial = (nextInitial ?? {});
22
27
  formData = ObjectUtil.deepClone(initial);
23
28
  formErrors = {};
24
29
  return initial;
25
30
  };
26
31
  const ready = loadInitialData();
32
+ const abortedResponse = () => ({
33
+ success: false,
34
+ response: undefined
35
+ });
36
+ const resetForm = async (behavior = 'clear', invalidateSubmission = true) => {
37
+ if (invalidateSubmission) {
38
+ submitRunId += 1;
39
+ pending = false;
40
+ }
41
+ if (behavior !== 'reloadInitial')
42
+ initialLoadRunId += 1;
43
+ switch (behavior) {
44
+ case 'clear':
45
+ formData = {};
46
+ break;
47
+ case 'initial':
48
+ formData = ObjectUtil.deepClone(initial);
49
+ break;
50
+ case 'reloadInitial':
51
+ await loadInitialData();
52
+ break;
53
+ }
54
+ formErrors = {};
55
+ };
56
+ const reset = async (behavior = 'clear') => resetForm(behavior, true);
27
57
  const submit = async () => {
58
+ const runId = ++submitRunId;
28
59
  pending = true;
29
60
  try {
61
+ await ready;
62
+ if (runId !== submitRunId)
63
+ return abortedResponse();
30
64
  if (config?.beforeSubmit) {
31
65
  let aborted = false;
32
66
  const abort = () => {
33
67
  aborted = true;
34
- pending = false;
35
68
  };
36
69
  await config.beforeSubmit({ form: formApi, abort: () => abort() });
37
- if (aborted) {
38
- return {
39
- success: false,
40
- response: undefined
41
- };
42
- }
70
+ if (aborted || runId !== submitRunId)
71
+ return abortedResponse();
43
72
  }
44
73
  const result = await onSubmit($state.snapshot(formData));
74
+ if (runId !== submitRunId)
75
+ return result;
45
76
  if (result.success) {
46
77
  await config?.onSuccess?.(result.response);
47
- await reset(config?.successBehavior ?? 'default');
78
+ if (runId !== submitRunId)
79
+ return result;
80
+ await resetForm(config?.successBehavior ?? 'default', false);
48
81
  }
49
82
  else {
50
83
  if (result.error?.validation) {
@@ -55,23 +88,10 @@ export const createActiveForm = (onSubmit, config) => {
55
88
  return result;
56
89
  }
57
90
  finally {
58
- pending = false;
91
+ if (runId === submitRunId)
92
+ pending = false;
59
93
  }
60
94
  };
61
- const reset = async (behavior = 'clear') => {
62
- switch (behavior) {
63
- case 'clear':
64
- formData = {};
65
- break;
66
- case 'initial':
67
- formData = ObjectUtil.deepClone(initial);
68
- break;
69
- case 'reloadInitial':
70
- await loadInitialData();
71
- break;
72
- }
73
- formErrors = {};
74
- };
75
95
  const formApi = {
76
96
  get data() {
77
97
  return formData;
@@ -65,15 +65,17 @@ export const createAsyncSignal = (handler, options = {}) => {
65
65
  }
66
66
  const localController = new AbortController();
67
67
  abortController = localController;
68
- if (options.beforeSend) {
69
- await options.beforeSend({ initial, source });
70
- }
71
- if (runId !== currentRunId || abortController !== localController || localController.signal.aborted) {
72
- return undefined;
73
- }
74
68
  status = 'pending';
75
69
  error = undefined;
76
70
  try {
71
+ if (options.beforeSend) {
72
+ const beforeSendResult = options.beforeSend({ initial, source });
73
+ if (beforeSendResult && typeof beforeSendResult.then === 'function')
74
+ await beforeSendResult;
75
+ }
76
+ if (runId !== currentRunId || abortController !== localController || localController.signal.aborted) {
77
+ return undefined;
78
+ }
77
79
  const result = await handler(localController.signal);
78
80
  if (runId !== currentRunId || abortController !== localController || localController.signal.aborted) {
79
81
  return undefined;
@@ -87,6 +89,8 @@ export const createAsyncSignal = (handler, options = {}) => {
87
89
  }
88
90
  catch (err) {
89
91
  if (err instanceof Error && err.name === 'AbortError') {
92
+ if (runId === currentRunId)
93
+ status = 'idle';
90
94
  return undefined;
91
95
  }
92
96
  if (runId !== currentRunId || abortController !== localController || localController.signal.aborted) {
@@ -102,6 +106,8 @@ export const createAsyncSignal = (handler, options = {}) => {
102
106
  finally {
103
107
  if (currentRunId === runId) {
104
108
  currentPromise = null;
109
+ if (abortController === localController)
110
+ abortController = null;
105
111
  }
106
112
  }
107
113
  };
@@ -159,19 +165,21 @@ export const createAsyncSignal = (handler, options = {}) => {
159
165
  execute,
160
166
  refresh: execute,
161
167
  reset: () => {
168
+ currentRunId += 1;
169
+ abortController?.abort();
170
+ abortController = null;
171
+ currentPromise = null;
162
172
  data = undefined;
163
173
  error = undefined;
164
174
  status = 'idle';
165
- currentPromise = null;
166
- if (abortController) {
167
- abortController.abort();
168
- abortController = null;
169
- }
170
175
  },
171
176
  abort: () => {
172
- if (abortController) {
173
- abortController.abort();
174
- }
177
+ currentRunId += 1;
178
+ abortController?.abort();
179
+ abortController = null;
180
+ currentPromise = null;
181
+ error = undefined;
182
+ status = 'idle';
175
183
  }
176
184
  };
177
185
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure-net/kit",
3
- "version": "5.0.4",
3
+ "version": "5.1.1",
4
4
  "license": "MIT",
5
5
  "author": "Pixel1917",
6
6
  "description": "Universal toolkit and library collection, developed as part of the Azure-net ecosystem",
@@ -77,7 +77,6 @@
77
77
  "svelte": ">=5.0.0"
78
78
  },
79
79
  "devDependencies": {
80
- "@commitlint/cli": "^20.5.0",
81
80
  "@eslint/compat": "^2.0.5",
82
81
  "@eslint/js": "^10.0.1",
83
82
  "@playwright/test": "^1.59.1",
@@ -87,14 +86,11 @@
87
86
  "@sveltejs/vite-plugin-svelte": "^7.0.0",
88
87
  "@testing-library/jest-dom": "^6.9.1",
89
88
  "@testing-library/svelte": "^5.3.1",
90
- "commitizen": "^4.3.1",
91
89
  "env-cmd": "^11.0.0",
92
90
  "eslint": "^10.2.1",
93
91
  "eslint-config-prettier": "^10.1.8",
94
92
  "eslint-plugin-svelte": "^3.17.0",
95
- "git-cz": "^4.9.0",
96
93
  "globals": "^17.5.0",
97
- "husky": "^9.1.7",
98
94
  "jsdom": "^29.0.2",
99
95
  "prettier": "^3.8.3",
100
96
  "prettier-plugin-svelte": "^3.5.1",
@@ -106,11 +102,6 @@
106
102
  "vite": "^8.0.8",
107
103
  "vitest": "^4.1.4"
108
104
  },
109
- "config": {
110
- "commitizen": {
111
- "path": "git-cz"
112
- }
113
- },
114
105
  "keywords": [
115
106
  "sveltekit",
116
107
  "svelte",
@@ -122,9 +113,9 @@
122
113
  "utils"
123
114
  ],
124
115
  "dependencies": {
125
- "@azure-net/edges": "^1.2.7",
126
- "@azure-net/edges-translations": "^1.2.7",
127
- "@azure-net/tools": "^1.2.7"
116
+ "@azure-net/edges": "^2.0.0",
117
+ "@azure-net/edges-translations": "^2.0.0",
118
+ "@azure-net/tools": "^2.0.0"
128
119
  },
129
120
  "scripts": {
130
121
  "dev": "vite dev",
@@ -138,6 +129,6 @@
138
129
  "test:integration": "vitest --config vitest.integration.config.ts --run",
139
130
  "test": "npm run test:unit -- --run && npm run test:e2e",
140
131
  "test:e2e": "playwright test --pass-with-no-tests",
141
- "commit": "pnpm format && git add . && git-cz && git push"
132
+ "commit": "pnpm format && git add ."
142
133
  }
143
134
  }