@ember-data/record-data
Version:
Provides the default resource cache (RecordData) implementation for ember-data
68 lines (56 loc) • 1.81 kB
text/typescript
import type {
CollectionResourceRelationship,
Links,
Meta,
PaginationLinks,
} from '@ember-data/types/q/ember-data-json-api';
import type { StableRecordIdentifier } from '@ember-data/types/q/identifier';
import type { UpgradedMeta } from '../../graph/-edge-definition';
import type { RelationshipState } from '../../graph/-state';
import { createState } from '../../graph/-state';
export default class ManyRelationship {
declare definition: UpgradedMeta;
declare identifier: StableRecordIdentifier;
declare _state: RelationshipState | null;
declare transactionRef: number;
declare localMembers: Set<StableRecordIdentifier>;
declare remoteMembers: Set<StableRecordIdentifier>;
declare meta: Meta | null;
declare links: Links | PaginationLinks | null;
declare remoteState: StableRecordIdentifier[];
declare localState: StableRecordIdentifier[];
constructor(definition: UpgradedMeta, identifier: StableRecordIdentifier) {
this.definition = definition;
this.identifier = identifier;
this._state = null;
this.transactionRef = 0;
this.localMembers = new Set<StableRecordIdentifier>();
this.remoteMembers = new Set<StableRecordIdentifier>();
this.meta = null;
this.links = null;
// persisted state
this.remoteState = [];
// local client state
this.localState = [];
}
get state(): RelationshipState {
let { _state } = this;
if (!_state) {
_state = this._state = createState();
}
return _state;
}
getData(): CollectionResourceRelationship {
let payload: any = {};
if (this.state.hasReceivedData) {
payload.data = this.localState.slice();
}
if (this.links) {
payload.links = this.links;
}
if (this.meta) {
payload.meta = this.meta;
}
return payload;
}
}