Skip to content

Commit 051dc02

Browse files
committed
fix: support importing bytes and text from npm packages
1 parent c4e983a commit 051dc02

File tree

12 files changed

+131
-63
lines changed

12 files changed

+131
-63
lines changed

deno

Submodule deno updated 104 files

src/rs_lib/Cargo.lock

Lines changed: 9 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/rs_lib/Cargo.toml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ deno_semver = "=0.8.1"
2323
url = "2.5"
2424

2525
[dependencies.deno_ast]
26-
version = "=0.48.1"
26+
version = "=0.48.2"
2727
features = ["transpiling"]
2828

2929
[dependencies.deno_cache_dir]
@@ -60,7 +60,11 @@ features = ["sync"]
6060

6161
[dependencies.sys_traits]
6262
version = "=0.1.16"
63-
features = ["real","wasm"]
63+
features = ["real"]
64+
65+
[target.'cfg(target_arch = "wasm32")'.dependencies.sys_traits]
66+
version = "=0.1.16"
67+
features = ["real", "wasm"]
6468

6569
[profile.release]
6670
codegen-units = 1

src/rs_lib/lib.rs

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ use deno_resolver::file_fetcher::PermissionedFileFetcher;
4040
use deno_resolver::file_fetcher::PermissionedFileFetcherOptions;
4141
use deno_resolver::graph::DefaultDenoResolverRc;
4242
use deno_resolver::graph::ResolveWithGraphOptions;
43-
use deno_resolver::loader::PreparedModuleLoader;
44-
use deno_resolver::loader::PreparedModuleOrAsset;
43+
use deno_resolver::loader::LoadCodeSourceErrorKind;
44+
use deno_resolver::loader::LoadedModuleOrAsset;
45+
use deno_resolver::loader::ModuleLoader;
4546
use deno_resolver::loader::RequestedModuleType;
4647
use deno_resolver::npm::DenoInNpmPackageChecker;
4748
use deno_semver::SmallStackString;
@@ -293,10 +294,7 @@ impl DenoWorkspace {
293294
resolver_factory: self.resolver_factory.clone(),
294295
npm_installer_factory: self.npm_installer_factory.clone(),
295296
parsed_source_cache: self.resolver_factory.parsed_source_cache().clone(),
296-
prepared_module_loader: self
297-
.resolver_factory
298-
.prepared_module_loader()?
299-
.clone(),
297+
module_loader: self.resolver_factory.module_loader()?.clone(),
300298
task_queue: Default::default(),
301299
graph: deno_graph::ModuleGraph::new(deno_graph::GraphKind::CodeOnly),
302300
})
@@ -314,8 +312,7 @@ pub struct DenoLoader {
314312
npm_installer_factory:
315313
Arc<NpmInstallerFactory<WasmHttpClient, ConsoleLogReporter, RealSys>>,
316314
parsed_source_cache: Arc<ParsedSourceCache>,
317-
prepared_module_loader:
318-
Arc<PreparedModuleLoader<DenoInNpmPackageChecker, RealSys>>,
315+
module_loader: Arc<ModuleLoader<RealSys>>,
319316
resolver_factory: Arc<ResolverFactory<RealSys>>,
320317
workspace_factory: Arc<WorkspaceFactory<RealSys>>,
321318
graph: ModuleGraph,
@@ -501,67 +498,72 @@ impl DenoLoader {
501498
return Ok(create_external_repsonse(&url));
502499
}
503500

504-
let maybe_prepared_module = self
505-
.prepared_module_loader
506-
.load_prepared_module(&self.graph, &url, requested_module_type)
507-
.await?;
508-
509-
match maybe_prepared_module {
510-
Some(PreparedModuleOrAsset::Module(m)) => {
501+
match self
502+
.module_loader
503+
.load(&self.graph, &url, None, requested_module_type)
504+
.await
505+
{
506+
Ok(LoadedModuleOrAsset::Module(m)) => {
511507
self.parsed_source_cache.free(&m.specifier);
512508
Ok(create_module_response(
513509
&m.specifier,
514510
m.media_type,
515511
m.source.as_bytes(),
516512
))
517513
}
518-
Some(PreparedModuleOrAsset::ExternalAsset { specifier }) => {
514+
Ok(LoadedModuleOrAsset::ExternalAsset {
515+
specifier,
516+
statically_analyzable: _,
517+
}) => {
519518
let file = self
520519
.file_fetcher
521-
.fetch_bypass_permissions(specifier)
520+
.fetch_bypass_permissions(&specifier)
522521
.await?;
523522
let media_type = MediaType::from_specifier_and_headers(
524523
&file.url,
525524
file.maybe_headers.as_ref(),
526525
);
527526
Ok(create_module_response(&file.url, media_type, &file.source))
528527
}
529-
None => {
530-
if url.scheme() == "npm" {
531-
bail!(
532-
"Failed resolving '{}'\n\nResolve the npm: specifier to a file: specifier before providing it to the loader.",
533-
url
534-
)
535-
}
536-
let file = self.file_fetcher.fetch_bypass_permissions(&url).await?;
537-
let media_type = MediaType::from_specifier_and_headers(
538-
&url,
539-
file.maybe_headers.as_ref(),
540-
);
541-
match requested_module_type {
542-
RequestedModuleType::Text | RequestedModuleType::Bytes => {
543-
Ok(create_module_response(&file.url, media_type, &file.source))
528+
Err(err) => match err.as_kind() {
529+
LoadCodeSourceErrorKind::LoadUnpreparedModule(_) => {
530+
if url.scheme() == "npm" {
531+
bail!(
532+
"Failed resolving '{}'\n\nResolve the npm: specifier to a file: specifier before providing it to the loader.",
533+
url
534+
)
544535
}
545-
RequestedModuleType::Json
546-
| RequestedModuleType::None
547-
| RequestedModuleType::Other(_) => {
548-
if media_type.is_emittable() {
549-
let str = String::from_utf8_lossy(&file.source);
550-
let value = str.into();
551-
let source = self
552-
.maybe_transpile(&file.url, media_type, &value, None)
553-
.await?;
554-
Ok(create_module_response(
555-
&file.url,
556-
media_type,
557-
source.as_bytes(),
558-
))
559-
} else {
536+
let file = self.file_fetcher.fetch_bypass_permissions(&url).await?;
537+
let media_type = MediaType::from_specifier_and_headers(
538+
&url,
539+
file.maybe_headers.as_ref(),
540+
);
541+
match requested_module_type {
542+
RequestedModuleType::Text | RequestedModuleType::Bytes => {
560543
Ok(create_module_response(&file.url, media_type, &file.source))
561544
}
545+
RequestedModuleType::Json
546+
| RequestedModuleType::None
547+
| RequestedModuleType::Other(_) => {
548+
if media_type.is_emittable() {
549+
let str = String::from_utf8_lossy(&file.source);
550+
let value = str.into();
551+
let source = self
552+
.maybe_transpile(&file.url, media_type, &value, None)
553+
.await?;
554+
Ok(create_module_response(
555+
&file.url,
556+
media_type,
557+
source.as_bytes(),
558+
))
559+
} else {
560+
Ok(create_module_response(&file.url, media_type, &file.source))
561+
}
562+
}
562563
}
563564
}
564-
}
565+
_ => return Err(err.into()),
566+
},
565567
}
566568
}
567569

tests/bytes_and_text/main.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { assertEquals } from "@std/assert";
12
import {
23
assertResponseText,
34
createLoader,
@@ -29,4 +30,12 @@ Deno.test("loads jsx transpiled", async () => {
2930
await loader.load(dataFileUrl, RequestedModuleType.Text),
3031
`Hello there!`,
3132
);
33+
const bytesResponse = await loader.load(
34+
dataFileUrl,
35+
RequestedModuleType.Bytes,
36+
);
37+
if (bytesResponse.kind !== "module") {
38+
throw new Error("Fail");
39+
}
40+
assertEquals(bytesResponse.code, Deno.readFileSync(new URL(dataFileUrl)));
3241
});
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { assertEquals } from "@std/assert";
2+
import {
3+
assertResponseText,
4+
createLoader,
5+
RequestedModuleType,
6+
ResolutionMode,
7+
type WorkspaceOptions,
8+
} from "../helpers.ts";
9+
10+
Deno.test("loads jsx transpiled", async () => {
11+
const mainTs = import.meta.dirname + "/testdata/main.ts";
12+
const createWorkspace = async (options?: WorkspaceOptions) => {
13+
return await createLoader({
14+
configPath: import.meta.dirname + "/testdata/deno.json",
15+
...(options ?? {}),
16+
}, {
17+
entrypoints: [mainTs],
18+
});
19+
};
20+
const { loader } = await createWorkspace();
21+
22+
const mainTsUrl = loader.resolve(mainTs, undefined, ResolutionMode.Import);
23+
const dataFileUrl = loader.resolve(
24+
"package/data.txt",
25+
mainTsUrl,
26+
ResolutionMode.Import,
27+
);
28+
29+
assertResponseText(
30+
await loader.load(dataFileUrl, RequestedModuleType.Text),
31+
`Hello there!`,
32+
);
33+
const bytesResponse = await loader.load(
34+
dataFileUrl,
35+
RequestedModuleType.Bytes,
36+
);
37+
if (bytesResponse.kind !== "module") {
38+
throw new Error("Fail");
39+
}
40+
assertEquals(bytesResponse.code, Deno.readFileSync(new URL(dataFileUrl)));
41+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello there!
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"unstable": [
3+
"raw-imports"
4+
]
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import dataBytes from "package/data.txt" with { type: "bytes" };
2+
import dataText from "package/data.txt" with { type: "text" };
3+
4+
console.log(dataBytes);
5+
console.log(dataText);

tests/bytes_and_text_npm/testdata/node_modules/package/data.txt

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)