mirror of
https://github.com/strapi/strapi.git
synced 2025-08-29 03:05:55 +00:00
Use one webpack server to serve admin in development mode
This commit is contained in:
parent
51d936b559
commit
62f96e5c07
@ -8,6 +8,8 @@ import 'babel-polyfill';
|
|||||||
|
|
||||||
// Import all the third party stuff
|
// Import all the third party stuff
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
import { ConnectedRouter } from 'react-router-redux';
|
import { ConnectedRouter } from 'react-router-redux';
|
||||||
import createHistory from 'history/createBrowserHistory';
|
import createHistory from 'history/createBrowserHistory';
|
||||||
import { merge, isFunction } from 'lodash';
|
import { merge, isFunction } from 'lodash';
|
||||||
@ -20,7 +22,6 @@ import App from 'containers/App';
|
|||||||
import { showNotification } from 'containers/NotificationProvider/actions';
|
import { showNotification } from 'containers/NotificationProvider/actions';
|
||||||
import { pluginLoaded, updatePlugin } from 'containers/App/actions';
|
import { pluginLoaded, updatePlugin } from 'containers/App/actions';
|
||||||
|
|
||||||
import { plugins } from '../../config/admin.json';
|
|
||||||
import configureStore from './store';
|
import configureStore from './store';
|
||||||
import { translationMessages, languages } from './i18n';
|
import { translationMessages, languages } from './i18n';
|
||||||
|
|
||||||
@ -129,23 +130,6 @@ window.Strapi = {
|
|||||||
languages,
|
languages,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ping each plugins port defined in configuration
|
|
||||||
if (window.location.hostname === 'localhost') {
|
|
||||||
plugins.ports.forEach(pluginPort => {
|
|
||||||
// Define plugin url
|
|
||||||
const pluginUrl = `http://localhost:${pluginPort}/main.js`;
|
|
||||||
|
|
||||||
// Check that the server in running
|
|
||||||
fetch(pluginUrl)
|
|
||||||
.then(() => {
|
|
||||||
// Inject `script` tag in DOM
|
|
||||||
const script = window.document.createElement('script');
|
|
||||||
script.src = pluginUrl;
|
|
||||||
window.document.body.appendChild(script);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const dispatch = store.dispatch;
|
const dispatch = store.dispatch;
|
||||||
export {
|
export {
|
||||||
dispatch,
|
dispatch,
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import styles from './styles.scss';
|
import styles from './styles.scss';
|
||||||
|
|
||||||
class Header extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
class Header extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { defineMessages, FormattedMessage } from 'react-intl';
|
import { defineMessages, FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
import LocaleToggle from 'containers/LocaleToggle';
|
import LocaleToggle from 'containers/LocaleToggle';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
import styles from './styles.scss';
|
import styles from './styles.scss';
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import _ from 'lodash';
|
import React from 'react';
|
||||||
|
import { startsWith } from 'lodash';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
@ -15,7 +16,7 @@ class LeftMenuLink extends React.Component { // eslint-disable-line react/prefer
|
|||||||
render() {
|
render() {
|
||||||
// We need to create our own active url checker,
|
// We need to create our own active url checker,
|
||||||
// because of the two levels router.
|
// because of the two levels router.
|
||||||
const isLinkActive = _.startsWith(window.location.pathname.replace('/admin', ''), this.props.destination);
|
const isLinkActive = startsWith(window.location.pathname.replace('/admin', ''), this.props.destination);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li className={styles.item}>
|
<li className={styles.item}>
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import { map } from 'lodash';
|
import { map } from 'lodash';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
@ -4,13 +4,14 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
import { CSSTransition, TransitionGroup } from 'react-transition-group';
|
||||||
|
|
||||||
import Notification from 'components/Notification';
|
import Notification from 'components/Notification';
|
||||||
|
|
||||||
import styles from './styles.scss';
|
import styles from './styles.scss';
|
||||||
|
|
||||||
const { CSSTransition, TransitionGroup } = ReactTransitionGroup;
|
|
||||||
|
|
||||||
class NotificationsContainer extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
class NotificationsContainer extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
||||||
render() {
|
render() {
|
||||||
if (this.props.notifications.length === 0) {
|
if (this.props.notifications.length === 0) {
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import ToggleOption from 'components/ToggleOption';
|
import ToggleOption from 'components/ToggleOption';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { injectIntl, intlShape } from 'react-intl';
|
import { injectIntl, intlShape } from 'react-intl';
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
* the linting exception.
|
* the linting exception.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createStructuredSelector } from 'reselect';
|
import { createStructuredSelector } from 'reselect';
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
* the linting exception.
|
* the linting exception.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Switch, Route } from 'react-router-dom';
|
import { Switch, Route } from 'react-router-dom';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import Helmet from 'react-helmet';
|
import Helmet from 'react-helmet';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import Helmet from 'react-helmet';
|
import Helmet from 'react-helmet';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
* IntlProvider component and i18n messages (loaded from `app/translations`)
|
* IntlProvider component and i18n messages (loaded from `app/translations`)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
* the linting exception.
|
* the linting exception.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { defineMessages, FormattedMessage } from 'react-intl';
|
import { defineMessages, FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createStructuredSelector } from 'reselect';
|
import { createStructuredSelector } from 'reselect';
|
||||||
@ -12,7 +13,6 @@ import NotificationsContainer from 'components/NotificationsContainer';
|
|||||||
import { selectNotifications } from './selectors';
|
import { selectNotifications } from './selectors';
|
||||||
import { hideNotification } from './actions';
|
import { hideNotification } from './actions';
|
||||||
|
|
||||||
|
|
||||||
export class NotificationProvider extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
export class NotificationProvider extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import Helmet from 'react-helmet';
|
import Helmet from 'react-helmet';
|
||||||
|
@ -12,9 +12,5 @@
|
|||||||
<!-- The app hooks into this div -->
|
<!-- The app hooks into this div -->
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<!-- A lot of magic happens in this file. HtmlWebpackPlugin automatically includes all assets (e.g. bundle.js, main.css) with the correct HTML tags, which is why they are missing in this HTML file. Don't add any assets here! (Check out webpackconfig.js if you want to know more) -->
|
<!-- A lot of magic happens in this file. HtmlWebpackPlugin automatically includes all assets (e.g. bundle.js, main.css) with the correct HTML tags, which is why they are missing in this HTML file. Don't add any assets here! (Check out webpackconfig.js if you want to know more) -->
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-with-addons.js"></script>
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.js"></script>
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-transition-group/2.2.0/react-transition-group.js"></script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import hoistNonReactStatics from 'hoist-non-react-statics';
|
import hoistNonReactStatics from 'hoist-non-react-statics';
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import hoistNonReactStatics from 'hoist-non-react-statics';
|
import hoistNonReactStatics from 'hoist-non-react-statics';
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
"plop": "^1.8.1",
|
"plop": "^1.8.1",
|
||||||
"prettier": "^1.7.0",
|
"prettier": "^1.7.0",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"strapi-helper-plugin": "file:../strapi-helper-plugin",
|
"strapi-helper-plugin": "3.0.0-alpha.5.5",
|
||||||
"webpack": "^3.6.0"
|
"webpack": "^3.6.0"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fs-extra": "^4.0.1",
|
"fs-extra": "^4.0.1",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"strapi-admin": "file:../strapi-admin"
|
"strapi-admin": "3.0.0-alpha.5.5"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"email": "hi@strapi.io",
|
"email": "hi@strapi.io",
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
"fs-extra": "^4.0.0",
|
"fs-extra": "^4.0.0",
|
||||||
"get-installed-path": "^3.0.1",
|
"get-installed-path": "^3.0.1",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"strapi-utils": "file:../strapi-utils"
|
"strapi-utils": "3.0.0-alpha.5.5"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepublish": "npm prune"
|
"prepublish": "npm prune"
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
"fs-extra": "^4.0.0",
|
"fs-extra": "^4.0.0",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"reportback": "^2.0.1",
|
"reportback": "^2.0.1",
|
||||||
"strapi-utils": "file:../strapi-utils"
|
"strapi-utils": "3.0.0-alpha.5.5"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Strapi team",
|
"name": "Strapi team",
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
* COMMON WEBPACK CONFIGURATION
|
* COMMON WEBPACK CONFIGURATION
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
const webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
@ -9,18 +10,26 @@ const webpack = require('webpack');
|
|||||||
const pkg = require(path.resolve(process.cwd(), 'package.json'));
|
const pkg = require(path.resolve(process.cwd(), 'package.json'));
|
||||||
const pluginId = pkg.name.replace(/^strapi-/i, '');
|
const pluginId = pkg.name.replace(/^strapi-/i, '');
|
||||||
|
|
||||||
|
const plugins = process.env.IS_ADMIN === 'true' ? fs.readdirSync(path.resolve(process.env.PWD, '..', 'plugins'))
|
||||||
|
.filter(x => x[0] !== '.') : [];
|
||||||
|
|
||||||
|
const pluginFolders = plugins.reduce((acc, current) => {
|
||||||
|
acc[current] = path.resolve(process.env.PWD, '..', 'plugins', current, 'node_modules', 'strapi-helper-plugin', 'lib', 'src');
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
|
||||||
module.exports = (options) => ({
|
module.exports = (options) => ({
|
||||||
entry: options.entry,
|
entry: Object.assign(options.entry, plugins.reduce((acc, current) => {
|
||||||
|
acc[current] = path.resolve(pluginFolders[current], 'app.js');
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {})),
|
||||||
output: Object.assign({ // Compile into js/build.js
|
output: Object.assign({ // Compile into js/build.js
|
||||||
path: path.resolve(process.cwd(), 'admin', 'build'),
|
path: path.resolve(process.cwd(), 'admin', 'build'),
|
||||||
publicPath: '/',
|
publicPath: '/',
|
||||||
}, options.output), // Merge with env dependent settings
|
}, options.output), // Merge with env dependent settings
|
||||||
module: {
|
module: {
|
||||||
// Comment
|
|
||||||
noParse: [
|
|
||||||
/\/react\//g,
|
|
||||||
/\/react-dom\//g,
|
|
||||||
],
|
|
||||||
loaders: [{
|
loaders: [{
|
||||||
test: /\.js$/, // Transform all .js files required somewhere with Babel,
|
test: /\.js$/, // Transform all .js files required somewhere with Babel,
|
||||||
use: {
|
use: {
|
||||||
@ -46,11 +55,13 @@ module.exports = (options) => ({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
include: [
|
include: [path.join(process.cwd(), 'admin', 'src')]
|
||||||
path.join(process.cwd(), 'admin', 'src'),
|
.concat(plugins.reduce((acc, current) => {
|
||||||
// Add the `strapi-helper-plugin` folders watched by babel
|
acc.push(path.resolve(process.env.PWD, '..', 'plugins', current, 'admin', 'src'), pluginFolders[current]);
|
||||||
path.join(process.cwd(), 'node_modules', 'strapi-helper-plugin', 'lib', 'src'),
|
|
||||||
],
|
return acc;
|
||||||
|
}, []))
|
||||||
|
.concat([path.join(process.cwd(), 'node_modules', 'strapi-helper-plugin', 'lib', 'src')])
|
||||||
}, {
|
}, {
|
||||||
// Transform our own .scss files
|
// Transform our own .scss files
|
||||||
test: /\.scss$/,
|
test: /\.scss$/,
|
||||||
@ -145,9 +156,6 @@ module.exports = (options) => ({
|
|||||||
],
|
],
|
||||||
alias: {
|
alias: {
|
||||||
moment: 'moment/moment.js',
|
moment: 'moment/moment.js',
|
||||||
'react': 'react',
|
|
||||||
'react-dom': 'react-dom',
|
|
||||||
'react-transition-group': 'react-transition-group',
|
|
||||||
},
|
},
|
||||||
symlinks: false,
|
symlinks: false,
|
||||||
extensions: [
|
extensions: [
|
||||||
@ -161,7 +169,7 @@ module.exports = (options) => ({
|
|||||||
'main',
|
'main',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
externals: generateExternals(),
|
externals: {},
|
||||||
resolveLoader: {
|
resolveLoader: {
|
||||||
modules: [
|
modules: [
|
||||||
path.join(__dirname, '..', '..', '..', 'node_modules'),
|
path.join(__dirname, '..', '..', '..', 'node_modules'),
|
||||||
@ -169,13 +177,5 @@ module.exports = (options) => ({
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
devtool: options.devtool,
|
devtool: options.devtool,
|
||||||
target: 'web', // Make web variables accessible to webpack, e.g. window
|
target: 'web', // Make web variables accessible to webpack, e.g. window,
|
||||||
});
|
});
|
||||||
|
|
||||||
function generateExternals() {
|
|
||||||
return {
|
|
||||||
'react': 'React',
|
|
||||||
'react-dom': 'ReactDOM',
|
|
||||||
'react-transition-group': 'ReactTransitionGroup',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
@ -11,24 +11,29 @@ const argv = require('minimist')(process.argv.slice(2));
|
|||||||
const cssnext = require('postcss-cssnext');
|
const cssnext = require('postcss-cssnext');
|
||||||
const postcssFocus = require('postcss-focus');
|
const postcssFocus = require('postcss-focus');
|
||||||
const postcssReporter = require('postcss-reporter');
|
const postcssReporter = require('postcss-reporter');
|
||||||
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
||||||
|
|
||||||
const plugins = [
|
const plugins = [
|
||||||
new webpack.HotModuleReplacementPlugin(), // Tell webpack we want hot reloading
|
new webpack.HotModuleReplacementPlugin(), // Tell webpack we want hot reloading
|
||||||
|
// new BundleAnalyzerPlugin(),
|
||||||
];
|
];
|
||||||
|
|
||||||
const isAdmin = process.env.IS_ADMIN === 'true';
|
// Build the `index.html file`
|
||||||
|
plugins.push(
|
||||||
// Build the `index.htm file`
|
new HtmlWebpackPlugin({
|
||||||
if (isAdmin) {
|
|
||||||
plugins.push(new HtmlWebpackPlugin({
|
|
||||||
favicon: 'admin/src/favicon.ico',
|
favicon: 'admin/src/favicon.ico',
|
||||||
inject: true, // Inject all files that are generated by webpack, e.g. bundle.js
|
inject: true, // Inject all files that are generated by webpack, e.g. bundle.js
|
||||||
templateContent: templateContent(), // eslint-disable-line no-use-before-define
|
templateContent: templateContent(), // eslint-disable-line no-use-before-define
|
||||||
}));
|
chunksSortMode: 'auto',
|
||||||
}
|
}),
|
||||||
|
new webpack.optimize.CommonsChunkPlugin({
|
||||||
|
name: 'vendor',
|
||||||
|
minChunks: 2, // Ensure there is only the defined dependencies.
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
const appPath = isAdmin
|
|
||||||
? path.join(process.cwd(), 'admin', 'src', 'app.js')
|
const appPath = path.join(process.cwd(), 'admin', 'src', 'app.js')
|
||||||
: path.join(process.cwd(), 'node_modules', 'strapi-helper-plugin', 'lib', 'src', 'app.js');
|
|
||||||
|
|
||||||
const logger = require('../../server/logger');
|
const logger = require('../../server/logger');
|
||||||
|
|
||||||
@ -38,10 +43,12 @@ const port = argv.port || process.env.PORT || 3000;
|
|||||||
|
|
||||||
module.exports = require('./webpack.base.babel')({
|
module.exports = require('./webpack.base.babel')({
|
||||||
// Add hot reloading in development
|
// Add hot reloading in development
|
||||||
entry: [
|
entry: {
|
||||||
|
main: [
|
||||||
`webpack-hot-middleware/client?path=http://localhost:${port}/__webpack_hmr`,
|
`webpack-hot-middleware/client?path=http://localhost:${port}/__webpack_hmr`,
|
||||||
appPath,
|
appPath,
|
||||||
],
|
]
|
||||||
|
},
|
||||||
|
|
||||||
// Don't use hashes in dev mode for better performance
|
// Don't use hashes in dev mode for better performance
|
||||||
output: {
|
output: {
|
||||||
@ -51,7 +58,7 @@ module.exports = require('./webpack.base.babel')({
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Add development plugins
|
// Add development plugins
|
||||||
plugins: dependencyHandlers().concat(plugins), // eslint-disable-line no-use-before-define,
|
plugins: plugins, // eslint-disable-line no-use-before-define,
|
||||||
|
|
||||||
// Process the CSS with PostCSS
|
// Process the CSS with PostCSS
|
||||||
postcssPlugins: [
|
postcssPlugins: [
|
||||||
@ -102,7 +109,7 @@ function dependencyHandlers() {
|
|||||||
if (!dllPlugin) {
|
if (!dllPlugin) {
|
||||||
return [
|
return [
|
||||||
new webpack.optimize.CommonsChunkPlugin({
|
new webpack.optimize.CommonsChunkPlugin({
|
||||||
name: 'vendor',
|
name: 'commons',
|
||||||
children: true,
|
children: true,
|
||||||
minChunks: 2,
|
minChunks: 2,
|
||||||
async: true,
|
async: true,
|
||||||
|
@ -18,7 +18,6 @@ const plugins = [
|
|||||||
name: 'vendor',
|
name: 'vendor',
|
||||||
children: true,
|
children: true,
|
||||||
minChunks: 2,
|
minChunks: 2,
|
||||||
async: true,
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// Minify and optimize the JavaScript
|
// Minify and optimize the JavaScript
|
||||||
@ -45,6 +44,7 @@ if (isAdmin) {
|
|||||||
minifyCSS: true,
|
minifyCSS: true,
|
||||||
minifyURLs: true,
|
minifyURLs: true,
|
||||||
},
|
},
|
||||||
|
chunksSortMode: 'auto',
|
||||||
inject: true,
|
inject: true,
|
||||||
}));
|
}));
|
||||||
plugins.push(new ExtractTextPlugin('[name].[contenthash].css'));
|
plugins.push(new ExtractTextPlugin('[name].[contenthash].css'));
|
||||||
|
@ -15,7 +15,7 @@ const addDevMiddlewares = (app, webpackConfig) => {
|
|||||||
stats: 'errors-only',
|
stats: 'errors-only',
|
||||||
headers: {
|
headers: {
|
||||||
'Access-Control-Allow-Origin': '*',
|
'Access-Control-Allow-Origin': '*',
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.use(middleware);
|
app.use(middleware);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
* only setup and plugin code.
|
* only setup and plugin code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
|
|
||||||
import App, { bootstrap } from 'containers/App'; // eslint-disable-line
|
import App, { bootstrap } from 'containers/App'; // eslint-disable-line
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import styles from './styles.scss';
|
import styles from './styles.scss';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { get, isEmpty, map, mapKeys, isObject, reject, includes } from 'lodash';
|
import { get, isEmpty, map, mapKeys, isObject, reject, includes } from 'lodash';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import PluginHeaderTitle from 'components/PluginHeaderTitle';
|
import PluginHeaderTitle from 'components/PluginHeaderTitle';
|
||||||
import PluginHeaderActions from 'components/PluginHeaderActions';
|
import PluginHeaderActions from 'components/PluginHeaderActions';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import Button from 'components/Button';
|
import Button from 'components/Button';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
// modal
|
// modal
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import hoistNonReactStatics from 'hoist-non-react-statics';
|
import hoistNonReactStatics from 'hoist-non-react-statics';
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import hoistNonReactStatics from 'hoist-non-react-statics';
|
import hoistNonReactStatics from 'hoist-non-react-statics';
|
||||||
|
|
||||||
|
@ -88,16 +88,17 @@
|
|||||||
"postcss-smart-import": "^0.7.5",
|
"postcss-smart-import": "^0.7.5",
|
||||||
"precss": "^2.0.0",
|
"precss": "^2.0.0",
|
||||||
"prettier": "^1.5.3",
|
"prettier": "^1.5.3",
|
||||||
"react": "^15.6.1",
|
"react": "^15.6.2",
|
||||||
|
"react-css-transition": "^0.7.4",
|
||||||
"react-datetime": "^2.8.6",
|
"react-datetime": "^2.8.6",
|
||||||
"react-dom": "^15.6.1",
|
"react-dom": "^15.6.2",
|
||||||
"react-helmet": "^5.1.3",
|
"react-helmet": "^5.1.3",
|
||||||
"react-intl": "^2.3.0",
|
"react-intl": "^2.3.0",
|
||||||
"react-redux": "^5.0.6",
|
"react-redux": "^5.0.6",
|
||||||
"react-router-dom": "^4.1.2",
|
"react-router-dom": "^4.1.2",
|
||||||
"react-router-redux": "^5.0.0-alpha.6",
|
"react-router-redux": "^5.0.0-alpha.6",
|
||||||
"react-transition-group": "1.1.2",
|
"react-transition-group": "1.1.2",
|
||||||
"reactstrap": "^4.8.0",
|
"reactstrap": "^5.0.0-alpha.1",
|
||||||
"redux": "^3.7.2",
|
"redux": "^3.7.2",
|
||||||
"redux-immutable": "^4.0.0",
|
"redux-immutable": "^4.0.0",
|
||||||
"redux-saga": "^0.15.6",
|
"redux-saga": "^0.15.6",
|
||||||
@ -113,5 +114,7 @@
|
|||||||
"webpack-hot-middleware": "^2.18.2",
|
"webpack-hot-middleware": "^2.18.2",
|
||||||
"whatwg-fetch": "^2.0.3"
|
"whatwg-fetch": "^2.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {}
|
"devDependencies": {
|
||||||
|
"webpack-bundle-analyzer": "^2.9.0"
|
||||||
|
}
|
||||||
}
|
}
|
@ -248,8 +248,6 @@ module.exports = function (strapi) {
|
|||||||
case 'belongsTo':
|
case 'belongsTo':
|
||||||
FK = _.find(definition.associations, {alias: name});
|
FK = _.find(definition.associations, {alias: name});
|
||||||
|
|
||||||
console.log(name, FK);
|
|
||||||
|
|
||||||
if (FK && FK.nature !== 'oneToOne' && FK.nature !== 'oneToMany') {
|
if (FK && FK.nature !== 'oneToOne' && FK.nature !== 'oneToMany') {
|
||||||
definition.loadedModel[name] = {
|
definition.loadedModel[name] = {
|
||||||
type: 'virtual',
|
type: 'virtual',
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"mongoose-double": "0.0.1",
|
"mongoose-double": "0.0.1",
|
||||||
"mongoose-float": "^1.0.2",
|
"mongoose-float": "^1.0.2",
|
||||||
"pluralize": "^6.0.0",
|
"pluralize": "^6.0.0",
|
||||||
"strapi-utils": "file:../strapi-utils"
|
"strapi-utils": "3.0.0-alpha.5.5"
|
||||||
},
|
},
|
||||||
"strapi": {
|
"strapi": {
|
||||||
"isHook": true
|
"isHook": true
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
class Container extends React.Component {
|
class Container extends React.Component {
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Dependencies.
|
// Dependencies.
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { findIndex, get, omit, isFunction, merge } from 'lodash';
|
import { findIndex, get, omit, isFunction, merge } from 'lodash';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { map } from 'lodash';
|
import { map } from 'lodash';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import { map } from 'lodash';
|
import { map } from 'lodash';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { map } from 'lodash';
|
import { map } from 'lodash';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import Select from 'react-select';
|
import Select from 'react-select';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import 'react-select/dist/react-select.css';
|
import 'react-select/dist/react-select.css';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import Select from 'react-select';
|
import Select from 'react-select';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import 'react-select/dist/react-select.css';
|
import 'react-select/dist/react-select.css';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import TableHeader from '../TableHeader';
|
import TableHeader from '../TableHeader';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import styles from './styles.scss';
|
import styles from './styles.scss';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import LimitSelect from '../LimitSelect';
|
import LimitSelect from '../LimitSelect';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import styles from './styles.scss';
|
import styles from './styles.scss';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { isEmpty } from 'lodash';
|
import { isEmpty } from 'lodash';
|
||||||
|
|
||||||
|
@ -5,11 +5,12 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { bindActionCreators, compose } from 'redux';
|
import { bindActionCreators, compose } from 'redux';
|
||||||
import { createStructuredSelector } from 'reselect';
|
import { createStructuredSelector } from 'reselect';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import _ from 'lodash';
|
import { isEmpty, get } from 'lodash';
|
||||||
import { Switch, Route } from 'react-router-dom';
|
import { Switch, Route } from 'react-router-dom';
|
||||||
|
|
||||||
import injectSaga from 'utils/injectSaga';
|
import injectSaga from 'utils/injectSaga';
|
||||||
@ -46,7 +47,7 @@ class App extends React.Component {
|
|||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
const config = tryRequire('../../../../config/admin.json');
|
const config = tryRequire('../../../../config/admin.json');
|
||||||
|
|
||||||
if (!_.isEmpty(_.get(config, 'admin.schema'))) {
|
if (!isEmpty(get(config, 'admin.schema'))) {
|
||||||
this.props.updateSchema(config.admin.schema);
|
this.props.updateSchema(config.admin.schema);
|
||||||
} else {
|
} else {
|
||||||
this.props.loadModels();
|
this.props.loadModels();
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import _ from 'lodash';
|
import { map } from 'lodash';
|
||||||
import { fork, put, select, call, takeLatest } from 'redux-saga/effects';
|
import { fork, put, select, call, takeLatest } from 'redux-saga/effects';
|
||||||
|
|
||||||
import request from 'utils/request';
|
import request from 'utils/request';
|
||||||
@ -16,7 +16,7 @@ export const generateMenu = function () {
|
|||||||
.then(displayedModels => {
|
.then(displayedModels => {
|
||||||
return [{
|
return [{
|
||||||
name: 'Content Types',
|
name: 'Content Types',
|
||||||
links: _.map(displayedModels, (model, key) => ({
|
links: map(displayedModels, (model, key) => ({
|
||||||
label: model.labelPlural || model.label || key,
|
label: model.labelPlural || model.label || key,
|
||||||
destination: key,
|
destination: key,
|
||||||
})),
|
})),
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Dependencies.
|
// Dependencies.
|
||||||
|
import React from 'react';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { bindActionCreators, compose } from 'redux';
|
import { bindActionCreators, compose } from 'redux';
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
* Home
|
* Home
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createStructuredSelector } from 'reselect';
|
import { createStructuredSelector } from 'reselect';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { bindActionCreators, compose } from 'redux';
|
import { bindActionCreators, compose } from 'redux';
|
||||||
import { createStructuredSelector } from 'reselect';
|
import { createStructuredSelector } from 'reselect';
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
* the linting exception.
|
* the linting exception.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
export default class NotFound extends React.Component {
|
export default class NotFound extends React.Component {
|
||||||
|
@ -62,7 +62,7 @@
|
|||||||
"plop": "^1.8.1",
|
"plop": "^1.8.1",
|
||||||
"prettier": "^1.7.0",
|
"prettier": "^1.7.0",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"strapi-helper-plugin": "file:../strapi-helper-plugin",
|
"strapi-helper-plugin": "3.0.0-alpha.5.5",
|
||||||
"webpack": "^3.6.0"
|
"webpack": "^3.6.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -51,7 +51,7 @@
|
|||||||
"plop": "^1.8.1",
|
"plop": "^1.8.1",
|
||||||
"prettier": "^1.7.0",
|
"prettier": "^1.7.0",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"strapi-helper-plugin": "file:../strapi-helper-plugin",
|
"strapi-helper-plugin": "3.0.0-alpha.5.5",
|
||||||
"webpack": "^3.6.0"
|
"webpack": "^3.6.0"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import 'whatwg-fetch';
|
import 'whatwg-fetch';
|
||||||
import _ from 'lodash';
|
import { startsWith } from 'lodash';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the JSON returned by a network request
|
* Parses the JSON returned by a network request
|
||||||
@ -62,7 +62,7 @@ export default function request(url, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Add parameters to url
|
// Add parameters to url
|
||||||
let urlFormatted = _.startsWith(url, '/')
|
let urlFormatted = startsWith(url, '/')
|
||||||
? `${Strapi.apiUrl}${url}`
|
? `${Strapi.apiUrl}${url}`
|
||||||
: url;
|
: url;
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
"plop": "^1.8.1",
|
"plop": "^1.8.1",
|
||||||
"prettier": "^1.7.0",
|
"prettier": "^1.7.0",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"strapi-helper-plugin": "file:../strapi-helper-plugin",
|
"strapi-helper-plugin": "3.0.0-alpha.5.5",
|
||||||
"webpack": "^3.6.0"
|
"webpack": "^3.6.0"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
|
@ -52,13 +52,13 @@
|
|||||||
"node-schedule": "^1.2.0",
|
"node-schedule": "^1.2.0",
|
||||||
"semver": "^5.4.1",
|
"semver": "^5.4.1",
|
||||||
"stack-trace": "0.0.10",
|
"stack-trace": "0.0.10",
|
||||||
"strapi-generate": "file:../strapi-generate",
|
"strapi-generate": "3.0.0-alpha.5.5",
|
||||||
"strapi-generate-admin": "file:../strapi-generate-admin",
|
"strapi-generate-admin": "3.0.0-alpha.5.5",
|
||||||
"strapi-generate-api": "file:../strapi-generate-api",
|
"strapi-generate-api": "3.0.0-alpha.5.5",
|
||||||
"strapi-generate-new": "file:../strapi-generate-new",
|
"strapi-generate-new": "3.0.0-alpha.5.5",
|
||||||
"strapi-generate-policy": "file:../strapi-generate-policy",
|
"strapi-generate-policy": "3.0.0-alpha.5.5",
|
||||||
"strapi-generate-service": "file:../strapi-generate-service",
|
"strapi-generate-service": "3.0.0-alpha.5.5",
|
||||||
"strapi-utils": "file:../strapi-utils"
|
"strapi-utils": "3.0.0-alpha.5.5"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"email": "hi@strapi.io",
|
"email": "hi@strapi.io",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user