Merge branch 'releases/v4' into v4/graphql-resolvers-rewrite

This commit is contained in:
Convly 2021-08-05 14:39:16 +02:00
commit 0e8025df6b
261 changed files with 1472 additions and 1530 deletions

View File

@ -14,3 +14,6 @@ packages/plugins/users-permissions/admin/OLD/**
.eslintrc.js
.eslintrc.front.js
.eslintrc.back.js
bookshelf.old
database.old

View File

@ -8,24 +8,6 @@
<p align="center"><a href="https://strapi.io/demo">Try live demo</a></p>
<br />
<p align="center">
<a href="https://console.platform.sh/projects/create-project?template=https://raw.githubusercontent.com/platformsh/template-builder/master/templates/strapi/.platform.template.yaml&utm_content=strapi&utm_source=github&utm_medium=button&utm_campaign=deploy_on_platform">
<img src="https://assets.strapi.io/uploads/deploy_button_platform_sh_d032f646a7.png" />
</a>
<a href="https://marketplace.digitalocean.com/apps/strapi">
<img src="https://assets.strapi.io/uploads/deploy_button_Digital_Ocean_fe2c286222.png" />
</a>
<a href="https://www.heroku.com/deploy/?template=https://github.com/strapi/strapi-heroku-template">
<img src="https://assets.strapi.io/uploads/Deploy_button_heroku_b1043fc67d.png" />
</a>
<a href="https://render.com/docs/deploy-strapi">
<img src="https://assets.strapi.io/uploads/deploy_render_e076b6f23a.png" height="44" />
</a>
</p>
<p align="center">
<a href="https://www.npmjs.org/package/strapi">
<img src="https://img.shields.io/npm/v/strapi/latest.svg" alt="NPM Version" />

View File

@ -97,7 +97,7 @@
"basic.simple"
]
},
"one_way_tag_edit": {
"one_way_tag": {
"type": "relation",
"relation": "oneToOne",
"target": "application::tag.tag"
@ -106,6 +106,7 @@
"type": "relation",
"relation": "oneToOne",
"target": "application::tag.tag",
"private": true,
"inversedBy": "one_to_one_kitchensink"
},
"one_to_many_tags": {

View File

@ -6,53 +6,35 @@
module.exports = {
lifecycles: {
beforeCreate(...args) {
// console.log('beforeCreate', ...args);
beforeCreate(event) {
// console.log('beforeCreate');
},
afterCreate(...args) {
// console.log('afterCreate', ...args);
afterCreate(event) {
// console.log('afterCreate');
},
beforeUpdate(...args) {
// console.log('beforeUpdate', ...args);
beforeUpdate(event) {
// console.log('beforeUpdate');
},
afterUpdate(...args) {
// console.log('afterUpdate', ...args);
afterUpdate(event) {
// console.log('afterUpdate');
},
beforeDelete(...args) {
// console.log('beforeDelete', ...args);
beforeDelete(event) {
// console.log('beforeDelete');
},
afterDelete(...args) {
// console.log('afterDelete', ...args);
afterDelete(event) {
// console.log('afterDelete');
},
beforeFind(...args) {
// console.log('beforeFind', ...args);
beforeFindMany(event) {
// console.log('beforeFindMany');
},
afterFind(...args) {
// console.log('afterFind', ...args);
afterFindMany(event) {
// console.log('afterFindMany');
},
beforeFindOne(...args) {
// console.log('beforeFindOne', ...args);
beforeFindOne(event) {
// console.log('beforeFindOne');
},
afterFindOne(...args) {
// console.log('afterFindOne', ...args);
},
beforeCount(...args) {
// console.log('beforeCount', ...args);
},
afterCount(...args) {
// console.log('afterCount', ...args);
},
beforeSearch(...args) {
// console.log('beforeSearch', ...args);
},
afterSearch(...args) {
// console.log('afterSearch', ...args);
},
beforeCountSearch(...args) {
// console.log('beforeCountSearch', ...args);
},
afterCountSearch(...args) {
// console.log('afterCountSearch', ...args);
afterFindOne(event) {
// console.log('afterFindOne');
},
},
};

View File

@ -2,7 +2,8 @@
"kind": "collectionType",
"collectionName": "tags",
"info": {
"name": "tag"
"name": "tag",
"description": ""
},
"options": {
"draftAndPublish": true
@ -12,29 +13,29 @@
"name": {
"type": "string"
},
"one_to_one_kitchensink": {
"type": "relation",
"target": "application::kitchensink.kitchensink",
"relation": "oneToOne",
"mappedBy": "one_to_one_tag"
},
"many_to_one_kitchensink": {
"type": "relation",
"target": "application::kitchensink.kitchensink",
"relation": "manyToOne",
"target": "application::kitchensink.kitchensink",
"inversedBy": "one_to_many_tags"
},
"one_to_many_kitchensinks": {
"type": "relation",
"target": "application::kitchensink.kitchensink",
"relation": "oneToMany",
"target": "application::kitchensink.kitchensink",
"mappedBy": "many_to_one_tag"
},
"many_to_many_kitchensinks": {
"type": "relation",
"target": "application::kitchensink.kitchensink",
"relation": "manyToMany",
"target": "application::kitchensink.kitchensink",
"mappedBy": "many_to_many_tags"
},
"one_to_one_kitchensink": {
"type": "relation",
"relation": "oneToOne",
"target": "application::kitchensink.kitchensink",
"mappedBy": "one_to_one_tag"
}
}
}

View File

@ -2,6 +2,7 @@ module.exports = ({ env }) => ({
host: env('HOST', '0.0.0.0'),
port: env.int('PORT', 1337),
admin: {
// autoOpen: true,
auth: {
secret: env('ADMIN_JWT_SECRET', 'example-token'),
},

View File

@ -1,7 +1,7 @@
{
"name": "getstarted",
"private": true,
"version": "3.6.5",
"version": "3.6.6",
"description": "A Strapi application.",
"scripts": {
"develop": "strapi develop",
@ -12,25 +12,25 @@
"strapi": "strapi"
},
"dependencies": {
"@strapi/admin": "3.6.5",
"@strapi/plugin-content-manager": "3.6.5",
"@strapi/plugin-content-type-builder": "3.6.5",
"@strapi/plugin-documentation": "3.6.5",
"@strapi/plugin-email": "3.6.5",
"@strapi/plugin-graphql": "3.6.5",
"@strapi/plugin-i18n": "3.6.5",
"@strapi/plugin-upload": "3.6.5",
"@strapi/plugin-users-permissions": "3.6.5",
"@strapi/provider-email-mailgun": "3.6.5",
"@strapi/provider-upload-aws-s3": "3.6.5",
"@strapi/provider-upload-cloudinary": "3.6.5",
"@strapi/strapi": "3.6.5",
"@strapi/utils": "3.6.5",
"@strapi/admin": "3.6.6",
"@strapi/plugin-content-manager": "3.6.6",
"@strapi/plugin-content-type-builder": "3.6.6",
"@strapi/plugin-documentation": "3.6.6",
"@strapi/plugin-email": "3.6.6",
"@strapi/plugin-graphql": "3.6.6",
"@strapi/plugin-i18n": "3.6.6",
"@strapi/plugin-upload": "3.6.6",
"@strapi/plugin-users-permissions": "3.6.6",
"@strapi/provider-email-mailgun": "3.6.6",
"@strapi/provider-upload-aws-s3": "3.6.6",
"@strapi/provider-upload-cloudinary": "3.6.6",
"@strapi/strapi": "3.6.6",
"@strapi/utils": "3.6.6",
"lodash": "4.17.21",
"mysql": "2.18.1",
"pg": "8.6.0",
"sqlite3": "5.0.2",
"strapi-middleware-views": "3.6.5"
"strapi-middleware-views": "3.6.6"
},
"strapi": {
"uuid": "getstarted"

View File

@ -1,8 +1,9 @@
{
"compilerOptions": {
"rootDir": ".",
"module": "commonjs",
"target": "es6"
},
"include": ["packages/**/*"],
"exclude": ["node_modules", "**/node_modules/*"]
"include": ["packages/**/*.js"],
"exclude": ["node_modules", ".git", ".npm", ".cache", ".tmp", "dist", "build"]
}

View File

@ -1,5 +1,5 @@
{
"version": "3.6.5",
"version": "3.6.6",
"packages": [
"packages/*",
"examples/*"

View File

@ -1,6 +1,6 @@
{
"name": "create-strapi-app",
"version": "3.6.5",
"version": "3.6.6",
"description": "Generate a new Strapi application.",
"license": "SEE LICENSE IN LICENSE",
"homepage": "https://strapi.io",
@ -21,7 +21,7 @@
"inquirer": "8.1.0",
"js-yaml": "4.1.0",
"node-fetch": "^2.6.1",
"@strapi/generate-new": "3.6.5"
"@strapi/generate-new": "3.6.6"
},
"scripts": {
"test": "echo \"no tests yet\""

View File

@ -1,6 +1,6 @@
{
"name": "create-strapi-starter",
"version": "3.6.5",
"version": "3.6.6",
"description": "Generate a new Strapi application.",
"license": "SEE LICENSE IN LICENSE",
"homepage": "https://strapi.io",
@ -26,8 +26,8 @@
"js-yaml": "4.1.0",
"node-fetch": "^2.6.1",
"ora": "5.4.0",
"@strapi/generate-new": "3.6.5",
"tar": "6.1.0"
"@strapi/generate-new": "3.6.6",
"tar": "6.1.2"
},
"scripts": {
"test": "echo \"no tests yet\""

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -2,7 +2,7 @@ import styled from 'styled-components';
import PropTypes from 'prop-types';
const Wrapper = styled.div`
background-color: #007eff;
background-color: ${props => props.theme.main.colors.leftMenu['background-header-link']};
padding-left: 2rem;
height: ${props => props.theme.main.sizes.leftMenu.height};

View File

@ -44,7 +44,10 @@ const ActionRow = ({
style={{ maxWidth: '60%' }}
ellipsis
>
{label}
{formatMessage({
id: `Settings.roles.form.permissions.${label.toLowerCase()}`,
defaultMessage: label,
})}
</Text>
<Text
lineHeight="19px"

View File

@ -40,7 +40,10 @@ const Header = ({ headers, label }) => {
return (
<HeaderLabel key={header.label}>
<Text textTransform="capitalize" fontWeight="bold">
{header.label}
{formatMessage({
id: `Settings.roles.form.permissions.${header.label.toLowerCase()}`,
defaultMessage: header.label,
})}
</Text>
</HeaderLabel>
);

View File

@ -0,0 +1,29 @@
import styled from 'styled-components';
// TODO : To migrate with @strapi/parts
const Wrapper = styled.div`
display: flex;
align-items: center;
margin-top: 2rem;
border-radius: 4px;
border-left: 4px solid ${({ theme }) => theme.main.colors.mediumBlue};
box-shadow: 0 2px 4px ${({ theme }) => theme.main.colors.darkGrey};
padding: 8px 16px;
.bannerImage {
margin-right: 1rem;
width: 48px;
height: 48px;
margin-right: 16px;
}
.bannerLink {
color: ${({ theme }) => theme.main.colors.mediumBlue};
font-weight: ${({ theme }) => theme.main.fontWeights.bold};
svg {
margin-left: 4px;
}
}
`;
export default Wrapper;

View File

@ -0,0 +1,34 @@
import React from 'react';
import { FormattedMessage, useIntl } from 'react-intl';
import Wrapper from './Wrapper';
import LogoStrapi from '../../../assets/images/banner_strapi-rocket.png';
const PluginBanner = () => {
const { formatMessage } = useIntl();
return (
<Wrapper>
<img
className="bannerImage"
src={LogoStrapi}
alt={formatMessage({ id: 'app.components.PluginBanner.image.alt' })}
/>
<div>
<div>
<FormattedMessage id="app.components.PluginBanner" />
</div>
<a
href="https://github.com/strapi/awesome-strapi"
target="_blank"
rel="noopener noreferrer"
className="bannerLink"
>
<FormattedMessage id="app.components.PluginBanner.link" />
<i className="fa fa-external-link-alt" />
</a>
</div>
</Wrapper>
);
};
export default PluginBanner;

View File

@ -15,6 +15,7 @@ import { useFetchPluginsFromMarketPlace } from '../../hooks';
import PageTitle from '../../components/PageTitle';
import PluginCard from './PluginCard';
import Wrapper from './Wrapper';
import PluginBanner from './PluginBanner';
const MarketPlacePage = () => {
const toggleNotification = useNotification();
@ -30,7 +31,7 @@ const MarketPlacePage = () => {
const emitEventRef = useRef(trackUsage);
useEffect(() => {
emitEventRef.current('didGotToMarketplace');
emitEventRef.current('didGoToMarketplace');
}, []);
if (isLoading || error) {
@ -90,6 +91,7 @@ const MarketPlacePage = () => {
id: 'app.components.InstallPluginPage.description',
})}
/>
<PluginBanner />
<div className="row" style={{ paddingTop: '4.1rem' }}>
{data.map(plugin => {
return (

View File

@ -64,6 +64,15 @@ describe('ADMIN | pages | SettingsPage', () => {
const { container } = render(App);
expect(container.firstChild).toMatchInlineSnapshot(`
.c5 {
margin: 0;
line-height: 34px;
color: #292b2c;
font-size: 13px;
font-weight: 400;
text-transform: none;
}
.c1 {
position: fixed;
top: 0;
@ -105,15 +114,6 @@ describe('ADMIN | pages | SettingsPage', () => {
margin-bottom: 29px;
}
.c5 {
margin: 0;
line-height: 34px;
color: #292b2c;
font-size: 13px;
font-weight: 400;
text-transform: none;
}
.c4 {
display: -webkit-box;
display: -webkit-flex;

View File

@ -37,6 +37,7 @@ const colors = {
'link-hover': '#1c2431',
'link-color': '#919bae',
'title-color': '#5b626f',
'background-header-link': '#007eff',
},
strapi: {
'gray-light': '#eff3f6',

View File

@ -231,6 +231,9 @@
"app.components.Official": "Official",
"app.components.Onboarding.label.completed": "% completed",
"app.components.Onboarding.title": "Get Started Videos",
"app.components.PluginBanner": "Discover plugins built by the community, and many more awesome things to kickstart your project, on Strapi Awesome.",
"app.components.PluginBanner.image.alt": "a strapi rocket logo",
"app.components.PluginBanner.link": "Check it out now",
"app.components.PluginCard.Button.label.download": "Download",
"app.components.PluginCard.Button.label.install": "Already installed",
"app.components.PluginCard.PopUpWarning.install.impossible.autoReload.needed": "The autoReload feature needs to be enabled. Please start your app with `yarn develop`.",

View File

@ -2,11 +2,12 @@
// eslint-disable-next-line node/no-extraneous-require
const { features } = require('@strapi/strapi/lib/utils/ee');
const executeCEBootstrap = require('../../../config/functions/bootstrap');
const executeCEBootstrap = require('../../../../server/config/functions/bootstrap');
const {
features: { sso: ssoActions },
} = require('../admin-actions');
const { getService } = require('../../../utils');
const { getService } = require('../../../../server/utils');
module.exports = async () => {
const { actionProvider } = getService('permission');

View File

@ -0,0 +1,8 @@
'use strict';
module.exports = {
functions: {
bootstrap: require('./functions/bootstrap'),
},
routes: require('./routes').routes,
};

View File

@ -2,7 +2,7 @@
const passport = require('koa-passport');
const { getService } = require('../../../utils');
const { getService } = require('../../../../server/utils');
const utils = require('./utils');
const defaultConnectionError = () => new Error('Invalid connection payload');

View File

@ -0,0 +1,8 @@
'use strict';
module.exports = {
authentication: require('./authentication'),
permission: require('./permission'),
role: require('./role'),
user: require('./user'),
};

View File

@ -1,7 +1,7 @@
'use strict';
const { getService } = require('../../utils');
const { formatConditions } = require('../../controllers/formatters');
const { getService } = require('../../../server/utils');
const { formatConditions } = require('../../../server/controllers/formatters');
module.exports = {
async getAll(ctx) {

View File

@ -6,9 +6,9 @@ const {
validateRoleDeleteInput,
validateRolesDeleteInput,
} = require('../validation/role');
const { getService } = require('../../utils');
const { getService } = require('../../../server//utils');
const { validatedUpdatePermissionsInput } = require('../validation/permission');
const { SUPER_ADMIN_CODE } = require('../../services/constants');
const { SUPER_ADMIN_CODE } = require('../../../server/services/constants');
module.exports = {
/**

View File

@ -2,7 +2,7 @@
const { pick } = require('lodash/fp');
const { validateUserCreationInput } = require('../validation/user');
const { getService } = require('../../utils');
const { getService } = require('../../../server/utils');
const pickUserCreationAttributes = pick(['firstname', 'lastname', 'email', 'roles']);

View File

@ -0,0 +1,8 @@
'use strict';
module.exports = {
// TODO: update load middleware to not load the admin middleware from here
config: require('./config'),
services: require('./services'),
controllers: require('./controllers'),
};

View File

@ -7,7 +7,7 @@ jest.mock('koa-passport', () => ({
const passport = require('koa-passport');
const { init } = require('../../../services/passport');
const { init } = require('../../../../server/services/passport');
describe('Passport', () => {
afterEach(() => {

View File

@ -0,0 +1,6 @@
'use strict';
module.exports = {
passport: require('./passport'),
role: require('./role'),
};

View File

@ -3,7 +3,7 @@
// eslint-disable-next-line node/no-extraneous-require
const { features } = require('@strapi/strapi/lib/utils/ee');
const createLocalStrategy = require('../../services/passport/local-strategy');
const createLocalStrategy = require('../../../server/services/passport/local-strategy');
const sso = require('./passport/sso');
const getPassportStrategies = () => {

View File

@ -1,6 +1,6 @@
'use strict';
const { authEventsMapper } = require('../../../services/passport');
const { authEventsMapper } = require('../../../../server/services/passport');
const createProviderRegistry = require('./provider-registry');
const providerRegistry = createProviderRegistry();

View File

@ -1,8 +1,8 @@
'use strict';
const { createStrapiInstance } = require('../../../../../test/helpers/strapi');
const { createAuthRequest, createRequest } = require('../../../../../test/helpers/request');
const { createUtils } = require('../../../../../test/helpers/utils');
const { createStrapiInstance } = require('../../../../../../test/helpers/strapi');
const { createAuthRequest, createRequest } = require('../../../../../../test/helpers/request');
const { createUtils } = require('../../../../../../test/helpers/utils');
const edition = process.env.STRAPI_DISABLE_EE === 'true' ? 'CE' : 'EE';

View File

@ -1,7 +1,7 @@
'use strict';
const { formatYupErrors } = require('@strapi/utils');
const validators = require('../../validation/common-validators');
const validators = require('../../../server/validation/common-validators');
const handleReject = error => Promise.reject(formatYupErrors(error));

View File

@ -3,7 +3,7 @@
const { yup, formatYupErrors } = require('@strapi/utils');
// eslint-disable-next-line node/no-extraneous-require
const { features } = require('@strapi/strapi/lib/utils/ee');
const { schemas } = require('../../validation/user');
const { schemas } = require('../../../server/validation/user');
const handleReject = error => Promise.reject(formatYupErrors(error));

View File

@ -0,0 +1,3 @@
'use strict';
module.exports = require('./server');

View File

@ -150,7 +150,7 @@ async function copyAdmin(dest) {
await fs.ensureDir(path.resolve(dest, 'config'));
await fs.copy(path.resolve(adminPath, 'admin'), path.resolve(dest, 'admin'));
await fs.copy(
path.resolve(adminPath, 'config', 'layout.js'),
path.resolve(adminPath, 'server', 'config', 'layout.js'),
path.resolve(dest, 'config', 'layout.js')
);
@ -230,6 +230,7 @@ async function watchAdmin({ dir, host, port, browser, options }) {
roots,
};
const webpackConfig = getCustomWebpackConfig(dir, args);
const opts = {
clientLogLevel: 'silent',
quiet: true,
@ -239,9 +240,9 @@ async function watchAdmin({ dir, host, port, browser, options }) {
index: options.adminPath,
disableDotRule: true,
},
...webpack(webpackConfig).options.devServer,
};
const webpackConfig = getCustomWebpackConfig(dir, args);
const server = new WebpackDevServer(webpack(webpackConfig), opts);
server.listen(port, host, function(err) {

View File

@ -1,6 +1,6 @@
{
"name": "@strapi/admin",
"version": "3.6.5",
"version": "3.6.6",
"description": "Strapi Admin",
"repository": {
"type": "git",
@ -25,12 +25,12 @@
"@babel/preset-env": "7.14.0",
"@babel/preset-react": "7.13.13",
"@babel/runtime": "7.14.0",
"@buffetjs/core": "3.3.6",
"@buffetjs/custom": "3.3.6",
"@buffetjs/hooks": "3.3.6",
"@buffetjs/icons": "3.3.6",
"@buffetjs/styles": "3.3.6",
"@buffetjs/utils": "3.3.6",
"@buffetjs/core": "3.3.8",
"@buffetjs/custom": "3.3.8",
"@buffetjs/hooks": "3.3.8",
"@buffetjs/icons": "3.3.8",
"@buffetjs/styles": "3.3.8",
"@buffetjs/utils": "3.3.8",
"@casl/ability": "^4.1.5",
"@fingerprintjs/fingerprintjs": "3.1.1",
"@fortawesome/fontawesome-free": "^5.15.3",
@ -39,8 +39,8 @@
"@fortawesome/free-solid-svg-icons": "^5.15.3",
"@fortawesome/react-fontawesome": "^0.1.14",
"@strapi/babel-plugin-switch-ee-ce": "1.0.0",
"@strapi/helper-plugin": "3.6.5",
"@strapi/utils": "3.6.5",
"@strapi/helper-plugin": "3.6.6",
"@strapi/utils": "3.6.6",
"axios": "^0.21.1",
"babel-loader": "8.2.2",
"babel-plugin-styled-components": "1.12.0",

View File

@ -55,11 +55,4 @@ module.exports = async () => {
await userService.displayWarningIfUsersDontHaveRole();
await syncAuthSettings();
strapi.admin.destroy = async () => {
const { conditionProvider, actionProvider } = getService('permission');
await conditionProvider.clear();
await actionProvider.clear();
};
};

View File

@ -1,3 +1,4 @@
/* eslint-disable no-unused-vars */
'use strict';
const permissionsFieldsToPropertiesMigration = require('../migrations/permissions-fields-to-properties');

View File

@ -0,0 +1,15 @@
'use strict';
module.exports = {
functions: {
bootstrap: require('./functions/bootstrap'),
register: require('./functions/register'),
},
policies: {
hasPermissions: require('./policies/hasPermissions'),
isAuthenticatedAdmin: require('./policies/isAuthenticatedAdmin'),
},
routes: require('./routes').routes,
layout: require('./layout'),
...require('./settings'),
};

View File

@ -0,0 +1,7 @@
'use strict';
module.exports = {
permission: require('./Permission'),
user: require('./User'),
role: require('./Role'),
};

View File

@ -1,6 +1,6 @@
'use strict';
const createContext = require('../../../../../test/helpers/create-context');
const createContext = require('../../../../../../test/helpers/create-context');
const permissionController = require('../permission');
describe('Permission Controller', () => {

View File

@ -1,6 +1,6 @@
'use strict';
const createContext = require('../../../../../test/helpers/create-context');
const createContext = require('../../../../../../test/helpers/create-context');
const roleController = require('../role');
describe('Role controller', () => {

View File

@ -1,6 +1,6 @@
'use strict';
const createContext = require('../../../../../test/helpers/create-context');
const createContext = require('../../../../../../test/helpers/create-context');
const userController = require('../user');
describe('User Controller', () => {

View File

@ -2,12 +2,11 @@
const execa = require('execa');
const _ = require('lodash');
const { getService } = require('../utils');
// FIXME
// eslint-disable-next-line node/no-extraneous-require
const ee = require('@strapi/strapi/lib/utils/ee');
const { getService } = require('../utils');
const PLUGIN_NAME_REGEX = /^[A-Za-z][A-Za-z0-9-_]+$/;
/**

View File

@ -0,0 +1,11 @@
'use strict';
module.exports = {
admin: require('./admin'),
'authenticated-user': require('./authenticated-user'),
authentication: require('./authentication'),
permission: require('./permission'),
role: require('./role'),
user: require('./user'),
webhooks: require('./Webhooks'),
};

View File

@ -0,0 +1,18 @@
'use strict';
const { getService } = require('./utils');
module.exports = {
// TODO: update load middleware to not load the admin middleware from here
// TODO: load bootstrap / register independently
async destroy() {
const { conditionProvider, actionProvider } = getService('permission');
await conditionProvider.clear();
await actionProvider.clear();
},
config: require('./config'),
services: require('./services'),
controllers: require('./controllers'),
models: require('./content-types'),
};

Some files were not shown because too many files have changed in this diff Show More