New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix onDelete/onUpdate for ColumnBuilder #4656
fix onDelete/onUpdate for ColumnBuilder #4656
Conversation
@zeotuan Any thoughts? |
if we change the |
Now this is more close to knex js implementation, but this is kinda hack. |
@zeotuan can you check PR? |
@zeotuan Ping? |
I tried this code and got the same result as your @maximelkin. What is the advantage of your compared to this? type ReferencingColumnBuilder = {
[K in keyof ColumnBuilder]: (...args) => ReferencingColumnBuilder
} & {
inTable(tableName: string): ReferencingColumnBuilder;
deferrable(type: deferrableType): ReferencingColumnBuilder;
withKeyName(keyName: string): ReferencingColumnBuilder;
onDelete(command: string): ReferencingColumnBuilder;
onUpdate(command: string): ReferencingColumnBuilder;
}; Also if you believe your solution is better than the one above can you make it this way so it's easier to understand type ReferencingColumnBuilder = {
[K in keyof ColumnBuilder]: ColumnBuilder[K] extends (...args: infer TArgs) => any
? (...args: TArgs) => ReferencingColumnBuilder
: ColumnBuilder[K];
} & {
inTable(tableName: string): ReferencingColumnBuilder;
deferrable(type: deferrableType): ReferencingColumnBuilder;
withKeyName(keyName: string): ReferencingColumnBuilder;
onDelete(command: string): ReferencingColumnBuilder;
onUpdate(command: string): ReferencingColumnBuilder;
}; |
@zeotuan first variant erases args types |
@maximelkin You are right! What do you think about this one? // patched ColumnBuilder methods to return ReferencingColumnBuilder with new methods
// relies on ColumnBuilder returning only ColumnBuilder
type ReferencingColumnBuilder = {
[K in keyof ColumnBuilder]: (...arg: Parameters<ColumnBuilder[K]> ) => ReferencingColumnBuilder
} & {
inTable(tableName: string): ReferencingColumnBuilder;
deferrable(type: deferrableType): ReferencingColumnBuilder;
withKeyName(keyName: string): ReferencingColumnBuilder;
onDelete(command: string): ReferencingColumnBuilder;
onUpdate(command: string): ReferencingColumnBuilder;
}; |
@zeotuan this is nice, updated PR |
Co-authored-by: maximelkin <maxeljkin@gmail.com>
Co-authored-by: maximelkin <maxeljkin@gmail.com>
fixes #4620
This breaks wrong code, when onDelete/onUpdate called not in context of foreign constraints.
But also breaks valid code, i.e.:
(index() method return
ColumnBuilder
interface, notReferencingColumnBuilder
)This probably could be fixed with rewriting code to extending previous interface with new methods instead of current approach, idk is it worth it?
@lorefnon