diff --git a/src/packages/database/constants.js b/src/packages/database/constants.js index d21357cf..b7d553c9 100644 --- a/src/packages/database/constants.js +++ b/src/packages/database/constants.js @@ -1,4 +1,7 @@ // @flow +import type { Model } from './index'; + +export const NEW_RECORDS: WeakSet = new WeakSet(); export const UNIQUE_CONSTRAINT = /UNIQUE\sCONSTRAINT/ig; export const VALID_DRIVERS = [ diff --git a/src/packages/database/model/index.js b/src/packages/database/model/index.js index bc4d3ff6..1f93eaac 100644 --- a/src/packages/database/model/index.js +++ b/src/packages/database/model/index.js @@ -1,6 +1,8 @@ // @flow import { pluralize } from 'inflection'; +import { NEW_RECORDS } from '../constants'; + import Query from '../query'; import { sql } from '../../logger'; import { saveRelationships } from '../relationship'; @@ -138,7 +140,7 @@ class Model { */ static relationshipNames: Array; - constructor(attrs: {} = {}, initialize: boolean = true) { + constructor(attrs: Object = {}, initialize: boolean = true) { const { constructor: { attributeNames, relationshipNames } } = this; Object.defineProperties(this, { @@ -185,13 +187,23 @@ class Model { Object.freeze(this); } + NEW_RECORDS.add(this); + return this; } + get isNew(): boolean { + return NEW_RECORDS.has(this); + } + get isDirty(): boolean { return Boolean(this.dirtyAttributes.size); } + get persisted(): boolean { + return !this.isNew && !this.isDirty; + } + static get hasOne(): Object { return Object.freeze({}); } @@ -354,6 +366,7 @@ class Model { await query; } + NEW_RECORDS.delete(this); this.dirtyAttributes.clear(); if (typeof afterUpdate === 'function') { @@ -498,6 +511,7 @@ class Model { }); Object.freeze(instance); + NEW_RECORDS.delete(instance); if (typeof afterCreate === 'function') { await afterCreate(instance); diff --git a/src/packages/database/query/utils/build-results.js b/src/packages/database/query/utils/build-results.js index 67856271..6c768265 100644 --- a/src/packages/database/query/utils/build-results.js +++ b/src/packages/database/query/utils/build-results.js @@ -1,6 +1,8 @@ // @flow import { camelize, singularize } from 'inflection'; +import { NEW_RECORDS } from '../../constants'; + import Model from '../../model'; import entries from '../../../../utils/entries'; @@ -124,6 +126,9 @@ export default async function buildResults({ }; }, {}); - return Reflect.construct(model, [record]); + const instance = Reflect.construct(model, [record]); + + NEW_RECORDS.delete(instance); + return instance; }); }