@dxtmisha/functional-basic 0.1.0 → 0.1.1

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.
Files changed (122) hide show
  1. package/package.json +5 -3
  2. package/src/classes/Api.ts +407 -0
  3. package/src/classes/ApiDefault.ts +83 -0
  4. package/src/classes/ApiHeaders.ts +52 -0
  5. package/src/classes/ApiPreparation.ts +114 -0
  6. package/src/classes/ApiResponse.ts +293 -0
  7. package/src/classes/ApiStatus.ts +173 -0
  8. package/src/classes/BroadcastMessage.ts +73 -0
  9. package/src/classes/Cache.ts +60 -0
  10. package/src/classes/CacheItem.ts +95 -0
  11. package/src/classes/CacheStatic.ts +30 -0
  12. package/src/classes/Cookie.ts +135 -0
  13. package/src/classes/CookieBlock.ts +31 -0
  14. package/src/classes/DataStorage.ts +194 -0
  15. package/src/classes/Datetime.ts +891 -0
  16. package/src/classes/EventItem.ts +373 -0
  17. package/src/classes/Geo.ts +320 -0
  18. package/src/classes/GeoFlag.ts +386 -0
  19. package/src/classes/GeoIntl.ts +839 -0
  20. package/src/classes/GeoPhone.ts +272 -0
  21. package/src/classes/Global.ts +32 -0
  22. package/src/classes/Hash.ts +142 -0
  23. package/src/classes/Icons.ts +165 -0
  24. package/src/classes/Loading.ts +90 -0
  25. package/src/classes/Meta.ts +284 -0
  26. package/src/classes/MetaManager.ts +200 -0
  27. package/src/classes/MetaOg.ts +147 -0
  28. package/src/classes/MetaTwitter.ts +154 -0
  29. package/src/classes/ScrollbarWidth.ts +86 -0
  30. package/src/classes/Translate.ts +293 -0
  31. package/src/classes/__tests__/Api.test.ts +728 -0
  32. package/src/classes/__tests__/ApiDefault.test.ts +222 -0
  33. package/src/classes/__tests__/ApiHeaders.test.ts +447 -0
  34. package/src/classes/__tests__/ApiPreparation.test.ts +257 -0
  35. package/src/classes/__tests__/ApiResponse.test.ts +547 -0
  36. package/src/classes/__tests__/ApiStatus.test.ts +403 -0
  37. package/src/classes/__tests__/Meta.test.ts +629 -0
  38. package/src/classes/__tests__/MetaManager.test.ts +836 -0
  39. package/src/classes/__tests__/MetaOg.test.ts +677 -0
  40. package/src/classes/__tests__/MetaTwitter.test.ts +423 -0
  41. package/src/functions/anyToString.ts +36 -0
  42. package/src/functions/applyTemplate.ts +63 -0
  43. package/src/functions/arrFill.ts +10 -0
  44. package/src/functions/copyObject.ts +10 -0
  45. package/src/functions/createElement.ts +40 -0
  46. package/src/functions/domQuerySelector.ts +15 -0
  47. package/src/functions/domQuerySelectorAll.ts +15 -0
  48. package/src/functions/encodeAttribute.ts +15 -0
  49. package/src/functions/eventStopPropagation.ts +10 -0
  50. package/src/functions/executeFunction.ts +13 -0
  51. package/src/functions/executePromise.ts +19 -0
  52. package/src/functions/forEach.ts +39 -0
  53. package/src/functions/frame.ts +38 -0
  54. package/src/functions/getAttributes.ts +27 -0
  55. package/src/functions/getClipboardData.ts +13 -0
  56. package/src/functions/getColumn.ts +18 -0
  57. package/src/functions/getElement.ts +35 -0
  58. package/src/functions/getElementId.ts +39 -0
  59. package/src/functions/getElementItem.ts +27 -0
  60. package/src/functions/getElementOrWindow.ts +23 -0
  61. package/src/functions/getExp.ts +21 -0
  62. package/src/functions/getItemByPath.ts +24 -0
  63. package/src/functions/getKey.ts +9 -0
  64. package/src/functions/getLengthOfAllArray.ts +13 -0
  65. package/src/functions/getMaxLengthAllArray.ts +13 -0
  66. package/src/functions/getMinLengthAllArray.ts +13 -0
  67. package/src/functions/getMouseClient.ts +17 -0
  68. package/src/functions/getMouseClientX.ts +9 -0
  69. package/src/functions/getMouseClientY.ts +9 -0
  70. package/src/functions/getObjectByKeys.ts +24 -0
  71. package/src/functions/getObjectNoUndefined.ts +23 -0
  72. package/src/functions/getObjectOrNone.ts +11 -0
  73. package/src/functions/getRandomText.ts +29 -0
  74. package/src/functions/getRequestString.ts +21 -0
  75. package/src/functions/getStepPercent.ts +19 -0
  76. package/src/functions/getStepValue.ts +19 -0
  77. package/src/functions/goScroll.ts +40 -0
  78. package/src/functions/inArray.ts +10 -0
  79. package/src/functions/initScrollbarOffset.ts +14 -0
  80. package/src/functions/intersectKey.ts +34 -0
  81. package/src/functions/isArray.ts +9 -0
  82. package/src/functions/isDifferent.ts +27 -0
  83. package/src/functions/isDomRuntime.ts +12 -0
  84. package/src/functions/isFilled.ts +49 -0
  85. package/src/functions/isFloat.ts +16 -0
  86. package/src/functions/isFunction.ts +11 -0
  87. package/src/functions/isInDom.ts +15 -0
  88. package/src/functions/isIntegerBetween.ts +11 -0
  89. package/src/functions/isNull.ts +11 -0
  90. package/src/functions/isNumber.ts +16 -0
  91. package/src/functions/isObject.ts +9 -0
  92. package/src/functions/isObjectNotArray.ts +11 -0
  93. package/src/functions/isSelected.ts +32 -0
  94. package/src/functions/isSelectedByList.ts +19 -0
  95. package/src/functions/isString.ts +9 -0
  96. package/src/functions/isWindow.ts +11 -0
  97. package/src/functions/random.ts +10 -0
  98. package/src/functions/replaceRecursive.ts +60 -0
  99. package/src/functions/replaceTemplate.ts +22 -0
  100. package/src/functions/secondToTime.ts +20 -0
  101. package/src/functions/setElementItem.ts +56 -0
  102. package/src/functions/setValues.ts +59 -0
  103. package/src/functions/splice.ts +59 -0
  104. package/src/functions/strFill.ts +12 -0
  105. package/src/functions/toArray.ts +19 -0
  106. package/src/functions/toCamelCase.ts +16 -0
  107. package/src/functions/toCamelCaseFirst.ts +12 -0
  108. package/src/functions/toDate.ts +44 -0
  109. package/src/functions/toKebabCase.ts +25 -0
  110. package/src/functions/toNumber.ts +35 -0
  111. package/src/functions/toNumberByMax.ts +33 -0
  112. package/src/functions/toPercent.ts +10 -0
  113. package/src/functions/toPercentBy100.ts +12 -0
  114. package/src/functions/transformation.ts +59 -0
  115. package/src/functions/uniqueArray.ts +9 -0
  116. package/src/functions/writeClipboardData.ts +17 -0
  117. package/src/library.ts +116 -0
  118. package/src/types/apiTypes.ts +143 -0
  119. package/src/types/basicTypes.ts +155 -0
  120. package/src/types/geoTypes.ts +109 -0
  121. package/src/types/metaTypes.ts +764 -0
  122. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,154 @@
1
+ import { MetaManager } from './MetaManager'
2
+
3
+ import { MetaTwitterCard, MetaTwitterTag } from '../types/metaTypes'
4
+
5
+ /**
6
+ * Class for working with Twitter Card meta tags.
7
+ *
8
+ * Класс для управления мета-тегами Twitter Card.
9
+ */
10
+ export class MetaTwitter extends MetaManager<MetaTwitterTag[]> {
11
+ constructor() {
12
+ super(Object.values(MetaTwitterTag))
13
+ }
14
+
15
+ /**
16
+ * Gets the Twitter Card type.
17
+ *
18
+ * Получает тип Twitter Card.
19
+ */
20
+ getCard(): MetaTwitterCard {
21
+ return this.get(MetaTwitterTag.card) as MetaTwitterCard
22
+ }
23
+
24
+ /**
25
+ * Gets the website or brand @username.
26
+ *
27
+ * Получает аккаунт сайта или бренда (@username).
28
+ */
29
+ getSite(): string {
30
+ return this.get(MetaTwitterTag.site)
31
+ }
32
+
33
+ /**
34
+ * Gets the content creator @username.
35
+ *
36
+ * Получает автора контента (@username).
37
+ */
38
+ getCreator(): string {
39
+ return this.get(MetaTwitterTag.creator)
40
+ }
41
+
42
+ /**
43
+ * Gets the page URL.
44
+ *
45
+ * Получает URL страницы.
46
+ */
47
+ getUrl(): string {
48
+ return this.get(MetaTwitterTag.url)
49
+ }
50
+
51
+ /**
52
+ * Gets the card title.
53
+ *
54
+ * Получает заголовок карточки.
55
+ */
56
+ getTitle(): string {
57
+ return this.get(MetaTwitterTag.title)
58
+ }
59
+
60
+ /**
61
+ * Gets the card description.
62
+ *
63
+ * Получает описание карточки.
64
+ */
65
+ getDescription(): string {
66
+ return this.get(MetaTwitterTag.description)
67
+ }
68
+
69
+ /**
70
+ * Gets the card image URL.
71
+ *
72
+ * Получает URL изображения карточки.
73
+ */
74
+ getImage(): string {
75
+ return this.get(MetaTwitterTag.image)
76
+ }
77
+
78
+ /**
79
+ * Sets the Twitter Card type.
80
+ *
81
+ * Устанавливает тип Twitter Card.
82
+ * @param card card type / тип карточки
83
+ */
84
+ setCard(card: MetaTwitterCard): this {
85
+ this.set(MetaTwitterTag.card, card)
86
+ return this
87
+ }
88
+
89
+ /**
90
+ * Sets the website or brand @username.
91
+ *
92
+ * Устанавливает аккаунт сайта или бренда (@username).
93
+ * @param site @username / аккаунт
94
+ */
95
+ setSite(site: string): this {
96
+ this.set(MetaTwitterTag.site, site)
97
+ return this
98
+ }
99
+
100
+ /**
101
+ * Sets the content creator @username.
102
+ *
103
+ * Устанавливает автора контента (@username).
104
+ * @param creator @username / аккаунт автора
105
+ */
106
+ setCreator(creator: string): this {
107
+ this.set(MetaTwitterTag.creator, creator)
108
+ return this
109
+ }
110
+
111
+ /**
112
+ * Sets the page URL.
113
+ *
114
+ * Устанавливает URL страницы.
115
+ * @param url URL / URL
116
+ */
117
+ setUrl(url: string): this {
118
+ this.set(MetaTwitterTag.url, url)
119
+ return this
120
+ }
121
+
122
+ /**
123
+ * Sets the card title.
124
+ *
125
+ * Устанавливает заголовок карточки.
126
+ * @param title title / заголовок
127
+ */
128
+ setTitle(title: string): this {
129
+ this.set(MetaTwitterTag.title, title)
130
+ return this
131
+ }
132
+
133
+ /**
134
+ * Sets the card description.
135
+ *
136
+ * Устанавливает описание карточки.
137
+ * @param description description / описание
138
+ */
139
+ setDescription(description: string): this {
140
+ this.set(MetaTwitterTag.description, description)
141
+ return this
142
+ }
143
+
144
+ /**
145
+ * Sets the card image URL.
146
+ *
147
+ * Устанавливает URL изображения карточки.
148
+ * @param image image URL / URL изображения
149
+ */
150
+ setImage(image: string): this {
151
+ this.set(MetaTwitterTag.image, image)
152
+ return this
153
+ }
154
+ }
@@ -0,0 +1,86 @@
1
+ import { createElement } from '../functions/createElement'
2
+
3
+ import { DataStorage } from './DataStorage'
4
+
5
+ /**
6
+ * Class for getting the scroll width.
7
+ *
8
+ * Класс для получения ширины скролла.
9
+ */
10
+ export class ScrollbarWidth {
11
+ private static storage = new DataStorage<number>('scrollbar', true)
12
+ private static calculate = false
13
+
14
+ /**
15
+ * Checks whether to enable scroll hiding.
16
+ *
17
+ * Проверяет, надо ли включить скрытие скролла.
18
+ */
19
+ static async is(): Promise<boolean> {
20
+ const width = await this.get()
21
+
22
+ return width !== -1 && width <= 8
23
+ }
24
+
25
+ /**
26
+ * Returns the width of the scroll.
27
+ *
28
+ * Возвращает ширину скролла.
29
+ */
30
+ static async get(): Promise<number> {
31
+ const width = this.storage.get() ?? -1
32
+
33
+ if (
34
+ !this.calculate
35
+ && width === -1
36
+ ) {
37
+ const newWidth = await this.init()
38
+
39
+ this.storage.set(newWidth)
40
+ return newWidth
41
+ }
42
+
43
+ return width
44
+ }
45
+
46
+ /**
47
+ * Creates elements to check the width of the scroll.
48
+ *
49
+ * Создает элементы для проверки ширины скролла.
50
+ */
51
+ private static createElement(): HTMLDivElement | undefined {
52
+ return createElement<HTMLDivElement>(document.body, 'div', (element) => {
53
+ element.style.height = '24px'
54
+ element.style.overflowY = 'scroll'
55
+ element.style.position = 'fixed'
56
+ element.style.width = '100%'
57
+
58
+ createElement(element, 'div', (element) => {
59
+ element.style.height = '100px'
60
+ })
61
+ })
62
+ }
63
+
64
+ /**
65
+ * Initialization of data to check the width of the scroll.
66
+ *
67
+ * Инициализация данных для проверки ширины скролла.
68
+ */
69
+ private static init(): Promise<number> {
70
+ return new Promise((resolve) => {
71
+ this.calculate = true
72
+ const element = this.createElement()
73
+
74
+ if (element) {
75
+ requestAnimationFrame(() => {
76
+ resolve(element.offsetWidth - element.clientWidth)
77
+
78
+ element.remove()
79
+ this.calculate = false
80
+ })
81
+ } else {
82
+ resolve(0)
83
+ }
84
+ })
85
+ }
86
+ }
@@ -0,0 +1,293 @@
1
+ import { applyTemplate } from '../functions/applyTemplate'
2
+ import { forEach } from '../functions/forEach'
3
+ import { isFilled } from '../functions/isFilled'
4
+ import { isString } from '../functions/isString'
5
+ import { toArray } from '../functions/toArray'
6
+
7
+ import { Api } from './Api'
8
+ import { Geo } from './Geo'
9
+
10
+ export type TranslateCode = string | string[]
11
+ export type TranslateList<T extends TranslateCode[]> = {
12
+ [K in T[number] as K extends readonly string[] ? K[0] : K]: string
13
+ }
14
+ export type TranslateItemOrList<T extends TranslateCode> = T extends string[] ? TranslateList<T> : string
15
+
16
+ /**
17
+ * Class for getting the translated text.
18
+ *
19
+ * Класс для получения переведенного текста.
20
+ */
21
+ export class Translate {
22
+ protected static url = '/api/translate'
23
+ protected static propsName = 'list'
24
+ protected static readonly data: Record<string, string> = {}
25
+
26
+ protected static cache: string[] = []
27
+ protected static resolveList: (() => void)[] = []
28
+ protected static timeout?: any
29
+
30
+ /**
31
+ * Getting the translation text by its code.
32
+ *
33
+ * Получение текста перевода по его коду.
34
+ * @param name code name/ название кода
35
+ * @param replacement If set, replaces the text with the specified values/ если установлено, заменяет текст на указанные значения
36
+ */
37
+ static async get(
38
+ name: string,
39
+ replacement?: string[] | Record<string, string | number>
40
+ ): Promise<string> {
41
+ const fullName = this.getName(name)
42
+
43
+ if (fullName in this.data) {
44
+ return this.replacement(this.data[fullName] as string, replacement)
45
+ }
46
+
47
+ if (!Api.isLocalhost()) {
48
+ await this.add(name)
49
+ }
50
+
51
+ return this.replacement(this.data?.[fullName] ?? name)
52
+ }
53
+
54
+ /**
55
+ * Getting the translation text by its code (Sync).
56
+ *
57
+ * Получение текста перевода по его коду (Sync).
58
+ * @param name code name/ название кода
59
+ * @param first If set to false, returns an empty string if there is no text/
60
+ * если установлено false, возвращает пустую строку, если нет текста
61
+ * @param replacement If set, replaces the text with the specified values/
62
+ * если установлено, заменяет текст на указанные значения
63
+ */
64
+ static getSync(
65
+ name: string,
66
+ first: boolean = false,
67
+ replacement?: string[] | Record<string, string | number>
68
+ ): string {
69
+ const fullName = this.getName(name)
70
+
71
+ if (fullName in this.data) {
72
+ return this.replacement(String(this.data[fullName]), replacement)
73
+ }
74
+
75
+ return first ? ' ' : name
76
+ }
77
+
78
+ /**
79
+ * Getting a list of translations by an array of text codes.
80
+ *
81
+ * Получение списка переводов по массиву кодов текста.
82
+ * @param names list of codes to get translations/ список кодов для получения переводов
83
+ */
84
+ static getList<T extends TranslateCode[]>(names: T): Promise<TranslateList<T>> {
85
+ return new Promise((resolve) => {
86
+ const list: Record<string, string> = {}
87
+ let end = 0
88
+
89
+ for (const name of names) {
90
+ const code = (Array.isArray(name) ? name[0] : name) as string
91
+ const replacement = Array.isArray(name) ? name.slice(1) : undefined
92
+
93
+ this.get(code, replacement)
94
+ .then((text) => {
95
+ list[code] = text
96
+
97
+ if (++end >= names.length) {
98
+ resolve(list as TranslateList<T>)
99
+ }
100
+ })
101
+ }
102
+ })
103
+ }
104
+
105
+ /**
106
+ * Getting a list of translations by an array of text codes.
107
+ *
108
+ * Получение списка переводов по массиву кодов текста.
109
+ * @param names list of codes to get translations/ список кодов для получения переводов
110
+ * @param first If set to false, returns an empty string if there is no text/
111
+ * если установлено false, возвращает пустую строку, если нет текста
112
+ */
113
+ static getListSync<T extends TranslateCode[]>(names: T, first: boolean = false): TranslateList<T> {
114
+ const list: Record<string, string> = {}
115
+
116
+ for (const name of names) {
117
+ const code = (Array.isArray(name) ? name[0] : name) as string
118
+ const replacement = Array.isArray(name) ? name.slice(1) : undefined
119
+
120
+ list[code] = this.getSync(code, first, replacement)
121
+ }
122
+
123
+ return list as TranslateList<T>
124
+ }
125
+
126
+ /**
127
+ * Added a list of translated texts.
128
+ *
129
+ * Добавлен список переведенных текстов.
130
+ * @param names list of codes to get translations/ список кодов для получения переводов
131
+ */
132
+ static add(names: string | string[]): Promise<void> {
133
+ return new Promise((resolve) => {
134
+ const list = this.getNamesNone(names)
135
+
136
+ if (list.length > 0) {
137
+ this.cache.push(...this.getNamesNone(names))
138
+ this.resolveList.push(resolve)
139
+
140
+ if (this.timeout) {
141
+ clearTimeout(this.timeout)
142
+ }
143
+
144
+ this.timeout = setTimeout(() => {
145
+ this.timeout = undefined
146
+ this.make().then(() => {
147
+ this.resolveList.forEach(resolve => resolve())
148
+ this.resolveList = []
149
+ })
150
+ }, 160)
151
+ } else {
152
+ resolve()
153
+ }
154
+ })
155
+ }
156
+
157
+ /**
158
+ * Adds texts in sync mode.
159
+ *
160
+ * Добавляет тексты в режиме синхронизации.
161
+ * @param data list of texts in the form of key-value/ список текстов в виде ключ-значение
162
+ */
163
+ static addSync(data: Record<string, string>): void {
164
+ forEach(data, (text, key) => {
165
+ if (
166
+ isString(text)
167
+ && isFilled(text)
168
+ ) {
169
+ this.data[this.getName(key)] = text
170
+ }
171
+ })
172
+ }
173
+
174
+ /**
175
+ * Adding data in the form of a query or directly, depending on the execution environment.
176
+ *
177
+ * Добавление данных в виде запроса или напрямую, в зависимости от среды выполнения.
178
+ * @param data list of texts in the form of key-value/ список текстов в виде ключ-значение
179
+ */
180
+ static async addNormalOrSync(data: Record<string, string>): Promise<void> {
181
+ if (isFilled(data)) {
182
+ if (Api.isLocalhost()) {
183
+ this.addSync(data)
184
+ } else {
185
+ const names = Object.keys(data)
186
+
187
+ if (names.length > 0) {
188
+ await this.add(names)
189
+ }
190
+ }
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Change the path to the script for obtaining the translation.
196
+ *
197
+ * Изменить путь к скрипту для получения перевода.
198
+ * @param url path to the script/ путь к скрипту
199
+ */
200
+ static setUrl(url: string): Translate {
201
+ this.url = url
202
+ return Translate
203
+ }
204
+
205
+ static setPropsName(name: string): Translate {
206
+ this.propsName = name
207
+ return this
208
+ }
209
+
210
+ /**
211
+ * Getting the full title for translation.
212
+ *
213
+ * Получение полного названия для перевода.
214
+ * @param name code name/ название кода
215
+ */
216
+ protected static getName(name: string): string {
217
+ return `${Geo.getLocation()}-${name}`
218
+ }
219
+
220
+ /**
221
+ * Returns a list of names that are not yet in the list.
222
+ *
223
+ * Возвращает список имен, которых еще нет в списке.
224
+ * @param names list of codes to get translations/ список кодов для получения переводов
225
+ */
226
+ protected static getNamesNone(names: string | string[]): string[] {
227
+ const data: string[] = []
228
+
229
+ toArray(names).forEach((name) => {
230
+ if (
231
+ name !== '__TRANSLATE_START__'
232
+ && name !== '__TRANSLATE_END__'
233
+ && !(this.getName(name) in this.data)
234
+ ) {
235
+ data.push(name)
236
+ }
237
+ })
238
+
239
+ return data
240
+ }
241
+
242
+ /**
243
+ * Getting the list of translations from the server.
244
+ *
245
+ * Получение списка переводов с сервера.
246
+ */
247
+ protected static async getResponse(): Promise<Record<string, string>> {
248
+ const data = (await Api.get<Record<string, string>>({
249
+ api: false,
250
+ path: this.url,
251
+ request: {
252
+ [this.propsName]: this.cache
253
+ },
254
+ toData: true,
255
+ global: true
256
+ }))
257
+
258
+ return data ?? {}
259
+ }
260
+
261
+ /**
262
+ * Replaces the text with the specified values.
263
+ *
264
+ * Заменяет текст на указанные значения.
265
+ * @param text text to replace/ текст для замены
266
+ * @param replacement values for replacement/ значения для замены
267
+ */
268
+ protected static replacement(
269
+ text: string,
270
+ replacement?: string[] | Record<string, string | number>
271
+ ): any {
272
+ if (replacement) {
273
+ return applyTemplate(text, replacement)
274
+ }
275
+
276
+ return text
277
+ }
278
+
279
+ /**
280
+ * Adding translation data from the server.
281
+ *
282
+ * Добавление данных по переводу с сервера.
283
+ */
284
+ protected static async make(): Promise<void> {
285
+ const list = await this.getResponse()
286
+
287
+ this.cache.forEach((name) => {
288
+ this.data[this.getName(name)] = list?.[name] ?? ''
289
+ })
290
+
291
+ this.cache = []
292
+ }
293
+ }