We will list some of the important directories/files you might need to interact with, and briefly introduce each of them:
# DIRECTORIES
build_extra/: Some customized rules of building Deno
js/: TypeScript Frontend
libdeno/: C/C++ Middle-end
src/: Rust Backend
tests/: Integration Tests
third_party/: Third party code
tools/: Deno tools for testing and building
# FILES
BUILD.gn: Main Deno build rules
Cargo.toml: Dependency info for Rust end
package.json: Node dependencies (mostly for TypeScript compiler and Rollup)
build.rs: Cargo build rules
build_extra/
Some customized rules for building Deno, consisting of rules for FlatBuffers and Rust crates at the moment.
One important file you might want to pay attention to is build_extra/rust/BUILD.gn. When adding a new Rust crate in third_party/, we need to add an entry into this file. For example, this is the rule for building a crate called time:
(rust_crate GN template is defined in build_extra/rust/rust.gni)
js/
This is where code for TypeScript frontend is located. Most APIs are defined in its own file, accompanied with a test file. For example, readFile is defined in read_file.ts, while its unit tests are in read_file_test.ts.
Besides files for API, here are some other special files:
main.ts: denoMain is defined in this file, which is invoked by Rust backend as the entry for bootstrapping TypeScript code.
globals.ts: All globals that do not need imports are attached here.
deno.ts: All deno namespace APIs are exported here.
libdeno.ts: Type definition for customized V8 API exposed to TypeScript.
unit_tests.ts: All unit tests are imported here and executed.
compiler.ts: Customized TypeScript compilation logic for Deno.
libdeno/
The C/C++ libdeno middle-end lives here.
api.cc: libdeno APIs that are exposed and callable from the Rust side
binding.cc: code that handles interaction with V8 and where V8 C++ bindings are added. These APIs are exposed Rust and TypeScript side both.
snapshot_creator.cc: logic for creating V8 snapshot during build.
src/
The Rust backend lives here.
libdeno.rs: exposes libdeno APIs from libdeno/api.cc to Rust
isolate.rs: extracts V8 isolate (an isolated instance of V8 engine) and event loop creation logic using libdeno APIs
deno_dir.rs: contains logic for Deno module file resolution and caching
ops.rs: where each Deno Op (operation) is handled. This is where the actual file system and network accesses are done.
main.rs: contains main function for Rust. This is the ACTUAL entry point when you run the Deno binary.
msg.fbs: FlatBuffers definition file for message structure, used for message passing. Modify this file when you want to add or modify a message structure.
tests/
Integration tests for Deno.
*.jsor *.ts files define the code to run for each test. *.test defined how should this test be executed. Usually, *.out defines the expected output of a test (the actual name is specified in *.test files)
rust_crate("time") {
# Where is this crate?
source_root = "$registry_github/time-0.1.40/src/lib.rs"
# What are its dependencies?
extern = [
":libc",
":winapi",
]
}