cross-state 0.45.2 → 0.47.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/dist/cjs/index2.cjs +2 -2
- package/dist/cjs/index2.cjs.map +1 -1
- package/dist/cjs/react/index.cjs +20 -12
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/cjs/store.cjs +7 -6
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/es/index2.mjs +2 -2
- package/dist/es/index2.mjs.map +1 -1
- package/dist/es/react/index.mjs +20 -12
- package/dist/es/react/index.mjs.map +1 -1
- package/dist/es/store.mjs +7 -6
- package/dist/es/store.mjs.map +1 -1
- package/dist/types/core/commonTypes.d.ts +2 -2
- package/dist/types/core/store.d.ts +3 -1
- package/dist/types/patches/patchMethods.d.ts +4 -2
- package/package.json +1 -1
package/dist/cjs/index2.cjs
CHANGED
|
@@ -207,7 +207,7 @@ function subscribePatches(listener, options = {}) {
|
|
|
207
207
|
options = { ...options };
|
|
208
208
|
options.runNow ??= false;
|
|
209
209
|
let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);
|
|
210
|
-
return this.subscribe((value)
|
|
210
|
+
return this.subscribe(function(value) {
|
|
211
211
|
if (patches.value !== value) {
|
|
212
212
|
const result = diff(patches.value, value, options);
|
|
213
213
|
patches.value = value;
|
|
@@ -234,7 +234,7 @@ function subscribePatches(listener, options = {}) {
|
|
|
234
234
|
previousVersion = cursor;
|
|
235
235
|
}
|
|
236
236
|
cursor = patches.version;
|
|
237
|
-
listener(forward, backward, cursor, previousVersion);
|
|
237
|
+
listener.apply(this, [forward, backward, cursor, previousVersion]);
|
|
238
238
|
}, options);
|
|
239
239
|
}
|
|
240
240
|
function applyPatches(...patches) {
|
package/dist/cjs/index2.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.cjs","sources":["../../src/lib/applyPatches.ts","../../src/lib/diff.ts","../../src/lib/extendedJson.ts","../../src/lib/trie.ts","../../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Date && b instanceof Date) {\n if (a.getTime() === b.getTime()) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (isObject(a) && isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n","export function toExtendedJson(value: unknown): unknown {\n if (value instanceof Map) {\n return {\n __map: [...value].map(([k, v]) => [toExtendedJson(k), toExtendedJson(v)]),\n };\n }\n\n if (value instanceof Set) {\n return {\n __set: [...value].map(toExtendedJson),\n };\n }\n\n if (value instanceof Date) {\n return {\n __date: value.toISOString(),\n };\n }\n\n if (Array.isArray(value)) {\n return value.map(toExtendedJson);\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, toExtendedJson(v)]));\n }\n\n return value;\n}\n\nexport function toExtendedJsonString(value: unknown): string {\n return JSON.stringify(toExtendedJson(value));\n}\n\nexport function fromExtendedJson(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n if ('__map' in value) {\n return new Map(\n (value.__map as [unknown, unknown][]).map(([k, v]) => [\n fromExtendedJson(k),\n fromExtendedJson(v),\n ]),\n );\n }\n\n if ('__set' in value) {\n return new Set((value.__set as unknown[]).map(fromExtendedJson));\n }\n\n if ('__date' in value) {\n return new Date(value.__date as string);\n }\n\n if (Array.isArray(value)) {\n return value.map(fromExtendedJson);\n }\n\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fromExtendedJson(v)]));\n}\n\nexport function fromExtendedJsonString(value: string): unknown {\n return fromExtendedJson(JSON.parse(value));\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe((value) => {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener(forward, backward, cursor, previousVersion);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n return this.subscribePatches(\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, runNow: true },\n );\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n this.applyPatches(...patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"names":["remove","set","applyPatches","deepEqual","isObject","_applyPatches"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.cjs","sources":["../../src/lib/applyPatches.ts","../../src/lib/diff.ts","../../src/lib/extendedJson.ts","../../src/lib/trie.ts","../../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Date && b instanceof Date) {\n if (a.getTime() === b.getTime()) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (isObject(a) && isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n","export function toExtendedJson(value: unknown): unknown {\n if (value instanceof Map) {\n return {\n __map: [...value].map(([k, v]) => [toExtendedJson(k), toExtendedJson(v)]),\n };\n }\n\n if (value instanceof Set) {\n return {\n __set: [...value].map(toExtendedJson),\n };\n }\n\n if (value instanceof Date) {\n return {\n __date: value.toISOString(),\n };\n }\n\n if (Array.isArray(value)) {\n return value.map(toExtendedJson);\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, toExtendedJson(v)]));\n }\n\n return value;\n}\n\nexport function toExtendedJsonString(value: unknown): string {\n return JSON.stringify(toExtendedJson(value));\n}\n\nexport function fromExtendedJson(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n if ('__map' in value) {\n return new Map(\n (value.__map as [unknown, unknown][]).map(([k, v]) => [\n fromExtendedJson(k),\n fromExtendedJson(v),\n ]),\n );\n }\n\n if ('__set' in value) {\n return new Set((value.__set as unknown[]).map(fromExtendedJson));\n }\n\n if ('__date' in value) {\n return new Date(value.__date as string);\n }\n\n if (Array.isArray(value)) {\n return value.map(fromExtendedJson);\n }\n\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fromExtendedJson(v)]));\n}\n\nexport function fromExtendedJsonString(value: string): unknown {\n return fromExtendedJson(JSON.parse(value));\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n return this.subscribePatches(\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, runNow: true },\n );\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n this.applyPatches(...patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"names":["remove","set","applyPatches","deepEqual","isObject","_applyPatches"],"mappings":"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"}
|
package/dist/cjs/react/index.cjs
CHANGED
|
@@ -278,18 +278,26 @@ function FormContainer({
|
|
|
278
278
|
formProps.className,
|
|
279
279
|
hasTriggeredValidations ? formInstance.options.validatedClass ?? "validated" : undefined
|
|
280
280
|
].filter(Boolean).join(" "),
|
|
281
|
-
onSubmit: (event) => {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
281
|
+
onSubmit: async (event) => {
|
|
282
|
+
if (formInstance.derivedState.get().saveInProgress) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
formInstance.derivedState.set("saveInProgress", true);
|
|
287
|
+
event.preventDefault();
|
|
288
|
+
const formElement = event.currentTarget;
|
|
289
|
+
const buttonElement = event.nativeEvent instanceof SubmitEvent && event.nativeEvent.submitter instanceof HTMLButtonElement ? event.nativeEvent.submitter : void 0;
|
|
290
|
+
updateValidity(formInstance.derivedState.get().errors, buttonElement);
|
|
291
|
+
formElement.reportValidity();
|
|
292
|
+
const isValid = formInstance.validate();
|
|
293
|
+
if (isValid) {
|
|
294
|
+
await formProps.onSubmit?.(event, {
|
|
295
|
+
...formInstance,
|
|
296
|
+
...formInstance.derivedState.get()
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
} finally {
|
|
300
|
+
formInstance.derivedState.set("saveInProgress", false);
|
|
293
301
|
}
|
|
294
302
|
}
|
|
295
303
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/react/form/customInput.tsx","../../../src/lib/wildcardMatch.ts","../../../src/react/form/formField.tsx","../../../src/react/form/formForEach.tsx","../../../src/react/form/useFormAutosave.ts","../../../src/react/form/form.tsx","../../../src/react/useDecoupledState.ts","../../../src/lib/castArray.ts","../../../src/react/useUrlParamScope.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CustomInputProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n children?: ReactNode;\n}\n\nexport function CustomInput({ name, children, ...props }: CustomInputProps): JSX.Element {\n return (\n <div\n {...props}\n style={{\n position: 'relative',\n ...props.style,\n }}\n >\n {children}\n\n <input\n name={name}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n opacity: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n />\n </div>\n );\n}\n","import { isObject } from '@lib/helpers';\nimport { type KeyType } from './path';\nimport { castArrayPath } from './propAccess';\n\nexport function wildcardMatch(s: KeyType[] | string, w: KeyType[] | string): boolean {\n if (typeof s === 'string') {\n s = castArrayPath(s);\n }\n\n if (typeof w === 'string') {\n w = castArrayPath(w);\n }\n\n return s.length === w.length && s.every((s, i) => w[i] === '*' || s === w[i]);\n}\n\nexport function getWildCardMatches(\n object: any,\n path: [KeyType, ...KeyType[]] | string,\n): Record<KeyType, any> {\n const matches: Record<KeyType, any> = {};\n const [first, second, ...rest] = castArrayPath(path);\n\n if (first === undefined) {\n throw new Error('Path is empty');\n }\n\n if (!Array.isArray(object) && !isObject(object)) {\n object = {};\n }\n\n for (const [key, value] of first !== '*' ? [[first, object[first]]] : Object.entries(object)) {\n if (first !== '*' && first !== key) {\n continue;\n }\n\n if (second === undefined) {\n matches[key] = value;\n continue;\n }\n\n for (const [subKey, subValue] of Object.entries(getWildCardMatches(value, [second, ...rest]))) {\n matches[`${key}.${subKey}`] = subValue;\n }\n }\n\n return matches;\n}\n","import { type PathAsString, type Value } from '@lib/path';\nimport {\n createElement,\n useEffect,\n useState,\n type Component,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { type Field, type Form, type FormInstance } from './form';\n\nexport interface FormFieldComponentProps<TValue, TPath> {\n name: TPath;\n value: TValue;\n onChange: (event: { target: { value: TValue } } | TValue | undefined, ...args: any[]) => void;\n onBlur: (...args: any[]) => void;\n}\n\nexport type FormFieldInfos<TDraft, TOriginal, TPath extends string> = Field<\n TDraft,\n TOriginal,\n TPath\n> & {\n hasTriggeredValidations: boolean;\n};\n\ntype NativeInputType = 'input' | 'select' | 'textarea';\n\ntype PartialComponentType<P> =\n | (new (props: P, context?: any) => Component<P, any>)\n | ((props: P, context?: any) => ReactNode);\n\nexport type FormFieldComponent = NativeInputType | PartialComponentType<any>;\n\ntype FieldValue<T extends FormFieldComponent> = ComponentPropsWithoutRef<T>['value'];\n\ntype FieldChangeValue<T extends FormFieldComponent> =\n ComponentPropsWithoutRef<T> extends {\n onChange?: (update: infer U) => void;\n }\n ? U extends { target: { value: infer V } }\n ? V\n : U\n : never;\n\ntype MakeOptional<T, Keys extends string> = Omit<T, Keys> & Partial<Pick<T, Keys & keyof T>>;\n\nexport type FormFieldProps<TPath, TDraft> = {\n name: TPath & PathAsString<TDraft>;\n commitOnBlur?: boolean;\n commitDebounce?: number;\n};\n\nexport type FormFieldPropsWithRender<TDraft, TOriginal, TPath extends string> = FormFieldProps<\n TPath,\n TDraft\n> &\n NoInfer<{\n component?: undefined;\n render: (\n props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n info: FormFieldInfos<TDraft, TOriginal, TPath>,\n ) => ReactNode;\n inputFilter?: undefined;\n defaultValue?: undefined;\n serialize?: undefined;\n deserialize?: undefined;\n onChange?: undefined;\n onBlur?: undefined;\n }>;\n\ntype Serialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: Value<TDraft, TPath>,\n formState: FormInstance<TDraft, TOriginal>,\n) => FieldValue<TComponent>;\n\ntype Deserialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: FieldChangeValue<TComponent>,\n formState: FormInstance<TDraft, TOriginal>,\n) => Value<TDraft, TPath>;\n\nexport type FormFieldPropsWithComponent<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n> = FormFieldProps<TPath, TDraft> & {\n component?: TComponent;\n render?: undefined;\n} & NoInfer<\n {\n inputFilter?: (value: FieldChangeValue<TComponent>) => boolean;\n } & MakeOptional<\n Omit<ComponentPropsWithoutRef<TComponent>, 'id' | 'name' | 'value' | 'defaultValue'>,\n 'onChange' | 'onBlur'\n > &\n (Value<TDraft, TPath> extends Exclude<FieldValue<TComponent>, undefined>\n ? {\n defaultValue?: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : Value<TDraft, TPath> extends FieldValue<TComponent>\n ?\n | {\n defaultValue: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n | {\n defaultValue?: FieldValue<TComponent>;\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }) &\n (FieldChangeValue<TComponent> extends Value<TDraft, TPath>\n ? {\n deserialize?: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n deserialize: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n })\n >;\n\nexport function FormField<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n>(\n this: Form<TDraft, any>,\n {\n // id,\n name = '' as any,\n component,\n commitOnBlur,\n commitDebounce,\n render,\n inputFilter,\n defaultValue,\n serialize,\n deserialize = (x) => x as Value<TDraft, TPath>,\n onChange,\n onBlur,\n ...restProps\n }:\n | FormFieldPropsWithRender<TDraft, TOriginal, TPath>\n | FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n): JSX.Element | null {\n type T = FieldChangeValue<TComponent>;\n\n const form = this.useForm();\n const getFormState = () => ({ ...form, ...form.derivedState.get() });\n const [localValue, setLocalValue] = useState<T>();\n\n const value = this.useFormState((form) => {\n const value = form.getField(name as any).value;\n if (serialize) {\n return serialize(value as any, getFormState());\n }\n if (value !== undefined) {\n return value;\n }\n return defaultValue;\n });\n\n const setValue = (x: FieldChangeValue<TComponent>) =>\n form.getField(name as any).setValue(deserialize(x, getFormState()));\n\n const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n useEffect(() => {\n if (localValue === undefined || !commitDebounce) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setValue(localValue);\n setLocalValue(undefined);\n }, commitDebounce);\n\n return () => clearTimeout(timeout);\n }, [localValue, commitDebounce]);\n\n const props = {\n name,\n value: localValue ?? value,\n onChange: (event: { target: { value: T } } | T, ...moreArgs: any[]) => {\n const value =\n typeof event === 'object' && event !== null && 'target' in event\n ? event.target.value\n : event;\n\n if (inputFilter && !inputFilter(value)) {\n return;\n }\n\n if (commitOnBlur || commitDebounce) {\n setLocalValue(value);\n } else {\n setValue(value);\n }\n\n onChange?.(event, ...moreArgs);\n },\n onBlur(...args: any[]) {\n if (localValue !== undefined) {\n setValue(localValue);\n setLocalValue(undefined);\n }\n\n onBlur?.(...args);\n },\n } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n if (render) {\n return (\n <>\n {render(props, { ...form.getField(name as any), hasTriggeredValidations } as any) ?? null}\n </>\n );\n }\n\n if (component) {\n return createElement(component, { ...restProps, ...props });\n }\n\n return null;\n}\n","import { type GetKeys, type Join, type PathAsString, type Value } from '@lib/path';\nimport { Fragment, useCallback, type ReactNode } from 'react';\nimport { type FieldHelperMethods, type Form } from './form';\n\nexport type ElementName<TDraft, TPath extends string> = keyof {\n [Path in TPath as Join<Path, GetKeys<NonNullable<Value<TDraft, Path>>> & (string | number)>]: 1;\n};\n\nexport interface FormForEachProps<TDraft, TPath extends string> {\n name: TPath & PathAsString<TDraft>;\n renderElement?: (props: {\n name: ElementName<TDraft, TPath>;\n key: `${GetKeys<NonNullable<Value<TDraft, TPath>>> & (string | number)}`;\n index: number;\n remove: () => void;\n }) => ReactNode;\n children?: (\n props: {\n setValue: (\n value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>),\n ) => void;\n } & FieldHelperMethods<TDraft, TPath>,\n ) => ReactNode;\n}\n\nexport function FormForEach<TDraft, TPath extends string>(\n this: Form<TDraft, any>,\n { name, renderElement, children }: FormForEachProps<TDraft, TPath>,\n): JSX.Element {\n const form = this.useForm();\n\n const names = this.useFormState(() => {\n const field = form.getField(name as any) as any;\n return field.names as any[];\n });\n\n const add = useCallback(\n (...args: any[]) => {\n const field = form.getField(name as any) as any;\n field.add(...args);\n },\n [form],\n );\n\n const remove = useCallback(\n (key: any) => {\n const field = form.getField(name as any) as any;\n field.remove(key);\n },\n [form],\n );\n\n const setValue = useCallback(\n (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => {\n const field = form.getField(name as any) as any;\n field.setValue(value);\n },\n [form],\n );\n\n return (\n <>\n {renderElement &&\n names.map((name, index) => {\n const key = name.split('.').pop();\n\n return (\n <Fragment key={key}>\n {renderElement({\n name,\n key,\n index,\n remove: () => remove(key),\n })}\n </Fragment>\n );\n })}\n\n {children?.({\n names,\n add,\n remove,\n setValue,\n } as any)}\n </>\n );\n}\n","import type { Duration } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { debounce } from '@lib/debounce';\nimport { deepEqual } from '@lib/equals';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { queue } from '@lib/queue';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { FormContext } from './form';\n\nexport interface FormAutosaveOptions<TDraft, TOriginal> {\n save: (draft: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;\n debounce?: Duration;\n resetAfterSave?: boolean;\n}\n\nexport function useFormAutosave<TDraft, TOriginal extends TDraft>(\n form: FormContext<TDraft, TOriginal>,\n): void {\n const { formState, options, getDraft } = form;\n const debounceTime = calcDuration(options.autoSave?.debounce ?? 2_000);\n const latestRef = useRef({ options });\n const lastValue = useRef<TDraft>();\n const q = useMemo(() => queue(), []);\n\n const run = useMemo(\n () =>\n debounce(async () => {\n const { options } = latestRef.current;\n const save = options.autoSave?.save;\n const draft = getDraft();\n\n lastValue.current = draft;\n\n q.clear();\n\n q(async () => {\n try {\n formState.set('saveInProgress', true);\n await save?.(draft, form);\n\n if (q.size === 0 && options.autoSave?.resetAfterSave) {\n form.reset();\n }\n } finally {\n formState.set('saveInProgress', false);\n\n if (q.size === 0) {\n formState.set('saveScheduled', false);\n }\n }\n });\n }, debounceTime),\n [formState, debounceTime],\n );\n\n useEffect(() => {\n if (!options.autoSave?.save) {\n return;\n }\n\n return formState\n .map((state) => state.draft)\n .subscribe(\n () => {\n if (deepEqual(getDraft(), lastValue.current)) {\n return;\n }\n\n run();\n formState.set('saveScheduled', true);\n },\n { runNow: false },\n );\n }, [formState]);\n\n useEffect(() => {\n latestRef.current = { options };\n });\n}\n","import { connectUrl, createStore, type Store, type Update, type UrlStoreOptions } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { deepEqual } from '@lib/equals';\nimport { simpleHash } from '@lib/hash';\nimport { isObject } from '@lib/helpers';\nimport {\n type Path,\n type PathAsString,\n type Value,\n type WildcardPathAsString,\n type WildcardValue,\n} from '@lib/path';\nimport { get, join } from '@lib/propAccess';\nimport type { Object_ } from '@lib/typeHelpers';\nimport { getWildCardMatches } from '@lib/wildcardMatch';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type Context,\n type FormEvent,\n type FunctionComponent,\n type HTMLProps,\n type ReactNode,\n} from 'react';\nimport { useStore, type UseStoreOptions } from '../useStore';\nimport {\n FormField,\n type FormFieldComponent,\n type FormFieldPropsWithComponent,\n type FormFieldPropsWithRender,\n} from './formField';\nimport { FormForEach, type ElementName, type FormForEachProps } from './formForEach';\nimport { useFormAutosave, type FormAutosaveOptions } from './useFormAutosave';\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Form types\n/// /////////////////////////////////////////////////////////////////////////////\n\nexport type Transform<TDraft> = Path<TDraft> | '' extends infer TPath\n ? TPath extends TPath\n ? {\n update: (value: Value<TDraft, TPath>, store: Store<TDraft>) => void | TDraft;\n } & (TPath extends '' ? { trigger?: '' } : { trigger: TPath })\n : never\n : never;\n\nexport interface FormOptions<TDraft, TOriginal> {\n defaultValue: TDraft;\n validations?: Validations<TDraft, TOriginal>;\n localizeError?: (error: string, field: string) => string | undefined;\n urlState?: boolean | UrlStoreOptions<TDraft>;\n autoSave?: FormAutosaveOptions<TDraft, TOriginal>;\n transform?: Transform<TDraft>[];\n validatedClass?: string;\n}\n\nexport type Validations<TDraft, TOriginal> = {\n [TPath in WildcardPathAsString<TDraft>]?: Record<string, Validation<TDraft, TOriginal, TPath>>;\n} & Record<string, Record<string, Validation<TDraft, TOriginal, any>>>;\n\nexport type Validation<TDraft, TOriginal, TPath> = (\n value: WildcardValue<TDraft, TPath>,\n context: {\n draft: TDraft;\n original: TOriginal;\n field: PathAsString<TDraft> | '';\n },\n) => boolean;\n\nexport type Field<TDraft, TOriginal, TPath extends string> = {\n originalValue: Value<TOriginal, TPath> | undefined;\n value: Value<TDraft, TPath>;\n setValue: (value: Update<Value<TDraft, TPath>>) => void;\n hasChange: boolean;\n errors: string[];\n} & (Value<TDraft, TPath> extends Object_ ? FieldHelperMethods<TDraft, TPath> : {});\n\nexport type FieldHelperMethods<TDraft, TPath extends string> = {\n names: ElementName<TDraft, TPath>[];\n add: NonNullable<Value<TDraft, TPath>> extends readonly (infer T)[]\n ? (element: T) => void\n : NonNullable<Value<TDraft, TPath>> extends Record<infer K, infer V>\n ? (key: K, value: V) => void\n : never;\n remove: Value<TDraft, TPath> extends readonly any[]\n ? (index: number) => void\n : (key: string) => void;\n};\n\nexport interface FormState<TDraft> {\n draft: TDraft | undefined;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n}\n\nexport interface FormDerivedState<TDraft> {\n draft: TDraft;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n hasChanges: boolean;\n errors: Map<string, string[]>;\n isValid: boolean;\n}\n\nexport interface FormContext<TDraft, TOriginal> {\n formState: Store<FormState<TDraft>>;\n derivedState: Store<FormDerivedState<TDraft>>;\n options: FormOptions<TDraft, TOriginal>;\n original: TOriginal | undefined;\n getField: <TPath extends string>(path: TPath) => Field<TDraft, TOriginal, TPath>;\n getDraft: () => TDraft;\n hasTriggeredValidations: () => boolean;\n hasChanges: () => boolean;\n getErrors: () => Map<string, string[]>;\n isValid: () => boolean;\n validate: () => boolean;\n reset: () => void;\n}\n\nexport interface FormInstance<TDraft, TOriginal>\n extends FormDerivedState<TDraft>,\n Pick<\n FormContext<TDraft, TOriginal>,\n 'options' | 'original' | 'getField' | 'validate' | 'reset'\n > {}\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Implementation\n/// /////////////////////////////////////////////////////////////////////////////\n\nfunction FormContainer({\n form,\n ...formProps\n}: {\n form: Form<any, any>;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<any, any>) => void;\n} & Omit<HTMLProps<HTMLFormElement>, 'form' | 'onSubmit'>) {\n const formInstance = form.useForm();\n const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n function updateValidity(errors: Map<string, string[]>, buttonElement?: HTMLButtonElement) {\n const formElement = formRef.current;\n if (!formElement) {\n return;\n }\n\n const localizedErrors = new Map(\n [...errors.entries()].map(\n ([field, errors]) =>\n [\n field,\n errors.map((error) => formInstance.options.localizeError?.(error, field) ?? error),\n ] as const,\n ),\n );\n\n for (const element of Array.from(formElement.elements)) {\n if ('name' in element && 'setCustomValidity' in element) {\n (element as HTMLObjectElement).setCustomValidity(\n localizedErrors.get((element as HTMLObjectElement).name)?.join('\\n') ?? '',\n );\n }\n }\n\n if (buttonElement && 'setCustomValidity' in buttonElement) {\n const errorString = [...errors.values()].flat().join('\\n');\n\n buttonElement.setCustomValidity(errorString);\n }\n }\n\n useEffect(() => {\n return formInstance.derivedState.map('errors').subscribe((errors) => updateValidity(errors));\n }, [formInstance.derivedState]);\n\n return (\n <form\n ref={formRef}\n noValidate\n {...formProps}\n className={[\n formProps.className,\n hasTriggeredValidations ? (formInstance.options.validatedClass ?? 'validated') : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onSubmit={(event) => {\n event.preventDefault();\n\n const formElement = event.currentTarget;\n const buttonElement =\n event.nativeEvent instanceof SubmitEvent &&\n event.nativeEvent.submitter instanceof HTMLButtonElement\n ? event.nativeEvent.submitter\n : undefined;\n\n updateValidity(formInstance.derivedState.get().errors, buttonElement);\n\n formElement.reportValidity();\n\n const isValid = formInstance.validate();\n if (isValid) {\n formProps.onSubmit?.(event, {\n ...formInstance,\n ...formInstance.derivedState.get(),\n });\n }\n }}\n />\n );\n}\n\nfunction getField<TDraft, TOriginal extends TDraft, TPath extends string>(\n derivedState: Store<FormDerivedState<TDraft>>,\n original: TOriginal | undefined,\n path: TPath,\n): Field<TDraft, TOriginal, TPath> {\n return {\n get originalValue() {\n return original !== undefined ? get(original as any, path as any) : undefined;\n },\n\n get value() {\n const { draft } = derivedState.get();\n return get(draft, path as any);\n },\n\n setValue(update: any) {\n derivedState.set(join('draft', path) as any, update);\n },\n\n get hasChange() {\n return !deepEqual(this.originalValue, this.value);\n },\n\n get errors() {\n const { errors } = derivedState.get();\n return errors.get(path) ?? [];\n },\n\n get names(): any {\n const { value } = this;\n\n if (Array.isArray(value)) {\n return value.map((_, index) => join(path, String(index)));\n }\n\n if (isObject(value)) {\n return Object.keys(value).map((key) => join(path, key));\n }\n\n return [];\n },\n\n add(...args: any[]) {\n this.setValue((value: any) => {\n if (args.length === 1) {\n return [...(value ?? []), args[0]];\n }\n\n return {\n ...value,\n [args[0]]: args[1],\n };\n });\n },\n\n remove(key: any) {\n this.setValue((value: any) => {\n if (!value) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.filter((_, index) => index !== key);\n }\n\n if (isObject(value)) {\n const { [key]: _, ...rest } = value;\n return rest;\n }\n\n return value;\n });\n },\n } as any;\n}\n\nfunction getErrors<TDraft, TOriginal>(\n draft: TDraft,\n original: TOriginal | undefined,\n validations: FormOptions<TDraft, TOriginal>['validations'],\n) {\n const errors = new Map<string, string[]>();\n\n for (const [path, block] of Object.entries(validations ?? {})) {\n for (const [validationName, validate] of Object.entries(\n block as Record<string, Validation<any, any, any>>,\n )) {\n let matched = false;\n\n for (const [field, value] of Object.entries(getWildCardMatches(draft, path))) {\n matched = true;\n if (!validate(value, { draft, original, field })) {\n const fieldErrors = errors.get(field) ?? [];\n fieldErrors.push(validationName);\n errors.set(field, fieldErrors);\n }\n }\n\n if (!matched && !path.includes('*')) {\n if (!validate(undefined, { draft, original, field: path })) {\n const fieldErrors = errors.get(path) ?? [];\n fieldErrors.push(validationName);\n errors.set(path, fieldErrors);\n }\n }\n }\n }\n\n return errors;\n}\n\nexport class Form<TDraft, TOriginal extends TDraft = TDraft> {\n context: Context<FormContext<TDraft, TOriginal> | null> = createContext<FormContext<\n TDraft,\n TOriginal\n > | null>(null);\n\n constructor(public readonly options: FormOptions<TDraft, TOriginal>) {\n autobind(Form);\n }\n\n useForm(): FormContext<TDraft, TOriginal> {\n const context = useContext(this.context);\n\n if (!context) {\n throw new Error('Form context not found');\n }\n\n return context;\n }\n\n useFormState<S>(\n selector: (state: FormInstance<TDraft, TOriginal>) => S,\n useStoreOptions?: UseStoreOptions<S>,\n ): S {\n const form = this.useForm();\n\n return useStore(\n form.derivedState.map((state) =>\n selector({\n ...form,\n ...state,\n }),\n ),\n useStoreOptions,\n );\n }\n\n useField<TPath extends string>(\n path: TPath,\n useStoreOptions?: UseStoreOptions<any>,\n ): Field<TDraft, TOriginal, TPath> {\n const form = this.useForm();\n this.useFormState((form) => [form.getField(path).value, form.original], useStoreOptions);\n return form.getField(path);\n }\n\n // ///////////////////////////////////////////////////////////////////////////\n // React Components\n // ///////////////////////////////////////////////////////////////////////////\n\n Form({\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ...formProps\n }: {\n original?: TOriginal;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<TDraft, TOriginal>) => void;\n } & Partial<FormOptions<TDraft, TOriginal>> &\n Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave' | 'onSubmit'>): JSX.Element {\n const options: FormOptions<TDraft, TOriginal> = {\n defaultValue: { ...this.options.defaultValue, ...defaultValue },\n validations: { ...this.options.validations, ...validations } as Validations<\n TDraft,\n TOriginal\n >,\n localizeError: localizeError ?? this.options.localizeError,\n autoSave: autoSave ?? this.options.autoSave,\n transform: transform ?? this.options.transform,\n validatedClass: validatedClass ?? this.options.validatedClass,\n };\n\n const formState = useMemo(() => {\n return createStore<FormState<TDraft>>({\n draft: undefined,\n hasTriggeredValidations: false,\n saveScheduled: false,\n saveInProgress: false,\n });\n }, []);\n\n const derivedState = useMemo(() => {\n return formState.map<FormDerivedState<TDraft>>(\n (state) => {\n const {\n draft = original ?? options.defaultValue,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n } = state;\n const errors = getErrors(draft, original, options.validations);\n\n return {\n draft,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n hasChanges: !deepEqual(draft, original ?? options.defaultValue),\n errors,\n isValid: errors.size === 0,\n };\n },\n (newState) => ({\n draft: newState.draft,\n hasTriggeredValidations: newState.hasTriggeredValidations,\n saveScheduled: newState.saveScheduled,\n saveInProgress: newState.saveInProgress,\n }),\n );\n }, [formState, original, options.validations, options.defaultValue]);\n\n const context = useMemo(() => {\n return {\n formState,\n derivedState,\n options,\n original,\n\n getField(path) {\n return getField(derivedState, original, path);\n },\n\n getDraft() {\n return formState.get().draft ?? original ?? options.defaultValue;\n },\n\n hasTriggeredValidations() {\n return formState.get().hasTriggeredValidations;\n },\n\n hasChanges() {\n return derivedState.get().hasChanges;\n },\n\n getErrors() {\n return derivedState.get().errors;\n },\n\n isValid() {\n return derivedState.get().isValid;\n },\n\n validate() {\n formState.set('hasTriggeredValidations', true);\n return derivedState.get().isValid;\n },\n\n reset() {\n formState.set('draft', undefined);\n formState.set('hasTriggeredValidations', false);\n },\n } satisfies FormContext<TDraft, TOriginal>;\n }, [\n formState,\n derivedState,\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ]);\n\n useEffect(() => {\n if (urlState) {\n return connectUrl(\n formState.map('draft'),\n typeof urlState === 'object' ? urlState : { key: 'form' },\n );\n }\n\n return undefined;\n }, [formState, simpleHash(urlState)]);\n\n useEffect(() => {\n const handles = options.transform?.map(({ trigger, update }) => {\n const draft = derivedState.map('draft');\n const triggerStore = trigger ? draft.map(trigger as any) : draft;\n\n return triggerStore.subscribe(() => {\n const value = trigger ? get(draft.get(), trigger as any) : draft.get();\n const result = update(value as any, draft);\n\n if (result !== undefined) {\n draft.set(result);\n }\n });\n });\n\n return () => {\n handles?.forEach((handle) => handle());\n };\n }, [options.transform]);\n\n useFormAutosave(context);\n\n return (\n <this.context.Provider value={context}>\n <FormContainer {...formProps} form={this} />\n </this.context.Provider>\n );\n }\n\n FormState<S>({\n selector,\n children,\n }: {\n selector: (form: FormInstance<TDraft, TOriginal>) => S;\n children: (selectedState: S) => ReactNode;\n }): JSX.Element {\n const selectedState = this.useFormState(selector);\n return <>{children(selectedState)}</>;\n }\n\n Field<const TPath extends string>(\n props: FormFieldPropsWithRender<TDraft, TOriginal, TPath>,\n ): JSX.Element;\n\n Field<const TPath extends string, const TComponent extends FormFieldComponent = 'input'>(\n props: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n ): JSX.Element;\n\n Field(props: any): JSX.Element {\n return Reflect.apply(FormField, this, [{ component: 'input', ...props }]);\n }\n\n ForEach<const TPath extends string>(props: FormForEachProps<TDraft, TPath>): JSX.Element {\n return Reflect.apply(FormForEach, this, [props]);\n }\n\n withForm<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n formProps?: Parameters<this['Form']>[0],\n ): FunctionComponent<TProps> {\n const { Form } = this;\n return function FormWrapper(props: TProps) {\n return (\n <Form {...formProps}>\n <Component {...props} />\n </Form>\n );\n };\n }\n}\n\nexport function createForm<TDraft, TOriginal extends TDraft = TDraft>(\n options: FormOptions<TDraft, TOriginal>,\n): Form<TDraft, TOriginal> {\n return new Form(options);\n}\n","import { startTransition, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport { simpleHash } from '@lib/hash';\nimport { throttle } from '@lib/throttle';\n\nexport interface UseDecoupledStateOptions<T> {\n debounce?: Duration;\n throttle?: Duration;\n onCommit?: (value: T) => void;\n}\n\nexport function useDecoupledState<T>(\n value: T,\n onChange: (value: T) => void,\n options: UseDecoupledStateOptions<T> = {},\n): [state: T, setState: (value: T) => void] {\n const [dirty, setDirty] = useState<{ v: T }>();\n const ref = useRef({ onChange, onCommit: options.onCommit });\n\n useEffect(() => {\n ref.current = { onChange, onCommit: options.onCommit };\n }, [onChange]);\n\n const update = useMemo(() => {\n const { onChange, onCommit } = ref.current;\n\n const update = (value: T) => {\n onChange(value);\n setDirty(undefined);\n onCommit?.(value);\n };\n\n let delayedUpdate: (value: T) => void;\n\n if (options.debounce) {\n delayedUpdate = debounce(update, options.debounce);\n } else if (options.throttle) {\n delayedUpdate = throttle(update, options.throttle);\n } else {\n delayedUpdate = (value) => startTransition(() => update(value));\n }\n\n return (value: T) => {\n setDirty({ v: value });\n delayedUpdate(value);\n };\n }, [simpleHash([options.debounce, options.throttle])]);\n\n return [dirty ? dirty.v : value, update];\n}\n","export function castArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n","import { castArray } from '@lib/castArray';\nimport { simpleHash } from '@lib/hash';\nimport { useEffect } from 'react';\n\nexport function useUrlParamScope({\n key,\n type = 'search',\n}: {\n key: string | string[];\n type?: 'search' | 'hash';\n}): void {\n useEffect(\n () => () => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n\n for (const _key of castArray(key)) {\n parameters.delete(_key);\n }\n\n url[type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n },\n [simpleHash(key), type],\n );\n}\n"],"names":["jsxs","jsx","castArrayPath","isObject","useState","form","value","useEffect","Fragment","createElement","useCallback","name","calcDuration","useRef","useMemo","queue","debounce","options","deepEqual","errors","get","join","createContext","autobind","useContext","useStore","createStore","connectUrl","simpleHash","Form","onChange","update","throttle","startTransition"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/react/form/customInput.tsx","../../../src/lib/wildcardMatch.ts","../../../src/react/form/formField.tsx","../../../src/react/form/formForEach.tsx","../../../src/react/form/useFormAutosave.ts","../../../src/react/form/form.tsx","../../../src/react/useDecoupledState.ts","../../../src/lib/castArray.ts","../../../src/react/useUrlParamScope.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CustomInputProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n children?: ReactNode;\n}\n\nexport function CustomInput({ name, children, ...props }: CustomInputProps): JSX.Element {\n return (\n <div\n {...props}\n style={{\n position: 'relative',\n ...props.style,\n }}\n >\n {children}\n\n <input\n name={name}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n opacity: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n />\n </div>\n );\n}\n","import { isObject } from '@lib/helpers';\nimport { type KeyType } from './path';\nimport { castArrayPath } from './propAccess';\n\nexport function wildcardMatch(s: KeyType[] | string, w: KeyType[] | string): boolean {\n if (typeof s === 'string') {\n s = castArrayPath(s);\n }\n\n if (typeof w === 'string') {\n w = castArrayPath(w);\n }\n\n return s.length === w.length && s.every((s, i) => w[i] === '*' || s === w[i]);\n}\n\nexport function getWildCardMatches(\n object: any,\n path: [KeyType, ...KeyType[]] | string,\n): Record<KeyType, any> {\n const matches: Record<KeyType, any> = {};\n const [first, second, ...rest] = castArrayPath(path);\n\n if (first === undefined) {\n throw new Error('Path is empty');\n }\n\n if (!Array.isArray(object) && !isObject(object)) {\n object = {};\n }\n\n for (const [key, value] of first !== '*' ? [[first, object[first]]] : Object.entries(object)) {\n if (first !== '*' && first !== key) {\n continue;\n }\n\n if (second === undefined) {\n matches[key] = value;\n continue;\n }\n\n for (const [subKey, subValue] of Object.entries(getWildCardMatches(value, [second, ...rest]))) {\n matches[`${key}.${subKey}`] = subValue;\n }\n }\n\n return matches;\n}\n","import { type PathAsString, type Value } from '@lib/path';\nimport {\n createElement,\n useEffect,\n useState,\n type Component,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { type Field, type Form, type FormInstance } from './form';\n\nexport interface FormFieldComponentProps<TValue, TPath> {\n name: TPath;\n value: TValue;\n onChange: (event: { target: { value: TValue } } | TValue | undefined, ...args: any[]) => void;\n onBlur: (...args: any[]) => void;\n}\n\nexport type FormFieldInfos<TDraft, TOriginal, TPath extends string> = Field<\n TDraft,\n TOriginal,\n TPath\n> & {\n hasTriggeredValidations: boolean;\n};\n\ntype NativeInputType = 'input' | 'select' | 'textarea';\n\ntype PartialComponentType<P> =\n | (new (props: P, context?: any) => Component<P, any>)\n | ((props: P, context?: any) => ReactNode);\n\nexport type FormFieldComponent = NativeInputType | PartialComponentType<any>;\n\ntype FieldValue<T extends FormFieldComponent> = ComponentPropsWithoutRef<T>['value'];\n\ntype FieldChangeValue<T extends FormFieldComponent> =\n ComponentPropsWithoutRef<T> extends {\n onChange?: (update: infer U) => void;\n }\n ? U extends { target: { value: infer V } }\n ? V\n : U\n : never;\n\ntype MakeOptional<T, Keys extends string> = Omit<T, Keys> & Partial<Pick<T, Keys & keyof T>>;\n\nexport type FormFieldProps<TPath, TDraft> = {\n name: TPath & PathAsString<TDraft>;\n commitOnBlur?: boolean;\n commitDebounce?: number;\n};\n\nexport type FormFieldPropsWithRender<TDraft, TOriginal, TPath extends string> = FormFieldProps<\n TPath,\n TDraft\n> &\n NoInfer<{\n component?: undefined;\n render: (\n props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n info: FormFieldInfos<TDraft, TOriginal, TPath>,\n ) => ReactNode;\n inputFilter?: undefined;\n defaultValue?: undefined;\n serialize?: undefined;\n deserialize?: undefined;\n onChange?: undefined;\n onBlur?: undefined;\n }>;\n\ntype Serialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: Value<TDraft, TPath>,\n formState: FormInstance<TDraft, TOriginal>,\n) => FieldValue<TComponent>;\n\ntype Deserialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: FieldChangeValue<TComponent>,\n formState: FormInstance<TDraft, TOriginal>,\n) => Value<TDraft, TPath>;\n\nexport type FormFieldPropsWithComponent<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n> = FormFieldProps<TPath, TDraft> & {\n component?: TComponent;\n render?: undefined;\n} & NoInfer<\n {\n inputFilter?: (value: FieldChangeValue<TComponent>) => boolean;\n } & MakeOptional<\n Omit<ComponentPropsWithoutRef<TComponent>, 'id' | 'name' | 'value' | 'defaultValue'>,\n 'onChange' | 'onBlur'\n > &\n (Value<TDraft, TPath> extends Exclude<FieldValue<TComponent>, undefined>\n ? {\n defaultValue?: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : Value<TDraft, TPath> extends FieldValue<TComponent>\n ?\n | {\n defaultValue: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n | {\n defaultValue?: FieldValue<TComponent>;\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }) &\n (FieldChangeValue<TComponent> extends Value<TDraft, TPath>\n ? {\n deserialize?: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n deserialize: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n })\n >;\n\nexport function FormField<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n>(\n this: Form<TDraft, any>,\n {\n // id,\n name = '' as any,\n component,\n commitOnBlur,\n commitDebounce,\n render,\n inputFilter,\n defaultValue,\n serialize,\n deserialize = (x) => x as Value<TDraft, TPath>,\n onChange,\n onBlur,\n ...restProps\n }:\n | FormFieldPropsWithRender<TDraft, TOriginal, TPath>\n | FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n): JSX.Element | null {\n type T = FieldChangeValue<TComponent>;\n\n const form = this.useForm();\n const getFormState = () => ({ ...form, ...form.derivedState.get() });\n const [localValue, setLocalValue] = useState<T>();\n\n const value = this.useFormState((form) => {\n const value = form.getField(name as any).value;\n if (serialize) {\n return serialize(value as any, getFormState());\n }\n if (value !== undefined) {\n return value;\n }\n return defaultValue;\n });\n\n const setValue = (x: FieldChangeValue<TComponent>) =>\n form.getField(name as any).setValue(deserialize(x, getFormState()));\n\n const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n useEffect(() => {\n if (localValue === undefined || !commitDebounce) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setValue(localValue);\n setLocalValue(undefined);\n }, commitDebounce);\n\n return () => clearTimeout(timeout);\n }, [localValue, commitDebounce]);\n\n const props = {\n name,\n value: localValue ?? value,\n onChange: (event: { target: { value: T } } | T, ...moreArgs: any[]) => {\n const value =\n typeof event === 'object' && event !== null && 'target' in event\n ? event.target.value\n : event;\n\n if (inputFilter && !inputFilter(value)) {\n return;\n }\n\n if (commitOnBlur || commitDebounce) {\n setLocalValue(value);\n } else {\n setValue(value);\n }\n\n onChange?.(event, ...moreArgs);\n },\n onBlur(...args: any[]) {\n if (localValue !== undefined) {\n setValue(localValue);\n setLocalValue(undefined);\n }\n\n onBlur?.(...args);\n },\n } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n if (render) {\n return (\n <>\n {render(props, { ...form.getField(name as any), hasTriggeredValidations } as any) ?? null}\n </>\n );\n }\n\n if (component) {\n return createElement(component, { ...restProps, ...props });\n }\n\n return null;\n}\n","import { type GetKeys, type Join, type PathAsString, type Value } from '@lib/path';\nimport { Fragment, useCallback, type ReactNode } from 'react';\nimport { type FieldHelperMethods, type Form } from './form';\n\nexport type ElementName<TDraft, TPath extends string> = keyof {\n [Path in TPath as Join<Path, GetKeys<NonNullable<Value<TDraft, Path>>> & (string | number)>]: 1;\n};\n\nexport interface FormForEachProps<TDraft, TPath extends string> {\n name: TPath & PathAsString<TDraft>;\n renderElement?: (props: {\n name: ElementName<TDraft, TPath>;\n key: `${GetKeys<NonNullable<Value<TDraft, TPath>>> & (string | number)}`;\n index: number;\n remove: () => void;\n }) => ReactNode;\n children?: (\n props: {\n setValue: (\n value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>),\n ) => void;\n } & FieldHelperMethods<TDraft, TPath>,\n ) => ReactNode;\n}\n\nexport function FormForEach<TDraft, TPath extends string>(\n this: Form<TDraft, any>,\n { name, renderElement, children }: FormForEachProps<TDraft, TPath>,\n): JSX.Element {\n const form = this.useForm();\n\n const names = this.useFormState(() => {\n const field = form.getField(name as any) as any;\n return field.names as any[];\n });\n\n const add = useCallback(\n (...args: any[]) => {\n const field = form.getField(name as any) as any;\n field.add(...args);\n },\n [form],\n );\n\n const remove = useCallback(\n (key: any) => {\n const field = form.getField(name as any) as any;\n field.remove(key);\n },\n [form],\n );\n\n const setValue = useCallback(\n (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => {\n const field = form.getField(name as any) as any;\n field.setValue(value);\n },\n [form],\n );\n\n return (\n <>\n {renderElement &&\n names.map((name, index) => {\n const key = name.split('.').pop();\n\n return (\n <Fragment key={key}>\n {renderElement({\n name,\n key,\n index,\n remove: () => remove(key),\n })}\n </Fragment>\n );\n })}\n\n {children?.({\n names,\n add,\n remove,\n setValue,\n } as any)}\n </>\n );\n}\n","import type { Duration } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { debounce } from '@lib/debounce';\nimport { deepEqual } from '@lib/equals';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { queue } from '@lib/queue';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { FormContext } from './form';\n\nexport interface FormAutosaveOptions<TDraft, TOriginal> {\n save: (draft: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;\n debounce?: Duration;\n resetAfterSave?: boolean;\n}\n\nexport function useFormAutosave<TDraft, TOriginal extends TDraft>(\n form: FormContext<TDraft, TOriginal>,\n): void {\n const { formState, options, getDraft } = form;\n const debounceTime = calcDuration(options.autoSave?.debounce ?? 2_000);\n const latestRef = useRef({ options });\n const lastValue = useRef<TDraft>();\n const q = useMemo(() => queue(), []);\n\n const run = useMemo(\n () =>\n debounce(async () => {\n const { options } = latestRef.current;\n const save = options.autoSave?.save;\n const draft = getDraft();\n\n lastValue.current = draft;\n\n q.clear();\n\n q(async () => {\n try {\n formState.set('saveInProgress', true);\n await save?.(draft, form);\n\n if (q.size === 0 && options.autoSave?.resetAfterSave) {\n form.reset();\n }\n } finally {\n formState.set('saveInProgress', false);\n\n if (q.size === 0) {\n formState.set('saveScheduled', false);\n }\n }\n });\n }, debounceTime),\n [formState, debounceTime],\n );\n\n useEffect(() => {\n if (!options.autoSave?.save) {\n return;\n }\n\n return formState\n .map((state) => state.draft)\n .subscribe(\n () => {\n if (deepEqual(getDraft(), lastValue.current)) {\n return;\n }\n\n run();\n formState.set('saveScheduled', true);\n },\n { runNow: false },\n );\n }, [formState]);\n\n useEffect(() => {\n latestRef.current = { options };\n });\n}\n","import { connectUrl, createStore, type Store, type Update, type UrlStoreOptions } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { deepEqual } from '@lib/equals';\nimport { simpleHash } from '@lib/hash';\nimport { isObject } from '@lib/helpers';\nimport {\n type Path,\n type PathAsString,\n type Value,\n type WildcardPathAsString,\n type WildcardValue,\n} from '@lib/path';\nimport { get, join } from '@lib/propAccess';\nimport type { Object_ } from '@lib/typeHelpers';\nimport { getWildCardMatches } from '@lib/wildcardMatch';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type Context,\n type FormEvent,\n type FunctionComponent,\n type HTMLProps,\n type ReactNode,\n} from 'react';\nimport { useStore, type UseStoreOptions } from '../useStore';\nimport {\n FormField,\n type FormFieldComponent,\n type FormFieldPropsWithComponent,\n type FormFieldPropsWithRender,\n} from './formField';\nimport { FormForEach, type ElementName, type FormForEachProps } from './formForEach';\nimport { useFormAutosave, type FormAutosaveOptions } from './useFormAutosave';\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Form types\n/// /////////////////////////////////////////////////////////////////////////////\n\nexport type Transform<TDraft> = Path<TDraft> | '' extends infer TPath\n ? TPath extends TPath\n ? {\n update: (value: Value<TDraft, TPath>, store: Store<TDraft>) => void | TDraft;\n } & (TPath extends '' ? { trigger?: '' } : { trigger: TPath })\n : never\n : never;\n\nexport interface FormOptions<TDraft, TOriginal> {\n defaultValue: TDraft;\n validations?: Validations<TDraft, TOriginal>;\n localizeError?: (error: string, field: string) => string | undefined;\n urlState?: boolean | UrlStoreOptions<TDraft>;\n autoSave?: FormAutosaveOptions<TDraft, TOriginal>;\n transform?: Transform<TDraft>[];\n validatedClass?: string;\n}\n\nexport type Validations<TDraft, TOriginal> = {\n [TPath in WildcardPathAsString<TDraft>]?: Record<string, Validation<TDraft, TOriginal, TPath>>;\n} & Record<string, Record<string, Validation<TDraft, TOriginal, any>>>;\n\nexport type Validation<TDraft, TOriginal, TPath> = (\n value: WildcardValue<TDraft, TPath>,\n context: {\n draft: TDraft;\n original: TOriginal;\n field: PathAsString<TDraft> | '';\n },\n) => boolean;\n\nexport type Field<TDraft, TOriginal, TPath extends string> = {\n originalValue: Value<TOriginal, TPath> | undefined;\n value: Value<TDraft, TPath>;\n setValue: (value: Update<Value<TDraft, TPath>>) => void;\n hasChange: boolean;\n errors: string[];\n} & (Value<TDraft, TPath> extends Object_ ? FieldHelperMethods<TDraft, TPath> : {});\n\nexport type FieldHelperMethods<TDraft, TPath extends string> = {\n names: ElementName<TDraft, TPath>[];\n add: NonNullable<Value<TDraft, TPath>> extends readonly (infer T)[]\n ? (element: T) => void\n : NonNullable<Value<TDraft, TPath>> extends Record<infer K, infer V>\n ? (key: K, value: V) => void\n : never;\n remove: Value<TDraft, TPath> extends readonly any[]\n ? (index: number) => void\n : (key: string) => void;\n};\n\nexport interface FormState<TDraft> {\n draft: TDraft | undefined;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n}\n\nexport interface FormDerivedState<TDraft> {\n draft: TDraft;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n hasChanges: boolean;\n errors: Map<string, string[]>;\n isValid: boolean;\n}\n\nexport interface FormContext<TDraft, TOriginal> {\n formState: Store<FormState<TDraft>>;\n derivedState: Store<FormDerivedState<TDraft>>;\n options: FormOptions<TDraft, TOriginal>;\n original: TOriginal | undefined;\n getField: <TPath extends string>(path: TPath) => Field<TDraft, TOriginal, TPath>;\n getDraft: () => TDraft;\n hasTriggeredValidations: () => boolean;\n hasChanges: () => boolean;\n getErrors: () => Map<string, string[]>;\n isValid: () => boolean;\n validate: () => boolean;\n reset: () => void;\n}\n\nexport interface FormInstance<TDraft, TOriginal>\n extends FormDerivedState<TDraft>,\n Pick<\n FormContext<TDraft, TOriginal>,\n 'options' | 'original' | 'getField' | 'validate' | 'reset'\n > {}\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Implementation\n/// /////////////////////////////////////////////////////////////////////////////\n\nfunction FormContainer({\n form,\n ...formProps\n}: {\n form: Form<any, any>;\n onSubmit?: (\n event: FormEvent<HTMLFormElement>,\n form: FormInstance<any, any>,\n ) => void | Promise<void>;\n} & Omit<HTMLProps<HTMLFormElement>, 'form' | 'onSubmit'>) {\n const formInstance = form.useForm();\n const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n function updateValidity(errors: Map<string, string[]>, buttonElement?: HTMLButtonElement) {\n const formElement = formRef.current;\n if (!formElement) {\n return;\n }\n\n const localizedErrors = new Map(\n [...errors.entries()].map(\n ([field, errors]) =>\n [\n field,\n errors.map((error) => formInstance.options.localizeError?.(error, field) ?? error),\n ] as const,\n ),\n );\n\n for (const element of Array.from(formElement.elements)) {\n if ('name' in element && 'setCustomValidity' in element) {\n (element as HTMLObjectElement).setCustomValidity(\n localizedErrors.get((element as HTMLObjectElement).name)?.join('\\n') ?? '',\n );\n }\n }\n\n if (buttonElement && 'setCustomValidity' in buttonElement) {\n const errorString = [...errors.values()].flat().join('\\n');\n\n buttonElement.setCustomValidity(errorString);\n }\n }\n\n useEffect(() => {\n return formInstance.derivedState.map('errors').subscribe((errors) => updateValidity(errors));\n }, [formInstance.derivedState]);\n\n return (\n <form\n ref={formRef}\n noValidate\n {...formProps}\n className={[\n formProps.className,\n hasTriggeredValidations ? (formInstance.options.validatedClass ?? 'validated') : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onSubmit={async (event) => {\n if (formInstance.derivedState.get().saveInProgress) {\n return;\n }\n\n try {\n formInstance.derivedState.set('saveInProgress', true);\n event.preventDefault();\n\n const formElement = event.currentTarget;\n const buttonElement =\n event.nativeEvent instanceof SubmitEvent &&\n event.nativeEvent.submitter instanceof HTMLButtonElement\n ? event.nativeEvent.submitter\n : undefined;\n\n updateValidity(formInstance.derivedState.get().errors, buttonElement);\n\n formElement.reportValidity();\n\n const isValid = formInstance.validate();\n if (isValid) {\n await formProps.onSubmit?.(event, {\n ...formInstance,\n ...formInstance.derivedState.get(),\n });\n }\n } finally {\n formInstance.derivedState.set('saveInProgress', false);\n }\n }}\n />\n );\n}\n\nfunction getField<TDraft, TOriginal extends TDraft, TPath extends string>(\n derivedState: Store<FormDerivedState<TDraft>>,\n original: TOriginal | undefined,\n path: TPath,\n): Field<TDraft, TOriginal, TPath> {\n return {\n get originalValue() {\n return original !== undefined ? get(original as any, path as any) : undefined;\n },\n\n get value() {\n const { draft } = derivedState.get();\n return get(draft, path as any);\n },\n\n setValue(update: any) {\n derivedState.set(join('draft', path) as any, update);\n },\n\n get hasChange() {\n return !deepEqual(this.originalValue, this.value);\n },\n\n get errors() {\n const { errors } = derivedState.get();\n return errors.get(path) ?? [];\n },\n\n get names(): any {\n const { value } = this;\n\n if (Array.isArray(value)) {\n return value.map((_, index) => join(path, String(index)));\n }\n\n if (isObject(value)) {\n return Object.keys(value).map((key) => join(path, key));\n }\n\n return [];\n },\n\n add(...args: any[]) {\n this.setValue((value: any) => {\n if (args.length === 1) {\n return [...(value ?? []), args[0]];\n }\n\n return {\n ...value,\n [args[0]]: args[1],\n };\n });\n },\n\n remove(key: any) {\n this.setValue((value: any) => {\n if (!value) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.filter((_, index) => index !== key);\n }\n\n if (isObject(value)) {\n const { [key]: _, ...rest } = value;\n return rest;\n }\n\n return value;\n });\n },\n } as any;\n}\n\nfunction getErrors<TDraft, TOriginal>(\n draft: TDraft,\n original: TOriginal | undefined,\n validations: FormOptions<TDraft, TOriginal>['validations'],\n) {\n const errors = new Map<string, string[]>();\n\n for (const [path, block] of Object.entries(validations ?? {})) {\n for (const [validationName, validate] of Object.entries(\n block as Record<string, Validation<any, any, any>>,\n )) {\n let matched = false;\n\n for (const [field, value] of Object.entries(getWildCardMatches(draft, path))) {\n matched = true;\n if (!validate(value, { draft, original, field })) {\n const fieldErrors = errors.get(field) ?? [];\n fieldErrors.push(validationName);\n errors.set(field, fieldErrors);\n }\n }\n\n if (!matched && !path.includes('*')) {\n if (!validate(undefined, { draft, original, field: path })) {\n const fieldErrors = errors.get(path) ?? [];\n fieldErrors.push(validationName);\n errors.set(path, fieldErrors);\n }\n }\n }\n }\n\n return errors;\n}\n\nexport class Form<TDraft, TOriginal extends TDraft = TDraft> {\n context: Context<FormContext<TDraft, TOriginal> | null> = createContext<FormContext<\n TDraft,\n TOriginal\n > | null>(null);\n\n constructor(public readonly options: FormOptions<TDraft, TOriginal>) {\n autobind(Form);\n }\n\n useForm(): FormContext<TDraft, TOriginal> {\n const context = useContext(this.context);\n\n if (!context) {\n throw new Error('Form context not found');\n }\n\n return context;\n }\n\n useFormState<S>(\n selector: (state: FormInstance<TDraft, TOriginal>) => S,\n useStoreOptions?: UseStoreOptions<S>,\n ): S {\n const form = this.useForm();\n\n return useStore(\n form.derivedState.map((state) =>\n selector({\n ...form,\n ...state,\n }),\n ),\n useStoreOptions,\n );\n }\n\n useField<TPath extends string>(\n path: TPath,\n useStoreOptions?: UseStoreOptions<any>,\n ): Field<TDraft, TOriginal, TPath> {\n const form = this.useForm();\n this.useFormState((form) => [form.getField(path).value, form.original], useStoreOptions);\n return form.getField(path);\n }\n\n // ///////////////////////////////////////////////////////////////////////////\n // React Components\n // ///////////////////////////////////////////////////////////////////////////\n\n Form({\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ...formProps\n }: {\n original?: TOriginal;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<TDraft, TOriginal>) => void;\n } & Partial<FormOptions<TDraft, TOriginal>> &\n Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave' | 'onSubmit'>): JSX.Element {\n const options: FormOptions<TDraft, TOriginal> = {\n defaultValue: { ...this.options.defaultValue, ...defaultValue },\n validations: { ...this.options.validations, ...validations } as Validations<\n TDraft,\n TOriginal\n >,\n localizeError: localizeError ?? this.options.localizeError,\n autoSave: autoSave ?? this.options.autoSave,\n transform: transform ?? this.options.transform,\n validatedClass: validatedClass ?? this.options.validatedClass,\n };\n\n const formState = useMemo(() => {\n return createStore<FormState<TDraft>>({\n draft: undefined,\n hasTriggeredValidations: false,\n saveScheduled: false,\n saveInProgress: false,\n });\n }, []);\n\n const derivedState = useMemo(() => {\n return formState.map<FormDerivedState<TDraft>>(\n (state) => {\n const {\n draft = original ?? options.defaultValue,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n } = state;\n const errors = getErrors(draft, original, options.validations);\n\n return {\n draft,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n hasChanges: !deepEqual(draft, original ?? options.defaultValue),\n errors,\n isValid: errors.size === 0,\n };\n },\n (newState) => ({\n draft: newState.draft,\n hasTriggeredValidations: newState.hasTriggeredValidations,\n saveScheduled: newState.saveScheduled,\n saveInProgress: newState.saveInProgress,\n }),\n );\n }, [formState, original, options.validations, options.defaultValue]);\n\n const context = useMemo(() => {\n return {\n formState,\n derivedState,\n options,\n original,\n\n getField(path) {\n return getField(derivedState, original, path);\n },\n\n getDraft() {\n return formState.get().draft ?? original ?? options.defaultValue;\n },\n\n hasTriggeredValidations() {\n return formState.get().hasTriggeredValidations;\n },\n\n hasChanges() {\n return derivedState.get().hasChanges;\n },\n\n getErrors() {\n return derivedState.get().errors;\n },\n\n isValid() {\n return derivedState.get().isValid;\n },\n\n validate() {\n formState.set('hasTriggeredValidations', true);\n return derivedState.get().isValid;\n },\n\n reset() {\n formState.set('draft', undefined);\n formState.set('hasTriggeredValidations', false);\n },\n } satisfies FormContext<TDraft, TOriginal>;\n }, [\n formState,\n derivedState,\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ]);\n\n useEffect(() => {\n if (urlState) {\n return connectUrl(\n formState.map('draft'),\n typeof urlState === 'object' ? urlState : { key: 'form' },\n );\n }\n\n return undefined;\n }, [formState, simpleHash(urlState)]);\n\n useEffect(() => {\n const handles = options.transform?.map(({ trigger, update }) => {\n const draft = derivedState.map('draft');\n const triggerStore = trigger ? draft.map(trigger as any) : draft;\n\n return triggerStore.subscribe(() => {\n const value = trigger ? get(draft.get(), trigger as any) : draft.get();\n const result = update(value as any, draft);\n\n if (result !== undefined) {\n draft.set(result);\n }\n });\n });\n\n return () => {\n handles?.forEach((handle) => handle());\n };\n }, [options.transform]);\n\n useFormAutosave(context);\n\n return (\n <this.context.Provider value={context}>\n <FormContainer {...formProps} form={this} />\n </this.context.Provider>\n );\n }\n\n FormState<S>({\n selector,\n children,\n }: {\n selector: (form: FormInstance<TDraft, TOriginal>) => S;\n children: (selectedState: S) => ReactNode;\n }): JSX.Element {\n const selectedState = this.useFormState(selector);\n return <>{children(selectedState)}</>;\n }\n\n Field<const TPath extends string>(\n props: FormFieldPropsWithRender<TDraft, TOriginal, TPath>,\n ): JSX.Element;\n\n Field<const TPath extends string, const TComponent extends FormFieldComponent = 'input'>(\n props: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n ): JSX.Element;\n\n Field(props: any): JSX.Element {\n return Reflect.apply(FormField, this, [{ component: 'input', ...props }]);\n }\n\n ForEach<const TPath extends string>(props: FormForEachProps<TDraft, TPath>): JSX.Element {\n return Reflect.apply(FormForEach, this, [props]);\n }\n\n withForm<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n formProps?: Parameters<this['Form']>[0],\n ): FunctionComponent<TProps> {\n const { Form } = this;\n return function FormWrapper(props: TProps) {\n return (\n <Form {...formProps}>\n <Component {...props} />\n </Form>\n );\n };\n }\n}\n\nexport function createForm<TDraft, TOriginal extends TDraft = TDraft>(\n options: FormOptions<TDraft, TOriginal>,\n): Form<TDraft, TOriginal> {\n return new Form(options);\n}\n","import { startTransition, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport { simpleHash } from '@lib/hash';\nimport { throttle } from '@lib/throttle';\n\nexport interface UseDecoupledStateOptions<T> {\n debounce?: Duration;\n throttle?: Duration;\n onCommit?: (value: T) => void;\n}\n\nexport function useDecoupledState<T>(\n value: T,\n onChange: (value: T) => void,\n options: UseDecoupledStateOptions<T> = {},\n): [state: T, setState: (value: T) => void] {\n const [dirty, setDirty] = useState<{ v: T }>();\n const ref = useRef({ onChange, onCommit: options.onCommit });\n\n useEffect(() => {\n ref.current = { onChange, onCommit: options.onCommit };\n }, [onChange]);\n\n const update = useMemo(() => {\n const { onChange, onCommit } = ref.current;\n\n const update = (value: T) => {\n onChange(value);\n setDirty(undefined);\n onCommit?.(value);\n };\n\n let delayedUpdate: (value: T) => void;\n\n if (options.debounce) {\n delayedUpdate = debounce(update, options.debounce);\n } else if (options.throttle) {\n delayedUpdate = throttle(update, options.throttle);\n } else {\n delayedUpdate = (value) => startTransition(() => update(value));\n }\n\n return (value: T) => {\n setDirty({ v: value });\n delayedUpdate(value);\n };\n }, [simpleHash([options.debounce, options.throttle])]);\n\n return [dirty ? dirty.v : value, update];\n}\n","export function castArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n","import { castArray } from '@lib/castArray';\nimport { simpleHash } from '@lib/hash';\nimport { useEffect } from 'react';\n\nexport function useUrlParamScope({\n key,\n type = 'search',\n}: {\n key: string | string[];\n type?: 'search' | 'hash';\n}): void {\n useEffect(\n () => () => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n\n for (const _key of castArray(key)) {\n parameters.delete(_key);\n }\n\n url[type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n },\n [simpleHash(key), type],\n );\n}\n"],"names":["jsxs","jsx","castArrayPath","isObject","useState","form","value","useEffect","Fragment","createElement","useCallback","name","calcDuration","useRef","useMemo","queue","debounce","options","deepEqual","errors","get","join","createContext","autobind","useContext","useStore","createStore","connectUrl","simpleHash","Form","onChange","update","throttle","startTransition"],"mappings":"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"}
|
package/dist/cjs/store.cjs
CHANGED
|
@@ -613,7 +613,7 @@ class Store extends Callable {
|
|
|
613
613
|
const _previousValue = previousValue?.value;
|
|
614
614
|
previousValue = this.calculatedValue && { value: this.calculatedValue?.value };
|
|
615
615
|
try {
|
|
616
|
-
listener(value.value, _previousValue);
|
|
616
|
+
listener.apply({ cancel }, [value.value, _previousValue]);
|
|
617
617
|
} catch (error) {
|
|
618
618
|
forwardError(error);
|
|
619
619
|
}
|
|
@@ -624,6 +624,11 @@ class Store extends Callable {
|
|
|
624
624
|
innerListener = debounce(innerListener, debounceOption);
|
|
625
625
|
}
|
|
626
626
|
this.listeners.set(innerListener, !passive);
|
|
627
|
+
const cancel = () => {
|
|
628
|
+
if (this.listeners.delete(innerListener) && !passive) {
|
|
629
|
+
this.onUnsubscribe();
|
|
630
|
+
}
|
|
631
|
+
};
|
|
627
632
|
if (!passive) {
|
|
628
633
|
this.onSubscribe();
|
|
629
634
|
}
|
|
@@ -633,11 +638,7 @@ class Store extends Callable {
|
|
|
633
638
|
} else {
|
|
634
639
|
previousValue = passive ? this.calculatedValue && { value: this.calculatedValue.value } : { value: this.get() };
|
|
635
640
|
}
|
|
636
|
-
return disposable(
|
|
637
|
-
if (this.listeners.delete(innerListener) && !passive) {
|
|
638
|
-
this.onUnsubscribe();
|
|
639
|
-
}
|
|
640
|
-
});
|
|
641
|
+
return disposable(cancel);
|
|
641
642
|
}
|
|
642
643
|
once(...args) {
|
|
643
644
|
const condition = args[0] instanceof Function ? args[0] : Boolean;
|