diff --git a/cli/doc/ts_type.rs b/cli/doc/ts_type.rs index ec1a5e7e9a..e1677f13e9 100644 --- a/cli/doc/ts_type.rs +++ b/cli/doc/ts_type.rs @@ -529,7 +529,7 @@ impl Into for &TsType { TsUnionOrIntersectionType(union_or_inter) => union_or_inter.into(), TsArrayType(array_type) => array_type.into(), TsTupleType(tuple_type) => tuple_type.into(), - TsTypeOperator(type_op_type) => type_op_type.into(), + TsTypeOperator(type_op_name) => type_op_name.into(), TsParenthesizedType(paren_type) => paren_type.into(), TsRestType(rest_type) => rest_type.into(), TsOptionalType(optional_type) => optional_type.into(), @@ -737,7 +737,7 @@ pub fn ts_type_ann_to_def(type_ann: &TsTypeAnn) -> TsTypeDef { TsUnionOrIntersectionType(union_or_inter) => union_or_inter.into(), TsArrayType(array_type) => array_type.into(), TsTupleType(tuple_type) => tuple_type.into(), - TsTypeOperator(type_op_type) => type_op_type.into(), + TsTypeOperator(type_op_name) => type_op_name.into(), TsParenthesizedType(paren_type) => paren_type.into(), TsRestType(rest_type) => rest_type.into(), TsOptionalType(optional_type) => optional_type.into(), diff --git a/cli/js/deno.ts b/cli/js/deno.ts index 5bc69fc7b1..e4211c23de 100644 --- a/cli/js/deno.ts +++ b/cli/js/deno.ts @@ -53,7 +53,7 @@ export { export { metrics, Metrics } from "./ops/runtime.ts"; export { mkdirSync, mkdir, MkdirOptions } from "./ops/fs/mkdir.ts"; export { connect, listen, Listener, Conn } from "./net.ts"; -export { env, exit, execPath } from "./ops/os.ts"; +export { dir, env, exit, execPath, osName } from "./ops/os.ts"; export { run, RunOptions, Process, ProcessStatus } from "./process.ts"; export { DirEntry, readDirSync, readDir } from "./ops/fs/read_dir.ts"; export { readFileSync, readFile } from "./read_file.ts"; diff --git a/cli/js/lib.deno.unstable.d.ts b/cli/js/lib.deno.unstable.d.ts index dc50416fcb..f425dec562 100644 --- a/cli/js/lib.deno.unstable.d.ts +++ b/cli/js/lib.deno.unstable.d.ts @@ -32,6 +32,18 @@ declare namespace Deno { * Requires `allow-read` and `allow-write` permissions. */ export function linkSync(oldpath: string, newpath: string): void; + /** + * Returns the os name. + * + * ```ts + * console.log(Deno.osName()); // e.g. "Linux" + * ``` + * + */ + + export function osName(): string; + + /** Creates `newpath` as a hard link to `oldpath`. /** **UNSTABLE**: This API needs a security review. * * Creates `newpath` as a hard link to `oldpath`. diff --git a/cli/js/ops/os.ts b/cli/js/ops/os.ts index e63d8b3583..9151064955 100644 --- a/cli/js/ops/os.ts +++ b/cli/js/ops/os.ts @@ -72,3 +72,7 @@ export function dir(kind: DirKind): string | null { export function execPath(): string { return sendSync("op_exec_path"); } + +export function osName(): string { + return sendSync("op_name"); +} diff --git a/cli/ops/os.rs b/cli/ops/os.rs index ab7ed28766..77c5473620 100644 --- a/cli/ops/os.rs +++ b/cli/ops/os.rs @@ -20,6 +20,7 @@ pub fn init(i: &mut CoreIsolate, s: &State) { i.register_op("op_hostname", s.stateful_json_op(op_hostname)); i.register_op("op_loadavg", s.stateful_json_op(op_loadavg)); i.register_op("op_os_release", s.stateful_json_op(op_os_release)); + i.register_op("op_name", s.stateful_json_op(op_name)); } #[derive(Deserialize)] @@ -206,3 +207,14 @@ fn op_os_release( let release = sys_info::os_release().unwrap_or_else(|_| "".to_string()); Ok(JsonOp::Sync(json!(release))) } + +fn op_name( + state: &State, + _args: Value, + _zero_copy: &mut [ZeroCopyBuf], +) -> Result { + state.check_unstable("Deno.osName"); + state.check_env()?; + let os_name = sys_info::os_type().unwrap_or_else(|_| "".to_string()); + Ok(JsonOp::Sync(json!(os_name))) +} diff --git a/cli/tests/unit/os_test.ts b/cli/tests/unit/os_test.ts index 9698692c79..deb0385a86 100644 --- a/cli/tests/unit/os_test.ts +++ b/cli/tests/unit/os_test.ts @@ -326,6 +326,22 @@ unitTest({ perms: { env: false } }, function hostnamePerm(): void { assert(caughtError); }); +unitTest({ perms: { env: true } }, function osName(): void { + assertNotEquals(Deno.osName(), ""); +}); + +unitTest({ perms: { env: false } }, function osNamePerm(): void { + let caughtError = false; + try { + Deno.osName(); + } catch (err) { + caughtError = true; + assert(err instanceof Deno.errors.PermissionDenied); + assertEquals(err.name, "PermissionDenied"); + } + assert(caughtError); +}); + unitTest({ perms: { env: true } }, function releaseDir(): void { assertNotEquals(Deno.osRelease(), ""); }); diff --git a/std/node/os.ts b/std/node/os.ts index 27b054f4de..65b158b3fd 100644 --- a/std/node/os.ts +++ b/std/node/os.ts @@ -190,9 +190,9 @@ export function totalmem(): number { notImplemented(SEE_GITHUB_ISSUE); } -/** Not yet implemented */ +/** Returns the operating system name as returned by uname(3) */ export function type(): string { - notImplemented(SEE_GITHUB_ISSUE); + return Deno.osName(); } /** Not yet implemented */ diff --git a/std/node/os_test.ts b/std/node/os_test.ts index f0b9ca79d4..c67879d23a 100644 --- a/std/node/os_test.ts +++ b/std/node/os_test.ts @@ -244,13 +244,6 @@ test({ Error, "Not implemented" ); - assertThrows( - () => { - os.type(); - }, - Error, - "Not implemented" - ); assertThrows( () => { os.uptime();