diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6b448d..2b94455 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: workspaces: src/rs_lib - name: build - run: deno task wasmbuild + run: deno task build - name: fmt run: deno fmt --check @@ -58,6 +58,6 @@ jobs: with: workspaces: src/rs_lib - name: build - run: deno task wasmbuild + run: deno task build - name: Publish to JSR on tag run: deno run -A jsr:@david/publish-on-tag@0.2.0 diff --git a/deno b/deno index d642f84..afe149e 160000 --- a/deno +++ b/deno @@ -1 +1 @@ -Subproject commit d642f84203a5d63470f575adcc7ad3139b49be80 +Subproject commit afe149e071b0af406f930d39841620940591e21d diff --git a/deno.json b/deno.json index 6874de9..0ed3c90 100644 --- a/deno.json +++ b/deno.json @@ -1,7 +1,7 @@ { "name": "@deno/loader", "tasks": { - "wasmbuild": "cd src/rs_lib && deno run -A jsr:@deno/wasmbuild@0.19.2 --out ../lib" + "build": "cd src/rs_lib && deno run -A jsr:@deno/wasmbuild@0.19.2 --out ../lib" }, "lint": { "rules": { diff --git a/src/mod.ts b/src/mod.ts index df30c24..ca25e4f 100644 --- a/src/mod.ts +++ b/src/mod.ts @@ -53,6 +53,11 @@ export interface WorkspaceOptions { configPath?: string; /** Node resolution conditions to use for resolving package.json exports. */ nodeConditions?: string[]; + /** + * Platform to bundle for. + * @default "node" + */ + platform?: "node" | "browser"; /** Whether to force using the cache. */ cachedOnly?: boolean; /** Enable debug logs. */ diff --git a/src/rs_lib/lib.rs b/src/rs_lib/lib.rs index ce1eaa9..1f5b634 100644 --- a/src/rs_lib/lib.rs +++ b/src/rs_lib/lib.rs @@ -121,6 +121,8 @@ pub struct DenoWorkspaceOptions { #[serde(default)] pub no_lock: Option, #[serde(default)] + pub platform: Option, + #[serde(default)] pub config_path: Option, #[serde(default)] pub node_conditions: Option>, @@ -162,8 +164,20 @@ impl DenoWorkspace { } fn new_inner(options: DenoWorkspaceOptions) -> Result { + fn resolve_is_browser_platform( + options: &DenoWorkspaceOptions, + ) -> Result { + Ok(match options.platform.as_deref() { + Some("node" | "deno") => false, + Some("browser") => true, + Some(value) => bail!("Unknown platform '{}'", value), + None => false, + }) + } + let sys = RealSys; let cwd = sys.env_current_dir()?; + let is_browser_platform = resolve_is_browser_platform(&options)?; let config_discovery = if options.no_config.unwrap_or_default() { ConfigDiscoveryOption::Disabled } else if let Some(config_path) = options.config_path { @@ -213,9 +227,8 @@ impl DenoWorkspace { unstable_sloppy_imports: true, npm_system_info: npm_system_info()?, node_resolver_options: NodeResolverOptions { - // todo: support these - prefer_browser_field: false, - bundle_mode: false, + is_browser_platform, + bundle_mode: true, conditions: NodeConditionOptions { conditions: options .node_conditions diff --git a/tests/platform_browser/main.test.ts b/tests/platform_browser/main.test.ts new file mode 100644 index 0000000..e2e4f1e --- /dev/null +++ b/tests/platform_browser/main.test.ts @@ -0,0 +1,27 @@ +import { ResolutionMode } from "@deno/loader"; +import { createLoader } from "../helpers.ts"; +import { assert } from "@std/assert"; + +Deno.test("resolves to browser locations", async () => { + const { loader } = await createLoader({ + configPath: import.meta.dirname + "/testdata/deno.json", + platform: "browser", + }, { + entrypoints: [], + }); + + assert( + loader.resolveSync( + "package", + import.meta.resolve("./testdata/main.js"), + ResolutionMode.Import, + ).endsWith("browser.js"), + ); + assert( + loader.resolveSync( + "browser-main", + import.meta.resolve("./testdata/main.js"), + ResolutionMode.Import, + ).endsWith("browser.js"), + ); +}); diff --git a/tests/platform_browser/testdata/deno.json b/tests/platform_browser/testdata/deno.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/tests/platform_browser/testdata/deno.json @@ -0,0 +1,2 @@ +{ +} diff --git a/tests/platform_browser/testdata/node_modules/browser-main/browser.js b/tests/platform_browser/testdata/node_modules/browser-main/browser.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/platform_browser/testdata/node_modules/browser-main/package.json b/tests/platform_browser/testdata/node_modules/browser-main/package.json new file mode 100644 index 0000000..870c6d4 --- /dev/null +++ b/tests/platform_browser/testdata/node_modules/browser-main/package.json @@ -0,0 +1,3 @@ +{ + "browser": "./browser.js" +} diff --git a/tests/platform_browser/testdata/node_modules/package/browser.js b/tests/platform_browser/testdata/node_modules/package/browser.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/platform_browser/testdata/node_modules/package/package.json b/tests/platform_browser/testdata/node_modules/package/package.json new file mode 100644 index 0000000..caf80b9 --- /dev/null +++ b/tests/platform_browser/testdata/node_modules/package/package.json @@ -0,0 +1,8 @@ +{ + "exports": { + ".": { + "node": "./node.js", + "import": "./browser.js" + } + } +} diff --git a/tests/platform_browser/testdata/package.json b/tests/platform_browser/testdata/package.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/tests/platform_browser/testdata/package.json @@ -0,0 +1,2 @@ +{ +}