Skip to content

Commit

Permalink
fix: fix circular inclusion
Browse files Browse the repository at this point in the history
  • Loading branch information
pviti authored Mar 12, 2024
1 parent 6bb2e88 commit 5f6d34a
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 48 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ typings/
# dotenv environment variables file
.env
.env.*
test/env/
test/env/*.*

# parcel-bundler cache (https://parceljs.org/)
.cache
Expand Down
99 changes: 57 additions & 42 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ const config = {
client: {
timeout: 15000,
requiredAttributes: ['organization', 'accessToken'],
},
jsonapi: {
maxResourceIncluded: 2
}
} as const

Expand Down
14 changes: 9 additions & 5 deletions src/jsonapi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { Value as JSONValue } from 'json-typescript'
import type { DocWithData, Included, ResourceIdentifierObject, ResourceObject as JSONAPIObject, AttributesObject, RelationshipsObject } from 'jsonapi-typescript'
import type { ResourceCreate, ResourceUpdate, ResourceId, ResourceType, Resource, ResourceRel } from './resource'
import { isResourceId, isResourceType } from './common'
import config from './config'

import Debug from './debug'
const debug = Debug('jsonapi')
Expand Down Expand Up @@ -41,7 +42,7 @@ const findIncluded = (rel: ResourceIdentifierObject, included: Included = []): J
}


const denormalizeResource = <T extends ResourceType>(res: any, included?: Included): T => {
const denormalizeResource = <T extends ResourceType>(res: any, included?: Included, chain: ResourceIdentifierObject[] = []): T => {

debug('denormalize resource: %O, %o', res, included || {})

Expand All @@ -54,13 +55,16 @@ const denormalizeResource = <T extends ResourceType>(res: any, included?: Includ
}

if (res.relationships) Object.keys(res.relationships as object).forEach(key => {
const rel = res.relationships[key].data as ResourceIdentifierObject
const rel: ResourceIdentifierObject = res.relationships[key].data
if (rel) {
if (Array.isArray(rel)) resource[key] = rel.map((r: ResourceIdentifierObject) => denormalizeResource<ResourceType>(findIncluded(r, included), included))
else resource[key] = denormalizeResource<ResourceType>(findIncluded(rel, included), included)
if (chain.filter(r => (r.id === rel.id) && (r.type === rel.type)).length >= config.jsonapi.maxResourceIncluded) resource[key] = rel
else {
if (Array.isArray(rel)) resource[key] = rel.map((r: ResourceIdentifierObject) => denormalizeResource<ResourceType>(findIncluded(r, included), included, [...chain, r]))
else resource[key] = denormalizeResource<ResourceType>(findIncluded(rel, included), included, [...chain, rel])
}
} else if (rel === null) resource[key] = null
})

debug('denormalized resource: %O', resource)

return resource
Expand Down

0 comments on commit 5f6d34a

Please sign in to comment.