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 +37 -0
- package/Initial.js.map +1 -0
- package/Initial.mjs +37 -0
- package/Initial.mjs.map +1 -0
- package/index.d.ts +11 -5
- package/index.js +85 -111
- package/index.js.map +1 -1
- package/index.mjs +85 -111
- package/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
package/Initial.mjs.map
ADDED
|
@@ -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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
65
|
-
|
|
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
|
-
|
|
70
|
-
|
|
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
|
-
|
|
93
|
+
initial[k].parse(state[k]);
|
|
73
94
|
}
|
|
74
95
|
catch (error) {
|
|
96
|
+
errors[k] = error.message;
|
|
75
97
|
}
|
|
76
98
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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[
|
|
103
|
+
initial[key].parse(state[key]);
|
|
131
104
|
}
|
|
132
105
|
catch (error) {
|
|
133
|
-
|
|
106
|
+
return error.message;
|
|
134
107
|
}
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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 {
|
|
2
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
65
|
-
|
|
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
|
-
|
|
70
|
-
|
|
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
|
-
|
|
93
|
+
initial[k].parse(state[k]);
|
|
73
94
|
}
|
|
74
95
|
catch (error) {
|
|
96
|
+
errors[k] = error.message;
|
|
75
97
|
}
|
|
76
98
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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[
|
|
103
|
+
initial[key].parse(state[key]);
|
|
131
104
|
}
|
|
132
105
|
catch (error) {
|
|
133
|
-
|
|
106
|
+
return error.message;
|
|
134
107
|
}
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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