canner
Version:
Build CMS in few lines of code for different data sources
271 lines (223 loc) • 9.4 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.genClient = genClient;
exports.default = void 0;
require("antd/lib/notification/style");
var _notification2 = _interopRequireDefault(require("antd/lib/notification"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var React = _interopRequireWildcard(require("react"));
var _Provider = _interopRequireDefault(require("./Provider"));
var _Generator = _interopRequireDefault(require("./Generator"));
var _antd = require("antd");
var _cannerHelpers = require("canner-helpers");
var _cannerCompiler = require("canner-compiler");
var _cannerGraphqlInterface = require("canner-graphql-interface");
var _lodash = require("lodash");
var _en = _interopRequireDefault(require("react-intl/locale-data/en"));
var _zh = _interopRequireDefault(require("react-intl/locale-data/zh"));
var _reactIntl = require("react-intl");
var _locale = _interopRequireDefault(require("./locale"));
var _antdLocales = _interopRequireDefault(require("@canner/antd-locales"));
// i18n
(0, _reactIntl.addLocaleData)((0, _toConsumableArray2.default)(_en.default).concat((0, _toConsumableArray2.default)(_zh.default))); // type
var CannerCMS =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(CannerCMS, _React$Component);
function CannerCMS(props) {
var _this;
(0, _classCallCheck2.default)(this, CannerCMS);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(CannerCMS).call(this, props));
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "imageServiceConfigs", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "client", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "provider", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "componentTree", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "schema", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "dataDidChange", function (dataChanged) {
var dataDidChange = _this.props.dataDidChange;
if (dataDidChange) {
dataDidChange(dataChanged);
}
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "deploy", function (key, id) {
if (_this.provider) {
return _this.provider.deploy(key, id);
}
return Promise.resolve();
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "reset", function (key, id) {
if (_this.provider) {
return _this.provider.reset(key, id);
}
return Promise.resolve();
});
var _props$schema = props.schema,
schema = _props$schema.schema,
visitors = _props$schema.visitors,
pageSchema = _props$schema.pageSchema;
var uiSchema = (0, _objectSpread2.default)({}, pageSchema, (0, _lodash.pickBy)(schema, function (v) {
return !v.defOnly;
}));
_this.componentTree = compile(uiSchema, visitors);
_this.schema = Object.keys(schema).reduce(function (result, key) {
var v = (0, _objectSpread2.default)({}, schema[key]);
if (v.type === 'array') {
// v.items = v.items.items;
v.items.id = {
type: 'id'
};
}
result[key] = v;
return result;
}, {});
_this.client = genClient((0, _objectSpread2.default)({}, props.schema, {
schema: schema
}));
return _this;
}
(0, _createClass2.default)(CannerCMS, [{
key: "componentDidCatch",
value: function componentDidCatch(error) {
var errorHandler = this.props.errorHandler;
errorHandler && errorHandler(error);
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
baseUrl = _this$props.baseUrl,
routes = _this$props.routes,
routerParams = _this$props.routerParams,
goTo = _this$props.goTo,
afterDeploy = _this$props.afterDeploy,
beforeDeploy = _this$props.beforeDeploy,
beforeFetch = _this$props.beforeFetch,
_this$props$intl = _this$props.intl,
intl = _this$props$intl === void 0 ? {} : _this$props$intl,
hideButtons = _this$props.hideButtons,
errorHandler = _this$props.errorHandler,
_this$props$schema = _this$props.schema,
imageStorages = _this$props$schema.imageStorages,
fileStorages = _this$props$schema.fileStorages,
_this$props$schema$di = _this$props$schema.dict,
dict = _this$props$schema$di === void 0 ? {} : _this$props$schema$di,
defaultKey = _this$props.defaultKey;
var currentLocale = intl.locale || 'en';
return React.createElement(_reactIntl.IntlProvider, {
locale: currentLocale,
key: currentLocale,
defaultLocale: intl.defaultLocale || currentLocale,
messages: (0, _objectSpread2.default)({}, _antdLocales.default[currentLocale] || {}, _locale.default[currentLocale] || {}, dict[currentLocale] || {}, (intl.messages || {})[currentLocale] || {})
}, React.createElement(_Provider.default, {
ref: function ref(provider) {
return _this2.provider = provider;
},
client: this.client,
schema: this.schema,
dataDidChange: this.dataDidChange,
afterDeploy: afterDeploy,
beforeDeploy: beforeDeploy,
beforeFetch: beforeFetch,
rootKey: routes[0],
routes: routes,
routerParams: routerParams || {},
errorHandler: errorHandler || defaultErrorHandler
}, React.createElement(_Generator.default, {
imageStorages: imageStorages,
fileStorages: fileStorages,
schema: this.schema,
componentTree: this.componentTree || {},
goTo: goTo,
baseUrl: baseUrl,
routes: routes,
routerParams: routerParams || {},
hideButtons: hideButtons,
defaultKey: defaultKey
})));
}
}]);
return CannerCMS;
}(React.Component);
(0, _defineProperty2.default)(CannerCMS, "defaultProps", {
schema: {
schema: {}
},
dataDidChange: function dataDidChange() {},
afterDeploy: function afterDeploy() {},
baseUrl: '/',
intl: {
locale: 'en',
defaultLocale: 'en',
messages: {
'en': {}
}
},
routerParams: {},
routes: []
});
function compile(schema, visitors) {
var parser = new _cannerCompiler.Parser();
var tree = parser.parse(schema);
var traverser = new _cannerCompiler.Traverser(tree);
visitors.forEach(function (visitor) {
traverser.addVisitor(visitor);
});
var componentTree = traverser.traverse();
return componentTree;
}
function genClient(schema) {
var resolvers = schema.resolvers,
connector = schema.connector,
graphqlClient = schema.graphqlClient;
var options = {
schema: schema.schema
};
if (connector) {
if ((0, _lodash.isPlainObject)(connector)) {
if (!(0, _lodash.isEmpty)(connector)) {
options.connectors = connector;
}
} else {
options.connector = connector;
}
}
if (graphqlClient) {
if ((0, _lodash.isPlainObject)(graphqlClient)) {
if (!(0, _lodash.isEmpty)(connector)) {
options.graphqlClients = graphqlClient;
}
} else {
options.graphqlClient = graphqlClient;
}
}
if ((0, _lodash.isEmpty)(connector) && (0, _lodash.isEmpty)(graphqlClient)) {
options.connector = new _cannerGraphqlInterface.MemoryConnector({
defaultData: (0, _cannerHelpers.createFakeData)(schema.schema, 10)
});
}
if (!(0, _lodash.isEmpty)(resolvers)) {
options.resolvers = resolvers;
}
return (0, _cannerGraphqlInterface.createClient)(options);
}
function defaultErrorHandler(e) {
return _notification2.default.error({
message: e.message,
placement: 'bottomRight'
});
}
var _default = CannerCMS;
exports.default = _default;