mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
Refactor snapshot build (#2825)
Instead of using core/snapshot_creator.rs, instead two crates are introduced which allow building the snapshot during build.rs. Rollup is removed and replaced with our own bundler. This removes the Node build dependency. Modules in //js now use Deno-style imports with file extensions, rather than Node style extensionless imports. This improves incremental build time when changes are made to //js files by about 40 seconds.
This commit is contained in:
parent
56508f113d
commit
d43b43ca78
110 changed files with 1548 additions and 1043 deletions
|
@ -200,10 +200,6 @@ test_script:
|
||||||
- ps: Exec { & python tools\test.py --build-dir $env:DENO_BUILD_PATH }
|
- ps: Exec { & python tools\test.py --build-dir $env:DENO_BUILD_PATH }
|
||||||
|
|
||||||
after_test:
|
after_test:
|
||||||
# Delete the the rollup cache, which is unreliable, so that it doesn't get
|
|
||||||
# persisted in the appveyor cache.
|
|
||||||
- ps: if (Get-SaveCache) { Delete-Tree "$env:DENO_BUILD_PATH\.rpt2_cache" }
|
|
||||||
|
|
||||||
# Stop sccache and show stats.
|
# Stop sccache and show stats.
|
||||||
- ps: sccache --stop-server
|
- ps: sccache --stop-server
|
||||||
|
|
||||||
|
@ -215,36 +211,15 @@ after_test:
|
||||||
throw "Build should be up-to-date but isn't."
|
throw "Build should be up-to-date but isn't."
|
||||||
}
|
}
|
||||||
|
|
||||||
# Verify that javascript and typescript files which are bundled by rollup are
|
# Verify that the bundled javascript and typescript files are listed
|
||||||
# listed explicitly in cli\BUILD.gn. This is not an air-tight check.
|
# explicitly in cli_snapshots\BUILD.gn. This is not an air-tight check.
|
||||||
# TODO: make rollup or another bundler write a depfile.
|
|
||||||
- ps: |-
|
- ps: |-
|
||||||
$ignore = "test_util.ts", "unit_tests.ts", "unit_test_runner.ts", "*_test.ts"
|
$ignore = "test_util.ts", "unit_tests.ts", "unit_test_runner.ts", "*_test.ts"
|
||||||
Get-ChildItem "js" -File -Force -Name |
|
Get-ChildItem "js" -File -Force -Name |
|
||||||
where { $name = $_; -not ($ignore | where { $name -like $_ }) } |
|
where { $name = $_; -not ($ignore | where { $name -like $_ }) } |
|
||||||
where { -not (Select-String -Pattern $_ -Path cli\BUILD.gn `
|
where { -not (Select-String -Pattern $_ -Path cli_snapshots\BUILD.gn `
|
||||||
-SimpleMatch -CaseSensitive) } |
|
-SimpleMatch -CaseSensitive) } |
|
||||||
foreach { throw "$_ should be listed in cli\BUILD.gn but isn't." }
|
foreach { throw "$_ should be listed in cli_snapshots\BUILD.gn but isn't." }
|
||||||
|
|
||||||
# Verify that generated ninja files do not use absolute path names.
|
|
||||||
# If they do, it makes ccache/sccache much less effective.
|
|
||||||
- ps: |-
|
|
||||||
$trap = "NO_ABS_PATH_PLS"
|
|
||||||
$dir = "$env:APPVEYOR_BUILD_FOLDER\out\$trap"
|
|
||||||
Exec { gn gen $dir | Out-Null }
|
|
||||||
$files = Get-Tree $dir -File -Force -Recurse | where Extension -ne ".dll"
|
|
||||||
Select-String $trap -Path $files -SimpleMatch | where {
|
|
||||||
# V8 took the liberty to produce an absolute path in their ninja
|
|
||||||
# output. We can't do much about that, so we just ignore it.
|
|
||||||
$_.Line -notmatch "v8/builtins-generated/bytecodes-builtins-list.h"
|
|
||||||
} | tee -Variable line_matches
|
|
||||||
if ($line_matches) {
|
|
||||||
$ctx = $line_matches.Line |
|
|
||||||
Select-String "[^\s;,]*[\s=]*[^\s;,=]*$trap[^\s;,]*" -AllMatches |
|
|
||||||
foreach { $_.Matches.Value -replace '\$(.)', '$1' } |
|
|
||||||
sort -Unique
|
|
||||||
throw @("Absolute path(s) found in build script:") + $ctx -join "`n "
|
|
||||||
}
|
|
||||||
|
|
||||||
# If this build is going to be deployed, build a zip file.
|
# If this build is going to be deployed, build a zip file.
|
||||||
- ps: |-
|
- ps: |-
|
||||||
|
|
19
Cargo.lock
generated
19
Cargo.lock
generated
|
@ -272,6 +272,8 @@ dependencies = [
|
||||||
"atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
"atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"deno 0.16.0",
|
"deno 0.16.0",
|
||||||
|
"deno_cli_snapshots 0.0.3",
|
||||||
|
"deno_typescript 0.0.3",
|
||||||
"dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fwdansi 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fwdansi 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -308,6 +310,23 @@ dependencies = [
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "deno_cli_snapshots"
|
||||||
|
version = "0.0.3"
|
||||||
|
dependencies = [
|
||||||
|
"deno 0.16.0",
|
||||||
|
"deno_typescript 0.0.3",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "deno_typescript"
|
||||||
|
version = "0.0.3"
|
||||||
|
dependencies = [
|
||||||
|
"deno 0.16.0",
|
||||||
|
"serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs"
|
name = "dirs"
|
||||||
version = "2.0.2"
|
version = "2.0.2"
|
||||||
|
|
|
@ -3,4 +3,6 @@ members = [
|
||||||
"cli",
|
"cli",
|
||||||
"core",
|
"core",
|
||||||
"tools/hyper_hello",
|
"tools/hyper_hello",
|
||||||
|
"deno_typescript",
|
||||||
|
"cli_snapshots",
|
||||||
]
|
]
|
||||||
|
|
150
cli/BUILD.gn
150
cli/BUILD.gn
|
@ -1,9 +1,6 @@
|
||||||
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import("//build/toolchain/cc_wrapper.gni")
|
import("//build/toolchain/cc_wrapper.gni")
|
||||||
import("//build_extra/rust/rust.gni")
|
import("//build_extra/rust/rust.gni")
|
||||||
import("//third_party/v8/gni/snapshot_toolchain.gni")
|
|
||||||
import("//third_party/v8/gni/v8.gni")
|
|
||||||
import("deno.gni")
|
|
||||||
|
|
||||||
main_extern = [
|
main_extern = [
|
||||||
{
|
{
|
||||||
|
@ -11,6 +8,16 @@ main_extern = [
|
||||||
crate_name = "deno"
|
crate_name = "deno"
|
||||||
crate_type = "rlib"
|
crate_type = "rlib"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label = "../cli_snapshots:deno_cli_snapshots"
|
||||||
|
crate_name = "deno_cli_snapshots"
|
||||||
|
crate_type = "rlib"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label = "../deno_typescript:deno_typescript"
|
||||||
|
crate_name = "deno_typescript"
|
||||||
|
crate_type = "rlib"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label = "$rust_build:serde_derive"
|
label = "$rust_build:serde_derive"
|
||||||
crate_name = "serde_derive"
|
crate_name = "serde_derive"
|
||||||
|
@ -61,109 +68,6 @@ if (is_posix) {
|
||||||
main_extern_rlib += [ "nix" ]
|
main_extern_rlib += [ "nix" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
ts_sources = [
|
|
||||||
"../js/base64.ts",
|
|
||||||
"../js/blob.ts",
|
|
||||||
"../js/body.ts",
|
|
||||||
"../js/buffer.ts",
|
|
||||||
"../js/build.ts",
|
|
||||||
"../js/chmod.ts",
|
|
||||||
"../js/chown.ts",
|
|
||||||
"../js/colors.ts",
|
|
||||||
"../js/compiler.ts",
|
|
||||||
"../js/console.ts",
|
|
||||||
"../js/console_table.ts",
|
|
||||||
"../js/copy_file.ts",
|
|
||||||
"../js/core.ts",
|
|
||||||
"../js/custom_event.ts",
|
|
||||||
"../js/deno.ts",
|
|
||||||
"../js/diagnostics.ts",
|
|
||||||
"../js/dir.ts",
|
|
||||||
"../js/dispatch.ts",
|
|
||||||
"../js/dispatch_json.ts",
|
|
||||||
"../js/dispatch_minimal.ts",
|
|
||||||
"../js/dom_file.ts",
|
|
||||||
"../js/dom_types.ts",
|
|
||||||
"../js/dom_util.ts",
|
|
||||||
"../js/error_stack.ts",
|
|
||||||
"../js/errors.ts",
|
|
||||||
"../js/event.ts",
|
|
||||||
"../js/event_target.ts",
|
|
||||||
"../js/fetch.ts",
|
|
||||||
"../js/file_info.ts",
|
|
||||||
"../js/files.ts",
|
|
||||||
"../js/form_data.ts",
|
|
||||||
"../js/format_error.ts",
|
|
||||||
"../js/get_random_values.ts",
|
|
||||||
"../js/globals.ts",
|
|
||||||
"../js/headers.ts",
|
|
||||||
"../js/io.ts",
|
|
||||||
"../js/lib.deno_runtime.d.ts",
|
|
||||||
"../js/lib.web_assembly.d.ts",
|
|
||||||
"../js/link.ts",
|
|
||||||
"../js/location.ts",
|
|
||||||
"../js/main.ts",
|
|
||||||
"../js/make_temp_dir.ts",
|
|
||||||
"../js/metrics.ts",
|
|
||||||
"../js/mkdir.ts",
|
|
||||||
"../js/mock_builtin.js",
|
|
||||||
"../js/net.ts",
|
|
||||||
"../js/os.ts",
|
|
||||||
"../js/performance.ts",
|
|
||||||
"../js/permissions.ts",
|
|
||||||
"../js/plugins.d.ts",
|
|
||||||
"../js/process.ts",
|
|
||||||
"../js/read_dir.ts",
|
|
||||||
"../js/read_file.ts",
|
|
||||||
"../js/read_link.ts",
|
|
||||||
"../js/remove.ts",
|
|
||||||
"../js/rename.ts",
|
|
||||||
"../js/repl.ts",
|
|
||||||
"../js/request.ts",
|
|
||||||
"../js/resources.ts",
|
|
||||||
"../js/stat.ts",
|
|
||||||
"../js/symlink.ts",
|
|
||||||
"../js/text_encoding.ts",
|
|
||||||
"../js/timers.ts",
|
|
||||||
"../js/truncate.ts",
|
|
||||||
"../js/type_directives.ts",
|
|
||||||
"../js/types.ts",
|
|
||||||
"../js/url.ts",
|
|
||||||
"../js/url_search_params.ts",
|
|
||||||
"../js/util.ts",
|
|
||||||
"../js/utime.ts",
|
|
||||||
"../js/version.ts",
|
|
||||||
"../js/window.ts",
|
|
||||||
"../js/workers.ts",
|
|
||||||
"../js/write_file.ts",
|
|
||||||
"../js/xeval.ts",
|
|
||||||
"../tsconfig.json",
|
|
||||||
|
|
||||||
# Listing package.json and yarn.lock as sources ensures the bundle is rebuilt
|
|
||||||
# when npm packages are added/removed or their contents changes.
|
|
||||||
"../package.json",
|
|
||||||
"../third_party/yarn.lock",
|
|
||||||
]
|
|
||||||
|
|
||||||
# When Cargo is driving the build, GN/Ninja are used to produce these non-Rust
|
|
||||||
# targets. Cargo handles all Rust source files and the final linking step.
|
|
||||||
group("deno_deps") {
|
|
||||||
deps = [
|
|
||||||
":snapshot_compiler",
|
|
||||||
":snapshot_deno",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Optimized dependencies for cross compiled builds.
|
|
||||||
# This can be removed once we get snapshots into cross compiled builds.
|
|
||||||
group("deno_deps_cross") {
|
|
||||||
testonly = true
|
|
||||||
deps = [
|
|
||||||
":compiler_bundle",
|
|
||||||
":main_bundle",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Reads the cargo info from Cargo.toml
|
# Reads the cargo info from Cargo.toml
|
||||||
deno_cargo_info = exec_script("../build_extra/rust/get_cargo_info.py",
|
deno_cargo_info = exec_script("../build_extra/rust/get_cargo_info.py",
|
||||||
[ rebase_path("Cargo.toml", root_build_dir) ],
|
[ rebase_path("Cargo.toml", root_build_dir) ],
|
||||||
|
@ -173,9 +77,6 @@ rust_executable("deno") {
|
||||||
source_root = "main.rs"
|
source_root = "main.rs"
|
||||||
extern = main_extern
|
extern = main_extern
|
||||||
extern_rlib = main_extern_rlib
|
extern_rlib = main_extern_rlib
|
||||||
deps = [
|
|
||||||
":deno_deps",
|
|
||||||
]
|
|
||||||
|
|
||||||
# Extract version from Cargo.toml
|
# Extract version from Cargo.toml
|
||||||
# TODO integrate this into rust.gni by allowing the rust_executable template
|
# TODO integrate this into rust.gni by allowing the rust_executable template
|
||||||
|
@ -190,9 +91,6 @@ rust_test("cli_test") {
|
||||||
source_root = "main.rs"
|
source_root = "main.rs"
|
||||||
extern = main_extern
|
extern = main_extern
|
||||||
extern_rlib = main_extern_rlib
|
extern_rlib = main_extern_rlib
|
||||||
deps = [
|
|
||||||
":deno_deps",
|
|
||||||
]
|
|
||||||
|
|
||||||
# Extract version from Cargo.toml
|
# Extract version from Cargo.toml
|
||||||
inputs = [
|
inputs = [
|
||||||
|
@ -200,31 +98,3 @@ rust_test("cli_test") {
|
||||||
]
|
]
|
||||||
env = [ "CARGO_PKG_VERSION=${deno_cargo_info.version}" ]
|
env = [ "CARGO_PKG_VERSION=${deno_cargo_info.version}" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
bundle("main_bundle") {
|
|
||||||
sources = ts_sources
|
|
||||||
out_dir = "$target_gen_dir/bundle/"
|
|
||||||
out_name = "main"
|
|
||||||
}
|
|
||||||
|
|
||||||
bundle("compiler_bundle") {
|
|
||||||
sources = ts_sources
|
|
||||||
out_dir = "$target_gen_dir/bundle/"
|
|
||||||
out_name = "compiler"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Generates $target_gen_dir/snapshot_deno.bin
|
|
||||||
snapshot("snapshot_deno") {
|
|
||||||
source_root = "$target_gen_dir/bundle/main.js"
|
|
||||||
deps = [
|
|
||||||
":main_bundle",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Generates $target_gen_dir/snapshot_compiler.bin
|
|
||||||
snapshot("snapshot_compiler") {
|
|
||||||
source_root = "$target_gen_dir/bundle/compiler.js"
|
|
||||||
deps = [
|
|
||||||
":compiler_bundle",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
|
@ -52,6 +52,8 @@ tokio-rustls = "0.10.0"
|
||||||
tokio-threadpool = "0.1.15"
|
tokio-threadpool = "0.1.15"
|
||||||
url = "1.7.2"
|
url = "1.7.2"
|
||||||
utime = "0.2.1"
|
utime = "0.2.1"
|
||||||
|
deno_cli_snapshots = { path = "../cli_snapshots" }
|
||||||
|
deno_typescript = { path = "../deno_typescript" }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
winapi = "0.3.7"
|
winapi = "0.3.7"
|
||||||
|
|
|
@ -1,59 +1,8 @@
|
||||||
static DENO_RUNTIME: &str = include_str!("../js/lib.deno_runtime.d.ts");
|
static DENO_RUNTIME: &str = include_str!("../js/lib.deno_runtime.d.ts");
|
||||||
|
|
||||||
macro_rules! inc {
|
|
||||||
($e:expr) => {
|
|
||||||
Some(include_str!(concat!(
|
|
||||||
"../third_party/node_modules/typescript/lib/",
|
|
||||||
$e
|
|
||||||
)))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_source_code(name: &str) -> Option<&'static str> {
|
pub fn get_source_code(name: &str) -> Option<&'static str> {
|
||||||
match name {
|
match name {
|
||||||
"lib.deno_runtime.d.ts" => Some(DENO_RUNTIME),
|
"lib.deno_runtime.d.ts" => Some(DENO_RUNTIME),
|
||||||
"lib.es2015.collection.d.ts" => inc!("lib.es2015.collection.d.ts"),
|
_ => deno_typescript::get_asset(name),
|
||||||
"lib.es2015.core.d.ts" => inc!("lib.es2015.core.d.ts"),
|
|
||||||
"lib.es2015.d.ts" => inc!("lib.es2015.d.ts"),
|
|
||||||
"lib.es2015.generator.d.ts" => inc!("lib.es2015.generator.d.ts"),
|
|
||||||
"lib.es2015.iterable.d.ts" => inc!("lib.es2015.iterable.d.ts"),
|
|
||||||
"lib.es2015.promise.d.ts" => inc!("lib.es2015.promise.d.ts"),
|
|
||||||
"lib.es2015.proxy.d.ts" => inc!("lib.es2015.proxy.d.ts"),
|
|
||||||
"lib.es2015.reflect.d.ts" => inc!("lib.es2015.reflect.d.ts"),
|
|
||||||
"lib.es2015.symbol.d.ts" => inc!("lib.es2015.symbol.d.ts"),
|
|
||||||
"lib.es2015.symbol.wellknown.d.ts" => {
|
|
||||||
inc!("lib.es2015.symbol.wellknown.d.ts")
|
|
||||||
}
|
|
||||||
"lib.es2016.array.include.d.ts" => inc!("lib.es2016.array.include.d.ts"),
|
|
||||||
"lib.es2016.d.ts" => inc!("lib.es2016.d.ts"),
|
|
||||||
"lib.es2017.d.ts" => inc!("lib.es2017.d.ts"),
|
|
||||||
"lib.es2017.intl.d.ts" => inc!("lib.es2017.intl.d.ts"),
|
|
||||||
"lib.es2017.object.d.ts" => inc!("lib.es2017.object.d.ts"),
|
|
||||||
"lib.es2017.sharedmemory.d.ts" => inc!("lib.es2017.sharedmemory.d.ts"),
|
|
||||||
"lib.es2017.string.d.ts" => inc!("lib.es2017.string.d.ts"),
|
|
||||||
"lib.es2017.typedarrays.d.ts" => inc!("lib.es2017.typedarrays.d.ts"),
|
|
||||||
"lib.es2018.d.ts" => inc!("lib.es2018.d.ts"),
|
|
||||||
"lib.es2018.asynciterable.d.ts" => inc!("lib.es2018.asynciterable.d.ts"),
|
|
||||||
"lib.es2018.intl.d.ts" => inc!("lib.es2018.intl.d.ts"),
|
|
||||||
"lib.es2018.promise.d.ts" => inc!("lib.es2018.promise.d.ts"),
|
|
||||||
"lib.es2018.regexp.d.ts" => inc!("lib.es2018.regexp.d.ts"),
|
|
||||||
"lib.es2019.d.ts" => inc!("lib.es2019.d.ts"),
|
|
||||||
"lib.es2019.array.d.ts" => inc!("lib.es2019.array.d.ts"),
|
|
||||||
"lib.es2019.object.d.ts" => inc!("lib.es2019.object.d.ts"),
|
|
||||||
"lib.es2019.string.d.ts" => inc!("lib.es2019.string.d.ts"),
|
|
||||||
"lib.es2019.symbol.d.ts" => inc!("lib.es2019.symbol.d.ts"),
|
|
||||||
"lib.es2020.d.ts" => inc!("lib.es2020.d.ts"),
|
|
||||||
"lib.es2020.string.d.ts" => inc!("lib.es2020.string.d.ts"),
|
|
||||||
"lib.es2020.symbol.wellknown.d.ts" => {
|
|
||||||
inc!("lib.es2020.symbol.wellknown.d.ts")
|
|
||||||
}
|
|
||||||
"lib.es5.d.ts" => inc!("lib.es5.d.ts"),
|
|
||||||
"lib.esnext.d.ts" => inc!("lib.esnext.d.ts"),
|
|
||||||
"lib.esnext.array.d.ts" => inc!("lib.esnext.array.d.ts"),
|
|
||||||
"lib.esnext.asynciterable.d.ts" => inc!("lib.esnext.asynciterable.d.ts"),
|
|
||||||
"lib.esnext.bigint.d.ts" => inc!("lib.esnext.bigint.d.ts"),
|
|
||||||
"lib.esnext.intl.d.ts" => inc!("lib.esnext.intl.d.ts"),
|
|
||||||
"lib.esnext.symbol.d.ts" => inc!("lib.esnext.symbol.d.ts"),
|
|
||||||
_ => None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
15
cli/build.rs
15
cli/build.rs
|
@ -1,15 +0,0 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
|
||||||
// Run "cargo build -vv" if you want to see gn output.
|
|
||||||
mod gn {
|
|
||||||
include!("../tools/gn.rs");
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let build = gn::Build::setup();
|
|
||||||
// When RLS is running "cargo check" to analyze the source code, we're not
|
|
||||||
// trying to build a working executable, rather we're just compiling all
|
|
||||||
// rust code.
|
|
||||||
if !build.check_only {
|
|
||||||
build.run("cli:deno_deps");
|
|
||||||
}
|
|
||||||
}
|
|
65
cli/deno.gni
65
cli/deno.gni
|
@ -1,65 +0,0 @@
|
||||||
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
|
||||||
import("//build/compiled_action.gni")
|
|
||||||
|
|
||||||
# Tempalte to generate a Rollup bundle of code.
|
|
||||||
template("bundle") {
|
|
||||||
action(target_name) {
|
|
||||||
forward_variables_from(invoker, "*")
|
|
||||||
script = "//tools/run_node.py"
|
|
||||||
outputs = [
|
|
||||||
out_dir + out_name + ".js",
|
|
||||||
out_dir + out_name + ".js.map",
|
|
||||||
]
|
|
||||||
inputs = [
|
|
||||||
"//js/" + out_name + ".ts",
|
|
||||||
"//rollup.config.js",
|
|
||||||
]
|
|
||||||
depfile = out_dir + out_name + ".d"
|
|
||||||
args = [
|
|
||||||
rebase_path("//third_party/node_modules/rollup/bin/rollup",
|
|
||||||
root_build_dir),
|
|
||||||
"-c",
|
|
||||||
rebase_path("//rollup.config.js", root_build_dir),
|
|
||||||
"-i",
|
|
||||||
rebase_path(inputs[0], root_build_dir),
|
|
||||||
"-o",
|
|
||||||
rebase_path(outputs[0], root_build_dir),
|
|
||||||
"--sourcemapFile",
|
|
||||||
rebase_path("."),
|
|
||||||
"--silent",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template("run_node") {
|
|
||||||
action(target_name) {
|
|
||||||
forward_variables_from(invoker, "*")
|
|
||||||
script = "//tools/run_node.py"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Template to generate different V8 snapshots based on different runtime flags.
|
|
||||||
template("snapshot") {
|
|
||||||
compiled_action(target_name) {
|
|
||||||
forward_variables_from(invoker,
|
|
||||||
[
|
|
||||||
"testonly",
|
|
||||||
"deps",
|
|
||||||
])
|
|
||||||
tool = "//core:snapshot_creator"
|
|
||||||
visibility = [ ":*" ] # Only targets in this file can depend on this.
|
|
||||||
snapshot_out_bin = "$target_gen_dir/$target_name.bin"
|
|
||||||
inputs = [
|
|
||||||
invoker.source_root,
|
|
||||||
]
|
|
||||||
|
|
||||||
outputs = [
|
|
||||||
snapshot_out_bin,
|
|
||||||
]
|
|
||||||
args = rebase_path(outputs, root_build_dir) +
|
|
||||||
rebase_path(inputs, root_build_dir)
|
|
||||||
|
|
||||||
# To debug snapshotting problems:
|
|
||||||
# args += ["--trace-serializer"]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -9,6 +9,7 @@ extern crate futures;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
extern crate clap;
|
extern crate clap;
|
||||||
extern crate deno;
|
extern crate deno;
|
||||||
|
extern crate deno_typescript;
|
||||||
extern crate indexmap;
|
extern crate indexmap;
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
extern crate nix;
|
extern crate nix;
|
||||||
|
|
|
@ -73,22 +73,12 @@ fn builtin_source_map(_: &str) -> Option<Vec<u8>> {
|
||||||
|
|
||||||
#[cfg(not(feature = "check-only"))]
|
#[cfg(not(feature = "check-only"))]
|
||||||
fn builtin_source_map(script_name: &str) -> Option<Vec<u8>> {
|
fn builtin_source_map(script_name: &str) -> Option<Vec<u8>> {
|
||||||
match script_name {
|
if script_name.ends_with("CLI_SNAPSHOT.js") {
|
||||||
"gen/cli/bundle/main.js" => Some(
|
Some(deno_cli_snapshots::CLI_SNAPSHOT_MAP.to_vec())
|
||||||
include_bytes!(concat!(
|
} else if script_name.ends_with("COMPILER_SNAPSHOT.js") {
|
||||||
env!("GN_OUT_DIR"),
|
Some(deno_cli_snapshots::COMPILER_SNAPSHOT_MAP.to_vec())
|
||||||
"/gen/cli/bundle/main.js.map"
|
} else {
|
||||||
))
|
None
|
||||||
.to_vec(),
|
|
||||||
),
|
|
||||||
"gen/cli/bundle/compiler.js" => Some(
|
|
||||||
include_bytes!(concat!(
|
|
||||||
env!("GN_OUT_DIR"),
|
|
||||||
"/gen/cli/bundle/compiler.js.map"
|
|
||||||
))
|
|
||||||
.to_vec(),
|
|
||||||
),
|
|
||||||
_ => None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,7 +395,7 @@ mod tests {
|
||||||
frames: vec![StackFrame {
|
frames: vec![StackFrame {
|
||||||
line: 11,
|
line: 11,
|
||||||
column: 12,
|
column: 12,
|
||||||
script_name: "gen/cli/bundle/main.js".to_string(),
|
script_name: "CLI_SNAPSHOT.js".to_string(),
|
||||||
function_name: "setLogDebug".to_string(),
|
function_name: "setLogDebug".to_string(),
|
||||||
is_eval: false,
|
is_eval: false,
|
||||||
is_constructor: false,
|
is_constructor: false,
|
||||||
|
@ -417,7 +407,7 @@ mod tests {
|
||||||
assert_eq!(actual.message, "TypeError: baz");
|
assert_eq!(actual.message, "TypeError: baz");
|
||||||
// Because this is accessing the live bundle, this test might be more fragile
|
// Because this is accessing the live bundle, this test might be more fragile
|
||||||
assert_eq!(actual.frames.len(), 1);
|
assert_eq!(actual.frames.len(), 1);
|
||||||
assert!(actual.frames[0].script_name.ends_with("js/util.ts"));
|
assert!(actual.frames[0].script_name.ends_with("js/window.ts"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
use deno::Script;
|
use deno::Script;
|
||||||
|
|
||||||
use deno::StartupData;
|
use deno::StartupData;
|
||||||
|
use deno_cli_snapshots::CLI_SNAPSHOT;
|
||||||
|
use deno_cli_snapshots::COMPILER_SNAPSHOT;
|
||||||
|
|
||||||
#[cfg(feature = "no-snapshot-init")]
|
#[cfg(feature = "no-snapshot-init")]
|
||||||
pub fn deno_isolate_init() -> StartupData<'static> {
|
pub fn deno_isolate_init() -> StartupData<'static> {
|
||||||
|
@ -23,8 +25,7 @@ pub fn deno_isolate_init() -> StartupData<'static> {
|
||||||
pub fn deno_isolate_init() -> StartupData<'static> {
|
pub fn deno_isolate_init() -> StartupData<'static> {
|
||||||
debug!("Deno isolate init with snapshots.");
|
debug!("Deno isolate init with snapshots.");
|
||||||
#[cfg(not(feature = "check-only"))]
|
#[cfg(not(feature = "check-only"))]
|
||||||
let data =
|
let data = CLI_SNAPSHOT;
|
||||||
include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/cli/snapshot_deno.bin"));
|
|
||||||
#[cfg(feature = "check-only")]
|
#[cfg(feature = "check-only")]
|
||||||
let data = b"";
|
let data = b"";
|
||||||
|
|
||||||
|
@ -50,10 +51,7 @@ pub fn compiler_isolate_init() -> StartupData<'static> {
|
||||||
pub fn compiler_isolate_init() -> StartupData<'static> {
|
pub fn compiler_isolate_init() -> StartupData<'static> {
|
||||||
debug!("Deno isolate init with snapshots.");
|
debug!("Deno isolate init with snapshots.");
|
||||||
#[cfg(not(feature = "check-only"))]
|
#[cfg(not(feature = "check-only"))]
|
||||||
let data = include_bytes!(concat!(
|
let data = COMPILER_SNAPSHOT;
|
||||||
env!("GN_OUT_DIR"),
|
|
||||||
"/gen/cli/snapshot_compiler.bin"
|
|
||||||
));
|
|
||||||
#[cfg(feature = "check-only")]
|
#[cfg(feature = "check-only")]
|
||||||
let data = b"";
|
let data = b"";
|
||||||
|
|
||||||
|
|
121
cli_snapshots/BUILD.gn
Normal file
121
cli_snapshots/BUILD.gn
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
import("//build_extra/rust/rust.gni")
|
||||||
|
|
||||||
|
rust_rlib("deno_cli_snapshots") {
|
||||||
|
source_root = "lib.rs"
|
||||||
|
generated_source_dir = rebase_path(root_out_dir)
|
||||||
|
deps = [
|
||||||
|
":deno_cli_snapshots_build_run",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
ts_sources = [
|
||||||
|
"../js/base64.ts",
|
||||||
|
"../js/blob.ts",
|
||||||
|
"../js/body.ts",
|
||||||
|
"../js/buffer.ts",
|
||||||
|
"../js/build.ts",
|
||||||
|
"../js/chmod.ts",
|
||||||
|
"../js/chown.ts",
|
||||||
|
"../js/colors.ts",
|
||||||
|
"../js/compiler.ts",
|
||||||
|
"../js/console.ts",
|
||||||
|
"../js/console_table.ts",
|
||||||
|
"../js/copy_file.ts",
|
||||||
|
"../js/core.ts",
|
||||||
|
"../js/custom_event.ts",
|
||||||
|
"../js/deno.ts",
|
||||||
|
"../js/diagnostics.ts",
|
||||||
|
"../js/dir.ts",
|
||||||
|
"../js/dispatch.ts",
|
||||||
|
"../js/dispatch_json.ts",
|
||||||
|
"../js/dispatch_minimal.ts",
|
||||||
|
"../js/dom_file.ts",
|
||||||
|
"../js/dom_types.ts",
|
||||||
|
"../js/dom_util.ts",
|
||||||
|
"../js/error_stack.ts",
|
||||||
|
"../js/errors.ts",
|
||||||
|
"../js/event.ts",
|
||||||
|
"../js/event_target.ts",
|
||||||
|
"../js/fetch.ts",
|
||||||
|
"../js/file_info.ts",
|
||||||
|
"../js/files.ts",
|
||||||
|
"../js/form_data.ts",
|
||||||
|
"../js/format_error.ts",
|
||||||
|
"../js/get_random_values.ts",
|
||||||
|
"../js/globals.ts",
|
||||||
|
"../js/headers.ts",
|
||||||
|
"../js/io.ts",
|
||||||
|
"../js/lib.deno_runtime.d.ts",
|
||||||
|
"../js/lib.web_assembly.d.ts",
|
||||||
|
"../js/link.ts",
|
||||||
|
"../js/location.ts",
|
||||||
|
"../js/main.ts",
|
||||||
|
"../js/make_temp_dir.ts",
|
||||||
|
"../js/metrics.ts",
|
||||||
|
"../js/mkdir.ts",
|
||||||
|
"../js/mock_builtin.js",
|
||||||
|
"../js/net.ts",
|
||||||
|
"../js/os.ts",
|
||||||
|
"../js/performance.ts",
|
||||||
|
"../js/permissions.ts",
|
||||||
|
"../js/process.ts",
|
||||||
|
"../js/read_dir.ts",
|
||||||
|
"../js/read_file.ts",
|
||||||
|
"../js/read_link.ts",
|
||||||
|
"../js/remove.ts",
|
||||||
|
"../js/rename.ts",
|
||||||
|
"../js/repl.ts",
|
||||||
|
"../js/request.ts",
|
||||||
|
"../js/resources.ts",
|
||||||
|
"../js/stat.ts",
|
||||||
|
"../js/symlink.ts",
|
||||||
|
"../js/text_encoding.ts",
|
||||||
|
"../js/timers.ts",
|
||||||
|
"../js/truncate.ts",
|
||||||
|
"../js/type_directives.ts",
|
||||||
|
"../js/types.ts",
|
||||||
|
"../js/url.ts",
|
||||||
|
"../js/url_search_params.ts",
|
||||||
|
"../js/util.ts",
|
||||||
|
"../js/utime.ts",
|
||||||
|
"../js/version.ts",
|
||||||
|
"../js/window.ts",
|
||||||
|
"../js/workers.ts",
|
||||||
|
"../js/write_file.ts",
|
||||||
|
"../js/xeval.ts",
|
||||||
|
]
|
||||||
|
|
||||||
|
action("deno_cli_snapshots_build_run") {
|
||||||
|
script = "run.py"
|
||||||
|
inputs = ts_sources
|
||||||
|
outputs = [
|
||||||
|
"$root_out_dir/CLI_SNAPSHOT.bin",
|
||||||
|
"$root_out_dir/CLI_SNAPSHOT.js",
|
||||||
|
"$root_out_dir/CLI_SNAPSHOT.js.map",
|
||||||
|
"$root_out_dir/CLI_SNAPSHOT.d.ts",
|
||||||
|
"$root_out_dir/COMPILER_SNAPSHOT.bin",
|
||||||
|
"$root_out_dir/COMPILER_SNAPSHOT.js",
|
||||||
|
"$root_out_dir/COMPILER_SNAPSHOT.js.map",
|
||||||
|
"$root_out_dir/COMPILER_SNAPSHOT.d.ts",
|
||||||
|
]
|
||||||
|
args = [ rebase_path("$root_out_dir/deno_cli_snapshots_build", ".") ]
|
||||||
|
deps = [
|
||||||
|
":deno_cli_snapshots_build",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
rust_executable("deno_cli_snapshots_build") {
|
||||||
|
source_root = "build.rs"
|
||||||
|
extern = [
|
||||||
|
{
|
||||||
|
label = "../deno_typescript:deno_typescript"
|
||||||
|
crate_name = "deno_typescript"
|
||||||
|
crate_type = "rlib"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label = "../core:deno"
|
||||||
|
crate_name = "deno"
|
||||||
|
crate_type = "rlib"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
18
cli_snapshots/Cargo.toml
Normal file
18
cli_snapshots/Cargo.toml
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
[package]
|
||||||
|
name = "deno_cli_snapshots"
|
||||||
|
version = "0.0.3"
|
||||||
|
license = "MIT"
|
||||||
|
authors = ["Ryan Dahl <ry@tinyclouds.org>"]
|
||||||
|
edition = "2018"
|
||||||
|
description = "Provides snapshots for the deno CLI"
|
||||||
|
repository = "https://github.com/ry/deno_typescript"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "lib.rs"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
deno = { path = "../core" }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
deno_typescript = { path = "../deno_typescript", version = "0.0.3" }
|
||||||
|
|
9
cli_snapshots/README.md
Normal file
9
cli_snapshots/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
This is a small crate which exports just a few static blobs. It contains a
|
||||||
|
build.rs file which compiles Deno's internal JavaScript and TypeScript code
|
||||||
|
first into a single AMD bundle, and then into a binary V8 Snapshot.
|
||||||
|
|
||||||
|
The main Deno executable crate ("cli") depends on this crate and has access to
|
||||||
|
all the runtime code.
|
||||||
|
|
||||||
|
The //js/ directory should be moved as a sub-directory of this crate, to denote
|
||||||
|
the dependency structure. However, that is left to future work.
|
24
cli_snapshots/build.rs
Normal file
24
cli_snapshots/build.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
use std::env;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// To debug snapshot issues uncomment:
|
||||||
|
// deno_typescript::trace_serializer();
|
||||||
|
|
||||||
|
let c = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
|
||||||
|
let o = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||||
|
let js_dir = c.join("../js");
|
||||||
|
|
||||||
|
let root_names = vec![js_dir.join("main.ts")];
|
||||||
|
let bundle = o.join("CLI_SNAPSHOT.js");
|
||||||
|
let state = deno_typescript::compile_bundle(&bundle, root_names).unwrap();
|
||||||
|
assert!(bundle.exists());
|
||||||
|
deno_typescript::mksnapshot_bundle(&bundle, state).unwrap();
|
||||||
|
|
||||||
|
let root_names = vec![js_dir.join("compiler.ts")];
|
||||||
|
let bundle = o.join("COMPILER_SNAPSHOT.js");
|
||||||
|
let state = deno_typescript::compile_bundle(&bundle, root_names).unwrap();
|
||||||
|
assert!(bundle.exists());
|
||||||
|
deno_typescript::mksnapshot_bundle_ts(&bundle, state).unwrap();
|
||||||
|
}
|
43
cli_snapshots/lib.rs
Normal file
43
cli_snapshots/lib.rs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
pub static CLI_SNAPSHOT: &[u8] =
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/CLI_SNAPSHOT.bin"));
|
||||||
|
pub static CLI_SNAPSHOT_MAP: &[u8] =
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/CLI_SNAPSHOT.js.map"));
|
||||||
|
pub static CLI_SNAPSHOT_DTS: &[u8] =
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/CLI_SNAPSHOT.d.ts"));
|
||||||
|
|
||||||
|
pub static COMPILER_SNAPSHOT: &[u8] =
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/COMPILER_SNAPSHOT.bin"));
|
||||||
|
pub static COMPILER_SNAPSHOT_MAP: &[u8] =
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/COMPILER_SNAPSHOT.js.map"));
|
||||||
|
pub static COMPILER_SNAPSHOT_DTS: &[u8] =
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/COMPILER_SNAPSHOT.d.ts"));
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cli_snapshot() {
|
||||||
|
let mut isolate =
|
||||||
|
deno::Isolate::new(deno::StartupData::Snapshot(CLI_SNAPSHOT), false);
|
||||||
|
deno::js_check(isolate.execute(
|
||||||
|
"<anon>",
|
||||||
|
r#"
|
||||||
|
if (!window) {
|
||||||
|
throw Error("bad");
|
||||||
|
}
|
||||||
|
console.log("we have console.log!!!");
|
||||||
|
"#,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn compiler_snapshot() {
|
||||||
|
let mut isolate =
|
||||||
|
deno::Isolate::new(deno::StartupData::Snapshot(COMPILER_SNAPSHOT), false);
|
||||||
|
deno::js_check(isolate.execute(
|
||||||
|
"<anon>",
|
||||||
|
r#"
|
||||||
|
if (!compilerMain) {
|
||||||
|
throw Error("bad");
|
||||||
|
}
|
||||||
|
console.log(`ts version: ${ts.version}`);
|
||||||
|
"#,
|
||||||
|
));
|
||||||
|
}
|
15
cli_snapshots/run.py
Normal file
15
cli_snapshots/run.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
# This script is to execute build.rs during the GN build. See BUILD.gn.
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
d = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
exe = sys.argv[1]
|
||||||
|
env = os.environ.copy()
|
||||||
|
env["CARGO_MANIFEST_DIR"] = d
|
||||||
|
env["OUT_DIR"] = os.path.dirname(exe)
|
||||||
|
# To match the behavior of cargo, we need to cd into this directory.
|
||||||
|
os.chdir(d)
|
||||||
|
sys.exit(subprocess.call([exe], env=env))
|
|
@ -7,7 +7,6 @@ group("default") {
|
||||||
":deno_core_http_bench",
|
":deno_core_http_bench",
|
||||||
":deno_core_http_bench_test",
|
":deno_core_http_bench_test",
|
||||||
":deno_core_test",
|
":deno_core_test",
|
||||||
":snapshot_creator",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,14 +77,3 @@ rust_test("deno_core_http_bench_test") {
|
||||||
extern = http_bench_extern
|
extern = http_bench_extern
|
||||||
extern_rlib = http_bench_extern_rlib
|
extern_rlib = http_bench_extern_rlib
|
||||||
}
|
}
|
||||||
|
|
||||||
rust_executable("snapshot_creator") {
|
|
||||||
source_root = "snapshot_creator.rs"
|
|
||||||
extern = [
|
|
||||||
{
|
|
||||||
label = ":deno"
|
|
||||||
crate_name = "deno"
|
|
||||||
crate_type = "rlib"
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,12 +13,6 @@ repository = "https://github.com/denoland/deno"
|
||||||
[lib]
|
[lib]
|
||||||
path = "lib.rs"
|
path = "lib.rs"
|
||||||
|
|
||||||
# NOTE: The ninja build of snapshot_creator gets clobbered by 'cargo build' if
|
|
||||||
# the following is added. This breaks incremental 'cargo build'.
|
|
||||||
# [[bin]]
|
|
||||||
# name = "snapshot_creator"
|
|
||||||
# path = "snapshot_creator.rs"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
futures = "0.1.28"
|
futures = "0.1.28"
|
||||||
lazy_static = "1.3.0"
|
lazy_static = "1.3.0"
|
||||||
|
|
26
core/core.d.ts
vendored
26
core/core.d.ts
vendored
|
@ -1,26 +0,0 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
|
||||||
|
|
||||||
// This file contains APIs that are introduced into the global namespace by
|
|
||||||
// Deno core. These are not intended to be used directly by runtime users of
|
|
||||||
// Deno and therefore do not flow through to the runtime type library.
|
|
||||||
|
|
||||||
declare interface MessageCallback {
|
|
||||||
(opId: number, msg: Uint8Array): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare interface DenoCore {
|
|
||||||
dispatch(
|
|
||||||
opId: number,
|
|
||||||
control: Uint8Array,
|
|
||||||
zeroCopy?: ArrayBufferView | null
|
|
||||||
): Uint8Array | null;
|
|
||||||
setAsyncHandler(cb: MessageCallback): void;
|
|
||||||
sharedQueue: {
|
|
||||||
head(): number;
|
|
||||||
numRecords(): number;
|
|
||||||
size(): number;
|
|
||||||
push(buf: Uint8Array): boolean;
|
|
||||||
reset(): void;
|
|
||||||
shift(): Uint8Array | null;
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
// Note: This is a nearly identical rewrite of core/libdeno/snapshot_creator.cc
|
|
||||||
// but in Rust.
|
|
||||||
//
|
|
||||||
// This snapshot program is considered "basic" because the code being
|
|
||||||
// snapshotted cannot call ops.
|
|
||||||
|
|
||||||
extern crate deno;
|
|
||||||
|
|
||||||
use deno::js_check;
|
|
||||||
use deno::Isolate;
|
|
||||||
use deno::StartupData;
|
|
||||||
use std::env;
|
|
||||||
use std::io::Write;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let args: Vec<String> = env::args().collect();
|
|
||||||
// NOTE: `--help` arg will display V8 help and exit
|
|
||||||
let args = deno::v8_set_flags(args);
|
|
||||||
|
|
||||||
let (snapshot_out_bin, js_filename) = if args.len() == 3 {
|
|
||||||
(args[1].clone(), args[2].clone())
|
|
||||||
} else {
|
|
||||||
eprintln!("Usage: snapshot_creator <out_filename> <js_filename>");
|
|
||||||
std::process::exit(1);
|
|
||||||
};
|
|
||||||
|
|
||||||
let js_source =
|
|
||||||
std::fs::read(&js_filename).expect("couldn't read js_filename");
|
|
||||||
let js_source_str = std::str::from_utf8(&js_source).unwrap();
|
|
||||||
|
|
||||||
let will_snapshot = true;
|
|
||||||
let mut isolate = Isolate::new(StartupData::None, will_snapshot);
|
|
||||||
|
|
||||||
js_check(isolate.execute(&js_filename, js_source_str));
|
|
||||||
|
|
||||||
let snapshot = isolate.snapshot().expect("error snapshotting");
|
|
||||||
|
|
||||||
let mut out_file = std::fs::File::create(snapshot_out_bin).unwrap();
|
|
||||||
let snapshot_slice =
|
|
||||||
unsafe { std::slice::from_raw_parts(snapshot.data_ptr, snapshot.data_len) };
|
|
||||||
out_file
|
|
||||||
.write_all(snapshot_slice)
|
|
||||||
.expect("Failed to write snapshot file");
|
|
||||||
}
|
|
22
deno_typescript/BUILD.gn
Normal file
22
deno_typescript/BUILD.gn
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import("//build_extra/rust/rust.gni")
|
||||||
|
|
||||||
|
rust_rlib("deno_typescript") {
|
||||||
|
source_root = "lib.rs"
|
||||||
|
generated_source_dir = "."
|
||||||
|
extern = [
|
||||||
|
{
|
||||||
|
label = "../core:deno"
|
||||||
|
crate_name = "deno"
|
||||||
|
crate_type = "rlib"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label = "$rust_build:serde_derive"
|
||||||
|
crate_name = "serde_derive"
|
||||||
|
crate_type = "proc_macro"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
extern_rlib = [
|
||||||
|
"serde_json",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
}
|
16
deno_typescript/Cargo.toml
Normal file
16
deno_typescript/Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[package]
|
||||||
|
name = "deno_typescript"
|
||||||
|
version = "0.0.3"
|
||||||
|
license = "MIT"
|
||||||
|
description = "To compile TypeScript to a snapshot during build.rs"
|
||||||
|
repository = "https://github.com/ry/deno_typescript"
|
||||||
|
authors = ["Ryan Dahl <ry@tinyclouds.org>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
deno = { path = "../core" }
|
||||||
|
serde_json = "1.0"
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
8
deno_typescript/README.md
Normal file
8
deno_typescript/README.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
This crate provides utilies to compile typescript, bundle it up, and create a V8
|
||||||
|
snapshot, all during build. This allows users to startup fast.
|
||||||
|
|
||||||
|
The cli_snapshots crate, neighboring this one uses deno_typescript at build
|
||||||
|
time.
|
||||||
|
|
||||||
|
This crate does not depend on Node, Python, nor any other external dependencies
|
||||||
|
besides those listed as such in Cargo.toml.
|
39
deno_typescript/amd_runtime.js
Normal file
39
deno_typescript/amd_runtime.js
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
// A very very basic AMD preamble to support the output of TypeScript outFile
|
||||||
|
// bundles.
|
||||||
|
let require, define;
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
const modules = new Map();
|
||||||
|
|
||||||
|
function println(first, ...s) {
|
||||||
|
Deno.core.print(first + " " + s.map(JSON.stringify).join(" ") + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function createOrLoadModule(name) {
|
||||||
|
if (!modules.has(name)) {
|
||||||
|
const m = { name, exports: {} };
|
||||||
|
modules.set(name, m);
|
||||||
|
}
|
||||||
|
return modules.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
require = name => {
|
||||||
|
return createOrLoadModule(name).exports;
|
||||||
|
};
|
||||||
|
|
||||||
|
define = (name, deps, factory) => {
|
||||||
|
const currentModule = createOrLoadModule(name);
|
||||||
|
const localExports = currentModule.exports;
|
||||||
|
const args = deps.map(dep => {
|
||||||
|
if (dep === "require") {
|
||||||
|
return require;
|
||||||
|
} else if (dep === "exports") {
|
||||||
|
return localExports;
|
||||||
|
} else {
|
||||||
|
const depModule = createOrLoadModule(dep);
|
||||||
|
return depModule.exports;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
factory(...args);
|
||||||
|
};
|
||||||
|
})();
|
320
deno_typescript/compiler_main.js
Normal file
320
deno_typescript/compiler_main.js
Normal file
|
@ -0,0 +1,320 @@
|
||||||
|
// Because we're bootstrapping the TS compiler without dependencies on Node,
|
||||||
|
// this is written in JS.
|
||||||
|
|
||||||
|
const ASSETS = "$asset$";
|
||||||
|
|
||||||
|
let replacements;
|
||||||
|
|
||||||
|
function main(configText, rootNames, replacements_) {
|
||||||
|
println(`>>> ts version ${ts.version}`);
|
||||||
|
println(`>>> rootNames ${rootNames}`);
|
||||||
|
|
||||||
|
replacements = replacements_;
|
||||||
|
replacements["DENO_REPLACE_TS_VERSION"] = ts.version;
|
||||||
|
println(`>>> replacements ${JSON.stringify(replacements)}`);
|
||||||
|
|
||||||
|
const host = new Host();
|
||||||
|
|
||||||
|
assert(rootNames.length > 0);
|
||||||
|
|
||||||
|
let { options, diagnostics } = configure(configText);
|
||||||
|
handleDiagnostics(host, diagnostics);
|
||||||
|
|
||||||
|
println(`>>> TS config: ${JSON.stringify(options)}`);
|
||||||
|
|
||||||
|
const program = ts.createProgram(rootNames, options, host);
|
||||||
|
|
||||||
|
diagnostics = ts.getPreEmitDiagnostics(program).filter(({ code }) => {
|
||||||
|
// TS2691: An import path cannot end with a '.ts' extension. Consider
|
||||||
|
// importing 'bad-module' instead.
|
||||||
|
if (code === 2691) return false;
|
||||||
|
// TS5009: Cannot find the common subdirectory path for the input files.
|
||||||
|
if (code === 5009) return false;
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
handleDiagnostics(host, diagnostics);
|
||||||
|
|
||||||
|
const emitResult = program.emit();
|
||||||
|
handleDiagnostics(host, emitResult.diagnostics);
|
||||||
|
|
||||||
|
dispatch("setEmitResult", emitResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
function println(...s) {
|
||||||
|
Deno.core.print(s.join(" ") + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function unreachable() {
|
||||||
|
throw Error("unreachable");
|
||||||
|
}
|
||||||
|
|
||||||
|
function assert(cond) {
|
||||||
|
if (!cond) {
|
||||||
|
throw Error("assert");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// decode(Uint8Array): string
|
||||||
|
function decodeAscii(ui8) {
|
||||||
|
let out = "";
|
||||||
|
for (let i = 0; i < ui8.length; i++) {
|
||||||
|
out += String.fromCharCode(ui8[i]);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function encode(str) {
|
||||||
|
const charCodes = str.split("").map(c => c.charCodeAt(0));
|
||||||
|
const ui8 = new Uint8Array(charCodes);
|
||||||
|
return ui8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warning! The op_id values below are shared between this code and
|
||||||
|
// the Rust side. Update with care!
|
||||||
|
const ops = {
|
||||||
|
readFile: 49,
|
||||||
|
exit: 50,
|
||||||
|
writeFile: 51,
|
||||||
|
resolveModuleNames: 52,
|
||||||
|
setEmitResult: 53
|
||||||
|
};
|
||||||
|
|
||||||
|
// interface CompilerHost extends ModuleResolutionHost {
|
||||||
|
class Host {
|
||||||
|
// fileExists(fileName: string): boolean;
|
||||||
|
fileExists(fileName) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// readFile(fileName: string): string | undefined;
|
||||||
|
readFile() {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// trace?(s: string): void;
|
||||||
|
// directoryExists?(directoryName: string): boolean;
|
||||||
|
// realpath?(path: string): string;
|
||||||
|
// getCurrentDirectory?(): string;
|
||||||
|
// getDirectories?(path: string): string[];
|
||||||
|
|
||||||
|
// useCaseSensitiveFileNames(): boolean;
|
||||||
|
useCaseSensitiveFileNames() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// getDefaultLibFileName(options: CompilerOptions): string;
|
||||||
|
getDefaultLibFileName(options) {
|
||||||
|
return "lib.deno_core.d.ts";
|
||||||
|
}
|
||||||
|
|
||||||
|
// getDefaultLibLocation?(): string;
|
||||||
|
getDefaultLibLocation() {
|
||||||
|
return ASSETS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// getCurrentDirectory(): string;
|
||||||
|
getCurrentDirectory() {
|
||||||
|
return ".";
|
||||||
|
}
|
||||||
|
|
||||||
|
// getCanonicalFileName(fileName: string): string
|
||||||
|
getCanonicalFileName(fileName) {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?:
|
||||||
|
// (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile
|
||||||
|
// | undefined;
|
||||||
|
getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile) {
|
||||||
|
assert(!shouldCreateNewSourceFile); // We haven't yet encountered this.
|
||||||
|
|
||||||
|
// This hacks around the fact that TypeScript tries to magically guess the
|
||||||
|
// d.ts filename.
|
||||||
|
if (fileName.startsWith("$typeRoots$")) {
|
||||||
|
assert(fileName.startsWith("$typeRoots$/"));
|
||||||
|
assert(fileName.endsWith("/index.d.ts"));
|
||||||
|
fileName = fileName
|
||||||
|
.replace("$typeRoots$/", "")
|
||||||
|
.replace("/index.d.ts", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
let { sourceCode, moduleName } = dispatch("readFile", {
|
||||||
|
fileName,
|
||||||
|
languageVersion,
|
||||||
|
shouldCreateNewSourceFile
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO(ry) A terrible hack. Please remove ASAP.
|
||||||
|
if (fileName.endsWith("typescript.d.ts")) {
|
||||||
|
sourceCode = sourceCode.replace("export = ts;", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(ry) A terrible hack. Please remove ASAP.
|
||||||
|
for (let key of Object.keys(replacements)) {
|
||||||
|
let val = replacements[key];
|
||||||
|
sourceCode = sourceCode.replace(key, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
let sourceFile = ts.createSourceFile(fileName, sourceCode, languageVersion);
|
||||||
|
sourceFile.moduleName = moduleName;
|
||||||
|
return sourceFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
writeFile(
|
||||||
|
fileName: string,
|
||||||
|
data: string,
|
||||||
|
writeByteOrderMark: boolean,
|
||||||
|
onError?: (message: string) => void,
|
||||||
|
sourceFiles?: ReadonlyArray<ts.SourceFile>
|
||||||
|
): void
|
||||||
|
*/
|
||||||
|
writeFile(
|
||||||
|
fileName,
|
||||||
|
data,
|
||||||
|
writeByteOrderMark,
|
||||||
|
onError = null,
|
||||||
|
sourceFiles = null
|
||||||
|
) {
|
||||||
|
const moduleName = sourceFiles[sourceFiles.length - 1].moduleName;
|
||||||
|
return dispatch("writeFile", { fileName, moduleName, data });
|
||||||
|
}
|
||||||
|
|
||||||
|
// getSourceFileByPath?(fileName: string, path: Path, languageVersion: ScriptTarget, onError?: (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile | undefined;
|
||||||
|
getSourceFileByPath(
|
||||||
|
fileName,
|
||||||
|
path,
|
||||||
|
languageVersion,
|
||||||
|
onError,
|
||||||
|
shouldCreateNewSourceFile
|
||||||
|
) {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// getCancellationToken?(): CancellationToken;
|
||||||
|
getCancellationToken() {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// getCanonicalFileName(fileName: string): string;
|
||||||
|
getCanonicalFileName(fileName) {
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// getNewLine(): string
|
||||||
|
getNewLine() {
|
||||||
|
return "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// readDirectory?(rootDir: string, extensions: ReadonlyArray<string>, excludes: ReadonlyArray<string> | undefined, includes: ReadonlyArray<string>, depth?: number): string[];
|
||||||
|
readDirectory() {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolveModuleNames?(
|
||||||
|
// moduleNames: string[],
|
||||||
|
// containingFile: string,
|
||||||
|
// reusedNames?: string[],
|
||||||
|
// redirectedReference?: ResolvedProjectReference
|
||||||
|
// ): (ResolvedModule | undefined)[];
|
||||||
|
resolveModuleNames(moduleNames, containingFile) {
|
||||||
|
const resolvedNames = dispatch("resolveModuleNames", {
|
||||||
|
moduleNames,
|
||||||
|
containingFile
|
||||||
|
});
|
||||||
|
const r = resolvedNames.map(resolvedFileName => {
|
||||||
|
const extension = getExtension(resolvedFileName);
|
||||||
|
return { resolvedFileName, extension };
|
||||||
|
});
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolveTypeReferenceDirectives?(typeReferenceDirectiveNames: string[], containingFile: string, redirectedReference?: ResolvedProjectReference): (ResolvedTypeReferenceDirective | undefined)[];
|
||||||
|
/*
|
||||||
|
resolveTypeReferenceDirectives() {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getEnvironmentVariable?(name: string): string | undefined;
|
||||||
|
getEnvironmentVariable() {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// createHash?(data: string): string;
|
||||||
|
createHash() {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined;
|
||||||
|
getParsedCommandLine() {
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function configure(configurationText) {
|
||||||
|
const { config, error } = ts.parseConfigFileTextToJson(
|
||||||
|
"tsconfig.json",
|
||||||
|
configurationText
|
||||||
|
);
|
||||||
|
if (error) {
|
||||||
|
return { diagnostics: [error] };
|
||||||
|
}
|
||||||
|
const { options, errors } = ts.convertCompilerOptionsFromJson(
|
||||||
|
config.compilerOptions,
|
||||||
|
""
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
options,
|
||||||
|
diagnostics: errors.length ? errors : undefined
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function dispatch(opName, obj) {
|
||||||
|
const s = JSON.stringify(obj);
|
||||||
|
const msg = encode(s);
|
||||||
|
const resUi8 = Deno.core.dispatch(ops[opName], msg);
|
||||||
|
const resStr = decodeAscii(resUi8);
|
||||||
|
const res = JSON.parse(resStr);
|
||||||
|
if (!res["ok"]) {
|
||||||
|
throw Error(`${opName} failed ${res["err"]}. Args: ${JSON.stringify(obj)}`);
|
||||||
|
}
|
||||||
|
return res["ok"];
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit(code) {
|
||||||
|
dispatch("exit", { code });
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maximum number of diagnostics to display.
|
||||||
|
const MAX_ERRORS = 5;
|
||||||
|
|
||||||
|
function handleDiagnostics(host, diagnostics) {
|
||||||
|
if (diagnostics && diagnostics.length) {
|
||||||
|
let rest = 0;
|
||||||
|
if (diagnostics.length > MAX_ERRORS) {
|
||||||
|
rest = diagnostics.length - MAX_ERRORS;
|
||||||
|
diagnostics = diagnostics.slice(0, MAX_ERRORS);
|
||||||
|
}
|
||||||
|
const msg = ts.formatDiagnosticsWithColorAndContext(diagnostics, host);
|
||||||
|
println(msg);
|
||||||
|
if (rest) {
|
||||||
|
println(`And ${rest} other errors.`);
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the TypeScript Extension enum for a given media type. */
|
||||||
|
function getExtension(fileName) {
|
||||||
|
if (fileName.endsWith(".d.ts")) {
|
||||||
|
return ts.Extension.Dts;
|
||||||
|
} else if (fileName.endsWith(".ts")) {
|
||||||
|
return ts.Extension.Ts;
|
||||||
|
} else if (fileName.endsWith(".js")) {
|
||||||
|
return ts.Extension.Js;
|
||||||
|
} else {
|
||||||
|
throw TypeError(`Cannot resolve extension for ${fileName}`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,13 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
|
// This file contains APIs that are introduced into the global namespace by
|
||||||
|
// Deno core. These are not intended to be used directly by runtime users of
|
||||||
|
// Deno and therefore do not flow through to the runtime type library.
|
||||||
|
|
||||||
|
declare interface MessageCallback {
|
||||||
|
(opId: number, msg: Uint8Array): void;
|
||||||
|
}
|
||||||
|
|
||||||
interface EvalErrorInfo {
|
interface EvalErrorInfo {
|
||||||
// Is the object thrown a native Error?
|
// Is the object thrown a native Error?
|
||||||
isNativeError: boolean;
|
isNativeError: boolean;
|
||||||
|
@ -12,11 +20,23 @@ interface EvalErrorInfo {
|
||||||
thrown: any;
|
thrown: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare interface MessageCallback {
|
|
||||||
(opId: number, msg: Uint8Array): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare interface DenoCore {
|
declare interface DenoCore {
|
||||||
|
print(s: string, is_err?: boolean);
|
||||||
|
dispatch(
|
||||||
|
opId: number,
|
||||||
|
control: Uint8Array,
|
||||||
|
zeroCopy?: ArrayBufferView | null
|
||||||
|
): Uint8Array | null;
|
||||||
|
setAsyncHandler(cb: MessageCallback): void;
|
||||||
|
sharedQueue: {
|
||||||
|
head(): number;
|
||||||
|
numRecords(): number;
|
||||||
|
size(): number;
|
||||||
|
push(buf: Uint8Array): boolean;
|
||||||
|
reset(): void;
|
||||||
|
shift(): Uint8Array | null;
|
||||||
|
};
|
||||||
|
|
||||||
recv(cb: MessageCallback): void;
|
recv(cb: MessageCallback): void;
|
||||||
|
|
||||||
send(
|
send(
|
||||||
|
@ -39,3 +59,8 @@ declare interface DenoCore {
|
||||||
|
|
||||||
errorToJSON: (e: Error) => string;
|
errorToJSON: (e: Error) => string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare interface DenoInterface {
|
||||||
|
core: DenoCore;
|
||||||
|
}
|
||||||
|
declare var Deno: DenoInterface;
|
288
deno_typescript/lib.rs
Normal file
288
deno_typescript/lib.rs
Normal file
|
@ -0,0 +1,288 @@
|
||||||
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
extern crate deno;
|
||||||
|
extern crate serde;
|
||||||
|
extern crate serde_json;
|
||||||
|
|
||||||
|
mod ops;
|
||||||
|
use deno::js_check;
|
||||||
|
pub use deno::v8_set_flags;
|
||||||
|
use deno::ErrBox;
|
||||||
|
use deno::Isolate;
|
||||||
|
use deno::ModuleSpecifier;
|
||||||
|
use deno::StartupData;
|
||||||
|
pub use ops::EmitResult;
|
||||||
|
use ops::WrittenFile;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::fs;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
|
static TYPESCRIPT_CODE: &str =
|
||||||
|
include_str!("../third_party/node_modules/typescript/lib/typescript.js");
|
||||||
|
static COMPILER_CODE: &str = include_str!("compiler_main.js");
|
||||||
|
static AMD_RUNTIME_CODE: &str = include_str!("amd_runtime.js");
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct TSState {
|
||||||
|
bundle: bool,
|
||||||
|
exit_code: i32,
|
||||||
|
emit_result: Option<EmitResult>,
|
||||||
|
/// A list of files emitted by typescript. WrittenFile is tuple of the form
|
||||||
|
/// (url, corresponding_module, source_code)
|
||||||
|
written_files: Vec<WrittenFile>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TSState {
|
||||||
|
fn main_module_name(&self) -> String {
|
||||||
|
// Assuming that TypeScript has emitted the main file last.
|
||||||
|
self.written_files.last().unwrap().module_name.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct TSIsolate {
|
||||||
|
isolate: Isolate,
|
||||||
|
state: Arc<Mutex<TSState>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TSIsolate {
|
||||||
|
fn new(bundle: bool) -> TSIsolate {
|
||||||
|
let mut isolate = Isolate::new(StartupData::None, false);
|
||||||
|
js_check(isolate.execute("assets/typescript.js", TYPESCRIPT_CODE));
|
||||||
|
js_check(isolate.execute("compiler_main.js", COMPILER_CODE));
|
||||||
|
|
||||||
|
let state = Arc::new(Mutex::new(TSState {
|
||||||
|
bundle,
|
||||||
|
exit_code: 0,
|
||||||
|
emit_result: None,
|
||||||
|
written_files: Vec::new(),
|
||||||
|
}));
|
||||||
|
let state_ = state.clone();
|
||||||
|
isolate.set_dispatch(move |op_id, control_buf, zero_copy_buf| {
|
||||||
|
assert!(zero_copy_buf.is_none()); // zero_copy_buf unused in compiler.
|
||||||
|
let mut s = state_.lock().unwrap();
|
||||||
|
ops::dispatch_op(&mut s, op_id, control_buf)
|
||||||
|
});
|
||||||
|
TSIsolate { isolate, state }
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(ry) Instead of Result<Arc<Mutex<TSState>>, ErrBox>, return something
|
||||||
|
// like Result<TSState, ErrBox>. I think it would be nicer if this function
|
||||||
|
// consumes TSIsolate.
|
||||||
|
/// Compiles each module to ESM. Doesn't write any files to disk.
|
||||||
|
/// Passes all output via state.
|
||||||
|
fn compile(
|
||||||
|
mut self,
|
||||||
|
config_json: &serde_json::Value,
|
||||||
|
root_names: Vec<String>,
|
||||||
|
) -> Result<Arc<Mutex<TSState>>, ErrBox> {
|
||||||
|
let root_names_json = serde_json::json!(root_names).to_string();
|
||||||
|
let source = &format!(
|
||||||
|
"main({:?}, {}, {})",
|
||||||
|
config_json.to_string(),
|
||||||
|
root_names_json,
|
||||||
|
preprocessor_replacements_json()
|
||||||
|
);
|
||||||
|
self.isolate.execute("<anon>", source)?;
|
||||||
|
Ok(self.state.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn compile_bundle(
|
||||||
|
bundle: &Path,
|
||||||
|
root_names: Vec<PathBuf>,
|
||||||
|
) -> Result<Arc<Mutex<TSState>>, ErrBox> {
|
||||||
|
let ts_isolate = TSIsolate::new(true);
|
||||||
|
|
||||||
|
let config_json = serde_json::json!({
|
||||||
|
"compilerOptions": {
|
||||||
|
"declaration": true,
|
||||||
|
"lib": ["esnext"],
|
||||||
|
"module": "amd",
|
||||||
|
"target": "esnext",
|
||||||
|
"listFiles": true,
|
||||||
|
"listEmittedFiles": true,
|
||||||
|
// "types" : ["typescript.d.ts"],
|
||||||
|
"typeRoots" : ["$typeRoots$"],
|
||||||
|
// Emit the source alongside the sourcemaps within a single file;
|
||||||
|
// requires --inlineSourceMap or --sourceMap to be set.
|
||||||
|
// "inlineSources": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"outFile": bundle,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut root_names_str: Vec<String> = root_names
|
||||||
|
.iter()
|
||||||
|
.map(|p| {
|
||||||
|
if !p.exists() {
|
||||||
|
panic!("File not found {}", p.display());
|
||||||
|
}
|
||||||
|
|
||||||
|
let module_specifier =
|
||||||
|
ModuleSpecifier::resolve_url_or_path(&p.to_string_lossy()).unwrap();
|
||||||
|
module_specifier.as_str().to_string()
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
root_names_str.push("$asset$/lib.deno_core.d.ts".to_string());
|
||||||
|
|
||||||
|
// TODO lift js_check to caller?
|
||||||
|
let state = js_check(ts_isolate.compile(&config_json, root_names_str));
|
||||||
|
|
||||||
|
Ok(state)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn print_source_code(code: &str) {
|
||||||
|
let mut i = 1;
|
||||||
|
for line in code.lines() {
|
||||||
|
println!("{:3} {}", i, line);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a V8 snapshot.
|
||||||
|
pub fn mksnapshot_bundle(
|
||||||
|
bundle: &Path,
|
||||||
|
state: Arc<Mutex<TSState>>,
|
||||||
|
) -> Result<(), ErrBox> {
|
||||||
|
let mut runtime_isolate = Isolate::new(StartupData::None, true);
|
||||||
|
let source_code_vec = std::fs::read(bundle)?;
|
||||||
|
let source_code = std::str::from_utf8(&source_code_vec)?;
|
||||||
|
|
||||||
|
js_check(runtime_isolate.execute("amd_runtime.js", AMD_RUNTIME_CODE));
|
||||||
|
js_check(runtime_isolate.execute(&bundle.to_string_lossy(), &source_code));
|
||||||
|
|
||||||
|
let main = state.lock().unwrap().main_module_name();
|
||||||
|
js_check(runtime_isolate.execute("anon", &format!("require('{}')", main)));
|
||||||
|
|
||||||
|
write_snapshot(runtime_isolate, bundle)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a V8 snapshot. This differs from mksnapshot_bundle in that is also
|
||||||
|
/// runs typescript.js
|
||||||
|
pub fn mksnapshot_bundle_ts(
|
||||||
|
bundle: &Path,
|
||||||
|
state: Arc<Mutex<TSState>>,
|
||||||
|
) -> Result<(), ErrBox> {
|
||||||
|
let mut runtime_isolate = Isolate::new(StartupData::None, true);
|
||||||
|
let source_code_vec = std::fs::read(bundle)?;
|
||||||
|
let source_code = std::str::from_utf8(&source_code_vec)?;
|
||||||
|
|
||||||
|
js_check(runtime_isolate.execute("amd_runtime.js", AMD_RUNTIME_CODE));
|
||||||
|
js_check(runtime_isolate.execute("typescript.js", TYPESCRIPT_CODE));
|
||||||
|
js_check(runtime_isolate.execute(&bundle.to_string_lossy(), &source_code));
|
||||||
|
|
||||||
|
let main = state.lock().unwrap().main_module_name();
|
||||||
|
js_check(runtime_isolate.execute("anon", &format!("require('{}')", main)));
|
||||||
|
|
||||||
|
write_snapshot(runtime_isolate, bundle)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write_snapshot(
|
||||||
|
runtime_isolate: Isolate,
|
||||||
|
bundle: &Path,
|
||||||
|
) -> Result<(), ErrBox> {
|
||||||
|
println!("creating snapshot...");
|
||||||
|
let snapshot = runtime_isolate.snapshot()?;
|
||||||
|
let snapshot_slice =
|
||||||
|
unsafe { std::slice::from_raw_parts(snapshot.data_ptr, snapshot.data_len) };
|
||||||
|
println!("snapshot bytes {}", snapshot_slice.len());
|
||||||
|
|
||||||
|
let snapshot_path = bundle.with_extension("bin");
|
||||||
|
|
||||||
|
fs::write(&snapshot_path, snapshot_slice)?;
|
||||||
|
println!("snapshot path {} ", snapshot_path.display());
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! inc {
|
||||||
|
($e:expr) => {
|
||||||
|
Some(include_str!(concat!(
|
||||||
|
"../third_party/node_modules/typescript/lib/",
|
||||||
|
$e
|
||||||
|
)))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Same as get_asset() but returns NotFound intead of None.
|
||||||
|
pub fn get_asset2(name: &str) -> Result<&'static str, ErrBox> {
|
||||||
|
match get_asset(name) {
|
||||||
|
Some(a) => Ok(a),
|
||||||
|
None => Err(
|
||||||
|
std::io::Error::new(std::io::ErrorKind::NotFound, "Asset not found")
|
||||||
|
.into(),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_asset(name: &str) -> Option<&'static str> {
|
||||||
|
match name {
|
||||||
|
"lib.deno_core.d.ts" => Some(include_str!("lib.deno_core.d.ts")),
|
||||||
|
"lib.esnext.d.ts" => inc!("lib.esnext.d.ts"),
|
||||||
|
"lib.es2019.d.ts" => inc!("lib.es2019.d.ts"),
|
||||||
|
"lib.es2018.d.ts" => inc!("lib.es2018.d.ts"),
|
||||||
|
"lib.es2017.d.ts" => inc!("lib.es2017.d.ts"),
|
||||||
|
"lib.es2016.d.ts" => inc!("lib.es2016.d.ts"),
|
||||||
|
"lib.es5.d.ts" => inc!("lib.es5.d.ts"),
|
||||||
|
"lib.es2015.d.ts" => inc!("lib.es2015.d.ts"),
|
||||||
|
"lib.es2015.core.d.ts" => inc!("lib.es2015.core.d.ts"),
|
||||||
|
"lib.es2015.collection.d.ts" => inc!("lib.es2015.collection.d.ts"),
|
||||||
|
"lib.es2015.generator.d.ts" => inc!("lib.es2015.generator.d.ts"),
|
||||||
|
"lib.es2015.iterable.d.ts" => inc!("lib.es2015.iterable.d.ts"),
|
||||||
|
"lib.es2015.promise.d.ts" => inc!("lib.es2015.promise.d.ts"),
|
||||||
|
"lib.es2015.symbol.d.ts" => inc!("lib.es2015.symbol.d.ts"),
|
||||||
|
"lib.es2015.proxy.d.ts" => inc!("lib.es2015.proxy.d.ts"),
|
||||||
|
"lib.es2015.symbol.wellknown.d.ts" => {
|
||||||
|
inc!("lib.es2015.symbol.wellknown.d.ts")
|
||||||
|
}
|
||||||
|
"lib.es2015.reflect.d.ts" => inc!("lib.es2015.reflect.d.ts"),
|
||||||
|
"lib.es2016.array.include.d.ts" => inc!("lib.es2016.array.include.d.ts"),
|
||||||
|
"lib.es2017.object.d.ts" => inc!("lib.es2017.object.d.ts"),
|
||||||
|
"lib.es2017.sharedmemory.d.ts" => inc!("lib.es2017.sharedmemory.d.ts"),
|
||||||
|
"lib.es2017.string.d.ts" => inc!("lib.es2017.string.d.ts"),
|
||||||
|
"lib.es2017.intl.d.ts" => inc!("lib.es2017.intl.d.ts"),
|
||||||
|
"lib.es2017.typedarrays.d.ts" => inc!("lib.es2017.typedarrays.d.ts"),
|
||||||
|
"lib.es2018.asynciterable.d.ts" => inc!("lib.es2018.asynciterable.d.ts"),
|
||||||
|
"lib.es2018.promise.d.ts" => inc!("lib.es2018.promise.d.ts"),
|
||||||
|
"lib.es2018.regexp.d.ts" => inc!("lib.es2018.regexp.d.ts"),
|
||||||
|
"lib.es2018.intl.d.ts" => inc!("lib.es2018.intl.d.ts"),
|
||||||
|
"lib.es2019.array.d.ts" => inc!("lib.es2019.array.d.ts"),
|
||||||
|
"lib.es2019.object.d.ts" => inc!("lib.es2019.object.d.ts"),
|
||||||
|
"lib.es2019.string.d.ts" => inc!("lib.es2019.string.d.ts"),
|
||||||
|
"lib.es2019.symbol.d.ts" => inc!("lib.es2019.symbol.d.ts"),
|
||||||
|
"lib.esnext.bigint.d.ts" => inc!("lib.esnext.bigint.d.ts"),
|
||||||
|
"lib.esnext.intl.d.ts" => inc!("lib.esnext.intl.d.ts"),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the --trace-serializer V8 flag for debugging snapshots.
|
||||||
|
pub fn trace_serializer() {
|
||||||
|
let dummy = "foo".to_string();
|
||||||
|
let r =
|
||||||
|
deno::v8_set_flags(vec![dummy.clone(), "--trace-serializer".to_string()]);
|
||||||
|
assert_eq!(r, vec![dummy]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn preprocessor_replacements_json() -> String {
|
||||||
|
/// BUILD_OS and BUILD_ARCH match the values in Deno.build. See js/build.ts.
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
static BUILD_OS: &str = "mac";
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
static BUILD_OS: &str = "linux";
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
static BUILD_OS: &str = "win";
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
static BUILD_ARCH: &str = "x64";
|
||||||
|
|
||||||
|
let mut replacements = HashMap::new();
|
||||||
|
replacements.insert("DENO_REPLACE_OS", BUILD_OS);
|
||||||
|
replacements.insert("DENO_REPLACE_ARCH", BUILD_ARCH);
|
||||||
|
serde_json::json!(replacements).to_string()
|
||||||
|
}
|
141
deno_typescript/ops.rs
Normal file
141
deno_typescript/ops.rs
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
use crate::TSState;
|
||||||
|
use deno::CoreOp;
|
||||||
|
use deno::ErrBox;
|
||||||
|
use deno::ModuleSpecifier;
|
||||||
|
use deno::Op;
|
||||||
|
use deno::OpId;
|
||||||
|
use serde::Deserialize;
|
||||||
|
use serde_json::json;
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct WrittenFile {
|
||||||
|
pub url: String,
|
||||||
|
pub module_name: String,
|
||||||
|
pub source_code: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dispatch2(
|
||||||
|
s: &mut TSState,
|
||||||
|
op_id: OpId,
|
||||||
|
control_buf: &[u8],
|
||||||
|
) -> Result<Value, ErrBox> {
|
||||||
|
let v = serde_json::from_slice(control_buf)?;
|
||||||
|
// Warning! The op_id values below are shared between this code and
|
||||||
|
// compiler_main.js. Update with care!
|
||||||
|
match op_id {
|
||||||
|
49 => read_file(s, v),
|
||||||
|
50 => exit(s, v),
|
||||||
|
51 => write_file(s, v),
|
||||||
|
52 => resolve_module_names(s, v),
|
||||||
|
53 => set_emit_result(s, v),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dispatch_op(s: &mut TSState, op_id: OpId, control_buf: &[u8]) -> CoreOp {
|
||||||
|
let result = dispatch2(s, op_id, control_buf);
|
||||||
|
let response = match result {
|
||||||
|
Ok(v) => json!({ "ok": v }),
|
||||||
|
Err(err) => json!({ "err": err.to_string() }),
|
||||||
|
};
|
||||||
|
let x = serde_json::to_string(&response).unwrap();
|
||||||
|
let vec = x.into_bytes();
|
||||||
|
Op::Sync(vec.into_boxed_slice())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct ReadFile {
|
||||||
|
file_name: String,
|
||||||
|
language_version: Option<i32>,
|
||||||
|
should_create_new_source_file: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_file(_s: &mut TSState, v: Value) -> Result<Value, ErrBox> {
|
||||||
|
let v: ReadFile = serde_json::from_value(v)?;
|
||||||
|
let (module_name, source_code) = if v.file_name.starts_with("$asset$/") {
|
||||||
|
let asset = v.file_name.replace("$asset$/", "");
|
||||||
|
let source_code = crate::get_asset2(&asset)?.to_string();
|
||||||
|
(asset, source_code)
|
||||||
|
} else {
|
||||||
|
assert!(!v.file_name.starts_with("$assets$"), "you meant $asset$");
|
||||||
|
let module_specifier = ModuleSpecifier::resolve_url_or_path(&v.file_name)?;
|
||||||
|
let path = module_specifier.as_url().to_file_path().unwrap();
|
||||||
|
println!("cargo:rerun-if-changed={}", path.display());
|
||||||
|
(
|
||||||
|
module_specifier.as_str().to_string(),
|
||||||
|
std::fs::read_to_string(&path)?,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
Ok(json!({
|
||||||
|
"moduleName": module_name,
|
||||||
|
"sourceCode": source_code,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct WriteFile {
|
||||||
|
file_name: String,
|
||||||
|
data: String,
|
||||||
|
module_name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write_file(s: &mut TSState, v: Value) -> Result<Value, ErrBox> {
|
||||||
|
let v: WriteFile = serde_json::from_value(v)?;
|
||||||
|
let module_specifier = ModuleSpecifier::resolve_url_or_path(&v.file_name)?;
|
||||||
|
if s.bundle {
|
||||||
|
std::fs::write(&v.file_name, &v.data)?;
|
||||||
|
}
|
||||||
|
s.written_files.push(WrittenFile {
|
||||||
|
url: module_specifier.as_str().to_string(),
|
||||||
|
module_name: v.module_name,
|
||||||
|
source_code: v.data,
|
||||||
|
});
|
||||||
|
Ok(json!(true))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct ResolveModuleNames {
|
||||||
|
module_names: Vec<String>,
|
||||||
|
containing_file: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve_module_names(_s: &mut TSState, v: Value) -> Result<Value, ErrBox> {
|
||||||
|
let v: ResolveModuleNames = serde_json::from_value(v).unwrap();
|
||||||
|
let mut resolved = Vec::<String>::new();
|
||||||
|
let referrer = ModuleSpecifier::resolve_url_or_path(&v.containing_file)?;
|
||||||
|
for specifier in v.module_names {
|
||||||
|
let ms = ModuleSpecifier::resolve_import(&specifier, referrer.as_str())?;
|
||||||
|
resolved.push(ms.as_str().to_string());
|
||||||
|
}
|
||||||
|
Ok(json!(resolved))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct Exit {
|
||||||
|
code: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn exit(s: &mut TSState, v: Value) -> Result<Value, ErrBox> {
|
||||||
|
let v: Exit = serde_json::from_value(v)?;
|
||||||
|
s.exit_code = v.code;
|
||||||
|
std::process::exit(v.code)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct EmitResult {
|
||||||
|
pub emit_skipped: bool,
|
||||||
|
pub diagnostics: Vec<String>,
|
||||||
|
pub emitted_files: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_emit_result(s: &mut TSState, v: Value) -> Result<Value, ErrBox> {
|
||||||
|
let v: EmitResult = serde_json::from_value(v)?;
|
||||||
|
s.emit_result = Some(v);
|
||||||
|
Ok(json!(true))
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import { containsOnlyASCII, hasOwnProperty } from "./util";
|
import { containsOnlyASCII, hasOwnProperty } from "./util.ts";
|
||||||
import { TextEncoder } from "./text_encoding";
|
import { TextEncoder } from "./text_encoding.ts";
|
||||||
import { build } from "./build";
|
import { build } from "./build.ts";
|
||||||
|
|
||||||
export const bytesSymbol = Symbol("bytes");
|
export const bytesSymbol = Symbol("bytes");
|
||||||
|
|
||||||
|
|
10
js/body.ts
10
js/body.ts
|
@ -1,8 +1,8 @@
|
||||||
import * as formData from "./form_data";
|
import * as formData from "./form_data.ts";
|
||||||
import * as blob from "./blob";
|
import * as blob from "./blob.ts";
|
||||||
import * as encoding from "./text_encoding";
|
import * as encoding from "./text_encoding.ts";
|
||||||
import * as headers from "./headers";
|
import * as headers from "./headers.ts";
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
|
|
||||||
const { Headers } = headers;
|
const { Headers } = headers;
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved. BSD license.
|
// Copyright 2009 The Go Authors. All rights reserved. BSD license.
|
||||||
// https://github.com/golang/go/blob/master/LICENSE
|
// https://github.com/golang/go/blob/master/LICENSE
|
||||||
|
|
||||||
import { Reader, Writer, EOF, SyncReader, SyncWriter } from "./io";
|
import { Reader, Writer, EOF, SyncReader, SyncWriter } from "./io.ts";
|
||||||
import { assert } from "./util";
|
import { assert } from "./util.ts";
|
||||||
import { TextDecoder } from "./text_encoding";
|
import { TextDecoder } from "./text_encoding.ts";
|
||||||
import { DenoError, ErrorKind } from "./errors";
|
import { DenoError, ErrorKind } from "./errors.ts";
|
||||||
|
|
||||||
// MIN_READ is the minimum ArrayBuffer size passed to a read call by
|
// MIN_READ is the minimum ArrayBuffer size passed to a read call by
|
||||||
// buffer.ReadFrom. As long as the Buffer has at least MIN_READ bytes beyond
|
// buffer.ReadFrom. As long as the Buffer has at least MIN_READ bytes beyond
|
||||||
|
|
|
@ -18,9 +18,9 @@ export interface BuildInfo {
|
||||||
export const build: BuildInfo = {
|
export const build: BuildInfo = {
|
||||||
// These string will be replaced by rollup
|
// These string will be replaced by rollup
|
||||||
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
||||||
arch: `ROLLUP_REPLACE_ARCH` as any,
|
arch: `DENO_REPLACE_ARCH` as any,
|
||||||
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
||||||
os: `ROLLUP_REPLACE_OS` as any
|
os: `DENO_REPLACE_OS` as any
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(kevinkassimo): deprecate Deno.platform
|
// TODO(kevinkassimo): deprecate Deno.platform
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/** Changes the permission of a specific file/directory of specified path
|
/** Changes the permission of a specific file/directory of specified path
|
||||||
* synchronously.
|
* synchronously.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change owner of a regular file or directory synchronously. Unix only at the moment.
|
* Change owner of a regular file or directory synchronously. Unix only at the moment.
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
// TODO(kitsonk) Replace with `deno_std/colors/mod.ts` when we can load modules
|
// TODO(kitsonk) Replace with `deno_std/colors/mod.ts` when we can load modules
|
||||||
// which end in `.ts`.
|
// which end in `.ts`.
|
||||||
|
|
||||||
import { noColor } from "./os";
|
import { noColor } from "./deno.ts";
|
||||||
|
|
||||||
interface Code {
|
interface Code {
|
||||||
open: string;
|
open: string;
|
||||||
|
|
|
@ -1,20 +1,25 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as ts from "typescript";
|
// TODO(ry) Combine this implementation with //deno_typescript/compiler_main.js
|
||||||
import { bold, cyan, yellow } from "./colors";
|
|
||||||
import { Console } from "./console";
|
/// <reference types="../third_party/node_modules/typescript/lib/typescript.d.ts"/>
|
||||||
import { core } from "./core";
|
|
||||||
import { Diagnostic, fromTypeScriptDiagnostic } from "./diagnostics";
|
import "./globals.ts";
|
||||||
import { cwd } from "./dir";
|
|
||||||
import * as dispatch from "./dispatch";
|
import { bold, cyan, yellow } from "./colors.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { Console } from "./console.ts";
|
||||||
import * as os from "./os";
|
import { core } from "./core.ts";
|
||||||
import { TextEncoder } from "./text_encoding";
|
import { Diagnostic, fromTypeScriptDiagnostic } from "./diagnostics.ts";
|
||||||
import { getMappedModuleName, parseTypeDirectives } from "./type_directives";
|
import { cwd } from "./dir.ts";
|
||||||
import { assert, notImplemented } from "./util";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import * as util from "./util";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
import { window } from "./window";
|
import * as os from "./os.ts";
|
||||||
import { postMessage, workerClose, workerMain } from "./workers";
|
import { TextEncoder } from "./text_encoding.ts";
|
||||||
import { writeFileSync } from "./write_file";
|
import { getMappedModuleName, parseTypeDirectives } from "./type_directives.ts";
|
||||||
|
import { assert, notImplemented } from "./util.ts";
|
||||||
|
import * as util from "./util.ts";
|
||||||
|
import { window } from "./window.ts";
|
||||||
|
import { postMessage, workerClose, workerMain } from "./workers.ts";
|
||||||
|
import { writeFileSync } from "./write_file.ts";
|
||||||
|
|
||||||
// Warning! The values in this enum are duplicated in cli/msg.rs
|
// Warning! The values in this enum are duplicated in cli/msg.rs
|
||||||
// Update carefully!
|
// Update carefully!
|
||||||
|
@ -31,9 +36,10 @@ enum MediaType {
|
||||||
const console = new Console(core.print);
|
const console = new Console(core.print);
|
||||||
window.console = console;
|
window.console = console;
|
||||||
window.workerMain = workerMain;
|
window.workerMain = workerMain;
|
||||||
export default function denoMain(): void {
|
function denoMain(): void {
|
||||||
os.start(true, "TS");
|
os.start(true, "TS");
|
||||||
}
|
}
|
||||||
|
window["denoMain"] = denoMain;
|
||||||
|
|
||||||
const ASSETS = "$asset$";
|
const ASSETS = "$asset$";
|
||||||
const OUT_DIR = "$deno$";
|
const OUT_DIR = "$deno$";
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { isTypedArray } from "./util";
|
import { isTypedArray } from "./util.ts";
|
||||||
import { TypedArray } from "./types";
|
import { TypedArray } from "./types.ts";
|
||||||
import { TextEncoder } from "./text_encoding";
|
import { TextEncoder } from "./text_encoding.ts";
|
||||||
import { File, stdout } from "./files";
|
import { File, stdout } from "./files.ts";
|
||||||
import { cliTable } from "./console_table";
|
import { cliTable } from "./console_table.ts";
|
||||||
|
|
||||||
type ConsoleContext = Set<unknown>;
|
type ConsoleContext = Set<unknown>;
|
||||||
type ConsoleOptions = Partial<{
|
type ConsoleOptions = Partial<{
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright Joyent, Inc. and other Node contributors. MIT license.
|
// Copyright Joyent, Inc. and other Node contributors. MIT license.
|
||||||
// Forked from Node's lib/internal/cli_table.js
|
// Forked from Node's lib/internal/cli_table.js
|
||||||
|
|
||||||
import { TextEncoder } from "./text_encoding";
|
import { TextEncoder } from "./text_encoding.ts";
|
||||||
import { hasOwnProperty } from "./util";
|
import { hasOwnProperty } from "./util.ts";
|
||||||
|
|
||||||
const encoder = new TextEncoder();
|
const encoder = new TextEncoder();
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/** Copies the contents of a file to another by name synchronously.
|
/** Copies the contents of a file to another by name synchronously.
|
||||||
* Creates a new file if target does not exists, and if target exists,
|
* Creates a new file if target does not exists, and if target exists,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
|
|
||||||
// This allows us to access core in API even if we
|
// This allows us to access core in API even if we
|
||||||
// dispose window.Deno
|
// dispose window.Deno
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import * as event from "./event";
|
import * as event from "./event.ts";
|
||||||
import { getPrivateValue, requiredArguments } from "./util";
|
import { getPrivateValue, requiredArguments } from "./util.ts";
|
||||||
|
|
||||||
// WeakMaps are recommended for private attributes (see MDN link below)
|
// WeakMaps are recommended for private attributes (see MDN link below)
|
||||||
// https://developer.mozilla.org/en-US/docs/Archive/Add-ons/Add-on_SDK/Guides/Contributor_s_Guide/Private_Properties#Using_WeakMaps
|
// https://developer.mozilla.org/en-US/docs/Archive/Add-ons/Add-on_SDK/Guides/Contributor_s_Guide/Private_Properties#Using_WeakMaps
|
||||||
|
|
90
js/deno.ts
90
js/deno.ts
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
// Public deno module.
|
// Public deno module.
|
||||||
export { noColor, pid, env, exit, isTTY, execPath, homeDir } from "./os";
|
export { env, exit, isTTY, execPath, homeDir } from "./os.ts";
|
||||||
export { chdir, cwd } from "./dir";
|
export { chdir, cwd } from "./dir.ts";
|
||||||
export {
|
export {
|
||||||
File,
|
File,
|
||||||
open,
|
open,
|
||||||
|
@ -18,7 +18,7 @@ export {
|
||||||
seekSync,
|
seekSync,
|
||||||
close,
|
close,
|
||||||
OpenMode
|
OpenMode
|
||||||
} from "./files";
|
} from "./files.ts";
|
||||||
export {
|
export {
|
||||||
EOF,
|
EOF,
|
||||||
copy,
|
copy,
|
||||||
|
@ -37,40 +37,46 @@ export {
|
||||||
WriteSeeker,
|
WriteSeeker,
|
||||||
ReadWriteCloser,
|
ReadWriteCloser,
|
||||||
ReadWriteSeeker
|
ReadWriteSeeker
|
||||||
} from "./io";
|
} from "./io.ts";
|
||||||
export { Buffer, readAll, readAllSync, writeAll, writeAllSync } from "./buffer";
|
export {
|
||||||
export { mkdirSync, mkdir } from "./mkdir";
|
Buffer,
|
||||||
|
readAll,
|
||||||
|
readAllSync,
|
||||||
|
writeAll,
|
||||||
|
writeAllSync
|
||||||
|
} from "./buffer.ts";
|
||||||
|
export { mkdirSync, mkdir } from "./mkdir.ts";
|
||||||
export {
|
export {
|
||||||
makeTempDirSync,
|
makeTempDirSync,
|
||||||
makeTempDir,
|
makeTempDir,
|
||||||
MakeTempDirOptions
|
MakeTempDirOptions
|
||||||
} from "./make_temp_dir";
|
} from "./make_temp_dir.ts";
|
||||||
export { chmodSync, chmod } from "./chmod";
|
export { chmodSync, chmod } from "./chmod.ts";
|
||||||
export { chownSync, chown } from "./chown";
|
export { chownSync, chown } from "./chown.ts";
|
||||||
export { utimeSync, utime } from "./utime";
|
export { utimeSync, utime } from "./utime.ts";
|
||||||
export { removeSync, remove, RemoveOption } from "./remove";
|
export { removeSync, remove, RemoveOption } from "./remove.ts";
|
||||||
export { renameSync, rename } from "./rename";
|
export { renameSync, rename } from "./rename.ts";
|
||||||
export { readFileSync, readFile } from "./read_file";
|
export { readFileSync, readFile } from "./read_file.ts";
|
||||||
export { readDirSync, readDir } from "./read_dir";
|
export { readDirSync, readDir } from "./read_dir.ts";
|
||||||
export { copyFileSync, copyFile } from "./copy_file";
|
export { copyFileSync, copyFile } from "./copy_file.ts";
|
||||||
export { readlinkSync, readlink } from "./read_link";
|
export { readlinkSync, readlink } from "./read_link.ts";
|
||||||
export { statSync, lstatSync, stat, lstat } from "./stat";
|
export { statSync, lstatSync, stat, lstat } from "./stat.ts";
|
||||||
export { linkSync, link } from "./link";
|
export { linkSync, link } from "./link.ts";
|
||||||
export { symlinkSync, symlink } from "./symlink";
|
export { symlinkSync, symlink } from "./symlink.ts";
|
||||||
export { writeFileSync, writeFile, WriteFileOptions } from "./write_file";
|
export { writeFileSync, writeFile, WriteFileOptions } from "./write_file.ts";
|
||||||
export { applySourceMap } from "./error_stack";
|
export { applySourceMap } from "./error_stack.ts";
|
||||||
export { ErrorKind, DenoError } from "./errors";
|
export { ErrorKind, DenoError } from "./errors.ts";
|
||||||
export {
|
export {
|
||||||
permissions,
|
permissions,
|
||||||
revokePermission,
|
revokePermission,
|
||||||
Permission,
|
Permission,
|
||||||
Permissions
|
Permissions
|
||||||
} from "./permissions";
|
} from "./permissions.ts";
|
||||||
export { truncateSync, truncate } from "./truncate";
|
export { truncateSync, truncate } from "./truncate.ts";
|
||||||
export { FileInfo } from "./file_info";
|
export { FileInfo } from "./file_info.ts";
|
||||||
export { connect, dial, listen, Listener, Conn } from "./net";
|
export { connect, dial, listen, Listener, Conn } from "./net.ts";
|
||||||
export { metrics, Metrics } from "./metrics";
|
export { metrics, Metrics } from "./metrics.ts";
|
||||||
export { resources } from "./resources";
|
export { resources } from "./resources.ts";
|
||||||
export {
|
export {
|
||||||
kill,
|
kill,
|
||||||
run,
|
run,
|
||||||
|
@ -78,23 +84,35 @@ export {
|
||||||
Process,
|
Process,
|
||||||
ProcessStatus,
|
ProcessStatus,
|
||||||
Signal
|
Signal
|
||||||
} from "./process";
|
} from "./process.ts";
|
||||||
export { inspect, customInspect } from "./console";
|
export { inspect, customInspect } from "./console.ts";
|
||||||
export { build, platform, OperatingSystem, Arch } from "./build";
|
export { build, platform, OperatingSystem, Arch } from "./build.ts";
|
||||||
export { version } from "./version";
|
export { version } from "./version.ts";
|
||||||
export const args: string[] = [];
|
export const args: string[] = [];
|
||||||
|
|
||||||
// These are internal Deno APIs. We are marking them as internal so they do not
|
// These are internal Deno APIs. We are marking them as internal so they do not
|
||||||
// appear in the runtime type library.
|
// appear in the runtime type library.
|
||||||
/** @internal */
|
/** @internal */
|
||||||
export { core } from "./core";
|
export { core } from "./core.ts";
|
||||||
|
|
||||||
/** @internal */
|
/** @internal */
|
||||||
export { setPrepareStackTrace } from "./error_stack";
|
export { setPrepareStackTrace } from "./error_stack.ts";
|
||||||
|
|
||||||
// TODO Don't expose Console nor stringifyArgs.
|
// TODO Don't expose Console nor stringifyArgs.
|
||||||
/** @internal */
|
/** @internal */
|
||||||
export { Console, stringifyArgs } from "./console";
|
export { Console, stringifyArgs } from "./console.ts";
|
||||||
// TODO Don't expose DomIterableMixin.
|
// TODO Don't expose DomIterableMixin.
|
||||||
/** @internal */
|
/** @internal */
|
||||||
export { DomIterableMixin } from "./mixins/dom_iterable";
|
export { DomIterableMixin } from "./mixins/dom_iterable.ts";
|
||||||
|
|
||||||
|
/** The current process id of the runtime. */
|
||||||
|
export let pid: number;
|
||||||
|
|
||||||
|
/** Reflects the NO_COLOR environment variable: https://no-color.org/ */
|
||||||
|
export let noColor: boolean;
|
||||||
|
|
||||||
|
// TODO(ry) This should not be exposed to Deno.
|
||||||
|
export function _setGlobals(pid_: number, noColor_: boolean): void {
|
||||||
|
pid = pid_;
|
||||||
|
noColor = noColor_;
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
// compiler, which is strongly influenced by the format of TypeScript
|
// compiler, which is strongly influenced by the format of TypeScript
|
||||||
// diagnostics.
|
// diagnostics.
|
||||||
|
|
||||||
import * as ts from "typescript";
|
/// <reference types="../third_party/node_modules/typescript/lib/typescript.d.ts"/>
|
||||||
|
|
||||||
/** The log category for a diagnostic message */
|
/** The log category for a diagnostic message */
|
||||||
export enum DiagnosticCategory {
|
export enum DiagnosticCategory {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `cwd()` Return a string representing the current working directory.
|
* `cwd()` Return a string representing the current working directory.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as minimal from "./dispatch_minimal";
|
import * as minimal from "./dispatch_minimal.ts";
|
||||||
import * as json from "./dispatch_json";
|
import * as json from "./dispatch_json.ts";
|
||||||
|
|
||||||
// These consts are shared with Rust. Update with care.
|
// These consts are shared with Rust. Update with care.
|
||||||
export const OP_READ = 1;
|
export const OP_READ = 1;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as util from "./util";
|
import * as util from "./util.ts";
|
||||||
import { TextEncoder, TextDecoder } from "./text_encoding";
|
import { TextEncoder, TextDecoder } from "./text_encoding.ts";
|
||||||
import { core } from "./core";
|
import { core } from "./core.ts";
|
||||||
import { ErrorKind, DenoError } from "./errors";
|
import { ErrorKind, DenoError } from "./errors.ts";
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
type Ok = any;
|
type Ok = any;
|
||||||
|
|
|
@ -2,9 +2,9 @@ import { testPerm, assertMatch, unreachable } from "./test_util.ts";
|
||||||
|
|
||||||
const openErrorStackPattern = new RegExp(
|
const openErrorStackPattern = new RegExp(
|
||||||
`^.*
|
`^.*
|
||||||
at unwrapResponse \\(js\\/dispatch_json\\.ts:.*\\)
|
at unwrapResponse \\(.*dispatch_json\\.ts:.*\\)
|
||||||
at sendAsync.* \\(js\\/dispatch_json\\.ts:.*\\)
|
at Object.sendAsync \\(.*dispatch_json\\.ts:.*\\)
|
||||||
at async Object\\.open \\(js\\/files\\.ts:.*\\).*$`,
|
at async Object\\.open \\(.*files\\.ts:.*\\).*$`,
|
||||||
"ms"
|
"ms"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as util from "./util";
|
import * as util from "./util.ts";
|
||||||
import { core } from "./core";
|
import { core } from "./core.ts";
|
||||||
|
|
||||||
const promiseTableMin = new Map<number, util.Resolvable<number>>();
|
const promiseTableMin = new Map<number, util.Resolvable<number>>();
|
||||||
// Note it's important that promiseId starts at 1 instead of 0, because sync
|
// Note it's important that promiseId starts at 1 instead of 0, because sync
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import * as blob from "./blob";
|
import * as blob from "./blob.ts";
|
||||||
|
|
||||||
// TODO Rename this to DomFileImpl
|
// TODO Rename this to DomFileImpl
|
||||||
export class DenoFile extends blob.DenoBlob implements domTypes.DomFile {
|
export class DenoFile extends blob.DenoBlob implements domTypes.DomFile {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
// Utility functions for DOM nodes
|
// Utility functions for DOM nodes
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
|
|
||||||
export function isNode(nodeImpl: domTypes.EventTarget | null): boolean {
|
export function isNode(nodeImpl: domTypes.EventTarget | null): boolean {
|
||||||
return Boolean(nodeImpl && "nodeType" in nodeImpl);
|
return Boolean(nodeImpl && "nodeType" in nodeImpl);
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
// Some of the code here is adapted directly from V8 and licensed under a BSD
|
// Some of the code here is adapted directly from V8 and licensed under a BSD
|
||||||
// style license available here: https://github.com/v8/v8/blob/24886f2d1c565287d33d71e4109a53bf0b54b75c/LICENSE.v8
|
// style license available here: https://github.com/v8/v8/blob/24886f2d1c565287d33d71e4109a53bf0b54b75c/LICENSE.v8
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
import { assert } from "./util";
|
import { assert } from "./util.ts";
|
||||||
|
|
||||||
export interface Location {
|
export interface Location {
|
||||||
/** The full url for the module, e.g. `file://some/file.ts` or
|
/** The full url for the module, e.g. `file://some/file.ts` or
|
||||||
|
|
|
@ -90,22 +90,19 @@ test(function prepareStackTrace(): void {
|
||||||
structuredStackTrace: CallSite[]
|
structuredStackTrace: CallSite[]
|
||||||
) => string = MockError.prepareStackTrace;
|
) => string = MockError.prepareStackTrace;
|
||||||
const result = prepareStackTrace(new Error("foo"), [
|
const result = prepareStackTrace(new Error("foo"), [
|
||||||
getMockCallSite("gen/cli/bundle/main.js", 23, 0)
|
getMockCallSite("CLI_SNAPSHOT.js", 23, 0)
|
||||||
]);
|
]);
|
||||||
assert(result.startsWith("Error: foo\n"));
|
assert(result.startsWith("Error: foo\n"));
|
||||||
assert(
|
assert(result.includes(".ts:"), "should remap to something in 'js/'");
|
||||||
result.includes("<anonymous> (js/"),
|
|
||||||
"should remap to something in 'js/'"
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test(function applySourceMap(): void {
|
test(function applySourceMap(): void {
|
||||||
const result = Deno.applySourceMap({
|
const result = Deno.applySourceMap({
|
||||||
filename: "gen/cli/bundle/main.js",
|
filename: "CLI_SNAPSHOT.js",
|
||||||
line: 23,
|
line: 23,
|
||||||
column: 0
|
column: 0
|
||||||
});
|
});
|
||||||
assert(result.filename.startsWith("js/"));
|
assert(result.filename.endsWith(".ts"));
|
||||||
assert(result.line != null);
|
assert(result.line != null);
|
||||||
assert(result.column != null);
|
assert(result.column != null);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import { getPrivateValue, requiredArguments } from "./util";
|
import { getPrivateValue, requiredArguments } from "./util.ts";
|
||||||
|
|
||||||
// WeakMaps are recommended for private attributes (see MDN link below)
|
// WeakMaps are recommended for private attributes (see MDN link below)
|
||||||
// https://developer.mozilla.org/en-US/docs/Archive/Add-ons/Add-on_SDK/Guides/Contributor_s_Guide/Private_Properties#Using_WeakMaps
|
// https://developer.mozilla.org/en-US/docs/Archive/Add-ons/Add-on_SDK/Guides/Contributor_s_Guide/Private_Properties#Using_WeakMaps
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import { DenoError, ErrorKind } from "./errors";
|
import { DenoError, ErrorKind } from "./errors.ts";
|
||||||
import { hasOwnProperty, requiredArguments } from "./util";
|
import { hasOwnProperty, requiredArguments } from "./util.ts";
|
||||||
import {
|
import {
|
||||||
getRoot,
|
getRoot,
|
||||||
isNode,
|
isNode,
|
||||||
|
@ -9,7 +9,7 @@ import {
|
||||||
isShadowInclusiveAncestor,
|
isShadowInclusiveAncestor,
|
||||||
isSlotable,
|
isSlotable,
|
||||||
retarget
|
retarget
|
||||||
} from "./dom_util";
|
} from "./dom_util.ts";
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#get-the-parent
|
// https://dom.spec.whatwg.org/#get-the-parent
|
||||||
// Note: Nodes, shadow roots, and documents override this algorithm so we set it to null.
|
// Note: Nodes, shadow roots, and documents override this algorithm so we set it to null.
|
||||||
|
|
29
js/fetch.ts
29
js/fetch.ts
|
@ -1,16 +1,21 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { assert, createResolvable, notImplemented, isTypedArray } from "./util";
|
import {
|
||||||
import * as domTypes from "./dom_types";
|
assert,
|
||||||
import { TextDecoder, TextEncoder } from "./text_encoding";
|
createResolvable,
|
||||||
import { DenoBlob, bytesSymbol as blobBytesSymbol } from "./blob";
|
notImplemented,
|
||||||
import { Headers } from "./headers";
|
isTypedArray
|
||||||
import * as io from "./io";
|
} from "./util.ts";
|
||||||
import { read, close } from "./files";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import { Buffer } from "./buffer";
|
import { TextDecoder, TextEncoder } from "./text_encoding.ts";
|
||||||
import { FormData } from "./form_data";
|
import { DenoBlob, bytesSymbol as blobBytesSymbol } from "./blob.ts";
|
||||||
import { URLSearchParams } from "./url_search_params";
|
import { Headers } from "./headers.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as io from "./io.ts";
|
||||||
import { sendAsync } from "./dispatch_json";
|
import { read, close } from "./files.ts";
|
||||||
|
import { Buffer } from "./buffer.ts";
|
||||||
|
import { FormData } from "./form_data.ts";
|
||||||
|
import { URLSearchParams } from "./url_search_params.ts";
|
||||||
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
import { sendAsync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
function getHeaderValueParams(value: string): Map<string, string> {
|
function getHeaderValueParams(value: string): Map<string, string> {
|
||||||
const params = new Map();
|
const params = new Map();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { StatResponse } from "./stat";
|
import { StatResponse } from "./stat.ts";
|
||||||
|
|
||||||
/** A FileInfo describes a file and is returned by `stat`, `lstat`,
|
/** A FileInfo describes a file and is returned by `stat`, `lstat`,
|
||||||
* `statSync`, `lstatSync`.
|
* `statSync`, `lstatSync`.
|
||||||
|
|
|
@ -9,13 +9,13 @@ import {
|
||||||
SyncReader,
|
SyncReader,
|
||||||
SyncWriter,
|
SyncWriter,
|
||||||
SyncSeeker
|
SyncSeeker
|
||||||
} from "./io";
|
} from "./io.ts";
|
||||||
import { sendAsyncMinimal, sendSyncMinimal } from "./dispatch_minimal";
|
import { sendAsyncMinimal, sendSyncMinimal } from "./dispatch_minimal.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import {
|
import {
|
||||||
sendSync as sendSyncJson,
|
sendSync as sendSyncJson,
|
||||||
sendAsync as sendAsyncJson
|
sendAsync as sendAsyncJson
|
||||||
} from "./dispatch_json";
|
} from "./dispatch_json.ts";
|
||||||
|
|
||||||
/** Open a file and return an instance of the `File` object
|
/** Open a file and return an instance of the `File` object
|
||||||
* synchronously.
|
* synchronously.
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import * as blob from "./blob";
|
import * as blob from "./blob.ts";
|
||||||
import * as domFile from "./dom_file";
|
import * as domFile from "./dom_file.ts";
|
||||||
import { DomIterableMixin } from "./mixins/dom_iterable";
|
import { DomIterableMixin } from "./mixins/dom_iterable.ts";
|
||||||
import { requiredArguments } from "./util";
|
import { requiredArguments } from "./util.ts";
|
||||||
|
|
||||||
const dataSymbol = Symbol("data");
|
const dataSymbol = Symbol("data");
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
// TODO(bartlomieju): move to `repl.ts`?
|
// TODO(bartlomieju): move to `repl.ts`?
|
||||||
export function formatError(errString: string): string {
|
export function formatError(errString: string): string {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
import { assert } from "./util";
|
import { assert } from "./util.ts";
|
||||||
|
|
||||||
/** Synchronously collects cryptographically secure random values. The
|
/** Synchronously collects cryptographically secure random values. The
|
||||||
* underlying CSPRNG in use is Rust's `rand::rngs::ThreadRng`.
|
* underlying CSPRNG in use is Rust's `rand::rngs::ThreadRng`.
|
||||||
|
|
|
@ -7,31 +7,31 @@
|
||||||
// Modules which will make up part of the global public API surface should be
|
// Modules which will make up part of the global public API surface should be
|
||||||
// imported as namespaces, so when the runtime type library is generated they
|
// imported as namespaces, so when the runtime type library is generated they
|
||||||
// can be expressed as a namespace in the type library.
|
// can be expressed as a namespace in the type library.
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
import * as blob from "./blob";
|
import * as blob from "./blob.ts";
|
||||||
import * as consoleTypes from "./console";
|
import * as consoleTypes from "./console.ts";
|
||||||
import * as csprng from "./get_random_values";
|
import * as csprng from "./get_random_values.ts";
|
||||||
import * as customEvent from "./custom_event";
|
import * as customEvent from "./custom_event.ts";
|
||||||
import * as Deno from "./deno";
|
import * as Deno from "./deno.ts";
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import * as domFile from "./dom_file";
|
import * as domFile from "./dom_file.ts";
|
||||||
import * as event from "./event";
|
import * as event from "./event.ts";
|
||||||
import * as eventTarget from "./event_target";
|
import * as eventTarget from "./event_target.ts";
|
||||||
import * as formData from "./form_data";
|
import * as formData from "./form_data.ts";
|
||||||
import * as fetchTypes from "./fetch";
|
import * as fetchTypes from "./fetch.ts";
|
||||||
import * as headers from "./headers";
|
import * as headers from "./headers.ts";
|
||||||
import * as textEncoding from "./text_encoding";
|
import * as textEncoding from "./text_encoding.ts";
|
||||||
import * as timers from "./timers";
|
import * as timers from "./timers.ts";
|
||||||
import * as url from "./url";
|
import * as url from "./url.ts";
|
||||||
import * as urlSearchParams from "./url_search_params";
|
import * as urlSearchParams from "./url_search_params.ts";
|
||||||
import * as workers from "./workers";
|
import * as workers from "./workers.ts";
|
||||||
import * as performanceUtil from "./performance";
|
import * as performanceUtil from "./performance.ts";
|
||||||
|
|
||||||
import * as request from "./request";
|
import * as request from "./request.ts";
|
||||||
|
|
||||||
// These imports are not exposed and therefore are fine to just import the
|
// These imports are not exposed and therefore are fine to just import the
|
||||||
// symbols required.
|
// symbols required.
|
||||||
import { core } from "./core";
|
import { core } from "./core.ts";
|
||||||
|
|
||||||
// During the build process, augmentations to the variable `window` in this
|
// During the build process, augmentations to the variable `window` in this
|
||||||
// file are tracked and created as part of default library that is built into
|
// file are tracked and created as part of default library that is built into
|
||||||
|
@ -72,7 +72,6 @@ window.window = window;
|
||||||
// properties when building the runtime type library, as the whole module
|
// properties when building the runtime type library, as the whole module
|
||||||
// is flattened into a single namespace.
|
// is flattened into a single namespace.
|
||||||
window.Deno = Deno;
|
window.Deno = Deno;
|
||||||
Object.freeze(window.Deno);
|
|
||||||
|
|
||||||
// Globally available functions and object instances.
|
// Globally available functions and object instances.
|
||||||
window.atob = textEncoding.atob;
|
window.atob = textEncoding.atob;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import { DomIterableMixin } from "./mixins/dom_iterable";
|
import { DomIterableMixin } from "./mixins/dom_iterable.ts";
|
||||||
import { requiredArguments } from "./util";
|
import { requiredArguments } from "./util.ts";
|
||||||
|
|
||||||
// From node-fetch
|
// From node-fetch
|
||||||
// Copyright (c) 2016 David Frank. MIT License.
|
// Copyright (c) 2016 David Frank. MIT License.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/** Synchronously creates `newname` as a hard link to `oldname`.
|
/** Synchronously creates `newname` as a hard link to `oldname`.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { URL } from "./url";
|
import { URL } from "./url.ts";
|
||||||
import { notImplemented } from "./util";
|
import { notImplemented } from "./util.ts";
|
||||||
import { Location } from "./dom_types";
|
import { Location } from "./dom_types.ts";
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
|
|
||||||
export class LocationImpl implements Location {
|
export class LocationImpl implements Location {
|
||||||
constructor(url: string) {
|
constructor(url: string) {
|
||||||
|
|
40
js/main.ts
40
js/main.ts
|
@ -1,36 +1,29 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-triple-slash-reference
|
import "./globals.ts";
|
||||||
/// <reference path="./plugins.d.ts" />
|
|
||||||
|
|
||||||
import "./globals";
|
import { assert, log } from "./util.ts";
|
||||||
|
import * as os from "./os.ts";
|
||||||
|
import { args } from "./deno.ts";
|
||||||
|
import { setPrepareStackTrace } from "./error_stack.ts";
|
||||||
|
import { replLoop } from "./repl.ts";
|
||||||
|
import { xevalMain, XevalFunc } from "./xeval.ts";
|
||||||
|
import { setVersions } from "./version.ts";
|
||||||
|
import { window } from "./window.ts";
|
||||||
|
import { setLocation } from "./location.ts";
|
||||||
|
import * as Deno from "./deno.ts";
|
||||||
|
|
||||||
import { assert, log } from "./util";
|
function denoMain(preserveDenoNamespace: boolean = true, name?: string): void {
|
||||||
import * as os from "./os";
|
|
||||||
import { args } from "./deno";
|
|
||||||
import { setPrepareStackTrace } from "./error_stack";
|
|
||||||
import { replLoop } from "./repl";
|
|
||||||
import { xevalMain, XevalFunc } from "./xeval";
|
|
||||||
import { setVersions } from "./version";
|
|
||||||
import { window } from "./window";
|
|
||||||
import { setLocation } from "./location";
|
|
||||||
|
|
||||||
// builtin modules
|
|
||||||
import * as deno from "./deno";
|
|
||||||
|
|
||||||
export default function denoMain(
|
|
||||||
preserveDenoNamespace: boolean = true,
|
|
||||||
name?: string
|
|
||||||
): void {
|
|
||||||
const s = os.start(preserveDenoNamespace, name);
|
const s = os.start(preserveDenoNamespace, name);
|
||||||
|
|
||||||
setVersions(s.denoVersion, s.v8Version);
|
setVersions(s.denoVersion, s.v8Version);
|
||||||
|
|
||||||
// handle `--version`
|
// handle `--version`
|
||||||
if (s.versionFlag) {
|
if (s.versionFlag) {
|
||||||
console.log("deno:", deno.version.deno);
|
const { console } = window;
|
||||||
console.log("v8:", deno.version.v8);
|
console.log("deno:", Deno.version.deno);
|
||||||
console.log("typescript:", deno.version.typescript);
|
console.log("v8:", Deno.version.v8);
|
||||||
|
console.log("typescript:", Deno.version.typescript);
|
||||||
os.exit(0);
|
os.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,3 +48,4 @@ export default function denoMain(
|
||||||
replLoop();
|
replLoop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
window["denoMain"] = denoMain;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
export interface MakeTempDirOptions {
|
export interface MakeTempDirOptions {
|
||||||
dir?: string;
|
dir?: string;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
export interface Metrics {
|
export interface Metrics {
|
||||||
opsDispatched: number;
|
opsDispatched: number;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
import { DomIterable } from "../dom_types";
|
import { DomIterable } from "../dom_types.ts";
|
||||||
import { window } from "../window";
|
import { window } from "../window.ts";
|
||||||
import { requiredArguments } from "../util";
|
import { requiredArguments } from "../util.ts";
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
type Constructor<T = {}> = new (...args: any[]) => T;
|
type Constructor<T = {}> = new (...args: any[]) => T;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/** Creates a new directory with the specified path synchronously.
|
/** Creates a new directory with the specified path synchronously.
|
||||||
* If `recursive` is set to true, nested directories will be created (also known
|
* If `recursive` is set to true, nested directories will be created (also known
|
||||||
|
|
10
js/net.ts
10
js/net.ts
|
@ -1,9 +1,9 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { EOF, Reader, Writer, Closer } from "./io";
|
import { EOF, Reader, Writer, Closer } from "./io.ts";
|
||||||
import { notImplemented } from "./util";
|
import { notImplemented } from "./util.ts";
|
||||||
import { read, write, close } from "./files";
|
import { read, write, close } from "./files.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
export type Network = "tcp";
|
export type Network = "tcp";
|
||||||
// TODO support other types:
|
// TODO support other types:
|
||||||
|
|
31
js/os.ts
31
js/os.ts
|
@ -1,22 +1,13 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { core } from "./core";
|
import { core } from "./core.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
import { assert } from "./util";
|
import { assert } from "./util.ts";
|
||||||
import * as util from "./util";
|
import * as util from "./util.ts";
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
|
|
||||||
/** The current process id of the runtime. */
|
// builtin modules
|
||||||
export let pid: number;
|
import { _setGlobals } from "./deno.ts";
|
||||||
|
|
||||||
/** Reflects the NO_COLOR environment variable: https://no-color.org/ */
|
|
||||||
export let noColor: boolean;
|
|
||||||
|
|
||||||
function setGlobals(pid_: number, noColor_: boolean): void {
|
|
||||||
assert(!pid);
|
|
||||||
pid = pid_;
|
|
||||||
noColor = noColor_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Check if running in terminal.
|
/** Check if running in terminal.
|
||||||
*
|
*
|
||||||
|
@ -85,7 +76,11 @@ export function start(preserveDenoNamespace = true, source?: string): Start {
|
||||||
|
|
||||||
util.setLogDebug(s.debugFlag, source);
|
util.setLogDebug(s.debugFlag, source);
|
||||||
|
|
||||||
setGlobals(s.pid, s.noColor);
|
// pid and noColor need to be set in the Deno module before it's set to be
|
||||||
|
// frozen.
|
||||||
|
_setGlobals(s.pid, s.noColor);
|
||||||
|
delete window.Deno._setGlobals;
|
||||||
|
Object.freeze(window.Deno);
|
||||||
|
|
||||||
if (preserveDenoNamespace) {
|
if (preserveDenoNamespace) {
|
||||||
util.immutableDefine(window, "Deno", window.Deno);
|
util.immutableDefine(window, "Deno", window.Deno);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
interface NowResponse {
|
interface NowResponse {
|
||||||
seconds: number;
|
seconds: number;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
/** Permissions as granted by the caller */
|
/** Permissions as granted by the caller */
|
||||||
export interface Permissions {
|
export interface Permissions {
|
||||||
|
|
9
js/plugins.d.ts
vendored
9
js/plugins.d.ts
vendored
|
@ -1,9 +0,0 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
|
||||||
|
|
||||||
// This allows TypeScript to resolve any modules that end with `!string`
|
|
||||||
// as there is a rollup plugin that will take any mids ending with `!string`
|
|
||||||
// and return them as a string to rollup for inlining
|
|
||||||
declare module "*!string" {
|
|
||||||
const value: string;
|
|
||||||
export default value;
|
|
||||||
}
|
|
|
@ -1,11 +1,11 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { File, close } from "./files";
|
import { File, close } from "./files.ts";
|
||||||
import { ReadCloser, WriteCloser } from "./io";
|
import { ReadCloser, WriteCloser } from "./io.ts";
|
||||||
import { readAll } from "./buffer";
|
import { readAll } from "./buffer.ts";
|
||||||
import { assert, unreachable } from "./util";
|
import { assert, unreachable } from "./util.ts";
|
||||||
import { platform } from "./build";
|
import { platform } from "./build.ts";
|
||||||
|
|
||||||
/** How to handle subprocess stdio.
|
/** How to handle subprocess stdio.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { FileInfo, FileInfoImpl } from "./file_info";
|
import { FileInfo, FileInfoImpl } from "./file_info.ts";
|
||||||
import { StatResponse } from "./stat";
|
import { StatResponse } from "./stat.ts";
|
||||||
|
|
||||||
interface ReadDirResponse {
|
interface ReadDirResponse {
|
||||||
entries: StatResponse[];
|
entries: StatResponse[];
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { open, openSync } from "./files";
|
import { open, openSync } from "./files.ts";
|
||||||
import { readAll, readAllSync } from "./buffer";
|
import { readAll, readAllSync } from "./buffer.ts";
|
||||||
|
|
||||||
/** Read the entire contents of a file synchronously.
|
/** Read the entire contents of a file synchronously.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/** Returns the destination of the named symbolic link synchronously.
|
/** Returns the destination of the named symbolic link synchronously.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
export interface RemoveOption {
|
export interface RemoveOption {
|
||||||
recursive?: boolean;
|
recursive?: boolean;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
/** Synchronously renames (moves) `oldpath` to `newpath`. If `newpath` already
|
/** Synchronously renames (moves) `oldpath` to `newpath`. If `newpath` already
|
||||||
* exists and is not a directory, `renameSync()` replaces it. OS-specific
|
* exists and is not a directory, `renameSync()` replaces it. OS-specific
|
||||||
|
|
18
js/repl.ts
18
js/repl.ts
|
@ -1,12 +1,14 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { close } from "./files";
|
import { close } from "./files.ts";
|
||||||
import { exit } from "./os";
|
import { exit } from "./os.ts";
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
import { core } from "./core";
|
import { core } from "./core.ts";
|
||||||
import { formatError } from "./format_error";
|
import { formatError } from "./format_error.ts";
|
||||||
import { stringifyArgs } from "./console";
|
import { stringifyArgs } from "./console.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
|
const { console } = window;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* REPL logging.
|
* REPL logging.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as headers from "./headers";
|
import * as headers from "./headers.ts";
|
||||||
import * as body from "./body";
|
import * as body from "./body.ts";
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
|
|
||||||
const { Headers } = headers;
|
const { Headers } = headers;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync } from "./dispatch_json";
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
export interface ResourceMap {
|
export interface ResourceMap {
|
||||||
[rid: number]: string;
|
[rid: number]: string;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { FileInfo, FileInfoImpl } from "./file_info";
|
import { FileInfo, FileInfoImpl } from "./file_info.ts";
|
||||||
|
|
||||||
export interface StatResponse {
|
export interface StatResponse {
|
||||||
isFile: boolean;
|
isFile: boolean;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import * as util from "./util";
|
import * as util from "./util.ts";
|
||||||
import { platform } from "./build";
|
import { platform } from "./build.ts";
|
||||||
|
|
||||||
/** Synchronously creates `newname` as a symbolic link to `oldname`. The type
|
/** Synchronously creates `newname` as a symbolic link to `oldname`. The type
|
||||||
* argument can be set to `dir` or `file` and is only available on Windows
|
* argument can be set to `dir` or `file` and is only available on Windows
|
||||||
|
|
|
@ -23,9 +23,9 @@
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
// OTHER DEALINGS IN THE SOFTWARE.
|
// OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
import * as base64 from "./base64";
|
import * as base64 from "./base64.ts";
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import { DenoError, ErrorKind } from "./errors";
|
import { DenoError, ErrorKind } from "./errors.ts";
|
||||||
|
|
||||||
const CONTINUE = null;
|
const CONTINUE = null;
|
||||||
const END_OF_STREAM = -1;
|
const END_OF_STREAM = -1;
|
||||||
|
|
10
js/timers.ts
10
js/timers.ts
|
@ -1,8 +1,10 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { assert } from "./util";
|
import { assert } from "./util.ts";
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
|
const { console } = window;
|
||||||
|
|
||||||
interface Timer {
|
interface Timer {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
|
||||||
function coerceLen(len?: number): number {
|
function coerceLen(len?: number): number {
|
||||||
if (!len) {
|
if (!len) {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import * as urlSearchParams from "./url_search_params";
|
import * as urlSearchParams from "./url_search_params.ts";
|
||||||
import * as domTypes from "./dom_types";
|
import * as domTypes from "./dom_types.ts";
|
||||||
import { getRandomValues } from "./get_random_values";
|
import { getRandomValues } from "./get_random_values.ts";
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
|
|
||||||
interface URLParts {
|
interface URLParts {
|
||||||
protocol: string;
|
protocol: string;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { URL } from "./url";
|
import { URL } from "./url.ts";
|
||||||
import { requiredArguments, isIterable } from "./util";
|
import { requiredArguments, isIterable } from "./util.ts";
|
||||||
|
|
||||||
export class URLSearchParams {
|
export class URLSearchParams {
|
||||||
private params: Array<[string, string]> = [];
|
private params: Array<[string, string]> = [];
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { TypedArray } from "./types";
|
import { TypedArray } from "./types.ts";
|
||||||
|
import { window } from "./window.ts";
|
||||||
|
const { console } = window;
|
||||||
|
|
||||||
let logDebug = false;
|
let logDebug = false;
|
||||||
let logSource = "JS";
|
let logSource = "JS";
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { sendSync, sendAsync } from "./dispatch_json";
|
import { sendSync, sendAsync } from "./dispatch_json.ts";
|
||||||
import { OP_UTIME } from "./dispatch";
|
import { OP_UTIME } from "./dispatch.ts";
|
||||||
|
|
||||||
function toSecondsFromEpoch(v: number | Date): number {
|
function toSecondsFromEpoch(v: number | Date): number {
|
||||||
return v instanceof Date ? v.valueOf() / 1000 : v;
|
return v instanceof Date ? v.valueOf() / 1000 : v;
|
||||||
|
|
|
@ -9,7 +9,7 @@ export const version: Version = {
|
||||||
deno: "",
|
deno: "",
|
||||||
v8: "",
|
v8: "",
|
||||||
// This string will be replaced by rollup
|
// This string will be replaced by rollup
|
||||||
typescript: `ROLLUP_REPLACE_TS_VERSION`
|
typescript: `DENO_REPLACE_TS_VERSION`
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
import * as dispatch from "./dispatch";
|
import * as dispatch from "./dispatch.ts";
|
||||||
import { sendAsync, sendSync } from "./dispatch_json";
|
import { sendAsync, sendSync } from "./dispatch_json.ts";
|
||||||
import { log } from "./util";
|
import { log } from "./util.ts";
|
||||||
import { TextDecoder, TextEncoder } from "./text_encoding";
|
import { TextDecoder, TextEncoder } from "./text_encoding.ts";
|
||||||
import { window } from "./window";
|
import { window } from "./window.ts";
|
||||||
import { blobURLMap } from "./url";
|
import { blobURLMap } from "./url.ts";
|
||||||
import { blobBytesWeakMap } from "./blob";
|
import { blobBytesWeakMap } from "./blob.ts";
|
||||||
|
|
||||||
const encoder = new TextEncoder();
|
const encoder = new TextEncoder();
|
||||||
const decoder = new TextDecoder();
|
const decoder = new TextDecoder();
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import { stat, statSync } from "./stat";
|
import { stat, statSync } from "./stat.ts";
|
||||||
import { open, openSync } from "./files";
|
import { open, openSync } from "./files.ts";
|
||||||
import { chmod, chmodSync } from "./chmod";
|
import { chmod, chmodSync } from "./chmod.ts";
|
||||||
import { writeAll, writeAllSync } from "./buffer";
|
import { writeAll, writeAllSync } from "./buffer.ts";
|
||||||
|
|
||||||
/** Options for writing to a file.
|
/** Options for writing to a file.
|
||||||
* `perm` would change the file's permission if set.
|
* `perm` would change the file's permission if set.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Buffer, writeAll } from "./buffer";
|
import { Buffer, writeAll } from "./buffer.ts";
|
||||||
import { stdin } from "./files";
|
import { stdin } from "./files.ts";
|
||||||
import { TextEncoder, TextDecoder } from "./text_encoding";
|
import { TextEncoder, TextDecoder } from "./text_encoding.ts";
|
||||||
import { Reader, EOF } from "./io";
|
import { Reader, EOF } from "./io.ts";
|
||||||
|
|
||||||
export type XevalFunc = (v: string) => void;
|
export type XevalFunc = (v: string) => void;
|
||||||
|
|
||||||
|
|
12
package.json
12
package.json
|
@ -8,18 +8,6 @@
|
||||||
"eslint-config-prettier": "4.1.0",
|
"eslint-config-prettier": "4.1.0",
|
||||||
"magic-string": "0.25.2",
|
"magic-string": "0.25.2",
|
||||||
"prettier": "1.17.1",
|
"prettier": "1.17.1",
|
||||||
"rollup": "1.4.1",
|
|
||||||
"rollup-plugin-alias": "1.5.1",
|
|
||||||
"rollup-plugin-analyzer": "3.0.0",
|
|
||||||
"rollup-plugin-commonjs": "9.1.3",
|
|
||||||
"rollup-plugin-node-globals": "1.4.0",
|
|
||||||
"rollup-plugin-node-resolve": "4.0.1",
|
|
||||||
"rollup-plugin-replace": "2.1.0",
|
|
||||||
"rollup-plugin-string": "3.0.0",
|
|
||||||
"rollup-plugin-typescript2": "0.19.3",
|
|
||||||
"rollup-pluginutils": "2.4.1",
|
|
||||||
"ts-morph": "1.3.0",
|
|
||||||
"ts-node": "8.0.2",
|
|
||||||
"typescript": "3.5.1"
|
"typescript": "3.5.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
231
rollup.config.js
231
rollup.config.js
|
@ -1,231 +0,0 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
|
||||||
// @ts-check
|
|
||||||
import * as fs from "fs";
|
|
||||||
import path from "path";
|
|
||||||
import alias from "rollup-plugin-alias";
|
|
||||||
import { plugin as analyze } from "rollup-plugin-analyzer";
|
|
||||||
import commonjs from "rollup-plugin-commonjs";
|
|
||||||
import globals from "rollup-plugin-node-globals";
|
|
||||||
import nodeResolve from "rollup-plugin-node-resolve";
|
|
||||||
import typescriptPlugin from "rollup-plugin-typescript2";
|
|
||||||
import { createFilter } from "rollup-pluginutils";
|
|
||||||
import replace from "rollup-plugin-replace";
|
|
||||||
import typescript from "typescript";
|
|
||||||
|
|
||||||
const mockPath = path.resolve(__dirname, "js/mock_builtin.js");
|
|
||||||
const tsconfig = path.resolve(__dirname, "tsconfig.json");
|
|
||||||
const typescriptPath = path.resolve(
|
|
||||||
__dirname,
|
|
||||||
"third_party/node_modules/typescript/lib/typescript.js"
|
|
||||||
);
|
|
||||||
|
|
||||||
// We will allow generated modules to be resolvable by TypeScript based on
|
|
||||||
// the current build path
|
|
||||||
const tsconfigOverride = {
|
|
||||||
compilerOptions: {
|
|
||||||
paths: {
|
|
||||||
"*": ["*", path.resolve("*")]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const archNodeToDeno = {
|
|
||||||
x64: "x64"
|
|
||||||
};
|
|
||||||
const osNodeToDeno = {
|
|
||||||
win32: "win",
|
|
||||||
darwin: "mac",
|
|
||||||
linux: "linux"
|
|
||||||
};
|
|
||||||
|
|
||||||
function generateDepFile({ outputFile, sourceFiles = [], configFiles = [] }) {
|
|
||||||
let timestamp = new Date();
|
|
||||||
|
|
||||||
// Save the depfile just before the node process exits.
|
|
||||||
process.once("beforeExit", () =>
|
|
||||||
writeDepFile({ outputFile, sourceFiles, configFiles, timestamp })
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: "depfile",
|
|
||||||
load(sourceFile) {
|
|
||||||
// The 'globals' plugin adds generated files that don't exist on disk.
|
|
||||||
// Don't add them to the depfile.
|
|
||||||
if (/^[0-9a-f]{30}$/.test(sourceFile)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sourceFiles.push(sourceFile);
|
|
||||||
// Remember the time stamp that we last resolved a dependency.
|
|
||||||
// We'll set the last modified time of the depfile to that.
|
|
||||||
timestamp = new Date();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function writeDepFile({ outputFile, sourceFiles, configFiles, timestamp }) {
|
|
||||||
const buildDir = process.cwd();
|
|
||||||
const outputDir = path.dirname(outputFile);
|
|
||||||
|
|
||||||
// Assert that the discovered bundle inputs are files that exist on disk.
|
|
||||||
sourceFiles.forEach(f => fs.accessSync(f));
|
|
||||||
// Since we also want to rebuild the bundle if rollup configuration or the the
|
|
||||||
// tooling changes (e.g. when typescript is updated), add the currently loaded
|
|
||||||
// node.js modules to the list of dependencies.
|
|
||||||
let inputs = [...sourceFiles, ...configFiles, ...Object.keys(require.cache)];
|
|
||||||
// Deduplicate the list of inputs.
|
|
||||||
inputs = Array.from(new Set(inputs.map(f => path.resolve(f))));
|
|
||||||
// Turn filenames into relative paths and format/escape them for a Makefile.
|
|
||||||
inputs = inputs.map(formatPath);
|
|
||||||
|
|
||||||
// Build a list of output filenames and normalize those too.
|
|
||||||
const depFile = path.join(
|
|
||||||
outputDir,
|
|
||||||
path.basename(outputFile, path.extname(outputFile)) + ".d"
|
|
||||||
);
|
|
||||||
const outputs = [outputFile, depFile].map(formatPath);
|
|
||||||
|
|
||||||
// Generate depfile contents.
|
|
||||||
const depFileContent = [
|
|
||||||
...outputs.map(filename => `${filename}: ` + inputs.join(" ") + "\n\n"),
|
|
||||||
...inputs.map(filename => `${filename}:\n`)
|
|
||||||
].join("");
|
|
||||||
|
|
||||||
// Since we're writing the depfile when node's "beforeExit" hook triggers,
|
|
||||||
// it's getting written _after_ the regular outputs are saved to disk.
|
|
||||||
// Therefore, after writing the depfile, reset its timestamps to when we last
|
|
||||||
// discovered a dependency, which was certainly before the bundle was built.
|
|
||||||
fs.writeFileSync(depFile, depFileContent);
|
|
||||||
fs.utimesSync(depFile, timestamp, timestamp);
|
|
||||||
|
|
||||||
// Renders path to make it suitable for a depfile.
|
|
||||||
function formatPath(filename) {
|
|
||||||
// Make the path relative to the root build directory.
|
|
||||||
filename = path.relative(buildDir, filename);
|
|
||||||
// Use forward slashes on Windows.
|
|
||||||
if (process.platform === "win32") {
|
|
||||||
filename = filename.replace(/\\/g, "/");
|
|
||||||
}
|
|
||||||
// Escape spaces with a backslash. This is what rust and clang do too.
|
|
||||||
filename = filename.replace(/ /g, "\\ ");
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function makeConfig(commandOptions) {
|
|
||||||
return {
|
|
||||||
output: {
|
|
||||||
format: "iife",
|
|
||||||
name: "denoMain",
|
|
||||||
sourcemap: true,
|
|
||||||
sourcemapExcludeSources: true
|
|
||||||
},
|
|
||||||
|
|
||||||
plugins: [
|
|
||||||
// inject build and version info
|
|
||||||
replace({
|
|
||||||
ROLLUP_REPLACE_TS_VERSION: typescript.version,
|
|
||||||
ROLLUP_REPLACE_ARCH: archNodeToDeno[process.arch],
|
|
||||||
ROLLUP_REPLACE_OS: osNodeToDeno[process.platform]
|
|
||||||
}),
|
|
||||||
|
|
||||||
// would prefer to use `rollup-plugin-virtual` to inject the empty module, but there
|
|
||||||
// is an issue with `rollup-plugin-commonjs` which causes errors when using the
|
|
||||||
// virtual plugin (see: rollup/rollup-plugin-commonjs#315), this means we have to use
|
|
||||||
// a physical module to substitute
|
|
||||||
alias({
|
|
||||||
fs: mockPath,
|
|
||||||
path: mockPath,
|
|
||||||
os: mockPath,
|
|
||||||
crypto: mockPath,
|
|
||||||
buffer: mockPath,
|
|
||||||
module: mockPath
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Allows rollup to resolve modules based on Node.js resolution
|
|
||||||
nodeResolve(),
|
|
||||||
|
|
||||||
// Allows rollup to import CommonJS modules
|
|
||||||
commonjs({
|
|
||||||
namedExports: {
|
|
||||||
// Static analysis of `typescript.js` does detect the exports properly, therefore
|
|
||||||
// rollup requires them to be explicitly defined to make them available in the
|
|
||||||
// bundle
|
|
||||||
[typescriptPath]: [
|
|
||||||
"convertCompilerOptionsFromJson",
|
|
||||||
"createLanguageService",
|
|
||||||
"createProgram",
|
|
||||||
"createSourceFile",
|
|
||||||
"getPreEmitDiagnostics",
|
|
||||||
"formatDiagnostics",
|
|
||||||
"formatDiagnosticsWithColorAndContext",
|
|
||||||
"parseConfigFileTextToJson",
|
|
||||||
"version",
|
|
||||||
"CompilerHost",
|
|
||||||
"DiagnosticCategory",
|
|
||||||
"Extension",
|
|
||||||
"ModuleKind",
|
|
||||||
"ScriptKind",
|
|
||||||
"ScriptSnapshot",
|
|
||||||
"ScriptTarget"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
typescriptPlugin({
|
|
||||||
// The build script is invoked from `out/:target` so passing an absolute file path is needed
|
|
||||||
tsconfig,
|
|
||||||
|
|
||||||
// This provides any overrides to the `tsconfig.json` that are needed to bundle
|
|
||||||
tsconfigOverride,
|
|
||||||
|
|
||||||
// This provides the locally configured version of TypeScript instead of the plugins
|
|
||||||
// default version
|
|
||||||
typescript,
|
|
||||||
|
|
||||||
// By default, the include path only includes the cwd and below, need to include the root of the project
|
|
||||||
// and build path to be passed to this plugin. This is different front tsconfig.json include
|
|
||||||
include: ["*.ts", `${__dirname}/**/*.ts`, `${process.cwd()}/**/*.ts`],
|
|
||||||
|
|
||||||
// d.ts files are not bundled and by default like include, it only includes the cwd and below
|
|
||||||
exclude: [
|
|
||||||
"*.d.ts",
|
|
||||||
`${__dirname}/**/*.d.ts`,
|
|
||||||
`${process.cwd()}/**/*.d.ts`
|
|
||||||
]
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Provide some concise information about the bundle
|
|
||||||
analyze({
|
|
||||||
skipFormatted: true,
|
|
||||||
onAnalysis({
|
|
||||||
bundleSize,
|
|
||||||
bundleOrigSize,
|
|
||||||
bundleReduction,
|
|
||||||
moduleCount
|
|
||||||
}) {
|
|
||||||
if (!commandOptions.silent) {
|
|
||||||
console.log(
|
|
||||||
`Bundle size: ${Math.round((bundleSize / 1000000) * 100) / 100}Mb`
|
|
||||||
);
|
|
||||||
console.log(
|
|
||||||
`Original size: ${Math.round((bundleOrigSize / 1000000) * 100) /
|
|
||||||
100}Mb`
|
|
||||||
);
|
|
||||||
console.log(`Reduction: ${bundleReduction}%`);
|
|
||||||
console.log(`Module count: ${moduleCount}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
// source-map-support, which is required by TypeScript to support source maps, requires Node.js Buffer
|
|
||||||
// implementation. This needs to come at the end of the plugins because of the impact it has on
|
|
||||||
// the existing runtime environment, which breaks other plugins and features of the bundler.
|
|
||||||
globals(),
|
|
||||||
|
|
||||||
generateDepFile({
|
|
||||||
outputFile: commandOptions.o,
|
|
||||||
configFiles: [commandOptions.c, tsconfig]
|
|
||||||
})
|
|
||||||
]
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,12 +1,12 @@
|
||||||
[WILDCARD]error: Uncaught NotFound: Cannot resolve module "[WILDCARD]/bad-module.ts"
|
[WILDCARD]error: Uncaught NotFound: Cannot resolve module "[WILDCARD]/bad-module.ts"
|
||||||
[WILDCARD] js/dispatch_json.ts:[WILDCARD]
|
[WILDCARD]dispatch_json.ts:[WILDCARD]
|
||||||
at DenoError (js/errors.ts:[WILDCARD])
|
at DenoError ([WILDCARD]errors.ts:[WILDCARD])
|
||||||
at unwrapResponse (js/dispatch_json.ts:[WILDCARD])
|
at unwrapResponse ([WILDCARD]dispatch_json.ts:[WILDCARD])
|
||||||
at sendSync[WILDCARD] (js/dispatch_json.ts:[WILDCARD])
|
at sendSync[WILDCARD] ([WILDCARD]dispatch_json.ts:[WILDCARD])
|
||||||
at fetchSourceFile (js/compiler.ts:[WILDCARD])
|
at fetchSourceFile ([WILDCARD]compiler.ts:[WILDCARD])
|
||||||
at _resolveModule (js/compiler.ts:[WILDCARD])
|
at _resolveModule ([WILDCARD]compiler.ts:[WILDCARD])
|
||||||
at js/compiler.ts:[WILDCARD]
|
at [WILDCARD]compiler.ts:[WILDCARD]
|
||||||
at resolveModuleNames (js/compiler.ts:[WILDCARD])
|
at resolveModuleNames ([WILDCARD]compiler.ts:[WILDCARD])
|
||||||
at resolveModuleNamesWorker ([WILDCARD]typescript.js:[WILDCARD])
|
at resolveModuleNamesWorker ([WILDCARD]typescript.js:[WILDCARD])
|
||||||
at resolveModuleNamesReusingOldState ([WILDCARD]typescript.js:[WILDCARD])
|
at resolveModuleNamesReusingOldState ([WILDCARD]typescript.js:[WILDCARD])
|
||||||
at processImportedModules ([WILDCARD]typescript.js:[WILDCARD])
|
at processImportedModules ([WILDCARD]typescript.js:[WILDCARD])
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue