Open shahryarjb opened 4 days ago
I think if it comes into ash-project org and collaborate, would be good; or even on igniter as core optional installing
Agreed :) Still in the early stages of discovery.
I'm happy to work on a Rustler integration if needed.
There is some discussion in the igniter discord channel on the rustler side of things. Would be a wonderful to have more eyes and hands on it
@jimsynz : Currently I am expanding on ideas on the best way forward to integrate js parser and ast manipulator from elixir.
Here is one approach I have decided to take (unless there are unknown unknowns):
the oxc crate has oxc_parser
for parsing js to ast and oxc_ast
for ast manipulation.
If we can bind to oxc_ast
from elixir, we can get a well maintained + production ready js ast manipulator.
I imagine writing one JS AST manipulator in elixir would be possible, but keeping it upto date would be a hassle.
So, the plan is to have ast in rust. Reference that AST struct from elixir. manipulate that ast in js using oxc_ast
and give the bindings from elixir.
This is the 4 step plan (rough direction) as suggested by @zachdaniel
Create a custom Rewrite.Source for js that behaves like the Ex Rewrite source behaves.
Create a Zipper data structure for traversing and manipulating AST (this is complicated, I barely understand the Sourceror.Zipper 😆 )
Start the work of creating a library of functions to manipulate the zipper, which would be namespaced under something like Igniter.Js.Code.
figure out how we can make this available w/o requiring a dependency on rust. There are tools for doing prebuilt binaries, or we'd make it an optional thing that users have to opt into if they want to get js patches in addition to elixir patches.
Here is what I found about integration rust Struct and elixir
create a resource : basically, use Arc<Mutex>
expose an nif to take the reference to that resource and do something.
Here is what I found about integration rust Struct and elixir
- create a resource : basically, use
Arc<Mutex>
- expose an nif to take the reference to that resource and do something.
same pattern found here as well:
Arc<Mutex>
Here are more code references:
What is the general solution to #4 above? If we're going to invest a lot of time and energy into this via rustler, we need to have confidence that we can ship this to effectively any platform someone is developing on. The nice thing about pure elixir solutions is that we know they have elixir installed at a minimum 🤣
What is the general solution to #4 above? If we're going to invest a lot of time and energy into this via rustler, we need to have confidence that we can ship this to effectively any platform someone is developing on. The nice thing about pure elixir solutions is that we know they have elixir installed at a minimum 🤣
This seems to be the easier part.
With RustlerPrecompiled library, this is breeze.
Code change: https://github.com/TwistingTwists/crucible/blob/d686d940aa71c7213dd0ef2ec1b5af0da126988b/lib/native.ex#L6-L11
So, this is already done!! See assets which are precompiled binaries: https://github.com/TwistingTwists/crucible/actions/runs/11458278738 cc @zachdaniel
What is the general solution to #4 above? If we're going to invest a lot of time and energy into this via rustler, we need to have confidence that we can ship this to effectively any platform someone is developing on. The nice thing about pure elixir solutions is that we know they have elixir installed at a minimum 🤣
This seems to be the easier part.
With RustlerPrecompiled library, this is breeze.
Code change: https://github.com/TwistingTwists/crucible/blob/d686d940aa71c7213dd0ef2ec1b5af0da126988b/lib/native.ex#L6-L11
So, this is already done!! See assets which are precompiled binaries: https://github.com/TwistingTwists/crucible/actions/runs/11458278738 cc @zachdaniel
haven't added support for windows yet. or musl binaries. But this can be done. This is just the barebones apple and linux_x86 support for precompiled binaries.
Windows support will be a hard requirement FWIW
If we want igniter to be truly ubiquitous across the ecosystem, it has to run everywhere elixir runs.
There is a good news. Can compile for windows, apple and linux (x86 and arm!) woot! :partying_face:
Here: https://github.com/TwistingTwists/crucible/releases/tag/v0.1.1
Requirement
One feature that could significantly enhance Igniter's support for all basic requirements in Phoenix is a robust JavaScript parser or manipulator. Developing this from scratch would be a
large-scale
project, requiring considerable time and effort.Therefore, I suggest considering the Oxc project, which is implemented in Rust, as a potential solution.
Where we can use it:
Imagine you want to create a
Phoenix
component that requires aphx-hook
. You would need to modify theapp.js
file to inject the entire JavaScript file into theHook
object, or alternatively, create a separate JavaScript file, import it intoapp.js
, and then inject it into the hook.Currently, all of this is done manually in Elixir projects, which involves a lot of documentation and a complex process. This approach is not ideal and can discourage users from using it.
For example, take a look at this object that I injected using the JavaScript spread operator.
No I want to add
GetUserText
object.Thank you in advance
Refs