react-state-bucket 1.2.9 → 1.2.11

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/Initial.js ADDED
@@ -0,0 +1,37 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var Cookie=require('./Cookie.js');const Initial = (initial, data_key, option) => {
2
+ let state = {};
3
+ let data = "";
4
+ if (typeof window !== 'undefined') {
5
+ if (option.store === 'session' || option.store === 'local') {
6
+ let storage = option.store === "session" ? sessionStorage : localStorage;
7
+ data = storage.getItem(data_key);
8
+ }
9
+ else if (option.store === 'url') {
10
+ let url = new URL(window.location.href);
11
+ data = decodeURIComponent(url.searchParams.get(data_key) || "");
12
+ }
13
+ else if (option.store === 'cookie') {
14
+ data = Cookie.getCookie(data_key);
15
+ }
16
+ }
17
+ if (data) {
18
+ try {
19
+ data = JSON.parse(data);
20
+ }
21
+ catch (error) {
22
+ data = {};
23
+ }
24
+ }
25
+ else {
26
+ data = {};
27
+ }
28
+ for (let key in initial) {
29
+ try {
30
+ state[key] = initial[key].parse(data[key]);
31
+ }
32
+ catch (error) {
33
+ state[key] = data[key];
34
+ }
35
+ }
36
+ return state;
37
+ };exports.default=Initial;//# sourceMappingURL=Initial.js.map
package/Initial.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Initial.js","sources":["../src/Initial.ts"],"sourcesContent":["import { BucketOptions, InitialBucketData } from \".\";\nimport { getCookie } from \"./Cookie\";\n\nconst Initial = (initial: InitialBucketData, data_key: string, option: BucketOptions) => {\n let state = {} as Record<string, any>;\n let data: any = \"\"\n\n if (typeof window !== 'undefined') {\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n data = storage.getItem(data_key)\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n data = decodeURIComponent(url.searchParams.get(data_key) || \"\")\n } else if (option.store === 'cookie') {\n data = getCookie(data_key)\n }\n }\n\n if (data) {\n try {\n data = JSON.parse(data)\n } catch (error) {\n data = {}\n }\n } else {\n data = {}\n }\n\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n\n return state;\n}\n\nexport default Initial;"],"names":["getCookie"],"mappings":"wGAGA,MAAM,OAAO,GAAG,CAAC,OAA0B,EAAE,QAAgB,EAAE,MAAqB,KAAI;IACrF,IAAI,KAAK,GAAG,EAAyB;IACrC,IAAI,IAAI,GAAQ,EAAE;AAElB,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,QAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE;AACzD,YAAA,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,GAAG,cAAc,GAAG,YAAY;AACxE,YAAA,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnC;AAAO,aAAA,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE;YAChC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvC,YAAA,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClE;AAAO,aAAA,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE;AACnC,YAAA,IAAI,GAAGA,gBAAS,CAAC,QAAQ,CAAC;QAC7B;IACH;IAEA,IAAI,IAAI,EAAE;AACP,QAAA,IAAI;AACD,YAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1B;QAAE,OAAO,KAAK,EAAE;YACb,IAAI,GAAG,EAAE;QACZ;IACH;SAAO;QACJ,IAAI,GAAG,EAAE;IACZ;AAEA,IAAA,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE;AACtB,QAAA,IAAI;AACD,YAAA,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C;QAAE,OAAO,KAAK,EAAE;YACb,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QACzB;IACH;AAEA,IAAA,OAAO,KAAK;AACf"}
package/Initial.mjs ADDED
@@ -0,0 +1,37 @@
1
+ import {getCookie}from'./Cookie.mjs';const Initial = (initial, data_key, option) => {
2
+ let state = {};
3
+ let data = "";
4
+ if (typeof window !== 'undefined') {
5
+ if (option.store === 'session' || option.store === 'local') {
6
+ let storage = option.store === "session" ? sessionStorage : localStorage;
7
+ data = storage.getItem(data_key);
8
+ }
9
+ else if (option.store === 'url') {
10
+ let url = new URL(window.location.href);
11
+ data = decodeURIComponent(url.searchParams.get(data_key) || "");
12
+ }
13
+ else if (option.store === 'cookie') {
14
+ data = getCookie(data_key);
15
+ }
16
+ }
17
+ if (data) {
18
+ try {
19
+ data = JSON.parse(data);
20
+ }
21
+ catch (error) {
22
+ data = {};
23
+ }
24
+ }
25
+ else {
26
+ data = {};
27
+ }
28
+ for (let key in initial) {
29
+ try {
30
+ state[key] = initial[key].parse(data[key]);
31
+ }
32
+ catch (error) {
33
+ state[key] = data[key];
34
+ }
35
+ }
36
+ return state;
37
+ };export{Initial as default};//# sourceMappingURL=Initial.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Initial.mjs","sources":["../src/Initial.ts"],"sourcesContent":["import { BucketOptions, InitialBucketData } from \".\";\nimport { getCookie } from \"./Cookie\";\n\nconst Initial = (initial: InitialBucketData, data_key: string, option: BucketOptions) => {\n let state = {} as Record<string, any>;\n let data: any = \"\"\n\n if (typeof window !== 'undefined') {\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n data = storage.getItem(data_key)\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n data = decodeURIComponent(url.searchParams.get(data_key) || \"\")\n } else if (option.store === 'cookie') {\n data = getCookie(data_key)\n }\n }\n\n if (data) {\n try {\n data = JSON.parse(data)\n } catch (error) {\n data = {}\n }\n } else {\n data = {}\n }\n\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n\n return state;\n}\n\nexport default Initial;"],"names":[],"mappings":"qCAGA,MAAM,OAAO,GAAG,CAAC,OAA0B,EAAE,QAAgB,EAAE,MAAqB,KAAI;IACrF,IAAI,KAAK,GAAG,EAAyB;IACrC,IAAI,IAAI,GAAQ,EAAE;AAElB,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,QAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE;AACzD,YAAA,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,GAAG,cAAc,GAAG,YAAY;AACxE,YAAA,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnC;AAAO,aAAA,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE;YAChC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvC,YAAA,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClE;AAAO,aAAA,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE;AACnC,YAAA,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC7B;IACH;IAEA,IAAI,IAAI,EAAE;AACP,QAAA,IAAI;AACD,YAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1B;QAAE,OAAO,KAAK,EAAE;YACb,IAAI,GAAG,EAAE;QACZ;IACH;SAAO;QACJ,IAAI,GAAG,EAAE;IACZ;AAEA,IAAA,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE;AACtB,QAAA,IAAI;AACD,YAAA,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C;QAAE,OAAO,KAAK,EAAE;YACb,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QACzB;IACH;AAEA,IAAA,OAAO,KAAK;AACf"}
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as xanv from 'xanv';
2
- import { XVInstanceType } from 'xanv';
2
+ import { XVInstanceType, Infer } from 'xanv';
3
3
 
4
4
  type StoreType = "memory" | "session" | "local" | "url" | "cookie";
5
5
  type BucketOptions = {
@@ -10,10 +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
- errors(): Record<string, string>;
13
+ declare const createBucket: <T extends InitialBucketData>(initial: T, option?: BucketOptions) => () => {
14
+ state: Record<keyof T, Infer<T[keyof T]>>;
15
+ get: (key: keyof T, defaultValue?: any) => Record<keyof T, Infer<T[keyof T]>>[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;
17
23
  };
18
24
  declare const xv: {
19
25
  any: () => xanv.XVAny<any>;
package/index.js CHANGED
@@ -1,139 +1,113 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),xanv=require('xanv'),youid=require('youid'),Cookie=require('./Cookie.js');const createBucket = (initial, option) => {
2
- const hooks = new Map();
3
- const state = {};
4
- let data_key = (option === null || option === void 0 ? void 0 : option.data_key) || '';
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),xanv=require('xanv'),youid=require('youid'),Cookie=require('./Cookie.js'),Initial=require('./Initial.js');const createBucket = (initial, option) => {
2
+ option = Object.assign({ store: "memory" }, option);
5
3
  if (!(option === null || option === void 0 ? void 0 : option.data_key)) {
6
4
  let data_key = '';
7
5
  for (let key in initial) {
8
6
  const field = initial[key];
9
7
  data_key += key + ':' + JSON.stringify(field.meta) + ';';
10
8
  }
11
- data_key = youid(data_key);
12
- }
13
- option = Object.assign(Object.assign({ store: "memory" }, option), { data_key });
14
- // set state prototype for validation
15
- for (let key in initial) {
16
- try {
17
- state[key] = initial[key].parse(undefined);
18
- }
19
- catch (error) { }
9
+ option.data_key = youid(data_key);
20
10
  }
21
- if (typeof window !== 'undefined') {
22
- if (option.store === 'session' || option.store === 'local') {
23
- let storage = option.store === "session" ? sessionStorage : localStorage;
24
- const value = storage.getItem(data_key);
25
- let data = {};
26
- if (value) {
27
- data = JSON.parse(value);
11
+ const hooks = new Map();
12
+ const state = Initial.default(initial, (option === null || option === void 0 ? void 0 : option.data_key) || '', option || {});
13
+ const changes = {};
14
+ const useBucket = () => {
15
+ const id = "rsb_" + react.useId();
16
+ const [, setState] = react.useState(0);
17
+ react.useEffect(() => {
18
+ hooks.set(id, () => setState(Math.random()));
19
+ return () => {
20
+ hooks.delete(id);
21
+ };
22
+ }, []);
23
+ const get = (key, defaultValue) => {
24
+ if (!(key in initial)) {
25
+ throw new Error(`Property ${String(key)} is not defined in the bucket.`);
28
26
  }
29
- for (let key in initial) {
30
- try {
31
- state[key] = initial[key].parse(data[key]);
32
- }
33
- catch (error) {
34
- state[key] = data[key];
35
- }
27
+ let value = state[key];
28
+ if (value === undefined && defaultValue !== undefined) {
29
+ value = defaultValue;
36
30
  }
37
- }
38
- else if (option.store === 'url') {
39
- let url = new URL(window.location.href);
40
- const value = url.searchParams.get(data_key);
41
- let data = {};
42
- if (value) {
43
- data = JSON.parse(decodeURIComponent(value));
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.`);
44
36
  }
45
- for (let key in initial) {
46
- try {
47
- state[key] = initial[key].parse(data[key]);
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));
48
48
  }
49
- catch (error) {
50
- state[key] = data[key];
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());
53
+ }
54
+ else if (option.store === 'cookie') {
55
+ Cookie.setCookie(option.data_key, JSON.stringify(state));
51
56
  }
52
57
  }
53
- }
54
- else if (option.store === 'cookie') {
55
- const cookieData = Cookie.getCookie(data_key);
56
- let data = {};
57
- if (cookieData) {
58
- data = JSON.parse(cookieData);
59
- }
60
- for (let key in initial) {
61
- try {
62
- state[key] = initial[key].parse(data[key]);
58
+ };
59
+ const validate = () => {
60
+ try {
61
+ for (let k in initial) {
62
+ initial[k].parse(state[k]);
63
63
  }
64
- catch (error) {
65
- state[key] = data[key];
64
+ }
65
+ catch (error) {
66
+ return false;
67
+ }
68
+ return true;
69
+ };
70
+ const isValid = (key) => {
71
+ try {
72
+ initial[key].parse(state[key]);
73
+ }
74
+ catch (error) {
75
+ return false;
76
+ }
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];
66
84
  }
67
85
  }
68
- }
69
- else {
70
- for (let key in initial) {
86
+ return changedData;
87
+ };
88
+ const isChanged = (k) => !!changes[k];
89
+ const errors = () => {
90
+ const errors = {};
91
+ for (let k in initial) {
71
92
  try {
72
- state[key] = initial[key].parse(undefined);
93
+ initial[k].parse(state[k]);
73
94
  }
74
95
  catch (error) {
96
+ errors[k] = error.message;
75
97
  }
76
98
  }
77
- }
78
- }
79
- const useBucket = () => {
80
- const id = "rsb_" + react.useId();
81
- const [, setState] = react.useState(0);
82
- react.useEffect(() => {
83
- hooks.set(id, () => setState(Math.random()));
84
- return () => {
85
- hooks.delete(id);
86
- };
87
- }, [id]);
88
- return new Proxy(state, {
89
- get: (target, prop) => target[prop],
90
- set: (target, prop, value) => {
91
- if (!(prop in initial)) {
92
- throw new Error(`Property ${String(prop)} is not defined in the bucket.`);
93
- }
94
- target[prop] = value;
95
- hooks.forEach((hook) => hook());
96
- if (typeof window !== 'undefined') {
97
- value = JSON.stringify(value);
98
- if (option.store === 'session' || option.store === 'local') {
99
- let storage = option.store === "session" ? sessionStorage : localStorage;
100
- storage.setItem(data_key, JSON.stringify(state));
101
- }
102
- else if (option.store === 'url') {
103
- let url = new URL(window.location.href);
104
- url.searchParams.set(data_key, encodeURIComponent(JSON.stringify(state)));
105
- window.history.replaceState({}, '', url.toString());
106
- }
107
- else if (option.store === 'cookie') {
108
- Cookie.setCookie(data_key, JSON.stringify(state));
109
- }
110
- }
111
- return true;
112
- }
113
- });
114
- };
115
- useBucket.validate = () => {
116
- try {
117
- for (let k in initial) {
118
- initial[k].parse(state[k]);
119
- }
120
- }
121
- catch (error) {
122
- return false;
123
- }
124
- return true;
125
- };
126
- useBucket.errors = () => {
127
- const errors = {};
128
- for (let k in initial) {
99
+ return errors;
100
+ };
101
+ const getError = (key) => {
129
102
  try {
130
- initial[k].parse(state[k]);
103
+ initial[key].parse(state[key]);
131
104
  }
132
105
  catch (error) {
133
- errors[k] = error.message;
106
+ return error.message;
134
107
  }
135
- }
136
- return errors;
108
+ return null;
109
+ };
110
+ return { state, get, set, validate, isValid, getChanges, isChanged, errors, getError };
137
111
  };
138
112
  return useBucket;
139
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\";\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\nexport const createBucket = <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {\n const hooks = new Map<string, Function>()\n const state: Record<keyof T, T[keyof T]> = {} as any\n\n let data_key = option?.data_key || ''\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 data_key = youid(data_key)\n }\n\n option = {\n store: \"memory\",\n ...option,\n data_key,\n }\n // set state prototype for validation\n\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(undefined)\n } catch (error) { }\n }\n\n if (typeof window !== 'undefined') {\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n const value = storage.getItem(data_key)\n let data: any = {}\n if (value) {\n data = JSON.parse(value)\n }\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n const value = url.searchParams.get(data_key)\n let data: any = {}\n if (value) {\n data = JSON.parse(decodeURIComponent(value))\n }\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n } else if (option.store === 'cookie') {\n const cookieData = getCookie(data_key)\n let data: any = {}\n if (cookieData) {\n data = JSON.parse(cookieData)\n }\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n } else {\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(undefined)\n } catch (error) {\n }\n }\n }\n }\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 }, [id])\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 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(data_key, JSON.stringify(state))\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n url.searchParams.set(data_key, encodeURIComponent(JSON.stringify(state)))\n window.history.replaceState({}, '', url.toString())\n } else if (option.store === 'cookie') {\n setCookie(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.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 return useBucket\n}\n\nexport const xv = XV"],"names":["getCookie","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, Infer<T[keyof T]>> = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, Infer<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 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
@@ -1,139 +1,113 @@
1
- import {useId,useState,useEffect}from'react';import {xv as xv$1}from'xanv';import youid from'youid';import {getCookie,setCookie}from'./Cookie.mjs';const createBucket = (initial, option) => {
2
- const hooks = new Map();
3
- const state = {};
4
- let data_key = (option === null || option === void 0 ? void 0 : option.data_key) || '';
1
+ import {useId,useState,useEffect}from'react';import {xv as xv$1}from'xanv';import youid from'youid';import {setCookie}from'./Cookie.mjs';import Initial from'./Initial.mjs';const createBucket = (initial, option) => {
2
+ option = Object.assign({ store: "memory" }, option);
5
3
  if (!(option === null || option === void 0 ? void 0 : option.data_key)) {
6
4
  let data_key = '';
7
5
  for (let key in initial) {
8
6
  const field = initial[key];
9
7
  data_key += key + ':' + JSON.stringify(field.meta) + ';';
10
8
  }
11
- data_key = youid(data_key);
12
- }
13
- option = Object.assign(Object.assign({ store: "memory" }, option), { data_key });
14
- // set state prototype for validation
15
- for (let key in initial) {
16
- try {
17
- state[key] = initial[key].parse(undefined);
18
- }
19
- catch (error) { }
9
+ option.data_key = youid(data_key);
20
10
  }
21
- if (typeof window !== 'undefined') {
22
- if (option.store === 'session' || option.store === 'local') {
23
- let storage = option.store === "session" ? sessionStorage : localStorage;
24
- const value = storage.getItem(data_key);
25
- let data = {};
26
- if (value) {
27
- data = JSON.parse(value);
11
+ const hooks = new Map();
12
+ const state = Initial(initial, (option === null || option === void 0 ? void 0 : option.data_key) || '', option || {});
13
+ const changes = {};
14
+ const useBucket = () => {
15
+ const id = "rsb_" + useId();
16
+ const [, setState] = useState(0);
17
+ useEffect(() => {
18
+ hooks.set(id, () => setState(Math.random()));
19
+ return () => {
20
+ hooks.delete(id);
21
+ };
22
+ }, []);
23
+ const get = (key, defaultValue) => {
24
+ if (!(key in initial)) {
25
+ throw new Error(`Property ${String(key)} is not defined in the bucket.`);
28
26
  }
29
- for (let key in initial) {
30
- try {
31
- state[key] = initial[key].parse(data[key]);
32
- }
33
- catch (error) {
34
- state[key] = data[key];
35
- }
27
+ let value = state[key];
28
+ if (value === undefined && defaultValue !== undefined) {
29
+ value = defaultValue;
36
30
  }
37
- }
38
- else if (option.store === 'url') {
39
- let url = new URL(window.location.href);
40
- const value = url.searchParams.get(data_key);
41
- let data = {};
42
- if (value) {
43
- data = JSON.parse(decodeURIComponent(value));
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.`);
44
36
  }
45
- for (let key in initial) {
46
- try {
47
- state[key] = initial[key].parse(data[key]);
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));
48
48
  }
49
- catch (error) {
50
- state[key] = data[key];
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());
53
+ }
54
+ else if (option.store === 'cookie') {
55
+ setCookie(option.data_key, JSON.stringify(state));
51
56
  }
52
57
  }
53
- }
54
- else if (option.store === 'cookie') {
55
- const cookieData = getCookie(data_key);
56
- let data = {};
57
- if (cookieData) {
58
- data = JSON.parse(cookieData);
59
- }
60
- for (let key in initial) {
61
- try {
62
- state[key] = initial[key].parse(data[key]);
58
+ };
59
+ const validate = () => {
60
+ try {
61
+ for (let k in initial) {
62
+ initial[k].parse(state[k]);
63
63
  }
64
- catch (error) {
65
- state[key] = data[key];
64
+ }
65
+ catch (error) {
66
+ return false;
67
+ }
68
+ return true;
69
+ };
70
+ const isValid = (key) => {
71
+ try {
72
+ initial[key].parse(state[key]);
73
+ }
74
+ catch (error) {
75
+ return false;
76
+ }
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];
66
84
  }
67
85
  }
68
- }
69
- else {
70
- for (let key in initial) {
86
+ return changedData;
87
+ };
88
+ const isChanged = (k) => !!changes[k];
89
+ const errors = () => {
90
+ const errors = {};
91
+ for (let k in initial) {
71
92
  try {
72
- state[key] = initial[key].parse(undefined);
93
+ initial[k].parse(state[k]);
73
94
  }
74
95
  catch (error) {
96
+ errors[k] = error.message;
75
97
  }
76
98
  }
77
- }
78
- }
79
- const useBucket = () => {
80
- const id = "rsb_" + useId();
81
- const [, setState] = useState(0);
82
- useEffect(() => {
83
- hooks.set(id, () => setState(Math.random()));
84
- return () => {
85
- hooks.delete(id);
86
- };
87
- }, [id]);
88
- return new Proxy(state, {
89
- get: (target, prop) => target[prop],
90
- set: (target, prop, value) => {
91
- if (!(prop in initial)) {
92
- throw new Error(`Property ${String(prop)} is not defined in the bucket.`);
93
- }
94
- target[prop] = value;
95
- hooks.forEach((hook) => hook());
96
- if (typeof window !== 'undefined') {
97
- value = JSON.stringify(value);
98
- if (option.store === 'session' || option.store === 'local') {
99
- let storage = option.store === "session" ? sessionStorage : localStorage;
100
- storage.setItem(data_key, JSON.stringify(state));
101
- }
102
- else if (option.store === 'url') {
103
- let url = new URL(window.location.href);
104
- url.searchParams.set(data_key, encodeURIComponent(JSON.stringify(state)));
105
- window.history.replaceState({}, '', url.toString());
106
- }
107
- else if (option.store === 'cookie') {
108
- setCookie(data_key, JSON.stringify(state));
109
- }
110
- }
111
- return true;
112
- }
113
- });
114
- };
115
- useBucket.validate = () => {
116
- try {
117
- for (let k in initial) {
118
- initial[k].parse(state[k]);
119
- }
120
- }
121
- catch (error) {
122
- return false;
123
- }
124
- return true;
125
- };
126
- useBucket.errors = () => {
127
- const errors = {};
128
- for (let k in initial) {
99
+ return errors;
100
+ };
101
+ const getError = (key) => {
129
102
  try {
130
- initial[k].parse(state[k]);
103
+ initial[key].parse(state[key]);
131
104
  }
132
105
  catch (error) {
133
- errors[k] = error.message;
106
+ return error.message;
134
107
  }
135
- }
136
- return errors;
108
+ return null;
109
+ };
110
+ return { state, get, set, validate, isValid, getChanges, isChanged, errors, getError };
137
111
  };
138
112
  return useBucket;
139
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\";\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\nexport const createBucket = <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {\n const hooks = new Map<string, Function>()\n const state: Record<keyof T, T[keyof T]> = {} as any\n\n let data_key = option?.data_key || ''\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 data_key = youid(data_key)\n }\n\n option = {\n store: \"memory\",\n ...option,\n data_key,\n }\n // set state prototype for validation\n\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(undefined)\n } catch (error) { }\n }\n\n if (typeof window !== 'undefined') {\n if (option.store === 'session' || option.store === 'local') {\n let storage = option.store === \"session\" ? sessionStorage : localStorage\n const value = storage.getItem(data_key)\n let data: any = {}\n if (value) {\n data = JSON.parse(value)\n }\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n const value = url.searchParams.get(data_key)\n let data: any = {}\n if (value) {\n data = JSON.parse(decodeURIComponent(value))\n }\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n } else if (option.store === 'cookie') {\n const cookieData = getCookie(data_key)\n let data: any = {}\n if (cookieData) {\n data = JSON.parse(cookieData)\n }\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(data[key])\n } catch (error) {\n state[key] = data[key]\n }\n }\n } else {\n for (let key in initial) {\n try {\n state[key] = initial[key].parse(undefined)\n } catch (error) {\n }\n }\n }\n }\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 }, [id])\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 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(data_key, JSON.stringify(state))\n } else if (option.store === 'url') {\n let url = new URL(window.location.href)\n url.searchParams.set(data_key, encodeURIComponent(JSON.stringify(state)))\n window.history.replaceState({}, '', url.toString())\n } else if (option.store === 'cookie') {\n setCookie(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.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 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, Infer<T[keyof T]>> = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, Infer<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 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.9",
2
+ "version": "1.2.11",
3
3
  "name": "react-state-bucket",
4
4
  "author": "Naxrul Ahmed",
5
5
  "license": "MIT",