valyrian.js 8.0.13 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/native-store/index.d.ts +1 -1
- package/dist/lib/native-store/index.d.ts.map +1 -1
- package/dist/lib/node/index.d.ts +2 -2
- package/dist/lib/node/index.d.ts.map +1 -1
- package/dist/lib/node/utils/server-storage.d.ts +12 -0
- package/dist/lib/node/utils/server-storage.d.ts.map +1 -0
- package/dist/lib/node/utils/tree-adapter.d.ts.map +1 -1
- package/dist/lib/pulses/index.d.ts +4 -0
- package/dist/lib/pulses/index.d.ts.map +1 -1
- package/dist/lib/redux-devtools/index.d.ts +15 -0
- package/dist/lib/redux-devtools/index.d.ts.map +1 -0
- package/dist/lib/request/index.d.ts.map +1 -1
- package/dist/lib/translate/index.d.ts +6 -2
- package/dist/lib/translate/index.d.ts.map +1 -1
- package/dist/native-store/index.js +26 -13
- package/dist/native-store/index.js.map +3 -3
- package/dist/native-store/index.min.js +1 -1
- package/dist/native-store/index.min.js.map +1 -1
- package/dist/native-store/index.mjs +26 -13
- package/dist/native-store/index.mjs.map +3 -3
- package/dist/node/index.js +57 -94
- package/dist/node/index.js.map +4 -4
- package/dist/node/index.mjs +57 -94
- package/dist/node/index.mjs.map +4 -4
- package/dist/pulses/index.js +32 -1
- package/dist/pulses/index.js.map +2 -2
- package/dist/pulses/index.min.js +1 -1
- package/dist/pulses/index.min.js.map +1 -1
- package/dist/pulses/index.mjs +32 -1
- package/dist/pulses/index.mjs.map +2 -2
- package/dist/redux-devtools/index.js +81 -0
- package/dist/redux-devtools/index.js.map +7 -0
- package/dist/redux-devtools/index.min.js +1 -0
- package/dist/redux-devtools/index.min.js.map +1 -0
- package/dist/redux-devtools/index.mjs +60 -0
- package/dist/redux-devtools/index.mjs.map +7 -0
- package/dist/request/index.js +20 -7
- package/dist/request/index.js.map +2 -2
- package/dist/request/index.min.js +1 -1
- package/dist/request/index.min.js.map +1 -1
- package/dist/request/index.mjs +20 -7
- package/dist/request/index.mjs.map +2 -2
- package/dist/translate/index.js +36 -26
- package/dist/translate/index.js.map +3 -3
- package/dist/translate/index.min.js +1 -1
- package/dist/translate/index.min.js.map +1 -1
- package/dist/translate/index.mjs +36 -26
- package/dist/translate/index.mjs.map +3 -3
- package/lib/native-store/index.ts +22 -8
- package/lib/node/index.ts +4 -4
- package/lib/node/utils/server-storage.ts +71 -0
- package/lib/node/utils/tree-adapter.ts +25 -1
- package/lib/pulses/index.ts +54 -6
- package/lib/redux-devtools/index.ts +86 -0
- package/lib/request/index.ts +28 -8
- package/lib/translate/index.ts +37 -26
- package/package.json +14 -14
- package/dist/lib/node/utils/session-storage.d.ts +0 -22
- package/dist/lib/node/utils/session-storage.d.ts.map +0 -1
- package/lib/node/utils/session-storage.ts +0 -120
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/request/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\nimport { get, set } from \"valyrian.js/utils\";\n\ninterface UrlOptions {\n base?: string; // Used to prefix the url for scoped requests.\n node?: string | null; // Used to redirect local requests to node server for server side rendering.\n api?: string | null; // Used to redirect api requests to node server for server side rendering.\n}\n\ninterface RequestOptions {\n allowedMethods?: string[];\n urls?: UrlOptions;\n [key: string | number | symbol]: any;\n}\n\ninterface RequestOptionsWithUrls extends RequestOptions {\n urls: UrlOptions;\n allowedMethods: string[];\n}\n\ninterface SendOptions extends RequestOptionsWithUrls, RequestInit {\n allowedMethods: string[];\n method: string;\n headers: Record<string, string>;\n resolveWithFullResponse?: boolean;\n}\n\nexport interface RequestInterface {\n // eslint-disable-next-line no-unused-vars\n (method: string, url: string, data?: Record<string, any> | null, options?: Partial<SendOptions>): any | Response;\n // eslint-disable-next-line no-unused-vars\n new: (baseUrl: string, options?: RequestOptions) => RequestInterface;\n // eslint-disable-next-line no-unused-vars\n setOptions: (key: string, value: any) => void;\n // eslint-disable-next-line no-unused-vars\n getOptions: (key?: string) => RequestOptions | void;\n // eslint-disable-next-line no-unused-vars\n get: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n post: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n put: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n patch: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n delete: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n head: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n options: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n [key: string | number | symbol]: any;\n}\n\n// This method is used to serialize an object into a query string.\nfunction serialize(obj: Record<string, any>, prefix: string = \"\"): URLSearchParams {\n const params = new URLSearchParams();\n\n Object.keys(obj).forEach((prop: string) => {\n const key = prefix ? `${prefix}[${prop}]` : prop;\n if (typeof obj[prop] === \"object\") {\n params.append(key, serialize(obj[prop], key).toString());\n } else {\n params.append(key, obj[prop]);\n }\n });\n\n return params;\n}\n\nfunction serializeFormData(data: Record<string, any>): FormData {\n
|
|
5
|
-
"mappings": ";AAAA,SAAS,gBAAgB;AACzB,SAAS,KAAK,WAAW;AAqDzB,SAAS,UAAU,KAA0B,SAAiB,IAAqB;AACjF,QAAM,SAAS,IAAI,gBAAgB;AAEnC,SAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,SAAiB;AACzC,UAAM,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM;AAC5C,QAAI,OAAO,IAAI,IAAI,MAAM,UAAU;AACjC,aAAO,OAAO,KAAK,UAAU,IAAI,IAAI,GAAG,GAAG,EAAE,SAAS,CAAC;AAAA,IACzD,OAAO;AACL,aAAO,OAAO,KAAK,IAAI,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAqC;AAC9D,SAAO,
|
|
4
|
+
"sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\nimport { get, set } from \"valyrian.js/utils\";\n\ninterface UrlOptions {\n base?: string; // Used to prefix the url for scoped requests.\n node?: string | null; // Used to redirect local requests to node server for server side rendering.\n api?: string | null; // Used to redirect api requests to node server for server side rendering.\n}\n\ninterface RequestOptions {\n allowedMethods?: string[];\n urls?: UrlOptions;\n [key: string | number | symbol]: any;\n}\n\ninterface RequestOptionsWithUrls extends RequestOptions {\n urls: UrlOptions;\n allowedMethods: string[];\n}\n\ninterface SendOptions extends RequestOptionsWithUrls, RequestInit {\n allowedMethods: string[];\n method: string;\n headers: Record<string, string>;\n resolveWithFullResponse?: boolean;\n}\n\nexport interface RequestInterface {\n // eslint-disable-next-line no-unused-vars\n (method: string, url: string, data?: Record<string, any> | null, options?: Partial<SendOptions>): any | Response;\n // eslint-disable-next-line no-unused-vars\n new: (baseUrl: string, options?: RequestOptions) => RequestInterface;\n // eslint-disable-next-line no-unused-vars\n setOptions: (key: string, value: any) => void;\n // eslint-disable-next-line no-unused-vars\n getOptions: (key?: string) => RequestOptions | void;\n // eslint-disable-next-line no-unused-vars\n get: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n post: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n put: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n patch: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n delete: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n head: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n options: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n [key: string | number | symbol]: any;\n}\n\n// This method is used to serialize an object into a query string.\nfunction serialize(obj: Record<string, any>, prefix: string = \"\"): URLSearchParams {\n const params = new URLSearchParams();\n\n Object.keys(obj).forEach((prop: string) => {\n const key = prefix ? `${prefix}[${prop}]` : prop;\n if (typeof obj[prop] === \"object\") {\n params.append(key, serialize(obj[prop], key).toString());\n } else {\n params.append(key, obj[prop]);\n }\n });\n\n return params;\n}\n\nfunction serializeFormData(data: Record<string, any>): FormData {\n const fd = new FormData();\n Object.entries(data).forEach(([key, value]) => {\n if (value === null || value === undefined) return; // Ignorar nulos\n\n if (Array.isArray(value)) {\n value.forEach((v) => fd.append(key, v));\n } else {\n fd.append(key, value);\n }\n });\n return fd;\n}\n\nfunction parseUrl(url: string, options: RequestOptionsWithUrls) {\n const urlWithoutSlash = url.replace(/\\/+$/, \"\").trim();\n const u = /^https?/gi.test(urlWithoutSlash) ? urlWithoutSlash : `${options.urls.base}${urlWithoutSlash}`;\n\n if (isNodeJs && typeof options.urls.node === \"string\") {\n if (typeof options.urls.api === \"string\") {\n return new URL(u.replace(options.urls.api, options.urls.node));\n }\n\n if (!/^https?/gi.test(u)) {\n return new URL(u, options.urls.node);\n }\n }\n\n if (/^https?/gi.test(u)) {\n return new URL(u);\n }\n\n return new URL(u, options.urls.base);\n}\n\nconst defaultOptions: RequestOptions = { allowedMethods: [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"] };\n\nconst isNativeBody = (data: any) =>\n data instanceof FormData ||\n data instanceof URLSearchParams ||\n data instanceof Blob ||\n data instanceof ArrayBuffer ||\n (typeof DataView !== \"undefined\" && data instanceof DataView) ||\n (typeof ReadableStream !== \"undefined\" && data instanceof ReadableStream);\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction Requester(baseUrl = \"\", options: RequestOptions = defaultOptions) {\n const url = baseUrl.replace(/\\/$/gi, \"\").trim();\n if (!options.urls) {\n options.urls = {\n base: \"\",\n node: null,\n api: null\n };\n }\n\n if (!options.allowedMethods) {\n options.allowedMethods = defaultOptions.allowedMethods;\n }\n\n const opts: RequestOptionsWithUrls = {\n ...(options as RequestOptionsWithUrls),\n urls: {\n node: options.urls.node || null,\n api: options.urls.api || null,\n base: options.urls.base ? options.urls.base + url : url\n }\n };\n\n // eslint-disable-next-line complexity\n const request = async function request(\n method: string,\n url: string,\n data?: Record<string, any> | null,\n options: Record<string, any> = {}\n ) {\n const innerOptions: SendOptions = {\n method: method.toUpperCase(),\n headers: {},\n resolveWithFullResponse: false,\n ...opts,\n ...options\n } as SendOptions;\n\n innerOptions.headers = { ...innerOptions.headers, ...opts.headers, ...options.headers };\n\n if (!innerOptions.headers.Accept) {\n innerOptions.headers.Accept = \"application/json\";\n }\n\n const acceptType = innerOptions.headers.Accept;\n const contentType = innerOptions.headers[\"Content-Type\"] || innerOptions.headers[\"content-type\"] || \"\";\n\n if (!innerOptions.allowedMethods.includes(method)) {\n throw new Error(`Method ${method} not allowed. Allowed methods: ${innerOptions.allowedMethods.join(\", \")}`);\n }\n\n let finalUrl: URL;\n try {\n finalUrl = parseUrl(url, opts);\n } catch (error) {\n throw new Error(`Failed to parse URL: ${url}`);\n }\n\n if (data) {\n if (innerOptions.method === \"GET\" && typeof data === \"object\") {\n finalUrl.search = serialize(data).toString();\n } else if (isNativeBody(data) || typeof data === \"string\") {\n innerOptions.body = data as BodyInit;\n } else {\n const isJson = /json/gi.test(contentType);\n if (isJson) {\n innerOptions.body = JSON.stringify(data);\n } else {\n innerOptions.body = serializeFormData(data);\n }\n }\n }\n\n const response = await fetch(finalUrl.toString(), innerOptions);\n let body = null;\n if (!response.ok) {\n const err = new Error(`${response.status}: ${response.statusText}`) as Error & { response?: any; body?: any };\n err.response = response;\n if (/text/gi.test(acceptType)) {\n err.body = await response.text();\n }\n\n if (/json/gi.test(acceptType)) {\n try {\n err.body = await response.json();\n } catch (error) {\n err.body = null;\n // eslint-disable-next-line no-console\n console.warn(\"Failed to parse JSON response:\", error);\n }\n }\n\n throw err;\n }\n\n if (innerOptions.resolveWithFullResponse) {\n return response;\n }\n\n if (/text/gi.test(acceptType)) {\n body = await response.text();\n } else if (/json/gi.test(acceptType)) {\n try {\n body = await response.json();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to parse JSON response:\", error);\n body = null;\n }\n } else if (/blob/gi.test(acceptType)) {\n body = await response.blob();\n } else if (/arraybuffer/gi.test(acceptType)) {\n body = await response.arrayBuffer();\n } else {\n body = response;\n }\n\n return body || response;\n } as unknown as RequestInterface;\n\n request.new = (baseUrl: string, options?: RequestOptions) => Requester(baseUrl, { ...opts, ...(options || {}) });\n\n request.setOption = (key: string, value: any) => {\n set(opts, key, value);\n return opts;\n };\n\n request.getOptions = (key?: string) => {\n if (key) {\n return get(opts, key);\n }\n\n return opts;\n };\n\n Object.assign(\n request,\n opts.allowedMethods.reduce((acc: Record<string, any>, method) => {\n acc[method] = (url: string, data?: Record<string, any> | null, options?: Record<string, any>) =>\n request(method, url, data, options);\n return acc;\n }, {})\n );\n\n return request;\n}\n\nexport const request = Requester();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["request", "url", "options", "baseUrl"]
|
|
7
7
|
}
|
package/dist/translate/index.js
CHANGED
|
@@ -24,6 +24,7 @@ __export(index_exports, {
|
|
|
24
24
|
getLang: () => getLang,
|
|
25
25
|
getTranslations: () => getTranslations,
|
|
26
26
|
setLang: () => setLang,
|
|
27
|
+
setStoreStrategy: () => setStoreStrategy,
|
|
27
28
|
setTranslations: () => setTranslations,
|
|
28
29
|
t: () => t
|
|
29
30
|
});
|
|
@@ -31,9 +32,35 @@ module.exports = __toCommonJS(index_exports);
|
|
|
31
32
|
var import_valyrian = require("valyrian.js");
|
|
32
33
|
var import_utils = require("valyrian.js/utils");
|
|
33
34
|
var translations = {};
|
|
34
|
-
var
|
|
35
|
+
var currentLang = "en";
|
|
36
|
+
var storeStrategy = {
|
|
37
|
+
get: () => currentLang,
|
|
38
|
+
set: (lang) => {
|
|
39
|
+
currentLang = lang;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
function setStoreStrategy(strategy) {
|
|
43
|
+
storeStrategy = strategy;
|
|
44
|
+
}
|
|
45
|
+
function getLang() {
|
|
46
|
+
return storeStrategy.get();
|
|
47
|
+
}
|
|
48
|
+
function setLang(newLang) {
|
|
49
|
+
if (typeof newLang !== "string") {
|
|
50
|
+
throw new Error(`Language ${newLang} not found`);
|
|
51
|
+
}
|
|
52
|
+
const parsedLang = newLang.toLowerCase().split("-").shift()?.split("_").shift();
|
|
53
|
+
if (typeof parsedLang !== "string") {
|
|
54
|
+
throw new Error(`Language ${newLang} not found`);
|
|
55
|
+
}
|
|
56
|
+
if (!translations[parsedLang]) {
|
|
57
|
+
throw new Error(`Language ${newLang} not found`);
|
|
58
|
+
}
|
|
59
|
+
storeStrategy.set(parsedLang);
|
|
60
|
+
(0, import_valyrian.update)();
|
|
61
|
+
}
|
|
35
62
|
function t(path, params) {
|
|
36
|
-
const langDef = translations[
|
|
63
|
+
const langDef = translations[getLang()];
|
|
37
64
|
const translation = (0, import_utils.get)(langDef, path);
|
|
38
65
|
if (typeof translation !== "string") {
|
|
39
66
|
console.warn(`Translation not found for ${path}`);
|
|
@@ -50,14 +77,14 @@ function t(path, params) {
|
|
|
50
77
|
});
|
|
51
78
|
}
|
|
52
79
|
function setTranslations(defaultTranslation, newTranslations = {}) {
|
|
53
|
-
for (const
|
|
54
|
-
Reflect.deleteProperty(translations,
|
|
80
|
+
for (const lang in translations) {
|
|
81
|
+
Reflect.deleteProperty(translations, lang);
|
|
55
82
|
}
|
|
56
83
|
translations.en = { ...defaultTranslation };
|
|
57
|
-
for (const
|
|
58
|
-
translations[
|
|
84
|
+
for (const lang in newTranslations) {
|
|
85
|
+
translations[lang] = {
|
|
59
86
|
...defaultTranslation,
|
|
60
|
-
...newTranslations[
|
|
87
|
+
...newTranslations[lang]
|
|
61
88
|
};
|
|
62
89
|
}
|
|
63
90
|
(0, import_valyrian.update)();
|
|
@@ -65,23 +92,6 @@ function setTranslations(defaultTranslation, newTranslations = {}) {
|
|
|
65
92
|
function getTranslations() {
|
|
66
93
|
return translations;
|
|
67
94
|
}
|
|
68
|
-
function setLang(newLang) {
|
|
69
|
-
if (typeof newLang !== "string") {
|
|
70
|
-
throw new Error(`Language ${newLang} not found`);
|
|
71
|
-
}
|
|
72
|
-
const parsedLang = newLang.toLowerCase().split("-").shift()?.split("_").shift();
|
|
73
|
-
if (typeof parsedLang !== "string") {
|
|
74
|
-
throw new Error(`Language ${newLang} not found`);
|
|
75
|
-
}
|
|
76
|
-
if (!translations[parsedLang]) {
|
|
77
|
-
throw new Error(`Language ${newLang} not found`);
|
|
78
|
-
}
|
|
79
|
-
lang = parsedLang;
|
|
80
|
-
(0, import_valyrian.update)();
|
|
81
|
-
}
|
|
82
|
-
function getLang() {
|
|
83
|
-
return lang;
|
|
84
|
-
}
|
|
85
95
|
var NumberFormatter = class _NumberFormatter {
|
|
86
96
|
#value = 0;
|
|
87
97
|
get value() {
|
|
@@ -102,8 +112,8 @@ var NumberFormatter = class _NumberFormatter {
|
|
|
102
112
|
return isNaN(number) ? 0 : number;
|
|
103
113
|
}
|
|
104
114
|
format(digits = 2, options = {}, customLocale) {
|
|
105
|
-
const
|
|
106
|
-
const formatter = new Intl.NumberFormat(
|
|
115
|
+
const lang = customLocale || getLang();
|
|
116
|
+
const formatter = new Intl.NumberFormat(lang, {
|
|
107
117
|
style: "currency",
|
|
108
118
|
currency: "USD",
|
|
109
119
|
minimumFractionDigits: digits,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/translate/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { directive, setPropNameReserved, update, VnodeWithDom } from \"valyrian.js\";\nimport { get } from \"valyrian.js/utils\";\n\nconst translations: Record<string, Record<string, any>> = {};\nlet
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
6
|
-
"names": [
|
|
4
|
+
"sourcesContent": ["import { current, directive, setPropNameReserved, update, VnodeWithDom } from \"valyrian.js\";\nimport { get } from \"valyrian.js/utils\";\n\nconst translations: Record<string, Record<string, any>> = {};\nlet currentLang = \"en\";\n\nlet storeStrategy = {\n get: () => currentLang,\n set: (lang: string) => {\n currentLang = lang;\n }\n};\n\nexport function setStoreStrategy(strategy: { get: () => string; set: (lang: string) => void }) {\n storeStrategy = strategy;\n}\n\nexport function getLang(): string {\n return storeStrategy.get();\n}\n\nexport function setLang(newLang: string): void {\n if (typeof newLang !== \"string\") {\n throw new Error(`Language ${newLang} not found`);\n }\n\n const parsedLang = newLang.toLowerCase().split(\"-\").shift()?.split(\"_\").shift();\n\n if (typeof parsedLang !== \"string\") {\n throw new Error(`Language ${newLang} not found`);\n }\n\n if (!translations[parsedLang]) {\n throw new Error(`Language ${newLang} not found`);\n }\n\n storeStrategy.set(parsedLang);\n update();\n}\n\nexport function t(path: string, params?: Record<string, string>): string {\n const langDef = translations[getLang()];\n const translation = get(langDef, path);\n\n if (typeof translation !== \"string\") {\n // eslint-disable-next-line no-console\n console.warn(`Translation not found for ${path}`);\n return path;\n }\n\n if (!params) {\n return translation;\n }\n\n return translation.replace(/{(\\w+)}/g, (_, key) => {\n if (key in params) {\n return params[key];\n }\n return `{${key}}`;\n });\n}\n\nexport function setTranslations(\n defaultTranslation: Record<string, any>,\n newTranslations: Record<string, Record<string, any>> = {}\n) {\n for (const lang in translations) {\n Reflect.deleteProperty(translations, lang);\n }\n\n translations.en = { ...defaultTranslation };\n\n for (const lang in newTranslations) {\n translations[lang] = {\n ...defaultTranslation,\n ...newTranslations[lang]\n };\n }\n update();\n}\n\nexport function getTranslations(): Record<string, Record<string, any>> {\n return translations;\n}\n\nexport class NumberFormatter {\n #value: number = 0;\n\n get value(): number {\n return this.#value;\n }\n\n private constructor() {}\n\n public set(newValue: number | string, shiftDecimal = false) {\n this.#value = this.clean(newValue, shiftDecimal);\n return this;\n }\n\n private clean(value: string | number, shiftDecimal = false): number {\n let stringNumber = String(value).replace(/[^0-9.-]+/g, \"\");\n\n if (shiftDecimal) {\n stringNumber = stringNumber.replace(/\\./g, \"\");\n }\n\n const number = Number(stringNumber);\n\n return isNaN(number) ? 0 : number;\n }\n\n format(digits = 2, options: Intl.NumberFormatOptions = {}, customLocale?: Intl.LocalesArgument): string {\n const lang = customLocale || getLang();\n const formatter = new Intl.NumberFormat(lang as string, {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n ...options\n });\n\n return formatter.format(this.#value);\n }\n\n fromDecimalPlaces(decimalPlaces: number) {\n const currentDecimalPlaces = this.getDecimalPlaces();\n const factor = Math.pow(10, decimalPlaces - currentDecimalPlaces);\n this.#value = Number((this.#value / factor).toFixed(decimalPlaces));\n return this;\n }\n\n // Ex toDecimalPlaces(1) = 123.456 -> 12345.6\n toDecimalPlaces(decimalPlaces: number) {\n const currentDecimalPlaces = this.getDecimalPlaces();\n const factor = Math.pow(10, currentDecimalPlaces - decimalPlaces);\n this.#value = Number((this.#value * factor).toFixed(decimalPlaces));\n return this;\n }\n\n getDecimalPlaces(): number {\n if (Math.floor(this.#value) === this.#value) {\n return 0;\n }\n\n const stringValue = String(this.#value);\n const decimalIndex = stringValue.indexOf(\".\");\n return decimalIndex === -1 ? 0 : stringValue.length - decimalIndex - 1;\n }\n\n shiftDecimalPlaces() {\n return this.toDecimalPlaces(0);\n }\n\n static create(value: number | string = 0, shiftDecimal = false): NumberFormatter {\n const formatter = new NumberFormatter();\n return formatter.set(value, shiftDecimal);\n }\n}\n\ndirective(\"t\", (value: string | null, vnode: VnodeWithDom): void => {\n const keys = typeof value === \"string\" ? [value] : vnode.children;\n const params = vnode.props[\"v-t-params\"] || {};\n const children = keys.map((key) => (typeof key === \"string\" && key.trim().length > 1 ? t(key.trim(), params) : key));\n vnode.children = children;\n});\n\nsetPropNameReserved(\"v-t-params\");\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,a={};((t,r)=>{for(var n in r)e(t,n,{get:r[n],enumerable:!0})})(a,{NumberFormatter:()=>
|
|
1
|
+
(()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,a={};((t,r)=>{for(var n in r)e(t,n,{get:r[n],enumerable:!0})})(a,{NumberFormatter:()=>d,getLang:()=>m,getTranslations:()=>y,setLang:()=>p,setStoreStrategy:()=>g,setTranslations:()=>v,t:()=>h});var i,o=(i=a,((a,i,o,s)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let l of r(i))n.call(a,l)||l===o||e(a,l,{get:()=>i[l],enumerable:!(s=t(i,l))||s.enumerable});return a})(e({},"__esModule",{value:!0}),i)),s=require("valyrian.js"),l=require("valyrian.js/utils"),u={},c="en",f={get:()=>c,set:e=>{c=e}};function g(e){f=e}function m(){return f.get()}function p(e){if("string"!=typeof e)throw new Error(`Language ${e} not found`);const t=e.toLowerCase().split("-").shift()?.split("_").shift();if("string"!=typeof t)throw new Error(`Language ${e} not found`);if(!u[t])throw new Error(`Language ${e} not found`);f.set(t),(0,s.update)()}function h(e,t){const r=u[m()],n=(0,l.get)(r,e);return"string"!=typeof n?(console.warn(`Translation not found for ${e}`),e):t?n.replace(/{(\w+)}/g,(e,r)=>r in t?t[r]:`{${r}}`):n}function v(e,t={}){for(const e in u)Reflect.deleteProperty(u,e);u.en={...e};for(const r in t)u[r]={...e,...t[r]};(0,s.update)()}function y(){return u}var d=class e{#e=0;get value(){return this.#e}constructor(){}set(e,t=!1){return this.#e=this.clean(e,t),this}clean(e,t=!1){let r=String(e).replace(/[^0-9.-]+/g,"");t&&(r=r.replace(/\./g,""));const n=Number(r);return isNaN(n)?0:n}format(e=2,t={},r){const n=r||m();return new Intl.NumberFormat(n,{style:"currency",currency:"USD",minimumFractionDigits:e,maximumFractionDigits:e,...t}).format(this.#e)}fromDecimalPlaces(e){const t=this.getDecimalPlaces(),r=Math.pow(10,e-t);return this.#e=Number((this.#e/r).toFixed(e)),this}toDecimalPlaces(e){const t=this.getDecimalPlaces(),r=Math.pow(10,t-e);return this.#e=Number((this.#e*r).toFixed(e)),this}getDecimalPlaces(){if(Math.floor(this.#e)===this.#e)return 0;const e=String(this.#e),t=e.indexOf(".");return-1===t?0:e.length-t-1}shiftDecimalPlaces(){return this.toDecimalPlaces(0)}static create(t=0,r=!1){return(new e).set(t,r)}};(0,s.directive)("t",(e,t)=>{const r="string"==typeof e?[e]:t.children,n=t.props["v-t-params"]||{},a=r.map(e=>"string"==typeof e&&e.trim().length>1?h(e.trim(),n):e);t.children=a}),(0,s.setPropNameReserved)("v-t-params"),"undefined"!=typeof module?module.exports=o:self.ValyrianTranslate=o})();//# sourceMappingURL=index.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJOdW1iZXJGb3JtYXR0ZXIiLCJnZXRMYW5nIiwiZ2V0VHJhbnNsYXRpb25zIiwic2V0TGFuZyIsInNldFRyYW5zbGF0aW9ucyIsInQiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJ0cmFuc2xhdGlvbnMiLCJsYW5nIiwicGF0aCIsInBhcmFtcyIsImxhbmdEZWYiLCJ0cmFuc2xhdGlvbiIsImdldCIsImNvbnNvbGUiLCJ3YXJuIiwicmVwbGFjZSIsIl8iLCJrZXkiLCJkZWZhdWx0VHJhbnNsYXRpb24iLCJuZXdUcmFuc2xhdGlvbnMiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJlbiIsInVwZGF0ZSIsIm5ld0xhbmciLCJFcnJvciIsInBhcnNlZExhbmciLCJ0b0xvd2VyQ2FzZSIsInNwbGl0Iiwic2hpZnQiLCJfTnVtYmVyRm9ybWF0dGVyIiwidmFsdWUiLCJ0aGlzIiwiY29uc3RydWN0b3IiLCJzZXQiLCJuZXdWYWx1ZSIsInNoaWZ0RGVjaW1hbCIsImNsZWFuIiwic3RyaW5nTnVtYmVyIiwiU3RyaW5nIiwibnVtYmVyIiwiTnVtYmVyIiwiaXNOYU4iLCJmb3JtYXQiLCJkaWdpdHMiLCJvcHRpb25zIiwiY3VzdG9tTG9jYWxlIiwiSW50bCIsIk51bWJlckZvcm1hdCIsInN0eWxlIiwiY3VycmVuY3kiLCJtaW5pbXVtRnJhY3Rpb25EaWdpdHMiLCJtYXhpbXVtRnJhY3Rpb25EaWdpdHMiLCJmcm9tRGVjaW1hbFBsYWNlcyIsImRlY2ltYWxQbGFjZXMiLCJjdXJyZW50RGVjaW1hbFBsYWNlcyIsImdldERlY2ltYWxQbGFjZXMiLCJmYWN0b3IiLCJNYXRoIiwicG93IiwidG9GaXhlZCIsInRvRGVjaW1hbFBsYWNlcyIsImZsb29yIiwic3RyaW5nVmFsdWUiLCJkZWNpbWFsSW5kZXgiLCJpbmRleE9mIiwibGVuZ3RoIiwic2hpZnREZWNpbWFsUGxhY2VzIiwiY3JlYXRlIiwiZGlyZWN0aXZlIiwidm5vZGUiLCJrZXlzIiwiY2hpbGRyZW4iLCJwcm9wcyIsIm1hcCIsInRyaW0iLCJzZXRQcm9wTmFtZVJlc2VydmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3RyYW5zbGF0ZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkaXJlY3RpdmUsIHNldFByb3BOYW1lUmVzZXJ2ZWQsIHVwZGF0ZSwgVm5vZGVXaXRoRG9tIH0gZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5pbXBvcnQgeyBnZXQgfSBmcm9tIFwidmFseXJpYW4uanMvdXRpbHNcIjtcblxuY29uc3QgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHt9O1xubGV0IGxhbmcgPSBcImVuXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB0KHBhdGg6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gIGNvbnN0IGxhbmdEZWYgPSB0cmFuc2xhdGlvbnNbbGFuZ107XG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0KGxhbmdEZWYsIHBhdGgpO1xuXG4gIGlmICh0eXBlb2YgdHJhbnNsYXRpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihgVHJhbnNsYXRpb24gbm90IGZvdW5kIGZvciAke3BhdGh9YCk7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2xhdGlvbi5yZXBsYWNlKC97KFxcdyspfS9nLCAoXywga2V5KSA9PiB7XG4gICAgaWYgKGtleSBpbiBwYXJhbXMpIHtcbiAgICAgIHJldHVybiBwYXJhbXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGB7JHtrZXl9fWA7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VHJhbnNsYXRpb25zKFxuICBkZWZhdWx0VHJhbnNsYXRpb246IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5ld1RyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7fVxuKSB7XG4gIGZvciAoY29uc3QgbGFuZyBpbiB0cmFuc2xhdGlvbnMpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRyYW5zbGF0aW9ucywgbGFuZyk7XG4gIH1cblxuICB0cmFuc2xhdGlvbnMuZW4gPSB7IC4uLmRlZmF1bHRUcmFuc2xhdGlvbiB9O1xuXG4gIGZvciAoY29uc3QgbGFuZyBpbiBuZXdUcmFuc2xhdGlvbnMpIHtcbiAgICB0cmFuc2xhdGlvbnNbbGFuZ10gPSB7XG4gICAgICAuLi5kZWZhdWx0VHJhbnNsYXRpb24sXG4gICAgICAuLi5uZXdUcmFuc2xhdGlvbnNbbGFuZ11cbiAgICB9O1xuICB9XG4gIHVwZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgcmV0dXJuIHRyYW5zbGF0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExhbmcobmV3TGFuZzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgbmV3TGFuZyAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGFuZ3VhZ2UgJHtuZXdMYW5nfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZExhbmcgPSBuZXdMYW5nLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCItXCIpLnNoaWZ0KCk/LnNwbGl0KFwiX1wiKS5zaGlmdCgpO1xuXG4gIGlmICh0eXBlb2YgcGFyc2VkTGFuZyAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGFuZ3VhZ2UgJHtuZXdMYW5nfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGlmICghdHJhbnNsYXRpb25zW3BhcnNlZExhbmddKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBMYW5ndWFnZSAke25ld0xhbmd9IG5vdCBmb3VuZGApO1xuICB9XG5cbiAgbGFuZyA9IHBhcnNlZExhbmc7XG4gIHVwZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFuZygpOiBzdHJpbmcge1xuICByZXR1cm4gbGFuZztcbn1cblxuZXhwb3J0IGNsYXNzIE51bWJlckZvcm1hdHRlciB7XG4gICN2YWx1ZTogbnVtYmVyID0gMDtcblxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgc2V0KG5ld1ZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIHNoaWZ0RGVjaW1hbCA9IGZhbHNlKSB7XG4gICAgdGhpcy4jdmFsdWUgPSB0aGlzLmNsZWFuKG5ld1ZhbHVlLCBzaGlmdERlY2ltYWwpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLCBzaGlmdERlY2ltYWwgPSBmYWxzZSk6IG51bWJlciB7XG4gICAgbGV0IHN0cmluZ051bWJlciA9IFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvW14wLTkuLV0rL2csIFwiXCIpO1xuXG4gICAgaWYgKHNoaWZ0RGVjaW1hbCkge1xuICAgICAgc3RyaW5nTnVtYmVyID0gc3RyaW5nTnVtYmVyLnJlcGxhY2UoL1xcLi9nLCBcIlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBudW1iZXIgPSBOdW1iZXIoc3RyaW5nTnVtYmVyKTtcblxuICAgIHJldHVybiBpc05hTihudW1iZXIpID8gMCA6IG51bWJlcjtcbiAgfVxuXG4gIGZvcm1hdChkaWdpdHMgPSAyLCBvcHRpb25zOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7fSwgY3VzdG9tTG9jYWxlPzogSW50bC5Mb2NhbGVzQXJndW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhbmcgPSBjdXN0b21Mb2NhbGUgfHwgZ2V0TGFuZygpO1xuICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsYW5nIGFzIHN0cmluZywge1xuICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgIGN1cnJlbmN5OiBcIlVTRFwiLFxuICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkaWdpdHMsXG4gICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGRpZ2l0cyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcblxuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHRoaXMuI3ZhbHVlKTtcbiAgfVxuXG4gIGZyb21EZWNpbWFsUGxhY2VzKGRlY2ltYWxQbGFjZXM6IG51bWJlcikge1xuICAgIGNvbnN0IGN1cnJlbnREZWNpbWFsUGxhY2VzID0gdGhpcy5nZXREZWNpbWFsUGxhY2VzKCk7XG4gICAgY29uc3QgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRlY2ltYWxQbGFjZXMgLSBjdXJyZW50RGVjaW1hbFBsYWNlcyk7XG4gICAgdGhpcy4jdmFsdWUgPSBOdW1iZXIoKHRoaXMuI3ZhbHVlIC8gZmFjdG9yKS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEV4IHRvRGVjaW1hbFBsYWNlcygxKSA9IDEyMy40NTYgLT4gMTIzNDUuNlxuICB0b0RlY2ltYWxQbGFjZXMoZGVjaW1hbFBsYWNlczogbnVtYmVyKSB7XG4gICAgY29uc3QgY3VycmVudERlY2ltYWxQbGFjZXMgPSB0aGlzLmdldERlY2ltYWxQbGFjZXMoKTtcbiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgY3VycmVudERlY2ltYWxQbGFjZXMgLSBkZWNpbWFsUGxhY2VzKTtcbiAgICB0aGlzLiN2YWx1ZSA9IE51bWJlcigodGhpcy4jdmFsdWUgKiBmYWN0b3IpLnRvRml4ZWQoZGVjaW1hbFBsYWNlcykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0RGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIGlmIChNYXRoLmZsb29yKHRoaXMuI3ZhbHVlKSA9PT0gdGhpcy4jdmFsdWUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKHRoaXMuI3ZhbHVlKTtcbiAgICBjb25zdCBkZWNpbWFsSW5kZXggPSBzdHJpbmdWYWx1ZS5pbmRleE9mKFwiLlwiKTtcbiAgICByZXR1cm4gZGVjaW1hbEluZGV4ID09PSAtMSA/IDAgOiBzdHJpbmdWYWx1ZS5sZW5ndGggLSBkZWNpbWFsSW5kZXggLSAxO1xuICB9XG5cbiAgc2hpZnREZWNpbWFsUGxhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvRGVjaW1hbFBsYWNlcygwKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUodmFsdWU6IG51bWJlciB8IHN0cmluZyA9IDAsIHNoaWZ0RGVjaW1hbCA9IGZhbHNlKTogTnVtYmVyRm9ybWF0dGVyIHtcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgTnVtYmVyRm9ybWF0dGVyKCk7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5zZXQodmFsdWUsIHNoaWZ0RGVjaW1hbCk7XG4gIH1cbn1cblxuZGlyZWN0aXZlKFwidFwiLCAodmFsdWU6IHN0cmluZyB8IG51bGwsIHZub2RlOiBWbm9kZVdpdGhEb20pOiB2b2lkID0+IHtcbiAgY29uc3Qga2V5cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IFt2YWx1ZV0gOiB2bm9kZS5jaGlsZHJlbjtcbiAgY29uc3QgcGFyYW1zID0gdm5vZGUucHJvcHNbXCJ2LXQtcGFyYW1zXCJdIHx8IHt9O1xuICBjb25zdCBjaGlsZHJlbiA9IGtleXMubWFwKChrZXkpID0+ICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICYmIGtleS50cmltKCkubGVuZ3RoID4gMSA/IHQoa2V5LnRyaW0oKSwgcGFyYW1zKSA6IGtleSkpO1xuICB2bm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufSk7XG5cbnNldFByb3BOYW1lUmVzZXJ2ZWQoXCJ2LXQtcGFyYW1zXCIpO1xuIl0sIm1hcHBpbmdzIjoiZ0pBQUFBLEVBQUEsRyx5REFBQUMsQ0FBQUQsRUFBQSxDQUFBRSxnQkFBQSxJQUFBQSxFQUFBQyxRQUFBLElBQUFBLEVBQUFDLGdCQUFBLElBQUFBLEVBQUFDLFFBQUEsSUFBQUEsRUFBQUMsZ0JBQUEsSUFBQUEsRUFBQUMsRUFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBUixFLDBNQUFBUyxFQUFxRUMsUUFBQSxlQUNyRUMsRUFBb0JELFFBQUEscUJBRWRFLEVBQW9ELENBQUMsRUFDdkRDLEVBQU8sS0FFSixTQUFTTixFQUFFTyxFQUFjQyxHQUM5QixNQUFNQyxFQUFVSixFQUFhQyxHQUN2QkksR0FBQSxFQUFjTixFQUFBTyxLQUFJRixFQUFTRixHQUVqQyxNQUEyQixpQkFBaEJHLEdBRVRFLFFBQVFDLEtBQUssNkJBQTZCTixLQUNuQ0EsR0FHSkMsRUFJRUUsRUFBWUksUUFBUSxXQUFZLENBQUNDLEVBQUdDLElBQ3JDQSxLQUFPUixFQUNGQSxFQUFPUSxHQUVULElBQUlBLE1BUEpOLENBU1gsQ0FFTyxTQUFTWCxFQUNka0IsRUFDQUMsRUFBdUQsQ0FBQyxHQUV4RCxVQUFXWixLQUFRRCxFQUNqQmMsUUFBUUMsZUFBZWYsRUFBY0MsR0FHdkNELEVBQWFnQixHQUFLLElBQUtKLEdBRXZCLFVBQVdYLEtBQVFZLEVBQ2pCYixFQUFhQyxHQUFRLElBQ2hCVyxLQUNBQyxFQUFnQlosS0FHdkIsRUFBQUosRUFBQW9CLFNBQ0YsQ0FFTyxTQUFTekIsSUFDZCxPQUFPUSxDQUNULENBRU8sU0FBU1AsRUFBUXlCLEdBQ3RCLEdBQXVCLGlCQUFaQSxFQUNULE1BQU0sSUFBSUMsTUFBTSxZQUFZRCxlQUc5QixNQUFNRSxFQUFhRixFQUFRRyxjQUFjQyxNQUFNLEtBQUtDLFNBQVNELE1BQU0sS0FBS0MsUUFFeEUsR0FBMEIsaUJBQWZILEVBQ1QsTUFBTSxJQUFJRCxNQUFNLFlBQVlELGVBRzlCLElBQUtsQixFQUFhb0IsR0FDaEIsTUFBTSxJQUFJRCxNQUFNLFlBQVlELGVBRzlCakIsRUFBT21CLEdBQ1AsRUFBQXZCLEVBQUFvQixTQUNGLENBRU8sU0FBUzFCLElBQ2QsT0FBT1UsQ0FDVCxDQUVPLElBQU1YLEVBQU4sTUFBTWtDLEVBQ1hDLEdBQWlCLEVBRWpCLFNBQUlBLEdBQ0YsT0FBT0MsTUFBS0QsQ0FDZCxDQUVRLFdBQUFFLEdBQWUsQ0FFaEIsR0FBQUMsQ0FBSUMsRUFBMkJDLEdBQWUsR0FFbkQsT0FEQUosTUFBS0QsRUFBU0MsS0FBS0ssTUFBTUYsRUFBVUMsR0FDNUJKLElBQ1QsQ0FFUSxLQUFBSyxDQUFNTixFQUF3QkssR0FBZSxHQUNuRCxJQUFJRSxFQUFlQyxPQUFPUixHQUFPaEIsUUFBUSxhQUFjLElBRW5EcUIsSUFDRkUsRUFBZUEsRUFBYXZCLFFBQVEsTUFBTyxLQUc3QyxNQUFNeUIsRUFBU0MsT0FBT0gsR0FFdEIsT0FBT0ksTUFBTUYsR0FBVSxFQUFJQSxDQUM3QixDQUVBLE1BQUFHLENBQU9DLEVBQVMsRUFBR0MsRUFBb0MsQ0FBQyxFQUFHQyxHQUN6RCxNQUFNdkMsRUFBT3VDLEdBQWdCakQsSUFTN0IsT0FSa0IsSUFBSWtELEtBQUtDLGFBQWF6QyxFQUFnQixDQUN0RDBDLE1BQU8sV0FDUEMsU0FBVSxNQUNWQyxzQkFBdUJQLEVBQ3ZCUSxzQkFBdUJSLEtBQ3BCQyxJQUdZRixPQUFPWCxNQUFLRCxFQUMvQixDQUVBLGlCQUFBc0IsQ0FBa0JDLEdBQ2hCLE1BQU1DLEVBQXVCdkIsS0FBS3dCLG1CQUM1QkMsRUFBU0MsS0FBS0MsSUFBSSxHQUFJTCxFQUFnQkMsR0FFNUMsT0FEQXZCLE1BQUtELEVBQVNVLFFBQVFULE1BQUtELEVBQVMwQixHQUFRRyxRQUFRTixJQUM3Q3RCLElBQ1QsQ0FHQSxlQUFBNkIsQ0FBZ0JQLEdBQ2QsTUFBTUMsRUFBdUJ2QixLQUFLd0IsbUJBQzVCQyxFQUFTQyxLQUFLQyxJQUFJLEdBQUlKLEVBQXVCRCxHQUVuRCxPQURBdEIsTUFBS0QsRUFBU1UsUUFBUVQsTUFBS0QsRUFBUzBCLEdBQVFHLFFBQVFOLElBQzdDdEIsSUFDVCxDQUVBLGdCQUFBd0IsR0FDRSxHQUFJRSxLQUFLSSxNQUFNOUIsTUFBS0QsS0FBWUMsTUFBS0QsRUFDbkMsT0FBTyxFQUdULE1BQU1nQyxFQUFjeEIsT0FBT1AsTUFBS0QsR0FDMUJpQyxFQUFlRCxFQUFZRSxRQUFRLEtBQ3pDLE9BQXdCLElBQWpCRCxFQUFzQixFQUFJRCxFQUFZRyxPQUFTRixFQUFlLENBQ3ZFLENBRUEsa0JBQUFHLEdBQ0UsT0FBT25DLEtBQUs2QixnQkFBZ0IsRUFDOUIsQ0FFQSxhQUFPTyxDQUFPckMsRUFBeUIsRUFBR0ssR0FBZSxHQUV2RCxPQURrQixJQUFJTixHQUNMSSxJQUFJSCxFQUFPSyxFQUM5QixJQUNGLEVBRUFqQyxFQUFBa0UsV0FBVSxJQUFLLENBQUN0QyxFQUFzQnVDLEtBQ3BDLE1BQU1DLEVBQXdCLGlCQUFWeEMsRUFBcUIsQ0FBQ0EsR0FBU3VDLEVBQU1FLFNBQ25EL0QsRUFBUzZELEVBQU1HLE1BQU0sZUFBaUIsQ0FBQyxFQUN2Q0QsRUFBV0QsRUFBS0csSUFBS3pELEdBQXdCLGlCQUFSQSxHQUFvQkEsRUFBSTBELE9BQU9ULE9BQVMsRUFBSWpFLEVBQUVnQixFQUFJMEQsT0FBUWxFLEdBQVVRLEdBQy9HcUQsRUFBTUUsU0FBV0EsS0FDbEIsRUFFRHJFLEVBQUF5RSxxQkFBb0IsYyJ9
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJOdW1iZXJGb3JtYXR0ZXIiLCJnZXRMYW5nIiwiZ2V0VHJhbnNsYXRpb25zIiwic2V0TGFuZyIsInNldFN0b3JlU3RyYXRlZ3kiLCJzZXRUcmFuc2xhdGlvbnMiLCJ0IiwiX19FWFBPUlRTX18iLCJpbXBvcnRfdmFseXJpYW4iLCJyZXF1aXJlIiwiaW1wb3J0X3V0aWxzIiwidHJhbnNsYXRpb25zIiwiY3VycmVudExhbmciLCJzdG9yZVN0cmF0ZWd5IiwiZ2V0Iiwic2V0IiwibGFuZyIsInN0cmF0ZWd5IiwibmV3TGFuZyIsIkVycm9yIiwicGFyc2VkTGFuZyIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJzaGlmdCIsInVwZGF0ZSIsInBhdGgiLCJwYXJhbXMiLCJsYW5nRGVmIiwidHJhbnNsYXRpb24iLCJjb25zb2xlIiwid2FybiIsInJlcGxhY2UiLCJfIiwia2V5IiwiZGVmYXVsdFRyYW5zbGF0aW9uIiwibmV3VHJhbnNsYXRpb25zIiwiUmVmbGVjdCIsImRlbGV0ZVByb3BlcnR5IiwiZW4iLCJfTnVtYmVyRm9ybWF0dGVyIiwidmFsdWUiLCJ0aGlzIiwiY29uc3RydWN0b3IiLCJuZXdWYWx1ZSIsInNoaWZ0RGVjaW1hbCIsImNsZWFuIiwic3RyaW5nTnVtYmVyIiwiU3RyaW5nIiwibnVtYmVyIiwiTnVtYmVyIiwiaXNOYU4iLCJmb3JtYXQiLCJkaWdpdHMiLCJvcHRpb25zIiwiY3VzdG9tTG9jYWxlIiwiSW50bCIsIk51bWJlckZvcm1hdCIsInN0eWxlIiwiY3VycmVuY3kiLCJtaW5pbXVtRnJhY3Rpb25EaWdpdHMiLCJtYXhpbXVtRnJhY3Rpb25EaWdpdHMiLCJmcm9tRGVjaW1hbFBsYWNlcyIsImRlY2ltYWxQbGFjZXMiLCJjdXJyZW50RGVjaW1hbFBsYWNlcyIsImdldERlY2ltYWxQbGFjZXMiLCJmYWN0b3IiLCJNYXRoIiwicG93IiwidG9GaXhlZCIsInRvRGVjaW1hbFBsYWNlcyIsImZsb29yIiwic3RyaW5nVmFsdWUiLCJkZWNpbWFsSW5kZXgiLCJpbmRleE9mIiwibGVuZ3RoIiwic2hpZnREZWNpbWFsUGxhY2VzIiwiY3JlYXRlIiwiZGlyZWN0aXZlIiwidm5vZGUiLCJrZXlzIiwiY2hpbGRyZW4iLCJwcm9wcyIsIm1hcCIsInRyaW0iLCJzZXRQcm9wTmFtZVJlc2VydmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3RyYW5zbGF0ZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjdXJyZW50LCBkaXJlY3RpdmUsIHNldFByb3BOYW1lUmVzZXJ2ZWQsIHVwZGF0ZSwgVm5vZGVXaXRoRG9tIH0gZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5pbXBvcnQgeyBnZXQgfSBmcm9tIFwidmFseXJpYW4uanMvdXRpbHNcIjtcblxuY29uc3QgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHt9O1xubGV0IGN1cnJlbnRMYW5nID0gXCJlblwiO1xuXG5sZXQgc3RvcmVTdHJhdGVneSA9IHtcbiAgZ2V0OiAoKSA9PiBjdXJyZW50TGFuZyxcbiAgc2V0OiAobGFuZzogc3RyaW5nKSA9PiB7XG4gICAgY3VycmVudExhbmcgPSBsYW5nO1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RvcmVTdHJhdGVneShzdHJhdGVneTogeyBnZXQ6ICgpID0+IHN0cmluZzsgc2V0OiAobGFuZzogc3RyaW5nKSA9PiB2b2lkIH0pIHtcbiAgc3RvcmVTdHJhdGVneSA9IHN0cmF0ZWd5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFuZygpOiBzdHJpbmcge1xuICByZXR1cm4gc3RvcmVTdHJhdGVneS5nZXQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExhbmcobmV3TGFuZzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgbmV3TGFuZyAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGFuZ3VhZ2UgJHtuZXdMYW5nfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZExhbmcgPSBuZXdMYW5nLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCItXCIpLnNoaWZ0KCk/LnNwbGl0KFwiX1wiKS5zaGlmdCgpO1xuXG4gIGlmICh0eXBlb2YgcGFyc2VkTGFuZyAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGFuZ3VhZ2UgJHtuZXdMYW5nfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGlmICghdHJhbnNsYXRpb25zW3BhcnNlZExhbmddKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBMYW5ndWFnZSAke25ld0xhbmd9IG5vdCBmb3VuZGApO1xuICB9XG5cbiAgc3RvcmVTdHJhdGVneS5zZXQocGFyc2VkTGFuZyk7XG4gIHVwZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdChwYXRoOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICBjb25zdCBsYW5nRGVmID0gdHJhbnNsYXRpb25zW2dldExhbmcoKV07XG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0KGxhbmdEZWYsIHBhdGgpO1xuXG4gIGlmICh0eXBlb2YgdHJhbnNsYXRpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihgVHJhbnNsYXRpb24gbm90IGZvdW5kIGZvciAke3BhdGh9YCk7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2xhdGlvbi5yZXBsYWNlKC97KFxcdyspfS9nLCAoXywga2V5KSA9PiB7XG4gICAgaWYgKGtleSBpbiBwYXJhbXMpIHtcbiAgICAgIHJldHVybiBwYXJhbXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGB7JHtrZXl9fWA7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VHJhbnNsYXRpb25zKFxuICBkZWZhdWx0VHJhbnNsYXRpb246IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5ld1RyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7fVxuKSB7XG4gIGZvciAoY29uc3QgbGFuZyBpbiB0cmFuc2xhdGlvbnMpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRyYW5zbGF0aW9ucywgbGFuZyk7XG4gIH1cblxuICB0cmFuc2xhdGlvbnMuZW4gPSB7IC4uLmRlZmF1bHRUcmFuc2xhdGlvbiB9O1xuXG4gIGZvciAoY29uc3QgbGFuZyBpbiBuZXdUcmFuc2xhdGlvbnMpIHtcbiAgICB0cmFuc2xhdGlvbnNbbGFuZ10gPSB7XG4gICAgICAuLi5kZWZhdWx0VHJhbnNsYXRpb24sXG4gICAgICAuLi5uZXdUcmFuc2xhdGlvbnNbbGFuZ11cbiAgICB9O1xuICB9XG4gIHVwZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgcmV0dXJuIHRyYW5zbGF0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIE51bWJlckZvcm1hdHRlciB7XG4gICN2YWx1ZTogbnVtYmVyID0gMDtcblxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgc2V0KG5ld1ZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIHNoaWZ0RGVjaW1hbCA9IGZhbHNlKSB7XG4gICAgdGhpcy4jdmFsdWUgPSB0aGlzLmNsZWFuKG5ld1ZhbHVlLCBzaGlmdERlY2ltYWwpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLCBzaGlmdERlY2ltYWwgPSBmYWxzZSk6IG51bWJlciB7XG4gICAgbGV0IHN0cmluZ051bWJlciA9IFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvW14wLTkuLV0rL2csIFwiXCIpO1xuXG4gICAgaWYgKHNoaWZ0RGVjaW1hbCkge1xuICAgICAgc3RyaW5nTnVtYmVyID0gc3RyaW5nTnVtYmVyLnJlcGxhY2UoL1xcLi9nLCBcIlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBudW1iZXIgPSBOdW1iZXIoc3RyaW5nTnVtYmVyKTtcblxuICAgIHJldHVybiBpc05hTihudW1iZXIpID8gMCA6IG51bWJlcjtcbiAgfVxuXG4gIGZvcm1hdChkaWdpdHMgPSAyLCBvcHRpb25zOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7fSwgY3VzdG9tTG9jYWxlPzogSW50bC5Mb2NhbGVzQXJndW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhbmcgPSBjdXN0b21Mb2NhbGUgfHwgZ2V0TGFuZygpO1xuICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsYW5nIGFzIHN0cmluZywge1xuICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgIGN1cnJlbmN5OiBcIlVTRFwiLFxuICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkaWdpdHMsXG4gICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGRpZ2l0cyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcblxuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHRoaXMuI3ZhbHVlKTtcbiAgfVxuXG4gIGZyb21EZWNpbWFsUGxhY2VzKGRlY2ltYWxQbGFjZXM6IG51bWJlcikge1xuICAgIGNvbnN0IGN1cnJlbnREZWNpbWFsUGxhY2VzID0gdGhpcy5nZXREZWNpbWFsUGxhY2VzKCk7XG4gICAgY29uc3QgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRlY2ltYWxQbGFjZXMgLSBjdXJyZW50RGVjaW1hbFBsYWNlcyk7XG4gICAgdGhpcy4jdmFsdWUgPSBOdW1iZXIoKHRoaXMuI3ZhbHVlIC8gZmFjdG9yKS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEV4IHRvRGVjaW1hbFBsYWNlcygxKSA9IDEyMy40NTYgLT4gMTIzNDUuNlxuICB0b0RlY2ltYWxQbGFjZXMoZGVjaW1hbFBsYWNlczogbnVtYmVyKSB7XG4gICAgY29uc3QgY3VycmVudERlY2ltYWxQbGFjZXMgPSB0aGlzLmdldERlY2ltYWxQbGFjZXMoKTtcbiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgY3VycmVudERlY2ltYWxQbGFjZXMgLSBkZWNpbWFsUGxhY2VzKTtcbiAgICB0aGlzLiN2YWx1ZSA9IE51bWJlcigodGhpcy4jdmFsdWUgKiBmYWN0b3IpLnRvRml4ZWQoZGVjaW1hbFBsYWNlcykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0RGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIGlmIChNYXRoLmZsb29yKHRoaXMuI3ZhbHVlKSA9PT0gdGhpcy4jdmFsdWUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKHRoaXMuI3ZhbHVlKTtcbiAgICBjb25zdCBkZWNpbWFsSW5kZXggPSBzdHJpbmdWYWx1ZS5pbmRleE9mKFwiLlwiKTtcbiAgICByZXR1cm4gZGVjaW1hbEluZGV4ID09PSAtMSA/IDAgOiBzdHJpbmdWYWx1ZS5sZW5ndGggLSBkZWNpbWFsSW5kZXggLSAxO1xuICB9XG5cbiAgc2hpZnREZWNpbWFsUGxhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvRGVjaW1hbFBsYWNlcygwKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUodmFsdWU6IG51bWJlciB8IHN0cmluZyA9IDAsIHNoaWZ0RGVjaW1hbCA9IGZhbHNlKTogTnVtYmVyRm9ybWF0dGVyIHtcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgTnVtYmVyRm9ybWF0dGVyKCk7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5zZXQodmFsdWUsIHNoaWZ0RGVjaW1hbCk7XG4gIH1cbn1cblxuZGlyZWN0aXZlKFwidFwiLCAodmFsdWU6IHN0cmluZyB8IG51bGwsIHZub2RlOiBWbm9kZVdpdGhEb20pOiB2b2lkID0+IHtcbiAgY29uc3Qga2V5cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IFt2YWx1ZV0gOiB2bm9kZS5jaGlsZHJlbjtcbiAgY29uc3QgcGFyYW1zID0gdm5vZGUucHJvcHNbXCJ2LXQtcGFyYW1zXCJdIHx8IHt9O1xuICBjb25zdCBjaGlsZHJlbiA9IGtleXMubWFwKChrZXkpID0+ICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICYmIGtleS50cmltKCkubGVuZ3RoID4gMSA/IHQoa2V5LnRyaW0oKSwgcGFyYW1zKSA6IGtleSkpO1xuICB2bm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufSk7XG5cbnNldFByb3BOYW1lUmVzZXJ2ZWQoXCJ2LXQtcGFyYW1zXCIpO1xuIl0sIm1hcHBpbmdzIjoiZ0pBQUFBLEVBQUEsRyx5REFBQUMsQ0FBQUQsRUFBQSxDQUFBRSxnQkFBQSxJQUFBQSxFQUFBQyxRQUFBLElBQUFBLEVBQUFDLGdCQUFBLElBQUFBLEVBQUFDLFFBQUEsSUFBQUEsRUFBQUMsaUJBQUEsSUFBQUEsRUFBQUMsZ0JBQUEsSUFBQUEsRUFBQUMsRUFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBVCxFLDBNQUFBVSxFQUE4RUMsUUFBQSxlQUM5RUMsRUFBb0JELFFBQUEscUJBRWRFLEVBQW9ELENBQUMsRUFDdkRDLEVBQWMsS0FFZEMsRUFBZ0IsQ0FDbEJDLElBQUssSUFBTUYsRUFDWEcsSUFBTUMsSUFDSkosRUFBY0ksSUFJWCxTQUFTWixFQUFpQmEsR0FDL0JKLEVBQWdCSSxDQUNsQixDQUVPLFNBQVNoQixJQUNkLE9BQU9ZLEVBQWNDLEtBQ3ZCLENBRU8sU0FBU1gsRUFBUWUsR0FDdEIsR0FBdUIsaUJBQVpBLEVBQ1QsTUFBTSxJQUFJQyxNQUFNLFlBQVlELGVB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
|
package/dist/translate/index.mjs
CHANGED
|
@@ -2,9 +2,35 @@
|
|
|
2
2
|
import { directive, setPropNameReserved, update } from "valyrian.js";
|
|
3
3
|
import { get } from "valyrian.js/utils";
|
|
4
4
|
var translations = {};
|
|
5
|
-
var
|
|
5
|
+
var currentLang = "en";
|
|
6
|
+
var storeStrategy = {
|
|
7
|
+
get: () => currentLang,
|
|
8
|
+
set: (lang) => {
|
|
9
|
+
currentLang = lang;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
function setStoreStrategy(strategy) {
|
|
13
|
+
storeStrategy = strategy;
|
|
14
|
+
}
|
|
15
|
+
function getLang() {
|
|
16
|
+
return storeStrategy.get();
|
|
17
|
+
}
|
|
18
|
+
function setLang(newLang) {
|
|
19
|
+
if (typeof newLang !== "string") {
|
|
20
|
+
throw new Error(`Language ${newLang} not found`);
|
|
21
|
+
}
|
|
22
|
+
const parsedLang = newLang.toLowerCase().split("-").shift()?.split("_").shift();
|
|
23
|
+
if (typeof parsedLang !== "string") {
|
|
24
|
+
throw new Error(`Language ${newLang} not found`);
|
|
25
|
+
}
|
|
26
|
+
if (!translations[parsedLang]) {
|
|
27
|
+
throw new Error(`Language ${newLang} not found`);
|
|
28
|
+
}
|
|
29
|
+
storeStrategy.set(parsedLang);
|
|
30
|
+
update();
|
|
31
|
+
}
|
|
6
32
|
function t(path, params) {
|
|
7
|
-
const langDef = translations[
|
|
33
|
+
const langDef = translations[getLang()];
|
|
8
34
|
const translation = get(langDef, path);
|
|
9
35
|
if (typeof translation !== "string") {
|
|
10
36
|
console.warn(`Translation not found for ${path}`);
|
|
@@ -21,14 +47,14 @@ function t(path, params) {
|
|
|
21
47
|
});
|
|
22
48
|
}
|
|
23
49
|
function setTranslations(defaultTranslation, newTranslations = {}) {
|
|
24
|
-
for (const
|
|
25
|
-
Reflect.deleteProperty(translations,
|
|
50
|
+
for (const lang in translations) {
|
|
51
|
+
Reflect.deleteProperty(translations, lang);
|
|
26
52
|
}
|
|
27
53
|
translations.en = { ...defaultTranslation };
|
|
28
|
-
for (const
|
|
29
|
-
translations[
|
|
54
|
+
for (const lang in newTranslations) {
|
|
55
|
+
translations[lang] = {
|
|
30
56
|
...defaultTranslation,
|
|
31
|
-
...newTranslations[
|
|
57
|
+
...newTranslations[lang]
|
|
32
58
|
};
|
|
33
59
|
}
|
|
34
60
|
update();
|
|
@@ -36,23 +62,6 @@ function setTranslations(defaultTranslation, newTranslations = {}) {
|
|
|
36
62
|
function getTranslations() {
|
|
37
63
|
return translations;
|
|
38
64
|
}
|
|
39
|
-
function setLang(newLang) {
|
|
40
|
-
if (typeof newLang !== "string") {
|
|
41
|
-
throw new Error(`Language ${newLang} not found`);
|
|
42
|
-
}
|
|
43
|
-
const parsedLang = newLang.toLowerCase().split("-").shift()?.split("_").shift();
|
|
44
|
-
if (typeof parsedLang !== "string") {
|
|
45
|
-
throw new Error(`Language ${newLang} not found`);
|
|
46
|
-
}
|
|
47
|
-
if (!translations[parsedLang]) {
|
|
48
|
-
throw new Error(`Language ${newLang} not found`);
|
|
49
|
-
}
|
|
50
|
-
lang = parsedLang;
|
|
51
|
-
update();
|
|
52
|
-
}
|
|
53
|
-
function getLang() {
|
|
54
|
-
return lang;
|
|
55
|
-
}
|
|
56
65
|
var NumberFormatter = class _NumberFormatter {
|
|
57
66
|
#value = 0;
|
|
58
67
|
get value() {
|
|
@@ -73,8 +82,8 @@ var NumberFormatter = class _NumberFormatter {
|
|
|
73
82
|
return isNaN(number) ? 0 : number;
|
|
74
83
|
}
|
|
75
84
|
format(digits = 2, options = {}, customLocale) {
|
|
76
|
-
const
|
|
77
|
-
const formatter = new Intl.NumberFormat(
|
|
85
|
+
const lang = customLocale || getLang();
|
|
86
|
+
const formatter = new Intl.NumberFormat(lang, {
|
|
78
87
|
style: "currency",
|
|
79
88
|
currency: "USD",
|
|
80
89
|
minimumFractionDigits: digits,
|
|
@@ -124,6 +133,7 @@ export {
|
|
|
124
133
|
getLang,
|
|
125
134
|
getTranslations,
|
|
126
135
|
setLang,
|
|
136
|
+
setStoreStrategy,
|
|
127
137
|
setTranslations,
|
|
128
138
|
t
|
|
129
139
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/translate/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { directive, setPropNameReserved, update, VnodeWithDom } from \"valyrian.js\";\nimport { get } from \"valyrian.js/utils\";\n\nconst translations: Record<string, Record<string, any>> = {};\nlet
|
|
5
|
-
"mappings": ";AAAA,
|
|
6
|
-
"names": [
|
|
4
|
+
"sourcesContent": ["import { current, directive, setPropNameReserved, update, VnodeWithDom } from \"valyrian.js\";\nimport { get } from \"valyrian.js/utils\";\n\nconst translations: Record<string, Record<string, any>> = {};\nlet currentLang = \"en\";\n\nlet storeStrategy = {\n get: () => currentLang,\n set: (lang: string) => {\n currentLang = lang;\n }\n};\n\nexport function setStoreStrategy(strategy: { get: () => string; set: (lang: string) => void }) {\n storeStrategy = strategy;\n}\n\nexport function getLang(): string {\n return storeStrategy.get();\n}\n\nexport function setLang(newLang: string): void {\n if (typeof newLang !== \"string\") {\n throw new Error(`Language ${newLang} not found`);\n }\n\n const parsedLang = newLang.toLowerCase().split(\"-\").shift()?.split(\"_\").shift();\n\n if (typeof parsedLang !== \"string\") {\n throw new Error(`Language ${newLang} not found`);\n }\n\n if (!translations[parsedLang]) {\n throw new Error(`Language ${newLang} not found`);\n }\n\n storeStrategy.set(parsedLang);\n update();\n}\n\nexport function t(path: string, params?: Record<string, string>): string {\n const langDef = translations[getLang()];\n const translation = get(langDef, path);\n\n if (typeof translation !== \"string\") {\n // eslint-disable-next-line no-console\n console.warn(`Translation not found for ${path}`);\n return path;\n }\n\n if (!params) {\n return translation;\n }\n\n return translation.replace(/{(\\w+)}/g, (_, key) => {\n if (key in params) {\n return params[key];\n }\n return `{${key}}`;\n });\n}\n\nexport function setTranslations(\n defaultTranslation: Record<string, any>,\n newTranslations: Record<string, Record<string, any>> = {}\n) {\n for (const lang in translations) {\n Reflect.deleteProperty(translations, lang);\n }\n\n translations.en = { ...defaultTranslation };\n\n for (const lang in newTranslations) {\n translations[lang] = {\n ...defaultTranslation,\n ...newTranslations[lang]\n };\n }\n update();\n}\n\nexport function getTranslations(): Record<string, Record<string, any>> {\n return translations;\n}\n\nexport class NumberFormatter {\n #value: number = 0;\n\n get value(): number {\n return this.#value;\n }\n\n private constructor() {}\n\n public set(newValue: number | string, shiftDecimal = false) {\n this.#value = this.clean(newValue, shiftDecimal);\n return this;\n }\n\n private clean(value: string | number, shiftDecimal = false): number {\n let stringNumber = String(value).replace(/[^0-9.-]+/g, \"\");\n\n if (shiftDecimal) {\n stringNumber = stringNumber.replace(/\\./g, \"\");\n }\n\n const number = Number(stringNumber);\n\n return isNaN(number) ? 0 : number;\n }\n\n format(digits = 2, options: Intl.NumberFormatOptions = {}, customLocale?: Intl.LocalesArgument): string {\n const lang = customLocale || getLang();\n const formatter = new Intl.NumberFormat(lang as string, {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n ...options\n });\n\n return formatter.format(this.#value);\n }\n\n fromDecimalPlaces(decimalPlaces: number) {\n const currentDecimalPlaces = this.getDecimalPlaces();\n const factor = Math.pow(10, decimalPlaces - currentDecimalPlaces);\n this.#value = Number((this.#value / factor).toFixed(decimalPlaces));\n return this;\n }\n\n // Ex toDecimalPlaces(1) = 123.456 -> 12345.6\n toDecimalPlaces(decimalPlaces: number) {\n const currentDecimalPlaces = this.getDecimalPlaces();\n const factor = Math.pow(10, currentDecimalPlaces - decimalPlaces);\n this.#value = Number((this.#value * factor).toFixed(decimalPlaces));\n return this;\n }\n\n getDecimalPlaces(): number {\n if (Math.floor(this.#value) === this.#value) {\n return 0;\n }\n\n const stringValue = String(this.#value);\n const decimalIndex = stringValue.indexOf(\".\");\n return decimalIndex === -1 ? 0 : stringValue.length - decimalIndex - 1;\n }\n\n shiftDecimalPlaces() {\n return this.toDecimalPlaces(0);\n }\n\n static create(value: number | string = 0, shiftDecimal = false): NumberFormatter {\n const formatter = new NumberFormatter();\n return formatter.set(value, shiftDecimal);\n }\n}\n\ndirective(\"t\", (value: string | null, vnode: VnodeWithDom): void => {\n const keys = typeof value === \"string\" ? [value] : vnode.children;\n const params = vnode.props[\"v-t-params\"] || {};\n const children = keys.map((key) => (typeof key === \"string\" && key.trim().length > 1 ? t(key.trim(), params) : key));\n vnode.children = children;\n});\n\nsetPropNameReserved(\"v-t-params\");\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -20,7 +20,7 @@ export interface NativeStorageInterface {
|
|
|
20
20
|
clear(): void;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
const
|
|
23
|
+
const stores = new Map<string, NativeStorageInterface>();
|
|
24
24
|
|
|
25
25
|
function getStorage(storageType: StorageType) {
|
|
26
26
|
if (isNodeJs && typeof localStorage === "undefined") {
|
|
@@ -32,24 +32,22 @@ function getStorage(storageType: StorageType) {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export function createNativeStore<T>(
|
|
35
|
-
|
|
35
|
+
id: string,
|
|
36
36
|
definition: Record<string, any> = {},
|
|
37
37
|
storageType: StorageType = StorageType.Local,
|
|
38
38
|
reuseIfExist = false
|
|
39
39
|
): NativeStorageInterface & T {
|
|
40
40
|
const nativeStore = getStorage(storageType);
|
|
41
41
|
|
|
42
|
-
if (
|
|
42
|
+
if (stores.has(id)) {
|
|
43
43
|
if (reuseIfExist) {
|
|
44
44
|
// eslint-disable-next-line no-console
|
|
45
|
-
console.warn(`Store with key ${
|
|
45
|
+
console.warn(`Store with key ${id} already exists and will be reused`);
|
|
46
|
+
return stores.get(id) as NativeStorageInterface & T;
|
|
46
47
|
} else {
|
|
47
|
-
throw new Error(`Store with key ${
|
|
48
|
+
throw new Error(`Store with key ${id} already exists`);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
ids.add(key);
|
|
51
|
-
|
|
52
|
-
const id = key;
|
|
53
51
|
|
|
54
52
|
const Store: NativeStorageInterface = {
|
|
55
53
|
state: {},
|
|
@@ -100,7 +98,23 @@ export function createNativeStore<T>(
|
|
|
100
98
|
...definition
|
|
101
99
|
};
|
|
102
100
|
|
|
101
|
+
if (!isNodeJs && storageType === StorageType.Local) {
|
|
102
|
+
function storageListener(e: StorageEvent) {
|
|
103
|
+
if (e.key === id) {
|
|
104
|
+
try {
|
|
105
|
+
Store.state = e.newValue === null ? {} : JSON.parse(e.newValue);
|
|
106
|
+
} catch (err) {
|
|
107
|
+
console.error(`Error syncing store ${id} from storage event`, err);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
window.addEventListener("storage", storageListener);
|
|
113
|
+
}
|
|
114
|
+
|
|
103
115
|
Store.load();
|
|
104
116
|
|
|
117
|
+
stores.set(id, Store);
|
|
118
|
+
|
|
105
119
|
return Store as NativeStorageInterface & T;
|
|
106
120
|
}
|
package/lib/node/index.ts
CHANGED
|
@@ -5,12 +5,12 @@ import FormData from "form-data";
|
|
|
5
5
|
import { icons } from "./utils/icons";
|
|
6
6
|
import { inline } from "./utils/inline";
|
|
7
7
|
import { sw } from "./utils/sw";
|
|
8
|
-
import {
|
|
8
|
+
import { ServerStorage } from "./utils/server-storage";
|
|
9
9
|
|
|
10
10
|
global.FormData = FormData as any;
|
|
11
11
|
global.document = document as any;
|
|
12
|
-
global.sessionStorage = new
|
|
13
|
-
global.localStorage = new
|
|
12
|
+
global.sessionStorage = new ServerStorage();
|
|
13
|
+
global.localStorage = new ServerStorage();
|
|
14
14
|
|
|
15
15
|
function render(...args: any[]) {
|
|
16
16
|
const Component = () => args;
|
|
@@ -19,4 +19,4 @@ function render(...args: any[]) {
|
|
|
19
19
|
return result;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export { domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript, inline, sw, icons, render,
|
|
22
|
+
export { domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript, inline, sw, icons, render, ServerStorage };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
|
|
3
|
+
const storageContext = new AsyncLocalStorage<Record<string, string>>();
|
|
4
|
+
let globalStore: Record<string, string> = {};
|
|
5
|
+
|
|
6
|
+
export class ServerStorage implements Storage {
|
|
7
|
+
get store(): Record<string, string> {
|
|
8
|
+
return storageContext.getStore() || globalStore;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
get length(): number {
|
|
12
|
+
const store = this.store;
|
|
13
|
+
return store ? Object.keys(store).length : 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
clear(): void {
|
|
17
|
+
const store = this.store;
|
|
18
|
+
if (store) {
|
|
19
|
+
for (const key in store) {
|
|
20
|
+
Reflect.deleteProperty(store, key);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
getItem(key: string): string | null {
|
|
26
|
+
const store = this.store;
|
|
27
|
+
return store ? store[key] || null : null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
key(index: number): string | null {
|
|
31
|
+
const store = this.store;
|
|
32
|
+
return store ? Object.keys(store)[index] || null : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
removeItem(key: string): void {
|
|
36
|
+
const store = this.store;
|
|
37
|
+
if (store) {
|
|
38
|
+
Reflect.deleteProperty(store, key);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
setItem(key: string, value: string): void {
|
|
43
|
+
const store = this.store;
|
|
44
|
+
if (store) {
|
|
45
|
+
store[key] = String(value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static run(callback: () => void) {
|
|
50
|
+
storageContext.run({}, callback);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
toJSON(): Record<string, string> {
|
|
54
|
+
const store = this.store;
|
|
55
|
+
return store ? { ...store } : {};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
On node.js environment, use ServerStorage for session storage.
|
|
61
|
+
At each request, a new storage context is created using ServerStorage.run method.
|
|
62
|
+
In browser environment, use the native sessionStorage.
|
|
63
|
+
|
|
64
|
+
server.get("*", (req, res) => {
|
|
65
|
+
ServerStorage.run(() => {
|
|
66
|
+
const html = router.go(req.url);
|
|
67
|
+
res.send(html);
|
|
68
|
+
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
*/
|
|
@@ -483,6 +483,28 @@ export class Document extends Element {
|
|
|
483
483
|
}
|
|
484
484
|
}
|
|
485
485
|
|
|
486
|
+
const ESCAPE_LOOKUP: { [key: string]: string } = {
|
|
487
|
+
"&": "&",
|
|
488
|
+
">": ">",
|
|
489
|
+
"<": "<",
|
|
490
|
+
'"': """,
|
|
491
|
+
"'": "'"
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
const ESCAPE_REGEX = /[&><"']/g;
|
|
495
|
+
|
|
496
|
+
function escapeHtml(str: string | any): string {
|
|
497
|
+
if (typeof str !== "string") {
|
|
498
|
+
return String(str);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
if (ESCAPE_REGEX.test(str) === false) {
|
|
502
|
+
return str;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
return str.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]).replace(/&amp;/g, "&");
|
|
506
|
+
}
|
|
507
|
+
|
|
486
508
|
const selfClosingTags = [
|
|
487
509
|
"area",
|
|
488
510
|
"base",
|
|
@@ -509,8 +531,10 @@ export function domToHtml(dom: Element | Text | DocumentFragment): string {
|
|
|
509
531
|
if (dom.nodeType === 1) {
|
|
510
532
|
const name = dom.nodeName.toLowerCase();
|
|
511
533
|
let str = "<" + name;
|
|
534
|
+
|
|
512
535
|
for (let i = 0, l = dom.attributes.length; i < l; i++) {
|
|
513
|
-
|
|
536
|
+
const attr = dom.attributes[i];
|
|
537
|
+
str += " " + attr.nodeName + '="' + escapeHtml(attr.nodeValue) + '"';
|
|
514
538
|
}
|
|
515
539
|
|
|
516
540
|
if (selfClosingTags.indexOf(name) === -1) {
|