From 8905e3c21161b2c8eb0094108fe00e3bc282545c Mon Sep 17 00:00:00 2001 From: Dunqing Date: Wed, 26 Oct 2022 00:02:30 +0800 Subject: [PATCH] feat(file-manager): support tencent cos (#958) * feat: support tencent cos * feat: normalize * chore: update env example * test: add cos * Revert "feat: normalize" This reverts commit 371880013c20b4cb4174ffaa15e0157acc5306c3. * feat: normalize * feat: tengxun to tencent * chore: fix missing deps * fix: locale * fix: locale cos --- .env.example | 7 + packages/core/client/src/locale/en_US.ts | 1 + packages/core/client/src/locale/ja_JP.ts | 1 + packages/core/client/src/locale/ru_RU.ts | 1119 +++++++++-------- packages/core/client/src/locale/zh_CN.ts | 1 + packages/plugins/file-manager/package.json | 2 + .../src/client/schemas/storage.ts | 1 + .../server/__tests__/storages/tx-cos.test.ts | 69 + .../file-manager/src/server/constants.ts | 1 + .../file-manager/src/server/storages/index.ts | 4 +- .../src/server/storages/tx-cos.ts | 27 + yarn.lock | 107 +- 12 files changed, 775 insertions(+), 565 deletions(-) create mode 100644 packages/plugins/file-manager/src/server/__tests__/storages/tx-cos.test.ts create mode 100644 packages/plugins/file-manager/src/server/storages/tx-cos.ts diff --git a/.env.example b/.env.example index 7d1b19a85..4b2fb40e7 100644 --- a/.env.example +++ b/.env.example @@ -52,6 +52,13 @@ ALI_OSS_ACCESS_KEY_ID= ALI_OSS_ACCESS_KEY_SECRET= ALI_OSS_BUCKET= +# Tencent COS STORAGE +TX_COS_STORAGE_BASE_URL= +TX_COS_REGION=ap-guangzhou +TX_COS_SECRET_ID= +TX_COS_SECRET_KEY= +TX_COS_BUCKET= + # AWS AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= diff --git a/packages/core/client/src/locale/en_US.ts b/packages/core/client/src/locale/en_US.ts index 62a3015e3..99a052af8 100644 --- a/packages/core/client/src/locale/en_US.ts +++ b/packages/core/client/src/locale/en_US.ts @@ -413,6 +413,7 @@ export default { "Use the built-in static file server": "Use the built-in static file server", "Local storage": "Local storage", "Aliyun OSS": "Aliyun OSS", + "Tencent COS": "Tencent COS", "Amazon S3": "Amazon S3", "Workflow": "Workflow", "Execution History": "Execution History", diff --git a/packages/core/client/src/locale/ja_JP.ts b/packages/core/client/src/locale/ja_JP.ts index 546946cc9..465f25bd0 100644 --- a/packages/core/client/src/locale/ja_JP.ts +++ b/packages/core/client/src/locale/ja_JP.ts @@ -413,6 +413,7 @@ export default { "Use the built-in static file server": "組み込みの静的ファイル サービスを使用する", "Local storage": "ローカルストレージ", "Aliyun OSS": "Aliyun OSS", + "Tencent COS": "Tencent COS", "Amazon S3": "Amazon S3", "Workflow": "ワークフロー", "Execution History": "実行履歴", diff --git a/packages/core/client/src/locale/ru_RU.ts b/packages/core/client/src/locale/ru_RU.ts index 8978d333c..9c33e3779 100644 --- a/packages/core/client/src/locale/ru_RU.ts +++ b/packages/core/client/src/locale/ru_RU.ts @@ -1,559 +1,560 @@ -export default { - "Display <1><0>10<1>20<2>50<3>100 items per page": "Показать <1><0>10<1>20<2>50<3>100 элементов на странице", - "Meet <1><0>All<1>Any conditions in the group": "Выполнить <1><0>Все<1>Любое условия в группе", - "Open in<1><0>Modal<1>Drawer<2>Window": "Открыть в<1><0>Модальное окно<1>Ящик<2>Окно", - "{{count}} filter items": "{{count}} отфильтровано элементов", - "{{count}} more items": "{{count}} больше элементов", - "Total {{count}} items": "Всего {{count}} элементов", - "Today": "Сегодня", - "Month": "Месяц", - "Week": "Неделя", - "Work week": "Рабочая неделя", - "Day": "День", - "Agenda": "Расписание", - "Date": "Дата", - "Time": "Время", - "Event": "Событие", - "None": "Ничего", - "System settings": "Системные настройки", - "System title": "Системный заголовок", - "Logo": "Логотип", - "Add menu item": "Добавить элемент меню", - "Page": "Страница", - "Name": "Имя", - "Icon": "Иконка", - "Group": "Группа", - "Link": "Ссылка", - "Save conditions": "Сохранить условия", - "Edit menu item": "Изменить пункт меню", - "Move to": "Перенести", - "Insert left": "Вставить слева", - "Insert right": "Вставить справа", - "Insert inner": "Вставить внутрь", - "Delete": "Удалить", - "UI editor": "UI редактор", - "Collection": "Коллекция", - "Collections & Fields": "Коллекции & Поля", - "Roles & Permissions": "Роли & Разрешения", - "Edit profile": "Изменить профиль", - "Change password": "Сменить пароль", - "Old password": "Старый пароль", - "New password": "Новый пароль", - "Switch role": "Сменить роль", - "Super admin": "Супер админ", - "Language": "Язык", - "Allow sign up": "Разрешить регистрацию", - "Sign out": "Выйти", - "Cancel": "Отмена", - "Submit": "Отправить", - "Close": "Закрыть", - "Set the data scope": "Установить область данных", - "Data blocks": "Блоки данных", - "Table": "Таблица", - "Form": "Форма", - "Select data source": "Выбрать источник данных", - "Calendar": "Календарь", - "Kanban": "Канбан", - "Select grouping field": "Выбрать поле группировки", - "Media": "Медиа", - "Markdown": "Markdown", - "Wysiwyg": "Wysiwyg", - "Chart blocks": "Блоки диаграммы", - "Column chart": "Колонки", - "Bar chart": "Столбики", - "Line chart": "Линейная", - "Pie chart": "Круговая", - "Area chart": "Область", - "Other chart": "Другая диаграмма", - "Other blocks": "Другие блоки", - "In configuration": "В конфигурации", - "Chart title": "Заголовок диаграммы", - "Chart type": "Тип диаграммы", - "Chart config": "Конфиг. диаграммы", - "Templates": "Шаблоны", - "Select template": "Выбрать шаблон", - "Action logs": "Журналы действий", - "Create template": "Создать шаблон", - "Edit markdown": "Редактировать markdown", - "Add block": "Добавить блок", - "Add new": "Добавить новый", - "Add record": "Зобавить запись", - "Custom field display name": "Отображаемое имя поля пользователя", - "Display fields": "Показать поля", - "Edit record": "Изменить запись", - "Delete menu item": "Удалить пункт меню", - "Add page": "Добавить страницу", - "Add group": "Добавить группу", - "Add link": "Добавить ссылку", - "Insert above": "Вставить выше", - "Insert below": "Вставить ниже", - "Save": "Сохранить", - "Delete block": "Удалить блок", - "Are you sure you want to delete it?": "Вы уверены, что хотите удалить это?", - "This is a demo text, **supports Markdown syntax**.": "Это демо текст, **поддерживает синтаксис Markdown**.", - "Filter": "Фильтр", - "Action type": "Тип действия", - "Actions": "Действия", - "Insert": "Вставить", - "Update": "Обновить", - "View": "Вид", - "View record": "Показать запись", - "Refresh": "Обновить", - "Data changes": "Изменения данных", - "Field name": "Имя поля", - "Before change": "До изменений", - "After change": "После изменений", - "Delete record": "Удалить запись", - "Create collection": "Создать Коллекцию", - "Collection display name": "Отображение имени Коллекции", - "Collection name": "Имя Коллекции", - "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "Случайно сгенерированный и может быть изменен. Поддерживает буквы, цифры и подчеркивания, должно начинаться с буквы.", - "Storage type": "Тип Хранилища", - "Edit": "Изменить", - "Edit collection": "Изменить Коллекцию", - "Configure fields": "Конфигурировать поля", - "Configure columns": "Конфигурировать колонки", - "Edit field": "Изменить поле", - "Configure fields of {{title}}": "Конфигурировать поле {{title}}", - "Basic": "Базовый", - "Single line text": "Текстовая строка", - "Long text": "Текстовое поле", - "Phone": "Телефон", - "Email": "Email", - "Number": "Число", - "Integer": "Целое", - "Percent": "Процент", - "Password": "Пароль", - "Formula": "Формула", - "Formula description": "Вычисляет значение на базе значений других полей той же записи.", - "Choices": "Выбор", - "Checkbox": "Чекбокс", - "Single select": "Одиночный выбор", - "Multiple select": "Множественный выбор", - "Radio group": "Радио группа", - "Checkbox group": "Чекбокс группа", - "China region": "Китай регион", - "Attachment": "Вложение", - "Date & Time": "Дата & Время", - "Datetime": "Датавремя", - "Relation": "Связь", - "Link to": "Ссылка на", - "Link to description": "Используется для быстрого создания связей коллекций и совместим с наиболее распространенными сценариями. Подходит для использования не разработчиками. Когда он присутствует в виде поля, это раскрывающийся список, используемый для выбора записей из целевой коллекции. После создания он одновременно генерирует связанные поля текущей коллекции в целевой коллекции.", - "Sub-table": "Подтаблица", - "System info": "Системная инфо", - "Created at": "Когда создано", - "Last updated at": "Когда изменено", - "Created by": "Кто создал", - "Last updated by": "Кто изменил", - "Add field": "Добавить поле", - "Field display name": "Отображаемое имя поля", - "Field type": "Тип поля", - "Field interface": "Интерфейс поля", - "Date format": "Формат даты", - "Year/Month/Day": "Год/Месяц/День", - "Year-Month-Day": "Год-Месяц-День", - "Day/Month/Year": "День/Месяц/Год", - "Show time": "Показать время", - "Time format": "Фрмат времени", - "12 hour": "12 час", - "24 hour": "24 час", - "Relationship type": "Тип отношений", - "Source collection": "Исходная коллекция", - "Source key": "Исходный ключ", - "Target collection": "Целевая коллекция", - "Through collection": "Через коллекцию", - "Target key": "Целевой ключ", - "Foreign key": "Внешний ключ", - "One to one": "Один к одному", - "One to many": "Один ко многим", - "Many to one": "Многие к одному", - "Many to many": "Многие ко многим", - "One to one description": "Используется для создания отношений один к одному. Например, у пользователя есть профиль.", - "One to many description": "Используется для создания отношения «один ко многим». Например, в стране может быть много городов, а город может находиться только в одной стране. Когда он присутствует в виде поля, это подтаблица, в которой отображаются записи связанной коллекции. При создании поле «многие к одному» автоматически создается в связанной коллекции.", - "Many to one description": "Используется для создания отношений «многие к одному». Например, город может принадлежать только одной стране, а в стране может быть много городов. Когда он присутствует в виде поля, это раскрывающийся список, используемый для выбора записи из связанной коллекции. После создания поле «один ко многим» автоматически создается в связанной коллекции.", - "Many to many description": "Используется для создания отношений «многие ко многим». Например, у ученика будет много учителей, а у учителя будет много учеников. Когда он присутствует в виде поля, это раскрывающийся список, используемый для выбора записей из связанной коллекции.", - "Foreign key 1": "Внешний ключ 1", - "Foreign key 2": "Внешний ключ 2", - "Add filter": "Добавить фильтр", - "Add filter group": "Добавить группу фильтров", - "is": "соответствует", - "is not": "не соответствует", - "is variable": "это переменная", - "contains": "содержит", - "does not contain": "не содержит", - "starts with": "начинается с", - "not starts with": "не начинается с", - "ends with": "оканчивается на", - "not ends with": "не оканчивается на", - "is empty": "пустое", - "is not empty": "не пустое", - "Edit chart": "Изменить диаграмму", - "Add text": "Добавить текст", - "Filterable fields": "Фильтруемые поля", - "Edit button": "Изменить кнопку", - "Hide": "Скрыть", - "Enable actions": "Разрешить действия", - "Export": "Экспортировать", - "Customize": "Настроить", - "Function": "Функция", - "Popup form": "Всплывающая форма", - "Flexible popup": "Гибкое всплывающее окно", - "Configure actions": "Настройка действий", - "Display order number": "Показать порядковые номера", - "Enable drag and drop sorting": "Разрешить сортировку перетаскиванием", - "Triggered when the row is clicked": "Срабатывает при нажатии на строку", - "Add tab": "Добавить вкладку", - "Disable tabs": "Запретить вкладки", - "Details": "Подробности", - "Edit tab": "Изменить вкладку", - "Relationship blocks": "Блоки отношений", - "Select record": "Выбрать запись", - "Display name": "Показать имя", - "Select icon": "Выбрать иконку", - "Custom column name": "Пользовательское имя колонки", - "Edit description": "Изменить описание", - "Required": "Обязательное", - "Label field": "Метка поля", - "Default is the ID field": "По умолчанию это поле ID", - "Set default sorting rules": "Установить правила сортировки по умолчанию", - "is before": "находится до", - "is after": "находится после", - "is on or after": "находится на или после", - "is on or before": "находится на или до", - "Upload": "Закачать", - "Select level": "Выберите уровень", - "Province": "Область", - "City": "Город", - "Area": "Район", - "Street": "Улица", - "Village": "Деревня", - "Must select to the last level": "Нужно выбрать до последнего уровня", - "Move {{title}} to": "Переместить {{title}} на", - "Target position": "Целевая позиция", - "After": "После", - "Before": "До", - "Add {{type}} before \"{{title}}\"": "Добавить {{type}} до \"{{title}}\"", - "Add {{type}} after \"{{title}}\"": "Добавить {{type}} после \"{{title}}\"", - "Add {{type}} in \"{{title}}\"": "Добавить {{type}} в \"{{title}}\"", - "Original name": "Оригинальное имя", - "Custom name": "Пользовательское имя", - "Custom Title": "Пользовательский Заголовок", - "Options": "Опции", - "Option value": "Значение опции", - "Option label": "Метка опции", - "Color": "Цвет", - "Add option": "Добавить опцию", - "Related collection": "Связанная коллекция", - "Allow linking to multiple records": "Позволить прилинковать много записей", - "Allow uploading multiple files": "Позволить загружать много файлов", - "Configure calendar": "Настроить календарь", - "Title field": "Поле заголовка", - "Start date field": "Поле даты начала", - "End date field": "Поле даты окончания", - "Navigate": "Навигация", - "Title": "Заголовок", - "Select view": "Выбрать вид", - "Reset": "Сбросить", - "Exportable fields": "Экспортируемые поля", - "Saved successfully": "Успешно сохранено", - "Nickname": "Никнейм", - "Sign in": "Войти", - "Create an account": "Создать аккаунт", - "Sign up": "Зарегистрироваться", - "Confirm password": "Подтвердить пароль", - "Log in with an existing account": "Войти в существующий аккаунт", - "Signed up successfully. It will jump to the login page.": "Успешно зарегистрировано. Вы будете перенаправлены на страницу входа.", - "Password mismatch": "Пароли не совпадают", - "Users": "Пользователи", - "Roles": "Роли", - "Add role": "Добавить роль", - "Role name": "Имя роли", - "Configure": "Настроить", - "Configure permissions": "Настроить разрешения", - "Edit role": "Изменить роль", - "Action permissions": "Разрешения на действия", - "Menu permissions": "Разрешения на Меню", - "Menu item name": "Название пункта Меню", - "Allow access": "Разрешить доступ", - "Action name": "Название действия", - "Allow action": "Разрешить действия", - "Action scope": "Область действий", - "Operate on new data": "Работать с новыми данными", - "Operate on existing data": "Работать с существующими данными", - "Yes": "Да", - "No": "Нет", - "Red": "Красный", - "Magenta": "Сиреневый", - "Volcano": "Вулканический", - "Orange": "Оранжевый", - "Gold": "Золотой", - "Lime": "Лайм", - "Green": "Зеленый", - "Cyan": "Голубой", - "Blue": "Синий", - "Geek Blue": "Тёмно-синий", - "Purple": "Фиолетовый", - "Default": "По умолчанию", - "Add card": "Добавить карточку", - "edit title": "изменить заголовок", - "Turn pages": "Перелистывать страницы", - "Others": "Другие", - "Save as template": "Сохранить как шаблон", - "Block templates": "Шаблоны Блока", - "Convert reference to duplicate": "Преобразовать ссылку в дубликат", - "Template name": "Имя Шаблона", - "Block type": "Тип Блока", - "Action column": "Колонка действий", - "Records per page": "Записей на страницу", - "(Fields only)": "(Только поля)", - "Button title": "Имя кнопки", - "Button icon": "Иконка кнопки", - "Submitted successfully": "Успешно отправлено", - "Operation succeeded": "Операция прошла успешно", - "Operation failed": "Операция не удалась", - "Open mode": "Открытый режим", - "Menu item title": "Заголовок пункта Меню", - "Menu item icon": "Иконка пункта Меню", - "Target": "Цель", - "Position": "Положение", - "Insert before": "Вставить до", - "Insert after": "Вставить после", - "UI Editor": "UI Редактор", - "ASC": "по возр.", - "DESC": "по убыв.", - "Add sort field": "Добавить поле сортировки", - "ID": "ID", - "Drawer": "Ящик", - "Dialog": "Диалог", - "Delete action": "Удалить действие", - "Custom column title": "Пользовательский заголовок колонки", - "Original title: ": "Заголовок по умолчанию: ", - "Delete table column": "Удалить колонку таблицы", - "Skip required validation": "Пропустить обязатеьную проверку", - "Form values": "Значения формы", - "Fields values": "Значения полей", - "When submitting the following fields, the saved values are": "При отправке следующих полей, сохраненные значения такие", - "After successful submission": "После удачной отправки", - "Then": "Затем", - "Stay on current page": "Оставаться на текущей странице", - "Redirect to": "Перенаправить на", - "Save action": "Сохранить действие", - "Exists": "Существуют", - "Filename": "Имя файла", - "Add condition": "Добавить правило", - "Add condition group": "Добавить группу правил", - "exists": "существуют", - "not exists": "не существуют", - "is current logged-in user": "текущий пользователь", - "=": "=", - "≠": "≠", - ">": ">", - "≥": "≥", - "<": "<", - "≤": "≤", - "Role UID": "UID Роли", - "Precision": "Точность", - "Formula mode": "Режим формулы", - "Expression": "Переменная", - "Input +, -, *, /, ( ) to calculate, input @ to open field variables.": "Введите +, -, *, /, ( ) для вычисления, введите @ чтобы открыть переменные поля.", - "Formula error.": "Ошибка формулы.", - "Accept": "Подтвердить", - "Rich Text": "Rich Text", - "Junction collection": "Коллекция Узлов", - "Leave it blank, unless you need a custom intermediate table": "Оставьте это поле пустым, если вам не нужна пользовательская промежуточная таблица.", - "Fields": "Поля", - "Edit field title": "Изменить заголовок поля", - "Field title": "Заголовок поля", - "Original field title: ": "Оригинальный заголовок поля: ", - "Edit tooltip": "Изменить подсказку", - "Delete field": "Удалить поле", - "Select collection": "Выбрать коллекцию", - "Blank block": "Пустой блок", - "Duplicate template": "Дублировать шаблон", - "Reference template": "Справочный шаблон", - "Create calendar block": "Создать блок календаря", - "Create kanban block": "Создать блок Канбан", - "Grouping field": "Поле группировки", - "Tab name": "Имя вкладки", - "Current record blocks": "Блоки текущей записи", - "Popup message": "Всплывающее сообщение", - "Delete role": "Удалить роль", - "Role display name": "Имя роли на экране", - "Default role": "Роль по умолчанию", - "All collections use general action permissions by default; permission configured individually will override the default one.": "Все коллекции по умолчанию используют общие права доступа; разрешение, настроенное индивидуально, переопределит разрешение по умолчанию.", - "Allows configuration of the whole system, including UI, collections, permissions, etc.": "Позволяет настраивать всю систему, включая пользовательский интерфейс, коллекции, разрешения и т. д.", - "New menu items are allowed to be accessed by default.": "Доступ к новым пунктам меню разрешен по умолчанию.", - "Global permissions": "Глобальные разрешения", - "General permissions": "Общие разрешения", - "Global action permissions": "Глобальные разрешения на действия", - "General action permissions": "Общие разрешения на действия", - "Action display name": "Имя действия на экране", - "Allow": "Разрешить", - "Data scope": "Облась данных", - "Action on new records": "Действие на новых записях", - "Action on existing records": "Действие на существующих записях", - "All records": "Все записи", - "Own records": "собственные записи", - "Permission policy": "Политика разрешений", - "Individual": "Индивидуально", - "General": "Общие", - "Accessible": "Доступно", - "Configure permission": "Настроить разрешения", - "Action permission": "Разрешения на действия", - "Field permission": "Разрешения на поля", - "Scope name": "Имя области", - "File storages": "Файловые хранилища", - "Storage display name": "Имя храшилища на экране", - "Storage name": "Имя хранилища", - "Default storage": "Хранилище по умолчанию", - "Add storage": "Добавить хранилище", - "Edit storage": "Изменить хранилище", - "Storage base URL": "Базовый URL хранилища", - "Destination": "Назначение", - "Use the built-in static file server": "Использовать встроенный статический файл-сервер", - "Local storage": "Локальное хранилище", - "Aliyun OSS": "Aliyun OSS", - "Amazon S3": "Amazon S3", - "Workflow": "Workflow", - "Execution History": "История запусков", - "Trigger type": "Тип триггера", - "Description": "Описание", - "Status": "Статус", - "On": "Вкл.", - "Off": "Выкл.", - "Version": "Версия", - "Copy to new version": "Скопировать в новую версию", - "Load failed": "Загрузка не удалась", - "Trigger": "Триггер", - "Collection event": "Событие коллекции", - "Trigger on": "Триггер на", - "After record added": "После добавления записи", - "After record updated": "После обновления записи", - "After record added or updated": "После добавления или обновления записи", - "After record deleted": "После удаления записи", - "Changed fields": "Измененные поля", - "Triggered only if one of the selected fields changes. If unselected, it means that it will be triggered when any field changes. When record is added or deleted, any field is considered to have been changed.": "Запускается только при изменении одного из выбранных полей. Если флажок не установлен, это означает, что он будет срабатывать при изменении любого поля. При добавлении или удалении записи любое поле считается измененным.", - "Only triggers when match conditions": "Срабатывает только при совпадении условий", - "Schedule event": "Событие по расписанию", - "Trigger mode": "Режим триггера", - "Based on certain date": "На основе определенной даты", - "Based on date field of collection": "На базе поля с датой в коллекции", - "Starts on": "Стартует с", - "Ends on": "Оканчивается в", - "Exactly at": "Ровно в", - "Repeat mode": "Режим повтора", - "Repeat limit": "Ограничение на повторы", - "No limit": "Нет ограничений", - "Seconds": "Секунды", - "Minutes": "Минуты", - "Hours": "Часы", - "Days": "Дни", - "Weeks": "Недели", - "Months": "Месяцы", - "No repeat": "Не повторять", - "Every": "Каждые", - "By minute": "По минутам", - "By hour": "По часам", - "By day": "По дням", - "By week": "По неделям", - "By month": "По месяцам", - "By field": "По полю", - "By custom date": "По пользовательской дате", - "Advanced": "Продвинутый", - "Advanced type": "Продвинутый", - "End": "Окончание", - "Trigger context": "Контекст триггера", - "Node result": "Результат Узла", - "Constant": "Константа", - "Boolean": "Логический", - "String": "Строка", - "Comparison": "Сравнение", - "Arithmetic calculation": "Арифметическое вычисление", - "String operation": "Операция со строкой", - "On going": "Непрерывный", - "Succeeded": "Успешный", - "Failed": "Неудачный", - "Canceled": "Прерванный", - "This node contains branches, deleting will also be preformed to them, are you sure?": "Этот узел содержит ветки, к ним тоже будет произведено удаление, вы уверены?", - "Control": "Управление", - "Collection operations": "Операции с Коллекцией", - "Node type": "Тип Узла", - "Calculation": "Вычисление", - "Configure calculation": "Настроить вычисление", - "Calculation result": "Результат вычисления", - "True": "Истина", - "False": "Ложь", - "Condition": "Условие", - "Mode": "Режим", - "Continue when \"Yes\"": "Продолжить когда \"Да\"", - "Branch into \"Yes\" and \"No\"": "Разветвление на \"Да\" and \"Нет\"", - "Conditions": "Условия", - "Parallel branch": "Параллельная ветвь", - "All succeeded": "Всё успешно", - "Any succeeded": "Что-то успешно", - "Continue after all branches succeeded": "Продолжать после успеха на всех ветвях", - "Continue after any branch succeeded": "Продолжать после успеха на любой из ветвей", - "Create record": "Создать запись", - "Update record": "Обновить запись", - "Query record": "Запрос записи", - "Multiple records": "Множество записей", - "Please select collection first": "Выберите сначала Коллекцию, пожалуйста", - "Only update records matching conditions": "Обновлять только записи, соответствующие условиям", - "Fields that are not assigned a value will be set to the default value, and those that do not have a default value are set to null.": "Поля, которым не присвоено значение, будут установлены на значение по умолчанию, а поля, не имеющие значения по умолчанию, будут установлены на null.", - "Trigger in executed workflow cannot be modified": "Триггер в выполняемом рабочем процессе не может быть изменен", - "Node in executed workflow cannot be modified": "Узел в выполняемом рабочем процессе не может быть изменен", - "Unsaved changes": "Несохраненные изменения", - "Are you sure you don't want to save?": "Вы уверены, что не хотите сохранить?", - "Dragging": "Перетаскивание", - "Popup": "Всплывающий", - "Trigger workflow": "Рабочий процесс Триггера", - "Request API": "Запрос API", - "Assign field values": "Присвоить значения поля", - "Constant value": "Постоянное значение", - "Dynamic value": "Динамическое значение", - "Current user": "Текущий пользователь", - "Current record": "Текущая запись", - "Popup close method": "Метод закрытия всплывающего окна", - "Automatic close": "Автоматическое закрытие", - "Manually close": "Ручное закрытие", - "After successful update": "После успешного обновления", - "Save record": "Сохранить запись", - "Updated successfully": "Успешно обновлено", - "After successful save": "После успешного сохранения", - "After clicking the custom button, the following field values will be assigned according to the following form.": "После нажатия пользовательской кнопки следующие значения полей будут назначены в соответствии со следующей формой.", - "After clicking the custom button, the following fields of the current record will be saved according to the following form.": "После нажатия пользовательской кнопки следующие поля текущей записи будут сохранены в соответствии со следующей формой.", - "Button background color": "Цвет фона кнопки", - "Highlight": "Подсветка", - "Danger red": "Опасно красный", - "Custom request": "Пользовательский запрос", - "Request settings": "Настройки запроса", - "Request URL": "URL запроса", - "Request method": "Метод запроса", - "Request query parameters": "Запрос параметров запроса", - "Request headers": "Заголовки запроса", - "Request body": "Тело запроса", - "Request success": "Успешный запрос", - "Invalid JSON format": "Неверный JSON формат", - "After successful request": "После успешного запроса", - "Add exportable field": "Добавить экспортируемое поле", - "Audit logs": "Журналы аудита", - "Record ID": "ID записи", - "User": "Пользователь", - "Field": "Поле", - "Field value changes": "Изменения значения поля", - "One to one (has one)": "Один к одному (has one)", - "One to one (belongs to)": "Один к одному (belongs to)", - "Use the same time zone (GMT) for all users": "Использовать одну и ту же временную зону (GMT) для всех пользователей", - "Block title": "Заголовок блока", - "Edit block title": "Изменить заголовок блока", - "Province/city/area name": "Имя области/города/района", - "Field component": "Компонент поля", - "Subtable": "Подтаблица", - "Subform": "Подформа", - "Regular expression": "Образец", - "Enabled languages": "Включенные языки", - "View all plugins": "Посмотреть все плагины", - "Print": "Печать", - 'Single select and radio fields can be used as the grouping field': 'Одиночное поле выбора и радиополя могут использоваться в качестве поля группировки', - 'Sign up successfully, and automatically jump to the sign in page': 'Зарегистрируйтесь успешно и автоматически перейдете на страницу входа', -} \ No newline at end of file +export default { + "Display <1><0>10<1>20<2>50<3>100 items per page": "Показать <1><0>10<1>20<2>50<3>100 элементов на странице", + "Meet <1><0>All<1>Any conditions in the group": "Выполнить <1><0>Все<1>Любое условия в группе", + "Open in<1><0>Modal<1>Drawer<2>Window": "Открыть в<1><0>Модальное окно<1>Ящик<2>Окно", + "{{count}} filter items": "{{count}} отфильтровано элементов", + "{{count}} more items": "{{count}} больше элементов", + "Total {{count}} items": "Всего {{count}} элементов", + "Today": "Сегодня", + "Month": "Месяц", + "Week": "Неделя", + "Work week": "Рабочая неделя", + "Day": "День", + "Agenda": "Расписание", + "Date": "Дата", + "Time": "Время", + "Event": "Событие", + "None": "Ничего", + "System settings": "Системные настройки", + "System title": "Системный заголовок", + "Logo": "Логотип", + "Add menu item": "Добавить элемент меню", + "Page": "Страница", + "Name": "Имя", + "Icon": "Иконка", + "Group": "Группа", + "Link": "Ссылка", + "Save conditions": "Сохранить условия", + "Edit menu item": "Изменить пункт меню", + "Move to": "Перенести", + "Insert left": "Вставить слева", + "Insert right": "Вставить справа", + "Insert inner": "Вставить внутрь", + "Delete": "Удалить", + "UI editor": "UI редактор", + "Collection": "Коллекция", + "Collections & Fields": "Коллекции & Поля", + "Roles & Permissions": "Роли & Разрешения", + "Edit profile": "Изменить профиль", + "Change password": "Сменить пароль", + "Old password": "Старый пароль", + "New password": "Новый пароль", + "Switch role": "Сменить роль", + "Super admin": "Супер админ", + "Language": "Язык", + "Allow sign up": "Разрешить регистрацию", + "Sign out": "Выйти", + "Cancel": "Отмена", + "Submit": "Отправить", + "Close": "Закрыть", + "Set the data scope": "Установить область данных", + "Data blocks": "Блоки данных", + "Table": "Таблица", + "Form": "Форма", + "Select data source": "Выбрать источник данных", + "Calendar": "Календарь", + "Kanban": "Канбан", + "Select grouping field": "Выбрать поле группировки", + "Media": "Медиа", + "Markdown": "Markdown", + "Wysiwyg": "Wysiwyg", + "Chart blocks": "Блоки диаграммы", + "Column chart": "Колонки", + "Bar chart": "Столбики", + "Line chart": "Линейная", + "Pie chart": "Круговая", + "Area chart": "Область", + "Other chart": "Другая диаграмма", + "Other blocks": "Другие блоки", + "In configuration": "В конфигурации", + "Chart title": "Заголовок диаграммы", + "Chart type": "Тип диаграммы", + "Chart config": "Конфиг. диаграммы", + "Templates": "Шаблоны", + "Select template": "Выбрать шаблон", + "Action logs": "Журналы действий", + "Create template": "Создать шаблон", + "Edit markdown": "Редактировать markdown", + "Add block": "Добавить блок", + "Add new": "Добавить новый", + "Add record": "Зобавить запись", + "Custom field display name": "Отображаемое имя поля пользователя", + "Display fields": "Показать поля", + "Edit record": "Изменить запись", + "Delete menu item": "Удалить пункт меню", + "Add page": "Добавить страницу", + "Add group": "Добавить группу", + "Add link": "Добавить ссылку", + "Insert above": "Вставить выше", + "Insert below": "Вставить ниже", + "Save": "Сохранить", + "Delete block": "Удалить блок", + "Are you sure you want to delete it?": "Вы уверены, что хотите удалить это?", + "This is a demo text, **supports Markdown syntax**.": "Это демо текст, **поддерживает синтаксис Markdown**.", + "Filter": "Фильтр", + "Action type": "Тип действия", + "Actions": "Действия", + "Insert": "Вставить", + "Update": "Обновить", + "View": "Вид", + "View record": "Показать запись", + "Refresh": "Обновить", + "Data changes": "Изменения данных", + "Field name": "Имя поля", + "Before change": "До изменений", + "After change": "После изменений", + "Delete record": "Удалить запись", + "Create collection": "Создать Коллекцию", + "Collection display name": "Отображение имени Коллекции", + "Collection name": "Имя Коллекции", + "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "Случайно сгенерированный и может быть изменен. Поддерживает буквы, цифры и подчеркивания, должно начинаться с буквы.", + "Storage type": "Тип Хранилища", + "Edit": "Изменить", + "Edit collection": "Изменить Коллекцию", + "Configure fields": "Конфигурировать поля", + "Configure columns": "Конфигурировать колонки", + "Edit field": "Изменить поле", + "Configure fields of {{title}}": "Конфигурировать поле {{title}}", + "Basic": "Базовый", + "Single line text": "Текстовая строка", + "Long text": "Текстовое поле", + "Phone": "Телефон", + "Email": "Email", + "Number": "Число", + "Integer": "Целое", + "Percent": "Процент", + "Password": "Пароль", + "Formula": "Формула", + "Formula description": "Вычисляет значение на базе значений других полей той же записи.", + "Choices": "Выбор", + "Checkbox": "Чекбокс", + "Single select": "Одиночный выбор", + "Multiple select": "Множественный выбор", + "Radio group": "Радио группа", + "Checkbox group": "Чекбокс группа", + "China region": "Китай регион", + "Attachment": "Вложение", + "Date & Time": "Дата & Время", + "Datetime": "Датавремя", + "Relation": "Связь", + "Link to": "Ссылка на", + "Link to description": "Используется для быстрого создания связей коллекций и совместим с наиболее распространенными сценариями. Подходит для использования не разработчиками. Когда он присутствует в виде поля, это раскрывающийся список, используемый для выбора записей из целевой коллекции. После создания он одновременно генерирует связанные поля текущей коллекции в целевой коллекции.", + "Sub-table": "Подтаблица", + "System info": "Системная инфо", + "Created at": "Когда создано", + "Last updated at": "Когда изменено", + "Created by": "Кто создал", + "Last updated by": "Кто изменил", + "Add field": "Добавить поле", + "Field display name": "Отображаемое имя поля", + "Field type": "Тип поля", + "Field interface": "Интерфейс поля", + "Date format": "Формат даты", + "Year/Month/Day": "Год/Месяц/День", + "Year-Month-Day": "Год-Месяц-День", + "Day/Month/Year": "День/Месяц/Год", + "Show time": "Показать время", + "Time format": "Фрмат времени", + "12 hour": "12 час", + "24 hour": "24 час", + "Relationship type": "Тип отношений", + "Source collection": "Исходная коллекция", + "Source key": "Исходный ключ", + "Target collection": "Целевая коллекция", + "Through collection": "Через коллекцию", + "Target key": "Целевой ключ", + "Foreign key": "Внешний ключ", + "One to one": "Один к одному", + "One to many": "Один ко многим", + "Many to one": "Многие к одному", + "Many to many": "Многие ко многим", + "One to one description": "Используется для создания отношений один к одному. Например, у пользователя есть профиль.", + "One to many description": "Используется для создания отношения «один ко многим». Например, в стране может быть много городов, а город может находиться только в одной стране. Когда он присутствует в виде поля, это подтаблица, в которой отображаются записи связанной коллекции. При создании поле «многие к одному» автоматически создается в связанной коллекции.", + "Many to one description": "Используется для создания отношений «многие к одному». Например, город может принадлежать только одной стране, а в стране может быть много городов. Когда он присутствует в виде поля, это раскрывающийся список, используемый для выбора записи из связанной коллекции. После создания поле «один ко многим» автоматически создается в связанной коллекции.", + "Many to many description": "Используется для создания отношений «многие ко многим». Например, у ученика будет много учителей, а у учителя будет много учеников. Когда он присутствует в виде поля, это раскрывающийся список, используемый для выбора записей из связанной коллекции.", + "Foreign key 1": "Внешний ключ 1", + "Foreign key 2": "Внешний ключ 2", + "Add filter": "Добавить фильтр", + "Add filter group": "Добавить группу фильтров", + "is": "соответствует", + "is not": "не соответствует", + "is variable": "это переменная", + "contains": "содержит", + "does not contain": "не содержит", + "starts with": "начинается с", + "not starts with": "не начинается с", + "ends with": "оканчивается на", + "not ends with": "не оканчивается на", + "is empty": "пустое", + "is not empty": "не пустое", + "Edit chart": "Изменить диаграмму", + "Add text": "Добавить текст", + "Filterable fields": "Фильтруемые поля", + "Edit button": "Изменить кнопку", + "Hide": "Скрыть", + "Enable actions": "Разрешить действия", + "Export": "Экспортировать", + "Customize": "Настроить", + "Function": "Функция", + "Popup form": "Всплывающая форма", + "Flexible popup": "Гибкое всплывающее окно", + "Configure actions": "Настройка действий", + "Display order number": "Показать порядковые номера", + "Enable drag and drop sorting": "Разрешить сортировку перетаскиванием", + "Triggered when the row is clicked": "Срабатывает при нажатии на строку", + "Add tab": "Добавить вкладку", + "Disable tabs": "Запретить вкладки", + "Details": "Подробности", + "Edit tab": "Изменить вкладку", + "Relationship blocks": "Блоки отношений", + "Select record": "Выбрать запись", + "Display name": "Показать имя", + "Select icon": "Выбрать иконку", + "Custom column name": "Пользовательское имя колонки", + "Edit description": "Изменить описание", + "Required": "Обязательное", + "Label field": "Метка поля", + "Default is the ID field": "По умолчанию это поле ID", + "Set default sorting rules": "Установить правила сортировки по умолчанию", + "is before": "находится до", + "is after": "находится после", + "is on or after": "находится на или после", + "is on or before": "находится на или до", + "Upload": "Закачать", + "Select level": "Выберите уровень", + "Province": "Область", + "City": "Город", + "Area": "Район", + "Street": "Улица", + "Village": "Деревня", + "Must select to the last level": "Нужно выбрать до последнего уровня", + "Move {{title}} to": "Переместить {{title}} на", + "Target position": "Целевая позиция", + "After": "После", + "Before": "До", + "Add {{type}} before \"{{title}}\"": "Добавить {{type}} до \"{{title}}\"", + "Add {{type}} after \"{{title}}\"": "Добавить {{type}} после \"{{title}}\"", + "Add {{type}} in \"{{title}}\"": "Добавить {{type}} в \"{{title}}\"", + "Original name": "Оригинальное имя", + "Custom name": "Пользовательское имя", + "Custom Title": "Пользовательский Заголовок", + "Options": "Опции", + "Option value": "Значение опции", + "Option label": "Метка опции", + "Color": "Цвет", + "Add option": "Добавить опцию", + "Related collection": "Связанная коллекция", + "Allow linking to multiple records": "Позволить прилинковать много записей", + "Allow uploading multiple files": "Позволить загружать много файлов", + "Configure calendar": "Настроить календарь", + "Title field": "Поле заголовка", + "Start date field": "Поле даты начала", + "End date field": "Поле даты окончания", + "Navigate": "Навигация", + "Title": "Заголовок", + "Select view": "Выбрать вид", + "Reset": "Сбросить", + "Exportable fields": "Экспортируемые поля", + "Saved successfully": "Успешно сохранено", + "Nickname": "Никнейм", + "Sign in": "Войти", + "Create an account": "Создать аккаунт", + "Sign up": "Зарегистрироваться", + "Confirm password": "Подтвердить пароль", + "Log in with an existing account": "Войти в существующий аккаунт", + "Signed up successfully. It will jump to the login page.": "Успешно зарегистрировано. Вы будете перенаправлены на страницу входа.", + "Password mismatch": "Пароли не совпадают", + "Users": "Пользователи", + "Roles": "Роли", + "Add role": "Добавить роль", + "Role name": "Имя роли", + "Configure": "Настроить", + "Configure permissions": "Настроить разрешения", + "Edit role": "Изменить роль", + "Action permissions": "Разрешения на действия", + "Menu permissions": "Разрешения на Меню", + "Menu item name": "Название пункта Меню", + "Allow access": "Разрешить доступ", + "Action name": "Название действия", + "Allow action": "Разрешить действия", + "Action scope": "Область действий", + "Operate on new data": "Работать с новыми данными", + "Operate on existing data": "Работать с существующими данными", + "Yes": "Да", + "No": "Нет", + "Red": "Красный", + "Magenta": "Сиреневый", + "Volcano": "Вулканический", + "Orange": "Оранжевый", + "Gold": "Золотой", + "Lime": "Лайм", + "Green": "Зеленый", + "Cyan": "Голубой", + "Blue": "Синий", + "Geek Blue": "Тёмно-синий", + "Purple": "Фиолетовый", + "Default": "По умолчанию", + "Add card": "Добавить карточку", + "edit title": "изменить заголовок", + "Turn pages": "Перелистывать страницы", + "Others": "Другие", + "Save as template": "Сохранить как шаблон", + "Block templates": "Шаблоны Блока", + "Convert reference to duplicate": "Преобразовать ссылку в дубликат", + "Template name": "Имя Шаблона", + "Block type": "Тип Блока", + "Action column": "Колонка действий", + "Records per page": "Записей на страницу", + "(Fields only)": "(Только поля)", + "Button title": "Имя кнопки", + "Button icon": "Иконка кнопки", + "Submitted successfully": "Успешно отправлено", + "Operation succeeded": "Операция прошла успешно", + "Operation failed": "Операция не удалась", + "Open mode": "Открытый режим", + "Menu item title": "Заголовок пункта Меню", + "Menu item icon": "Иконка пункта Меню", + "Target": "Цель", + "Position": "Положение", + "Insert before": "Вставить до", + "Insert after": "Вставить после", + "UI Editor": "UI Редактор", + "ASC": "по возр.", + "DESC": "по убыв.", + "Add sort field": "Добавить поле сортировки", + "ID": "ID", + "Drawer": "Ящик", + "Dialog": "Диалог", + "Delete action": "Удалить действие", + "Custom column title": "Пользовательский заголовок колонки", + "Original title: ": "Заголовок по умолчанию: ", + "Delete table column": "Удалить колонку таблицы", + "Skip required validation": "Пропустить обязатеьную проверку", + "Form values": "Значения формы", + "Fields values": "Значения полей", + "When submitting the following fields, the saved values are": "При отправке следующих полей, сохраненные значения такие", + "After successful submission": "После удачной отправки", + "Then": "Затем", + "Stay on current page": "Оставаться на текущей странице", + "Redirect to": "Перенаправить на", + "Save action": "Сохранить действие", + "Exists": "Существуют", + "Filename": "Имя файла", + "Add condition": "Добавить правило", + "Add condition group": "Добавить группу правил", + "exists": "существуют", + "not exists": "не существуют", + "is current logged-in user": "текущий пользователь", + "=": "=", + "≠": "≠", + ">": ">", + "≥": "≥", + "<": "<", + "≤": "≤", + "Role UID": "UID Роли", + "Precision": "Точность", + "Formula mode": "Режим формулы", + "Expression": "Переменная", + "Input +, -, *, /, ( ) to calculate, input @ to open field variables.": "Введите +, -, *, /, ( ) для вычисления, введите @ чтобы открыть переменные поля.", + "Formula error.": "Ошибка формулы.", + "Accept": "Подтвердить", + "Rich Text": "Rich Text", + "Junction collection": "Коллекция Узлов", + "Leave it blank, unless you need a custom intermediate table": "Оставьте это поле пустым, если вам не нужна пользовательская промежуточная таблица.", + "Fields": "Поля", + "Edit field title": "Изменить заголовок поля", + "Field title": "Заголовок поля", + "Original field title: ": "Оригинальный заголовок поля: ", + "Edit tooltip": "Изменить подсказку", + "Delete field": "Удалить поле", + "Select collection": "Выбрать коллекцию", + "Blank block": "Пустой блок", + "Duplicate template": "Дублировать шаблон", + "Reference template": "Справочный шаблон", + "Create calendar block": "Создать блок календаря", + "Create kanban block": "Создать блок Канбан", + "Grouping field": "Поле группировки", + "Tab name": "Имя вкладки", + "Current record blocks": "Блоки текущей записи", + "Popup message": "Всплывающее сообщение", + "Delete role": "Удалить роль", + "Role display name": "Имя роли на экране", + "Default role": "Роль по умолчанию", + "All collections use general action permissions by default; permission configured individually will override the default one.": "Все коллекции по умолчанию используют общие права доступа; разрешение, настроенное индивидуально, переопределит разрешение по умолчанию.", + "Allows configuration of the whole system, including UI, collections, permissions, etc.": "Позволяет настраивать всю систему, включая пользовательский интерфейс, коллекции, разрешения и т. д.", + "New menu items are allowed to be accessed by default.": "Доступ к новым пунктам меню разрешен по умолчанию.", + "Global permissions": "Глобальные разрешения", + "General permissions": "Общие разрешения", + "Global action permissions": "Глобальные разрешения на действия", + "General action permissions": "Общие разрешения на действия", + "Action display name": "Имя действия на экране", + "Allow": "Разрешить", + "Data scope": "Облась данных", + "Action on new records": "Действие на новых записях", + "Action on existing records": "Действие на существующих записях", + "All records": "Все записи", + "Own records": "собственные записи", + "Permission policy": "Политика разрешений", + "Individual": "Индивидуально", + "General": "Общие", + "Accessible": "Доступно", + "Configure permission": "Настроить разрешения", + "Action permission": "Разрешения на действия", + "Field permission": "Разрешения на поля", + "Scope name": "Имя области", + "File storages": "Файловые хранилища", + "Storage display name": "Имя храшилища на экране", + "Storage name": "Имя хранилища", + "Default storage": "Хранилище по умолчанию", + "Add storage": "Добавить хранилище", + "Edit storage": "Изменить хранилище", + "Storage base URL": "Базовый URL хранилища", + "Destination": "Назначение", + "Use the built-in static file server": "Использовать встроенный статический файл-сервер", + "Local storage": "Локальное хранилище", + "Aliyun OSS": "Aliyun OSS", + "Tencent COS": "Tencent COS", + "Amazon S3": "Amazon S3", + "Workflow": "Workflow", + "Execution History": "История запусков", + "Trigger type": "Тип триггера", + "Description": "Описание", + "Status": "Статус", + "On": "Вкл.", + "Off": "Выкл.", + "Version": "Версия", + "Copy to new version": "Скопировать в новую версию", + "Load failed": "Загрузка не удалась", + "Trigger": "Триггер", + "Collection event": "Событие коллекции", + "Trigger on": "Триггер на", + "After record added": "После добавления записи", + "After record updated": "После обновления записи", + "After record added or updated": "После добавления или обновления записи", + "After record deleted": "После удаления записи", + "Changed fields": "Измененные поля", + "Triggered only if one of the selected fields changes. If unselected, it means that it will be triggered when any field changes. When record is added or deleted, any field is considered to have been changed.": "Запускается только при изменении одного из выбранных полей. Если флажок не установлен, это означает, что он будет срабатывать при изменении любого поля. При добавлении или удалении записи любое поле считается измененным.", + "Only triggers when match conditions": "Срабатывает только при совпадении условий", + "Schedule event": "Событие по расписанию", + "Trigger mode": "Режим триггера", + "Based on certain date": "На основе определенной даты", + "Based on date field of collection": "На базе поля с датой в коллекции", + "Starts on": "Стартует с", + "Ends on": "Оканчивается в", + "Exactly at": "Ровно в", + "Repeat mode": "Режим повтора", + "Repeat limit": "Ограничение на повторы", + "No limit": "Нет ограничений", + "Seconds": "Секунды", + "Minutes": "Минуты", + "Hours": "Часы", + "Days": "Дни", + "Weeks": "Недели", + "Months": "Месяцы", + "No repeat": "Не повторять", + "Every": "Каждые", + "By minute": "По минутам", + "By hour": "По часам", + "By day": "По дням", + "By week": "По неделям", + "By month": "По месяцам", + "By field": "По полю", + "By custom date": "По пользовательской дате", + "Advanced": "Продвинутый", + "Advanced type": "Продвинутый", + "End": "Окончание", + "Trigger context": "Контекст триггера", + "Node result": "Результат Узла", + "Constant": "Константа", + "Boolean": "Логический", + "String": "Строка", + "Comparison": "Сравнение", + "Arithmetic calculation": "Арифметическое вычисление", + "String operation": "Операция со строкой", + "On going": "Непрерывный", + "Succeeded": "Успешный", + "Failed": "Неудачный", + "Canceled": "Прерванный", + "This node contains branches, deleting will also be preformed to them, are you sure?": "Этот узел содержит ветки, к ним тоже будет произведено удаление, вы уверены?", + "Control": "Управление", + "Collection operations": "Операции с Коллекцией", + "Node type": "Тип Узла", + "Calculation": "Вычисление", + "Configure calculation": "Настроить вычисление", + "Calculation result": "Результат вычисления", + "True": "Истина", + "False": "Ложь", + "Condition": "Условие", + "Mode": "Режим", + "Continue when \"Yes\"": "Продолжить когда \"Да\"", + "Branch into \"Yes\" and \"No\"": "Разветвление на \"Да\" and \"Нет\"", + "Conditions": "Условия", + "Parallel branch": "Параллельная ветвь", + "All succeeded": "Всё успешно", + "Any succeeded": "Что-то успешно", + "Continue after all branches succeeded": "Продолжать после успеха на всех ветвях", + "Continue after any branch succeeded": "Продолжать после успеха на любой из ветвей", + "Create record": "Создать запись", + "Update record": "Обновить запись", + "Query record": "Запрос записи", + "Multiple records": "Множество записей", + "Please select collection first": "Выберите сначала Коллекцию, пожалуйста", + "Only update records matching conditions": "Обновлять только записи, соответствующие условиям", + "Fields that are not assigned a value will be set to the default value, and those that do not have a default value are set to null.": "Поля, которым не присвоено значение, будут установлены на значение по умолчанию, а поля, не имеющие значения по умолчанию, будут установлены на null.", + "Trigger in executed workflow cannot be modified": "Триггер в выполняемом рабочем процессе не может быть изменен", + "Node in executed workflow cannot be modified": "Узел в выполняемом рабочем процессе не может быть изменен", + "Unsaved changes": "Несохраненные изменения", + "Are you sure you don't want to save?": "Вы уверены, что не хотите сохранить?", + "Dragging": "Перетаскивание", + "Popup": "Всплывающий", + "Trigger workflow": "Рабочий процесс Триггера", + "Request API": "Запрос API", + "Assign field values": "Присвоить значения поля", + "Constant value": "Постоянное значение", + "Dynamic value": "Динамическое значение", + "Current user": "Текущий пользователь", + "Current record": "Текущая запись", + "Popup close method": "Метод закрытия всплывающего окна", + "Automatic close": "Автоматическое закрытие", + "Manually close": "Ручное закрытие", + "After successful update": "После успешного обновления", + "Save record": "Сохранить запись", + "Updated successfully": "Успешно обновлено", + "After successful save": "После успешного сохранения", + "After clicking the custom button, the following field values will be assigned according to the following form.": "После нажатия пользовательской кнопки следующие значения полей будут назначены в соответствии со следующей формой.", + "After clicking the custom button, the following fields of the current record will be saved according to the following form.": "После нажатия пользовательской кнопки следующие поля текущей записи будут сохранены в соответствии со следующей формой.", + "Button background color": "Цвет фона кнопки", + "Highlight": "Подсветка", + "Danger red": "Опасно красный", + "Custom request": "Пользовательский запрос", + "Request settings": "Настройки запроса", + "Request URL": "URL запроса", + "Request method": "Метод запроса", + "Request query parameters": "Запрос параметров запроса", + "Request headers": "Заголовки запроса", + "Request body": "Тело запроса", + "Request success": "Успешный запрос", + "Invalid JSON format": "Неверный JSON формат", + "After successful request": "После успешного запроса", + "Add exportable field": "Добавить экспортируемое поле", + "Audit logs": "Журналы аудита", + "Record ID": "ID записи", + "User": "Пользователь", + "Field": "Поле", + "Field value changes": "Изменения значения поля", + "One to one (has one)": "Один к одному (has one)", + "One to one (belongs to)": "Один к одному (belongs to)", + "Use the same time zone (GMT) for all users": "Использовать одну и ту же временную зону (GMT) для всех пользователей", + "Block title": "Заголовок блока", + "Edit block title": "Изменить заголовок блока", + "Province/city/area name": "Имя области/города/района", + "Field component": "Компонент поля", + "Subtable": "Подтаблица", + "Subform": "Подформа", + "Regular expression": "Образец", + "Enabled languages": "Включенные языки", + "View all plugins": "Посмотреть все плагины", + "Print": "Печать", + 'Single select and radio fields can be used as the grouping field': 'Одиночное поле выбора и радиополя могут использоваться в качестве поля группировки', + 'Sign up successfully, and automatically jump to the sign in page': 'Зарегистрируйтесь успешно и автоматически перейдете на страницу входа', +} diff --git a/packages/core/client/src/locale/zh_CN.ts b/packages/core/client/src/locale/zh_CN.ts index 7524683ac..4c63c1f46 100644 --- a/packages/core/client/src/locale/zh_CN.ts +++ b/packages/core/client/src/locale/zh_CN.ts @@ -502,6 +502,7 @@ export default { 'Local storage': '本地存储', 'Aliyun OSS': '阿里云 OSS', 'Amazon S3': '亚马逊 S3', + 'Tencent COS': '腾讯云 COS', 'Region': '区域', 'Bucket': '存储桶', 'Path': '路径(相对)', diff --git a/packages/plugins/file-manager/package.json b/packages/plugins/file-manager/package.json index fb9d5e1da..db62b66e1 100644 --- a/packages/plugins/file-manager/package.json +++ b/packages/plugins/file-manager/package.json @@ -14,11 +14,13 @@ "@nocobase/server": "0.8.0-alpha.1", "@nocobase/client": "0.8.0-alpha.1", "aws-sdk": "^2.2.32", + "cos-nodejs-sdk-v5": "^2.11.14", "koa-static": "^5.0.0", "mime-match": "^1.0.2", "mkdirp": "~0.5.4", "multer": "^1.4.2", "multer-aliyun-oss": "2.1.1", + "multer-cos": "^1.0.3", "multer-s3": "^2.10.0" }, "devDependencies": { diff --git a/packages/plugins/file-manager/src/client/schemas/storage.ts b/packages/plugins/file-manager/src/client/schemas/storage.ts index 14711eb02..9c1be81d9 100644 --- a/packages/plugins/file-manager/src/client/schemas/storage.ts +++ b/packages/plugins/file-manager/src/client/schemas/storage.ts @@ -39,6 +39,7 @@ const collection = { { label: '{{t("Local storage")}}', value: 'local' }, { label: '{{t("Aliyun OSS")}}', value: 'ali-oss' }, { label: '{{t("Amazon S3")}}', value: 's3' }, + { label: '{{t("Tencent COS")}}', value: 'tx-cos' }, ], } as ISchema, }, diff --git a/packages/plugins/file-manager/src/server/__tests__/storages/tx-cos.test.ts b/packages/plugins/file-manager/src/server/__tests__/storages/tx-cos.test.ts new file mode 100644 index 000000000..edef5e0c8 --- /dev/null +++ b/packages/plugins/file-manager/src/server/__tests__/storages/tx-cos.test.ts @@ -0,0 +1,69 @@ +import path from 'path'; +import { MockServer } from '@nocobase/test'; +import txStorage from '../../storages/tx-cos'; +import { FILE_FIELD_NAME } from '../../constants'; +import { getApp, requestFile } from '..'; +import { Database } from '@nocobase/database'; + +const itif = process.env.TX_COS_ACCESS_KEY_SECRET ? it : it.skip; + +describe('storage:tx-cos', () => { + let app: MockServer; + let agent; + let db: Database; + let storage; + + beforeEach(async () => { + app = await getApp(); + agent = app.agent(); + db = app.db; + + const Storage = db.getCollection('storages').model; + storage = await Storage.create({ + ...txStorage.defaults(), + name: `tx-cos_${db.getTablePrefix()}`, + default: true, + path: 'test/path', + }); + }); + + afterEach(async () => { + await db.close(); + }); + + describe('direct attachment', () => { + itif('upload file should be ok', async () => { + const { body } = await agent.resource('attachments').upload({ + [FILE_FIELD_NAME]: path.resolve(__dirname, '../files/text.txt'), + }); + + const Attachment = db.getCollection('attachments').model; + const attachment = await Attachment.findOne({ + where: { id: body.data.id }, + include: ['storage'], + }); + + const matcher = { + title: 'text', + extname: '.txt', + path: 'test/path', + size: 13, + mimetype: 'text/plain', + meta: {}, + storageId: storage.id, + }; + + // 文件上传和解析是否正常 + expect(body.data).toMatchObject(matcher); + // 文件的 url 是否正常生成 + expect(body.data.url).toBe(`${attachment.storage.baseUrl}/${body.data.path}/${body.data.filename}`); + // 文件的数据是否正常保存 + expect(attachment).toMatchObject(matcher); + + // 通过 url 是否能正确访问 + const content = await requestFile(attachment.url, agent); + + expect(content.text).toBe('Hello world!\n'); + }); + }); +}); diff --git a/packages/plugins/file-manager/src/server/constants.ts b/packages/plugins/file-manager/src/server/constants.ts index 15958088b..2a1f54a06 100644 --- a/packages/plugins/file-manager/src/server/constants.ts +++ b/packages/plugins/file-manager/src/server/constants.ts @@ -5,3 +5,4 @@ export const LIMIT_MAX_FILE_SIZE = 1024 * 1024 * 1024; export const STORAGE_TYPE_LOCAL = 'local'; export const STORAGE_TYPE_ALI_OSS = 'ali-oss'; export const STORAGE_TYPE_S3 = 's3'; +export const STORAGE_TYPE_TX_COS = 'tx-cos'; diff --git a/packages/plugins/file-manager/src/server/storages/index.ts b/packages/plugins/file-manager/src/server/storages/index.ts index bcf3497a9..677163bae 100644 --- a/packages/plugins/file-manager/src/server/storages/index.ts +++ b/packages/plugins/file-manager/src/server/storages/index.ts @@ -1,8 +1,9 @@ import local from './local'; import oss from './ali-oss'; import s3 from './s3'; +import cos from './tx-cos'; -import { STORAGE_TYPE_LOCAL, STORAGE_TYPE_ALI_OSS, STORAGE_TYPE_S3 } from '../constants'; +import { STORAGE_TYPE_LOCAL, STORAGE_TYPE_ALI_OSS, STORAGE_TYPE_S3, STORAGE_TYPE_TX_COS } from '../constants'; export interface IStorage { filenameKey?: string; @@ -16,6 +17,7 @@ const map = new Map(); map.set(STORAGE_TYPE_LOCAL, local); map.set(STORAGE_TYPE_ALI_OSS, oss); map.set(STORAGE_TYPE_S3, s3); +map.set(STORAGE_TYPE_TX_COS, cos); export function getStorageConfig(key: string): IStorage { return map.get(key); diff --git a/packages/plugins/file-manager/src/server/storages/tx-cos.ts b/packages/plugins/file-manager/src/server/storages/tx-cos.ts new file mode 100644 index 000000000..eb6ebf6e3 --- /dev/null +++ b/packages/plugins/file-manager/src/server/storages/tx-cos.ts @@ -0,0 +1,27 @@ +import { STORAGE_TYPE_TX_COS } from '../constants'; +import { cloudFilenameGetter } from '../utils'; + +export default { + filenameKey: 'url', + make(storage) { + const createTxCosStorage = require('multer-cos'); + return new createTxCosStorage({ + cos: storage.options, + filename: cloudFilenameGetter(storage), + }); + }, + defaults() { + return { + title: '腾讯云对象存储', + type: STORAGE_TYPE_TX_COS, + name: 'tx-cos-1', + baseUrl: process.env.TX_COS_STORAGE_BASE_URL, + options: { + Region: process.env.TX_COS_REGION, + SecretId: process.env.TX_COS_SECRET_ID, + SecretKey: process.env.TX_COS_SECRET_KEY, + Bucket: process.env.TX_COS_BUCKET, + }, + }; + }, +}; diff --git a/yarn.lock b/yarn.lock index 951e75d6b..eb59680a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5331,7 +5331,14 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@^16.9.8", "@types/react-dom@^17.0.0": +"@types/react-dom@^16.9.8": + version "16.9.16" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.16.tgz#c591f2ed1c6f32e9759dfa6eb4abfd8041f29e39" + integrity sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg== + dependencies: + "@types/react" "^16" + +"@types/react-dom@^17.0.0": version "17.0.11" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466" integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q== @@ -5391,7 +5398,7 @@ "@types/history" "*" "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.11", "@types/react@^16.9.43", "@types/react@^17.0.0": +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^17.0.0": version "17.0.34" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.34.tgz#797b66d359b692e3f19991b6b07e4b0c706c0102" integrity sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg== @@ -5400,6 +5407,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^16", "@types/react@^16.9.43": + version "16.14.32" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.32.tgz#d4e4fe5ece3c27fcb4608b1f4a614f7dec881392" + integrity sha512-hvEy4vGVADbtj/U6+CA5SRC5QFIjdxD7JslAie8EuAYZwhYY9bgforpXNyF1VFzhnkEOesDy1278t1wdjN74cw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -6088,6 +6104,13 @@ ajv-errors@^1.0.0: resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== +ajv-formats@^1.5.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-1.6.1.tgz#35c7cdcd2a12d509171c37bac32f2e8eb010a536" + integrity sha512-4CjkH20If1lhR5CGtqkrVg3bbOtFEG80X9v6jDOIUhbzzbB+UzPBGy8GQhUNVZ0yvMHdMpawCOcy5ydGMsagGQ== + dependencies: + ajv "^7.0.0" + ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -6103,6 +6126,16 @@ ajv@6.12.6, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@ json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.0, ajv@^7.0.3: + version "7.2.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.2.4.tgz#8e239d4d56cf884bccca8cca362f508446dc160f" + integrity sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ali-oss@^6.16.0: version "6.17.1" resolved "https://registry.yarnpkg.com/ali-oss/-/ali-oss-6.17.1.tgz#3e88738ec01111a26a2b967cf857d97050886156" @@ -6736,6 +6769,11 @@ atob@^2.1.2: resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomically@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" + integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== + autoprefixer@9.6.0: version "9.6.0" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz#0111c6bde2ad20c6f17995a33fad7cf6854b4c87" @@ -8258,6 +8296,23 @@ concurrently@^7.0.0: tree-kill "^1.2.2" yargs "^16.2.0" +conf@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/conf/-/conf-9.0.2.tgz#943589602b1ce274d9234265314336a698972bc5" + integrity sha512-rLSiilO85qHgaTBIIHQpsv8z+NnVfZq3cKuYNCXN1AOqPzced0GWZEe/A517VldRLyQYXUMyV+vszavE2jSAqw== + dependencies: + ajv "^7.0.3" + ajv-formats "^1.5.1" + atomically "^1.7.0" + debounce-fn "^4.0.0" + dot-prop "^6.0.1" + env-paths "^2.2.0" + json-schema-typed "^7.0.3" + make-dir "^3.1.0" + onetime "^5.1.2" + pkg-up "^3.1.0" + semver "^7.3.4" + config-chain@^1.1.12: version "1.1.13" resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -8538,6 +8593,16 @@ core-util-is@^1.0.2, core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cos-nodejs-sdk-v5@^2.11.14: + version "2.11.14" + resolved "https://registry.yarnpkg.com/cos-nodejs-sdk-v5/-/cos-nodejs-sdk-v5-2.11.14.tgz#9179a751d2f5e229422335609f688e0d1c786c5e" + integrity sha512-PCkGa1tJikjIr42GqihTnefZntPHp64so55E2rcSYzim6nUCrJdcFM9eBLU3rMS4Nz11mBjhSPqyQJq+avfHqg== + dependencies: + conf "^9.0.0" + mime-types "^2.1.24" + request "^2.88.2" + xml2js "^0.4.19" + cosmiconfig-typescript-loader@^1.0.0: version "1.0.4" resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.4.tgz#2903d53aec07c8079c5ff4aa1b10bd5d2fbdff81" @@ -9093,6 +9158,13 @@ dayjs@~1.8.24, dayjs@~1.8.25: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz#be36e248467afabf8f5a86bae0de0cdceecced50" integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw== +debounce-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" + integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ== + dependencies: + mimic-fn "^3.0.0" + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -14004,6 +14076,16 @@ json-schema-traverse@^0.4.1: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema-typed@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" + integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -15339,7 +15421,7 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: dependencies: mime-db "1.51.0" -mime-types@~2.1.34: +mime-types@^2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -15371,6 +15453,11 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -15616,6 +15703,11 @@ multer-aliyun-oss@2.1.1: dependencies: ali-oss "^6.16.0" +multer-cos@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/multer-cos/-/multer-cos-1.0.3.tgz#f8998b9a16d2e6e2d3f00cd811ef0bcf14e804b6" + integrity sha512-KD1/ZUHcmjYtsPHlosOsned8u6a1xYgUYmnU0659rRue4fjVSbEBo6BKyI2N6BbUNHAWMz18NUb9a5Gn5GcgvQ== + multer-s3@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/multer-s3/-/multer-s3-2.10.0.tgz#95c5a51ad0d165bcabdfd54572ded76a25b54754" @@ -17105,7 +17197,7 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0: +pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== @@ -19767,6 +19859,11 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-in-the-middle@^5.0.0: version "5.1.0" resolved "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz#b768f800377b47526d026bbf5a7f727f16eb412f" @@ -23167,7 +23264,7 @@ xml2js@0.4.19: sax ">=0.6.0" xmlbuilder "~9.0.1" -xml2js@^0.4.16: +xml2js@^0.4.16, xml2js@^0.4.19: version "0.4.23" resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==