From 0e48f26e8910aafda85b5a9e8889c9cc9ca88527 Mon Sep 17 00:00:00 2001 From: ledsun Date: Wed, 31 Jul 2024 18:53:15 +0900 Subject: [PATCH 1/5] Add inspect method to the URLResolver for debugging --- packages/gems/js/lib/js/require_remote/url_resolver.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/gems/js/lib/js/require_remote/url_resolver.rb b/packages/gems/js/lib/js/require_remote/url_resolver.rb index 7bbaae095c..6a0052c686 100644 --- a/packages/gems/js/lib/js/require_remote/url_resolver.rb +++ b/packages/gems/js/lib/js/require_remote/url_resolver.rb @@ -26,6 +26,10 @@ def pop() @url_stack.pop end + def inspect + "#{self.class}(#{@url_stack})" + end + private def filename_from(relative_feature) From b2ca89129591335045bee7ea8361c89f423401b4 Mon Sep 17 00:00:00 2001 From: ledsun Date: Wed, 31 Jul 2024 18:54:57 +0900 Subject: [PATCH 2/5] Add base_url property to specify the base URL for relative path --- packages/gems/js/lib/js/require_remote.rb | 18 ++++++++++++++++++ .../integrations/js-require-remote.spec.ts | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/packages/gems/js/lib/js/require_remote.rb b/packages/gems/js/lib/js/require_remote.rb index 5c9946cf45..68eaebc296 100644 --- a/packages/gems/js/lib/js/require_remote.rb +++ b/packages/gems/js/lib/js/require_remote.rb @@ -43,11 +43,29 @@ class RequireRemote include Singleton def initialize + # By default, the base_url is the URL of the HTML file that invoked ruby.wasm vm. base_url = JS.global[:URL].new(JS.global[:location][:href]) @resolver = URLResolver.new(base_url) @evaluator = Evaluator.new end + # Initialize the instance. + # + # If you want to resolve relative paths to a starting point other than the HTML file that executes ruby.wasm, + # you can set the base_url property. + # For example, if you want to use the `lib` directory as the starting point, specify base_url as follows + # + # == Example + # require 'js/require_remote' + # JS::RequireRemote.instance.base_url = "lib" + # JS::RequireRemote.instance.load("foo") # => 'lib/foo.rb' will be loaded. + # + def base_url=(base_url) + base_url = base_url.end_with?("/") ? base_url : "#{base_url}/" + url = JS.global[:URL].new(base_url, JS.global[:location][:href]) + @resolver = URLResolver.new(url) + end + # Load the given feature from remote. def load(relative_feature) location = @resolver.get_location(relative_feature) diff --git a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts index 2bd1e0ed17..3de5293b90 100644 --- a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts +++ b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts @@ -115,5 +115,24 @@ if (!process.env.RUBY_NPM_PACKAGE_ROOT) { expect(await resolve()).toBe("Hello from RecursiveRequire::B"); }); + + test("JS::RequireRemote#load loads a file with a relative path from base_url option", async ({ + page + }) => { + const resolve = await resolveBinding(page, "checkResolved"); + await page.goto( + "https://cdn.jsdelivr.net/npm/@ruby/head-wasm-wasi@latest/dist/", + ); + await page.setContent(` + + + `); + + expect(await resolve()).toBe(true); + }); }); } From 2c36e1f791b69eb3de26c1e9bd6f40cb875854f7 Mon Sep 17 00:00:00 2001 From: ledsun Date: Mon, 12 Aug 2024 12:12:39 +0900 Subject: [PATCH 3/5] Delete incorrect comments --- packages/gems/js/lib/js/require_remote.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/gems/js/lib/js/require_remote.rb b/packages/gems/js/lib/js/require_remote.rb index 68eaebc296..e70dcedf79 100644 --- a/packages/gems/js/lib/js/require_remote.rb +++ b/packages/gems/js/lib/js/require_remote.rb @@ -49,8 +49,6 @@ def initialize @evaluator = Evaluator.new end - # Initialize the instance. - # # If you want to resolve relative paths to a starting point other than the HTML file that executes ruby.wasm, # you can set the base_url property. # For example, if you want to use the `lib` directory as the starting point, specify base_url as follows From 2e91b63ed8a6aae72c6d9519650ad2ec96a64dab Mon Sep 17 00:00:00 2001 From: ledsun Date: Mon, 12 Aug 2024 12:21:49 +0900 Subject: [PATCH 4/5] Modifying the test code to make it less misleading --- .../test-e2e/integrations/js-require-remote.spec.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts index 3de5293b90..41691a1d2c 100644 --- a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts +++ b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts @@ -116,7 +116,7 @@ if (!process.env.RUBY_NPM_PACKAGE_ROOT) { expect(await resolve()).toBe("Hello from RecursiveRequire::B"); }); - test("JS::RequireRemote#load loads a file with a relative path from base_url option", async ({ + test("JS::RequireRemote#load loads the file with a path relative to the base_url specified by the base_url property.", async ({ page }) => { const resolve = await resolveBinding(page, "checkResolved"); @@ -127,12 +127,13 @@ if (!process.env.RUBY_NPM_PACKAGE_ROOT) { `); - expect(await resolve()).toBe(true); + expect(await resolve()).toBe("Hello from RecursiveRequire::B"); }); }); } From 0d72102cea5720a6408d87c92a2d6d2a62a601fd Mon Sep 17 00:00:00 2001 From: ledsun Date: Mon, 12 Aug 2024 12:24:35 +0900 Subject: [PATCH 5/5] rake format --- .../test-e2e/integrations/js-require-remote.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts index 41691a1d2c..1cbe00bf7d 100644 --- a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts +++ b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/js-require-remote.spec.ts @@ -117,7 +117,7 @@ if (!process.env.RUBY_NPM_PACKAGE_ROOT) { }); test("JS::RequireRemote#load loads the file with a path relative to the base_url specified by the base_url property.", async ({ - page + page, }) => { const resolve = await resolveBinding(page, "checkResolved"); await page.goto(