UNPKG

@api-platform/client-generator

Version:

Generate apps built with Next, Nuxt, Quasar, React, React Native, Vue or Vuetify for any API documented using Hydra or OpenAPI

83 lines (67 loc) 2.32 kB
import { ENTRYPOINT } from '../config/entrypoint'; import { SubmissionError } from 'redux-form'; import get from 'lodash/get'; import has from 'lodash/has'; import mapValues from 'lodash/mapValues'; const MIME_TYPE = 'application/ld+json'; export function fetch(id, options = {}) { if ('undefined' === typeof options.headers) options.headers = new Headers(); if (null === options.headers.get('Accept')) options.headers.set('Accept', MIME_TYPE); if ( 'undefined' !== options.body && !(options.body instanceof FormData) && null === options.headers.get('Content-Type') ) options.headers.set('Content-Type', MIME_TYPE); return global.fetch(new URL(id, ENTRYPOINT), options).then(response => { if (response.ok) return response; return response.json().then( json => { const error = json['hydra:description'] || json['hydra:title'] || 'An error occurred.'; if (!json.violations) throw Error(error); let errors = { _error: error }; json.violations.forEach(violation => errors[violation.propertyPath] ? (errors[violation.propertyPath] += '\n' + errors[violation.propertyPath]) : (errors[violation.propertyPath] = violation.message) ); throw new SubmissionError(errors); }, () => { throw new Error(response.statusText || 'An error occurred.'); } ); }); } export function mercureSubscribe(url, topics) { topics.forEach(topic => url.searchParams.append('topic', new URL(topic, ENTRYPOINT)) ); return new EventSource(url.toString()); } export function normalize(data) { if (has(data, 'hydra:member')) { // Normalize items in collections data['hydra:member'] = data['hydra:member'].map(item => normalize(item)); return data; } // Flatten nested documents return mapValues(data, value => Array.isArray(value) ? value.map(v => get(v, '@id', v)) : get(value, '@id', value) ); } export function extractHubURL(response) { const linkHeader = response.headers.get('Link'); if (!linkHeader) return null; const matches = linkHeader.match( /<([^>]+)>;\s+rel=(?:mercure|"[^"]*mercure[^"]*")/ ); return matches && matches[1] ? new URL(matches[1], ENTRYPOINT) : null; }