@playfast/forms 0.0.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.
@@ -0,0 +1,104 @@
1
+ import { Equal } from 'effect';
2
+ const BRACKET_NOTATION_REGEX = /\[(\d+)\]/g;
3
+ export const schemaPathToFieldPath = (path) => {
4
+ if (path.length === 0)
5
+ return '';
6
+ let result = String(path[0]);
7
+ for (let i = 1; i < path.length; i++) {
8
+ const segment = path[i];
9
+ result += typeof segment === 'number' ? `[${segment}]` : `.${String(segment)}`;
10
+ }
11
+ return result;
12
+ };
13
+ export const joinPath = (prefix, path) => prefix.length === 0 ? path : path.length === 0 ? prefix : `${prefix}.${path}`;
14
+ export const isPathUnderRoot = (path, rootPath) => path === rootPath || path.startsWith(`${rootPath}.`) || path.startsWith(`${rootPath}[`);
15
+ export const isPathOrParentDirty = (dirtyPaths, path) => {
16
+ if (dirtyPaths.includes(path))
17
+ return true;
18
+ let parent = path;
19
+ while (true) {
20
+ const lastDot = parent.lastIndexOf('.');
21
+ const lastBracket = parent.lastIndexOf('[');
22
+ const splitIndex = Math.max(lastDot, lastBracket);
23
+ if (splitIndex === -1)
24
+ return false;
25
+ parent = parent.substring(0, splitIndex);
26
+ if (dirtyPaths.includes(parent))
27
+ return true;
28
+ }
29
+ };
30
+ const pathParts = (path) => path === '' ? [] : path.replace(BRACKET_NOTATION_REGEX, '.$1').split('.');
31
+ export const getNestedValue = (obj, path) => {
32
+ const parts = pathParts(path);
33
+ let current = obj;
34
+ for (const part of parts) {
35
+ if (current === null || current === undefined || typeof current !== 'object')
36
+ return undefined;
37
+ current = current[part];
38
+ }
39
+ return current;
40
+ };
41
+ export const setNestedValue = (obj, path, value) => {
42
+ const parts = pathParts(path);
43
+ if (parts.length === 0)
44
+ return value;
45
+ const result = Array.isArray(obj) ? [...obj] : { ...obj };
46
+ let current = result;
47
+ for (let i = 0; i < parts.length - 1; i++) {
48
+ const part = parts[i];
49
+ if (part === undefined)
50
+ return result;
51
+ const next = current[part];
52
+ current[part] = Array.isArray(next) ? [...next] : { ...next };
53
+ current = current[part];
54
+ }
55
+ const last = parts[parts.length - 1];
56
+ if (last !== undefined)
57
+ current[last] = value;
58
+ return result;
59
+ };
60
+ export const recalculateDirtyPaths = (initial, values, rootPath = '') => {
61
+ const dirty = new Set();
62
+ const visit = (current, original, path) => {
63
+ if (Equal.equals(current, original))
64
+ return;
65
+ if (Array.isArray(current) || Array.isArray(original)) {
66
+ const currentItems = Array.isArray(current) ? current : [];
67
+ const originalItems = Array.isArray(original) ? original : [];
68
+ if (currentItems.length !== originalItems.length && path.length > 0)
69
+ dirty.add(path);
70
+ const length = Math.max(currentItems.length, originalItems.length);
71
+ for (let i = 0; i < length; i++) {
72
+ visit(currentItems[i], originalItems[i], path.length === 0 ? `[${i}]` : `${path}[${i}]`);
73
+ }
74
+ return;
75
+ }
76
+ if (current !== null &&
77
+ original !== null &&
78
+ typeof current === 'object' &&
79
+ typeof original === 'object') {
80
+ const currentRecord = current;
81
+ const originalRecord = original;
82
+ const keys = new Set([...Object.keys(currentRecord), ...Object.keys(originalRecord)]);
83
+ for (const key of keys) {
84
+ visit(currentRecord[key], originalRecord[key], path.length === 0 ? key : `${path}.${key}`);
85
+ }
86
+ return;
87
+ }
88
+ if (path.length > 0)
89
+ dirty.add(path);
90
+ };
91
+ visit(rootPath.length === 0 ? values : getNestedValue(values, rootPath), rootPath.length === 0 ? initial : getNestedValue(initial, rootPath), rootPath);
92
+ return Array.from(dirty).sort();
93
+ };
94
+ export const replaceAt = (values, index, value) => values.map((item, i) => (i === index ? value : item));
95
+ export const moveAt = (values, from, to) => {
96
+ if (from < 0 || from >= values.length || to < 0 || to > values.length || from === to)
97
+ return values;
98
+ const next = [...values];
99
+ const item = next.splice(from, 1)[0];
100
+ if (item !== undefined)
101
+ next.splice(to, 0, item);
102
+ return next;
103
+ };
104
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Option, ParseResult } from 'effect';
2
+ import { schemaPathToFieldPath } from './path.js';
3
+ export const error = (path, message) => ({ path, message });
4
+ export const normalizeErrors = (value) => {
5
+ if (value === undefined)
6
+ return [];
7
+ if (Array.isArray(value))
8
+ return value;
9
+ return [value];
10
+ };
11
+ export const errorsToRecord = (errors) => {
12
+ const out = {};
13
+ for (const entry of errors) {
14
+ if (out[entry.path] === undefined)
15
+ out[entry.path] = entry.message;
16
+ }
17
+ return out;
18
+ };
19
+ export const routeParseError = (parseError) => {
20
+ const formatted = ParseResult.ArrayFormatter.formatErrorSync(parseError);
21
+ const out = {};
22
+ for (const issue of formatted) {
23
+ const path = schemaPathToFieldPath(issue.path);
24
+ if (out[path] === undefined)
25
+ out[path] = issue.message;
26
+ }
27
+ return out;
28
+ };
29
+ export const firstError = (errors, path) => {
30
+ const message = errors[path];
31
+ return message === undefined ? Option.none() : Option.some(message);
32
+ };
33
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAA;AAS9C,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,OAAe,EAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAEtF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAkD,EACxB,EAAE;IAC5B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAiC,CAAA;IAClE,OAAO,CAAC,KAAkB,CAAC,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAgC,EAAc,EAAE;IAC7E,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAA;IACpE,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkC,EAAc,EAAE;IAChF,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;IACxE,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAA;IACxD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAkB,EAAE,IAAY,EAAyB,EAAE;IACpF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACrE,CAAC,CAAA"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@playfast/forms",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "sideEffects": [],
6
+ "license": "MIT",
7
+ "module": "./dist/esm/index.js",
8
+ "types": "./dist/dts/index.d.ts",
9
+ "main": "./dist/cjs/index.js",
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ ".": {
13
+ "types": "./dist/dts/index.d.ts",
14
+ "import": "./dist/esm/index.js",
15
+ "default": "./dist/cjs/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "peerDependencies": {
25
+ "effect": "*",
26
+ "@playfast/reform": "^0.0.1"
27
+ }
28
+ }