react-state-bucket 1.2.10 → 1.2.12

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/index.d.ts CHANGED
@@ -10,14 +10,16 @@ type BucketOptions = {
10
10
  type InitialBucketData = {
11
11
  [key: string]: XVInstanceType;
12
12
  };
13
- declare const createBucket: <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {
14
- (): Record<keyof T, any>;
15
- validate(): boolean;
16
- isValid(key: keyof T): boolean;
17
- getChanges(): Partial<Record<keyof T, any>>;
18
- isChanged(k: keyof T): boolean;
19
- errors(): Record<string, string>;
20
- getError(key: keyof T): any;
13
+ declare const createBucket: <T extends InitialBucketData>(initial: T, option?: BucketOptions) => () => {
14
+ state: Record<keyof T, any>;
15
+ get: (key: keyof T, defaultValue?: any) => Record<keyof T, any>[keyof T];
16
+ set: (key: keyof T, value: any) => void;
17
+ validate: () => boolean;
18
+ isValid: (key: keyof T) => boolean;
19
+ getChanges: () => Partial<Record<keyof T, any>>;
20
+ isChanged: (k: keyof T) => boolean;
21
+ errors: () => Record<string, string>;
22
+ getError: (key: keyof T) => any;
21
23
  };
22
24
  declare const xv: {
23
25
  any: () => xanv.XVAny<any>;
package/index.js CHANGED
@@ -20,87 +20,94 @@
20
20
  hooks.delete(id);
21
21
  };
22
22
  }, []);
23
- return new Proxy(state, {
24
- get: (target, prop) => target[prop],
25
- set: (target, prop, value) => {
26
- if (!(prop in initial)) {
27
- throw new Error(`Property ${String(prop)} is not defined in the bucket.`);
23
+ const get = (key, defaultValue) => {
24
+ if (!(key in initial)) {
25
+ throw new Error(`Property ${String(key)} is not defined in the bucket.`);
26
+ }
27
+ let value = state[key];
28
+ if (value === undefined && defaultValue !== undefined) {
29
+ value = defaultValue;
30
+ }
31
+ return value;
32
+ };
33
+ const set = (key, value) => {
34
+ if (!(key in initial)) {
35
+ throw new Error(`Property ${String(key)} is not defined in the bucket.`);
36
+ }
37
+ state[key] = value;
38
+ hooks.forEach((hook) => hook());
39
+ changes[key] = true;
40
+ if ((option === null || option === void 0 ? void 0 : option.onChange) && changes[key]) {
41
+ option.onChange(key, value);
42
+ }
43
+ if (typeof window !== 'undefined') {
44
+ value = JSON.stringify(value);
45
+ if (option.store === 'session' || option.store === 'local') {
46
+ let storage = option.store === "session" ? sessionStorage : localStorage;
47
+ storage.setItem(option.data_key, JSON.stringify(state));
28
48
  }
29
- target[prop] = value;
30
- hooks.forEach((hook) => hook());
31
- changes[prop] = true;
32
- if ((option === null || option === void 0 ? void 0 : option.onChange) && changes[prop]) {
33
- option.onChange(prop, value);
49
+ else if (option.store === 'url') {
50
+ let url = new URL(window.location.href);
51
+ url.searchParams.set(option.data_key, encodeURIComponent(JSON.stringify(state)));
52
+ window.history.replaceState({}, '', url.toString());
34
53
  }
35
- if (typeof window !== 'undefined') {
36
- value = JSON.stringify(value);
37
- if (option.store === 'session' || option.store === 'local') {
38
- let storage = option.store === "session" ? sessionStorage : localStorage;
39
- storage.setItem(option.data_key, JSON.stringify(state));
40
- }
41
- else if (option.store === 'url') {
42
- let url = new URL(window.location.href);
43
- url.searchParams.set(option.data_key, encodeURIComponent(JSON.stringify(state)));
44
- window.history.replaceState({}, '', url.toString());
45
- }
46
- else if (option.store === 'cookie') {
47
- Cookie.setCookie(option.data_key, JSON.stringify(state));
48
- }
54
+ else if (option.store === 'cookie') {
55
+ Cookie.setCookie(option.data_key, JSON.stringify(state));
49
56
  }
50
- return true;
51
57
  }
52
- });
53
- };
54
- useBucket.validate = () => {
55
- try {
56
- for (let k in initial) {
57
- initial[k].parse(state[k]);
58
+ };
59
+ const validate = () => {
60
+ try {
61
+ for (let k in initial) {
62
+ initial[k].parse(state[k]);
63
+ }
58
64
  }
59
- }
60
- catch (error) {
61
- return false;
62
- }
63
- return true;
64
- };
65
- useBucket.isValid = (key) => {
66
- try {
67
- initial[key].parse(state[key]);
68
- }
69
- catch (error) {
70
- return false;
71
- }
72
- return true;
73
- };
74
- useBucket.getChanges = () => {
75
- const changedData = {};
76
- for (let k in changes) {
77
- if (changes[k]) {
78
- changedData[k] = state[k];
65
+ catch (error) {
66
+ return false;
79
67
  }
80
- }
81
- return changedData;
82
- };
83
- useBucket.isChanged = (k) => !!changes[k];
84
- useBucket.errors = () => {
85
- const errors = {};
86
- for (let k in initial) {
68
+ return true;
69
+ };
70
+ const isValid = (key) => {
87
71
  try {
88
- initial[k].parse(state[k]);
72
+ initial[key].parse(state[key]);
89
73
  }
90
74
  catch (error) {
91
- errors[k] = error.message;
75
+ return false;
92
76
  }
93
- }
94
- return errors;
95
- };
96
- useBucket.getError = (key) => {
97
- try {
98
- initial[key].parse(state[key]);
99
- }
100
- catch (error) {
101
- return error.message;
102
- }
103
- return null;
77
+ return true;
78
+ };
79
+ const getChanges = () => {
80
+ const changedData = {};
81
+ for (let k in changes) {
82
+ if (changes[k]) {
83
+ changedData[k] = state[k];
84
+ }
85
+ }
86
+ return changedData;
87
+ };
88
+ const isChanged = (k) => !!changes[k];
89
+ const errors = () => {
90
+ const errors = {};
91
+ for (let k in initial) {
92
+ try {
93
+ initial[k].parse(state[k]);
94
+ }
95
+ catch (error) {
96
+ errors[k] = error.message;
97
+ }
98
+ }
99
+ return errors;
100
+ };
101
+ const getError = (key) => {
102
+ try {
103
+ initial[key].parse(state[key]);
104
+ }
105
+ catch (error) {
106
+ return error.message;
107
+ }
108
+ return null;
109
+ };
110
+ return { state, get, set, validate, isValid, getChanges, isChanged, errors, getError };
104
111
  };
105
112
  return useBucket;
106
113
  };
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { useEffect, useId, useState } from \"react\"\nimport { xv as XV, XVInstanceType } from \"xanv\"\nimport youid from \"youid\";\nimport { getCookie, setCookie } from \"./Cookie\";\nimport Initial from \"./Initial\";\n\nexport type StoreType = \"memory\" | \"session\" | \"local\" | \"url\" | \"cookie\"\nexport type BucketOptions = {\n store?: StoreType;\n data_key?: string;\n onChange?: (key: string, value: any) => void\n}\n\nexport type InitialBucketData = {\n [key: string]: XVInstanceType\n}\n\n\nexport const createBucket = <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {\n option = {\n store: \"memory\",\n ...option,\n }\n\n if (!option?.data_key) {\n let data_key = ''\n for (let key in initial) {\n const field = initial[key]\n data_key += key + ':' + JSON.stringify(field.meta) + ';'\n }\n option.data_key = youid(data_key)\n }\n\n\n const hooks = new Map<string, Function>()\n const state: Record<keyof T, T[keyof T]> = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, T[keyof T]>;\n const changes: Record<keyof T, boolean> = {} as any\n\n const useBucket = () => {\n const id = \"rsb_\" + useId()\n const [, setState] = useState(0)\n\n useEffect(() => {\n hooks.set(id, () => setState(Math.random()))\n return () => {\n hooks.delete(id)\n }\n }, [])\n\n return new Proxy(state, {\n get: (target: any, prop: string) => target[prop],\n set: (target, prop: string, value) => {\n if (!(prop in initial)) {\n throw new Error(`Property ${String(prop)} is not defined in the bucket.`)\n }\n (target as any)[prop as keyof T] = value;\n hooks.forEach((hook) => hook());\n changes[prop as keyof T] = true\n\n if (option?.onChange && changes[prop as keyof T]) {\n option.onChange(prop as string, value)\n }\n\n if (typeof window !== 'undefined') {\n value = JSON.stringify(value) as any\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n storage.setItem(option.data_key!, JSON.stringify(state))\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n url.searchParams.set(option.data_key!, encodeURIComponent(JSON.stringify(state)))\n window.history.replaceState({}, '', url.toString())\n } else if (option.store === 'cookie') {\n setCookie(option.data_key!, JSON.stringify(state))\n }\n }\n return true;\n }\n }) as Record<keyof T, any>\n }\n\n useBucket.validate = () => {\n try {\n for (let k in initial) {\n initial[k].parse(state[k])\n }\n } catch (error) {\n return false\n }\n return true\n }\n\n useBucket.isValid = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error) {\n return false\n }\n return true\n }\n\n useBucket.getChanges = () => {\n const changedData: Partial<Record<keyof T, any>> = {}\n for (let k in changes) {\n if (changes[k as keyof T]) {\n changedData[k as keyof T] = state[k as keyof T]\n }\n }\n return changedData\n }\n\n useBucket.isChanged = (k: keyof T) => !!changes[k]\n\n useBucket.errors = () => {\n const errors: Record<string, string> = {}\n for (let k in initial) {\n try {\n initial[k].parse(state[k])\n } catch (error: any) {\n errors[k] = error.message\n }\n }\n return errors\n }\n\n useBucket.getError = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error: any) {\n return error.message\n }\n return null\n }\n\n\n return useBucket\n}\n\nexport const xv = XV"],"names":["Initial","useId","useState","useEffect","setCookie","XV"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { useEffect, useId, useState } from \"react\"\nimport { Infer, xv as XV, XVInstanceType } from \"xanv\"\nimport youid from \"youid\";\nimport { getCookie, setCookie } from \"./Cookie\";\nimport Initial from \"./Initial\";\n\nexport type StoreType = \"memory\" | \"session\" | \"local\" | \"url\" | \"cookie\"\nexport type BucketOptions = {\n store?: StoreType;\n data_key?: string;\n onChange?: (key: string, value: any) => void\n}\n\nexport type InitialBucketData = {\n [key: string]: XVInstanceType\n}\n\n\nexport const createBucket = <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {\n option = {\n store: \"memory\",\n ...option,\n }\n\n if (!option?.data_key) {\n let data_key = ''\n for (let key in initial) {\n const field = initial[key]\n data_key += key + ':' + JSON.stringify(field.meta) + ';'\n }\n option.data_key = youid(data_key)\n }\n\n const hooks = new Map<string, Function>()\n const state: Record<keyof T, any> = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, any>;\n const changes: Record<keyof T, boolean> = {} as any\n\n const useBucket = () => {\n const id = \"rsb_\" + useId()\n const [, setState] = useState(0)\n\n useEffect(() => {\n hooks.set(id, () => setState(Math.random()))\n return () => {\n hooks.delete(id)\n }\n }, [])\n\n const get = (key: keyof T, defaultValue?: any) => {\n if (!(key in initial)) {\n throw new Error(`Property ${String(key)} is not defined in the bucket.`)\n }\n let value = state[key];\n if (value === undefined && defaultValue !== undefined) {\n value = defaultValue\n }\n return value;\n }\n\n const set = (key: keyof T, value: any) => {\n if (!(key in initial)) {\n throw new Error(`Property ${String(key)} is not defined in the bucket.`)\n }\n state[key] = value;\n hooks.forEach((hook) => hook());\n changes[key] = true\n\n if (option?.onChange && changes[key]) {\n option.onChange(key as string, value)\n }\n\n if (typeof window !== 'undefined') {\n value = JSON.stringify(value) as any\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n storage.setItem(option.data_key!, JSON.stringify(state))\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n url.searchParams.set(option.data_key!, encodeURIComponent(JSON.stringify(state)))\n window.history.replaceState({}, '', url.toString())\n } else if (option.store === 'cookie') {\n setCookie(option.data_key!, JSON.stringify(state))\n }\n }\n }\n\n const validate = () => {\n try {\n for (let k in initial) {\n initial[k].parse(state[k])\n }\n } catch (error) {\n return false\n }\n return true\n }\n\n const isValid = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error) {\n return false\n }\n return true\n }\n\n const getChanges = () => {\n const changedData: Partial<Record<keyof T, any>> = {}\n for (let k in changes) {\n if (changes[k as keyof T]) {\n changedData[k as keyof T] = state[k as keyof T]\n }\n }\n return changedData\n }\n\n const isChanged = (k: keyof T) => !!changes[k]\n\n const errors = () => {\n const errors: Record<string, string> = {}\n for (let k in initial) {\n try {\n initial[k].parse(state[k])\n } catch (error: any) {\n errors[k] = error.message\n }\n }\n return errors\n }\n\n const getError = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error: any) {\n return error.message\n }\n return null\n }\n\n return { state, get, set, validate, isValid, getChanges, isChanged, errors, getError }\n }\n\n return useBucket\n}\n\nexport const xv = XV"],"names":["Initial","useId","useState","useEffect","setCookie","XV"],"mappings":"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"}
package/index.mjs CHANGED
@@ -20,87 +20,94 @@ import {useId,useState,useEffect}from'react';import {xv as xv$1}from'xanv';impor
20
20
  hooks.delete(id);
21
21
  };
22
22
  }, []);
23
- return new Proxy(state, {
24
- get: (target, prop) => target[prop],
25
- set: (target, prop, value) => {
26
- if (!(prop in initial)) {
27
- throw new Error(`Property ${String(prop)} is not defined in the bucket.`);
23
+ const get = (key, defaultValue) => {
24
+ if (!(key in initial)) {
25
+ throw new Error(`Property ${String(key)} is not defined in the bucket.`);
26
+ }
27
+ let value = state[key];
28
+ if (value === undefined && defaultValue !== undefined) {
29
+ value = defaultValue;
30
+ }
31
+ return value;
32
+ };
33
+ const set = (key, value) => {
34
+ if (!(key in initial)) {
35
+ throw new Error(`Property ${String(key)} is not defined in the bucket.`);
36
+ }
37
+ state[key] = value;
38
+ hooks.forEach((hook) => hook());
39
+ changes[key] = true;
40
+ if ((option === null || option === void 0 ? void 0 : option.onChange) && changes[key]) {
41
+ option.onChange(key, value);
42
+ }
43
+ if (typeof window !== 'undefined') {
44
+ value = JSON.stringify(value);
45
+ if (option.store === 'session' || option.store === 'local') {
46
+ let storage = option.store === "session" ? sessionStorage : localStorage;
47
+ storage.setItem(option.data_key, JSON.stringify(state));
28
48
  }
29
- target[prop] = value;
30
- hooks.forEach((hook) => hook());
31
- changes[prop] = true;
32
- if ((option === null || option === void 0 ? void 0 : option.onChange) && changes[prop]) {
33
- option.onChange(prop, value);
49
+ else if (option.store === 'url') {
50
+ let url = new URL(window.location.href);
51
+ url.searchParams.set(option.data_key, encodeURIComponent(JSON.stringify(state)));
52
+ window.history.replaceState({}, '', url.toString());
34
53
  }
35
- if (typeof window !== 'undefined') {
36
- value = JSON.stringify(value);
37
- if (option.store === 'session' || option.store === 'local') {
38
- let storage = option.store === "session" ? sessionStorage : localStorage;
39
- storage.setItem(option.data_key, JSON.stringify(state));
40
- }
41
- else if (option.store === 'url') {
42
- let url = new URL(window.location.href);
43
- url.searchParams.set(option.data_key, encodeURIComponent(JSON.stringify(state)));
44
- window.history.replaceState({}, '', url.toString());
45
- }
46
- else if (option.store === 'cookie') {
47
- setCookie(option.data_key, JSON.stringify(state));
48
- }
54
+ else if (option.store === 'cookie') {
55
+ setCookie(option.data_key, JSON.stringify(state));
49
56
  }
50
- return true;
51
57
  }
52
- });
53
- };
54
- useBucket.validate = () => {
55
- try {
56
- for (let k in initial) {
57
- initial[k].parse(state[k]);
58
+ };
59
+ const validate = () => {
60
+ try {
61
+ for (let k in initial) {
62
+ initial[k].parse(state[k]);
63
+ }
58
64
  }
59
- }
60
- catch (error) {
61
- return false;
62
- }
63
- return true;
64
- };
65
- useBucket.isValid = (key) => {
66
- try {
67
- initial[key].parse(state[key]);
68
- }
69
- catch (error) {
70
- return false;
71
- }
72
- return true;
73
- };
74
- useBucket.getChanges = () => {
75
- const changedData = {};
76
- for (let k in changes) {
77
- if (changes[k]) {
78
- changedData[k] = state[k];
65
+ catch (error) {
66
+ return false;
79
67
  }
80
- }
81
- return changedData;
82
- };
83
- useBucket.isChanged = (k) => !!changes[k];
84
- useBucket.errors = () => {
85
- const errors = {};
86
- for (let k in initial) {
68
+ return true;
69
+ };
70
+ const isValid = (key) => {
87
71
  try {
88
- initial[k].parse(state[k]);
72
+ initial[key].parse(state[key]);
89
73
  }
90
74
  catch (error) {
91
- errors[k] = error.message;
75
+ return false;
92
76
  }
93
- }
94
- return errors;
95
- };
96
- useBucket.getError = (key) => {
97
- try {
98
- initial[key].parse(state[key]);
99
- }
100
- catch (error) {
101
- return error.message;
102
- }
103
- return null;
77
+ return true;
78
+ };
79
+ const getChanges = () => {
80
+ const changedData = {};
81
+ for (let k in changes) {
82
+ if (changes[k]) {
83
+ changedData[k] = state[k];
84
+ }
85
+ }
86
+ return changedData;
87
+ };
88
+ const isChanged = (k) => !!changes[k];
89
+ const errors = () => {
90
+ const errors = {};
91
+ for (let k in initial) {
92
+ try {
93
+ initial[k].parse(state[k]);
94
+ }
95
+ catch (error) {
96
+ errors[k] = error.message;
97
+ }
98
+ }
99
+ return errors;
100
+ };
101
+ const getError = (key) => {
102
+ try {
103
+ initial[key].parse(state[key]);
104
+ }
105
+ catch (error) {
106
+ return error.message;
107
+ }
108
+ return null;
109
+ };
110
+ return { state, get, set, validate, isValid, getChanges, isChanged, errors, getError };
104
111
  };
105
112
  return useBucket;
106
113
  };
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { useEffect, useId, useState } from \"react\"\nimport { xv as XV, XVInstanceType } from \"xanv\"\nimport youid from \"youid\";\nimport { getCookie, setCookie } from \"./Cookie\";\nimport Initial from \"./Initial\";\n\nexport type StoreType = \"memory\" | \"session\" | \"local\" | \"url\" | \"cookie\"\nexport type BucketOptions = {\n store?: StoreType;\n data_key?: string;\n onChange?: (key: string, value: any) => void\n}\n\nexport type InitialBucketData = {\n [key: string]: XVInstanceType\n}\n\n\nexport const createBucket = <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {\n option = {\n store: \"memory\",\n ...option,\n }\n\n if (!option?.data_key) {\n let data_key = ''\n for (let key in initial) {\n const field = initial[key]\n data_key += key + ':' + JSON.stringify(field.meta) + ';'\n }\n option.data_key = youid(data_key)\n }\n\n\n const hooks = new Map<string, Function>()\n const state: Record<keyof T, T[keyof T]> = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, T[keyof T]>;\n const changes: Record<keyof T, boolean> = {} as any\n\n const useBucket = () => {\n const id = \"rsb_\" + useId()\n const [, setState] = useState(0)\n\n useEffect(() => {\n hooks.set(id, () => setState(Math.random()))\n return () => {\n hooks.delete(id)\n }\n }, [])\n\n return new Proxy(state, {\n get: (target: any, prop: string) => target[prop],\n set: (target, prop: string, value) => {\n if (!(prop in initial)) {\n throw new Error(`Property ${String(prop)} is not defined in the bucket.`)\n }\n (target as any)[prop as keyof T] = value;\n hooks.forEach((hook) => hook());\n changes[prop as keyof T] = true\n\n if (option?.onChange && changes[prop as keyof T]) {\n option.onChange(prop as string, value)\n }\n\n if (typeof window !== 'undefined') {\n value = JSON.stringify(value) as any\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n storage.setItem(option.data_key!, JSON.stringify(state))\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n url.searchParams.set(option.data_key!, encodeURIComponent(JSON.stringify(state)))\n window.history.replaceState({}, '', url.toString())\n } else if (option.store === 'cookie') {\n setCookie(option.data_key!, JSON.stringify(state))\n }\n }\n return true;\n }\n }) as Record<keyof T, any>\n }\n\n useBucket.validate = () => {\n try {\n for (let k in initial) {\n initial[k].parse(state[k])\n }\n } catch (error) {\n return false\n }\n return true\n }\n\n useBucket.isValid = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error) {\n return false\n }\n return true\n }\n\n useBucket.getChanges = () => {\n const changedData: Partial<Record<keyof T, any>> = {}\n for (let k in changes) {\n if (changes[k as keyof T]) {\n changedData[k as keyof T] = state[k as keyof T]\n }\n }\n return changedData\n }\n\n useBucket.isChanged = (k: keyof T) => !!changes[k]\n\n useBucket.errors = () => {\n const errors: Record<string, string> = {}\n for (let k in initial) {\n try {\n initial[k].parse(state[k])\n } catch (error: any) {\n errors[k] = error.message\n }\n }\n return errors\n }\n\n useBucket.getError = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error: any) {\n return error.message\n }\n return null\n }\n\n\n return useBucket\n}\n\nexport const xv = XV"],"names":["XV"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { useEffect, useId, useState } from \"react\"\nimport { Infer, xv as XV, XVInstanceType } from \"xanv\"\nimport youid from \"youid\";\nimport { getCookie, setCookie } from \"./Cookie\";\nimport Initial from \"./Initial\";\n\nexport type StoreType = \"memory\" | \"session\" | \"local\" | \"url\" | \"cookie\"\nexport type BucketOptions = {\n store?: StoreType;\n data_key?: string;\n onChange?: (key: string, value: any) => void\n}\n\nexport type InitialBucketData = {\n [key: string]: XVInstanceType\n}\n\n\nexport const createBucket = <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {\n option = {\n store: \"memory\",\n ...option,\n }\n\n if (!option?.data_key) {\n let data_key = ''\n for (let key in initial) {\n const field = initial[key]\n data_key += key + ':' + JSON.stringify(field.meta) + ';'\n }\n option.data_key = youid(data_key)\n }\n\n const hooks = new Map<string, Function>()\n const state: Record<keyof T, any> = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, any>;\n const changes: Record<keyof T, boolean> = {} as any\n\n const useBucket = () => {\n const id = \"rsb_\" + useId()\n const [, setState] = useState(0)\n\n useEffect(() => {\n hooks.set(id, () => setState(Math.random()))\n return () => {\n hooks.delete(id)\n }\n }, [])\n\n const get = (key: keyof T, defaultValue?: any) => {\n if (!(key in initial)) {\n throw new Error(`Property ${String(key)} is not defined in the bucket.`)\n }\n let value = state[key];\n if (value === undefined && defaultValue !== undefined) {\n value = defaultValue\n }\n return value;\n }\n\n const set = (key: keyof T, value: any) => {\n if (!(key in initial)) {\n throw new Error(`Property ${String(key)} is not defined in the bucket.`)\n }\n state[key] = value;\n hooks.forEach((hook) => hook());\n changes[key] = true\n\n if (option?.onChange && changes[key]) {\n option.onChange(key as string, value)\n }\n\n if (typeof window !== 'undefined') {\n value = JSON.stringify(value) as any\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n storage.setItem(option.data_key!, JSON.stringify(state))\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n url.searchParams.set(option.data_key!, encodeURIComponent(JSON.stringify(state)))\n window.history.replaceState({}, '', url.toString())\n } else if (option.store === 'cookie') {\n setCookie(option.data_key!, JSON.stringify(state))\n }\n }\n }\n\n const validate = () => {\n try {\n for (let k in initial) {\n initial[k].parse(state[k])\n }\n } catch (error) {\n return false\n }\n return true\n }\n\n const isValid = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error) {\n return false\n }\n return true\n }\n\n const getChanges = () => {\n const changedData: Partial<Record<keyof T, any>> = {}\n for (let k in changes) {\n if (changes[k as keyof T]) {\n changedData[k as keyof T] = state[k as keyof T]\n }\n }\n return changedData\n }\n\n const isChanged = (k: keyof T) => !!changes[k]\n\n const errors = () => {\n const errors: Record<string, string> = {}\n for (let k in initial) {\n try {\n initial[k].parse(state[k])\n } catch (error: any) {\n errors[k] = error.message\n }\n }\n return errors\n }\n\n const getError = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error: any) {\n return error.message\n }\n return null\n }\n\n return { state, get, set, validate, isValid, getChanges, isChanged, errors, getError }\n }\n\n return useBucket\n}\n\nexport const xv = XV"],"names":["XV"],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.2.10",
2
+ "version": "1.2.12",
3
3
  "name": "react-state-bucket",
4
4
  "author": "Naxrul Ahmed",
5
5
  "license": "MIT",