arkormx 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3362,9 +3362,34 @@ var Relation = class {
3362
3362
  getRelatedModel() {
3363
3363
  return this.related;
3364
3364
  }
3365
+ getRelatedModelConstructor() {
3366
+ return this.related;
3367
+ }
3365
3368
  createRelationTableLoader() {
3366
3369
  return new RelationTableLoader(this.getRelationAdapter());
3367
3370
  }
3371
+ getCreationAttributes() {
3372
+ return {};
3373
+ }
3374
+ mergeCreationAttributes(attributes = {}) {
3375
+ return {
3376
+ ...attributes,
3377
+ ...this.getCreationAttributes()
3378
+ };
3379
+ }
3380
+ applyCreationAttributesToModel(model) {
3381
+ const attributes = this.getCreationAttributes();
3382
+ const fillable = model;
3383
+ if (Object.keys(attributes).length === 0) return model;
3384
+ if (typeof fillable.fill === "function") {
3385
+ fillable.fill(attributes);
3386
+ return model;
3387
+ }
3388
+ if (typeof fillable.setAttribute === "function") Object.entries(attributes).forEach(([key, value]) => {
3389
+ fillable.setAttribute?.(key, value);
3390
+ });
3391
+ return model;
3392
+ }
3368
3393
  /**
3369
3394
  * Apply a constraint to the relationship query.
3370
3395
  *
@@ -3560,6 +3585,30 @@ var Relation = class {
3560
3585
  return results;
3561
3586
  }
3562
3587
  /**
3588
+ * Execute the relationship query and return the first related model or throw an error if not found.
3589
+ *
3590
+ * @returns
3591
+ */
3592
+ async firstOrFail() {
3593
+ return (await this.getQuery()).firstOrFail();
3594
+ }
3595
+ /**
3596
+ * Execute the relationship query and return the first related model or the result of
3597
+ * the callback if not found.
3598
+ *
3599
+ * @param callback
3600
+ * @returns
3601
+ */
3602
+ async firstOr(callback) {
3603
+ const result = await this.first();
3604
+ if (result) return result;
3605
+ return callback();
3606
+ }
3607
+ async firstWhere(key, operatorOrValue, maybeValue) {
3608
+ const query = await this.getQuery();
3609
+ return maybeValue === void 0 ? query.firstWhere(key, operatorOrValue) : query.firstWhere(key, operatorOrValue, maybeValue);
3610
+ }
3611
+ /**
3563
3612
  * Count records that match the relationship query.
3564
3613
  *
3565
3614
  * @returns
@@ -3583,6 +3632,207 @@ var Relation = class {
3583
3632
  async doesntExist() {
3584
3633
  return !await this.exists();
3585
3634
  }
3635
+ /**
3636
+ * Create a new instance of the related model with the given attributes and
3637
+ * relationship creation attributes applied, but do not save it.
3638
+ *
3639
+ * @param attributes
3640
+ * @returns
3641
+ */
3642
+ make(attributes = {}) {
3643
+ return this.getRelatedModelConstructor().hydrate(this.mergeCreationAttributes(attributes));
3644
+ }
3645
+ /**
3646
+ * Create new instances of the related model with the given attributes and relationship
3647
+ * creation attributes applied, but do not save them.
3648
+ *
3649
+ * @param attributes
3650
+ * @returns
3651
+ */
3652
+ makeMany(attributes = []) {
3653
+ return attributes.map((item) => this.make(item));
3654
+ }
3655
+ /**
3656
+ * Create a new instance of the related model with the given attributes and relationship
3657
+ * creation attributes applied, and save it to the database.
3658
+ *
3659
+ * @param attributes
3660
+ * @returns
3661
+ */
3662
+ async create(attributes = {}) {
3663
+ return await this.getRelatedModelConstructor().query().create(this.mergeCreationAttributes(attributes));
3664
+ }
3665
+ /**
3666
+ * Create new instances of the related model with the given attributes and relationship
3667
+ * creation attributes applied, and save them to the database.
3668
+ *
3669
+ * @param values
3670
+ * @returns
3671
+ */
3672
+ async createMany(values = []) {
3673
+ if (values.length === 0) return [];
3674
+ return await Promise.all(values.map(async (value) => await this.create(value)));
3675
+ }
3676
+ /**
3677
+ * Save the given model instance by applying relationship creation attributes and calling save() on it.
3678
+ *
3679
+ * @param model
3680
+ * @returns
3681
+ */
3682
+ async save(model) {
3683
+ const saveable = this.applyCreationAttributesToModel(model);
3684
+ if (typeof saveable.save !== "function") throw new UnsupportedAdapterFeatureException("Related model does not support save().", { operation: "relation.save" });
3685
+ try {
3686
+ return await saveable.save();
3687
+ } catch (error) {
3688
+ if (!this.shouldCreateAfterSaveMiss(error)) throw error;
3689
+ const attributes = typeof saveable.getRawAttributes === "function" ? saveable.getRawAttributes() : {};
3690
+ return await this.create(attributes);
3691
+ }
3692
+ }
3693
+ /**
3694
+ * Save the given model instance by applying relationship creation attributes and
3695
+ * calling saveQuietly() on it if supported, otherwise falling back to save().
3696
+ *
3697
+ * @param model
3698
+ * @returns
3699
+ */
3700
+ async saveQuietly(model) {
3701
+ const saveable = this.applyCreationAttributesToModel(model);
3702
+ if (typeof saveable.saveQuietly === "function") try {
3703
+ return await saveable.saveQuietly();
3704
+ } catch (error) {
3705
+ if (!this.shouldCreateAfterSaveMiss(error)) throw error;
3706
+ const attributes = typeof saveable.getRawAttributes === "function" ? saveable.getRawAttributes() : {};
3707
+ return await this.create(attributes);
3708
+ }
3709
+ if (typeof saveable.save === "function") return await saveable.save();
3710
+ throw new UnsupportedAdapterFeatureException("Related model does not support saveQuietly().", { operation: "relation.saveQuietly" });
3711
+ }
3712
+ shouldCreateAfterSaveMiss(error) {
3713
+ return error instanceof Error && (error.name === "ModelNotFoundException" || error.message.includes("Record not found"));
3714
+ }
3715
+ /**
3716
+ * Create new instances of the related model with the given attributes and
3717
+ * relationship * creation attributes applied, and save them to the database.
3718
+ *
3719
+ * @param models
3720
+ * @returns
3721
+ */
3722
+ async saveMany(models = []) {
3723
+ return await Promise.all(models.map(async (model) => await this.save(model)));
3724
+ }
3725
+ /**
3726
+ * Create new instances of the related model with the given attributes and relationship
3727
+ * creation attributes applied, and save them to the database.
3728
+ *
3729
+ * @param models
3730
+ * @returns
3731
+ */
3732
+ async saveManyQuietly(models = []) {
3733
+ return await Promise.all(models.map(async (model) => await this.saveQuietly(model)));
3734
+ }
3735
+ async find(value, key) {
3736
+ return (await this.getQuery()).find(value, key);
3737
+ }
3738
+ async findMany(values, key) {
3739
+ const related = this.getRelatedModelConstructor();
3740
+ const resolvedKey = key ?? related.getPrimaryKey();
3741
+ return (await this.getQuery()).where({ [resolvedKey]: { in: values } }).get();
3742
+ }
3743
+ async findOr(value, keyOrCallback, maybeCallback) {
3744
+ const query = await this.getQuery();
3745
+ return typeof keyOrCallback === "function" ? query.findOr(value, keyOrCallback) : query.findOr(value, keyOrCallback, maybeCallback);
3746
+ }
3747
+ async findOrFail(value, key) {
3748
+ const found = await this.find(value, key);
3749
+ if (found) return found;
3750
+ return (await this.getQuery()).where({ [key ?? this.getRelatedModelConstructor().getPrimaryKey()]: value }).firstOrFail();
3751
+ }
3752
+ /**
3753
+ * Find the first related model by a specific key and value, or create a new instance if not found.
3754
+ *
3755
+ * @param attributes
3756
+ * @param values
3757
+ * @returns
3758
+ */
3759
+ async firstOrNew(attributes, values = {}) {
3760
+ const found = await (await this.getQuery()).clone().where(attributes).first();
3761
+ if (found) return found;
3762
+ return this.make({
3763
+ ...attributes,
3764
+ ...values
3765
+ });
3766
+ }
3767
+ /**
3768
+ * Find the first related model by a specific key and value, or create and save a new instance
3769
+ * if not found.
3770
+ *
3771
+ * @param attributes
3772
+ * @param values
3773
+ * @returns
3774
+ */
3775
+ async firstOrCreate(attributes, values = {}) {
3776
+ const found = await (await this.getQuery()).clone().where(attributes).first();
3777
+ if (found) return found;
3778
+ return await this.create({
3779
+ ...attributes,
3780
+ ...values
3781
+ });
3782
+ }
3783
+ /**
3784
+ * Find the first related model by a specific key and value, update the first matching record with
3785
+ * the given values, or create and save a new instance if no matching record is found.
3786
+ *
3787
+ * @param attributes
3788
+ * @param values
3789
+ * @returns
3790
+ */
3791
+ async updateOrCreate(attributes, values = {}) {
3792
+ const query = await this.getQuery();
3793
+ const found = await query.clone().where(attributes).first();
3794
+ if (!found) return await this.create({
3795
+ ...attributes,
3796
+ ...values
3797
+ });
3798
+ const updatable = found;
3799
+ if (typeof updatable.fill === "function" && typeof updatable.save === "function") return await updatable.fill(values).save();
3800
+ return await query.clone().where(attributes).update(values);
3801
+ }
3802
+ /**
3803
+ * Find related models by specific attributes, update matching records with the given values, or
3804
+ * create and save new instances if no matching records are found.
3805
+ *
3806
+ * @param values
3807
+ * @param uniqueBy
3808
+ * @param update
3809
+ * @returns
3810
+ */
3811
+ async upsert(values, uniqueBy, update = null) {
3812
+ return await (await this.getQuery()).upsert(values.map((value) => this.mergeCreationAttributes(value)), uniqueBy, update);
3813
+ }
3814
+ /**
3815
+ * Paginate the relationship query results.
3816
+ *
3817
+ * @param perPage
3818
+ * @param page
3819
+ * @param options
3820
+ * @returns
3821
+ */
3822
+ async paginate(perPage = 15, page, options = {}) {
3823
+ return (await this.getQuery()).paginate(perPage, page, options);
3824
+ }
3825
+ /**
3826
+ * Paginate the relationship query results without total count optimization.
3827
+ *
3828
+ * @param perPage
3829
+ * @param page
3830
+ * @param options
3831
+ * @returns
3832
+ */
3833
+ async simplePaginate(perPage = 15, page, options = {}) {
3834
+ return (await this.getQuery()).simplePaginate(perPage, page, options);
3835
+ }
3586
3836
  };
3587
3837
 
3588
3838
  //#endregion
@@ -3771,9 +4021,14 @@ var BelongsToManyRelation = class BelongsToManyRelation extends Relation {
3771
4021
  };
3772
4022
  }
3773
4023
  buildPivotTarget() {
4024
+ const metadata = getPersistedTableMetadata(this.throughTable, {
4025
+ features: resolvePersistedMetadataFeatures(getUserConfig("features")),
4026
+ strict: true
4027
+ });
3774
4028
  return {
3775
4029
  table: this.throughTable,
3776
- primaryKey: this.relatedPivotKey
4030
+ primaryKey: this.relatedPivotKey,
4031
+ columns: metadata.columns
3777
4032
  };
3778
4033
  }
3779
4034
  buildRelatedPivotCondition(relatedValues) {
@@ -4269,6 +4524,9 @@ var HasManyRelation = class extends Relation {
4269
4524
  const localValue = this.parent.getAttribute(this.localKey);
4270
4525
  return this.applyConstraint(this.related.query().where({ [this.foreignKey]: localValue }));
4271
4526
  }
4527
+ getCreationAttributes() {
4528
+ return { [this.foreignKey]: this.parent.getAttribute(this.localKey) };
4529
+ }
4272
4530
  getMetadata() {
4273
4531
  return {
4274
4532
  type: "hasMany",
@@ -4372,6 +4630,9 @@ var HasOneRelation = class extends SingleResultRelation {
4372
4630
  const localValue = this.parent.getAttribute(this.localKey);
4373
4631
  return this.applyConstraint(this.related.query().where({ [this.foreignKey]: localValue }));
4374
4632
  }
4633
+ getCreationAttributes() {
4634
+ return { [this.foreignKey]: this.parent.getAttribute(this.localKey) };
4635
+ }
4375
4636
  getMetadata() {
4376
4637
  return {
4377
4638
  type: "hasOne",
@@ -4480,6 +4741,12 @@ var MorphManyRelation = class extends Relation {
4480
4741
  [`${this.morphName}Type`]: type
4481
4742
  }));
4482
4743
  }
4744
+ getCreationAttributes() {
4745
+ return {
4746
+ [`${this.morphName}Id`]: this.parent.getAttribute(this.localKey),
4747
+ [`${this.morphName}Type`]: this.parent.constructor.name
4748
+ };
4749
+ }
4483
4750
  getMetadata() {
4484
4751
  return {
4485
4752
  type: "morphMany",
@@ -4527,6 +4794,12 @@ var MorphOneRelation = class extends SingleResultRelation {
4527
4794
  [`${this.morphName}Type`]: type
4528
4795
  }));
4529
4796
  }
4797
+ getCreationAttributes() {
4798
+ return {
4799
+ [`${this.morphName}Id`]: this.parent.getAttribute(this.localKey),
4800
+ [`${this.morphName}Type`]: this.parent.constructor.name
4801
+ };
4802
+ }
4530
4803
  getMetadata() {
4531
4804
  return {
4532
4805
  type: "morphOne",
@@ -3334,9 +3334,34 @@ var Relation = class {
3334
3334
  getRelatedModel() {
3335
3335
  return this.related;
3336
3336
  }
3337
+ getRelatedModelConstructor() {
3338
+ return this.related;
3339
+ }
3337
3340
  createRelationTableLoader() {
3338
3341
  return new RelationTableLoader(this.getRelationAdapter());
3339
3342
  }
3343
+ getCreationAttributes() {
3344
+ return {};
3345
+ }
3346
+ mergeCreationAttributes(attributes = {}) {
3347
+ return {
3348
+ ...attributes,
3349
+ ...this.getCreationAttributes()
3350
+ };
3351
+ }
3352
+ applyCreationAttributesToModel(model) {
3353
+ const attributes = this.getCreationAttributes();
3354
+ const fillable = model;
3355
+ if (Object.keys(attributes).length === 0) return model;
3356
+ if (typeof fillable.fill === "function") {
3357
+ fillable.fill(attributes);
3358
+ return model;
3359
+ }
3360
+ if (typeof fillable.setAttribute === "function") Object.entries(attributes).forEach(([key, value]) => {
3361
+ fillable.setAttribute?.(key, value);
3362
+ });
3363
+ return model;
3364
+ }
3340
3365
  /**
3341
3366
  * Apply a constraint to the relationship query.
3342
3367
  *
@@ -3532,6 +3557,30 @@ var Relation = class {
3532
3557
  return results;
3533
3558
  }
3534
3559
  /**
3560
+ * Execute the relationship query and return the first related model or throw an error if not found.
3561
+ *
3562
+ * @returns
3563
+ */
3564
+ async firstOrFail() {
3565
+ return (await this.getQuery()).firstOrFail();
3566
+ }
3567
+ /**
3568
+ * Execute the relationship query and return the first related model or the result of
3569
+ * the callback if not found.
3570
+ *
3571
+ * @param callback
3572
+ * @returns
3573
+ */
3574
+ async firstOr(callback) {
3575
+ const result = await this.first();
3576
+ if (result) return result;
3577
+ return callback();
3578
+ }
3579
+ async firstWhere(key, operatorOrValue, maybeValue) {
3580
+ const query = await this.getQuery();
3581
+ return maybeValue === void 0 ? query.firstWhere(key, operatorOrValue) : query.firstWhere(key, operatorOrValue, maybeValue);
3582
+ }
3583
+ /**
3535
3584
  * Count records that match the relationship query.
3536
3585
  *
3537
3586
  * @returns
@@ -3555,6 +3604,207 @@ var Relation = class {
3555
3604
  async doesntExist() {
3556
3605
  return !await this.exists();
3557
3606
  }
3607
+ /**
3608
+ * Create a new instance of the related model with the given attributes and
3609
+ * relationship creation attributes applied, but do not save it.
3610
+ *
3611
+ * @param attributes
3612
+ * @returns
3613
+ */
3614
+ make(attributes = {}) {
3615
+ return this.getRelatedModelConstructor().hydrate(this.mergeCreationAttributes(attributes));
3616
+ }
3617
+ /**
3618
+ * Create new instances of the related model with the given attributes and relationship
3619
+ * creation attributes applied, but do not save them.
3620
+ *
3621
+ * @param attributes
3622
+ * @returns
3623
+ */
3624
+ makeMany(attributes = []) {
3625
+ return attributes.map((item) => this.make(item));
3626
+ }
3627
+ /**
3628
+ * Create a new instance of the related model with the given attributes and relationship
3629
+ * creation attributes applied, and save it to the database.
3630
+ *
3631
+ * @param attributes
3632
+ * @returns
3633
+ */
3634
+ async create(attributes = {}) {
3635
+ return await this.getRelatedModelConstructor().query().create(this.mergeCreationAttributes(attributes));
3636
+ }
3637
+ /**
3638
+ * Create new instances of the related model with the given attributes and relationship
3639
+ * creation attributes applied, and save them to the database.
3640
+ *
3641
+ * @param values
3642
+ * @returns
3643
+ */
3644
+ async createMany(values = []) {
3645
+ if (values.length === 0) return [];
3646
+ return await Promise.all(values.map(async (value) => await this.create(value)));
3647
+ }
3648
+ /**
3649
+ * Save the given model instance by applying relationship creation attributes and calling save() on it.
3650
+ *
3651
+ * @param model
3652
+ * @returns
3653
+ */
3654
+ async save(model) {
3655
+ const saveable = this.applyCreationAttributesToModel(model);
3656
+ if (typeof saveable.save !== "function") throw new UnsupportedAdapterFeatureException("Related model does not support save().", { operation: "relation.save" });
3657
+ try {
3658
+ return await saveable.save();
3659
+ } catch (error) {
3660
+ if (!this.shouldCreateAfterSaveMiss(error)) throw error;
3661
+ const attributes = typeof saveable.getRawAttributes === "function" ? saveable.getRawAttributes() : {};
3662
+ return await this.create(attributes);
3663
+ }
3664
+ }
3665
+ /**
3666
+ * Save the given model instance by applying relationship creation attributes and
3667
+ * calling saveQuietly() on it if supported, otherwise falling back to save().
3668
+ *
3669
+ * @param model
3670
+ * @returns
3671
+ */
3672
+ async saveQuietly(model) {
3673
+ const saveable = this.applyCreationAttributesToModel(model);
3674
+ if (typeof saveable.saveQuietly === "function") try {
3675
+ return await saveable.saveQuietly();
3676
+ } catch (error) {
3677
+ if (!this.shouldCreateAfterSaveMiss(error)) throw error;
3678
+ const attributes = typeof saveable.getRawAttributes === "function" ? saveable.getRawAttributes() : {};
3679
+ return await this.create(attributes);
3680
+ }
3681
+ if (typeof saveable.save === "function") return await saveable.save();
3682
+ throw new UnsupportedAdapterFeatureException("Related model does not support saveQuietly().", { operation: "relation.saveQuietly" });
3683
+ }
3684
+ shouldCreateAfterSaveMiss(error) {
3685
+ return error instanceof Error && (error.name === "ModelNotFoundException" || error.message.includes("Record not found"));
3686
+ }
3687
+ /**
3688
+ * Create new instances of the related model with the given attributes and
3689
+ * relationship * creation attributes applied, and save them to the database.
3690
+ *
3691
+ * @param models
3692
+ * @returns
3693
+ */
3694
+ async saveMany(models = []) {
3695
+ return await Promise.all(models.map(async (model) => await this.save(model)));
3696
+ }
3697
+ /**
3698
+ * Create new instances of the related model with the given attributes and relationship
3699
+ * creation attributes applied, and save them to the database.
3700
+ *
3701
+ * @param models
3702
+ * @returns
3703
+ */
3704
+ async saveManyQuietly(models = []) {
3705
+ return await Promise.all(models.map(async (model) => await this.saveQuietly(model)));
3706
+ }
3707
+ async find(value, key) {
3708
+ return (await this.getQuery()).find(value, key);
3709
+ }
3710
+ async findMany(values, key) {
3711
+ const related = this.getRelatedModelConstructor();
3712
+ const resolvedKey = key ?? related.getPrimaryKey();
3713
+ return (await this.getQuery()).where({ [resolvedKey]: { in: values } }).get();
3714
+ }
3715
+ async findOr(value, keyOrCallback, maybeCallback) {
3716
+ const query = await this.getQuery();
3717
+ return typeof keyOrCallback === "function" ? query.findOr(value, keyOrCallback) : query.findOr(value, keyOrCallback, maybeCallback);
3718
+ }
3719
+ async findOrFail(value, key) {
3720
+ const found = await this.find(value, key);
3721
+ if (found) return found;
3722
+ return (await this.getQuery()).where({ [key ?? this.getRelatedModelConstructor().getPrimaryKey()]: value }).firstOrFail();
3723
+ }
3724
+ /**
3725
+ * Find the first related model by a specific key and value, or create a new instance if not found.
3726
+ *
3727
+ * @param attributes
3728
+ * @param values
3729
+ * @returns
3730
+ */
3731
+ async firstOrNew(attributes, values = {}) {
3732
+ const found = await (await this.getQuery()).clone().where(attributes).first();
3733
+ if (found) return found;
3734
+ return this.make({
3735
+ ...attributes,
3736
+ ...values
3737
+ });
3738
+ }
3739
+ /**
3740
+ * Find the first related model by a specific key and value, or create and save a new instance
3741
+ * if not found.
3742
+ *
3743
+ * @param attributes
3744
+ * @param values
3745
+ * @returns
3746
+ */
3747
+ async firstOrCreate(attributes, values = {}) {
3748
+ const found = await (await this.getQuery()).clone().where(attributes).first();
3749
+ if (found) return found;
3750
+ return await this.create({
3751
+ ...attributes,
3752
+ ...values
3753
+ });
3754
+ }
3755
+ /**
3756
+ * Find the first related model by a specific key and value, update the first matching record with
3757
+ * the given values, or create and save a new instance if no matching record is found.
3758
+ *
3759
+ * @param attributes
3760
+ * @param values
3761
+ * @returns
3762
+ */
3763
+ async updateOrCreate(attributes, values = {}) {
3764
+ const query = await this.getQuery();
3765
+ const found = await query.clone().where(attributes).first();
3766
+ if (!found) return await this.create({
3767
+ ...attributes,
3768
+ ...values
3769
+ });
3770
+ const updatable = found;
3771
+ if (typeof updatable.fill === "function" && typeof updatable.save === "function") return await updatable.fill(values).save();
3772
+ return await query.clone().where(attributes).update(values);
3773
+ }
3774
+ /**
3775
+ * Find related models by specific attributes, update matching records with the given values, or
3776
+ * create and save new instances if no matching records are found.
3777
+ *
3778
+ * @param values
3779
+ * @param uniqueBy
3780
+ * @param update
3781
+ * @returns
3782
+ */
3783
+ async upsert(values, uniqueBy, update = null) {
3784
+ return await (await this.getQuery()).upsert(values.map((value) => this.mergeCreationAttributes(value)), uniqueBy, update);
3785
+ }
3786
+ /**
3787
+ * Paginate the relationship query results.
3788
+ *
3789
+ * @param perPage
3790
+ * @param page
3791
+ * @param options
3792
+ * @returns
3793
+ */
3794
+ async paginate(perPage = 15, page, options = {}) {
3795
+ return (await this.getQuery()).paginate(perPage, page, options);
3796
+ }
3797
+ /**
3798
+ * Paginate the relationship query results without total count optimization.
3799
+ *
3800
+ * @param perPage
3801
+ * @param page
3802
+ * @param options
3803
+ * @returns
3804
+ */
3805
+ async simplePaginate(perPage = 15, page, options = {}) {
3806
+ return (await this.getQuery()).simplePaginate(perPage, page, options);
3807
+ }
3558
3808
  };
3559
3809
 
3560
3810
  //#endregion
@@ -3743,9 +3993,14 @@ var BelongsToManyRelation = class BelongsToManyRelation extends Relation {
3743
3993
  };
3744
3994
  }
3745
3995
  buildPivotTarget() {
3996
+ const metadata = getPersistedTableMetadata(this.throughTable, {
3997
+ features: resolvePersistedMetadataFeatures(getUserConfig("features")),
3998
+ strict: true
3999
+ });
3746
4000
  return {
3747
4001
  table: this.throughTable,
3748
- primaryKey: this.relatedPivotKey
4002
+ primaryKey: this.relatedPivotKey,
4003
+ columns: metadata.columns
3749
4004
  };
3750
4005
  }
3751
4006
  buildRelatedPivotCondition(relatedValues) {
@@ -4241,6 +4496,9 @@ var HasManyRelation = class extends Relation {
4241
4496
  const localValue = this.parent.getAttribute(this.localKey);
4242
4497
  return this.applyConstraint(this.related.query().where({ [this.foreignKey]: localValue }));
4243
4498
  }
4499
+ getCreationAttributes() {
4500
+ return { [this.foreignKey]: this.parent.getAttribute(this.localKey) };
4501
+ }
4244
4502
  getMetadata() {
4245
4503
  return {
4246
4504
  type: "hasMany",
@@ -4344,6 +4602,9 @@ var HasOneRelation = class extends SingleResultRelation {
4344
4602
  const localValue = this.parent.getAttribute(this.localKey);
4345
4603
  return this.applyConstraint(this.related.query().where({ [this.foreignKey]: localValue }));
4346
4604
  }
4605
+ getCreationAttributes() {
4606
+ return { [this.foreignKey]: this.parent.getAttribute(this.localKey) };
4607
+ }
4347
4608
  getMetadata() {
4348
4609
  return {
4349
4610
  type: "hasOne",
@@ -4452,6 +4713,12 @@ var MorphManyRelation = class extends Relation {
4452
4713
  [`${this.morphName}Type`]: type
4453
4714
  }));
4454
4715
  }
4716
+ getCreationAttributes() {
4717
+ return {
4718
+ [`${this.morphName}Id`]: this.parent.getAttribute(this.localKey),
4719
+ [`${this.morphName}Type`]: this.parent.constructor.name
4720
+ };
4721
+ }
4455
4722
  getMetadata() {
4456
4723
  return {
4457
4724
  type: "morphMany",
@@ -4499,6 +4766,12 @@ var MorphOneRelation = class extends SingleResultRelation {
4499
4766
  [`${this.morphName}Type`]: type
4500
4767
  }));
4501
4768
  }
4769
+ getCreationAttributes() {
4770
+ return {
4771
+ [`${this.morphName}Id`]: this.parent.getAttribute(this.localKey),
4772
+ [`${this.morphName}Type`]: this.parent.constructor.name
4773
+ };
4774
+ }
4502
4775
  getMetadata() {
4503
4776
  return {
4504
4777
  type: "morphOne",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkormx",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "Modern TypeScript-first ORM for Node.js.",
5
5
  "keywords": [
6
6
  "orm",