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
Feat/typescript #2
base: master
Are you sure you want to change the base?
Conversation
d2e1073
to
2af4b40
Compare
return hook !== undefined; | ||
}) as [Hook, Hook][][]; | ||
const edges = [...edges_after, ...edges_before].flat(0); | ||
return toposort.array(mergedHooks, edges).map((hook) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@wdavidw maybe you could help with this part ? I can't get the edges
type right.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I totally suck in Typescript, I had a look at it but no idea.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand that it can be intimidating if your not used to the syntax, but what I'm asking is actually quite "simple" and doesn't require to fully understand typescript. You can approach it as any pseudo type language (like the one you wrote in the readme for the parameters types).
You can also pull the PR locally to get some hints from your editor and eslint.
In fact I'm not sure if there is an issue with the typings, if I understood your code correctly, or if there is a bug in the original code.
Could you at least check lines L338 and L342 and tell me if as [Hook, Hook][];
and as [Hook, Hook][][];
are supposed to be the correct return types of the map+filter sequences ?
TS is complaining of receiving in the edges
parameter (L369) a [Hook, Hook][][]
type while it expects a [Hook, Hook | undefined][]
one. What makes me think of an implementation issue is the additionnal []
array dimension that we have here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I did pull the changes and I confirm that I saw the TS error both in the CLI and in VSCode complaining about the [Hook, Hook][][]
and [Hook, Hook | undefined][]
. However, I didn't know how to read those 2 last hints. I can give it another try
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The as
keyword in as [Hook, Hook][]
for example, is a type cast, to indicate to TS what the hook.before.map(...).filter(...)
return type is supposed to be. Here I use it after the filter
because typescript is not able to infer that the resulting array doesn't contain any undefined
values anymore. If you hover the filter
keyword, you'll see what is the actual type TS is inferring ((Hook[] | undefined)[]
in this case).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On L367 we end up with a [Hook, Hook][][]
, which is correct in regards to the current implementation (please confirm), but we need a [Hook, Hook][]
, as toposort.array
expects. We should have one nesting level less.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I found a few things, tests are not passing but I got it to compile
- error.ts, line 2: remove
private
, error code is public - index.ts, line 368: depth
0
inarray_flatten
convert to depth1
inflat
:const edges = [...edges_after, ...edges_before].flat(1);
- index.ts, line 369: pass the
Hook
trait and returnhook
from mapreturn toposort.array<Hook>(mergedHooks, edges).map((hook) => { if (hook) { if ('require' in hook) delete hook.require; if ('plugin' in hook) delete hook.plugin; } return hook });
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you, I will have a look
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- index.ts, line 369: pass the
Hook
trait and returnhook
from mapreturn toposort.array<Hook>(mergedHooks, edges).map((hook) => { if (hook) { if ('require' in hook) delete hook.require; if ('plugin' in hook) delete hook.plugin; } return hook });
This is not required, typescript infers the Hook
type from arguments.
David, you should be able to fix and adapt the tests now. There is still some work at the typing level (some |
2f32308
to
83ddc5f
Compare
I'd like to hear your opinion about 2 things:
|
we can now define at initilization what type of args we expect for every registered plugin
There are 2 things I'd like to bring your attention to, in the last (and supposedly final) changes.
I couldn't run the tests but I imported the types in a library I'm developing. Everything works well so far. |
That's fine. My preference is no semicolons for personal projects, not settled for open source projects (csv packages are with semicolons), and single-quotes everywhere (coffeescript heritage).
I am hesitant about this, if a CI does it automatically, new extra commits will pollute the commit history.
I am not too familiar with ts generic but it seems like the way to go for dynamic/user types. Could you give me write access to your fork, this way I could add the tests directly in this working branch. I hope to have some time end of the week. |
There wouldn't be more commit pollution than there currently is. My suggestion is to totally remove the
You should already have write access. |
Hi @LucasDemea, could you please do a review of my commit 41cdf63 I am not too happy of my TS skills, here are a few notes:
|
I will have a look. Not sure I'll find the time this week though |
41cdf63
to
c4278ba
Compare
Hi @wdavidw, did you see my latest comments ? |
@LucasDemea I don't see any new comment. To me, the last comment is "I will have a look. Not sure I'll find the time this week though". Am I missing something ? |
export type HookHandler<T extends object> = ( | ||
args: T, | ||
handler?: HookHandler<T> | ||
) => null | void | HookHandler<T> | Promise<HookHandler<T>>; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should first agree on the HookHandler type because it has implications on many other parts. Does it look good to you ? Or should we broaden the return type to something more permissive ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
args
is currently of type T extends object
. But in your call_sync test, you pass an array. Maybe we should also broaden its type ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@wdavidw Let me know if you need some explanations about the typings
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@LucasDemea I don't see any new comment. To me, the last comment is "I will have a look. Not sure I'll find the time this week though". Am I missing something ?
My bad, my review was left pending ... 🤦
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @LucasDemea. args
could be anything. The return value of the handler may also be anything. Honestly, TS always get me confused.
This looks promising! Seems to be before merging the PR I could publish the |
Please propose a definition file. There is still a lot of work pending to complete this PR and no time to do it. |
This PR adds typescript support.
Closes #1