@lucas-barake/effect-form 0.1.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/Form/package.json +6 -0
- package/FormAtoms/package.json +6 -0
- package/LICENSE +21 -0
- package/Mode/package.json +6 -0
- package/README.md +5 -0
- package/Validation/package.json +6 -0
- package/dist/cjs/Form.js +299 -0
- package/dist/cjs/Form.js.map +1 -0
- package/dist/cjs/FormAtoms.js +266 -0
- package/dist/cjs/FormAtoms.js.map +1 -0
- package/dist/cjs/Mode.js +64 -0
- package/dist/cjs/Mode.js.map +1 -0
- package/dist/cjs/Validation.js +69 -0
- package/dist/cjs/Validation.js.map +1 -0
- package/dist/cjs/index.js +35 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/internal/dirty.js +101 -0
- package/dist/cjs/internal/dirty.js.map +1 -0
- package/dist/cjs/internal/path.js +96 -0
- package/dist/cjs/internal/path.js.map +1 -0
- package/dist/cjs/internal/weak-registry.js +52 -0
- package/dist/cjs/internal/weak-registry.js.map +1 -0
- package/dist/dts/Form.d.ts +317 -0
- package/dist/dts/Form.d.ts.map +1 -0
- package/dist/dts/FormAtoms.d.ts +145 -0
- package/dist/dts/FormAtoms.d.ts.map +1 -0
- package/dist/dts/Mode.d.ts +55 -0
- package/dist/dts/Mode.d.ts.map +1 -0
- package/dist/dts/Validation.d.ts +23 -0
- package/dist/dts/Validation.d.ts.map +1 -0
- package/dist/dts/index.d.ts +26 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/internal/dirty.d.ts +13 -0
- package/dist/dts/internal/dirty.d.ts.map +1 -0
- package/dist/dts/internal/path.d.ts +32 -0
- package/dist/dts/internal/path.d.ts.map +1 -0
- package/dist/dts/internal/weak-registry.d.ts +7 -0
- package/dist/dts/internal/weak-registry.d.ts.map +1 -0
- package/dist/esm/Form.js +263 -0
- package/dist/esm/Form.js.map +1 -0
- package/dist/esm/FormAtoms.js +238 -0
- package/dist/esm/FormAtoms.js.map +1 -0
- package/dist/esm/Mode.js +36 -0
- package/dist/esm/Mode.js.map +1 -0
- package/dist/esm/Validation.js +40 -0
- package/dist/esm/Validation.js.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/dirty.js +72 -0
- package/dist/esm/internal/dirty.js.map +1 -0
- package/dist/esm/internal/path.js +86 -0
- package/dist/esm/internal/path.js.map +1 -0
- package/dist/esm/internal/weak-registry.js +45 -0
- package/dist/esm/internal/weak-registry.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/package.json +64 -0
- package/src/Form.ts +522 -0
- package/src/FormAtoms.ts +485 -0
- package/src/Mode.ts +59 -0
- package/src/Validation.ts +43 -0
- package/src/index.ts +28 -0
- package/src/internal/dirty.ts +96 -0
- package/src/internal/path.ts +93 -0
- package/src/internal/weak-registry.ts +60 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal dirty tracking algorithms.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
import * as Equal from "effect/Equal";
|
|
7
|
+
import * as Utils from "effect/Utils";
|
|
8
|
+
import { getNestedValue } from "./path.js";
|
|
9
|
+
/**
|
|
10
|
+
* Recalculates dirty fields for an array after mutation.
|
|
11
|
+
* Clears all paths under the array and re-evaluates each item.
|
|
12
|
+
*/
|
|
13
|
+
export const recalculateDirtyFieldsForArray = (dirtyFields, initialValues, arrayPath, newItems) => {
|
|
14
|
+
const nextDirty = new Set(Array.from(dirtyFields).filter(path => path !== arrayPath && !path.startsWith(arrayPath + ".") && !path.startsWith(arrayPath + "[")));
|
|
15
|
+
const initialItems = getNestedValue(initialValues, arrayPath) ?? [];
|
|
16
|
+
const loopLength = Math.max(newItems.length, initialItems.length);
|
|
17
|
+
for (let i = 0; i < loopLength; i++) {
|
|
18
|
+
const itemPath = `${arrayPath}[${i}]`;
|
|
19
|
+
const newItem = newItems[i];
|
|
20
|
+
const initialItem = initialItems[i];
|
|
21
|
+
const isEqual = Utils.structuralRegion(() => Equal.equals(newItem, initialItem));
|
|
22
|
+
if (!isEqual) {
|
|
23
|
+
nextDirty.add(itemPath);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (newItems.length !== initialItems.length) {
|
|
27
|
+
nextDirty.add(arrayPath);
|
|
28
|
+
} else {
|
|
29
|
+
nextDirty.delete(arrayPath);
|
|
30
|
+
}
|
|
31
|
+
return nextDirty;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Recalculates dirty fields for a subtree after value change.
|
|
35
|
+
* Clears the rootPath and all children, then re-evaluates recursively.
|
|
36
|
+
*
|
|
37
|
+
* @param rootPath - Empty string for full form, or a specific path for targeted update
|
|
38
|
+
*/
|
|
39
|
+
export const recalculateDirtySubtree = (currentDirty, allInitial, allValues, rootPath = "") => {
|
|
40
|
+
const nextDirty = new Set(currentDirty);
|
|
41
|
+
if (rootPath === "") {
|
|
42
|
+
nextDirty.clear();
|
|
43
|
+
} else {
|
|
44
|
+
for (const path of nextDirty) {
|
|
45
|
+
if (path === rootPath || path.startsWith(rootPath + ".") || path.startsWith(rootPath + "[")) {
|
|
46
|
+
nextDirty.delete(path);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const targetValue = rootPath ? getNestedValue(allValues, rootPath) : allValues;
|
|
51
|
+
const targetInitial = rootPath ? getNestedValue(allInitial, rootPath) : allInitial;
|
|
52
|
+
const recurse = (current, initial, path) => {
|
|
53
|
+
if (Array.isArray(current)) {
|
|
54
|
+
const initialArr = initial ?? [];
|
|
55
|
+
for (let i = 0; i < Math.max(current.length, initialArr.length); i++) {
|
|
56
|
+
recurse(current[i], initialArr[i], path ? `${path}[${i}]` : `[${i}]`);
|
|
57
|
+
}
|
|
58
|
+
} else if (current !== null && typeof current === "object") {
|
|
59
|
+
const initialObj = initial ?? {};
|
|
60
|
+
const allKeys = new Set([...Object.keys(current), ...Object.keys(initialObj)]);
|
|
61
|
+
for (const key of allKeys) {
|
|
62
|
+
recurse(current[key], initialObj[key], path ? `${path}.${key}` : key);
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
const isEqual = Utils.structuralRegion(() => Equal.equals(current, initial));
|
|
66
|
+
if (!isEqual && path) nextDirty.add(path);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
recurse(targetValue, targetInitial, rootPath);
|
|
70
|
+
return nextDirty;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=dirty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dirty.js","names":["Equal","Utils","getNestedValue","recalculateDirtyFieldsForArray","dirtyFields","initialValues","arrayPath","newItems","nextDirty","Set","Array","from","filter","path","startsWith","initialItems","loopLength","Math","max","length","i","itemPath","newItem","initialItem","isEqual","structuralRegion","equals","add","delete","recalculateDirtySubtree","currentDirty","allInitial","allValues","rootPath","clear","targetValue","targetInitial","recurse","current","initial","isArray","initialArr","initialObj","allKeys","Object","keys","key"],"sources":["../../../src/internal/dirty.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal path utilities for form field operations.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
const BRACKET_NOTATION_REGEX = /\[(\d+)\]/g;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a schema path array to a dot/bracket notation string.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* schemaPathToFieldPath(["items", 0, "name"]) // "items[0].name"
|
|
12
|
+
*/
|
|
13
|
+
export const schemaPathToFieldPath = path => {
|
|
14
|
+
if (path.length === 0) return "";
|
|
15
|
+
let result = String(path[0]);
|
|
16
|
+
for (let i = 1; i < path.length; i++) {
|
|
17
|
+
const segment = path[i];
|
|
18
|
+
if (typeof segment === "number") {
|
|
19
|
+
result += `[${segment}]`;
|
|
20
|
+
} else {
|
|
21
|
+
result += `.${String(segment)}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Checks if a field path or any of its parent paths are in the dirty set.
|
|
28
|
+
*/
|
|
29
|
+
export const isPathOrParentDirty = (dirtyFields, path) => {
|
|
30
|
+
if (dirtyFields.has(path)) return true;
|
|
31
|
+
let parent = path;
|
|
32
|
+
while (true) {
|
|
33
|
+
const lastDot = parent.lastIndexOf(".");
|
|
34
|
+
const lastBracket = parent.lastIndexOf("[");
|
|
35
|
+
const splitIndex = Math.max(lastDot, lastBracket);
|
|
36
|
+
if (splitIndex === -1) break;
|
|
37
|
+
parent = parent.substring(0, splitIndex);
|
|
38
|
+
if (dirtyFields.has(parent)) return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Gets a nested value from an object using dot/bracket notation path.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* getNestedValue({ items: [{ name: "A" }] }, "items[0].name") // "A"
|
|
47
|
+
*/
|
|
48
|
+
export const getNestedValue = (obj, path) => {
|
|
49
|
+
if (path === "") return obj;
|
|
50
|
+
const parts = path.replace(BRACKET_NOTATION_REGEX, ".$1").split(".");
|
|
51
|
+
let current = obj;
|
|
52
|
+
for (const part of parts) {
|
|
53
|
+
if (current == null || typeof current !== "object") return undefined;
|
|
54
|
+
current = current[part];
|
|
55
|
+
}
|
|
56
|
+
return current;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Sets a nested value in an object immutably using dot/bracket notation path.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* setNestedValue({ items: [{ name: "A" }] }, "items[0].name", "B")
|
|
63
|
+
* // { items: [{ name: "B" }] }
|
|
64
|
+
*/
|
|
65
|
+
export const setNestedValue = (obj, path, value) => {
|
|
66
|
+
if (path === "") return value;
|
|
67
|
+
const parts = path.replace(BRACKET_NOTATION_REGEX, ".$1").split(".");
|
|
68
|
+
const result = {
|
|
69
|
+
...obj
|
|
70
|
+
};
|
|
71
|
+
let current = result;
|
|
72
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
73
|
+
const part = parts[i];
|
|
74
|
+
if (Array.isArray(current[part])) {
|
|
75
|
+
current[part] = [...current[part]];
|
|
76
|
+
} else {
|
|
77
|
+
current[part] = {
|
|
78
|
+
...current[part]
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
current = current[part];
|
|
82
|
+
}
|
|
83
|
+
current[parts[parts.length - 1]] = value;
|
|
84
|
+
return result;
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","names":["BRACKET_NOTATION_REGEX","schemaPathToFieldPath","path","length","result","String","i","segment","isPathOrParentDirty","dirtyFields","has","parent","lastDot","lastIndexOf","lastBracket","splitIndex","Math","max","substring","getNestedValue","obj","parts","replace","split","current","part","undefined","setNestedValue","value","Array","isArray"],"sources":["../../../src/internal/path.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal WeakRef-based registry for caching atoms.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Creates a WeakRef-based registry with automatic cleanup via FinalizationRegistry.
|
|
8
|
+
* Falls back to a regular Map in environments without WeakRef support.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export const createWeakRegistry = () => {
|
|
13
|
+
if (typeof WeakRef === "undefined" || typeof FinalizationRegistry === "undefined") {
|
|
14
|
+
const map = new Map();
|
|
15
|
+
return {
|
|
16
|
+
get: key => map.get(key),
|
|
17
|
+
set: (key, value) => {
|
|
18
|
+
map.set(key, value);
|
|
19
|
+
},
|
|
20
|
+
delete: key => map.delete(key),
|
|
21
|
+
clear: () => map.clear(),
|
|
22
|
+
values: () => map.values()
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const map = new Map();
|
|
26
|
+
const registry = new FinalizationRegistry(key => {
|
|
27
|
+
map.delete(key);
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
get: key => map.get(key)?.deref(),
|
|
31
|
+
set: (key, value) => {
|
|
32
|
+
map.set(key, new WeakRef(value));
|
|
33
|
+
registry.register(value, key);
|
|
34
|
+
},
|
|
35
|
+
delete: key => map.delete(key),
|
|
36
|
+
clear: () => map.clear(),
|
|
37
|
+
*values() {
|
|
38
|
+
for (const ref of map.values()) {
|
|
39
|
+
const value = ref.deref();
|
|
40
|
+
if (value !== undefined) yield value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=weak-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weak-registry.js","names":["createWeakRegistry","WeakRef","FinalizationRegistry","map","Map","get","key","set","value","delete","clear","values","registry","deref","register","ref","undefined"],"sources":["../../../src/internal/weak-registry.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;AAmBA;;;;;;AAMA,OAAO,MAAMA,kBAAkB,GAAGA,CAAA,KAAwC;EACxE,IAAI,OAAOC,OAAO,KAAK,WAAW,IAAI,OAAOC,oBAAoB,KAAK,WAAW,EAAE;IACjF,MAAMC,GAAG,GAAG,IAAIC,GAAG,EAAa;IAChC,OAAO;MACLC,GAAG,EAAGC,GAAG,IAAKH,GAAG,CAACE,GAAG,CAACC,GAAG,CAAC;MAC1BC,GAAG,EAAEA,CAACD,GAAG,EAAEE,KAAK,KAAI;QAClBL,GAAG,CAACI,GAAG,CAACD,GAAG,EAAEE,KAAK,CAAC;MACrB,CAAC;MACDC,MAAM,EAAGH,GAAG,IAAKH,GAAG,CAACM,MAAM,CAACH,GAAG,CAAC;MAChCI,KAAK,EAAEA,CAAA,KAAMP,GAAG,CAACO,KAAK,EAAE;MACxBC,MAAM,EAAEA,CAAA,KAAMR,GAAG,CAACQ,MAAM;KACzB;EACH;EAEA,MAAMR,GAAG,GAAG,IAAIC,GAAG,EAAsB;EACzC,MAAMQ,QAAQ,GAAG,IAAIV,oBAAoB,CAAUI,GAAG,IAAI;IACxDH,GAAG,CAACM,MAAM,CAACH,GAAG,CAAC;EACjB,CAAC,CAAC;EAEF,OAAO;IACLD,GAAG,EAAGC,GAAG,IAAKH,GAAG,CAACE,GAAG,CAACC,GAAG,CAAC,EAAEO,KAAK,EAAE;IACnCN,GAAG,EAAEA,CAACD,GAAG,EAAEE,KAAK,KAAI;MAClBL,GAAG,CAACI,GAAG,CAACD,GAAG,EAAE,IAAIL,OAAO,CAACO,KAAK,CAAC,CAAC;MAChCI,QAAQ,CAACE,QAAQ,CAACN,KAAK,EAAEF,GAAG,CAAC;IAC/B,CAAC;IACDG,MAAM,EAAGH,GAAG,IAAKH,GAAG,CAACM,MAAM,CAACH,GAAG,CAAC;IAChCI,KAAK,EAAEA,CAAA,KAAMP,GAAG,CAACO,KAAK,EAAE;IACxB,CAACC,MAAMA,CAAA;MACL,KAAK,MAAMI,GAAG,IAAIZ,GAAG,CAACQ,MAAM,EAAE,EAAE;QAC9B,MAAMH,KAAK,GAAGO,GAAG,CAACF,KAAK,EAAE;QACzB,IAAIL,KAAK,KAAKQ,SAAS,EAAE,MAAMR,KAAK;MACtC;IACF;GACD;AACH,CAAC","ignoreList":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lucas-barake/effect-form",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Type-safe form builder powered by Effect Schema",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/lucas-barake/effect-form.git"
|
|
9
|
+
},
|
|
10
|
+
"sideEffects": [],
|
|
11
|
+
"author": "Lucas Barake",
|
|
12
|
+
"homepage": "https://github.com/lucas-barake/effect-form",
|
|
13
|
+
"peerDependencies": {
|
|
14
|
+
"@effect-atom/atom": "^0.4.8",
|
|
15
|
+
"effect": "^3.19.0"
|
|
16
|
+
},
|
|
17
|
+
"main": "./dist/cjs/index.js",
|
|
18
|
+
"module": "./dist/esm/index.js",
|
|
19
|
+
"types": "./dist/dts/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
"./package.json": "./package.json",
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/dts/index.d.ts",
|
|
24
|
+
"import": "./dist/esm/index.js",
|
|
25
|
+
"default": "./dist/cjs/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./Form": {
|
|
28
|
+
"types": "./dist/dts/Form.d.ts",
|
|
29
|
+
"import": "./dist/esm/Form.js",
|
|
30
|
+
"default": "./dist/cjs/Form.js"
|
|
31
|
+
},
|
|
32
|
+
"./FormAtoms": {
|
|
33
|
+
"types": "./dist/dts/FormAtoms.d.ts",
|
|
34
|
+
"import": "./dist/esm/FormAtoms.js",
|
|
35
|
+
"default": "./dist/cjs/FormAtoms.js"
|
|
36
|
+
},
|
|
37
|
+
"./Mode": {
|
|
38
|
+
"types": "./dist/dts/Mode.d.ts",
|
|
39
|
+
"import": "./dist/esm/Mode.js",
|
|
40
|
+
"default": "./dist/cjs/Mode.js"
|
|
41
|
+
},
|
|
42
|
+
"./Validation": {
|
|
43
|
+
"types": "./dist/dts/Validation.d.ts",
|
|
44
|
+
"import": "./dist/esm/Validation.js",
|
|
45
|
+
"default": "./dist/cjs/Validation.js"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"typesVersions": {
|
|
49
|
+
"*": {
|
|
50
|
+
"Form": [
|
|
51
|
+
"./dist/dts/Form.d.ts"
|
|
52
|
+
],
|
|
53
|
+
"FormAtoms": [
|
|
54
|
+
"./dist/dts/FormAtoms.d.ts"
|
|
55
|
+
],
|
|
56
|
+
"Mode": [
|
|
57
|
+
"./dist/dts/Mode.d.ts"
|
|
58
|
+
],
|
|
59
|
+
"Validation": [
|
|
60
|
+
"./dist/dts/Validation.d.ts"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|