diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-02-14 17:38:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-14 17:38:45 +0100 |
commit | d47147fb6ad229b1c039aff9d0959b6e281f4df5 (patch) | |
tree | 6e9e790f2b9bc71b5f0c9c7e64b95cae31579d58 /ext/node/polyfills/_fs/_fs_readlink.ts | |
parent | 1d00bbe47e2ca14e2d2151518e02b2324461a065 (diff) |
feat(ext/node): embed std/node into the snapshot (#17724)
This commit moves "deno_std/node" in "ext/node" crate. The code is
transpiled and snapshotted during the build process.
During the first pass a minimal amount of work was done to create the
snapshot, a lot of code in "ext/node" depends on presence of "Deno"
global. This code will be gradually fixed in the follow up PRs to migrate
it to import relevant APIs from "internal:" modules.
Currently the code from snapshot is not used in any way, and all
Node/npm compatibility still uses code from
"https://deno.land/std/node" (or from the location specified by
"DENO_NODE_COMPAT_URL"). This will also be handled in a follow
up PRs.
---------
Co-authored-by: crowlkats <crowlkats@toaxl.com>
Co-authored-by: Divy Srivastava <dj.srivastava23@gmail.com>
Co-authored-by: Yoshiya Hinosawa <stibium121@gmail.com>
Diffstat (limited to 'ext/node/polyfills/_fs/_fs_readlink.ts')
-rw-r--r-- | ext/node/polyfills/_fs/_fs_readlink.ts | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/ext/node/polyfills/_fs/_fs_readlink.ts b/ext/node/polyfills/_fs/_fs_readlink.ts new file mode 100644 index 000000000..07d1b6f6f --- /dev/null +++ b/ext/node/polyfills/_fs/_fs_readlink.ts @@ -0,0 +1,89 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +import { TextEncoder } from "internal:deno_web/08_text_encoding.js"; +import { + intoCallbackAPIWithIntercept, + MaybeEmpty, + notImplemented, +} from "internal:deno_node/polyfills/_utils.ts"; +import { fromFileUrl } from "internal:deno_node/polyfills/path.ts"; +import { promisify } from "internal:deno_node/polyfills/internal/util.mjs"; + +type ReadlinkCallback = ( + err: MaybeEmpty<Error>, + linkString: MaybeEmpty<string | Uint8Array>, +) => void; + +interface ReadlinkOptions { + encoding?: string | null; +} + +function maybeEncode( + data: string, + encoding: string | null, +): string | Uint8Array { + if (encoding === "buffer") { + return new TextEncoder().encode(data); + } + return data; +} + +function getEncoding( + optOrCallback?: ReadlinkOptions | ReadlinkCallback, +): string | null { + if (!optOrCallback || typeof optOrCallback === "function") { + return null; + } else { + if (optOrCallback.encoding) { + if ( + optOrCallback.encoding === "utf8" || + optOrCallback.encoding === "utf-8" + ) { + return "utf8"; + } else if (optOrCallback.encoding === "buffer") { + return "buffer"; + } else { + notImplemented(`fs.readlink encoding=${optOrCallback.encoding}`); + } + } + return null; + } +} + +export function readlink( + path: string | URL, + optOrCallback: ReadlinkCallback | ReadlinkOptions, + callback?: ReadlinkCallback, +) { + path = path instanceof URL ? fromFileUrl(path) : path; + + let cb: ReadlinkCallback | undefined; + if (typeof optOrCallback === "function") { + cb = optOrCallback; + } else { + cb = callback; + } + + const encoding = getEncoding(optOrCallback); + + intoCallbackAPIWithIntercept<string, Uint8Array | string>( + Deno.readLink, + (data: string): string | Uint8Array => maybeEncode(data, encoding), + cb, + path, + ); +} + +export const readlinkPromise = promisify(readlink) as ( + path: string | URL, + opt?: ReadlinkOptions, +) => Promise<string | Uint8Array>; + +export function readlinkSync( + path: string | URL, + opt?: ReadlinkOptions, +): string | Uint8Array { + path = path instanceof URL ? fromFileUrl(path) : path; + + return maybeEncode(Deno.readLinkSync(path), getEncoding(opt)); +} |