Skip to content

Commit 7a9b455

Browse files
committed
feat: support relation overwrite by passing --force flag
Signed-off-by: warisniz02 <warisniz02@gmail.com>
1 parent 0c7708d commit 7a9b455

8 files changed

Lines changed: 77 additions & 16 deletions

packages/cli/generators/relation/base-relation.generator.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ module.exports = class BaseRelationGenerator extends ArtifactGenerator {
9999
type: this._getRepositoryRelationPropertyType(),
100100
};
101101

102+
if (classDeclaration.getProperty(property.name)) return;
103+
102104
// already checked the existence of property before
103105
relationUtils.addProperty(classDeclaration, property);
104106
}

packages/cli/generators/relation/belongs-to-relation.generator.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ module.exports = class BelongsToRelationGenerator extends (
9595
);
9696
const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
9797
// this checks if the foreign key already exists, so the 2nd param should be foreignKeyName
98-
relationUtils.doesRelationExist(sourceClass, foreignKeyName);
98+
relationUtils.doesRelationExist(sourceClass, foreignKeyName, {
99+
force: this.options.force,
100+
});
99101

100102
const modelProperty = this.getBelongsTo(
101103
targetModel,

packages/cli/generators/relation/has-many-relation.generator.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ module.exports = class HasManyRelationGenerator extends BaseRelationGenerator {
9999
sourceModel,
100100
);
101101
const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
102-
relationUtils.doesRelationExist(sourceClass, relationName);
102+
relationUtils.doesRelationExist(sourceClass, relationName, {
103+
force: this.options.force,
104+
});
103105

104106
modelProperty = this.getHasMany(
105107
targetModel,
@@ -121,6 +123,20 @@ module.exports = class HasManyRelationGenerator extends BaseRelationGenerator {
121123
);
122124
const targetClass = relationUtils.getClassObj(targetFile, targetModel);
123125

126+
if (isForeignKeyExist) {
127+
const existingFK = targetClass.getProperty(foreignKeyName);
128+
if (
129+
existingFK &&
130+
!relationUtils.isValidPropertyType(targetClass, foreignKeyName, fktype)
131+
) {
132+
existingFK.remove();
133+
const newFK = relationUtils.addForeignKey(foreignKeyName, fktype);
134+
relationUtils.addProperty(targetClass, newFK);
135+
targetClass.formatText();
136+
await targetFile.save();
137+
}
138+
}
139+
124140
if (isForeignKeyExist) {
125141
if (
126142
!relationUtils.isValidPropertyType(targetClass, foreignKeyName, fktype)

packages/cli/generators/relation/has-many-through-relation.generator.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ module.exports = class HasManyThroughRelationGenerator extends (
133133
sourceModel,
134134
);
135135
const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
136-
relationUtils.doesRelationExist(sourceClass, relationName);
136+
relationUtils.doesRelationExist(sourceClass, relationName, {
137+
force: this.options.force,
138+
});
137139
// add the relation to the source model
138140
const isDefaultSourceKey = sourceKey === dftSourceKey;
139141
const isDefaultTargetKey = targetKey === dftTargetKey;

packages/cli/generators/relation/has-one-relation.generator.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ module.exports = class HasOneRelationGenerator extends BaseRelationGenerator {
9696
sourceModel,
9797
);
9898
const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
99-
relationUtils.doesRelationExist(sourceClass, relationName);
99+
relationUtils.doesRelationExist(sourceClass, relationName, {
100+
force: this.options.force,
101+
});
100102

101103
modelProperty = this.getHasOne(
102104
targetModel,
@@ -122,6 +124,20 @@ module.exports = class HasOneRelationGenerator extends BaseRelationGenerator {
122124
);
123125
const targetClass = relationUtils.getClassObj(targetFile, targetModel);
124126

127+
if (isForeignKeyExist) {
128+
const existingFK = targetClass.getProperty(foreignKeyName);
129+
if (
130+
existingFK &&
131+
!relationUtils.isValidPropertyType(targetClass, foreignKeyName, fktype)
132+
) {
133+
existingFK.remove();
134+
const newFK = relationUtils.addForeignKey(foreignKeyName, fktype);
135+
relationUtils.addProperty(targetClass, newFK);
136+
targetClass.formatText();
137+
await targetFile.save();
138+
}
139+
}
140+
125141
if (isForeignKeyExist) {
126142
if (
127143
!relationUtils.isValidPropertyType(targetClass, foreignKeyName, fktype)

packages/cli/generators/relation/index.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,11 @@ module.exports = class RelationGenerator extends ArtifactGenerator {
603603
this.artifactInfo.relationType === 'referencesMany')
604604
) {
605605
try {
606-
relationUtils.doesRelationExist(cl, this.artifactInfo.foreignKeyName);
606+
relationUtils.doesRelationExist(
607+
cl,
608+
this.artifactInfo.foreignKeyName,
609+
{force: this.options.force},
610+
);
607611
} catch (err) {
608612
/* istanbul ignore next */
609613
this.exit(err);
@@ -682,6 +686,19 @@ module.exports = class RelationGenerator extends ArtifactGenerator {
682686
? PROMPT_MESSAGE_RELATION_NAME
683687
: PROMPT_MESSAGE_PROPERTY_NAME;
684688

689+
if (!this.options.relationName)
690+
this.artifactInfo.relationName = this.artifactInfo.defaultRelationName;
691+
if (
692+
(this.artifactInfo.relationType === 'hasMany' ||
693+
this.artifactInfo.relationType === 'hasManyThrough') &&
694+
this.options.relationName &&
695+
!this.options.relationName.endsWith('s')
696+
) {
697+
this.artifactInfo.relationName = utils.pluralize(
698+
this.artifactInfo.relationName,
699+
);
700+
}
701+
685702
return this.prompt([
686703
{
687704
type: 'string',

packages/cli/generators/relation/references-many-relation.generator.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ module.exports = class ReferencesManyRelationGenerator extends (
4141
);
4242
const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
4343
// this checks if the foreign key already exists, so the 2nd param should be foreignKeyName
44-
relationUtils.doesRelationExist(sourceClass, foreignKeyName);
44+
relationUtils.doesRelationExist(sourceClass, foreignKeyName, {
45+
force: this.options.force,
46+
});
4547

4648
const modelProperty = this.getReferencesMany(
4749
targetModel,

packages/cli/generators/relation/utils.generator.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,22 +114,26 @@ exports.doesPropertyExist = function (classObj, propertyName) {
114114
.includes(propertyName);
115115
};
116116

117-
exports.doesRelationExist = function (classObj, propertyName) {
117+
exports.doesRelationExist = function (classObj, propertyName, options = {}) {
118+
const force = options.force;
118119
if (this.doesPropertyExist(classObj, propertyName)) {
119120
// If the property is decorated by `@property()`,
120121
// turn it to be a relational property decorated by `@belongsTo()`
121122
const decorators = classObj.getProperty(propertyName).getDecorators();
122123
const hasPropertyDecorator =
123124
decorators.length > 0 && decorators[0].getName() === 'property';
124-
// If it's already decorated by a relational decorator,
125-
// throw error
126-
if (!hasPropertyDecorator) {
127-
throw new Error(
128-
'relational property ' +
129-
propertyName +
130-
' already exist in the model ' +
131-
classObj.getName(),
132-
);
125+
if (!force) {
126+
// If it's already decorated by a relational decorator,
127+
// throw error
128+
if (!hasPropertyDecorator) {
129+
throw new Error(
130+
'relational property ' +
131+
propertyName +
132+
' already exist in the model ' +
133+
classObj.getName() +
134+
' Use --force to overwrite it',
135+
);
136+
}
133137
}
134138

135139
this.deleteProperty(classObj.getProperty(propertyName));

0 commit comments

Comments
 (0)