UNPKG

@prisma-cms/front-editor

Version:
240 lines 10 kB
"use strict"; 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