UNPKG

@spree/storefront-api-v2-sdk

Version:

Node module to easily integrate your JavaScript or TypeScript application with Spree API V2. You can create an entirely custom Storefront in JS/TS with this package including one page checkout, Single Page Apps, PWAs and so on

63 lines (50 loc) 1.98 kB
import type { JsonApiDocument, JsonApiResponse } from '../interfaces/JsonApi' import type { RelationType } from '../interfaces/Relationships' import { DocumentRelationshipError } from '../errors' const findDocument = <DocumentType extends JsonApiDocument>( spreeSuccessResponse: JsonApiResponse, relationType: RelationType ): DocumentType | null => { if (!spreeSuccessResponse.included) { return null } return ( (spreeSuccessResponse.included.find( (includedObject) => includedObject.type === relationType.type && includedObject.id === relationType.id ) as DocumentType) || null ) } const findRelationshipDocuments = <DocumentType extends JsonApiDocument>( spreeSuccessResponse: JsonApiResponse, sourceDocument: JsonApiDocument, relationshipName: string ): DocumentType[] => { if (!spreeSuccessResponse.included) { return [] } const oneOrManyDocumentReferences = (sourceDocument.relationships[relationshipName] || {}).data if (!oneOrManyDocumentReferences) { throw new DocumentRelationshipError(`Incorrect relationship ${relationshipName}.`) } let documentReferences: RelationType[] if (Array.isArray(oneOrManyDocumentReferences)) { documentReferences = oneOrManyDocumentReferences } else { documentReferences = [oneOrManyDocumentReferences] } return documentReferences .map<DocumentType>((relationType: RelationType) => findDocument<DocumentType>(spreeSuccessResponse, relationType)) .filter(Boolean) } const findSingleRelationshipDocument = <DocumentType extends JsonApiDocument>( spreeSuccessResponse: JsonApiResponse, sourceDocument: JsonApiDocument, relationshipName: string ): DocumentType | null => { const documents = findRelationshipDocuments<DocumentType>(spreeSuccessResponse, sourceDocument, relationshipName) if (documents.length === 0) { return null } return documents[0] } export { findDocument, findRelationshipDocuments, findSingleRelationshipDocument }