react-state-bucket 1.2.17 → 1.2.18
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/Cookie.cjs +1 -0
- package/Cookie.cjs.map +1 -1
- package/Cookie.js +1 -0
- package/Cookie.js.map +1 -1
- package/Initial.cjs.map +1 -1
- package/Initial.js.map +1 -1
- package/index.cjs +160 -131
- package/index.cjs.map +1 -1
- package/index.d.ts +26 -26
- package/index.js +160 -131
- package/index.js.map +1 -1
- package/package.json +3 -2
- package/readme.md +252 -252
package/Cookie.cjs
CHANGED
package/Cookie.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cookie.cjs","sources":["../src/Cookie.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"Cookie.cjs","sources":["../src/Cookie.ts"],"sourcesContent":["\"use client\"\r\nexport function setCookie(\r\n key: string,\r\n value: string,\r\n days = 7\r\n) {\r\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\r\n document.cookie =\r\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}; ` +\r\n `expires=${expires}; path=/; SameSite=Lax`;\r\n}\r\n\r\nexport function getCookie(key: string): string | null {\r\n const name = encodeURIComponent(key) + \"=\";\r\n const parts = document.cookie.split(\"; \");\r\n\r\n for (const part of parts) {\r\n if (part.startsWith(name)) {\r\n return decodeURIComponent(part.slice(name.length));\r\n }\r\n }\r\n\r\n return null;\r\n}"],"names":[],"mappings":";;;AACM;AAKH;AACA;;;AAGH;AAEM;;;AAIH;AACG;;;;AAKH;AACH;;;"}
|
package/Cookie.js
CHANGED
package/Cookie.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cookie.js","sources":["../src/Cookie.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"Cookie.js","sources":["../src/Cookie.ts"],"sourcesContent":["\"use client\"\r\nexport function setCookie(\r\n key: string,\r\n value: string,\r\n days = 7\r\n) {\r\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\r\n document.cookie =\r\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}; ` +\r\n `expires=${expires}; path=/; SameSite=Lax`;\r\n}\r\n\r\nexport function getCookie(key: string): string | null {\r\n const name = encodeURIComponent(key) + \"=\";\r\n const parts = document.cookie.split(\"; \");\r\n\r\n for (const part of parts) {\r\n if (part.startsWith(name)) {\r\n return decodeURIComponent(part.slice(name.length));\r\n }\r\n }\r\n\r\n return null;\r\n}"],"names":[],"mappings":";AACM;AAKH;AACA;;;AAGH;AAEM;;;AAIH;AACG;;;;AAKH;AACH;;"}
|
package/Initial.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Initial.cjs","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":";;;;AAGA,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;;;;"}
|
|
1
|
+
{"version":3,"file":"Initial.cjs","sources":["../src/Initial.ts"],"sourcesContent":["import { BucketOptions, InitialBucketData } from \".\";\r\nimport { getCookie } from \"./Cookie\";\r\n\r\nconst Initial = (initial: InitialBucketData, data_key: string, option: BucketOptions) => {\r\n let state = {} as Record<string, any>;\r\n let data: any = \"\"\r\n\r\n if (typeof window !== 'undefined') {\r\n if (option.store === 'session' || option.store === 'local') {\r\n let storage = option.store === \"session\" ? sessionStorage : localStorage\r\n data = storage.getItem(data_key)\r\n } else if (option.store === 'url') {\r\n let url = new URL(window.location.href)\r\n data = decodeURIComponent(url.searchParams.get(data_key) || \"\")\r\n } else if (option.store === 'cookie') {\r\n data = getCookie(data_key)\r\n }\r\n }\r\n\r\n if (data) {\r\n try {\r\n data = JSON.parse(data)\r\n } catch (error) {\r\n data = {}\r\n }\r\n } else {\r\n data = {}\r\n }\r\n\r\n for (let key in initial) {\r\n try {\r\n state[key] = initial[key].parse(data[key])\r\n } catch (error) {\r\n state[key] = data[key]\r\n }\r\n }\r\n\r\n return state;\r\n}\r\n\r\nexport default Initial;"],"names":["getCookie"],"mappings":";;;;AAGA,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.js.map
CHANGED
|
@@ -1 +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":[],"mappings":";;AAGA,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;;;;"}
|
|
1
|
+
{"version":3,"file":"Initial.js","sources":["../src/Initial.ts"],"sourcesContent":["import { BucketOptions, InitialBucketData } from \".\";\r\nimport { getCookie } from \"./Cookie\";\r\n\r\nconst Initial = (initial: InitialBucketData, data_key: string, option: BucketOptions) => {\r\n let state = {} as Record<string, any>;\r\n let data: any = \"\"\r\n\r\n if (typeof window !== 'undefined') {\r\n if (option.store === 'session' || option.store === 'local') {\r\n let storage = option.store === \"session\" ? sessionStorage : localStorage\r\n data = storage.getItem(data_key)\r\n } else if (option.store === 'url') {\r\n let url = new URL(window.location.href)\r\n data = decodeURIComponent(url.searchParams.get(data_key) || \"\")\r\n } else if (option.store === 'cookie') {\r\n data = getCookie(data_key)\r\n }\r\n }\r\n\r\n if (data) {\r\n try {\r\n data = JSON.parse(data)\r\n } catch (error) {\r\n data = {}\r\n }\r\n } else {\r\n data = {}\r\n }\r\n\r\n for (let key in initial) {\r\n try {\r\n state[key] = initial[key].parse(data[key])\r\n } catch (error) {\r\n state[key] = data[key]\r\n }\r\n }\r\n\r\n return state;\r\n}\r\n\r\nexport default Initial;"],"names":[],"mappings":";;AAGA,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.cjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
'use strict';
|
|
2
3
|
|
|
3
4
|
var react = require('react');
|
|
@@ -20,147 +21,175 @@ const createBucket = (initial, option) => {
|
|
|
20
21
|
const state = Initial(initial, (option === null || option === void 0 ? void 0 : option.data_key) || '', option || {});
|
|
21
22
|
const changes = {};
|
|
22
23
|
const errors = {};
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
const sets = (data, dispatch = true) => {
|
|
71
|
-
for (let k in data) {
|
|
72
|
-
let v = data[k];
|
|
73
|
-
set(k, v, false);
|
|
24
|
+
const useHook = () => {
|
|
25
|
+
try {
|
|
26
|
+
const id = "rsb_" + react.useId();
|
|
27
|
+
const [, setState] = react.useState(0);
|
|
28
|
+
react.useEffect(() => {
|
|
29
|
+
hooks.set(id, () => setState(Math.random()));
|
|
30
|
+
return () => {
|
|
31
|
+
hooks.delete(id);
|
|
32
|
+
};
|
|
33
|
+
}, []);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const get = (key, defaultValue, dispatch = true) => {
|
|
39
|
+
if (!(key in initial)) {
|
|
40
|
+
throw new Error(`Property ${String(key)} is not defined in the bucket.`);
|
|
41
|
+
}
|
|
42
|
+
if (dispatch) {
|
|
43
|
+
useHook();
|
|
44
|
+
}
|
|
45
|
+
let value = state[key];
|
|
46
|
+
if (value === undefined && defaultValue !== undefined) {
|
|
47
|
+
value = defaultValue;
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
};
|
|
51
|
+
const set = (key, value, dispatch = true) => {
|
|
52
|
+
if (!(key in initial)) {
|
|
53
|
+
throw new Error(`Property ${String(key)} is not defined in the bucket.`);
|
|
54
|
+
}
|
|
55
|
+
state[key] = value;
|
|
56
|
+
if (dispatch) {
|
|
57
|
+
hooks.forEach((hook) => hook());
|
|
58
|
+
}
|
|
59
|
+
changes[key] = true;
|
|
60
|
+
if ((option === null || option === void 0 ? void 0 : option.onChange) && changes[key]) {
|
|
61
|
+
option.onChange(key, value);
|
|
62
|
+
}
|
|
63
|
+
if (typeof window !== 'undefined') {
|
|
64
|
+
value = JSON.stringify(value);
|
|
65
|
+
if (option.store === 'session' || option.store === 'local') {
|
|
66
|
+
let storage = option.store === "session" ? sessionStorage : localStorage;
|
|
67
|
+
storage.setItem(option.data_key, JSON.stringify(state));
|
|
74
68
|
}
|
|
75
|
-
if (
|
|
76
|
-
|
|
69
|
+
else if (option.store === 'url') {
|
|
70
|
+
let url = new URL(window.location.href);
|
|
71
|
+
url.searchParams.set(option.data_key, encodeURIComponent(JSON.stringify(state)));
|
|
72
|
+
window.history.replaceState({}, '', url.toString());
|
|
77
73
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
set(key, undefined);
|
|
81
|
-
};
|
|
82
|
-
const clear = () => {
|
|
83
|
-
const initVal = Initial(initial, (option === null || option === void 0 ? void 0 : option.data_key) || '', option || {});
|
|
84
|
-
for (let key in initial) {
|
|
85
|
-
state[key] = initVal[key];
|
|
86
|
-
delete changes[key];
|
|
74
|
+
else if (option.store === 'cookie') {
|
|
75
|
+
Cookie.setCookie(option.data_key, JSON.stringify(state));
|
|
87
76
|
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const sets = (data, dispatch = true) => {
|
|
80
|
+
for (let k in data) {
|
|
81
|
+
let v = data[k];
|
|
82
|
+
set(k, v, false);
|
|
83
|
+
}
|
|
84
|
+
if (dispatch) {
|
|
88
85
|
hooks.forEach((hook) => hook());
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const _delete = (key) => {
|
|
89
|
+
set(key, undefined);
|
|
90
|
+
};
|
|
91
|
+
const clear = () => {
|
|
92
|
+
const initVal = Initial(initial, (option === null || option === void 0 ? void 0 : option.data_key) || '', option || {});
|
|
93
|
+
for (let key in initial) {
|
|
94
|
+
state[key] = initVal[key];
|
|
95
|
+
delete changes[key];
|
|
96
|
+
}
|
|
97
|
+
hooks.forEach((hook) => hook());
|
|
98
|
+
};
|
|
99
|
+
const getChanges = (dispatch = true) => {
|
|
100
|
+
if (dispatch) {
|
|
101
|
+
useHook();
|
|
102
|
+
}
|
|
103
|
+
const changedData = {};
|
|
104
|
+
for (let k in changes) {
|
|
105
|
+
if (changes[k]) {
|
|
106
|
+
changedData[k] = state[k];
|
|
96
107
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
108
|
+
}
|
|
109
|
+
return changedData;
|
|
110
|
+
};
|
|
111
|
+
const isChanged = (k, dispatch = true) => {
|
|
112
|
+
if (dispatch) {
|
|
113
|
+
useHook();
|
|
114
|
+
}
|
|
115
|
+
return !!changes[k];
|
|
116
|
+
};
|
|
117
|
+
const isValid = (key, dispatch = true) => {
|
|
118
|
+
if (dispatch) {
|
|
119
|
+
useHook();
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
initial[key].parse(state[key]);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
errors[key] = error.message;
|
|
126
|
+
}
|
|
127
|
+
hooks.forEach((hook) => hook());
|
|
128
|
+
return !(key in errors);
|
|
129
|
+
};
|
|
130
|
+
const validate = () => {
|
|
131
|
+
for (let k in initial) {
|
|
101
132
|
try {
|
|
102
|
-
initial[
|
|
133
|
+
initial[k].parse(state[k]);
|
|
103
134
|
}
|
|
104
135
|
catch (error) {
|
|
105
|
-
errors[
|
|
106
|
-
}
|
|
107
|
-
hooks.forEach((hook) => hook());
|
|
108
|
-
return !(key in errors);
|
|
109
|
-
};
|
|
110
|
-
const validate = () => {
|
|
111
|
-
for (let k in initial) {
|
|
112
|
-
try {
|
|
113
|
-
initial[k].parse(state[k]);
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
errors[k] = error.message;
|
|
117
|
-
}
|
|
136
|
+
errors[k] = error.message;
|
|
118
137
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
+
}
|
|
139
|
+
hooks.forEach((hook) => hook());
|
|
140
|
+
return Object.keys(errors).length === 0;
|
|
141
|
+
};
|
|
142
|
+
const getError = (key, dispatch = true) => {
|
|
143
|
+
if (dispatch) {
|
|
144
|
+
useHook();
|
|
145
|
+
}
|
|
146
|
+
if (key in errors) {
|
|
147
|
+
return errors[key];
|
|
148
|
+
}
|
|
149
|
+
return '';
|
|
150
|
+
};
|
|
151
|
+
const getErrors = (dispatch = true) => {
|
|
152
|
+
if (dispatch) {
|
|
153
|
+
useHook();
|
|
154
|
+
}
|
|
155
|
+
return errors;
|
|
156
|
+
};
|
|
157
|
+
const setError = (key, message) => {
|
|
158
|
+
errors[key] = message;
|
|
159
|
+
hooks.forEach((hook) => hook());
|
|
160
|
+
};
|
|
161
|
+
const clearErrors = () => {
|
|
162
|
+
for (let k in errors) {
|
|
163
|
+
delete errors[k];
|
|
164
|
+
}
|
|
165
|
+
hooks.forEach((hook) => hook());
|
|
166
|
+
};
|
|
167
|
+
const clearError = (key) => {
|
|
168
|
+
delete errors[key];
|
|
169
|
+
hooks.forEach((hook) => hook());
|
|
170
|
+
};
|
|
171
|
+
return {
|
|
172
|
+
state: (dispatch = true) => {
|
|
173
|
+
if (dispatch) {
|
|
174
|
+
useHook();
|
|
138
175
|
}
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
getErrors,
|
|
157
|
-
getError,
|
|
158
|
-
setError,
|
|
159
|
-
clearErrors,
|
|
160
|
-
clearError
|
|
161
|
-
};
|
|
162
|
-
};
|
|
163
|
-
return useBucket;
|
|
176
|
+
return state;
|
|
177
|
+
},
|
|
178
|
+
get,
|
|
179
|
+
set,
|
|
180
|
+
sets,
|
|
181
|
+
delete: _delete,
|
|
182
|
+
clear,
|
|
183
|
+
validate,
|
|
184
|
+
isValid,
|
|
185
|
+
getChanges,
|
|
186
|
+
isChanged,
|
|
187
|
+
getErrors,
|
|
188
|
+
getError,
|
|
189
|
+
setError,
|
|
190
|
+
clearErrors,
|
|
191
|
+
clearError
|
|
192
|
+
};
|
|
164
193
|
};
|
|
165
194
|
const xv = xanv.xv;
|
|
166
195
|
|
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","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 const errors: Record<keyof T, string> = {} 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, dispatch = true) => {\n if (!(key in initial)) {\n throw new Error(`Property ${String(key)} is not defined in the bucket.`)\n }\n state[key] = value;\n if (dispatch) {\n hooks.forEach((hook) => hook());\n }\n changes[key] = true\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 sets = (data: Partial<Infer<T>>, dispatch = true) => {\n for (let k in data) {\n let v = data[k]\n set(k, v, false)\n }\n\n if (dispatch) {\n hooks.forEach((hook) => hook());\n }\n }\n\n const _delete = (key: keyof T) => {\n set(key, undefined)\n }\n\n const clear = () => {\n const initVal = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, any>;\n for (let key in initial) {\n state[key] = initVal[key];\n delete changes[key]\n }\n hooks.forEach((hook) => hook());\n }\n\n const getChanges = () => {\n const changedData: Partial<Record<keyof T, any>> = {}\n for (let k in changes) {\n if (changes[k]) {\n changedData[k] = state[k]\n }\n }\n return changedData\n }\n\n const isChanged = (k: keyof T) => !!changes[k]\n\n const isValid = (key: keyof T) => {\n try {\n initial[key].parse(state[key])\n } catch (error: any) {\n errors[key] = (error as any).message\n }\n hooks.forEach((hook) => hook());\n return !(key in errors)\n }\n\n const validate = () => {\n for (let k in initial) {\n try {\n initial[k].parse(state[k])\n } catch (error: any) {\n errors[k] = (error as any).message\n }\n }\n hooks.forEach((hook) => hook());\n return Object.keys(errors).length === 0\n }\n\n const getError = (key: keyof T) => {\n if (key in errors) {\n return errors[key]\n }\n return ''\n }\n\n const getErrors = () => {\n return errors\n }\n\n const setError = (key: keyof T, message: string) => {\n errors[key] = message\n hooks.forEach((hook) => hook());\n }\n\n const clearErrors = () => {\n for (let k in errors) {\n delete errors[k]\n }\n hooks.forEach((hook) => hook());\n }\n\n const clearError = (key: keyof T) => {\n delete errors[key]\n hooks.forEach((hook) => hook());\n }\n\n\n return {\n state,\n get,\n set,\n sets,\n delete: _delete,\n clear,\n validate,\n isValid,\n getChanges,\n isChanged,\n getErrors,\n getError,\n setError,\n clearErrors,\n clearError\n }\n }\n\n return useBucket\n}\n\nexport const xv = XV"],"names":["useId","useState","useEffect","setCookie","XV"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["\"use client\"\r\nimport { useEffect, useId, useState } from \"react\"\r\nimport { Infer, xv as XV, XVAny, XVArray, XVBoolean, XVDate, XVEnum, XVFile, XVFunction, XVMap, XVNumber, XVObject, XVPromise, XVRecord, XVSet, XVString, XVTuple, XVType, XVUnion } from \"xanv\"\r\nimport youid from \"youid\";\r\nimport { setCookie } from \"./Cookie\";\r\nimport Initial from \"./Initial\";\r\n\r\nexport type StoreType = \"memory\" | \"session\" | \"local\" | \"url\" | \"cookie\"\r\nexport type BucketOptions = {\r\n store?: StoreType;\r\n data_key?: string;\r\n onChange?: (key: string, value: any) => void\r\n}\r\n\r\nexport type InitialBucketData = {\r\n [key: string]: XVAny\r\n | XVArray<any>\r\n | XVBoolean\r\n | XVDate\r\n | XVEnum<any>\r\n | XVFile\r\n | XVFunction<any, any>\r\n | XVMap\r\n | XVNumber\r\n | XVObject<any>\r\n | XVPromise<any>\r\n | XVRecord<any, any>\r\n | XVSet\r\n | XVString\r\n | XVTuple\r\n | XVType<any>\r\n | XVUnion\r\n}\r\n\r\n\r\nexport const createBucket = <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {\r\n option = {\r\n store: \"memory\",\r\n ...option,\r\n }\r\n\r\n if (!option?.data_key) {\r\n let data_key = ''\r\n for (let key in initial) {\r\n const field = initial[key]\r\n data_key += key + ':' + JSON.stringify(field.meta) + ';'\r\n }\r\n option.data_key = youid(data_key)\r\n }\r\n\r\n const hooks = new Map<string, Function>()\r\n const state: Record<keyof T, any> = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, any>;\r\n const changes: Record<keyof T, boolean> = {} as any\r\n const errors: Record<keyof T, string> = {} as any\r\n\r\n const useHook = () => {\r\n try {\r\n const id = \"rsb_\" + useId()\r\n const [, setState] = useState(0)\r\n useEffect(() => {\r\n hooks.set(id, () => setState(Math.random()))\r\n return () => {\r\n hooks.delete(id)\r\n }\r\n }, [])\r\n } catch (error) {\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n const get = (key: keyof T, defaultValue?: any, dispatch = true) => {\r\n if (!(key in initial)) {\r\n throw new Error(`Property ${String(key)} is not defined in the bucket.`)\r\n }\r\n if (dispatch) {\r\n useHook()\r\n }\r\n let value = state[key];\r\n if (value === undefined && defaultValue !== undefined) {\r\n value = defaultValue\r\n }\r\n return value;\r\n }\r\n\r\n const set = (key: keyof T, value: any, dispatch = true) => {\r\n if (!(key in initial)) {\r\n throw new Error(`Property ${String(key)} is not defined in the bucket.`)\r\n }\r\n state[key] = value;\r\n if (dispatch) {\r\n hooks.forEach((hook) => hook());\r\n }\r\n changes[key] = true\r\n if (option?.onChange && changes[key]) {\r\n option.onChange(key as string, value)\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n value = JSON.stringify(value) as any\r\n if (option.store === 'session' || option.store === 'local') {\r\n let storage = option.store === \"session\" ? sessionStorage : localStorage\r\n storage.setItem(option.data_key!, JSON.stringify(state))\r\n } else if (option.store === 'url') {\r\n let url = new URL(window.location.href)\r\n url.searchParams.set(option.data_key!, encodeURIComponent(JSON.stringify(state)))\r\n window.history.replaceState({}, '', url.toString())\r\n } else if (option.store === 'cookie') {\r\n setCookie(option.data_key!, JSON.stringify(state))\r\n }\r\n }\r\n }\r\n\r\n const sets = (data: Partial<Infer<T>>, dispatch = true) => {\r\n for (let k in data) {\r\n let v = data[k]\r\n set(k, v, false)\r\n }\r\n\r\n if (dispatch) {\r\n hooks.forEach((hook) => hook());\r\n }\r\n }\r\n\r\n const _delete = (key: keyof T) => {\r\n set(key, undefined)\r\n }\r\n\r\n const clear = () => {\r\n const initVal = Initial(initial, option?.data_key || '', option || {}) as Record<keyof T, any>;\r\n for (let key in initial) {\r\n state[key] = initVal[key];\r\n delete changes[key]\r\n }\r\n hooks.forEach((hook) => hook());\r\n }\r\n\r\n const getChanges = (dispatch = true) => {\r\n if (dispatch) {\r\n useHook()\r\n }\r\n const changedData: Partial<Record<keyof T, any>> = {}\r\n for (let k in changes) {\r\n if (changes[k]) {\r\n changedData[k] = state[k]\r\n }\r\n }\r\n return changedData\r\n }\r\n\r\n const isChanged = (k: keyof T, dispatch = true) => {\r\n if (dispatch) {\r\n useHook()\r\n }\r\n return !!changes[k]\r\n }\r\n\r\n const isValid = (key: keyof T, dispatch = true) => {\r\n if (dispatch) {\r\n useHook()\r\n }\r\n try {\r\n initial[key].parse(state[key])\r\n } catch (error: any) {\r\n errors[key] = (error as any).message\r\n }\r\n hooks.forEach((hook) => hook());\r\n return !(key in errors)\r\n }\r\n\r\n const validate = () => {\r\n for (let k in initial) {\r\n try {\r\n initial[k].parse(state[k])\r\n } catch (error: any) {\r\n errors[k] = (error as any).message\r\n }\r\n }\r\n hooks.forEach((hook) => hook());\r\n return Object.keys(errors).length === 0\r\n }\r\n\r\n const getError = (key: keyof T, dispatch = true) => {\r\n if (dispatch) {\r\n useHook()\r\n }\r\n if (key in errors) {\r\n return errors[key]\r\n }\r\n return ''\r\n }\r\n\r\n const getErrors = (dispatch = true) => {\r\n if (dispatch) {\r\n useHook()\r\n }\r\n return errors\r\n }\r\n\r\n const setError = (key: keyof T, message: string) => {\r\n errors[key] = message\r\n hooks.forEach((hook) => hook());\r\n }\r\n\r\n const clearErrors = () => {\r\n for (let k in errors) {\r\n delete errors[k]\r\n }\r\n hooks.forEach((hook) => hook());\r\n }\r\n\r\n const clearError = (key: keyof T) => {\r\n delete errors[key]\r\n hooks.forEach((hook) => hook());\r\n }\r\n\r\n return {\r\n state: (dispatch = true) => {\r\n if (dispatch) {\r\n useHook()\r\n }\r\n return state\r\n },\r\n get,\r\n set,\r\n sets,\r\n delete: _delete,\r\n clear,\r\n validate,\r\n isValid,\r\n getChanges,\r\n isChanged,\r\n getErrors,\r\n getError,\r\n setError,\r\n clearErrors,\r\n clearError\r\n }\r\n\r\n}\r\n\r\nexport const xv = XV"],"names":[],"mappings":";;;;;;;;;;AAoCE;;;AAOE;AACE;AACA;;AAEF;;AAGF;;;;;AAME;AACE;;;AAGE;AACA;AACE;AACF;;;;;AAKN;;AAKE;;;;AAIE;;AAEF;;;;AAIA;AACF;;AAGE;;;AAGA;;;;AAIA;AACA;AACE;;AAGF;AACE;AACA;AACE;AACA;;AACK;;AAEL;AACA;;AACK;AACL;;;AAGN;;AAGE;AACE;AACA;;;;;AAMJ;AAEA;AACE;AACF;;;AAIE;;AAEE;;;AAGJ;AAEA;;AAEI;;;AAGF;AACE;;;;AAIF;AACF;;;AAII;;AAEF;AACF;;;AAII;;AAEF;;;;AAGE;;;AAGF;AACF;;AAGE;AACE;;;;AAGE;;;;;AAKN;;;AAII;;AAEF;AACE;;AAEF;AACF;AAEA;;AAEI;;AAEF;AACF;AAEA;AACE;;AAEF;;AAGE;AACE;;;AAGJ;AAEA;AACE;;AAEF;;AAGE;;AAEI;;AAEF;;;;;AAKF;;;;;;;;;;;;AAaJ;AAEO;;;"}
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { XVInstanceType, Infer } from 'xanv';
|
|
1
|
+
import { XVAny, XVArray, XVBoolean, XVDate, XVEnum, XVFile, XVFunction, XVMap, XVNumber, XVObject, XVPromise, XVRecord, XVSet, XVString, XVTuple, XVType, XVUnion, Infer } from 'xanv';
|
|
3
2
|
|
|
4
3
|
type StoreType = "memory" | "session" | "local" | "url" | "cookie";
|
|
5
4
|
type BucketOptions = {
|
|
@@ -8,41 +7,42 @@ type BucketOptions = {
|
|
|
8
7
|
onChange?: (key: string, value: any) => void;
|
|
9
8
|
};
|
|
10
9
|
type InitialBucketData = {
|
|
11
|
-
[key: string]:
|
|
10
|
+
[key: string]: XVAny | XVArray<any> | XVBoolean | XVDate | XVEnum<any> | XVFile | XVFunction<any, any> | XVMap | XVNumber | XVObject<any> | XVPromise<any> | XVRecord<any, any> | XVSet | XVString | XVTuple | XVType<any> | XVUnion;
|
|
12
11
|
};
|
|
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];
|
|
12
|
+
declare const createBucket: <T extends InitialBucketData>(initial: T, option?: BucketOptions) => {
|
|
13
|
+
state: (dispatch?: boolean) => Record<keyof T, any>;
|
|
14
|
+
get: (key: keyof T, defaultValue?: any, dispatch?: boolean) => Record<keyof T, any>[keyof T];
|
|
16
15
|
set: (key: keyof T, value: any, dispatch?: boolean) => void;
|
|
17
16
|
sets: (data: Partial<Infer<T>>, dispatch?: boolean) => void;
|
|
18
17
|
delete: (key: keyof T) => void;
|
|
19
18
|
clear: () => void;
|
|
20
19
|
validate: () => boolean;
|
|
21
|
-
isValid: (key: keyof T) => boolean;
|
|
22
|
-
getChanges: () => Partial<Record<keyof T, any>>;
|
|
23
|
-
isChanged: (k: keyof T) => boolean;
|
|
24
|
-
getErrors: () => Record<keyof T, string>;
|
|
25
|
-
getError: (key: keyof T) => Record<keyof T, string>[keyof T] | "";
|
|
20
|
+
isValid: (key: keyof T, dispatch?: boolean) => boolean;
|
|
21
|
+
getChanges: (dispatch?: boolean) => Partial<Record<keyof T, any>>;
|
|
22
|
+
isChanged: (k: keyof T, dispatch?: boolean) => boolean;
|
|
23
|
+
getErrors: (dispatch?: boolean) => Record<keyof T, string>;
|
|
24
|
+
getError: (key: keyof T, dispatch?: boolean) => Record<keyof T, string>[keyof T] | "";
|
|
26
25
|
setError: (key: keyof T, message: string) => void;
|
|
27
26
|
clearErrors: () => void;
|
|
28
27
|
clearError: (key: keyof T) => void;
|
|
29
28
|
};
|
|
30
29
|
declare const xv: {
|
|
31
|
-
any: () =>
|
|
32
|
-
array: (type:
|
|
33
|
-
boolean: () =>
|
|
34
|
-
date: () =>
|
|
35
|
-
enum: (
|
|
36
|
-
file: () =>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
set: (type:
|
|
42
|
-
string: (length?: number) =>
|
|
43
|
-
tuple: (type:
|
|
44
|
-
union: (
|
|
45
|
-
|
|
30
|
+
any: () => XVAny<any>;
|
|
31
|
+
array: <T extends XVType<any>>(type: T) => XVArray<T>;
|
|
32
|
+
boolean: () => XVBoolean;
|
|
33
|
+
date: () => XVDate;
|
|
34
|
+
enum: <const T extends string | number>(input: readonly T[] | Record<string, T>) => XVEnum<T>;
|
|
35
|
+
file: () => XVFile;
|
|
36
|
+
number: (length?: number) => XVNumber<number>;
|
|
37
|
+
object: <T extends Record<string, XVType<any>>>(shape: T) => XVObject<T>;
|
|
38
|
+
record: <K extends XVType<any>, V extends XVType<any>>(key: K, value: V) => XVRecord<K, V>;
|
|
39
|
+
map: <K extends XVType<any>, V extends XVType<any>>(key: K, value: V) => XVMap<K, V>;
|
|
40
|
+
set: <T extends XVType<any>>(type: T) => XVSet<T>;
|
|
41
|
+
string: (length?: number) => XVString;
|
|
42
|
+
tuple: <T extends XVType<any>[]>(type: T) => XVTuple<T>;
|
|
43
|
+
union: <T extends XVType<any>[]>(types: T) => XVUnion<T>;
|
|
44
|
+
function: <const A extends XVType<any>[], R extends XVType<any>>(args: A, ret: R) => XVFunction<A, R>;
|
|
45
|
+
promise: <T extends XVType<any>>(type: T) => XVPromise<T>;
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
export { createBucket, xv };
|