@ryuzaki13/react-foundation-lib 1.2.6 → 1.2.8
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/README.md +2 -1
- package/dist/array/index.js +1 -1
- package/dist/chunks/{array-BBSjoTRy.js → array-D-_yMMUK.js} +2 -2
- package/dist/chunks/{array-BBSjoTRy.js.map → array-D-_yMMUK.js.map} +1 -1
- package/dist/chunks/{formatters--mhLir82.js → formatters-CVj-3Vn0.js} +280 -269
- package/dist/chunks/formatters-CVj-3Vn0.js.map +1 -0
- package/dist/chunks/{odata-service-DnPlNGpU.js → odata-service-B5w4YBao.js} +13 -17
- package/dist/chunks/{odata-service-DnPlNGpU.js.map → odata-service-B5w4YBao.js.map} +1 -1
- package/dist/chunks/{validate-nWY_Mla5.js → validate-BzjCBUqb.js} +14 -18
- package/dist/chunks/{validate-nWY_Mla5.js.map → validate-BzjCBUqb.js.map} +1 -1
- package/dist/error-report/index.js +13 -13
- package/dist/excel/index.js +3 -3
- package/dist/excel/index.js.map +1 -1
- package/dist/formatters/index.js +6 -6
- package/dist/formatters/strings/formatRussianPlural.d.ts +25 -0
- package/dist/formatters/strings/formatRussianPlural.d.ts.map +1 -0
- package/dist/formatters/strings/index.d.ts +1 -0
- package/dist/formatters/strings/index.d.ts.map +1 -1
- package/dist/hooks/index.js +82 -81
- package/dist/hooks/index.js.map +1 -1
- package/dist/media/index.js +2 -1
- package/dist/media/index.js.map +1 -1
- package/dist/number-scale/index.js +1 -1
- package/dist/number-scale/index.js.map +1 -1
- package/dist/odata-service/index.js +1 -1
- package/dist/pwa/index.js +1 -1
- package/dist/pwa/index.js.map +1 -1
- package/dist/pwa/sw-cache-policy.js +3 -3
- package/dist/pwa/sw-cache-policy.js.map +1 -1
- package/dist/query-client/index.js +5 -5
- package/dist/query-client/index.js.map +1 -1
- package/dist/range-output/index.js +1 -1
- package/dist/range-output/index.js.map +1 -1
- package/dist/table/index.js +3 -3
- package/dist/table/index.js.map +1 -1
- package/dist/tree-table/index.js +1 -1
- package/package.json +33 -33
- package/src/docs/formatters.mdx +17 -0
- package/dist/chunks/formatters--mhLir82.js.map +0 -1
package/README.md
CHANGED
|
@@ -156,6 +156,7 @@ npm run pack:dry-run
|
|
|
156
156
|
|
|
157
157
|
| API | Поведение |
|
|
158
158
|
| ---------------------------------------------------- | --------------------------------------------------------------- |
|
|
159
|
+
| `selectRussianPluralForm`, `formatRussianPlural` | Выбирают русскую форму слова или форматируют её с количеством. |
|
|
159
160
|
| `normalizeText` | Возвращает trimmed непустую строку или `undefined`. |
|
|
160
161
|
| `normalizeTextWithFallback`, `normalizeRequiredText` | То же, но с fallback, по умолчанию `""`. |
|
|
161
162
|
| `normalizeTextToLower` | Trim + lowercase, пустое значение превращает в `""`. |
|
|
@@ -166,7 +167,7 @@ npm run pack:dry-run
|
|
|
166
167
|
| `startsWithIgnoringZeros` | Сравнение prefix без учета ведущих нулей и регистра. |
|
|
167
168
|
| `truncateText` | Trim + обрезка с `...`; пустой ввод дает `undefined`. |
|
|
168
169
|
|
|
169
|
-
Тесты: [`strings.test.ts`](./src/formatters/strings/strings.test.ts), [`normalizeText.test.ts`](./src/formatters/strings/normalizeText.test.ts).
|
|
170
|
+
Тесты: [`strings.test.ts`](./src/formatters/strings/strings.test.ts), [`normalizeText.test.ts`](./src/formatters/strings/normalizeText.test.ts), [`formatRussianPlural.test.ts`](./src/formatters/strings/formatRussianPlural.test.ts).
|
|
170
171
|
|
|
171
172
|
### Общие форматтеры
|
|
172
173
|
|
package/dist/array/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as e, c as t, d as n, f as r, h as i, i as a, l as o, m as s, n as c, o as l, p as u, r as d, s as f, t as p, u as m } from "../chunks/array-
|
|
1
|
+
import { a as e, c as t, d as n, f as r, h as i, i as a, l as o, m as s, n as c, o as l, p as u, r as d, s as f, t as p, u as m } from "../chunks/array-D-_yMMUK.js";
|
|
2
2
|
export { d as addUnique, a as appendMissingIds, e as arrayDeduplicate, l as arrayGroupBy, f as arrayGroupByToArray, t as arrayToMap, o as arrayUniqueBy, m as arraysEqual, n as filterAndDeduplicateIds, p as moveArrayItem, c as moveArrayItemByIndex, r as moveItem, u as normalizeObjects, s as normalizeStringArray, i as pickExistingMapValues };
|
|
@@ -49,7 +49,7 @@ function u(e, t) {
|
|
|
49
49
|
let n = /* @__PURE__ */ new Set();
|
|
50
50
|
return e.filter((e) => {
|
|
51
51
|
let r = String(e[t]);
|
|
52
|
-
return n.has(r)
|
|
52
|
+
return !n.has(r) && (n.add(r), !0);
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
function d(e) {
|
|
@@ -143,4 +143,4 @@ function S(e, t, n) {
|
|
|
143
143
|
//#endregion
|
|
144
144
|
export { e as _, d as a, t as b, c, f as d, g as f, n as g, m as h, p as i, u as l, v as m, x as n, s as o, _ as p, y as r, l as s, S as t, h as u, o as v, i as x, r as y };
|
|
145
145
|
|
|
146
|
-
//# sourceMappingURL=array-
|
|
146
|
+
//# sourceMappingURL=array-D-_yMMUK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-BBSjoTRy.js","names":[],"sources":["../../src/formatters/strings/normalizeText.ts","../../src/array/array.ts","../../src/array/reorder.ts"],"sourcesContent":["export function normalizeText(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nexport function normalizeTextWithFallback(value: unknown, fallback = \"\") {\n\treturn normalizeText(value) ?? fallback;\n}\n\nexport function normalizeRequiredText(value: unknown) {\n\treturn normalizeTextWithFallback(value);\n}\n\nexport function normalizeTextToLower(value: unknown): string {\n\tconst normalized = normalizeText(value);\n\treturn normalized ? normalized.toLowerCase() : \"\";\n}\n\nexport function toSafeString(value: unknown): string {\n\treturn value == null ? \"\" : String(value);\n}\n\nconst STRING_SPACES_PATTERN = /[\\s\\u00a0\\u202f]+/gu;\n\n/**\n * Нормализует пользовательский текст: убирает пробелы по краям\n * и сворачивает любые подряд идущие пробельные символы в один обычный пробел.\n */\nexport function normalizeTextSpaces(value: unknown): string {\n\treturn normalizeRequiredText(value).replace(STRING_SPACES_PATTERN, \" \");\n}\n","import { normalizeText } from \"../formatters/strings\";\n\nexport function arrayGroupBy<T>(array: readonly T[], key: keyof T): Record<string, T[]> {\n\treturn array.reduce<Record<string, T[]>>((acc, item) => {\n\t\tconst groupKey = String(item[key]);\n\t\t(acc[groupKey] ||= []).push(item);\n\t\treturn acc;\n\t}, {});\n}\n\nexport function arrayToMap<T>(array: readonly T[], key: keyof T): Record<string, T> {\n\treturn array.reduce<Record<string, T>>((acc, item) => {\n\t\tconst groupKey = String(item[key]);\n\t\tif (!acc[groupKey]) {\n\t\t\tacc[groupKey] = item;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nexport function arrayGroupByToArray<T>(array: readonly T[], key: keyof T): Array<{ key: string; items: T[] }> {\n\tconst grouped = array.reduce<Record<string, T[]>>((acc, item) => {\n\t\tconst groupKey = String(item[key]);\n\t\t(acc[groupKey] ||= []).push(item);\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.entries(grouped).map(([key, items]) => ({\n\t\tkey,\n\t\titems\n\t}));\n}\n\nexport function arrayUniqueBy<T>(array: readonly T[], key: keyof T): T[] {\n\tconst seen = new Set<string>();\n\treturn array.filter((item) => {\n\t\tconst value = String(item[key]);\n\t\tif (seen.has(value)) return false;\n\t\tseen.add(value);\n\t\treturn true;\n\t});\n}\n\n/**\n * Удаляет дубликаты из массива с сохранением первого вхождения.\n *\n * Нужна для нормализации списков примитивных значений перед передачей\n * в кеш-ключи, SQL-запросы и другие слои, где повторные элементы не несут смысла.\n */\nexport function arrayDeduplicate<T>(array: readonly T[]): T[] {\n\tconst out: T[] = [];\n\tconst seen = new Set<T>();\n\n\tfor (const item of array) {\n\t\tif (seen.has(item)) continue;\n\n\t\tseen.add(item);\n\t\tout.push(item);\n\t}\n\n\treturn out;\n}\n\n/**\n * Фильтрует массив идентификаторов: оставляет только присутствующие в `allowedIds`,\n * удаляет дубликаты, исключает пустые строки.\n *\n * Зачем: унификация нормализации пользовательских списков ID\n * (grouped columns, locked visible columns и т.п.) перед вычислением layout.\n */\nexport function filterAndDeduplicateIds<TId extends string>(ids: readonly string[] | undefined, allowedIds: readonly TId[]): TId[] {\n\tconst known = new Map<string, TId>(allowedIds.map((id) => [id, id]));\n\tconst out: TId[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const id of ids ?? []) {\n\t\tif (!id || seen.has(id)) continue;\n\t\tconst knownId = known.get(id);\n\t\tif (!knownId) continue;\n\t\tseen.add(id);\n\t\tout.push(knownId);\n\t}\n\n\treturn out;\n}\n\nexport function appendMissingIds<TId extends string>(baseIds: readonly TId[], idsToAppend: readonly TId[]): TId[] {\n\tconst out = [...baseIds];\n\tconst seen = new Set(baseIds);\n\n\tfor (const id of idsToAppend) {\n\t\tif (!id || seen.has(id)) continue;\n\t\tseen.add(id);\n\t\tout.push(id);\n\t}\n\n\treturn out;\n}\n\nexport function pickExistingMapValues<TKey, TValue>(keys: readonly TKey[], valuesByKey: ReadonlyMap<TKey, TValue>): TValue[] {\n\tconst out: TValue[] = [];\n\n\tfor (const key of keys) {\n\t\tconst value = valuesByKey.get(key);\n\n\t\tif (value !== undefined) {\n\t\t\tout.push(value);\n\t\t}\n\t}\n\n\treturn out;\n}\n\nexport function arraysEqual<T>(left: readonly T[], right: readonly T[]): boolean {\n\tif (left.length !== right.length) return false;\n\n\tfor (let index = 0; index < left.length; index++) {\n\t\tif (left[index] !== right[index]) return false;\n\t}\n\n\treturn true;\n}\n\nexport function moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n\tif (from === to) return [...items];\n\tif (from < 0 || to < 0 || from >= items.length || to >= items.length) return [...items];\n\n\tconst next = [...items];\n\tconst [item] = next.splice(from, 1);\n\tif (item === undefined) return [...items];\n\tnext.splice(to, 0, item);\n\n\treturn next;\n}\n\nexport function normalizeObjects<T, K extends keyof T, O = T>(\n\titems: readonly T[] | undefined,\n\tkey: K,\n\tcopyist?: ((item: T, key: T[K]) => O) | false\n): O[] | undefined {\n\tif (!items) return undefined;\n\n\tconst out: O[] = [];\n\tconst seen = new Set<T[K]>();\n\tconst copyFn = (() => {\n\t\tif (typeof copyist === \"boolean\" && copyist === false) {\n\t\t\treturn (item: T): O => item as unknown as O;\n\t\t}\n\t\tif (typeof copyist === \"function\") {\n\t\t\treturn copyist;\n\t\t}\n\t\treturn (item: T): O => ({ ...item }) as unknown as O;\n\t})();\n\n\tfor (const item of items) {\n\t\tconst normalizedKey = normalizeText(item[key]) as T[K];\n\t\tif (!normalizedKey || seen.has(normalizedKey)) continue;\n\t\tseen.add(normalizedKey);\n\t\tout.push(copyFn(item, normalizedKey));\n\t}\n\n\treturn out.length ? out : undefined;\n}\n\nexport function normalizeStringArray(items: readonly string[] | undefined): string[] | undefined {\n\tif (!items?.length) return undefined;\n\n\tconst out: string[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const item of items) {\n\t\tconst value = item.trim();\n\t\tif (!value || seen.has(value)) continue;\n\n\t\tseen.add(value);\n\t\tout.push(value);\n\t}\n\n\treturn out.length ? out : undefined;\n}\n\nexport function addUnique(target: string[], seen: Set<string>, fieldId: string | undefined): void {\n\tconst normalizedId = fieldId?.trim();\n\tif (!normalizedId || seen.has(normalizedId)) return;\n\tseen.add(normalizedId);\n\ttarget.push(normalizedId);\n}\n","export type ReorderAction = \"start\" | \"end\" | \"up\" | \"down\";\n\nfunction resolveTargetIndex(args: { index: number; size: number; action: ReorderAction }): number {\n\tconst { index, size, action } = args;\n\n\tswitch (action) {\n\t\tcase \"start\":\n\t\t\treturn 0;\n\t\tcase \"end\":\n\t\t\treturn size - 1;\n\t\tcase \"up\":\n\t\t\treturn index - 1;\n\t\tcase \"down\":\n\t\t\treturn index + 1;\n\t}\n}\n\n/**\n * Перемещает элемент списка по одному из предопределённых действий.\n */\nexport function moveArrayItemByIndex<T>(items: readonly T[], index: number, action: ReorderAction): T[] {\n\tconst nextItems = [...items];\n\tif (index < 0 || index >= nextItems.length) return nextItems;\n\n\tconst targetIndex = resolveTargetIndex({\n\t\tindex,\n\t\tsize: nextItems.length,\n\t\taction\n\t});\n\tif (targetIndex < 0 || targetIndex >= nextItems.length || targetIndex === index) return nextItems;\n\n\tconst [item] = nextItems.splice(index, 1);\n\n\tif (item === undefined) return nextItems;\n\n\tnextItems.splice(targetIndex, 0, item);\n\treturn nextItems;\n}\n\n/**\n * Перемещает элемент списка из одного индекса в другой.\n */\nexport function moveArrayItem<T>(items: readonly T[], fromIndex: number, toIndex: number): T[] {\n\tconst nextItems = [...items];\n\n\tif (fromIndex < 0 || fromIndex >= nextItems.length || toIndex < 0 || toIndex >= nextItems.length || fromIndex === toIndex) {\n\t\treturn nextItems;\n\t}\n\n\tconst [item] = nextItems.splice(fromIndex, 1);\n\n\tif (item === undefined) {\n\t\treturn nextItems;\n\t}\n\n\tnextItems.splice(toIndex, 0, item);\n\treturn nextItems;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"array-D-_yMMUK.js","names":[],"sources":["../../src/formatters/strings/normalizeText.ts","../../src/array/array.ts","../../src/array/reorder.ts"],"sourcesContent":["export function normalizeText(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nexport function normalizeTextWithFallback(value: unknown, fallback = \"\") {\n\treturn normalizeText(value) ?? fallback;\n}\n\nexport function normalizeRequiredText(value: unknown) {\n\treturn normalizeTextWithFallback(value);\n}\n\nexport function normalizeTextToLower(value: unknown): string {\n\tconst normalized = normalizeText(value);\n\treturn normalized ? normalized.toLowerCase() : \"\";\n}\n\nexport function toSafeString(value: unknown): string {\n\treturn value == null ? \"\" : String(value);\n}\n\nconst STRING_SPACES_PATTERN = /[\\s\\u00a0\\u202f]+/gu;\n\n/**\n * Нормализует пользовательский текст: убирает пробелы по краям\n * и сворачивает любые подряд идущие пробельные символы в один обычный пробел.\n */\nexport function normalizeTextSpaces(value: unknown): string {\n\treturn normalizeRequiredText(value).replace(STRING_SPACES_PATTERN, \" \");\n}\n","import { normalizeText } from \"../formatters/strings\";\n\nexport function arrayGroupBy<T>(array: readonly T[], key: keyof T): Record<string, T[]> {\n\treturn array.reduce<Record<string, T[]>>((acc, item) => {\n\t\tconst groupKey = String(item[key]);\n\t\t(acc[groupKey] ||= []).push(item);\n\t\treturn acc;\n\t}, {});\n}\n\nexport function arrayToMap<T>(array: readonly T[], key: keyof T): Record<string, T> {\n\treturn array.reduce<Record<string, T>>((acc, item) => {\n\t\tconst groupKey = String(item[key]);\n\t\tif (!acc[groupKey]) {\n\t\t\tacc[groupKey] = item;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nexport function arrayGroupByToArray<T>(array: readonly T[], key: keyof T): Array<{ key: string; items: T[] }> {\n\tconst grouped = array.reduce<Record<string, T[]>>((acc, item) => {\n\t\tconst groupKey = String(item[key]);\n\t\t(acc[groupKey] ||= []).push(item);\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.entries(grouped).map(([key, items]) => ({\n\t\tkey,\n\t\titems\n\t}));\n}\n\nexport function arrayUniqueBy<T>(array: readonly T[], key: keyof T): T[] {\n\tconst seen = new Set<string>();\n\treturn array.filter((item) => {\n\t\tconst value = String(item[key]);\n\t\tif (seen.has(value)) return false;\n\t\tseen.add(value);\n\t\treturn true;\n\t});\n}\n\n/**\n * Удаляет дубликаты из массива с сохранением первого вхождения.\n *\n * Нужна для нормализации списков примитивных значений перед передачей\n * в кеш-ключи, SQL-запросы и другие слои, где повторные элементы не несут смысла.\n */\nexport function arrayDeduplicate<T>(array: readonly T[]): T[] {\n\tconst out: T[] = [];\n\tconst seen = new Set<T>();\n\n\tfor (const item of array) {\n\t\tif (seen.has(item)) continue;\n\n\t\tseen.add(item);\n\t\tout.push(item);\n\t}\n\n\treturn out;\n}\n\n/**\n * Фильтрует массив идентификаторов: оставляет только присутствующие в `allowedIds`,\n * удаляет дубликаты, исключает пустые строки.\n *\n * Зачем: унификация нормализации пользовательских списков ID\n * (grouped columns, locked visible columns и т.п.) перед вычислением layout.\n */\nexport function filterAndDeduplicateIds<TId extends string>(ids: readonly string[] | undefined, allowedIds: readonly TId[]): TId[] {\n\tconst known = new Map<string, TId>(allowedIds.map((id) => [id, id]));\n\tconst out: TId[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const id of ids ?? []) {\n\t\tif (!id || seen.has(id)) continue;\n\t\tconst knownId = known.get(id);\n\t\tif (!knownId) continue;\n\t\tseen.add(id);\n\t\tout.push(knownId);\n\t}\n\n\treturn out;\n}\n\nexport function appendMissingIds<TId extends string>(baseIds: readonly TId[], idsToAppend: readonly TId[]): TId[] {\n\tconst out = [...baseIds];\n\tconst seen = new Set(baseIds);\n\n\tfor (const id of idsToAppend) {\n\t\tif (!id || seen.has(id)) continue;\n\t\tseen.add(id);\n\t\tout.push(id);\n\t}\n\n\treturn out;\n}\n\nexport function pickExistingMapValues<TKey, TValue>(keys: readonly TKey[], valuesByKey: ReadonlyMap<TKey, TValue>): TValue[] {\n\tconst out: TValue[] = [];\n\n\tfor (const key of keys) {\n\t\tconst value = valuesByKey.get(key);\n\n\t\tif (value !== undefined) {\n\t\t\tout.push(value);\n\t\t}\n\t}\n\n\treturn out;\n}\n\nexport function arraysEqual<T>(left: readonly T[], right: readonly T[]): boolean {\n\tif (left.length !== right.length) return false;\n\n\tfor (let index = 0; index < left.length; index++) {\n\t\tif (left[index] !== right[index]) return false;\n\t}\n\n\treturn true;\n}\n\nexport function moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n\tif (from === to) return [...items];\n\tif (from < 0 || to < 0 || from >= items.length || to >= items.length) return [...items];\n\n\tconst next = [...items];\n\tconst [item] = next.splice(from, 1);\n\tif (item === undefined) return [...items];\n\tnext.splice(to, 0, item);\n\n\treturn next;\n}\n\nexport function normalizeObjects<T, K extends keyof T, O = T>(\n\titems: readonly T[] | undefined,\n\tkey: K,\n\tcopyist?: ((item: T, key: T[K]) => O) | false\n): O[] | undefined {\n\tif (!items) return undefined;\n\n\tconst out: O[] = [];\n\tconst seen = new Set<T[K]>();\n\tconst copyFn = (() => {\n\t\tif (typeof copyist === \"boolean\" && copyist === false) {\n\t\t\treturn (item: T): O => item as unknown as O;\n\t\t}\n\t\tif (typeof copyist === \"function\") {\n\t\t\treturn copyist;\n\t\t}\n\t\treturn (item: T): O => ({ ...item }) as unknown as O;\n\t})();\n\n\tfor (const item of items) {\n\t\tconst normalizedKey = normalizeText(item[key]) as T[K];\n\t\tif (!normalizedKey || seen.has(normalizedKey)) continue;\n\t\tseen.add(normalizedKey);\n\t\tout.push(copyFn(item, normalizedKey));\n\t}\n\n\treturn out.length ? out : undefined;\n}\n\nexport function normalizeStringArray(items: readonly string[] | undefined): string[] | undefined {\n\tif (!items?.length) return undefined;\n\n\tconst out: string[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const item of items) {\n\t\tconst value = item.trim();\n\t\tif (!value || seen.has(value)) continue;\n\n\t\tseen.add(value);\n\t\tout.push(value);\n\t}\n\n\treturn out.length ? out : undefined;\n}\n\nexport function addUnique(target: string[], seen: Set<string>, fieldId: string | undefined): void {\n\tconst normalizedId = fieldId?.trim();\n\tif (!normalizedId || seen.has(normalizedId)) return;\n\tseen.add(normalizedId);\n\ttarget.push(normalizedId);\n}\n","export type ReorderAction = \"start\" | \"end\" | \"up\" | \"down\";\n\nfunction resolveTargetIndex(args: { index: number; size: number; action: ReorderAction }): number {\n\tconst { index, size, action } = args;\n\n\tswitch (action) {\n\t\tcase \"start\":\n\t\t\treturn 0;\n\t\tcase \"end\":\n\t\t\treturn size - 1;\n\t\tcase \"up\":\n\t\t\treturn index - 1;\n\t\tcase \"down\":\n\t\t\treturn index + 1;\n\t}\n}\n\n/**\n * Перемещает элемент списка по одному из предопределённых действий.\n */\nexport function moveArrayItemByIndex<T>(items: readonly T[], index: number, action: ReorderAction): T[] {\n\tconst nextItems = [...items];\n\tif (index < 0 || index >= nextItems.length) return nextItems;\n\n\tconst targetIndex = resolveTargetIndex({\n\t\tindex,\n\t\tsize: nextItems.length,\n\t\taction\n\t});\n\tif (targetIndex < 0 || targetIndex >= nextItems.length || targetIndex === index) return nextItems;\n\n\tconst [item] = nextItems.splice(index, 1);\n\n\tif (item === undefined) return nextItems;\n\n\tnextItems.splice(targetIndex, 0, item);\n\treturn nextItems;\n}\n\n/**\n * Перемещает элемент списка из одного индекса в другой.\n */\nexport function moveArrayItem<T>(items: readonly T[], fromIndex: number, toIndex: number): T[] {\n\tconst nextItems = [...items];\n\n\tif (fromIndex < 0 || fromIndex >= nextItems.length || toIndex < 0 || toIndex >= nextItems.length || fromIndex === toIndex) {\n\t\treturn nextItems;\n\t}\n\n\tconst [item] = nextItems.splice(fromIndex, 1);\n\n\tif (item === undefined) {\n\t\treturn nextItems;\n\t}\n\n\tnextItems.splice(toIndex, 0, item);\n\treturn nextItems;\n}\n"],"mappings":"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"}
|