yummies 5.11.0 → 5.11.2
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/async.cjs +1 -1
- package/async.cjs.map +1 -1
- package/async.js +38 -21
- package/async.js.map +1 -1
- package/common.cjs +1 -1
- package/common.cjs.map +1 -1
- package/common.js +9 -3
- package/common.js.map +1 -1
- package/complex.cjs +1 -1
- package/complex.cjs.map +1 -1
- package/complex.js +56 -33
- package/complex.js.map +1 -1
- package/cookie.cjs +1 -1
- package/cookie.cjs.map +1 -1
- package/cookie.js +7 -2
- package/cookie.js.map +1 -1
- package/css.cjs +1 -1
- package/css.cjs.map +1 -1
- package/css.js +41 -20
- package/css.js.map +1 -1
- package/data.cjs +1 -1
- package/data.cjs.map +1 -1
- package/data.js +35 -25
- package/data.js.map +1 -1
- package/date-time.cjs +1 -1
- package/date-time.cjs.map +1 -1
- package/date-time.d.ts.map +1 -1
- package/date-time.js +332 -250
- package/date-time.js.map +1 -1
- package/device.cjs +1 -1
- package/device.cjs.map +1 -1
- package/device.js +27 -18
- package/device.js.map +1 -1
- package/encodings.cjs +1 -1
- package/encodings.cjs.map +1 -1
- package/encodings.js +10 -10
- package/encodings.js.map +1 -1
- package/errors.cjs +1 -1
- package/errors.cjs.map +1 -1
- package/errors.d.ts.map +1 -1
- package/errors.js +21 -6
- package/errors.js.map +1 -1
- package/file.cjs +1 -1
- package/file.cjs.map +1 -1
- package/file.js +26 -17
- package/file.js.map +1 -1
- package/format/percent.d.ts +2 -2
- package/format/percent.d.ts.map +1 -1
- package/format.cjs +1 -1
- package/format.cjs.map +1 -1
- package/format.js +66 -42
- package/format.js.map +1 -1
- package/html.cjs +1 -1
- package/html.cjs.map +1 -1
- package/html.d.ts +1 -1
- package/html.d.ts.map +1 -1
- package/html.js +111 -68
- package/html.js.map +1 -1
- package/id.cjs +1 -2
- package/id.cjs.map +1 -1
- package/id.js +23 -13
- package/id.js.map +1 -1
- package/imports.cjs +1 -1
- package/imports.cjs.map +1 -1
- package/imports.js +27 -18
- package/imports.js.map +1 -1
- package/math.cjs +1 -1
- package/math.cjs.map +1 -1
- package/math.js +10 -8
- package/math.js.map +1 -1
- package/media.cjs +1 -1
- package/media.cjs.map +1 -1
- package/media.js +94 -49
- package/media.js.map +1 -1
- package/mobx/deep-observable-struct.d.ts.map +1 -1
- package/mobx.cjs +1 -1
- package/mobx.cjs.map +1 -1
- package/mobx.js +123 -68
- package/mobx.js.map +1 -1
- package/ms.cjs +1 -1
- package/ms.cjs.map +1 -1
- package/ms.js +9 -8
- package/ms.js.map +1 -1
- package/number.cjs +1 -1
- package/number.cjs.map +1 -1
- package/number.js +7 -6
- package/number.js.map +1 -1
- package/package.json +34 -33
- package/parser.cjs +1 -1
- package/parser.cjs.map +1 -1
- package/parser.js +64 -10
- package/parser.js.map +1 -1
- package/price.cjs +1 -1
- package/price.cjs.map +1 -1
- package/price.js +14 -7
- package/price.js.map +1 -1
- package/random.cjs +1 -1
- package/random.cjs.map +1 -1
- package/random.js +22 -9
- package/random.js.map +1 -1
- package/react.cjs +1 -1
- package/react.cjs.map +1 -1
- package/react.js +195 -130
- package/react.js.map +1 -1
- package/sound.cjs +1 -1
- package/sound.cjs.map +1 -1
- package/sound.js +8 -4
- package/sound.js.map +1 -1
- package/text.cjs +1 -1
- package/text.cjs.map +1 -1
- package/text.js +30 -14
- package/text.js.map +1 -1
- package/type-guard.cjs +1 -1
- package/type-guard.cjs.map +1 -1
- package/type-guard.js +93 -2
- package/type-guard.js.map +1 -1
- package/utility-types.d.ts +4 -0
- package/utils/types.d.ts +4 -0
- package/utils/types.d.ts.map +1 -1
- package/vibrate.cjs +1 -1
- package/vibrate.cjs.map +1 -1
- package/vibrate.js +5 -3
- package/vibrate.js.map +1 -1
- package/~constants-CFexlSUS.js +0 -7
- package/~constants-CFexlSUS.js.map +0 -1
- package/~constants-HmaulHpr.js +0 -2
- package/~constants-HmaulHpr.js.map +0 -1
- package/~index-C3wKHvHr.js +0 -80
- package/~index-C3wKHvHr.js.map +0 -1
- package/~index-PKNbSTT-.js +0 -2
- package/~index-PKNbSTT-.js.map +0 -1
- package/~number-B1MpW9GU.js +0 -2
- package/~number-B1MpW9GU.js.map +0 -1
- package/~number-EWff2XI6.js +0 -25
- package/~number-EWff2XI6.js.map +0 -1
package/format.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.cjs","sources":["../src/format/number.ts","../src/format/percent.ts","../src/format/skip-spaces.ts"],"sourcesContent":["import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/utils/types';\nimport { NO_VALUE } from './constants.js';\n\nexport interface NumberFormatSettings {\n delimiter?: string;\n /**\n * digitsOnlyForFloat - Show digits after decimal point only if they are not zeros after converting to number.\n * Example: \"0.00\" -> \"0\", \"0.10\" -> \"0.1\", but \"0.003\" -> \"0.003\"\n *\n * @default true\n */\n digitsOnlyForFloat?: boolean;\n /**\n * Text which will be returned if the value is undefined, null, NaN, Infinity or empty string.\n * Example: \"–\" will be returned if the value is undefined and emptyText is \"–\".\n */\n emptyText?: string;\n /**\n * Text to append to the end of the formatted number.\n * Example: if value is 1000 and postfix is \"₽\", result will be \"1 000₽\".\n */\n postfix?: string;\n /**\n * Fixed number of digits after the decimal point (number.toFixed() method)\n * If set to false, the truncation is ignored!\n */\n digits?: number | false;\n /**\n * Remove trailing zeros from the end of the number\n * Example: 0.010000000000000000000000000000000000000000000 -> 0.01\n */\n cutZeros?: boolean;\n}\n\nexport const number = (\n rawValue: Maybe<string | number>,\n userSettings?: Maybe<NumberFormatSettings>,\n): string => {\n const settings = {\n ...number.defaultSettings,\n ...userSettings,\n };\n\n const digits = settings.digits ?? 0;\n const cutZeros = settings?.cutZeros ?? false;\n const delimiter = settings.delimiter ?? ' ';\n const postfix = settings.postfix ?? '';\n const emptyText = settings.emptyText ?? NO_VALUE;\n const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;\n\n let value: Maybe<number>;\n\n if (typeGuard.isString(rawValue)) {\n value = parser.number(value, { fallback: undefined });\n } else {\n value = rawValue;\n }\n\n if (typeGuard.isNumber(value)) {\n let raw: string = `${value}`;\n\n if (digits !== false) {\n raw = value.toFixed(digits);\n }\n if (cutZeros) {\n raw = `${+raw}`;\n }\n\n const [integerPart, decimalPart] = raw.split('.', 2);\n\n let formattedIntegerPart = integerPart;\n let formattedDecimalPart = '';\n\n if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {\n formattedDecimalPart = `.${decimalPart}`;\n }\n\n const rgx = /(\\d+)(\\d{3})/;\n\n while (rgx.test(formattedIntegerPart) && delimiter) {\n formattedIntegerPart = formattedIntegerPart.replace(\n rgx,\n `$1${delimiter}$2`,\n );\n }\n\n return formattedIntegerPart + formattedDecimalPart + postfix;\n }\n\n return emptyText;\n};\n\nnumber.defaultSettings = {} as NumberFormatSettings;\n","import
|
|
1
|
+
{"version":3,"file":"format.cjs","sources":["../src/format/number.ts","../src/format/constants.ts","../src/format/percent.ts","../src/format/skip-spaces.ts"],"sourcesContent":["import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/utils/types';\nimport { NO_VALUE } from './constants.js';\n\nexport interface NumberFormatSettings {\n delimiter?: string;\n /**\n * digitsOnlyForFloat - Show digits after decimal point only if they are not zeros after converting to number.\n * Example: \"0.00\" -> \"0\", \"0.10\" -> \"0.1\", but \"0.003\" -> \"0.003\"\n *\n * @default true\n */\n digitsOnlyForFloat?: boolean;\n /**\n * Text which will be returned if the value is undefined, null, NaN, Infinity or empty string.\n * Example: \"–\" will be returned if the value is undefined and emptyText is \"–\".\n */\n emptyText?: string;\n /**\n * Text to append to the end of the formatted number.\n * Example: if value is 1000 and postfix is \"₽\", result will be \"1 000₽\".\n */\n postfix?: string;\n /**\n * Fixed number of digits after the decimal point (number.toFixed() method)\n * If set to false, the truncation is ignored!\n */\n digits?: number | false;\n /**\n * Remove trailing zeros from the end of the number\n * Example: 0.010000000000000000000000000000000000000000000 -> 0.01\n */\n cutZeros?: boolean;\n}\n\nexport const number = (\n rawValue: Maybe<string | number>,\n userSettings?: Maybe<NumberFormatSettings>,\n): string => {\n const settings = {\n ...number.defaultSettings,\n ...userSettings,\n };\n\n const digits = settings.digits ?? 0;\n const cutZeros = settings?.cutZeros ?? false;\n const delimiter = settings.delimiter ?? ' ';\n const postfix = settings.postfix ?? '';\n const emptyText = settings.emptyText ?? NO_VALUE;\n const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;\n\n let value: Maybe<number>;\n\n if (typeGuard.isString(rawValue)) {\n value = parser.number(value, { fallback: undefined });\n } else {\n value = rawValue;\n }\n\n if (typeGuard.isNumber(value)) {\n let raw: string = `${value}`;\n\n if (digits !== false) {\n raw = value.toFixed(digits);\n }\n if (cutZeros) {\n raw = `${+raw}`;\n }\n\n const [integerPart, decimalPart] = raw.split('.', 2);\n\n let formattedIntegerPart = integerPart;\n let formattedDecimalPart = '';\n\n if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {\n formattedDecimalPart = `.${decimalPart}`;\n }\n\n const rgx = /(\\d+)(\\d{3})/;\n\n while (rgx.test(formattedIntegerPart) && delimiter) {\n formattedIntegerPart = formattedIntegerPart.replace(\n rgx,\n `$1${delimiter}$2`,\n );\n }\n\n return formattedIntegerPart + formattedDecimalPart + postfix;\n }\n\n return emptyText;\n};\n\nnumber.defaultSettings = {} as NumberFormatSettings;\n","export const NO_VALUE = '–'; // en-dash\n\nexport const HYPHEN = '-';\n\nexport const INFINITY = '∞';\n","import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/utils/types';\n\nimport { NO_VALUE } from './constants.js';\n\nexport interface PercentFormatSettings\n extends Omit<parser.NumberParserSettings, 'fallback'> {\n divider?: string;\n delimiter?: string;\n symbol?: string;\n emptyText?: string;\n}\n\n/**\n * 100 -> 100%\n * 99.123214412 -> 99.12%\n * 99.123214412 -> 99,12%\n */\nexport const percent = (\n value: Maybe<number | string>,\n settings?: PercentFormatSettings,\n) => {\n const numericValue = parser.number(value, {\n ...settings,\n digits: settings?.digits ?? 2,\n fallback: Number.NaN,\n });\n\n if (typeGuard.isNumber(numericValue)) {\n const divider = settings?.divider ?? '.';\n\n const formattedPercent =\n divider === '.' ? numericValue : `${numericValue}`.replace('.', divider);\n\n return `${formattedPercent}${settings?.delimiter ?? ''}${settings?.symbol ?? '%'}`;\n } else {\n return settings?.emptyText ?? NO_VALUE;\n }\n};\n","/**\n * Removes all spaces in string\n */\nexport const skipSpaces = (value: string) => value.replaceAll(/\\s/g, '');\n"],"names":["number","rawValue","userSettings","settings","defaultSettings","digits","cutZeros","delimiter","postfix","emptyText","digitsOnlyForFloat","value","typeGuard","isString","parser","fallback","isNumber","raw","toFixed","integerPart","decimalPart","split","formattedIntegerPart","formattedDecimalPart","test","rgx","replace","numericValue","Number","NaN","divider","symbol","replaceAll"],"mappings":"kJAoCaA,EAAS,CACpBC,EACAC,KAEA,MAAMC,EAAW,IACZH,EAAOI,mBACPF,GAGCG,EAASF,EAASE,QAAU,EAC5BC,EAAWH,GAAUG,WAAY,EACjCC,EAAYJ,EAASI,WAAa,IAClCC,EAAUL,EAASK,SAAW,GAC9BC,EAAYN,EAASM,WCjDL,IDkDhBC,EAAqBP,EAASO,qBAAsB,EAE1D,IAAIC,EAQJ,GALEA,EADEC,EAAAA,UAAUC,SAASZ,GACba,EAAAA,OAAOd,OAAOW,EAAO,CAAEI,cAAU,IAEjCd,EAGNW,EAAAA,UAAUI,SAASL,GAAQ,CAC7B,IAAIM,EAAc,GAAGN,KAEN,IAAXN,IACFY,EAAMN,EAAMO,QAAQb,IAElBC,IACFW,EAAM,KAAIA,GAGZ,MAAOE,EAAaC,GAAeH,EAAII,MAAM,IAAK,GAElD,IAAIC,EAAuBH,EACvBI,EAAuB,IAEvBH,GAAiBV,GAAuB,OAAOc,KAAKJ,KACtDG,EAAuB,IAAIH,KAG7B,MAAMK,EAAM,eAEZ,KAAOA,EAAID,KAAKF,IAAyBf,GACvCe,EAAuBA,EAAqBI,QAC1CD,EACA,KAAKlB,OAIT,OAAOe,EAAuBC,EAAuBf,CACvD,CAEA,OAAOC,GAGTT,EAAOI,gBAAkB,CAAA,EE3ElB,mEDjBe,aAEE,aAJA,qBCmBD,CACrBO,EACAR,KAEA,MAAMwB,EAAeb,EAAAA,OAAOd,OAAOW,EAAO,IACrCR,EACHE,OAAQF,GAAUE,QAAU,EAC5BU,SAAUa,OAAOC,MAGnB,GAAIjB,EAAAA,UAAUI,SAASW,GAAe,CACpC,MAAMG,EAAU3B,GAAU2B,SAAW,IAKrC,MAAO,GAFO,MAAZA,EAAkBH,EAAe,GAAGA,IAAeD,QAAQ,IAAKI,KAErC3B,GAAUI,WAAa,KAAKJ,GAAU4B,QAAU,KAC/E,CACE,OAAO5B,GAAUM,WDrCG,gBEGGE,GAAkBA,EAAMqB,WAAW,MAAO"}
|
package/format.js
CHANGED
|
@@ -1,52 +1,76 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
...
|
|
9
|
-
...
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
import { parser } from "yummies/parser";
|
|
2
|
+
import { typeGuard } from "yummies/type-guard";
|
|
3
|
+
const NO_VALUE = "–";
|
|
4
|
+
const HYPHEN = "-";
|
|
5
|
+
const INFINITY = "∞";
|
|
6
|
+
const number = (rawValue, userSettings) => {
|
|
7
|
+
const settings = {
|
|
8
|
+
...number.defaultSettings,
|
|
9
|
+
...userSettings
|
|
10
|
+
};
|
|
11
|
+
const digits = settings.digits ?? 0;
|
|
12
|
+
const cutZeros = settings?.cutZeros ?? false;
|
|
13
|
+
const delimiter = settings.delimiter ?? " ";
|
|
14
|
+
const postfix = settings.postfix ?? "";
|
|
15
|
+
const emptyText = settings.emptyText ?? NO_VALUE;
|
|
16
|
+
const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;
|
|
17
|
+
let value;
|
|
18
|
+
if (typeGuard.isString(rawValue)) {
|
|
19
|
+
value = parser.number(value, { fallback: void 0 });
|
|
20
|
+
} else {
|
|
21
|
+
value = rawValue;
|
|
22
|
+
}
|
|
23
|
+
if (typeGuard.isNumber(value)) {
|
|
24
|
+
let raw = `${value}`;
|
|
25
|
+
if (digits !== false) {
|
|
26
|
+
raw = value.toFixed(digits);
|
|
27
|
+
}
|
|
28
|
+
if (cutZeros) {
|
|
29
|
+
raw = `${+raw}`;
|
|
30
|
+
}
|
|
31
|
+
const [integerPart, decimalPart] = raw.split(".", 2);
|
|
32
|
+
let formattedIntegerPart = integerPart;
|
|
33
|
+
let formattedDecimalPart = "";
|
|
34
|
+
if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {
|
|
35
|
+
formattedDecimalPart = `.${decimalPart}`;
|
|
36
|
+
}
|
|
37
|
+
const rgx = /(\d+)(\d{3})/;
|
|
38
|
+
while (rgx.test(formattedIntegerPart) && delimiter) {
|
|
39
|
+
formattedIntegerPart = formattedIntegerPart.replace(
|
|
40
|
+
rgx,
|
|
41
|
+
`$1${delimiter}$2`
|
|
23
42
|
);
|
|
24
|
-
|
|
43
|
+
}
|
|
44
|
+
return formattedIntegerPart + formattedDecimalPart + postfix;
|
|
25
45
|
}
|
|
26
|
-
return
|
|
46
|
+
return emptyText;
|
|
27
47
|
};
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
...
|
|
32
|
-
digits:
|
|
48
|
+
number.defaultSettings = {};
|
|
49
|
+
const percent = (value, settings) => {
|
|
50
|
+
const numericValue = parser.number(value, {
|
|
51
|
+
...settings,
|
|
52
|
+
digits: settings?.digits ?? 2,
|
|
33
53
|
fallback: Number.NaN
|
|
34
54
|
});
|
|
35
|
-
if (
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
55
|
+
if (typeGuard.isNumber(numericValue)) {
|
|
56
|
+
const divider = settings?.divider ?? ".";
|
|
57
|
+
const formattedPercent = divider === "." ? numericValue : `${numericValue}`.replace(".", divider);
|
|
58
|
+
return `${formattedPercent}${settings?.delimiter ?? ""}${settings?.symbol ?? "%"}`;
|
|
59
|
+
} else {
|
|
60
|
+
return settings?.emptyText ?? NO_VALUE;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const skipSpaces = (value) => value.replaceAll(/\s/g, "");
|
|
64
|
+
const _exports = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
41
65
|
__proto__: null,
|
|
42
|
-
HYPHEN
|
|
43
|
-
INFINITY
|
|
44
|
-
NO_VALUE
|
|
45
|
-
number
|
|
46
|
-
percent
|
|
47
|
-
skipSpaces
|
|
66
|
+
HYPHEN,
|
|
67
|
+
INFINITY,
|
|
68
|
+
NO_VALUE,
|
|
69
|
+
number,
|
|
70
|
+
percent,
|
|
71
|
+
skipSpaces
|
|
48
72
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
49
73
|
export {
|
|
50
|
-
|
|
74
|
+
_exports as format
|
|
51
75
|
};
|
|
52
76
|
//# sourceMappingURL=format.js.map
|
package/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sources":["../src/format/number.ts","../src/format/percent.ts","../src/format/skip-spaces.ts"],"sourcesContent":["import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/utils/types';\nimport { NO_VALUE } from './constants.js';\n\nexport interface NumberFormatSettings {\n delimiter?: string;\n /**\n * digitsOnlyForFloat - Show digits after decimal point only if they are not zeros after converting to number.\n * Example: \"0.00\" -> \"0\", \"0.10\" -> \"0.1\", but \"0.003\" -> \"0.003\"\n *\n * @default true\n */\n digitsOnlyForFloat?: boolean;\n /**\n * Text which will be returned if the value is undefined, null, NaN, Infinity or empty string.\n * Example: \"–\" will be returned if the value is undefined and emptyText is \"–\".\n */\n emptyText?: string;\n /**\n * Text to append to the end of the formatted number.\n * Example: if value is 1000 and postfix is \"₽\", result will be \"1 000₽\".\n */\n postfix?: string;\n /**\n * Fixed number of digits after the decimal point (number.toFixed() method)\n * If set to false, the truncation is ignored!\n */\n digits?: number | false;\n /**\n * Remove trailing zeros from the end of the number\n * Example: 0.010000000000000000000000000000000000000000000 -> 0.01\n */\n cutZeros?: boolean;\n}\n\nexport const number = (\n rawValue: Maybe<string | number>,\n userSettings?: Maybe<NumberFormatSettings>,\n): string => {\n const settings = {\n ...number.defaultSettings,\n ...userSettings,\n };\n\n const digits = settings.digits ?? 0;\n const cutZeros = settings?.cutZeros ?? false;\n const delimiter = settings.delimiter ?? ' ';\n const postfix = settings.postfix ?? '';\n const emptyText = settings.emptyText ?? NO_VALUE;\n const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;\n\n let value: Maybe<number>;\n\n if (typeGuard.isString(rawValue)) {\n value = parser.number(value, { fallback: undefined });\n } else {\n value = rawValue;\n }\n\n if (typeGuard.isNumber(value)) {\n let raw: string = `${value}`;\n\n if (digits !== false) {\n raw = value.toFixed(digits);\n }\n if (cutZeros) {\n raw = `${+raw}`;\n }\n\n const [integerPart, decimalPart] = raw.split('.', 2);\n\n let formattedIntegerPart = integerPart;\n let formattedDecimalPart = '';\n\n if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {\n formattedDecimalPart = `.${decimalPart}`;\n }\n\n const rgx = /(\\d+)(\\d{3})/;\n\n while (rgx.test(formattedIntegerPart) && delimiter) {\n formattedIntegerPart = formattedIntegerPart.replace(\n rgx,\n `$1${delimiter}$2`,\n );\n }\n\n return formattedIntegerPart + formattedDecimalPart + postfix;\n }\n\n return emptyText;\n};\n\nnumber.defaultSettings = {} as NumberFormatSettings;\n","import
|
|
1
|
+
{"version":3,"file":"format.js","sources":["../src/format/constants.ts","../src/format/number.ts","../src/format/percent.ts","../src/format/skip-spaces.ts"],"sourcesContent":["export const NO_VALUE = '–'; // en-dash\n\nexport const HYPHEN = '-';\n\nexport const INFINITY = '∞';\n","import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/utils/types';\nimport { NO_VALUE } from './constants.js';\n\nexport interface NumberFormatSettings {\n delimiter?: string;\n /**\n * digitsOnlyForFloat - Show digits after decimal point only if they are not zeros after converting to number.\n * Example: \"0.00\" -> \"0\", \"0.10\" -> \"0.1\", but \"0.003\" -> \"0.003\"\n *\n * @default true\n */\n digitsOnlyForFloat?: boolean;\n /**\n * Text which will be returned if the value is undefined, null, NaN, Infinity or empty string.\n * Example: \"–\" will be returned if the value is undefined and emptyText is \"–\".\n */\n emptyText?: string;\n /**\n * Text to append to the end of the formatted number.\n * Example: if value is 1000 and postfix is \"₽\", result will be \"1 000₽\".\n */\n postfix?: string;\n /**\n * Fixed number of digits after the decimal point (number.toFixed() method)\n * If set to false, the truncation is ignored!\n */\n digits?: number | false;\n /**\n * Remove trailing zeros from the end of the number\n * Example: 0.010000000000000000000000000000000000000000000 -> 0.01\n */\n cutZeros?: boolean;\n}\n\nexport const number = (\n rawValue: Maybe<string | number>,\n userSettings?: Maybe<NumberFormatSettings>,\n): string => {\n const settings = {\n ...number.defaultSettings,\n ...userSettings,\n };\n\n const digits = settings.digits ?? 0;\n const cutZeros = settings?.cutZeros ?? false;\n const delimiter = settings.delimiter ?? ' ';\n const postfix = settings.postfix ?? '';\n const emptyText = settings.emptyText ?? NO_VALUE;\n const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;\n\n let value: Maybe<number>;\n\n if (typeGuard.isString(rawValue)) {\n value = parser.number(value, { fallback: undefined });\n } else {\n value = rawValue;\n }\n\n if (typeGuard.isNumber(value)) {\n let raw: string = `${value}`;\n\n if (digits !== false) {\n raw = value.toFixed(digits);\n }\n if (cutZeros) {\n raw = `${+raw}`;\n }\n\n const [integerPart, decimalPart] = raw.split('.', 2);\n\n let formattedIntegerPart = integerPart;\n let formattedDecimalPart = '';\n\n if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {\n formattedDecimalPart = `.${decimalPart}`;\n }\n\n const rgx = /(\\d+)(\\d{3})/;\n\n while (rgx.test(formattedIntegerPart) && delimiter) {\n formattedIntegerPart = formattedIntegerPart.replace(\n rgx,\n `$1${delimiter}$2`,\n );\n }\n\n return formattedIntegerPart + formattedDecimalPart + postfix;\n }\n\n return emptyText;\n};\n\nnumber.defaultSettings = {} as NumberFormatSettings;\n","import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/utils/types';\n\nimport { NO_VALUE } from './constants.js';\n\nexport interface PercentFormatSettings\n extends Omit<parser.NumberParserSettings, 'fallback'> {\n divider?: string;\n delimiter?: string;\n symbol?: string;\n emptyText?: string;\n}\n\n/**\n * 100 -> 100%\n * 99.123214412 -> 99.12%\n * 99.123214412 -> 99,12%\n */\nexport const percent = (\n value: Maybe<number | string>,\n settings?: PercentFormatSettings,\n) => {\n const numericValue = parser.number(value, {\n ...settings,\n digits: settings?.digits ?? 2,\n fallback: Number.NaN,\n });\n\n if (typeGuard.isNumber(numericValue)) {\n const divider = settings?.divider ?? '.';\n\n const formattedPercent =\n divider === '.' ? numericValue : `${numericValue}`.replace('.', divider);\n\n return `${formattedPercent}${settings?.delimiter ?? ''}${settings?.symbol ?? '%'}`;\n } else {\n return settings?.emptyText ?? NO_VALUE;\n }\n};\n","/**\n * Removes all spaces in string\n */\nexport const skipSpaces = (value: string) => value.replaceAll(/\\s/g, '');\n"],"names":[],"mappings":";;AAAO,MAAM,WAAW;AAEjB,MAAM,SAAS;AAEf,MAAM,WAAW;ACgCjB,MAAM,SAAS,CACpB,UACA,iBACW;AACX,QAAM,WAAW;AAAA,IACf,GAAG,OAAO;AAAA,IACV,GAAG;AAAA,EAAA;AAGL,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,WAAW,UAAU,YAAY;AACvC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,qBAAqB,SAAS,sBAAsB;AAE1D,MAAI;AAEJ,MAAI,UAAU,SAAS,QAAQ,GAAG;AAChC,YAAQ,OAAO,OAAO,OAAO,EAAE,UAAU,QAAW;AAAA,EACtD,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,MAAI,UAAU,SAAS,KAAK,GAAG;AAC7B,QAAI,MAAc,GAAG,KAAK;AAE1B,QAAI,WAAW,OAAO;AACpB,YAAM,MAAM,QAAQ,MAAM;AAAA,IAC5B;AACA,QAAI,UAAU;AACZ,YAAM,GAAG,CAAC,GAAG;AAAA,IACf;AAEA,UAAM,CAAC,aAAa,WAAW,IAAI,IAAI,MAAM,KAAK,CAAC;AAEnD,QAAI,uBAAuB;AAC3B,QAAI,uBAAuB;AAE3B,QAAI,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,KAAK,WAAW,IAAI;AACrE,6BAAuB,IAAI,WAAW;AAAA,IACxC;AAEA,UAAM,MAAM;AAEZ,WAAO,IAAI,KAAK,oBAAoB,KAAK,WAAW;AAClD,6BAAuB,qBAAqB;AAAA,QAC1C;AAAA,QACA,KAAK,SAAS;AAAA,MAAA;AAAA,IAElB;AAEA,WAAO,uBAAuB,uBAAuB;AAAA,EACvD;AAEA,SAAO;AACT;AAEA,OAAO,kBAAkB,CAAA;AC3ElB,MAAM,UAAU,CACrB,OACA,aACG;AACH,QAAM,eAAe,OAAO,OAAO,OAAO;AAAA,IACxC,GAAG;AAAA,IACH,QAAQ,UAAU,UAAU;AAAA,IAC5B,UAAU,OAAO;AAAA,EAAA,CAClB;AAED,MAAI,UAAU,SAAS,YAAY,GAAG;AACpC,UAAM,UAAU,UAAU,WAAW;AAErC,UAAM,mBACJ,YAAY,MAAM,eAAe,GAAG,YAAY,GAAG,QAAQ,KAAK,OAAO;AAEzE,WAAO,GAAG,gBAAgB,GAAG,UAAU,aAAa,EAAE,GAAG,UAAU,UAAU,GAAG;AAAA,EAClF,OAAO;AACL,WAAO,UAAU,aAAa;AAAA,EAChC;AACF;ACpCO,MAAM,aAAa,CAAC,UAAkB,MAAM,WAAW,OAAO,EAAE;;;;;;;;;;"}
|
package/html.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("dompurify"),t=require("yummies/media");const o={ALLOWED_TAGS:["a","article","b","blockquote","br","caption","code","del","details","div","em","h1","h2","h3","h4","h5","h6","hr","i","img","ins","kbd","li","main","ol","p","pre","section","span","strong","sub","summary","sup","table","tbody","td","th","thead","tr","u","ul"],ALLOWED_ATTR:["href","target","name","src","class"]};exports.calcScrollbarWidth=(e=document.body)=>{const t=document.createElement("div");t.style.visibility="hidden",t.style.width="100px",t.style.overflow="scroll",e.append(t);const o=document.createElement("div");o.style.width="100%",t.append(o);const r=t.offsetWidth-o.offsetWidth;return t.parentNode?.removeChild(t),r},exports.checkElementHasParent=(e,t)=>{let o=e;if(!t)return!1;for(;null!=o;){if(o===t)return!0;o=o.parentElement}return!1},exports.collectOffsetTop=e=>{let t=0,o=e;for(;null!=o;)t+=o.offsetTop,o=o.parentElement;return t},exports.downloadUsingAnchor=(e,o)=>{const r=t.blobToUrl(e),n=document.createElement("a");n.href=r,n.download=o??"file",n.target="_blank",document.body.append(n),n.click(),n.remove()},exports.getComputedColor=e=>{if(!e)return null;const t=document.createElement("div");t.style.color=e,document.body.append(t);const o=globalThis.getComputedStyle(t).color,r=/rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(o);return t.remove(),r?`${r[1]}, ${r[2]}, ${r[3]}`:null},exports.getElementInnerHeight=function(e){const{clientHeight:t}=e,{paddingTop:o,paddingBottom:r}=getComputedStyle(e);return t-Number.parseFloat(o)-Number.parseFloat(r)},exports.getElementInnerWidth=function(e){const{clientWidth:t}=e,{paddingLeft:o,paddingRight:r}=getComputedStyle(e);return t-Number.parseFloat(o)-Number.parseFloat(r)},exports.globalScrollIntoViewForY=e=>{const t=document.body,o=window.innerHeight,r=e.getBoundingClientRect(),n=t.scrollHeight/o,s=Math.min(Math.max(r.top/o,1),n);window.scroll({top:s*o,behavior:"smooth"})},exports.isPrefersDarkTheme=()=>!!globalThis.matchMedia?.("(prefers-color-scheme: dark)")?.matches,exports.isPrefersLightTheme=()=>!!globalThis.matchMedia?.("(prefers-color-scheme: light)")?.matches,exports.sanitizeHtml=(t,r)=>e.sanitize(t||"",{...o,...r}),exports.skipEvent=e=>(e.preventDefault(),e.stopPropagation(),!1),exports.startViewTransitionSafety=(e,t)=>{if(document.startViewTransition&&!t?.disabled)return document.startViewTransition(e);e()},exports.wrapTextToTagLink=function(e){const t=String(e).replace(/^(https?:\/{0,2})?(w{3}\.)?/,"www.");return/^https?:\/{2}/.test(e)||(e=`http://${e}`),`<a href=${e} target="_blank">${t}</a>`};
|
|
2
2
|
//# sourceMappingURL=html.cjs.map
|
package/html.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.cjs","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/utils/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = () => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n
|
|
1
|
+
{"version":3,"file":"html.cjs","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/utils/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = (elementToAppend = document.body) => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n elementToAppend.append(outer);\n\n const inner = document.createElement('div');\n inner.style.width = '100%';\n\n outer.append(inner);\n\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\n\n outer.parentNode?.removeChild(outer);\n\n return scrollbarWidth;\n};\n\n/**\n * Calculates the inner height of an HTML element, accounting for padding.\n */\nexport function getElementInnerHeight(element: HTMLElement) {\n const { clientHeight } = element;\n const { paddingTop, paddingBottom } = getComputedStyle(element);\n return (\n clientHeight -\n Number.parseFloat(paddingTop) -\n Number.parseFloat(paddingBottom)\n );\n}\n\n/**\n * Calculates the inner width of an HTML element, accounting for padding.\n */\nexport function getElementInnerWidth(el: HTMLElement) {\n const { clientWidth } = el;\n const { paddingLeft, paddingRight } = getComputedStyle(el);\n return (\n clientWidth -\n Number.parseFloat(paddingLeft) -\n Number.parseFloat(paddingRight)\n );\n}\n\nexport const isPrefersDarkTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\nexport const isPrefersLightTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: light)')?.matches;\n"],"names":["sanitizeDefaults","ALLOWED_TAGS","ALLOWED_ATTR","elementToAppend","document","body","outer","createElement","style","visibility","width","overflow","append","inner","scrollbarWidth","offsetWidth","parentNode","removeChild","element","parent","node","parentElement","offsetTop","urlOrBlob","fileName","url","blobToUrl","a","href","download","target","click","remove","color","d","rgbcolor","globalThis","getComputedStyle","match","exec","clientHeight","paddingTop","paddingBottom","Number","parseFloat","el","clientWidth","paddingLeft","paddingRight","scrollContainer","pageHeight","window","innerHeight","nodeBounding","getBoundingClientRect","scrollPagesCount","scrollHeight","scrollPageNumber","Math","min","max","top","scroll","behavior","matchMedia","matches","html","config","DOMPurify","sanitize","e","preventDefault","stopPropagation","fn","params","startViewTransition","disabled","link","descr","String","replace","test"],"mappings":"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"}
|
package/html.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ export declare const startViewTransitionSafety: (fn: VoidFunction, params?: {
|
|
|
30
30
|
/**
|
|
31
31
|
* Вычисляет размер скроллбара
|
|
32
32
|
*/
|
|
33
|
-
export declare const calcScrollbarWidth: () => number;
|
|
33
|
+
export declare const calcScrollbarWidth: (elementToAppend?: HTMLElement) => number;
|
|
34
34
|
/**
|
|
35
35
|
* Calculates the inner height of an HTML element, accounting for padding.
|
|
36
36
|
*/
|
package/html.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,KAAK,MAAM,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IAe1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,WAAW,MAAM,GAAG,IAAI,EACxB,WAAW,MAAM,SAgBlB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,UAI7C;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS,WAAW,GAAG,IAAI,WAU3D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,GAAG,KAAK,YAKjC,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,MAAM,WAAW,SAezD,CAAC;AAiDF,eAAO,MAAM,YAAY,GAAI,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,eAAe,WAKzE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,SAAS,WAAW,GAAG,IAAI,EAC3B,QAAQ,KAAK,CAAC,WAAW,CAAC,YAe3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,GACpC,IAAI,YAAY,EAChB,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,+BAMhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,KAAK,MAAM,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IAe1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,WAAW,MAAM,GAAG,IAAI,EACxB,WAAW,MAAM,SAgBlB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,UAI7C;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS,WAAW,GAAG,IAAI,WAU3D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,GAAG,KAAK,YAKjC,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,MAAM,WAAW,SAezD,CAAC;AAiDF,eAAO,MAAM,YAAY,GAAI,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,eAAe,WAKzE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,SAAS,WAAW,GAAG,IAAI,EAC3B,QAAQ,KAAK,CAAC,WAAW,CAAC,YAe3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,GACpC,IAAI,YAAY,EAChB,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,+BAMhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,6BAA+B,WAmBjE,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,UAQzD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,WAAW,UAQnD;AAED,eAAO,MAAM,kBAAkB,eACqC,CAAC;AAErE,eAAO,MAAM,mBAAmB,eACqC,CAAC"}
|
package/html.js
CHANGED
|
@@ -1,34 +1,60 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { blobToUrl
|
|
3
|
-
const
|
|
4
|
-
if (!
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import DOMPurify from "dompurify";
|
|
2
|
+
import { blobToUrl } from "yummies/media";
|
|
3
|
+
const getComputedColor = (color) => {
|
|
4
|
+
if (!color) return null;
|
|
5
|
+
const d = document.createElement("div");
|
|
6
|
+
d.style.color = color;
|
|
7
|
+
document.body.append(d);
|
|
8
|
+
const rgbcolor = globalThis.getComputedStyle(d).color;
|
|
9
|
+
const match = /rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(rgbcolor);
|
|
10
|
+
d.remove();
|
|
11
|
+
if (!match) return null;
|
|
12
|
+
return `${match[1]}, ${match[2]}, ${match[3]}`;
|
|
12
13
|
};
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
14
|
+
const downloadUsingAnchor = (urlOrBlob, fileName) => {
|
|
15
|
+
const url = blobToUrl(urlOrBlob);
|
|
16
|
+
const a = document.createElement("a");
|
|
17
|
+
a.href = url;
|
|
18
|
+
a.download = fileName ?? "file";
|
|
19
|
+
a.target = "_blank";
|
|
20
|
+
document.body.append(a);
|
|
21
|
+
a.click();
|
|
22
|
+
a.remove();
|
|
23
|
+
};
|
|
24
|
+
function wrapTextToTagLink(link) {
|
|
25
|
+
const descr = String(link).replace(/^(https?:\/{0,2})?(w{3}\.)?/, "www.");
|
|
26
|
+
if (!/^https?:\/{2}/.test(link)) link = `http://${link}`;
|
|
27
|
+
return `<a href=${link} target="_blank">${descr}</a>`;
|
|
16
28
|
}
|
|
17
|
-
const
|
|
18
|
-
let
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
const collectOffsetTop = (element) => {
|
|
30
|
+
let offsetTop = 0;
|
|
31
|
+
let node = element;
|
|
32
|
+
while (node != null) {
|
|
33
|
+
offsetTop += node.offsetTop;
|
|
34
|
+
node = node.parentElement;
|
|
35
|
+
}
|
|
36
|
+
return offsetTop;
|
|
37
|
+
};
|
|
38
|
+
const skipEvent = (e) => {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
e.stopPropagation();
|
|
41
|
+
return false;
|
|
42
|
+
};
|
|
43
|
+
const globalScrollIntoViewForY = (node) => {
|
|
44
|
+
const scrollContainer = document.body;
|
|
45
|
+
const pageHeight = window.innerHeight;
|
|
46
|
+
const nodeBounding = node.getBoundingClientRect();
|
|
47
|
+
const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;
|
|
48
|
+
const scrollPageNumber = Math.min(
|
|
49
|
+
Math.max(nodeBounding.top / pageHeight, 1),
|
|
50
|
+
scrollPagesCount
|
|
26
51
|
);
|
|
27
52
|
window.scroll({
|
|
28
|
-
top:
|
|
53
|
+
top: scrollPageNumber * pageHeight,
|
|
29
54
|
behavior: "smooth"
|
|
30
55
|
});
|
|
31
|
-
}
|
|
56
|
+
};
|
|
57
|
+
const sanitizeDefaults = {
|
|
32
58
|
ALLOWED_TAGS: [
|
|
33
59
|
"a",
|
|
34
60
|
"article",
|
|
@@ -73,53 +99,70 @@ const p = (t) => {
|
|
|
73
99
|
"ul"
|
|
74
100
|
],
|
|
75
101
|
ALLOWED_ATTR: ["href", "target", "name", "src", "class"]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
102
|
+
};
|
|
103
|
+
const sanitizeHtml = (html, config) => {
|
|
104
|
+
return DOMPurify.sanitize(html || "", {
|
|
105
|
+
...sanitizeDefaults,
|
|
106
|
+
...config
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
const checkElementHasParent = (element, parent) => {
|
|
110
|
+
let node = element;
|
|
111
|
+
if (!parent) return false;
|
|
112
|
+
while (node != null) {
|
|
113
|
+
if (node === parent) {
|
|
114
|
+
return true;
|
|
115
|
+
} else {
|
|
116
|
+
node = node.parentElement;
|
|
117
|
+
}
|
|
86
118
|
}
|
|
87
|
-
return
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
119
|
+
return false;
|
|
120
|
+
};
|
|
121
|
+
const startViewTransitionSafety = (fn, params) => {
|
|
122
|
+
if (document.startViewTransition && !params?.disabled) {
|
|
123
|
+
return document.startViewTransition(fn);
|
|
124
|
+
}
|
|
125
|
+
fn();
|
|
126
|
+
};
|
|
127
|
+
const calcScrollbarWidth = (elementToAppend = document.body) => {
|
|
128
|
+
const outer = document.createElement("div");
|
|
129
|
+
outer.style.visibility = "hidden";
|
|
130
|
+
outer.style.width = "100px";
|
|
131
|
+
outer.style.overflow = "scroll";
|
|
132
|
+
elementToAppend.append(outer);
|
|
133
|
+
const inner = document.createElement("div");
|
|
134
|
+
inner.style.width = "100%";
|
|
135
|
+
outer.append(inner);
|
|
136
|
+
const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;
|
|
137
|
+
outer.parentNode?.removeChild(outer);
|
|
138
|
+
return scrollbarWidth;
|
|
99
139
|
};
|
|
100
|
-
function
|
|
101
|
-
const { clientHeight
|
|
102
|
-
|
|
140
|
+
function getElementInnerHeight(element) {
|
|
141
|
+
const { clientHeight } = element;
|
|
142
|
+
const { paddingTop, paddingBottom } = getComputedStyle(element);
|
|
143
|
+
return clientHeight - Number.parseFloat(paddingTop) - Number.parseFloat(paddingBottom);
|
|
103
144
|
}
|
|
104
|
-
function
|
|
105
|
-
const { clientWidth
|
|
106
|
-
|
|
145
|
+
function getElementInnerWidth(el) {
|
|
146
|
+
const { clientWidth } = el;
|
|
147
|
+
const { paddingLeft, paddingRight } = getComputedStyle(el);
|
|
148
|
+
return clientWidth - Number.parseFloat(paddingLeft) - Number.parseFloat(paddingRight);
|
|
107
149
|
}
|
|
108
|
-
const
|
|
150
|
+
const isPrefersDarkTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: dark)")?.matches;
|
|
151
|
+
const isPrefersLightTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: light)")?.matches;
|
|
109
152
|
export {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
153
|
+
calcScrollbarWidth,
|
|
154
|
+
checkElementHasParent,
|
|
155
|
+
collectOffsetTop,
|
|
156
|
+
downloadUsingAnchor,
|
|
157
|
+
getComputedColor,
|
|
158
|
+
getElementInnerHeight,
|
|
159
|
+
getElementInnerWidth,
|
|
160
|
+
globalScrollIntoViewForY,
|
|
161
|
+
isPrefersDarkTheme,
|
|
162
|
+
isPrefersLightTheme,
|
|
163
|
+
sanitizeHtml,
|
|
164
|
+
skipEvent,
|
|
165
|
+
startViewTransitionSafety,
|
|
166
|
+
wrapTextToTagLink
|
|
124
167
|
};
|
|
125
168
|
//# sourceMappingURL=html.js.map
|
package/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/utils/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = () => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n
|
|
1
|
+
{"version":3,"file":"html.js","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/utils/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = (elementToAppend = document.body) => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n elementToAppend.append(outer);\n\n const inner = document.createElement('div');\n inner.style.width = '100%';\n\n outer.append(inner);\n\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\n\n outer.parentNode?.removeChild(outer);\n\n return scrollbarWidth;\n};\n\n/**\n * Calculates the inner height of an HTML element, accounting for padding.\n */\nexport function getElementInnerHeight(element: HTMLElement) {\n const { clientHeight } = element;\n const { paddingTop, paddingBottom } = getComputedStyle(element);\n return (\n clientHeight -\n Number.parseFloat(paddingTop) -\n Number.parseFloat(paddingBottom)\n );\n}\n\n/**\n * Calculates the inner width of an HTML element, accounting for padding.\n */\nexport function getElementInnerWidth(el: HTMLElement) {\n const { clientWidth } = el;\n const { paddingLeft, paddingRight } = getComputedStyle(el);\n return (\n clientWidth -\n Number.parseFloat(paddingLeft) -\n Number.parseFloat(paddingRight)\n );\n}\n\nexport const isPrefersDarkTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\nexport const isPrefersLightTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: light)')?.matches;\n"],"names":[],"mappings":"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"}
|
package/id.cjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("nanoid"),t="0123456789",
|
|
2
|
-
`).slice(1,4).join("");exports.createLinearNumericIdGenerator=n;exports.generateId=s;exports.generateLinearNumericId=I;exports.generateNumericId=d;exports.generateNumericShortId=u;exports.generateShortId=i;exports.generateStackBasedId=g;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("nanoid"),t="0123456789",r=`abcdefghijklmnopqrstuvwxyz${t}`,o=e.customAlphabet(r,6),a=e.customAlphabet(r,4),n=e.customAlphabet(t,6),s=e.customAlphabet(t,4),c=(e=9)=>{let t=0;return()=>(t++).toString().padStart(e,"0")},i=c();exports.createLinearNumericIdGenerator=c,exports.generateId=o,exports.generateLinearNumericId=i,exports.generateNumericId=n,exports.generateNumericShortId=s,exports.generateShortId=a,exports.generateStackBasedId=()=>(new Error).stack.split("\n").slice(1,4).join("");
|
|
3
2
|
//# sourceMappingURL=id.cjs.map
|
package/id.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.cjs","sources":["../src/id.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst DIGITS = '0123456789';\nconst LATIN_CHARS = 'abcdefghijklmnopqrstuvwxyz';\n\nconst ALPHABET = `${LATIN_CHARS}${DIGITS}`;\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 6\n */\nexport const generateId = customAlphabet(ALPHABET, 6);\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 4\n */\nexport const generateShortId = customAlphabet(ALPHABET, 4);\n\n/**\n * Использует алфавит 0123456789\n * Размер 6\n */\nexport const generateNumericId = customAlphabet(DIGITS, 6);\n\n/**\n * Использует алфавит 0123456789\n * Размер 4\n */\nexport const generateNumericShortId = customAlphabet(DIGITS, 4);\n\n/**\n * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции\n *\n * @example\n * ```ts\n * generateLinearNumericId = createLinearNumericIdGenerator(6);\n * generateLinearNumericId() // '000000'\n * generateLinearNumericId() // '000001'\n * ...\n * generateLinearNumericId() // '999999'\n * generateLinearNumericId() // '1000000'\n * ...\n * generateLinearNumericId() // '9999999'\n * generateLinearNumericId() // '10000000'\n * ```\n *\n * @param size размер\n * @returns {()=>string}\n */\nexport const createLinearNumericIdGenerator = (size: number = 9) => {\n let lastCount = 0;\n return () => {\n return (lastCount++).toString().padStart(size, '0');\n };\n};\n\n/**\n *\n * @example\n * ```ts\n * generateLinearNumericId() // '000000000'\n * generateLinearNumericId() // '000000001'\n * ...\n * generateLinearNumericId() // '999999999'\n * generateLinearNumericId() // '1000000000'\n * ...\n * generateLinearNumericId() // '9999999999'\n * generateLinearNumericId() // '10000000000'\n * ```\n *\n */\nexport const generateLinearNumericId = createLinearNumericIdGenerator();\n\n/**\n * Is not recommended to use.\n *\n * Generates execution stack based pseudo-id (just sliced string from error stack)\n */\nexport const generateStackBasedId = () =>\n new Error().stack!.split('\\n').slice(1, 4).join('');\n"],"names":["DIGITS","
|
|
1
|
+
{"version":3,"file":"id.cjs","sources":["../src/id.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst DIGITS = '0123456789';\nconst LATIN_CHARS = 'abcdefghijklmnopqrstuvwxyz';\n\nconst ALPHABET = `${LATIN_CHARS}${DIGITS}`;\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 6\n */\nexport const generateId = customAlphabet(ALPHABET, 6);\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 4\n */\nexport const generateShortId = customAlphabet(ALPHABET, 4);\n\n/**\n * Использует алфавит 0123456789\n * Размер 6\n */\nexport const generateNumericId = customAlphabet(DIGITS, 6);\n\n/**\n * Использует алфавит 0123456789\n * Размер 4\n */\nexport const generateNumericShortId = customAlphabet(DIGITS, 4);\n\n/**\n * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции\n *\n * @example\n * ```ts\n * generateLinearNumericId = createLinearNumericIdGenerator(6);\n * generateLinearNumericId() // '000000'\n * generateLinearNumericId() // '000001'\n * ...\n * generateLinearNumericId() // '999999'\n * generateLinearNumericId() // '1000000'\n * ...\n * generateLinearNumericId() // '9999999'\n * generateLinearNumericId() // '10000000'\n * ```\n *\n * @param size размер\n * @returns {()=>string}\n */\nexport const createLinearNumericIdGenerator = (size: number = 9) => {\n let lastCount = 0;\n return () => {\n return (lastCount++).toString().padStart(size, '0');\n };\n};\n\n/**\n *\n * @example\n * ```ts\n * generateLinearNumericId() // '000000000'\n * generateLinearNumericId() // '000000001'\n * ...\n * generateLinearNumericId() // '999999999'\n * generateLinearNumericId() // '1000000000'\n * ...\n * generateLinearNumericId() // '9999999999'\n * generateLinearNumericId() // '10000000000'\n * ```\n *\n */\nexport const generateLinearNumericId = createLinearNumericIdGenerator();\n\n/**\n * Is not recommended to use.\n *\n * Generates execution stack based pseudo-id (just sliced string from error stack)\n */\nexport const generateStackBasedId = () =>\n new Error().stack!.split('\\n').slice(1, 4).join('');\n"],"names":["DIGITS","ALPHABET","generateId","customAlphabet","generateShortId","generateNumericId","generateNumericShortId","createLinearNumericIdGenerator","size","lastCount","toString","padStart","generateLinearNumericId","Error","stack","split","slice","join"],"mappings":"0GAEMA,EAAS,aAGTC,EAAW,6BAAiBD,IAMrBE,EAAaC,EAAAA,eAAeF,EAAU,GAMtCG,EAAkBD,EAAAA,eAAeF,EAAU,GAM3CI,EAAoBF,EAAAA,eAAeH,EAAQ,GAM3CM,EAAyBH,EAAAA,eAAeH,EAAQ,GAqBhDO,EAAiC,CAACC,EAAe,KAC5D,IAAIC,EAAY,EAChB,MAAO,KACGA,KAAaC,WAAWC,SAASH,EAAM,MAmBtCI,EAA0BL,wNAOH,KAClC,IAAIM,OAAQC,MAAOC,MAAM,MAAMC,MAAM,EAAG,GAAGC,KAAK"}
|