@ember-data/record-data
Version:
Provides the default RecordData implementation for ember-data
66 lines (54 loc) • 2.28 kB
text/typescript
import { upgradeForInternal } from '@ember-data/store/-private';
import BelongsToRelationship from './belongs-to';
import ManyRelationship from './has-many';
type CoreStore = import('@ember-data/store/-private/system/core-store').default;
type RecordDataStoreWrapper = import('@ember-data/store/-private').RecordDataStoreWrapper;
type RelationshipSchema = import('@ember-data/store/-private/ts-interfaces/record-data-schemas').RelationshipSchema;
type RelationshipRecordData = import('../../ts-interfaces/relationship-record-data').RelationshipRecordData;
function createRelationshipFor(
relationshipMeta: RelationshipSchema,
store: CoreStore,
recordData: RelationshipRecordData,
key: string
) {
let inverseKey = recordData.storeWrapper.inverseForRelationship(recordData.modelName, key);
let inverseIsAsync = recordData.storeWrapper.inverseIsAsyncForRelationship(recordData.modelName, key);
if (relationshipMeta.kind === 'hasMany') {
return new ManyRelationship(store, inverseKey, relationshipMeta, recordData, inverseIsAsync);
} else {
return new BelongsToRelationship(store, inverseKey, relationshipMeta, recordData, inverseIsAsync);
}
}
export default class Relationships {
_store: CoreStore;
_storeWrapper: RecordDataStoreWrapper;
initializedRelationships: {
[key: string]: BelongsToRelationship | ManyRelationship;
};
constructor(public recordData: RelationshipRecordData) {
this.initializedRelationships = Object.create(null);
this._storeWrapper = upgradeForInternal(recordData.storeWrapper);
this._store = this._storeWrapper._store;
}
has(key: string) {
return !!this.initializedRelationships[key];
}
forEach(cb) {
let rels = this.initializedRelationships;
Object.keys(rels).forEach(name => {
cb(name, rels[name]);
});
}
get(key: string) {
let relationships = this.initializedRelationships;
let relationship = relationships[key];
if (!relationship) {
let recordData = this.recordData;
let rel = this.recordData.storeWrapper.relationshipsDefinitionFor(this.recordData.modelName)[key];
if (rel) {
relationship = relationships[key] = createRelationshipFor(rel, this._store, recordData, key);
}
}
return relationship;
}
}