mirror of
https://github.com/denoland/deno.git
synced 2025-03-07 19:56:21 -05:00
Compare commits
9 commits
533b16fc53
...
bacb6daf27
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bacb6daf27 | ||
![]() |
d3d783adc4 | ||
![]() |
8626ec7c25 | ||
![]() |
3553aa9132 | ||
![]() |
12aea2014a | ||
![]() |
39722f190a | ||
![]() |
026bbc4a9e | ||
![]() |
32e260d55a | ||
![]() |
1af2d2474e |
64 changed files with 465 additions and 218 deletions
.github/workflows
Cargo.lockCargo.tomlReleases.mdbench_util
cli
ext
broadcast_channel
cache
canvas
console
cron
crypto
fetch
ffi
fs
http
io
kv
napi
net
node
telemetry
tls
url
web
webgpu
webidl
websocket
webstorage
resolvers
runtime
tests
specs/publish
bun_specifier
invalid_import
invalid_import_esm_sh_suggestion
missing_name
prefer_fast_check_graph
unit
unit_node
2
.github/workflows/ci.generate.ts
vendored
2
.github/workflows/ci.generate.ts
vendored
|
@ -5,7 +5,7 @@ import { stringify } from "jsr:@std/yaml@^0.221/stringify";
|
|||
// Bump this number when you want to purge the cache.
|
||||
// Note: the tools/release/01_bump_crate_versions.ts script will update this version
|
||||
// automatically via regex, so ensure that this line maintains this format.
|
||||
const cacheVersion = 27;
|
||||
const cacheVersion = 28;
|
||||
|
||||
const ubuntuX86Runner = "ubuntu-24.04";
|
||||
const ubuntuX86XlRunner = "ubuntu-24.04-xl";
|
||||
|
|
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
|
@ -361,8 +361,8 @@ jobs:
|
|||
path: |-
|
||||
~/.cargo/registry/index
|
||||
~/.cargo/registry/cache
|
||||
key: '27-cargo-home-${{ matrix.os }}-${{ matrix.arch }}-${{ hashFiles(''Cargo.lock'') }}'
|
||||
restore-keys: '27-cargo-home-${{ matrix.os }}-${{ matrix.arch }}'
|
||||
key: '28-cargo-home-${{ matrix.os }}-${{ matrix.arch }}-${{ hashFiles(''Cargo.lock'') }}'
|
||||
restore-keys: '28-cargo-home-${{ matrix.os }}-${{ matrix.arch }}'
|
||||
if: '!(matrix.skip)'
|
||||
- name: Restore cache build output (PR)
|
||||
uses: actions/cache/restore@v4
|
||||
|
@ -375,7 +375,7 @@ jobs:
|
|||
!./target/*/*.zip
|
||||
!./target/*/*.tar.gz
|
||||
key: never_saved
|
||||
restore-keys: '27-cargo-target-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.profile }}-${{ matrix.job }}-'
|
||||
restore-keys: '28-cargo-target-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.profile }}-${{ matrix.job }}-'
|
||||
- name: Apply and update mtime cache
|
||||
if: '!(matrix.skip) && (!startsWith(github.ref, ''refs/tags/''))'
|
||||
uses: ./.github/mtime_cache
|
||||
|
@ -685,7 +685,7 @@ jobs:
|
|||
!./target/*/*.zip
|
||||
!./target/*/*.sha256sum
|
||||
!./target/*/*.tar.gz
|
||||
key: '27-cargo-target-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.profile }}-${{ matrix.job }}-${{ github.sha }}'
|
||||
key: '28-cargo-target-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.profile }}-${{ matrix.job }}-${{ github.sha }}'
|
||||
publish-canary:
|
||||
name: publish canary
|
||||
runs-on: ubuntu-24.04
|
||||
|
|
60
Cargo.lock
generated
60
Cargo.lock
generated
|
@ -1194,7 +1194,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno"
|
||||
version = "2.1.1"
|
||||
version = "2.1.2"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"async-trait",
|
||||
|
@ -1366,7 +1366,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_bench_util"
|
||||
version = "0.173.0"
|
||||
version = "0.174.0"
|
||||
dependencies = [
|
||||
"bencher",
|
||||
"deno_core",
|
||||
|
@ -1375,7 +1375,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_broadcast_channel"
|
||||
version = "0.173.0"
|
||||
version = "0.174.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"deno_core",
|
||||
|
@ -1386,7 +1386,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_cache"
|
||||
version = "0.111.0"
|
||||
version = "0.112.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"deno_core",
|
||||
|
@ -1419,7 +1419,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_canvas"
|
||||
version = "0.48.0"
|
||||
version = "0.49.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"deno_webgpu",
|
||||
|
@ -1454,7 +1454,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_console"
|
||||
version = "0.179.0"
|
||||
version = "0.180.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
]
|
||||
|
@ -1502,7 +1502,7 @@ checksum = "fe4dccb6147bb3f3ba0c7a48e993bfeb999d2c2e47a81badee80e2b370c8d695"
|
|||
|
||||
[[package]]
|
||||
name = "deno_cron"
|
||||
version = "0.59.0"
|
||||
version = "0.60.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
|
@ -1515,7 +1515,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_crypto"
|
||||
version = "0.193.0"
|
||||
version = "0.194.0"
|
||||
dependencies = [
|
||||
"aes",
|
||||
"aes-gcm",
|
||||
|
@ -1604,7 +1604,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_fetch"
|
||||
version = "0.203.0"
|
||||
version = "0.204.0"
|
||||
dependencies = [
|
||||
"base64 0.21.7",
|
||||
"bytes",
|
||||
|
@ -1638,7 +1638,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_ffi"
|
||||
version = "0.166.0"
|
||||
version = "0.167.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"deno_permissions",
|
||||
|
@ -1658,7 +1658,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_fs"
|
||||
version = "0.89.0"
|
||||
version = "0.90.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"base32",
|
||||
|
@ -1711,7 +1711,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_http"
|
||||
version = "0.177.0"
|
||||
version = "0.178.0"
|
||||
dependencies = [
|
||||
"async-compression",
|
||||
"async-trait",
|
||||
|
@ -1750,7 +1750,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_io"
|
||||
version = "0.89.0"
|
||||
version = "0.90.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"deno_core",
|
||||
|
@ -1771,7 +1771,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_kv"
|
||||
version = "0.87.0"
|
||||
version = "0.88.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
|
@ -1844,7 +1844,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_napi"
|
||||
version = "0.110.0"
|
||||
version = "0.111.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"deno_permissions",
|
||||
|
@ -1872,7 +1872,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_net"
|
||||
version = "0.171.0"
|
||||
version = "0.172.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"deno_permissions",
|
||||
|
@ -1889,7 +1889,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_node"
|
||||
version = "0.116.0"
|
||||
version = "0.117.0"
|
||||
dependencies = [
|
||||
"aead-gcm-stream",
|
||||
"aes",
|
||||
|
@ -2043,7 +2043,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_permissions"
|
||||
version = "0.39.0"
|
||||
version = "0.40.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"deno_path_util",
|
||||
|
@ -2061,7 +2061,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_resolver"
|
||||
version = "0.11.0"
|
||||
version = "0.12.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"base32",
|
||||
|
@ -2080,7 +2080,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_runtime"
|
||||
version = "0.188.0"
|
||||
version = "0.189.0"
|
||||
dependencies = [
|
||||
"color-print",
|
||||
"deno_ast",
|
||||
|
@ -2180,7 +2180,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_telemetry"
|
||||
version = "0.1.0"
|
||||
version = "0.2.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"deno_core",
|
||||
|
@ -2221,7 +2221,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_tls"
|
||||
version = "0.166.0"
|
||||
version = "0.167.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"deno_native_certs",
|
||||
|
@ -2270,7 +2270,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_url"
|
||||
version = "0.179.0"
|
||||
version = "0.180.0"
|
||||
dependencies = [
|
||||
"deno_bench_util",
|
||||
"deno_console",
|
||||
|
@ -2282,7 +2282,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_web"
|
||||
version = "0.210.0"
|
||||
version = "0.211.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"base64-simd 0.8.0",
|
||||
|
@ -2304,7 +2304,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_webgpu"
|
||||
version = "0.146.0"
|
||||
version = "0.147.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"raw-window-handle",
|
||||
|
@ -2317,7 +2317,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_webidl"
|
||||
version = "0.179.0"
|
||||
version = "0.180.0"
|
||||
dependencies = [
|
||||
"deno_bench_util",
|
||||
"deno_core",
|
||||
|
@ -2325,7 +2325,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_websocket"
|
||||
version = "0.184.0"
|
||||
version = "0.185.0"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"deno_core",
|
||||
|
@ -2347,7 +2347,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_webstorage"
|
||||
version = "0.174.0"
|
||||
version = "0.175.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"deno_web",
|
||||
|
@ -4860,7 +4860,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "napi_sym"
|
||||
version = "0.109.0"
|
||||
version = "0.110.0"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"serde",
|
||||
|
@ -4915,7 +4915,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "node_resolver"
|
||||
version = "0.18.0"
|
||||
version = "0.19.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
|
|
58
Cargo.toml
58
Cargo.toml
|
@ -49,17 +49,17 @@ repository = "https://github.com/denoland/deno"
|
|||
deno_ast = { version = "=0.44.0", features = ["transpiling"] }
|
||||
deno_core = { version = "0.323.0" }
|
||||
|
||||
deno_bench_util = { version = "0.173.0", path = "./bench_util" }
|
||||
deno_bench_util = { version = "0.174.0", path = "./bench_util" }
|
||||
deno_config = { version = "=0.39.3", features = ["workspace", "sync"] }
|
||||
deno_lockfile = "=0.23.2"
|
||||
deno_media_type = { version = "0.2.0", features = ["module_specifier"] }
|
||||
deno_npm = "=0.25.5"
|
||||
deno_path_util = "=0.2.1"
|
||||
deno_permissions = { version = "0.39.0", path = "./runtime/permissions" }
|
||||
deno_runtime = { version = "0.188.0", path = "./runtime" }
|
||||
deno_permissions = { version = "0.40.0", path = "./runtime/permissions" }
|
||||
deno_runtime = { version = "0.189.0", path = "./runtime" }
|
||||
deno_semver = "=0.6.0"
|
||||
deno_terminal = "0.2.0"
|
||||
napi_sym = { version = "0.109.0", path = "./ext/napi/sym" }
|
||||
napi_sym = { version = "0.110.0", path = "./ext/napi/sym" }
|
||||
test_util = { package = "test_server", path = "./tests/util/server" }
|
||||
|
||||
denokv_proto = "0.8.4"
|
||||
|
@ -68,33 +68,33 @@ denokv_remote = "0.8.4"
|
|||
denokv_sqlite = { default-features = false, version = "0.8.4" }
|
||||
|
||||
# exts
|
||||
deno_broadcast_channel = { version = "0.173.0", path = "./ext/broadcast_channel" }
|
||||
deno_cache = { version = "0.111.0", path = "./ext/cache" }
|
||||
deno_canvas = { version = "0.48.0", path = "./ext/canvas" }
|
||||
deno_console = { version = "0.179.0", path = "./ext/console" }
|
||||
deno_cron = { version = "0.59.0", path = "./ext/cron" }
|
||||
deno_crypto = { version = "0.193.0", path = "./ext/crypto" }
|
||||
deno_fetch = { version = "0.203.0", path = "./ext/fetch" }
|
||||
deno_ffi = { version = "0.166.0", path = "./ext/ffi" }
|
||||
deno_fs = { version = "0.89.0", path = "./ext/fs" }
|
||||
deno_http = { version = "0.177.0", path = "./ext/http" }
|
||||
deno_io = { version = "0.89.0", path = "./ext/io" }
|
||||
deno_kv = { version = "0.87.0", path = "./ext/kv" }
|
||||
deno_napi = { version = "0.110.0", path = "./ext/napi" }
|
||||
deno_net = { version = "0.171.0", path = "./ext/net" }
|
||||
deno_node = { version = "0.116.0", path = "./ext/node" }
|
||||
deno_telemetry = { version = "0.1.0", path = "./ext/telemetry" }
|
||||
deno_tls = { version = "0.166.0", path = "./ext/tls" }
|
||||
deno_url = { version = "0.179.0", path = "./ext/url" }
|
||||
deno_web = { version = "0.210.0", path = "./ext/web" }
|
||||
deno_webgpu = { version = "0.146.0", path = "./ext/webgpu" }
|
||||
deno_webidl = { version = "0.179.0", path = "./ext/webidl" }
|
||||
deno_websocket = { version = "0.184.0", path = "./ext/websocket" }
|
||||
deno_webstorage = { version = "0.174.0", path = "./ext/webstorage" }
|
||||
deno_broadcast_channel = { version = "0.174.0", path = "./ext/broadcast_channel" }
|
||||
deno_cache = { version = "0.112.0", path = "./ext/cache" }
|
||||
deno_canvas = { version = "0.49.0", path = "./ext/canvas" }
|
||||
deno_console = { version = "0.180.0", path = "./ext/console" }
|
||||
deno_cron = { version = "0.60.0", path = "./ext/cron" }
|
||||
deno_crypto = { version = "0.194.0", path = "./ext/crypto" }
|
||||
deno_fetch = { version = "0.204.0", path = "./ext/fetch" }
|
||||
deno_ffi = { version = "0.167.0", path = "./ext/ffi" }
|
||||
deno_fs = { version = "0.90.0", path = "./ext/fs" }
|
||||
deno_http = { version = "0.178.0", path = "./ext/http" }
|
||||
deno_io = { version = "0.90.0", path = "./ext/io" }
|
||||
deno_kv = { version = "0.88.0", path = "./ext/kv" }
|
||||
deno_napi = { version = "0.111.0", path = "./ext/napi" }
|
||||
deno_net = { version = "0.172.0", path = "./ext/net" }
|
||||
deno_node = { version = "0.117.0", path = "./ext/node" }
|
||||
deno_telemetry = { version = "0.2.0", path = "./ext/telemetry" }
|
||||
deno_tls = { version = "0.167.0", path = "./ext/tls" }
|
||||
deno_url = { version = "0.180.0", path = "./ext/url" }
|
||||
deno_web = { version = "0.211.0", path = "./ext/web" }
|
||||
deno_webgpu = { version = "0.147.0", path = "./ext/webgpu" }
|
||||
deno_webidl = { version = "0.180.0", path = "./ext/webidl" }
|
||||
deno_websocket = { version = "0.185.0", path = "./ext/websocket" }
|
||||
deno_webstorage = { version = "0.175.0", path = "./ext/webstorage" }
|
||||
|
||||
# resolvers
|
||||
deno_resolver = { version = "0.11.0", path = "./resolvers/deno" }
|
||||
node_resolver = { version = "0.18.0", path = "./resolvers/node" }
|
||||
deno_resolver = { version = "0.12.0", path = "./resolvers/deno" }
|
||||
node_resolver = { version = "0.19.0", path = "./resolvers/node" }
|
||||
|
||||
aes = "=0.8.3"
|
||||
anyhow = "1.0.57"
|
||||
|
|
44
Releases.md
44
Releases.md
|
@ -6,6 +6,50 @@ https://github.com/denoland/deno/releases
|
|||
We also have one-line install commands at:
|
||||
https://github.com/denoland/deno_install
|
||||
|
||||
### 2.1.2 / 2024.11.28
|
||||
|
||||
- feat(unstable): Instrument Deno.serve (#26964)
|
||||
- feat(unstable): Instrument fetch (#27057)
|
||||
- feat(unstable): repurpose `--unstable-detect-cjs` to attempt loading more
|
||||
modules as cjs (#27094)
|
||||
- fix(check): support jsdoc `@import` tag (#26991)
|
||||
- fix(compile): correct buffered reading of assets and files (#27008)
|
||||
- fix(compile): do not error embedding same symlink via multiple methods
|
||||
(#27015)
|
||||
- fix(compile): handle TypeScript file included as asset (#27032)
|
||||
- fix(ext/fetch): don't throw when `bodyUsed` inspect after upgrade (#27088)
|
||||
- fix(ext/node): `tls.connect` socket upgrades (#27125)
|
||||
- fix(ext/node): add `fs.promises.fstat` and `FileHandle#stat` (#26719)
|
||||
- fix(ext/webgpu): normalize limits to number (#27072)
|
||||
- fix(ext/webgpu): use correct variable name (#27108)
|
||||
- fix(ext/websocket): don't throw exception when sending to closed socket
|
||||
(#26932)
|
||||
- fix(fmt): return `None` if sql fmt result is the same (#27014)
|
||||
- fix(info): resolve bare specifier pointing to workspace member (#27020)
|
||||
- fix(init): always force managed node modules (#27047)
|
||||
- fix(init): support scoped npm packages (#27128)
|
||||
- fix(install): don't re-set up node_modules if running lifecycle script
|
||||
(#26984)
|
||||
- fix(lsp): remove stray debug output (#27010)
|
||||
- fix(lsp): support task object notation for tasks request (#27076)
|
||||
- fix(lsp): wasm file import completions (#27018)
|
||||
- fix(node): correct resolution of dynamic import of esm from cjs (#27071)
|
||||
- fix(node/fs): add missing stat path argument validation (#27086)
|
||||
- fix(node/fs): missing uv error context for readFile (#27011)
|
||||
- fix(node/http): casing ignored in ServerResponse.hasHeader() (#27105)
|
||||
- fix(node/timers): error when passing id to clearTimeout/clearInterval (#27130)
|
||||
- fix(runtime/ops): Fix watchfs remove event (#27041)
|
||||
- fix(streams): reject `string` in `ReadableStream.from` type (#25116)
|
||||
- fix(task): handle carriage return in task description (#27099)
|
||||
- fix(task): handle multiline descriptions properly (#27069)
|
||||
- fix(task): strip ansi codes and control chars when printing tasks (#27100)
|
||||
- fix(tools/doc): HTML resolve main entrypoint from config file (#27103)
|
||||
- fix: support bun specifiers in JSR publish (#24588)
|
||||
- fix: support non-function exports in Wasm modules (#26992)
|
||||
- perf(compile): read embedded files as static references when UTF-8 and reading
|
||||
as strings (#27033)
|
||||
- perf(ext/webstorage): use object wrap for `Storage` (#26931)
|
||||
|
||||
### 2.1.1 / 2024.11.21
|
||||
|
||||
- docs(add): clarification to add command (#26968)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_bench_util"
|
||||
version = "0.173.0"
|
||||
version = "0.174.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno"
|
||||
version = "2.1.1"
|
||||
version = "2.1.2"
|
||||
authors.workspace = true
|
||||
default-run = "deno"
|
||||
edition.workspace = true
|
||||
|
|
|
@ -11,7 +11,6 @@ use deno_package_json::PackageJsonDepValueParseError;
|
|||
use deno_package_json::PackageJsonDepWorkspaceReq;
|
||||
use deno_semver::npm::NpmPackageReqReference;
|
||||
use deno_semver::package::PackageReq;
|
||||
use deno_semver::RangeSetOrTag;
|
||||
use deno_semver::VersionReq;
|
||||
use thiserror::Error;
|
||||
|
||||
|
@ -145,17 +144,9 @@ impl NpmInstallDepsProvider {
|
|||
PackageJsonDepWorkspaceReq::VersionReq(version_req) => {
|
||||
version_req
|
||||
}
|
||||
PackageJsonDepWorkspaceReq::Tilde => {
|
||||
VersionReq::from_raw_text_and_inner(
|
||||
"workspace:~".to_string(),
|
||||
RangeSetOrTag::Tag("workspace".to_string()),
|
||||
)
|
||||
}
|
||||
PackageJsonDepWorkspaceReq::Caret => {
|
||||
VersionReq::from_raw_text_and_inner(
|
||||
"workspace:^".to_string(),
|
||||
RangeSetOrTag::Tag("workspace".to_string()),
|
||||
)
|
||||
PackageJsonDepWorkspaceReq::Tilde
|
||||
| PackageJsonDepWorkspaceReq::Caret => {
|
||||
VersionReq::parse_from_npm("*").unwrap()
|
||||
}
|
||||
};
|
||||
if let Some(pkg) = workspace_npm_pkgs.iter().find(|pkg| {
|
||||
|
|
|
@ -504,7 +504,12 @@ impl CliFactory {
|
|||
let resolver = cli_options
|
||||
.create_workspace_resolver(
|
||||
self.file_fetcher()?,
|
||||
if cli_options.use_byonm() {
|
||||
if cli_options.use_byonm()
|
||||
&& !matches!(
|
||||
cli_options.sub_command(),
|
||||
DenoSubcommand::Publish(_)
|
||||
)
|
||||
{
|
||||
PackageJsonDepResolution::Disabled
|
||||
} else {
|
||||
// todo(dsherret): this should be false for nodeModulesDir: true
|
||||
|
|
|
@ -6,6 +6,7 @@ use crate::args::CliLockfile;
|
|||
use crate::args::CliOptions;
|
||||
use crate::args::DENO_DISABLE_PEDANTIC_NODE_WARNINGS;
|
||||
use crate::cache;
|
||||
use crate::cache::FetchCacher;
|
||||
use crate::cache::GlobalHttpCache;
|
||||
use crate::cache::ModuleInfoCache;
|
||||
use crate::cache::ParsedSourceCache;
|
||||
|
@ -254,6 +255,23 @@ impl ModuleGraphCreator {
|
|||
package_configs: &[JsrPackageConfig],
|
||||
build_fast_check_graph: bool,
|
||||
) -> Result<ModuleGraph, AnyError> {
|
||||
struct PublishLoader(FetchCacher);
|
||||
impl Loader for PublishLoader {
|
||||
fn load(
|
||||
&self,
|
||||
specifier: &deno_ast::ModuleSpecifier,
|
||||
options: deno_graph::source::LoadOptions,
|
||||
) -> deno_graph::source::LoadFuture {
|
||||
if specifier.scheme() == "bun" {
|
||||
return Box::pin(std::future::ready(Ok(Some(
|
||||
deno_graph::source::LoadResponse::External {
|
||||
specifier: specifier.clone(),
|
||||
},
|
||||
))));
|
||||
}
|
||||
self.0.load(specifier, options)
|
||||
}
|
||||
}
|
||||
fn graph_has_external_remote(graph: &ModuleGraph) -> bool {
|
||||
// Earlier on, we marked external non-JSR modules as external.
|
||||
// If the graph contains any of those, it would cause type checking
|
||||
|
@ -271,12 +289,15 @@ impl ModuleGraphCreator {
|
|||
for package_config in package_configs {
|
||||
roots.extend(package_config.config_file.resolve_export_value_urls()?);
|
||||
}
|
||||
|
||||
let loader = self.module_graph_builder.create_graph_loader();
|
||||
let mut publish_loader = PublishLoader(loader);
|
||||
let mut graph = self
|
||||
.create_graph_with_options(CreateGraphOptions {
|
||||
is_dynamic: false,
|
||||
graph_kind: deno_graph::GraphKind::All,
|
||||
roots,
|
||||
loader: None,
|
||||
loader: Some(&mut publish_loader),
|
||||
})
|
||||
.await?;
|
||||
self.graph_valid(&graph)?;
|
||||
|
|
|
@ -252,8 +252,46 @@ Deno.test(function addTest() {
|
|||
Ok(0)
|
||||
}
|
||||
|
||||
fn npm_name_to_create_package(name: &str) -> String {
|
||||
let mut s = "npm:".to_string();
|
||||
|
||||
let mut scoped = false;
|
||||
let mut create = false;
|
||||
|
||||
for (i, ch) in name.char_indices() {
|
||||
if i == 0 {
|
||||
if ch == '@' {
|
||||
scoped = true;
|
||||
} else {
|
||||
create = true;
|
||||
s.push_str("create-");
|
||||
}
|
||||
} else if scoped {
|
||||
if ch == '/' {
|
||||
scoped = false;
|
||||
create = true;
|
||||
s.push_str("/create-");
|
||||
continue;
|
||||
} else if ch == '@' && !create {
|
||||
scoped = false;
|
||||
create = true;
|
||||
s.push_str("/create@");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
s.push(ch);
|
||||
}
|
||||
|
||||
if !create {
|
||||
s.push_str("/create");
|
||||
}
|
||||
|
||||
s
|
||||
}
|
||||
|
||||
async fn init_npm(name: &str, args: Vec<String>) -> Result<i32, AnyError> {
|
||||
let script_name = format!("npm:create-{}", name);
|
||||
let script_name = npm_name_to_create_package(name);
|
||||
|
||||
fn print_manual_usage(script_name: &str, args: &[String]) -> i32 {
|
||||
log::info!("{}", cformat!("You can initialize project manually by running <u>deno run {} {}</> and applying desired permissions.", script_name, args.join(" ")));
|
||||
|
@ -336,3 +374,37 @@ fn create_file(
|
|||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::tools::init::npm_name_to_create_package;
|
||||
|
||||
#[test]
|
||||
fn npm_name_to_create_package_test() {
|
||||
// See https://docs.npmjs.com/cli/v8/commands/npm-init#description
|
||||
assert_eq!(
|
||||
npm_name_to_create_package("foo"),
|
||||
"npm:create-foo".to_string()
|
||||
);
|
||||
assert_eq!(
|
||||
npm_name_to_create_package("foo@1.0.0"),
|
||||
"npm:create-foo@1.0.0".to_string()
|
||||
);
|
||||
assert_eq!(
|
||||
npm_name_to_create_package("@foo"),
|
||||
"npm:@foo/create".to_string()
|
||||
);
|
||||
assert_eq!(
|
||||
npm_name_to_create_package("@foo@1.0.0"),
|
||||
"npm:@foo/create@1.0.0".to_string()
|
||||
);
|
||||
assert_eq!(
|
||||
npm_name_to_create_package("@foo/bar"),
|
||||
"npm:@foo/create-bar".to_string()
|
||||
);
|
||||
assert_eq!(
|
||||
npm_name_to_create_package("@foo/bar@1.0.0"),
|
||||
"npm:@foo/create-bar@1.0.0".to_string()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -476,7 +476,7 @@ impl Diagnostic for PublishDiagnostic {
|
|||
InvalidExternalImport { imported, .. } => Cow::Owned(vec![
|
||||
Cow::Owned(format!("the import was resolved to '{}'", imported)),
|
||||
Cow::Borrowed("this specifier is not allowed to be imported on jsr"),
|
||||
Cow::Borrowed("jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers"),
|
||||
Cow::Borrowed("jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers"),
|
||||
]),
|
||||
UnsupportedJsxTsx { .. } => Cow::Owned(vec![
|
||||
Cow::Borrowed("follow https://github.com/jsr-io/jsr/issues/24 for updates"),
|
||||
|
|
|
@ -47,7 +47,7 @@ impl GraphDiagnosticsCollector {
|
|||
resolution: &ResolutionResolved| {
|
||||
if visited.insert(resolution.specifier.clone()) {
|
||||
match resolution.specifier.scheme() {
|
||||
"file" | "data" | "node" => {}
|
||||
"file" | "data" | "node" | "bun" => {}
|
||||
"jsr" => {
|
||||
skip_specifiers.insert(resolution.specifier.clone());
|
||||
|
||||
|
|
|
@ -14,7 +14,6 @@ use base64::Engine;
|
|||
use deno_ast::ModuleSpecifier;
|
||||
use deno_config::deno_json::ConfigFile;
|
||||
use deno_config::workspace::JsrPackageConfig;
|
||||
use deno_config::workspace::PackageJsonDepResolution;
|
||||
use deno_config::workspace::Workspace;
|
||||
use deno_core::anyhow::bail;
|
||||
use deno_core::anyhow::Context;
|
||||
|
@ -44,8 +43,6 @@ use crate::cache::ParsedSourceCache;
|
|||
use crate::factory::CliFactory;
|
||||
use crate::graph_util::ModuleGraphCreator;
|
||||
use crate::http_util::HttpClient;
|
||||
use crate::resolver::CliSloppyImportsResolver;
|
||||
use crate::resolver::SloppyImportsCachedFs;
|
||||
use crate::tools::check::CheckOptions;
|
||||
use crate::tools::lint::collect_no_slow_type_diagnostics;
|
||||
use crate::tools::registry::diagnostics::PublishDiagnostic;
|
||||
|
@ -97,11 +94,10 @@ pub async fn publish(
|
|||
match cli_options.start_dir.maybe_deno_json() {
|
||||
Some(deno_json) => {
|
||||
debug_assert!(!deno_json.is_package());
|
||||
if deno_json.json.name.is_none() {
|
||||
bail!("Missing 'name' field in '{}'.", deno_json.specifier);
|
||||
}
|
||||
error_missing_exports_field(deno_json)?;
|
||||
bail!(
|
||||
"Missing 'name' or 'exports' field in '{}'.",
|
||||
deno_json.specifier
|
||||
);
|
||||
}
|
||||
None => {
|
||||
bail!(
|
||||
|
@ -124,19 +120,8 @@ pub async fn publish(
|
|||
}
|
||||
|
||||
let specifier_unfurler = Arc::new(SpecifierUnfurler::new(
|
||||
if cli_options.unstable_sloppy_imports() {
|
||||
Some(CliSloppyImportsResolver::new(SloppyImportsCachedFs::new(
|
||||
cli_factory.fs().clone(),
|
||||
)))
|
||||
} else {
|
||||
None
|
||||
},
|
||||
cli_options
|
||||
.create_workspace_resolver(
|
||||
cli_factory.file_fetcher()?,
|
||||
PackageJsonDepResolution::Enabled,
|
||||
)
|
||||
.await?,
|
||||
cli_factory.sloppy_imports_resolver()?.cloned(),
|
||||
cli_factory.workspace_resolver().await?.clone(),
|
||||
cli_options.unstable_bare_node_builtins(),
|
||||
));
|
||||
|
||||
|
|
|
@ -142,7 +142,7 @@ fn resolve_content_maybe_unfurling(
|
|||
let mut reporter = |diagnostic| {
|
||||
diagnostics_collector.push(PublishDiagnostic::SpecifierUnfurl(diagnostic));
|
||||
};
|
||||
let content = unfurler.unfurl(specifier, &parsed_source, &mut reporter);
|
||||
let content = unfurler.unfurl(specifier, &parsed_source, &mut reporter)?;
|
||||
Ok(content.into_bytes())
|
||||
}
|
||||
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::sync::Arc;
|
||||
|
||||
use deno_ast::ParsedSource;
|
||||
use deno_ast::SourceRange;
|
||||
use deno_ast::SourceTextInfo;
|
||||
use deno_config::workspace::MappedResolution;
|
||||
use deno_config::workspace::PackageJsonDepResolution;
|
||||
use deno_config::workspace::WorkspaceResolver;
|
||||
use deno_core::anyhow;
|
||||
use deno_core::error::AnyError;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_graph::DependencyDescriptor;
|
||||
use deno_graph::DynamicTemplatePart;
|
||||
|
@ -15,7 +20,7 @@ use deno_package_json::PackageJsonDepValue;
|
|||
use deno_package_json::PackageJsonDepWorkspaceReq;
|
||||
use deno_resolver::sloppy_imports::SloppyImportsResolutionKind;
|
||||
use deno_runtime::deno_node::is_builtin_node_module;
|
||||
use deno_semver::VersionRangeSet;
|
||||
use deno_semver::Version;
|
||||
use deno_semver::VersionReq;
|
||||
|
||||
use crate::resolver::CliSloppyImportsResolver;
|
||||
|
@ -46,15 +51,15 @@ impl SpecifierUnfurlerDiagnostic {
|
|||
}
|
||||
|
||||
pub struct SpecifierUnfurler {
|
||||
sloppy_imports_resolver: Option<CliSloppyImportsResolver>,
|
||||
workspace_resolver: WorkspaceResolver,
|
||||
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
|
||||
workspace_resolver: Arc<WorkspaceResolver>,
|
||||
bare_node_builtins: bool,
|
||||
}
|
||||
|
||||
impl SpecifierUnfurler {
|
||||
pub fn new(
|
||||
sloppy_imports_resolver: Option<CliSloppyImportsResolver>,
|
||||
workspace_resolver: WorkspaceResolver,
|
||||
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
|
||||
workspace_resolver: Arc<WorkspaceResolver>,
|
||||
bare_node_builtins: bool,
|
||||
) -> Self {
|
||||
debug_assert_eq!(
|
||||
|
@ -72,7 +77,7 @@ impl SpecifierUnfurler {
|
|||
&self,
|
||||
referrer: &ModuleSpecifier,
|
||||
specifier: &str,
|
||||
) -> Option<String> {
|
||||
) -> Result<Option<String>, AnyError> {
|
||||
let resolved = if let Ok(resolved) =
|
||||
self.workspace_resolver.resolve(specifier, referrer)
|
||||
{
|
||||
|
@ -126,17 +131,22 @@ impl SpecifierUnfurler {
|
|||
PackageJsonDepValue::Workspace(workspace_version_req) => {
|
||||
let version_req = match workspace_version_req {
|
||||
PackageJsonDepWorkspaceReq::VersionReq(version_req) => {
|
||||
version_req
|
||||
Cow::Borrowed(version_req)
|
||||
}
|
||||
// TODO(bartlomieju): this is not correct, but doesn't really matter until we
|
||||
// start supporting publishing of npm packages
|
||||
PackageJsonDepWorkspaceReq::Caret
|
||||
| PackageJsonDepWorkspaceReq::Tilde => {
|
||||
&VersionReq::from_raw_text_and_inner(
|
||||
"*".to_string(),
|
||||
deno_semver::RangeSetOrTag::RangeSet(VersionRangeSet(
|
||||
vec![],
|
||||
)),
|
||||
PackageJsonDepWorkspaceReq::Caret => {
|
||||
let version = self.find_workspace_npm_dep_version(&alias)?;
|
||||
// version was validated, so ok to unwrap
|
||||
Cow::Owned(
|
||||
VersionReq::parse_from_npm(&format!("^{}", version))
|
||||
.unwrap(),
|
||||
)
|
||||
}
|
||||
PackageJsonDepWorkspaceReq::Tilde => {
|
||||
let version = self.find_workspace_npm_dep_version(&alias)?;
|
||||
// version was validated, so ok to unwrap
|
||||
Cow::Owned(
|
||||
VersionReq::parse_from_npm(&format!("~{}", version))
|
||||
.unwrap(),
|
||||
)
|
||||
}
|
||||
};
|
||||
|
@ -172,8 +182,7 @@ impl SpecifierUnfurler {
|
|||
}
|
||||
None => ModuleSpecifier::options()
|
||||
.base_url(Some(referrer))
|
||||
.parse(specifier)
|
||||
.ok()?,
|
||||
.parse(specifier)?,
|
||||
};
|
||||
// TODO(lucacasonato): this requires integration in deno_graph first
|
||||
// let resolved = if let Ok(specifier) =
|
||||
|
@ -207,7 +216,7 @@ impl SpecifierUnfurler {
|
|||
};
|
||||
let relative_resolved = relative_url(&resolved, referrer);
|
||||
if relative_resolved == specifier {
|
||||
None // nothing to unfurl
|
||||
Ok(None) // nothing to unfurl
|
||||
} else {
|
||||
log::debug!(
|
||||
"Unfurled specifier: {} from {} -> {}",
|
||||
|
@ -215,7 +224,31 @@ impl SpecifierUnfurler {
|
|||
referrer,
|
||||
relative_resolved
|
||||
);
|
||||
Some(relative_resolved)
|
||||
Ok(Some(relative_resolved))
|
||||
}
|
||||
}
|
||||
|
||||
fn find_workspace_npm_dep_version(
|
||||
&self,
|
||||
pkg_name: &str,
|
||||
) -> Result<Version, AnyError> {
|
||||
let pkg_json = self
|
||||
.workspace_resolver
|
||||
.package_jsons()
|
||||
.find(|pkg| pkg.name.as_deref() == Some(pkg_name))
|
||||
.ok_or_else(|| {
|
||||
anyhow::anyhow!(
|
||||
"Unable to find npm package '{}' in workspace",
|
||||
pkg_name
|
||||
)
|
||||
})?;
|
||||
if let Some(version) = &pkg_json.version {
|
||||
Ok(Version::parse_from_npm(version)?)
|
||||
} else {
|
||||
Err(anyhow::anyhow!(
|
||||
"Missing version in package.json of npm package '{}'",
|
||||
pkg_name
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -227,16 +260,16 @@ impl SpecifierUnfurler {
|
|||
text_info: &SourceTextInfo,
|
||||
dep: &deno_graph::DynamicDependencyDescriptor,
|
||||
text_changes: &mut Vec<deno_ast::TextChange>,
|
||||
) -> bool {
|
||||
) -> Result<bool, AnyError> {
|
||||
match &dep.argument {
|
||||
deno_graph::DynamicArgument::String(specifier) => {
|
||||
let range = to_range(text_info, &dep.argument_range);
|
||||
let maybe_relative_index =
|
||||
text_info.text_str()[range.start..range.end].find(specifier);
|
||||
let Some(relative_index) = maybe_relative_index else {
|
||||
return true; // always say it's analyzable for a string
|
||||
return Ok(true); // always say it's analyzable for a string
|
||||
};
|
||||
let unfurled = self.unfurl_specifier(module_url, specifier);
|
||||
let unfurled = self.unfurl_specifier(module_url, specifier)?;
|
||||
if let Some(unfurled) = unfurled {
|
||||
let start = range.start + relative_index;
|
||||
text_changes.push(deno_ast::TextChange {
|
||||
|
@ -244,7 +277,7 @@ impl SpecifierUnfurler {
|
|||
new_text: unfurled,
|
||||
});
|
||||
}
|
||||
true
|
||||
Ok(true)
|
||||
}
|
||||
deno_graph::DynamicArgument::Template(parts) => match parts.first() {
|
||||
Some(DynamicTemplatePart::String { value: specifier }) => {
|
||||
|
@ -252,37 +285,37 @@ impl SpecifierUnfurler {
|
|||
let is_relative =
|
||||
specifier.starts_with("./") || specifier.starts_with("../");
|
||||
if is_relative {
|
||||
return true;
|
||||
return Ok(true);
|
||||
}
|
||||
if !specifier.ends_with('/') {
|
||||
return false;
|
||||
return Ok(false);
|
||||
}
|
||||
let unfurled = self.unfurl_specifier(module_url, specifier);
|
||||
let unfurled = self.unfurl_specifier(module_url, specifier)?;
|
||||
let Some(unfurled) = unfurled else {
|
||||
return true; // nothing to unfurl
|
||||
return Ok(true); // nothing to unfurl
|
||||
};
|
||||
let range = to_range(text_info, &dep.argument_range);
|
||||
let maybe_relative_index =
|
||||
text_info.text_str()[range.start..].find(specifier);
|
||||
let Some(relative_index) = maybe_relative_index else {
|
||||
return false;
|
||||
return Ok(false);
|
||||
};
|
||||
let start = range.start + relative_index;
|
||||
text_changes.push(deno_ast::TextChange {
|
||||
range: start..start + specifier.len(),
|
||||
new_text: unfurled,
|
||||
});
|
||||
true
|
||||
Ok(true)
|
||||
}
|
||||
Some(DynamicTemplatePart::Expr) => {
|
||||
false // failed analyzing
|
||||
Ok(false) // failed analyzing
|
||||
}
|
||||
None => {
|
||||
true // ignore
|
||||
Ok(true) // ignore
|
||||
}
|
||||
},
|
||||
deno_graph::DynamicArgument::Expr => {
|
||||
false // failed analyzing
|
||||
Ok(false) // failed analyzing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -292,21 +325,22 @@ impl SpecifierUnfurler {
|
|||
url: &ModuleSpecifier,
|
||||
parsed_source: &ParsedSource,
|
||||
diagnostic_reporter: &mut dyn FnMut(SpecifierUnfurlerDiagnostic),
|
||||
) -> String {
|
||||
) -> Result<String, AnyError> {
|
||||
let mut text_changes = Vec::new();
|
||||
let text_info = parsed_source.text_info_lazy();
|
||||
let module_info = ParserModuleAnalyzer::module_info(parsed_source);
|
||||
let analyze_specifier =
|
||||
|specifier: &str,
|
||||
range: &deno_graph::PositionRange,
|
||||
text_changes: &mut Vec<deno_ast::TextChange>| {
|
||||
if let Some(unfurled) = self.unfurl_specifier(url, specifier) {
|
||||
text_changes.push(deno_ast::TextChange {
|
||||
range: to_range(text_info, range),
|
||||
new_text: unfurled,
|
||||
});
|
||||
}
|
||||
};
|
||||
let analyze_specifier = |specifier: &str,
|
||||
range: &deno_graph::PositionRange,
|
||||
text_changes: &mut Vec<deno_ast::TextChange>|
|
||||
-> Result<(), AnyError> {
|
||||
if let Some(unfurled) = self.unfurl_specifier(url, specifier)? {
|
||||
text_changes.push(deno_ast::TextChange {
|
||||
range: to_range(text_info, range),
|
||||
new_text: unfurled,
|
||||
});
|
||||
}
|
||||
Ok(())
|
||||
};
|
||||
for dep in &module_info.dependencies {
|
||||
match dep {
|
||||
DependencyDescriptor::Static(dep) => {
|
||||
|
@ -314,11 +348,15 @@ impl SpecifierUnfurler {
|
|||
&dep.specifier,
|
||||
&dep.specifier_range,
|
||||
&mut text_changes,
|
||||
);
|
||||
)?;
|
||||
}
|
||||
DependencyDescriptor::Dynamic(dep) => {
|
||||
let success =
|
||||
self.try_unfurl_dynamic_dep(url, text_info, dep, &mut text_changes);
|
||||
let success = self.try_unfurl_dynamic_dep(
|
||||
url,
|
||||
text_info,
|
||||
dep,
|
||||
&mut text_changes,
|
||||
)?;
|
||||
|
||||
if !success {
|
||||
let start_pos = text_info.line_start(dep.argument_range.start.line)
|
||||
|
@ -345,26 +383,26 @@ impl SpecifierUnfurler {
|
|||
&specifier_with_range.text,
|
||||
&specifier_with_range.range,
|
||||
&mut text_changes,
|
||||
);
|
||||
)?;
|
||||
}
|
||||
for jsdoc in &module_info.jsdoc_imports {
|
||||
analyze_specifier(
|
||||
&jsdoc.specifier.text,
|
||||
&jsdoc.specifier.range,
|
||||
&mut text_changes,
|
||||
);
|
||||
)?;
|
||||
}
|
||||
if let Some(specifier_with_range) = &module_info.jsx_import_source {
|
||||
analyze_specifier(
|
||||
&specifier_with_range.text,
|
||||
&specifier_with_range.range,
|
||||
&mut text_changes,
|
||||
);
|
||||
)?;
|
||||
}
|
||||
|
||||
let rewritten_text =
|
||||
deno_ast::apply_text_changes(text_info.text_str(), text_changes);
|
||||
rewritten_text
|
||||
Ok(rewritten_text)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -477,10 +515,10 @@ mod tests {
|
|||
);
|
||||
let fs = Arc::new(RealFs);
|
||||
let unfurler = SpecifierUnfurler::new(
|
||||
Some(CliSloppyImportsResolver::new(SloppyImportsCachedFs::new(
|
||||
fs,
|
||||
Some(Arc::new(CliSloppyImportsResolver::new(
|
||||
SloppyImportsCachedFs::new(fs),
|
||||
))),
|
||||
workspace_resolver,
|
||||
Arc::new(workspace_resolver),
|
||||
true,
|
||||
);
|
||||
|
||||
|
@ -518,7 +556,8 @@ const warn2 = await import(`${expr}`);
|
|||
let source = parse_ast(&specifier, source_code);
|
||||
let mut d = Vec::new();
|
||||
let mut reporter = |diagnostic| d.push(diagnostic);
|
||||
let unfurled_source = unfurler.unfurl(&specifier, &source, &mut reporter);
|
||||
let unfurled_source =
|
||||
unfurler.unfurl(&specifier, &source, &mut reporter).unwrap();
|
||||
assert_eq!(d.len(), 2);
|
||||
assert!(
|
||||
matches!(
|
||||
|
|
|
@ -656,17 +656,21 @@ fn op_load_inner(
|
|||
}
|
||||
Module::Npm(_) | Module::Node(_) => None,
|
||||
Module::External(module) => {
|
||||
// means it's Deno code importing an npm module
|
||||
let specifier = node::resolve_specifier_into_node_modules(
|
||||
&module.specifier,
|
||||
&deno_fs::RealFs,
|
||||
);
|
||||
Some(Cow::Owned(load_from_node_modules(
|
||||
&specifier,
|
||||
state.maybe_npm.as_ref(),
|
||||
&mut media_type,
|
||||
&mut is_cjs,
|
||||
)?))
|
||||
if module.specifier.scheme() != "file" {
|
||||
None
|
||||
} else {
|
||||
// means it's Deno code importing an npm module
|
||||
let specifier = node::resolve_specifier_into_node_modules(
|
||||
&module.specifier,
|
||||
&deno_fs::RealFs,
|
||||
);
|
||||
Some(Cow::Owned(load_from_node_modules(
|
||||
&specifier,
|
||||
state.maybe_npm.as_ref(),
|
||||
&mut media_type,
|
||||
&mut is_cjs,
|
||||
)?))
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if let Some(npm) = state
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_broadcast_channel"
|
||||
version = "0.173.0"
|
||||
version = "0.174.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
2
ext/cache/Cargo.toml
vendored
2
ext/cache/Cargo.toml
vendored
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_cache"
|
||||
version = "0.111.0"
|
||||
version = "0.112.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_canvas"
|
||||
version = "0.48.0"
|
||||
version = "0.49.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_console"
|
||||
version = "0.179.0"
|
||||
version = "0.180.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_cron"
|
||||
version = "0.59.0"
|
||||
version = "0.60.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_crypto"
|
||||
version = "0.193.0"
|
||||
version = "0.194.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_fetch"
|
||||
version = "0.203.0"
|
||||
version = "0.204.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_ffi"
|
||||
version = "0.166.0"
|
||||
version = "0.167.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -578,7 +578,7 @@ class FsFile {
|
|||
this.#rid = rid;
|
||||
if (!symbol || symbol !== SymbolFor("Deno.internal.FsFile")) {
|
||||
throw new TypeError(
|
||||
"`Deno.FsFile` cannot be constructed, use `Deno.open()` or `Deno.openSync()` instead.",
|
||||
"'Deno.FsFile' cannot be constructed, use 'Deno.open()' or 'Deno.openSync()' instead",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -713,11 +713,15 @@ function checkOpenOptions(options) {
|
|||
(val) => val === true,
|
||||
).length === 0
|
||||
) {
|
||||
throw new Error("OpenOptions requires at least one option to be true");
|
||||
throw new Error(
|
||||
"'options' requires at least one option to be true",
|
||||
);
|
||||
}
|
||||
|
||||
if (options.truncate && !options.write) {
|
||||
throw new Error("'truncate' option requires 'write' option");
|
||||
throw new Error(
|
||||
"'truncate' option requires 'write' to be true",
|
||||
);
|
||||
}
|
||||
|
||||
const createOrCreateNewWithoutWriteOrAppend =
|
||||
|
@ -726,7 +730,7 @@ function checkOpenOptions(options) {
|
|||
|
||||
if (createOrCreateNewWithoutWriteOrAppend) {
|
||||
throw new Error(
|
||||
"'create' or 'createNew' options require 'write' or 'append' option",
|
||||
"'create' or 'createNew' options require 'write' or 'append' to be true",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_fs"
|
||||
version = "0.89.0"
|
||||
version = "0.90.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_http"
|
||||
version = "0.177.0"
|
||||
version = "0.178.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_io"
|
||||
version = "0.89.0"
|
||||
version = "0.90.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_kv"
|
||||
version = "0.87.0"
|
||||
version = "0.88.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_napi"
|
||||
version = "0.110.0"
|
||||
version = "0.111.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "napi_sym"
|
||||
version = "0.109.0"
|
||||
version = "0.110.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_net"
|
||||
version = "0.171.0"
|
||||
version = "0.172.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_node"
|
||||
version = "0.116.0"
|
||||
version = "0.117.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -148,9 +148,13 @@ export class TLSSocket extends net.Socket {
|
|||
: new TCP(TCPConstants.SOCKET);
|
||||
}
|
||||
|
||||
const { promise, resolve } = Promise.withResolvers();
|
||||
|
||||
// Patches `afterConnect` hook to replace TCP conn with TLS conn
|
||||
const afterConnect = handle.afterConnect;
|
||||
handle.afterConnect = async (req: any, status: number) => {
|
||||
options.hostname ??= undefined; // coerce to undefined if null, startTls expects hostname to be undefined
|
||||
|
||||
try {
|
||||
const conn = await Deno.startTls(handle[kStreamBaseField], options);
|
||||
try {
|
||||
|
@ -164,15 +168,25 @@ export class TLSSocket extends net.Socket {
|
|||
// Don't interrupt "secure" event to let the first read/write
|
||||
// operation emit the error.
|
||||
}
|
||||
|
||||
// Assign the TLS connection to the handle and resume reading.
|
||||
handle[kStreamBaseField] = conn;
|
||||
handle.upgrading = false;
|
||||
if (!handle.pauseOnCreate) {
|
||||
handle.readStart();
|
||||
}
|
||||
|
||||
resolve();
|
||||
|
||||
tlssock.emit("secure");
|
||||
tlssock.removeListener("end", onConnectEnd);
|
||||
} catch (_) {
|
||||
} catch {
|
||||
// TODO(kt3k): Handle this
|
||||
}
|
||||
return afterConnect.call(handle, req, status);
|
||||
};
|
||||
|
||||
handle.upgrading = promise;
|
||||
(handle as any).verifyError = function () {
|
||||
return null; // Never fails, rejectUnauthorized is always true in Deno.
|
||||
};
|
||||
|
|
|
@ -479,13 +479,13 @@ export class ClientHttp2Session extends Http2Session {
|
|||
|
||||
socket.on("error", socketOnError);
|
||||
socket.on("close", socketOnClose);
|
||||
|
||||
socket[kHandle].pauseOnCreate = true;
|
||||
const connPromise = new Promise((resolve) => {
|
||||
const eventName = url.startsWith("https") ? "secureConnect" : "connect";
|
||||
socket.once(eventName, () => {
|
||||
const rid = socket[kHandle][kStreamBaseField][internalRidSymbol];
|
||||
nextTick(() => {
|
||||
resolve(rid);
|
||||
});
|
||||
nextTick(() => resolve(rid));
|
||||
});
|
||||
});
|
||||
socket[kSession] = this;
|
||||
|
|
|
@ -320,8 +320,16 @@ export class LibuvStreamWrap extends HandleWrap {
|
|||
/** Internal method for reading from the attached stream. */
|
||||
async #read() {
|
||||
let buf = this.#buf;
|
||||
|
||||
let nread: number | null;
|
||||
const ridBefore = this[kStreamBaseField]![internalRidSymbol];
|
||||
|
||||
if (this.upgrading) {
|
||||
// Starting an upgrade, stop reading. Upgrading will resume reading.
|
||||
this.readStop();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
nread = await this[kStreamBaseField]!.read(buf);
|
||||
} catch (e) {
|
||||
|
@ -382,6 +390,11 @@ export class LibuvStreamWrap extends HandleWrap {
|
|||
|
||||
const ridBefore = this[kStreamBaseField]![internalRidSymbol];
|
||||
|
||||
if (this.upgrading) {
|
||||
// There is an upgrade in progress, queue the write request.
|
||||
await this.upgrading;
|
||||
}
|
||||
|
||||
let nwritten = 0;
|
||||
try {
|
||||
// TODO(crowlKats): duplicate from runtime/js/13_buffer.js
|
||||
|
@ -400,7 +413,6 @@ export class LibuvStreamWrap extends HandleWrap {
|
|||
}
|
||||
|
||||
let status: number;
|
||||
|
||||
// TODO(cmorten): map err to status codes
|
||||
if (
|
||||
e instanceof Deno.errors.BadResource ||
|
||||
|
|
|
@ -54,7 +54,7 @@ export function clearTimeout(timeout?: Timeout | number) {
|
|||
const id = +timeout;
|
||||
const timer = MapPrototypeGet(activeTimers, id);
|
||||
if (timer) {
|
||||
timeout._destroyed = true;
|
||||
timer._destroyed = true;
|
||||
MapPrototypeDelete(activeTimers, id);
|
||||
}
|
||||
clearTimeout_(id);
|
||||
|
@ -74,7 +74,7 @@ export function clearInterval(timeout?: Timeout | number | string) {
|
|||
const id = +timeout;
|
||||
const timer = MapPrototypeGet(activeTimers, id);
|
||||
if (timer) {
|
||||
timeout._destroyed = true;
|
||||
timer._destroyed = true;
|
||||
MapPrototypeDelete(activeTimers, id);
|
||||
}
|
||||
clearInterval_(id);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_telemetry"
|
||||
version = "0.1.0"
|
||||
version = "0.2.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_tls"
|
||||
version = "0.166.0"
|
||||
version = "0.167.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_url"
|
||||
version = "0.179.0"
|
||||
version = "0.180.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_web"
|
||||
version = "0.210.0"
|
||||
version = "0.211.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_webgpu"
|
||||
version = "0.146.0"
|
||||
version = "0.147.0"
|
||||
authors = ["the Deno authors"]
|
||||
edition.workspace = true
|
||||
license = "MIT"
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_webidl"
|
||||
version = "0.179.0"
|
||||
version = "0.180.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_websocket"
|
||||
version = "0.184.0"
|
||||
version = "0.185.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_webstorage"
|
||||
version = "0.174.0"
|
||||
version = "0.175.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_resolver"
|
||||
version = "0.11.0"
|
||||
version = "0.12.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "node_resolver"
|
||||
version = "0.18.0"
|
||||
version = "0.19.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_runtime"
|
||||
version = "0.188.0"
|
||||
version = "0.189.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[package]
|
||||
name = "deno_permissions"
|
||||
version = "0.39.0"
|
||||
version = "0.40.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
|
|
4
tests/specs/publish/bun_specifier/__test__.jsonc
Normal file
4
tests/specs/publish/bun_specifier/__test__.jsonc
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"args": "publish --token 'sadfasdf'",
|
||||
"output": "bun_specifier.out"
|
||||
}
|
6
tests/specs/publish/bun_specifier/bun_specifier.out
Normal file
6
tests/specs/publish/bun_specifier/bun_specifier.out
Normal file
|
@ -0,0 +1,6 @@
|
|||
Check file:///[WILDCARD]/mod.ts
|
||||
Checking for slow types in the public API...
|
||||
Check file:///[WILDCARD]/mod.ts
|
||||
Publishing @foo/bar@1.0.0 ...
|
||||
Successfully published @foo/bar@1.0.0
|
||||
Visit http://127.0.0.1:4250/@foo/bar@1.0.0 for details
|
8
tests/specs/publish/bun_specifier/deno.json
Normal file
8
tests/specs/publish/bun_specifier/deno.json
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "@foo/bar",
|
||||
"version": "1.0.0",
|
||||
"exports": {
|
||||
".": "./mod.ts"
|
||||
},
|
||||
"license": "MIT"
|
||||
}
|
1
tests/specs/publish/bun_specifier/mod.ts
Normal file
1
tests/specs/publish/bun_specifier/mod.ts
Normal file
|
@ -0,0 +1 @@
|
|||
import "bun:sqlite";
|
|
@ -12,7 +12,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
|||
|
||||
info: the import was resolved to 'http://localhost:4545/welcome.ts'
|
||||
info: this specifier is not allowed to be imported on jsr
|
||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
||||
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||
docs: https://jsr.io/go/invalid-external-import
|
||||
|
||||
error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
||||
|
@ -25,7 +25,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
|||
|
||||
info: the import was resolved to 'http://localhost:4545/echo.ts'
|
||||
info: this specifier is not allowed to be imported on jsr
|
||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
||||
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||
docs: https://jsr.io/go/invalid-external-import
|
||||
|
||||
error: Found 2 problems
|
||||
|
|
|
@ -13,7 +13,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
|||
|
||||
info: the import was resolved to 'http://esm.sh/react-dom@18.2.0/server'
|
||||
info: this specifier is not allowed to be imported on jsr
|
||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
||||
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||
docs: https://jsr.io/go/invalid-external-import
|
||||
|
||||
error: Found 1 problem
|
||||
|
|
5
tests/specs/publish/missing_name/__test__.jsonc
Normal file
5
tests/specs/publish/missing_name/__test__.jsonc
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"args": "publish --token 'sadfasdf'",
|
||||
"output": "publish.out",
|
||||
"exitCode": 1
|
||||
}
|
4
tests/specs/publish/missing_name/deno.json
Normal file
4
tests/specs/publish/missing_name/deno.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"version": "1.0.0",
|
||||
"exports": "./mod.ts"
|
||||
}
|
3
tests/specs/publish/missing_name/mod.ts
Normal file
3
tests/specs/publish/missing_name/mod.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
export function add(a: number, b: number): number {
|
||||
return a + b;
|
||||
}
|
1
tests/specs/publish/missing_name/publish.out
Normal file
1
tests/specs/publish/missing_name/publish.out
Normal file
|
@ -0,0 +1 @@
|
|||
error: Missing 'name' field in 'file:///[WILDCARD]deno.json'.
|
|
@ -13,7 +13,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'https' specifier
|
|||
|
||||
info: the import was resolved to 'https://deno.land/std/assert/assert.ts'
|
||||
info: this specifier is not allowed to be imported on jsr
|
||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
||||
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||
docs: https://jsr.io/go/invalid-external-import
|
||||
|
||||
error: Found 1 problem
|
||||
|
|
|
@ -137,7 +137,7 @@ Deno.test(async function openOptions() {
|
|||
await Deno.open(filename, { write: false });
|
||||
},
|
||||
Error,
|
||||
"OpenOptions requires at least one option to be true",
|
||||
"'options' requires at least one option to be true",
|
||||
);
|
||||
|
||||
await assertRejects(
|
||||
|
@ -145,7 +145,7 @@ Deno.test(async function openOptions() {
|
|||
await Deno.open(filename, { truncate: true, write: false });
|
||||
},
|
||||
Error,
|
||||
"'truncate' option requires 'write' option",
|
||||
"'truncate' option requires 'write' to be true",
|
||||
);
|
||||
|
||||
await assertRejects(
|
||||
|
@ -153,7 +153,7 @@ Deno.test(async function openOptions() {
|
|||
await Deno.open(filename, { create: true, write: false });
|
||||
},
|
||||
Error,
|
||||
"'create' or 'createNew' options require 'write' or 'append' option",
|
||||
"'create' or 'createNew' options require 'write' or 'append' to be true",
|
||||
);
|
||||
|
||||
await assertRejects(
|
||||
|
@ -161,7 +161,7 @@ Deno.test(async function openOptions() {
|
|||
await Deno.open(filename, { createNew: true, append: false });
|
||||
},
|
||||
Error,
|
||||
"'create' or 'createNew' options require 'write' or 'append' option",
|
||||
"'create' or 'createNew' options require 'write' or 'append' to be true",
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
@ -100,6 +100,16 @@ Deno.test("[node/timers refresh cancelled timer]", () => {
|
|||
p.refresh();
|
||||
});
|
||||
|
||||
Deno.test("[node/timers] clearTimeout with number", () => {
|
||||
const timer = +timers.setTimeout(() => fail(), 10);
|
||||
timers.clearTimeout(timer);
|
||||
});
|
||||
|
||||
Deno.test("[node/timers] clearInterval with number", () => {
|
||||
const timer = +timers.setInterval(() => fail(), 10);
|
||||
timers.clearInterval(timer);
|
||||
});
|
||||
|
||||
Deno.test("[node/timers setImmediate returns Immediate object]", () => {
|
||||
const { clearImmediate, setImmediate } = timers;
|
||||
|
||||
|
|
|
@ -257,3 +257,17 @@ Deno.test("TLSSocket.alpnProtocol is set for client", async () => {
|
|||
listener.close();
|
||||
await new Promise((resolve) => outgoing.on("close", resolve));
|
||||
});
|
||||
|
||||
Deno.test("tls connect upgrade tcp", async () => {
|
||||
const { promise, resolve } = Promise.withResolvers<void>();
|
||||
|
||||
const socket = new net.Socket();
|
||||
socket.connect(443, "google.com");
|
||||
socket.on("connect", () => {
|
||||
const secure = tls.connect({ socket });
|
||||
secure.on("secureConnect", () => resolve());
|
||||
});
|
||||
|
||||
await promise;
|
||||
socket.destroy();
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue