node-interop icon indicating copy to clipboard operation
node-interop copied to clipboard

nnbd support

Open alextekartik opened this issue 3 years ago • 12 comments

Is there a plan to have support for nnbd for both the compilers and packages? Thanks!

alextekartik avatar Feb 19 '21 20:02 alextekartik

Part of the work has been done in https://github.com/pulyaevskiy/node-interop/pull/90

stof avatar Mar 17 '21 11:03 stof

What's the current status of this? Is there a way to use this with a dart 2.12 package?

Norbert515 avatar Apr 03 '21 18:04 Norbert515

Unfortunately that does not seem to be the case, I manage to use with dart 2.12 only by forcing the usage of non-nnbd packages (for example path: <1.8.0-0) and with the following option in build.yaml:

    dart2js_args:
      # Temp nnbd
      - --no-sound-null-safety

which means using packages that are not maintained anymore.

I still believe that this is a viable server side solution (and currently the only way to use dart in firebase functions and triggers).

alextekartik avatar Apr 09 '21 07:04 alextekartik

In the current state, build_node_compilers cannot correctly handle projects with mixed sound / unsound null-safety, probably due to use of older APIs.

I tried aligning it with the current stable build_web_compilers but quickly realized that the only practical difference for dart2js compiler is prepending node_preamble to the compiled output. By switching to build_web_compilers and prepending the preamble myself via a grinder task, I was able to remove the dependency on build_node_compilers altogether.

Given how quickly build_* packages evolve, I think there's a strong case for upstreaming that single difference and exposing it directly from build_web_compilers via an optional flag. Such change would greatly reduce maintenance burden for the node-interop project and improve the health of the ecosystem.

The story is slightly more complicated for DDC because build_node_compilers uses modified JS loaders.

/cc @pulyaevskiy @jakemac53

lexaknyazev avatar Apr 13 '21 09:04 lexaknyazev

@lexaknyazev Thanks for the info, I was indeed able to compile nnbd packages using your trick. I personally don't really care about ddc as I enforce the usage of dart2js and just build for running (at the end it has to run in firebase functions so I'm not up to here yet). I'm not sure though whether that will remain a long term solution (the dart team does not seem to have the bandwith/willingness to support node).

My build.yaml if it can help others:

targets:
  $default:
    sources:
      - "$package$"
      - "node/**"
      - "lib/**"
    builders:
      build_web_compilers|entrypoint:
        generate_for:
        - node/**
        options:
          # enforce dart2js compiler
          compiler: dart2js

And I can build using the following command:

pub run build_runner build --output=build/

I also have a small script that insert node preamble min js in the generated js file after building.

alextekartik avatar Apr 14 '21 16:04 alextekartik

node/** is included in the default set of build_runner_core sources, so the sources config section could be omitted in most cases.

lexaknyazev avatar Apr 14 '21 16:04 lexaknyazev

@lexaknyazev Thanks for the info, I was indeed able to compile nnbd packages using your trick. I personally don't really care about ddc as I enforce the usage of dart2js and just build for running (at the end it has to run in firebase functions so I'm not up to here yet). I'm not sure though whether that will remain a long term solution (the dart team does not seem to have the bandwith/willingness to support node).

My build.yaml if it can help others:

targets:
  $default:
    sources:
      - "$package$"
      - "node/**"
      - "lib/**"
    builders:
      build_web_compilers|entrypoint:
        generate_for:
        - node/**
        options:
          # enforce dart2js compiler
          compiler: dart2js

And I can build using the following command:

pub run build_runner build --output=build/

I also have a small script that insert node preamble min js in the generated js file after building.

@alextekartik, if this solution is still working for you, is there any way you can include the script you created with details on how you run it?

SupposedlySam avatar Jun 08 '21 19:06 SupposedlySam

@SupposedlySam I have an helper package that does the build and provides some common method for building here (build + adding preamble): https://github.com/tekartik/build_node.dart/tree/main/packages/build_node and a raw node example that uses this builder here: https://github.com/tekartik/build_node.dart/tree/main/packages/example/simple_example

alextekartik avatar Jun 09 '21 13:06 alextekartik

Thank you @alextekartik! It looks like the nodeBuild function from your helper package does all the heavy lifting of adding the preamble to all dart files. I'll give this a try!

SupposedlySam avatar Jun 09 '21 13:06 SupposedlySam

After updating my pubspec to use build_web_compilers: ^3.0.0 and using the build.yaml example you provided above, it looks like there may be some kind of configuration I'm still missing. Any direction with this error?

Skipping compiling functions|node/index.dart with dart2js because some of its
transitive libraries have sdk dependencies that are not supported on this platform:

node_io|lib/src/file.dart
node_io|lib/src/stdout.dart
node_io|lib/node_io.dart
node_io|lib/src/streams.dart
node_io|lib/src/link.dart
node_io|lib/src/http_server.dart
node_io|lib/src/directory.dart
node_io|lib/src/file_system.dart
node_io|lib/src/http_headers.dart
node_io|lib/src/network_interface.dart
node_io|lib/src/internet_address.dart
node_io|lib/src/file_system_entity.dart
file|lib/src/io.dart

SupposedlySam avatar Jun 21 '21 20:06 SupposedlySam

@SupposedlySam Are you using node_io: ^2.1.0 ?

dart pub upgrade
dart pub outdated --mode=null-safety

should help you find what is wrong

alextekartik avatar Jun 26 '21 07:06 alextekartik

@SupposedlySam I updated this flag to be false and it seems to have worked (after a few more tweaks) https://github.com/dart-lang/build/blob/3620bd127b74c305a53989595175b6e6f83ea9e0/build_web_compilers/lib/src/dart2js_bootstrap.dart#L54

dannnnthemannnn avatar Jul 19 '21 03:07 dannnnthemannnn