@prisma-cms/front-editor
Version:
240 lines • 10 kB
JavaScript
;
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjectView = exports.ObjectsView = void 0;
const react_1 = __importDefault(require("react"));
const prop_types_1 = __importDefault(require("prop-types"));
const context_1 = __importDefault(require("@prisma-cms/context"));
// import { graphql } from 'react-apollo';
const graphql_tag_1 = __importDefault(require("graphql-tag"));
const graphql_1 = require("graphql");
const client_1 = require("@apollo/client");
class Viewer extends react_1.default.PureComponent {
constructor() {
super(...arguments);
this.state = {};
}
UNSAFE_componentWillMount() {
const { query, parentQuery, ConnectorContext, fetchPolicy } = this.props;
let Query;
/**
* queryName используется в фильтрах
*/
let queryName;
if (query) {
queryName = query;
const { query: { [query]: apiQuery }, } = this.context;
Query = apiQuery;
}
else if (parentQuery) {
Query = parentQuery;
// Получаем название операции из готового запроса
queryName = this.getQueryNameFromQuery(parentQuery);
}
if (Query) {
Query = this.extendQuery(Query);
// this.Renderer = graphql(gql(Query), {
// options: {
// client,
// fetchPolicy,
// },
// })(props => {
// const {
// children,
// ...other
// } = props;
// return <ConnectorContext.Consumer>
// {context => <ConnectorContext.Provider
// value={{
// ...context,
// ...other,
// }}
// >
// {children}
// </ConnectorContext.Provider>}
// </ConnectorContext.Consumer>;
// });
const Renderer = (props) => {
const { children } = props, other = __rest(props, ["children"]);
const result = client_1.useQuery(graphql_tag_1.default(Query), {
fetchPolicy,
});
return (react_1.default.createElement(ConnectorContext.Consumer, null, (context) => (react_1.default.createElement(ConnectorContext.Provider, { value: Object.assign(Object.assign(Object.assign({}, context), other), result) }, children))));
};
this.Renderer = Renderer;
Object.assign(this.state, {
queryName,
});
}
}
/**
* Расширяем запрос
*/
extendQuery(Query) {
const { schema } = this.context;
if (Query && schema) {
/**
* Проходим запрос на предмет директив в фрагментах
*/
const parsedQuery = graphql_1.parse(Query);
if (parsedQuery && schema) {
const { types } = schema;
const { definitions } = parsedQuery;
if (definitions && definitions.length) {
definitions.reduceRight((current, definition) => {
const { kind, directives,
// loc: {
// start,
// end,
// source: {
// body,
// },
// },
selectionSet: { loc: { start, end, source: { body }, }, }, typeCondition, } = definition;
if (kind === 'FragmentDefinition' && typeCondition) {
const needAutoloadFields = directives &&
directives.find((n) => n && n.name && n.name.value === 'prismaCmsFragmentAllFields')
? true
: false;
if (needAutoloadFields) {
const {
// kind,
name: { value: type }, } = typeCondition;
/**
* Если указана автоподгрузка типов и получен тип, то получаем все скалярные поля для этого типа
*/
body.slice(start, end);
if (type) {
const field = types.find((n) => {
const { kind, name } = n;
return kind === 'OBJECT' && name === type;
});
if (field) {
let { fields } = field;
fields = fields.filter((n) => {
return n && n.name && this.isScalar(n) ? true : false;
});
/**
* Если были получены скалярные поля,
* добавляем их в запрос
*/
if (fields.length) {
const fieldsList = '\n' + fields.map(({ name }) => name).join('\n') + '\n';
const position = end - 1;
Query = [
Query.slice(0, position),
fieldsList,
Query.slice(position),
].join('');
}
}
}
}
}
return current;
}, []);
}
}
}
return Query;
}
isScalar(field) {
const { type: { kind, ofType }, } = field;
if (kind === 'SCALAR') {
return true;
}
else if (kind === 'ENUM') {
return true;
}
else if ((kind === 'NON_NULL' || kind === 'LIST') && ofType) {
return this.isScalar({
type: ofType,
});
}
else {
return false;
}
}
getQueryNameFromQuery(query) {
const parsedSchema = graphql_1.parse(query);
if (parsedSchema) {
const { definitions } = parsedSchema;
if (definitions) {
const OperationDefinition = definitions.find((n) => n.kind === 'OperationDefinition');
if (OperationDefinition) {
const { value } = OperationDefinition.name || {};
return value;
}
}
}
}
}
Viewer.propTypes = {
query: prop_types_1.default.string,
parentQuery: prop_types_1.default.string,
ConnectorContext: prop_types_1.default.object.isRequired,
fetchPolicy: prop_types_1.default.oneOf([
'cache-first',
'cache-and-network',
'network-only',
'cache-only',
'no-cache',
]),
};
Viewer.contextType = context_1.default;
/**
* For Objects connector
*/
class ObjectsView extends Viewer {
render() {
const _a = this.props, { query, children, first, pagevariable: pageVariable = 'page', ConnectorContext } = _a, other = __rest(_a, ["query", "children", "first", "pagevariable", "ConnectorContext"]);
const { Renderer } = this;
const { queryName } = this.state;
const { uri } = this.context;
let { [pageVariable]: page } = uri.query(true);
page = parseInt(page) || 0;
const skip = page ? (page - 1) * first : 0;
// return "Sdfdsf";
return (react_1.default.createElement(ConnectorContext.Provider, { value: {
query,
queryName,
pageVariable,
} }, Renderer ? (react_1.default.createElement(Renderer, Object.assign({ page: page, skip: skip, first: first }, other), children)) : (children)));
}
}
exports.ObjectsView = ObjectsView;
/**
* For Object connector
*/
class ObjectView extends Viewer {
render() {
const _a = this.props, { query, children, ConnectorContext } = _a, other = __rest(_a, ["query", "children", "ConnectorContext"]);
const { Renderer } = this;
const { queryName } = this.state;
return (react_1.default.createElement(ConnectorContext.Provider, { value: {
query,
queryName,
// pageVariable,
} }, Renderer ? (react_1.default.createElement(Renderer
// page={page}
// skip={skip}
// first={first}
, Object.assign({}, other), children)) : (children)));
}
}
exports.ObjectView = ObjectView;
exports.default = Viewer;
//# sourceMappingURL=index.js.map