Skip to content

Conversation

t089
Copy link

@t089 t089 commented Oct 18, 2025

Currently swift package js only generates code for the "browser" platform.

This PR adds a --platform node|browser [default: browser] argument that lets you control this behaviour. In case of node it will generate a init function that calls defaultNodeSetup instead of defaultBrowserSetup.

t089 added 7 commits October 18, 2025 09:34
1. Fixed missing type export (platforms/node.d.ts)
   - Exported DefaultNodeSetupOptions type that is referenced in index.js

2. Updated index.d.ts to support both platforms
   - Made init() function accept DefaultNodeSetupOptions for node platform
   - Made init() function accept Options for browser platform

3. Fixed conditional compilation in node.js
   - Wrapped getImports() in HAS_IMPORTS conditional (platforms/node.js)
test both browser and node platform variants
/// Name of the package (default: lowercased Package.swift name)
var packageName: String?
/// Target platform for the generated JavaScript (default: browser)
var platform: String?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this become an enum Platform: CaseIterable, so then you would rely on .allCases to dynamically compute help string for all available platforms in the help output you've added below for this new option?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good! Will do

@MaxDesiatov
Copy link
Member

Please run ./Utilities/format.py for the formatting check to pass.

@MaxDesiatov MaxDesiatov added enhancement New feature or request dependencies Pull requests that update a dependency file labels Oct 20, 2025
@MaxDesiatov MaxDesiatov changed the title Draft: adds a --platform flag to js Draft: add --platform option to package js Oct 20, 2025
@MaxDesiatov MaxDesiatov changed the title Draft: add --platform option to package js Add --platform option to package js Oct 20, 2025
@MaxDesiatov
Copy link
Member

MaxDesiatov commented Oct 20, 2025

Thanks for the updates! Cleaned up the title:

  • "Draft" in the title is not needed, as "Draft" status of PRs already makes that clear.
  • We use infinitive form of verbs in PR and commit titles, as with character limit in this field non-infinitive forms don't bring any useful information.
  • --platform is not a flag, as flags denote binary state and don't take any parameters. E.g. --enable-platform/--disable-platform without any parameters would be a flag, but --platform node/--platform browser is an option. If we were able to use Swift Argument Parser in plugins, this would use the @Option property wrapper.

Copy link
Member

@kateinoigakukun kateinoigakukun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for putting your effort here! Overall it makes sense to me!

Let me leave a few feedbacks before mering:

  • I'd like to keep the generated JS package to be runtime independent as much as possible, so it might be better to name the option as --default-platform, indicating that only the default entrypoint index.js is platform dependent, and rest of the modules are still platform independent. The clarification would be partuculary helpful for library author publishing a platform-agnostic JS package containing the JSKit genrated code.
  • I'm not a big fan of adding @types/node dependency here because we use only small surface of Node.js API, and most of the usage is not visible from users (except for Worker type). I think we can loosen type checks in the Node.js for the sake of the simplicity.

If that sounds reasonable, I can make changes on the top of your branch and merge this PR :)

@t089
Copy link
Author

t089 commented Oct 21, 2025

Cool, yeah that seems reasonable, feel free to to change the patch accordingly! Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants