mirror of
https://github.com/strapi/strapi.git
synced 2025-12-28 23:57:32 +00:00
Merge branch 'features/dynamic-zones' into front/dynamic-zones-ctm-ui
This commit is contained in:
commit
b78bef7445
@ -2,8 +2,16 @@ module.exports = {
|
||||
title: 'Strapi Documentation',
|
||||
description: 'The headless CMS developers love.',
|
||||
base: '/documentation/',
|
||||
ga: 'UA-54313258-1',
|
||||
plugins: ['@vuepress/medium-zoom', 'vuepress-plugin-element-tabs'],
|
||||
plugins: [
|
||||
'@vuepress/medium-zoom',
|
||||
'vuepress-plugin-element-tabs',
|
||||
[
|
||||
'@vuepress/google-analytics',
|
||||
{
|
||||
ga: 'UA-54313258-1',
|
||||
},
|
||||
],
|
||||
],
|
||||
head: [
|
||||
[
|
||||
'link',
|
||||
@ -116,7 +124,7 @@ module.exports = {
|
||||
},
|
||||
{
|
||||
text: 'Website',
|
||||
link: 'https://strapi',
|
||||
link: 'https://strapi.io',
|
||||
},
|
||||
{
|
||||
text: 'Slack',
|
||||
|
||||
@ -20,6 +20,18 @@
|
||||
>{{ $siteTitle }}</span>
|
||||
</router-link>
|
||||
|
||||
<span
|
||||
class="deprecated"
|
||||
v-if="isAlpha">
|
||||
Deprecated docs -
|
||||
<router-link
|
||||
:to="$localePath"
|
||||
class="home-link"
|
||||
>
|
||||
current version
|
||||
</router-link>
|
||||
</span>
|
||||
|
||||
<div
|
||||
class="links"
|
||||
:style="linksWrapMaxWidth ? {
|
||||
@ -43,7 +55,8 @@ export default {
|
||||
components: { SidebarButton, NavLinks, AlgoliaSearchBox, SearchBox},
|
||||
data () {
|
||||
return {
|
||||
linksWrapMaxWidth: null
|
||||
linksWrapMaxWidth: null,
|
||||
isAlpha: false
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
@ -59,6 +72,7 @@ export default {
|
||||
}
|
||||
handleLinksWrapWidth()
|
||||
window.addEventListener('resize', handleLinksWrapWidth, false)
|
||||
this.isAlpha = /documentation\/3.0.0-alpha.x/.test(window.location.href)
|
||||
},
|
||||
computed: {
|
||||
algolia () {
|
||||
@ -80,6 +94,12 @@ $navbar-horizontal-padding = 1.5rem
|
||||
.navbar
|
||||
padding $navbar-vertical-padding $navbar-horizontal-padding
|
||||
line-height $navbarHeight - 1.4rem
|
||||
.deprecated
|
||||
padding 0 0.5rem
|
||||
margin-left 1rem
|
||||
font-weight 600
|
||||
background-color #fff3cd
|
||||
border-radius .25rem
|
||||
a, span, img
|
||||
display inline-block
|
||||
.logo
|
||||
|
||||
@ -97,6 +97,12 @@ strapi(/* {...} */).start();
|
||||
|
||||
If you want to host the administration on another server than the API, [please take a look at this dedicated section](../admin-panel/deploy.md).
|
||||
|
||||
## Docker
|
||||
|
||||
In this section, you will not find a specific guide to deploy your app with [Docker](https://www.docker.com/).
|
||||
|
||||
We recently updated the [strapi/strapi-docker](https://github.com/strapi/strapi-docker) GitHub repository that contains all informations needed to user Strapi with Docker.
|
||||
|
||||
## Amazon AWS
|
||||
|
||||
This is a step-by-step guide for deploying a Strapi project to [Amazon AWS EC2](https://aws.amazon.com/ec2/). This guide will connect to an [Amazon AWS RDS](https://aws.amazon.com/rds/) for managing and hosting the database. Optionally, this guide will show you how to connect host and serve images on [Amazon AWS S3](https://aws.amazon.com/s3/). Prior to starting this guide, you should have created a [Strapi project](../getting-started/quick-start.md), to use for deploying on AWS.
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vuepress/plugin-medium-zoom": "^1.2.0",
|
||||
"@vuepress/plugin-google-analytics": "^1.2.0",
|
||||
"vuepress": "^1.2.0",
|
||||
"vuepress-plugin-element-tabs": "^0.1.8"
|
||||
}
|
||||
|
||||
@ -886,6 +886,11 @@
|
||||
dependencies:
|
||||
lodash.debounce "^4.0.8"
|
||||
|
||||
"@vuepress/plugin-google-analytics@^1.2.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@vuepress/plugin-google-analytics/-/plugin-google-analytics-1.2.0.tgz#54555fd14f01a032c5acff04ecbbe0911577d7d0"
|
||||
integrity sha512-0zol5D4Efb5GKel7ADO/s65MLtKSLnOEGkeWzuipkWomSQPzP7TJ3+/RcYBnGdyBFHd1BSpTUHGK0b/IGwM3UA==
|
||||
|
||||
"@vuepress/plugin-last-updated@^1.2.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@vuepress/plugin-last-updated/-/plugin-last-updated-1.2.0.tgz#7b34065b793848b0482a222b7a6f1b7df3668cdc"
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
},
|
||||
"body": {
|
||||
"type": "dynamiczone",
|
||||
"components": ["default.closingperiod", "default.restaurantservice", "default.openingtimes"]
|
||||
"components": []
|
||||
},
|
||||
"description": {
|
||||
"type": "richtext",
|
||||
|
||||
@ -1,47 +1,47 @@
|
||||
{
|
||||
"Analytics": "Аналитика",
|
||||
"Content Manager": "Редактор контента",
|
||||
"Content Type Builder": "Типы Контента",
|
||||
"Content Type Builder": "Конструктор типов контента",
|
||||
"Documentation": "Документация",
|
||||
"Email": "Email",
|
||||
"Email": "E-mail",
|
||||
"Files Upload": "Загрузка файлов",
|
||||
"HomePage.notification.newsLetter.success": "Успешная подписка на рассылку новостей",
|
||||
"HomePage.notification.newsLetter.success": "Успешная подписка на новостную рассылку",
|
||||
"New entry": "Новая запись",
|
||||
"Password": "Пароль",
|
||||
"Provider": "Провайдер",
|
||||
"ResetPasswordToken": "Сбросить токен пароля",
|
||||
"ResetPasswordToken": "Сброс токена пароля",
|
||||
"Role": "Роль",
|
||||
"Roles & Permissions": "Роли и доступы",
|
||||
"Settings Manager": "Менеджер Настроек",
|
||||
"Username": "Имя пользователя",
|
||||
"Users": "Пользователи",
|
||||
"Users & Permissions": "Пользователи & Доступы",
|
||||
"Users & Permissions": "Пользователи и доступы",
|
||||
"app.components.BlockLink.code": "Примеры кода",
|
||||
"app.components.BlockLink.code.content": "Обучайтесь на реальных проектах, разработанных в сообществе.",
|
||||
"app.components.BlockLink.documentation": "Прочитать документацию",
|
||||
"app.components.BlockLink.documentation": "Читать документацию",
|
||||
"app.components.BlockLink.documentation.content": "Ознакомьтесь с концепциями, справочниками и обучающими материалами.",
|
||||
"app.components.Button.cancel": "Отменить",
|
||||
"app.components.Button.save": "Сохранить",
|
||||
"app.components.ComingSoonPage.comingSoon": "Скоро",
|
||||
"app.components.ComingSoonPage.featuresNotAvailable": "Этот функционал все еще находится в стадии активной разработки.",
|
||||
"app.components.ComingSoonPage.featuresNotAvailable": "Этот функционал все еще находится в активной разработке.",
|
||||
"app.components.DownloadInfo.download": "Выполняется загрузка...",
|
||||
"app.components.DownloadInfo.text": "Это может занять около минуты. Спасибо за ваше терпение.",
|
||||
"app.components.EmptyAttributes.title": "Пока нет полей",
|
||||
"app.components.HomePage.button.blog": "СМОТРИТЕ БОЛЬШЕ В БЛОГЕ",
|
||||
"app.components.HomePage.button.quickStart": "ОЗНАКОМИТЬСЯ С РУКОВОДСТВОМ ПО БЫСТРОМУ СТАРТУ",
|
||||
"app.components.HomePage.community": "Найдите сообщество в интернете",
|
||||
"app.components.HomePage.community.content": "Обсуждайте с членами команды и разработчиками в разных каналах",
|
||||
"app.components.HomePage.community.content": "Обсуждайте с членами команды и разработчиками в разных каналах.",
|
||||
"app.components.HomePage.create": "Создайте ваш первый Тип Контента",
|
||||
"app.components.HomePage.createBlock.content.first": " ",
|
||||
"app.components.HomePage.createBlock.content.second": " — плагин, который поможет вам определить структуру ваших данных. Если вы новичок, мы настоятельно рекомендуем вам изучить наше ",
|
||||
"app.components.HomePage.createBlock.content.second": " — плагин, который поможет вам определить структуру ваших моделей данных. Если вы новичок, мы настоятельно рекомендуем вам изучить наше ",
|
||||
"app.components.HomePage.createBlock.content.tutorial": " руководство.",
|
||||
"app.components.HomePage.cta": "ПОДПИСАТЬСЯ",
|
||||
"app.components.HomePage.cta": "ПОДТВЕРДИТЬ",
|
||||
"app.components.HomePage.newsLetter": "Подпишитесь на рассылку, чтобы быть в курсе новостей Strapi",
|
||||
"app.components.HomePage.support": "ПОДДЕРЖИТЕ НАС",
|
||||
"app.components.HomePage.support.content": "Покупая футболку, вы помогаете нам продолжать работу над проектом и предоставлять вам наилучшее из возможных решений!",
|
||||
"app.components.HomePage.support.link": "ЗАКАЗАТЬ ФУТБОЛКУ СЕЙЧАС",
|
||||
"app.components.HomePage.welcome": "Добро пожаловать!",
|
||||
"app.components.HomePage.welcome.again": "Добро пожаловать, ",
|
||||
"app.components.HomePage.welcome": "Добро пожаловать на борт!",
|
||||
"app.components.HomePage.welcome.again": "Добро пожаловать ",
|
||||
"app.components.HomePage.welcomeBlock.content": "Мы рады, что вы присоединились к сообществу. Нам необходима обратная связь для развития проекта, поэтому не стесняйтесь писать нам в ",
|
||||
"app.components.HomePage.welcomeBlock.content.again": "Надеемся, что вы делаете успехи в вашем проекте... Следите за последними новостями Strapi. Мы стараемся изо всех сил, чтобы улучшить продукт, основываясь на ваших пожеланиях.",
|
||||
"app.components.HomePage.welcomeBlock.content.issues": "проблемах.",
|
||||
@ -50,14 +50,14 @@
|
||||
"app.components.ImgPreview.hint.browse": "выберите",
|
||||
"app.components.InputFile.newFile": "Добавить новый файл",
|
||||
"app.components.InputFileDetails.open": "Открыть в новой вкладке",
|
||||
"app.components.InputFileDetails.originalName": "Первоначальное название:",
|
||||
"app.components.InputFileDetails.originalName": "Оригинальное название:",
|
||||
"app.components.InputFileDetails.remove": "Удалить этот файл",
|
||||
"app.components.InputFileDetails.size": "Размер:",
|
||||
"app.components.InstallPluginPage.Download.title": "Загрузка...",
|
||||
"app.components.InstallPluginPage.Download.description": "Для загрузки и установки плагина может потребоваться несколько секунд.",
|
||||
"app.components.InstallPluginPage.InputSearch.label": " ",
|
||||
"app.components.InstallPluginPage.InputSearch.placeholder": "Искать плагин... (ex: authentication)",
|
||||
"app.components.InstallPluginPage.description": "Расширяйте ваше приложение без усилий.",
|
||||
"app.components.InstallPluginPage.InputSearch.placeholder": "Поиск плагина... (например: аутентификация)",
|
||||
"app.components.InstallPluginPage.description": "Расширяйте ваше приложение без особых усилий.",
|
||||
"app.components.InstallPluginPage.helmet": "Магазин - Плагины",
|
||||
"app.components.InstallPluginPage.plugin.support-us.description": "Поддержите нас, купив футболку Strapi. Это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!",
|
||||
"app.components.InstallPluginPage.title": "Магазин - Плагины",
|
||||
@ -65,9 +65,9 @@
|
||||
"app.components.InstallPluginPopup.navLink.avis": "avis",
|
||||
"app.components.InstallPluginPopup.navLink.changelog": "журнал изменений",
|
||||
"app.components.InstallPluginPopup.navLink.description": "Описание",
|
||||
"app.components.InstallPluginPopup.navLink.faq": "faq",
|
||||
"app.components.InstallPluginPopup.navLink.faq": "ФАК",
|
||||
"app.components.InstallPluginPopup.navLink.screenshots": "Скриншоты",
|
||||
"app.components.InstallPluginPopup.noDescription": "Нет описания",
|
||||
"app.components.InstallPluginPopup.noDescription": "Нет доступного описания",
|
||||
"app.components.LeftMenuFooter.documentation": "Документация",
|
||||
"app.components.LeftMenuFooter.help": "Помощь",
|
||||
"app.components.LeftMenuFooter.poweredBy": "Работает на ",
|
||||
@ -77,7 +77,7 @@
|
||||
"app.components.LeftMenuLinkContainer.listPlugins": "Плагины",
|
||||
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "Нет установленных плагинов",
|
||||
"app.components.LeftMenuLinkContainer.plugins": "Плагины",
|
||||
"app.components.ListPluginsPage.description": "Список установленных плагинов.",
|
||||
"app.components.ListPluginsPage.description": "Список установленных плагинов в проекте.",
|
||||
"app.components.ListPluginsPage.helmet.title": "Список плагинов",
|
||||
"app.components.ListPluginsPage.title": "Плагины",
|
||||
"app.components.Logout.admin": "Управлять администраторами",
|
||||
@ -94,8 +94,8 @@
|
||||
"app.components.PluginCard.compatible": "Совместимо с вашим приложением",
|
||||
"app.components.PluginCard.compatibleCommunity": "Совместимо с сообществом",
|
||||
"app.components.PluginCard.more-details": "Больше деталей",
|
||||
"app.components.PluginCard.PopUpWarning.install.impossible.autoReload.needed": "Функция автоматической перезагрузки должна быть отключена. Пожалуйста, запустите ваше приложение с помощью `yarn develop`.",
|
||||
"app.components.PluginCard.PopUpWarning.install.impossible.environment": "В целях безопасности плагин может быть загружен только в develop-окружении.",
|
||||
"app.components.PluginCard.PopUpWarning.install.impossible.autoReload.needed": "Функция autoReload (автоматической перезагрузки) должна быть отключена. Пожалуйста, запустите ваше приложение с помощью `yarn develop`.",
|
||||
"app.components.PluginCard.PopUpWarning.install.impossible.environment": "В целях безопасности плагин может быть загружен только в среде разработки.",
|
||||
"app.components.PluginCard.PopUpWarning.install.impossible.confirm": "Я понимаю!",
|
||||
"app.components.PluginCard.PopUpWarning.install.impossible.title": "Загрузка невозможна",
|
||||
"app.components.PluginCard.price.free": "Бесплатно",
|
||||
@ -104,7 +104,7 @@
|
||||
"app.components.listPlugins.title.none": "Нет установленных плагинов",
|
||||
"app.components.listPlugins.title.plural": "{number} плагинов установлено",
|
||||
"app.components.listPlugins.title.singular": "{number} плагин установлен",
|
||||
"app.components.listPluginsPage.deletePlugin.error": "Возникла ошибка при установке плагина",
|
||||
"app.components.listPluginsPage.deletePlugin.error": "Произошла ошибка при удалении плагина",
|
||||
"app.utils.SelectOption.defaultMessage": " ",
|
||||
"app.utils.defaultMessage": " ",
|
||||
"app.utils.placeholder.defaultMessage": " ",
|
||||
@ -118,23 +118,24 @@
|
||||
"components.Input.error.custom-error": "{errorMessage} ",
|
||||
"components.Input.error.validation.email": "Это не адрес электронной почты",
|
||||
"components.Input.error.validation.json": "Не соответствует JSON формату",
|
||||
"components.Input.error.validation.max": "Слишком большое.",
|
||||
"components.Input.error.validation.maxLength": "Слишком длинное.",
|
||||
"components.Input.error.validation.min": "Слишком маленькое.",
|
||||
"components.Input.error.validation.minLength": "Слишком короткое.",
|
||||
"components.Input.error.validation.max": "Значение слишком большое.",
|
||||
"components.Input.error.validation.maxLength": "Значение слишком длинное.",
|
||||
"components.Input.error.validation.min": "Значение слишком маленькое.",
|
||||
"components.Input.error.validation.minLength": "Значение слишком короткое.",
|
||||
"components.Input.error.validation.minSupMax": "Не может быть выше",
|
||||
"components.Input.error.validation.regex": "Не соответствует регулярному выражению.",
|
||||
"components.Input.error.validation.required": "Необходимое поле для заполнения.",
|
||||
"components.Input.error.validation.regex": "Значение не соответствует регулярному выражению.",
|
||||
"components.Input.error.validation.required": "Обязательное значение.",
|
||||
"components.InputSelect.option.placeholder": "Выберите здесь",
|
||||
"components.ListRow.empty": "Нет данных для отображения.",
|
||||
"components.OverlayBlocker.description": "Вы воспользовались функционалом, который требует перезапуска сервера. Пожалуйста, подождите.",
|
||||
"components.OverlayBlocker.description": "Вы воспользовались функционалом, который требует перезапуска сервера. Пожалуйста, подождите, пока сервер не будет запущен.",
|
||||
"components.OverlayBlocker.description.serverError": "Сервер должен был перезагрузиться, пожалуйста, проверьте ваши логи в терминале.",
|
||||
"components.OverlayBlocker.title": "Ожидание перезапуска...",
|
||||
"components.OverlayBlocker.title.serverError": "Перезапуск занимает больше времени, чем ожидалось",
|
||||
"components.PageFooter.select": "записей на странице",
|
||||
"components.ProductionBlocker.description": "Для безопасности мы должны заблокировать его для других вариантов.",
|
||||
"components.ProductionBlocker.description": "В целях безопасности мы должны отключить этот плагин в других средах.",
|
||||
"components.ProductionBlocker.header": "Этот плагин доступен только на стадии разработки.",
|
||||
"components.Wysiwyg.ToggleMode.markdown": "Переключить в режим markdown",
|
||||
"components.Wysiwyg.ToggleMode.preview": "Переключить в режим предпросмотра",
|
||||
"components.Wysiwyg.ToggleMode.markdown": "Переключиться в режим markdown",
|
||||
"components.Wysiwyg.ToggleMode.preview": "Переключиться в режим предпросмотра",
|
||||
"components.Wysiwyg.collapse": "Свернуть",
|
||||
"components.Wysiwyg.selectOptions.H1": "Заголовок H1",
|
||||
"components.Wysiwyg.selectOptions.H2": "Заголовок H2",
|
||||
@ -143,7 +144,7 @@
|
||||
"components.Wysiwyg.selectOptions.H5": "Заголовок H5",
|
||||
"components.Wysiwyg.selectOptions.H6": "Заголовок H6",
|
||||
"components.Wysiwyg.selectOptions.title": "Добавить заголовок",
|
||||
"components.WysiwygBottomControls.charactersIndicators": "букв",
|
||||
"components.WysiwygBottomControls.charactersIndicators": "символов",
|
||||
"components.WysiwygBottomControls.fullscreen": "Развернуть",
|
||||
"components.WysiwygBottomControls.uploadFiles": "Перетащите файлы в эту область, вставьте из буфера обмена или {browse}.",
|
||||
"components.WysiwygBottomControls.uploadFiles.browse": "выберите их",
|
||||
@ -155,31 +156,41 @@
|
||||
"notification.error.layout": "Не удалось получить макет",
|
||||
"request.error.model.unknown": "Модель данных не существует",
|
||||
"app.utils.delete": "Удалить",
|
||||
"HomePage.helmet.title": "Домашняя страница",
|
||||
"HomePage.welcome.congrats": "Поздравляем!",
|
||||
"HomePage.welcome.congrats.content": "Вы вошли как первый администратор. Чтобы открыть для себя мощные функции, предоставляемые Strapi,",
|
||||
"HomePage.welcome.congrats.content.bold": "мы рекомендуем вам создать свой первый тип контента.",
|
||||
"HomePage.community": "Присоединяйтесь к сообществу",
|
||||
"HomePage.roadmap": "Смотрите нашу дорожную карту",
|
||||
"HomePage.greetings": "Привет {name}!",
|
||||
|
||||
"Auth.advanced.allow_register": "",
|
||||
"Auth.privacy-policy-agreement.terms": "условия",
|
||||
"Auth.privacy-policy-agreement.policy": "политика конфиденциальности",
|
||||
"Auth.form.button.forgot-password": "Отправить письмо",
|
||||
"Auth.form.button.forgot-password.success": "Отправить еще раз",
|
||||
"Auth.form.button.login": "Войти",
|
||||
"Auth.form.button.register": "Готов начать",
|
||||
"Auth.form.button.register-success": "Отправить еще раз",
|
||||
"Auth.form.button.reset-password": "Сменить пароль",
|
||||
"Auth.form.error.blocked": "Ваш аккаунт заблокирован администратором.",
|
||||
"Auth.form.error.code.provide": "Неверный код.",
|
||||
"Auth.form.error.confirmed": "Адрес электронной почты не подтвержден.",
|
||||
"Auth.form.error.email.invalid": "Неправильный адрес электронной почты.",
|
||||
"Auth.form.error.email.provide": "Укажите свое имя пользователя или адрес электронной почты.",
|
||||
"Auth.form.error.email.taken": "Данный email уже используется",
|
||||
"Auth.form.error.blocked": "Ваш аккаунт был заблокирован администратором.",
|
||||
"Auth.form.error.code.provide": "Указан неверный код.",
|
||||
"Auth.form.error.confirmed": "Ваш e-mail не подтвержден.",
|
||||
"Auth.form.error.email.invalid": "Неправильный e-mail.",
|
||||
"Auth.form.error.email.provide": "Укажите свое имя пользователя или e-mail.",
|
||||
"Auth.form.error.email.taken": "Данный e-mail уже используется",
|
||||
"Auth.form.error.invalid": "Неверный логин или пароль.",
|
||||
"Auth.form.error.noAdminAccess": "У вас нет доступа к панели администрирования.",
|
||||
"Auth.form.error.params.provide": "Неправильные параметры.",
|
||||
"Auth.form.error.params.provide": "Предоставлены неверные параметры.",
|
||||
"Auth.form.error.password.format": "Пароль не может содержать символ `$` больше трех раз.",
|
||||
"Auth.form.error.password.local": "Этот пользователь никогда не задавал пароль, пожалуйста, войдите в систему через провайдера, используемого при создании учетной записи.",
|
||||
"Auth.form.error.password.matching": "Пароль не соответствует.",
|
||||
"Auth.form.error.password.provide": "Укажите свой пароль.",
|
||||
"Auth.form.error.ratelimit": "Слишком много попыток. Пожалуйста, попробуйте позже.",
|
||||
"Auth.form.error.user.not-exist": "Этот email не существует.",
|
||||
"Auth.form.error.ratelimit": "Слишком много попыток, повторите через минуту",
|
||||
"Auth.form.error.user.not-exist": "Этот e-mail не существует.",
|
||||
"Auth.form.error.username.taken": "Имя пользователя уже используется",
|
||||
"Auth.form.forgot-password.email.label": "Введите ваш email",
|
||||
"Auth.form.forgot-password.email.label.success": "Письмо успешно отправлено",
|
||||
"Auth.form.forgot-password.email.label": "Введите ваш e-mail",
|
||||
"Auth.form.forgot-password.email.label.success": "Письмо успешно отправлено e-mail",
|
||||
"Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com",
|
||||
"Auth.form.header.forgot-password": "strapi",
|
||||
"Auth.form.header.login": "strapi",
|
||||
@ -189,17 +200,20 @@
|
||||
"Auth.form.login.rememberMe.label": "Запомнить меня",
|
||||
"Auth.form.login.username.label": "Имя пользователя",
|
||||
"Auth.form.login.username.placeholder": "John Doe",
|
||||
"Auth.form.register-success.email.label": "Письмо успешно отправлено",
|
||||
"Auth.form.register-success.email.label": "Письмо успешно отправлено e-mail",
|
||||
"Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com",
|
||||
"Auth.form.register.confirmPassword.label": "Подтверждение пароля",
|
||||
"Auth.form.register.email.label": "Email",
|
||||
"Auth.form.register.email.label": "E-mail",
|
||||
"Auth.form.register.email.placeholder": "johndoe@gmail.com",
|
||||
|
||||
"Auth.form.register.news.label": "Держите меня в курсе о новых функциях и предстоящих улучшениях (делая это, вы принимаете {terms} и {policy}).",
|
||||
"Auth.form.register.password.label": "Пароль",
|
||||
"Auth.form.register.username.label": "Имя пользователя",
|
||||
"Auth.form.register.username.placeholder": "John Doe",
|
||||
"Auth.header.register.description": "Для завершения установки и обеспечения безопасности приложения, создайте вашего первого пользователя (root admin), заполнив форму ниже.",
|
||||
"Auth.link.forgot-password": "Забыли пароль?",
|
||||
"Auth.link.ready": "Готовы войти?",
|
||||
"components.Input.error.password.noMatch": "Пароль не совпадает"
|
||||
"app.containers.App.notification.error.init": "Произошла ошибка при запросе к API",
|
||||
"components.Input.error.password.noMatch": "Пароль не совпадает",
|
||||
"form.button.done": "Выполнено",
|
||||
"notification.form.error.fields": "Форма содержит некоторые ошибки"
|
||||
}
|
||||
|
||||
@ -11,15 +11,15 @@
|
||||
"test": "echo \"no tests yet\""
|
||||
},
|
||||
"dependencies": {
|
||||
"apollo-server-koa": "^2.9.0",
|
||||
"apollo-server-koa": "2.9.12",
|
||||
"dataloader": "^1.4.0",
|
||||
"glob": "^7.1.4",
|
||||
"graphql": "^14.3.0",
|
||||
"graphql-depth-limit": "^1.1.0",
|
||||
"graphql-playground-middleware-koa": "^1.6.0",
|
||||
"graphql-tools": "^4.0.4",
|
||||
"graphql-tools": "4.0.6",
|
||||
"graphql-type-datetime": "^0.2.4",
|
||||
"graphql-type-json": "^0.3.0",
|
||||
"graphql-type-json": "0.3.1",
|
||||
"graphql-type-long": "^0.1.1",
|
||||
"koa-compose": "^4.1.0",
|
||||
"pluralize": "^7.0.0",
|
||||
|
||||
@ -8,6 +8,8 @@
|
||||
|
||||
const _ = require('lodash');
|
||||
|
||||
const DynamicZoneScalar = require('../types/dynamiczoneScalar');
|
||||
|
||||
const Aggregator = require('./Aggregator');
|
||||
const Query = require('./Query.js');
|
||||
const Mutation = require('./Mutation.js');
|
||||
@ -42,6 +44,58 @@ const generateEnumDefinitions = (attributes, globalId) => {
|
||||
.join('');
|
||||
};
|
||||
|
||||
const generateDynamicZoneDefinitions = (attributes, globalId, schema) => {
|
||||
Object.keys(attributes)
|
||||
.filter(attribute => attributes[attribute].type === 'dynamiczone')
|
||||
.forEach(attribute => {
|
||||
const { components } = attributes[attribute];
|
||||
|
||||
const typeName = `${globalId}${_.upperFirst(
|
||||
_.camelCase(attribute)
|
||||
)}DynamicZone`;
|
||||
|
||||
if (components.length === 0) {
|
||||
// Create dummy type because graphql doesn't support empty ones
|
||||
|
||||
schema.definition += `type ${typeName} { _:Boolean}`;
|
||||
schema.definition += `\nscalar EmptyQuery\n`;
|
||||
} else {
|
||||
const componentsTypeNames = components.map(componentUID => {
|
||||
const compo = strapi.components[componentUID];
|
||||
if (!compo) {
|
||||
throw new Error(
|
||||
`Trying to creating dynamiczone type with unkown component ${componentUID}`
|
||||
);
|
||||
}
|
||||
|
||||
return compo.globalId;
|
||||
});
|
||||
|
||||
const unionType = `union ${typeName} = ${componentsTypeNames.join(
|
||||
' | '
|
||||
)}`;
|
||||
|
||||
schema.definition += `\n${unionType}\n`;
|
||||
}
|
||||
|
||||
const inputTypeName = `${typeName}Input`;
|
||||
schema.definition += `\nscalar ${inputTypeName}\n`;
|
||||
|
||||
schema.resolvers[typeName] = {
|
||||
__resolveType(obj) {
|
||||
return strapi.components[obj.__component].globalId;
|
||||
},
|
||||
};
|
||||
|
||||
schema.resolvers[inputTypeName] = new DynamicZoneScalar({
|
||||
name: inputTypeName,
|
||||
attribute,
|
||||
globalId,
|
||||
components,
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const mutateAssocAttributes = (associations = [], attributes) => {
|
||||
associations
|
||||
.filter(association => association.type === 'collection')
|
||||
@ -61,158 +115,175 @@ const buildAssocResolvers = (model, name, { plugin }) => {
|
||||
const { primaryKey, associations = [] } = model;
|
||||
|
||||
return associations
|
||||
.filter(association => model.attributes[association.alias].private !== true)
|
||||
.reduce((resolver, association) => {
|
||||
switch (association.nature) {
|
||||
case 'oneToManyMorph': {
|
||||
resolver[association.alias] = async obj => {
|
||||
const entry = await contentManager.fetch(
|
||||
{
|
||||
id: obj[primaryKey],
|
||||
model: name,
|
||||
},
|
||||
plugin,
|
||||
[association.alias]
|
||||
);
|
||||
|
||||
// Set the _type only when the value is defined
|
||||
if (entry[association.alias]) {
|
||||
entry[association.alias]._type = _.upperFirst(association.model);
|
||||
}
|
||||
|
||||
return entry[association.alias];
|
||||
};
|
||||
break;
|
||||
}
|
||||
case 'manyMorphToOne':
|
||||
case 'manyMorphToMany':
|
||||
case 'manyToManyMorph': {
|
||||
resolver[association.alias] = async obj => {
|
||||
// eslint-disable-line no-unused-vars
|
||||
const [withRelated, withoutRelated] = await Promise.all([
|
||||
contentManager.fetch(
|
||||
.filter(association => model.attributes[association.alias].private !== true)
|
||||
.reduce((resolver, association) => {
|
||||
switch (association.nature) {
|
||||
case 'oneToManyMorph': {
|
||||
resolver[association.alias] = async obj => {
|
||||
const entry = await contentManager.fetch(
|
||||
{
|
||||
id: obj[primaryKey],
|
||||
model: name,
|
||||
},
|
||||
plugin,
|
||||
[association.alias],
|
||||
false
|
||||
),
|
||||
contentManager.fetch(
|
||||
{
|
||||
id: obj[primaryKey],
|
||||
model: name,
|
||||
},
|
||||
plugin,
|
||||
[]
|
||||
),
|
||||
]);
|
||||
|
||||
const entry =
|
||||
withRelated && withRelated.toJSON
|
||||
? withRelated.toJSON()
|
||||
: withRelated;
|
||||
|
||||
entry[association.alias].map((entry, index) => {
|
||||
const type =
|
||||
_.get(withoutRelated, `${association.alias}.${index}.kind`) ||
|
||||
_.upperFirst(
|
||||
_.camelCase(
|
||||
_.get(
|
||||
withoutRelated,
|
||||
`${association.alias}.${index}.${association.alias}_type`
|
||||
)
|
||||
)
|
||||
) ||
|
||||
_.upperFirst(_.camelCase(association[association.type]));
|
||||
|
||||
entry._type = type;
|
||||
|
||||
return entry;
|
||||
});
|
||||
|
||||
return entry[association.alias];
|
||||
};
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
resolver[association.alias] = async (obj, options) => {
|
||||
// Construct parameters object to retrieve the correct related entries.
|
||||
const params = {
|
||||
model: association.model || association.collection,
|
||||
};
|
||||
|
||||
let queryOpts = {
|
||||
source: association.plugin,
|
||||
};
|
||||
|
||||
// Get refering model.
|
||||
const ref = association.plugin
|
||||
? strapi.plugins[association.plugin].models[params.model]
|
||||
: strapi.models[params.model];
|
||||
|
||||
if (association.type === 'model') {
|
||||
params[ref.primaryKey] = _.get(
|
||||
obj,
|
||||
[association.alias, ref.primaryKey],
|
||||
obj[association.alias]
|
||||
[association.alias]
|
||||
);
|
||||
} else {
|
||||
const queryParams = Query.amountLimiting(options);
|
||||
queryOpts = {
|
||||
...queryOpts,
|
||||
...Query.convertToParams(_.omit(queryParams, 'where')), // Convert filters (sort, limit and start/skip)
|
||||
...Query.convertToQuery(queryParams.where),
|
||||
|
||||
// Set the _type only when the value is defined
|
||||
if (entry[association.alias]) {
|
||||
entry[association.alias]._type = _.upperFirst(association.model);
|
||||
}
|
||||
|
||||
return entry[association.alias];
|
||||
};
|
||||
break;
|
||||
}
|
||||
case 'manyMorphToOne':
|
||||
case 'manyMorphToMany':
|
||||
case 'manyToManyMorph': {
|
||||
resolver[association.alias] = async obj => {
|
||||
// eslint-disable-line no-unused-vars
|
||||
const [withRelated, withoutRelated] = await Promise.all([
|
||||
contentManager.fetch(
|
||||
{
|
||||
id: obj[primaryKey],
|
||||
model: name,
|
||||
},
|
||||
plugin,
|
||||
[association.alias],
|
||||
false
|
||||
),
|
||||
contentManager.fetch(
|
||||
{
|
||||
id: obj[primaryKey],
|
||||
model: name,
|
||||
},
|
||||
plugin,
|
||||
[]
|
||||
),
|
||||
]);
|
||||
|
||||
const entry =
|
||||
withRelated && withRelated.toJSON
|
||||
? withRelated.toJSON()
|
||||
: withRelated;
|
||||
|
||||
entry[association.alias].map((entry, index) => {
|
||||
const type =
|
||||
_.get(withoutRelated, `${association.alias}.${index}.kind`) ||
|
||||
_.upperFirst(
|
||||
_.camelCase(
|
||||
_.get(
|
||||
withoutRelated,
|
||||
`${association.alias}.${index}.${association.alias}_type`
|
||||
)
|
||||
)
|
||||
) ||
|
||||
_.upperFirst(_.camelCase(association[association.type]));
|
||||
|
||||
entry._type = type;
|
||||
|
||||
return entry;
|
||||
});
|
||||
|
||||
return entry[association.alias];
|
||||
};
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
resolver[association.alias] = async (obj, options) => {
|
||||
// Construct parameters object to retrieve the correct related entries.
|
||||
const params = {
|
||||
model: association.model || association.collection,
|
||||
};
|
||||
|
||||
if (
|
||||
((association.nature === 'manyToMany' && association.dominant) ||
|
||||
association.nature === 'manyWay') &&
|
||||
_.has(obj, association.alias) // if populated
|
||||
) {
|
||||
_.set(
|
||||
queryOpts,
|
||||
['query', ref.primaryKey],
|
||||
let queryOpts = {
|
||||
source: association.plugin,
|
||||
};
|
||||
|
||||
// Get refering model.
|
||||
const ref = association.plugin
|
||||
? strapi.plugins[association.plugin].models[params.model]
|
||||
: strapi.models[params.model];
|
||||
|
||||
if (association.type === 'model') {
|
||||
params[ref.primaryKey] = _.get(
|
||||
obj,
|
||||
[association.alias, ref.primaryKey],
|
||||
obj[association.alias]
|
||||
? obj[association.alias]
|
||||
.map(val => val[ref.primaryKey] || val)
|
||||
.sort()
|
||||
: []
|
||||
);
|
||||
} else {
|
||||
_.set(queryOpts, ['query', association.via], obj[ref.primaryKey]);
|
||||
const queryParams = Query.amountLimiting(options);
|
||||
queryOpts = {
|
||||
...queryOpts,
|
||||
...Query.convertToParams(_.omit(queryParams, 'where')), // Convert filters (sort, limit and start/skip)
|
||||
...Query.convertToQuery(queryParams.where),
|
||||
};
|
||||
|
||||
if (
|
||||
((association.nature === 'manyToMany' &&
|
||||
association.dominant) ||
|
||||
association.nature === 'manyWay') &&
|
||||
_.has(obj, association.alias) // if populated
|
||||
) {
|
||||
_.set(
|
||||
queryOpts,
|
||||
['query', ref.primaryKey],
|
||||
obj[association.alias]
|
||||
? obj[association.alias]
|
||||
.map(val => val[ref.primaryKey] || val)
|
||||
.sort()
|
||||
: []
|
||||
);
|
||||
} else {
|
||||
_.set(
|
||||
queryOpts,
|
||||
['query', association.via],
|
||||
obj[ref.primaryKey]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const loaderName = association.plugin
|
||||
? `${association.plugin}__${params.model}`
|
||||
: params.model;
|
||||
const loaderName = association.plugin
|
||||
? `${association.plugin}__${params.model}`
|
||||
: params.model;
|
||||
|
||||
return association.model
|
||||
? strapi.plugins.graphql.services.loaders.loaders[loaderName].load({
|
||||
params,
|
||||
options: queryOpts,
|
||||
single: true,
|
||||
})
|
||||
: strapi.plugins.graphql.services.loaders.loaders[loaderName].load({
|
||||
options: queryOpts,
|
||||
association,
|
||||
});
|
||||
};
|
||||
break;
|
||||
return association.model
|
||||
? strapi.plugins.graphql.services.loaders.loaders[
|
||||
loaderName
|
||||
].load({
|
||||
params,
|
||||
options: queryOpts,
|
||||
single: true,
|
||||
})
|
||||
: strapi.plugins.graphql.services.loaders.loaders[
|
||||
loaderName
|
||||
].load({
|
||||
options: queryOpts,
|
||||
association,
|
||||
});
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return resolver;
|
||||
}, {});
|
||||
return resolver;
|
||||
}, {});
|
||||
};
|
||||
|
||||
const buildModel = (model, name, { plugin, isComponent = false } = {}) => {
|
||||
const buildModel = (
|
||||
model,
|
||||
name,
|
||||
{ schema, plugin, isComponent = false } = {}
|
||||
) => {
|
||||
const { globalId, primaryKey } = model;
|
||||
|
||||
let definition = '';
|
||||
schema.resolvers[globalId] = {
|
||||
id: obj => obj[primaryKey],
|
||||
...buildAssocResolvers(model, name, { plugin }),
|
||||
};
|
||||
|
||||
const initialState = {
|
||||
id: 'ID!',
|
||||
[primaryKey]: 'ID!',
|
||||
@ -228,28 +299,17 @@ const buildModel = (model, name, { plugin, isComponent = false } = {}) => {
|
||||
mutateAssocAttributes(model.associations, attributes);
|
||||
_.merge(attributes, initialState);
|
||||
|
||||
definition += generateEnumDefinitions(model.attributes, globalId);
|
||||
schema.definition += generateEnumDefinitions(model.attributes, globalId);
|
||||
generateDynamicZoneDefinitions(model.attributes, globalId, schema);
|
||||
|
||||
const description = Schema.getDescription({}, model);
|
||||
const fields = Schema.formatGQL(attributes, {}, model);
|
||||
const typeDef = `${description}type ${globalId} {${fields}}\n`;
|
||||
|
||||
definition += typeDef;
|
||||
definition += Types.generateInputModel(model, globalId, {
|
||||
schema.definition += typeDef;
|
||||
schema.definition += Types.generateInputModel(model, globalId, {
|
||||
allowIds: isComponent,
|
||||
});
|
||||
|
||||
const resolver = {
|
||||
[globalId]: {
|
||||
id: obj => obj[primaryKey],
|
||||
...buildAssocResolvers(model, name, { plugin }),
|
||||
},
|
||||
};
|
||||
|
||||
return {
|
||||
definition,
|
||||
resolver,
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@ -263,7 +323,7 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
definition: '',
|
||||
query: {},
|
||||
mutation: {},
|
||||
resolver: { Query: {}, Mutation: {} },
|
||||
resolvers: { Query: {}, Mutation: {} },
|
||||
};
|
||||
|
||||
if (_.isEmpty(models)) {
|
||||
@ -286,7 +346,7 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
initialState['id'] = 'ID!';
|
||||
}
|
||||
|
||||
acc.resolver[globalId] = {
|
||||
acc.resolvers[globalId] = {
|
||||
// define the default id resolver
|
||||
id(parent) {
|
||||
return parent[model.primaryKey];
|
||||
@ -312,6 +372,7 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
_.merge(attributes, initialState);
|
||||
|
||||
acc.definition += generateEnumDefinitions(model.attributes, globalId);
|
||||
generateDynamicZoneDefinitions(model.attributes, globalId, acc);
|
||||
|
||||
const description = Schema.getDescription(type[globalId], model);
|
||||
const fields = Schema.formatGQL(attributes, type[globalId], model);
|
||||
@ -365,7 +426,7 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
query: {
|
||||
[`${singularName}(id: ID!)`]: model.globalId,
|
||||
},
|
||||
resolver: {
|
||||
resolvers: {
|
||||
Query: {
|
||||
[singularName]: queries.singular,
|
||||
},
|
||||
@ -378,7 +439,7 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
query: {
|
||||
[`${pluralName}(sort: String, limit: Int, start: Int, where: JSON)`]: `[${model.globalId}]`,
|
||||
},
|
||||
resolver: {
|
||||
resolvers: {
|
||||
Query: {
|
||||
[pluralName]: queries.plural,
|
||||
},
|
||||
@ -460,7 +521,7 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
// Assign mutation definition to global definition.
|
||||
_.merge(acc, {
|
||||
mutation: mutationDefinition,
|
||||
resolver: {
|
||||
resolvers: {
|
||||
Mutation: {
|
||||
[`${mutationName}`]: mutations[type],
|
||||
},
|
||||
@ -469,8 +530,7 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
}
|
||||
});
|
||||
|
||||
// TODO:
|
||||
// - Add support for Graphql Aggregation in Bookshelf ORM
|
||||
// TODO: Add support for Graphql Aggregation in Bookshelf ORM
|
||||
if (model.orm === 'mongoose') {
|
||||
// Generation the aggregation for the given model
|
||||
const modelAggregator = Aggregator.formatModelConnectionsGQL(
|
||||
@ -481,19 +541,17 @@ const buildShadowCRUD = (models, plugin) => {
|
||||
);
|
||||
if (modelAggregator) {
|
||||
acc.definition += modelAggregator.type;
|
||||
if (!acc.resolver[modelAggregator.globalId]) {
|
||||
acc.resolver[modelAggregator.globalId] = {};
|
||||
if (!acc.resolvers[modelAggregator.globalId]) {
|
||||
acc.resolvers[modelAggregator.globalId] = {};
|
||||
}
|
||||
|
||||
_.merge(acc.resolver, modelAggregator.resolver);
|
||||
_.merge(acc.resolvers, modelAggregator.resolver);
|
||||
_.merge(acc.query, modelAggregator.query);
|
||||
}
|
||||
}
|
||||
|
||||
// Build associations queries.
|
||||
_.merge(acc.resolver, {
|
||||
[globalId]: buildAssocResolvers(model, name, { plugin }),
|
||||
});
|
||||
acc.resolvers[globalId] = buildAssocResolvers(model, name, { plugin });
|
||||
|
||||
return acc;
|
||||
}, initialState);
|
||||
|
||||
@ -130,7 +130,7 @@ const schemaBuilder = {
|
||||
|
||||
generateSchema: function() {
|
||||
// Generate type definition and query/mutation for models.
|
||||
let shadowCRUD = { definition: '', query: '', mutation: '', resolver: '' };
|
||||
let shadowCRUD = { definition: '', query: '', mutation: '', resolvers: {} };
|
||||
|
||||
// build defaults schemas if shadowCRUD is enabled
|
||||
if (strapi.plugins.graphql.config.shadowCRUD !== false) {
|
||||
@ -157,22 +157,18 @@ const schemaBuilder = {
|
||||
}, modelCruds);
|
||||
}
|
||||
|
||||
let components = Object.keys(strapi.components)
|
||||
.map(key =>
|
||||
Resolvers.buildModel(strapi.components[key], key, {
|
||||
plugin: null,
|
||||
isComponent: true,
|
||||
})
|
||||
)
|
||||
.reduce(
|
||||
(acc, component) => {
|
||||
return {
|
||||
definition: acc.definition + component.definition,
|
||||
resolver: _.merge(acc.resolver, component.resolver),
|
||||
};
|
||||
},
|
||||
{ definition: '', resolver: {} }
|
||||
);
|
||||
const componentsSchema = {
|
||||
definition: '',
|
||||
resolvers: {},
|
||||
};
|
||||
|
||||
Object.keys(strapi.components).forEach(key =>
|
||||
Resolvers.buildModel(strapi.components[key], key, {
|
||||
plugin: null,
|
||||
isComponent: true,
|
||||
schema: componentsSchema,
|
||||
})
|
||||
);
|
||||
|
||||
// Extract custom definition, query or resolver.
|
||||
const {
|
||||
@ -192,8 +188,8 @@ const schemaBuilder = {
|
||||
const resolvers =
|
||||
_.omitBy(
|
||||
_.merge(
|
||||
shadowCRUD.resolver,
|
||||
components.resolver,
|
||||
shadowCRUD.resolvers,
|
||||
componentsSchema.resolvers,
|
||||
resolver,
|
||||
polymorphicResolver
|
||||
),
|
||||
@ -202,6 +198,10 @@ const schemaBuilder = {
|
||||
|
||||
// Transform object to only contain function.
|
||||
Object.keys(resolvers).reduce((acc, type) => {
|
||||
if (graphql.isScalarType(acc[type])) {
|
||||
return acc;
|
||||
}
|
||||
|
||||
return Object.keys(acc[type]).reduce((acc, resolverName) => {
|
||||
const resolverObj = acc[type][resolverName];
|
||||
// Disabled this query.
|
||||
@ -251,7 +251,7 @@ const schemaBuilder = {
|
||||
break;
|
||||
}
|
||||
case 'Query':
|
||||
default:
|
||||
default: {
|
||||
acc[type][resolverName] = Query.composeQueryResolver({
|
||||
_schema: strapi.plugins.graphql.config._schema.graphql,
|
||||
plugin,
|
||||
@ -259,6 +259,7 @@ const schemaBuilder = {
|
||||
isSingular: 'force', // Avoid singular/pluralize and force query name.
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return acc;
|
||||
@ -274,7 +275,7 @@ const schemaBuilder = {
|
||||
let typeDefs = `
|
||||
${definition}
|
||||
${shadowCRUD.definition}
|
||||
${components.definition}
|
||||
${componentsSchema.definition}
|
||||
type Query {${shadowCRUD.query &&
|
||||
this.formatGQL(
|
||||
shadowCRUD.query,
|
||||
|
||||
@ -9,14 +9,12 @@
|
||||
const _ = require('lodash');
|
||||
const { GraphQLUpload } = require('apollo-server-koa');
|
||||
const graphql = require('graphql');
|
||||
const GraphQLJSON = require('graphql-type-json');
|
||||
const { GraphQLJSON } = require('graphql-type-json');
|
||||
const GraphQLDateTime = require('graphql-type-datetime');
|
||||
const GraphQLLong = require('graphql-type-long');
|
||||
|
||||
const { toSingular } = require('./naming');
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* Convert Strapi type to GraphQL type.
|
||||
@ -35,7 +33,11 @@ module.exports = {
|
||||
action = '',
|
||||
}) {
|
||||
// Type
|
||||
if (definition.type && definition.type !== 'component') {
|
||||
if (
|
||||
definition.type &&
|
||||
definition.type !== 'component' &&
|
||||
definition.type !== 'dynamiczone'
|
||||
) {
|
||||
let type = 'String';
|
||||
|
||||
switch (definition.type) {
|
||||
@ -97,6 +99,22 @@ module.exports = {
|
||||
return `${typeName}`;
|
||||
}
|
||||
|
||||
if (definition.type === 'dynamiczone') {
|
||||
const { required } = definition;
|
||||
|
||||
const unionName = `${modelName}${_.upperFirst(
|
||||
_.camelCase(attributeName)
|
||||
)}DynamicZone`;
|
||||
|
||||
let typeName = unionName;
|
||||
|
||||
if (rootType === 'mutation') {
|
||||
typeName = `${unionName}Input!`;
|
||||
}
|
||||
|
||||
return `[${typeName}]${required ? '!' : ''}`;
|
||||
}
|
||||
|
||||
const ref = definition.model || definition.collection;
|
||||
|
||||
// Association
|
||||
@ -192,7 +210,7 @@ module.exports = {
|
||||
polymorphicDef: `union Morph = ${types.join(' | ')}`,
|
||||
polymorphicResolver: {
|
||||
Morph: {
|
||||
__resolveType(obj, context, info) {
|
||||
__resolveType(obj) {
|
||||
// eslint-disable-line no-unused-vars
|
||||
return obj.kind || obj._type;
|
||||
},
|
||||
|
||||
50
packages/strapi-plugin-graphql/types/dynamiczoneScalar.js
Normal file
50
packages/strapi-plugin-graphql/types/dynamiczoneScalar.js
Normal file
@ -0,0 +1,50 @@
|
||||
'use strict';
|
||||
|
||||
const _ = require('lodash');
|
||||
const {
|
||||
Kind,
|
||||
GraphQLScalarType,
|
||||
valueFromASTUntyped,
|
||||
GraphQLError,
|
||||
} = require('graphql');
|
||||
|
||||
module.exports = function DynamicZoneScalar({
|
||||
name,
|
||||
attribute,
|
||||
globalId,
|
||||
components,
|
||||
}) {
|
||||
const parseData = value => {
|
||||
const compo = Object.values(strapi.components).find(
|
||||
compo => compo.globalId === value.__typename
|
||||
);
|
||||
|
||||
if (!compo) {
|
||||
throw new GraphQLError(
|
||||
`Component not found. expected one of: ${components
|
||||
.map(uid => strapi.components[uid].globalId)
|
||||
.join(', ')}`
|
||||
);
|
||||
}
|
||||
|
||||
const finalValue = {
|
||||
__component: compo.uid,
|
||||
..._.omit(value, ['__typename']),
|
||||
};
|
||||
|
||||
return finalValue;
|
||||
};
|
||||
|
||||
return new GraphQLScalarType({
|
||||
name: name,
|
||||
description: `Input type for dynamic zone ${attribute} of ${globalId}`,
|
||||
serialize: value => value,
|
||||
parseValue: value => parseData(value),
|
||||
parseLiteral: (ast, variables) => {
|
||||
if (ast.kind !== Kind.OBJECT) return undefined;
|
||||
|
||||
const value = valueFromASTUntyped(ast, variables);
|
||||
return parseData(value);
|
||||
},
|
||||
});
|
||||
};
|
||||
291
yarn.lock
291
yarn.lock
@ -2,6 +2,25 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@apollo/protobufjs@^1.0.3":
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.3.tgz#02c655aedd4ba7c7f64cbc3d2b1dd9a000a391ba"
|
||||
integrity sha512-gqeT810Ect9WIqsrgfUvr+ljSB5m1PyBae9HGdrRyQ3HjHjTcjVvxpsMYXlUk4rUHnrfUqyoGvLSy2yLlRGEOw==
|
||||
dependencies:
|
||||
"@protobufjs/aspromise" "^1.1.2"
|
||||
"@protobufjs/base64" "^1.1.2"
|
||||
"@protobufjs/codegen" "^2.0.4"
|
||||
"@protobufjs/eventemitter" "^1.1.0"
|
||||
"@protobufjs/fetch" "^1.1.0"
|
||||
"@protobufjs/float" "^1.0.2"
|
||||
"@protobufjs/inquire" "^1.1.0"
|
||||
"@protobufjs/path" "^1.1.2"
|
||||
"@protobufjs/pool" "^1.1.0"
|
||||
"@protobufjs/utf8" "^1.1.0"
|
||||
"@types/long" "^4.0.0"
|
||||
"@types/node" "^10.1.0"
|
||||
long "^4.0.0"
|
||||
|
||||
"@apollographql/apollo-tools@^0.4.0":
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.0.tgz#8a1a0ab7a0bb12ccc03b72e4a104cfa5d969fd5f"
|
||||
@ -3275,13 +3294,13 @@ anymatch@~3.1.1:
|
||||
normalize-path "^3.0.0"
|
||||
picomatch "^2.0.4"
|
||||
|
||||
apollo-cache-control@^0.8.5:
|
||||
version "0.8.5"
|
||||
resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.8.5.tgz#d4b34691f6ca1cefac9d82b99a94a0815a85a5a8"
|
||||
integrity sha512-2yQ1vKgJQ54SGkoQS/ZLZrDX3La6cluAYYdruFYJMJtL4zQrSdeOCy11CQliCMYEd6eKNyE70Rpln51QswW2Og==
|
||||
apollo-cache-control@^0.8.8:
|
||||
version "0.8.8"
|
||||
resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.8.8.tgz#c6de9ef3a154560f6cf26ce7159e62438c1ac022"
|
||||
integrity sha512-hpIJg3Tmb6quA111lrVO+d3qcyYRlJ8JqbeQdcgwLT3fb2VQzk21SrBZYl2oMM4ZqSOWCZWg4/Cn9ARYqdWjKA==
|
||||
dependencies:
|
||||
apollo-server-env "^2.4.3"
|
||||
graphql-extensions "^0.10.4"
|
||||
graphql-extensions "^0.10.7"
|
||||
|
||||
apollo-datasource@^0.6.3:
|
||||
version "0.6.3"
|
||||
@ -3291,25 +3310,25 @@ apollo-datasource@^0.6.3:
|
||||
apollo-server-caching "^0.5.0"
|
||||
apollo-server-env "^2.4.3"
|
||||
|
||||
apollo-engine-reporting-protobuf@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.1.tgz#c0a35bcf28487f87dcbc452b03277f575192f5d2"
|
||||
integrity sha512-d7vFFZ2oUrvGaN0Hpet8joe2ZG0X0lIGilN+SwgVP38dJnOuadjsaYMyrD9JudGQJg0bJA5wVQfYzcCVy0slrw==
|
||||
apollo-engine-reporting-protobuf@^0.4.4:
|
||||
version "0.4.4"
|
||||
resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.4.tgz#73a064f8c9f2d6605192d1673729c66ec47d9cb7"
|
||||
integrity sha512-SGrIkUR7Q/VjU8YG98xcvo340C4DaNUhg/TXOtGsMlfiJDzHwVau/Bv6zifAzBafp2lj0XND6Daj5kyT/eSI/w==
|
||||
dependencies:
|
||||
protobufjs "^6.8.6"
|
||||
"@apollo/protobufjs" "^1.0.3"
|
||||
|
||||
apollo-engine-reporting@^1.4.7:
|
||||
version "1.4.7"
|
||||
resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.4.7.tgz#6ca69ebdc1c17200969e2e4e07a0be64d748c27e"
|
||||
integrity sha512-qsKDz9VkoctFhojM3Nj3nvRBO98t8TS2uTgtiIjUGs3Hln2poKMP6fIQ37Nm2Q2B3JJst76HQtpPwXmRJd1ZUg==
|
||||
apollo-engine-reporting@^1.4.10:
|
||||
version "1.4.10"
|
||||
resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.4.10.tgz#cca245133906ed4ece125e48cb95dd959f3af2f6"
|
||||
integrity sha512-0nEawO9cudbXHCxRvnDUWKqCxPAGEstghUFd5sB67lIGuh91MYeLuwN1iTfqUdwF1feEGHn636zVVUYlXGOlvQ==
|
||||
dependencies:
|
||||
apollo-engine-reporting-protobuf "^0.4.1"
|
||||
apollo-engine-reporting-protobuf "^0.4.4"
|
||||
apollo-graphql "^0.3.4"
|
||||
apollo-server-caching "^0.5.0"
|
||||
apollo-server-env "^2.4.3"
|
||||
apollo-server-types "^0.2.5"
|
||||
apollo-server-types "^0.2.8"
|
||||
async-retry "^1.2.1"
|
||||
graphql-extensions "^0.10.4"
|
||||
graphql-extensions "^0.10.7"
|
||||
|
||||
apollo-env@0.5.1, apollo-env@^0.5.1:
|
||||
version "0.5.1"
|
||||
@ -3345,26 +3364,26 @@ apollo-server-caching@^0.5.0:
|
||||
dependencies:
|
||||
lru-cache "^5.0.0"
|
||||
|
||||
apollo-server-core@^2.9.6:
|
||||
version "2.9.6"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.9.6.tgz#b6dc087200633f47ca4f08244d3e606b4d616320"
|
||||
integrity sha512-2tHAWQxP7HrETI/BZvg2fem6YlahF9HUp4Y6SSL95WP3uNMOJBlN12yM1y+O2u5K5e4jwdPNaLjoL2A/26XrLw==
|
||||
apollo-server-core@^2.9.12:
|
||||
version "2.9.12"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.9.12.tgz#c8ed48540762913242eef5fce0da8b59b131a1e8"
|
||||
integrity sha512-jhGr2R655PSwUUBweXDl+0F3oa74Elu5xXF+88ymUUej34EwBUCqz97wPqR07BEuyxaAlRfZwPMvKaHhMUKg5g==
|
||||
dependencies:
|
||||
"@apollographql/apollo-tools" "^0.4.0"
|
||||
"@apollographql/graphql-playground-html" "1.6.24"
|
||||
"@types/graphql-upload" "^8.0.0"
|
||||
"@types/ws" "^6.0.0"
|
||||
apollo-cache-control "^0.8.5"
|
||||
apollo-cache-control "^0.8.8"
|
||||
apollo-datasource "^0.6.3"
|
||||
apollo-engine-reporting "^1.4.7"
|
||||
apollo-engine-reporting "^1.4.10"
|
||||
apollo-server-caching "^0.5.0"
|
||||
apollo-server-env "^2.4.3"
|
||||
apollo-server-errors "^2.3.3"
|
||||
apollo-server-plugin-base "^0.6.5"
|
||||
apollo-server-types "^0.2.5"
|
||||
apollo-tracing "^0.8.5"
|
||||
apollo-server-errors "^2.3.4"
|
||||
apollo-server-plugin-base "^0.6.8"
|
||||
apollo-server-types "^0.2.8"
|
||||
apollo-tracing "^0.8.8"
|
||||
fast-json-stable-stringify "^2.0.0"
|
||||
graphql-extensions "^0.10.4"
|
||||
graphql-extensions "^0.10.7"
|
||||
graphql-tag "^2.9.2"
|
||||
graphql-tools "^4.0.0"
|
||||
graphql-upload "^8.0.2"
|
||||
@ -3380,15 +3399,15 @@ apollo-server-env@^2.4.3:
|
||||
node-fetch "^2.1.2"
|
||||
util.promisify "^1.0.0"
|
||||
|
||||
apollo-server-errors@^2.3.3:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.3.tgz#83763b00352c10dc68fbb0d41744ade66de549ff"
|
||||
integrity sha512-MO4oJ129vuCcbqwr5ZwgxqGGiLz3hCyowz0bstUF7MR+vNGe4oe3DWajC9lv4CxrhcqUHQOeOPViOdIo1IxE3g==
|
||||
apollo-server-errors@^2.3.4:
|
||||
version "2.3.4"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.4.tgz#b70ef01322f616cbcd876f3e0168a1a86b82db34"
|
||||
integrity sha512-Y0PKQvkrb2Kd18d1NPlHdSqmlr8TgqJ7JQcNIfhNDgdb45CnqZlxL1abuIRhr8tiw8OhVOcFxz2KyglBi8TKdA==
|
||||
|
||||
apollo-server-koa@^2.9.0:
|
||||
version "2.9.6"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-koa/-/apollo-server-koa-2.9.6.tgz#5ef8589d5f4fcc95096d3bbc490f42e7829622ab"
|
||||
integrity sha512-KctnBETMJ6Obt1sYhxwIi7XAi/pDz2ifOV5sktc6Gx9Jt5JNL9SmQGFFNCXaWbTyCcPKckQhXfumcHgbAWAXoA==
|
||||
apollo-server-koa@2.9.12:
|
||||
version "2.9.12"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-koa/-/apollo-server-koa-2.9.12.tgz#07d59355295d66f869bd981b55e9fdea0d0e0e6f"
|
||||
integrity sha512-LPICtgDhiJPJkxWcaVE1ReAGM1ajKlU1EZru7oIUjrO8S/helkvdUKTDy6Bu+GSYP6PwiHo68mI2kChecPZJkg==
|
||||
dependencies:
|
||||
"@apollographql/graphql-playground-html" "1.6.24"
|
||||
"@koa/cors" "^2.2.1"
|
||||
@ -3399,39 +3418,39 @@ apollo-server-koa@^2.9.0:
|
||||
"@types/koa-compose" "^3.2.2"
|
||||
"@types/koa__cors" "^2.2.1"
|
||||
accepts "^1.3.5"
|
||||
apollo-server-core "^2.9.6"
|
||||
apollo-server-types "^0.2.5"
|
||||
apollo-server-core "^2.9.12"
|
||||
apollo-server-types "^0.2.8"
|
||||
graphql-subscriptions "^1.0.0"
|
||||
graphql-tools "^4.0.0"
|
||||
koa "2.8.2"
|
||||
koa "2.11.0"
|
||||
koa-bodyparser "^4.2.1"
|
||||
koa-compose "^4.1.0"
|
||||
koa-router "^7.4.0"
|
||||
type-is "^1.6.16"
|
||||
|
||||
apollo-server-plugin-base@^0.6.5:
|
||||
version "0.6.5"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.5.tgz#eebe27734c51bf6a45b6a9ec8738750b132ffde7"
|
||||
integrity sha512-z2ve7HEPWmZI3EzL0iiY9qyt1i0hitT+afN5PzssCw594LB6DfUQWsI14UW+W+gcw8hvl8VQUpXByfUntAx5vw==
|
||||
apollo-server-plugin-base@^0.6.8:
|
||||
version "0.6.8"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.8.tgz#94cb9a6d806b7057d1d42202292d2adcf2cf0e7a"
|
||||
integrity sha512-0pKCjcg9gHBK8qlb280+N0jl99meixQtxXnMJFyIfD+45OpKQ+WolHIbO0oZgNEt7r/lNWwH8v3l5yYm1ghz1A==
|
||||
dependencies:
|
||||
apollo-server-types "^0.2.5"
|
||||
apollo-server-types "^0.2.8"
|
||||
|
||||
apollo-server-types@^0.2.5:
|
||||
version "0.2.5"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.2.5.tgz#2d63924706ffc1a59480cbbc93e9fe86655a57a5"
|
||||
integrity sha512-6iJQsPh59FWu4K7ABrVmpnQVgeK8Ockx8BcawBh+saFYWTlVczwcLyGSZPeV1tPSKwFwKZutyEslrYSafcarXQ==
|
||||
apollo-server-types@^0.2.8:
|
||||
version "0.2.8"
|
||||
resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.2.8.tgz#729208a8dd72831af3aa4f1eb584022ada146e6b"
|
||||
integrity sha512-5OclxkAqjhuO75tTNHpSO/+doJZ+VlRtTefnrPJdK/uwVew9U/VUCWkYdryZWwEyVe1nvQ/4E7RYR4tGb8l8wA==
|
||||
dependencies:
|
||||
apollo-engine-reporting-protobuf "^0.4.1"
|
||||
apollo-engine-reporting-protobuf "^0.4.4"
|
||||
apollo-server-caching "^0.5.0"
|
||||
apollo-server-env "^2.4.3"
|
||||
|
||||
apollo-tracing@^0.8.5:
|
||||
version "0.8.5"
|
||||
resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.8.5.tgz#f07c4584d95bcf750e44bfe9845e073b03774941"
|
||||
integrity sha512-lZn10/GRBZUlMxVYLghLMFsGcLN0jTYDd98qZfBtxw+wEWUx+PKkZdljDT+XNoOm/kDvEutFGmi5tSLhArIzWQ==
|
||||
apollo-tracing@^0.8.8:
|
||||
version "0.8.8"
|
||||
resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.8.8.tgz#bfaffd76dc12ed5cc1c1198b5411864affdb1b83"
|
||||
integrity sha512-aIwT2PsH7VZZPaNrIoSjzLKMlG644d2Uf+GYcoMd3X6UEyg1sXdWqkKfCeoS6ChJKH2khO7MXAvOZC03UnCumQ==
|
||||
dependencies:
|
||||
apollo-server-env "^2.4.3"
|
||||
graphql-extensions "^0.10.4"
|
||||
graphql-extensions "^0.10.7"
|
||||
|
||||
apollo-utilities@^1.0.1, apollo-utilities@^1.3.0:
|
||||
version "1.3.2"
|
||||
@ -4074,11 +4093,6 @@ bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf"
|
||||
integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==
|
||||
|
||||
bluebird@^3.7.0:
|
||||
version "3.7.1"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de"
|
||||
integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==
|
||||
|
||||
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
|
||||
version "4.11.8"
|
||||
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
|
||||
@ -4991,11 +5005,6 @@ colorette@1.0.7:
|
||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.0.7.tgz#7adf43c445ee63a541b4a4aef7d13f03df1e0cc0"
|
||||
integrity sha512-KeK4klsvAgdODAjFPm6QLzvStizJqlxMBtVo4KQMCgk5tt/tf9rAzxmxLHNRynJg3tJjkKGKbHx3j4HLox27Lw==
|
||||
|
||||
colorette@1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7"
|
||||
integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==
|
||||
|
||||
colors@^1.1.2, colors@^1.3.3:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
|
||||
@ -5046,11 +5055,6 @@ commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@^2.8.1:
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||
|
||||
commander@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
|
||||
integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
|
||||
|
||||
commander@~2.19.0:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
||||
@ -5364,6 +5368,14 @@ cookies@~0.7.1:
|
||||
depd "~1.1.2"
|
||||
keygrip "~1.0.3"
|
||||
|
||||
cookies@~0.8.0:
|
||||
version "0.8.0"
|
||||
resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
|
||||
integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==
|
||||
dependencies:
|
||||
depd "~2.0.0"
|
||||
keygrip "~1.1.0"
|
||||
|
||||
copy-concurrently@^1.0.0:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
|
||||
@ -6219,6 +6231,11 @@ depd@^1.1.2, depd@~1.1.2:
|
||||
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
|
||||
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
|
||||
|
||||
depd@~2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
|
||||
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
|
||||
|
||||
deprecated-decorator@^0.1.6:
|
||||
version "0.1.6"
|
||||
resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37"
|
||||
@ -8121,11 +8138,6 @@ getopts@2.2.3:
|
||||
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.3.tgz#11d229775e2ec2067ed8be6fcc39d9b4bf39cf7d"
|
||||
integrity sha512-viEcb8TpgeG05+Nqo5EzZ8QR0hxdyrYDp6ZSTZqe2M/h53Bk036NmqG38Vhf5RGirC/Of9Xql+v66B2gp256SQ==
|
||||
|
||||
getopts@2.2.5:
|
||||
version "2.2.5"
|
||||
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b"
|
||||
integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==
|
||||
|
||||
getos@3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.0.tgz#db3aa4df15a3295557ce5e81aa9e3e5cdfaa6567"
|
||||
@ -8487,14 +8499,14 @@ graphql-depth-limit@^1.1.0:
|
||||
dependencies:
|
||||
arrify "^1.0.1"
|
||||
|
||||
graphql-extensions@^0.10.4:
|
||||
version "0.10.4"
|
||||
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.10.4.tgz#af851b0d44ea6838cf54de9df3cfc6a8e575e571"
|
||||
integrity sha512-lE6MroluEYocbR/ICwccv39w+Pz4cBPadJ11z1rJkbZv5wstISEganbDOwl9qN21rcZGiWzh7QUNxUiFUXXEDw==
|
||||
graphql-extensions@^0.10.7:
|
||||
version "0.10.7"
|
||||
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.10.7.tgz#ca9f8ec3cb0af1739b48ca42280ec9162ad116d1"
|
||||
integrity sha512-YuP7VQxNePG4bWRQ5Vk+KRMbZ9r1IWCqCCogOMz/1ueeQ4gZe93eGRcb0vhpOdMFnCX6Vyvd4+sC+N6LR3YFOQ==
|
||||
dependencies:
|
||||
"@apollographql/apollo-tools" "^0.4.0"
|
||||
apollo-server-env "^2.4.3"
|
||||
apollo-server-types "^0.2.5"
|
||||
apollo-server-types "^0.2.8"
|
||||
|
||||
graphql-playground-html@1.6.13:
|
||||
version "1.6.13"
|
||||
@ -8520,7 +8532,18 @@ graphql-tag@^2.9.2:
|
||||
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02"
|
||||
integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==
|
||||
|
||||
graphql-tools@^4.0.0, graphql-tools@^4.0.4:
|
||||
graphql-tools@4.0.6:
|
||||
version "4.0.6"
|
||||
resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.6.tgz#0e729e73db05ade3df10a2f92511be544972a844"
|
||||
integrity sha512-jHLQw8x3xmSNRBCsaZqelXXsFfUSUSktSCUP8KYHiX1Z9qEuwcMpAf+FkdBzk8aTAFqOlPdNZ3OI4DKKqGKUqg==
|
||||
dependencies:
|
||||
apollo-link "^1.2.3"
|
||||
apollo-utilities "^1.0.1"
|
||||
deprecated-decorator "^0.1.6"
|
||||
iterall "^1.1.3"
|
||||
uuid "^3.1.0"
|
||||
|
||||
graphql-tools@^4.0.0:
|
||||
version "4.0.5"
|
||||
resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.5.tgz#d2b41ee0a330bfef833e5cdae7e1f0b0d86b1754"
|
||||
integrity sha512-kQCh3IZsMqquDx7zfIGWBau42xe46gmqabwYkpPlCLIjcEY1XK+auP7iGRD9/205BPyoQdY8hT96MPpgERdC9Q==
|
||||
@ -8538,10 +8561,10 @@ graphql-type-datetime@^0.2.4:
|
||||
dependencies:
|
||||
moment "^2.22.2"
|
||||
|
||||
graphql-type-json@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.0.tgz#bb32e1b74bf52ebc690f9df12b4067bc061f818a"
|
||||
integrity sha512-lnxg5HiB95yxy+/5cDKtP6pZo0zgntsOmqsjeCBXFGJ4YoMF3+1YaSEKWJntNTu+VsAm3zf6lPxFpp1kxzofLA==
|
||||
graphql-type-json@0.3.1:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.1.tgz#47fca2b1fa7adc0758d165b33580d7be7a6cf548"
|
||||
integrity sha512-1lPkUXQ2L8o+ERLzVAuc3rzc/E6pGF+6HnjihCVTK0VzR0jCuUd92FqNxoHdfILXqOn2L6b4y47TBxiPyieUVA==
|
||||
|
||||
graphql-type-long@^0.1.1:
|
||||
version "0.1.1"
|
||||
@ -9322,7 +9345,7 @@ inflight@^1.0.4:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
|
||||
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
@ -10752,6 +10775,13 @@ keygrip@~1.0.3:
|
||||
resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc"
|
||||
integrity sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==
|
||||
|
||||
keygrip@~1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
|
||||
integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==
|
||||
dependencies:
|
||||
tsscmp "1.0.6"
|
||||
|
||||
keyv@3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
|
||||
@ -10823,27 +10853,6 @@ knex@^0.16.5:
|
||||
uuid "^3.3.2"
|
||||
v8flags "^3.1.2"
|
||||
|
||||
knex@^0.19.0:
|
||||
version "0.19.5"
|
||||
resolved "https://registry.yarnpkg.com/knex/-/knex-0.19.5.tgz#3597ebecf88a5942f18c3e6d91af53bda59eeb5d"
|
||||
integrity sha512-Hy258avCVircQq+oj3WBqPzl8jDIte438Qlq+8pt1i/TyLYVA4zPh2uKc7Bx0t+qOpa6D42HJ2jjtl2vagzilw==
|
||||
dependencies:
|
||||
bluebird "^3.7.0"
|
||||
colorette "1.1.0"
|
||||
commander "^3.0.2"
|
||||
debug "4.1.1"
|
||||
getopts "2.2.5"
|
||||
inherits "~2.0.4"
|
||||
interpret "^1.2.0"
|
||||
liftoff "3.1.0"
|
||||
lodash "^4.17.15"
|
||||
mkdirp "^0.5.1"
|
||||
pg-connection-string "2.1.0"
|
||||
tarn "^2.0.0"
|
||||
tildify "2.0.0"
|
||||
uuid "^3.3.3"
|
||||
v8flags "^3.1.3"
|
||||
|
||||
koa-body@^4.1.0:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/koa-body/-/koa-body-4.1.1.tgz#50686d290891fc6f1acb986cf7cfcd605f855ef0"
|
||||
@ -11016,7 +11025,37 @@ koa2-ratelimit@^0.9.0:
|
||||
promise-redis "0.0.5"
|
||||
sequelize "^5.8.7"
|
||||
|
||||
koa@2.8.2, koa@^2.8.0:
|
||||
koa@2.11.0:
|
||||
version "2.11.0"
|
||||
resolved "https://registry.yarnpkg.com/koa/-/koa-2.11.0.tgz#fe5a51c46f566d27632dd5dc8fd5d7dd44f935a4"
|
||||
integrity sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==
|
||||
dependencies:
|
||||
accepts "^1.3.5"
|
||||
cache-content-type "^1.0.0"
|
||||
content-disposition "~0.5.2"
|
||||
content-type "^1.0.4"
|
||||
cookies "~0.8.0"
|
||||
debug "~3.1.0"
|
||||
delegates "^1.0.0"
|
||||
depd "^1.1.2"
|
||||
destroy "^1.0.4"
|
||||
encodeurl "^1.0.2"
|
||||
error-inject "^1.0.0"
|
||||
escape-html "^1.0.3"
|
||||
fresh "~0.5.2"
|
||||
http-assert "^1.3.0"
|
||||
http-errors "^1.6.3"
|
||||
is-generator-function "^1.0.7"
|
||||
koa-compose "^4.1.0"
|
||||
koa-convert "^1.2.0"
|
||||
on-finished "^2.3.0"
|
||||
only "~0.0.2"
|
||||
parseurl "^1.3.2"
|
||||
statuses "^1.5.0"
|
||||
type-is "^1.6.16"
|
||||
vary "^1.1.2"
|
||||
|
||||
koa@^2.8.0:
|
||||
version "2.8.2"
|
||||
resolved "https://registry.yarnpkg.com/koa/-/koa-2.8.2.tgz#dfba771a69c1a98e014826804e95132c00af6615"
|
||||
integrity sha512-q1uZOgpl3wjr5FS/tjbABJ8lA5+NeKa9eq7QyBP5xxgOBwJN4iBrMEgO3LroE51lrIw3BsO0WZZ0Yi6giSiMDw==
|
||||
@ -13643,11 +13682,6 @@ pg-connection-string@2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.0.0.tgz#3eefe5997e06d94821e4d502e42b6a1c73f8df82"
|
||||
integrity sha1-Pu/lmX4G2Ugh5NUC5CtqHHP434I=
|
||||
|
||||
pg-connection-string@2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.1.0.tgz#e07258f280476540b24818ebb5dca29e101ca502"
|
||||
integrity sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg==
|
||||
|
||||
pg-int8@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
|
||||
@ -14448,25 +14482,6 @@ proto-list@~1.2.1:
|
||||
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
|
||||
integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
|
||||
|
||||
protobufjs@^6.8.6:
|
||||
version "6.8.8"
|
||||
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c"
|
||||
integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==
|
||||
dependencies:
|
||||
"@protobufjs/aspromise" "^1.1.2"
|
||||
"@protobufjs/base64" "^1.1.2"
|
||||
"@protobufjs/codegen" "^2.0.4"
|
||||
"@protobufjs/eventemitter" "^1.1.0"
|
||||
"@protobufjs/fetch" "^1.1.0"
|
||||
"@protobufjs/float" "^1.0.2"
|
||||
"@protobufjs/inquire" "^1.1.0"
|
||||
"@protobufjs/path" "^1.1.2"
|
||||
"@protobufjs/pool" "^1.1.0"
|
||||
"@protobufjs/utf8" "^1.1.0"
|
||||
"@types/long" "^4.0.0"
|
||||
"@types/node" "^10.1.0"
|
||||
long "^4.0.0"
|
||||
|
||||
protocols@^1.1.0, protocols@^1.4.0:
|
||||
version "1.4.7"
|
||||
resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32"
|
||||
@ -17534,11 +17549,6 @@ tarn@^1.1.5:
|
||||
resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d"
|
||||
integrity sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g==
|
||||
|
||||
tarn@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tarn/-/tarn-2.0.0.tgz#c68499f69881f99ae955b4317ca7d212d942fdee"
|
||||
integrity sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA==
|
||||
|
||||
teeny-request@^3.11.3:
|
||||
version "3.11.3"
|
||||
resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-3.11.3.tgz#335c629f7645e5d6599362df2f3230c4cbc23a55"
|
||||
@ -17706,11 +17716,6 @@ tildify@1.2.0:
|
||||
dependencies:
|
||||
os-homedir "^1.0.0"
|
||||
|
||||
tildify@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
|
||||
integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==
|
||||
|
||||
timed-out@^4.0.0, timed-out@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
|
||||
@ -17929,7 +17934,7 @@ tslib@^1, tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3:
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
|
||||
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
|
||||
|
||||
tsscmp@^1.0.6:
|
||||
tsscmp@1.0.6, tsscmp@^1.0.6:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
|
||||
integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
|
||||
@ -18308,7 +18313,7 @@ v8-compile-cache@^2.0.3:
|
||||
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
|
||||
integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
|
||||
|
||||
v8flags@^3.1.2, v8flags@^3.1.3:
|
||||
v8flags@^3.1.2:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8"
|
||||
integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user