From b9a68ceeda862eb5b1130f9327f44fecf6a84f3a Mon Sep 17 00:00:00 2001 From: David Sherret Date: Sat, 9 Jul 2022 17:33:53 -0400 Subject: [PATCH] feat: initial commit --- .gitignore | 1 + .rustfmt.toml | 3 + .vscode/settings.json | 4 + Cargo.lock | 198 ++++++++++++++++++++++ Cargo.toml | 4 + LICENSE | 21 +++ README.md | 48 ++++++ deno.json | 5 + dprint.json | 19 +++ lib/rs_lib.generated.js | 278 ++++++++++++++++++++++++++++++ lib/rs_lib_bg.wasm | Bin 0 -> 257903 bytes mod.test.ts | 8 + mod.ts | 169 +++++++++++++++++++ rs_lib/Cargo.toml | 18 ++ rs_lib/src/lib.rs | 11 ++ src/deps.test.ts | 1 + src/deps.ts | 5 + src/shell.test.ts | 22 +++ src/shell.ts | 366 ++++++++++++++++++++++++++++++++++++++++ 19 files changed, 1181 insertions(+) create mode 100644 .gitignore create mode 100644 .rustfmt.toml create mode 100644 .vscode/settings.json create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 deno.json create mode 100644 dprint.json create mode 100644 lib/rs_lib.generated.js create mode 100644 lib/rs_lib_bg.wasm create mode 100644 mod.test.ts create mode 100644 mod.ts create mode 100644 rs_lib/Cargo.toml create mode 100644 rs_lib/src/lib.rs create mode 100644 src/deps.test.ts create mode 100644 src/deps.ts create mode 100644 src/shell.test.ts create mode 100644 src/shell.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..9bb8d9d --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,3 @@ +max_width = 80 +tab_spaces = 2 +edition = "2021" diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8fc8192 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "deno.enable": true, + "deno.lint": false +} diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..6eaa2e0 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,198 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" + +[[package]] +name = "bumpalo" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "deno_task_shell" +version = "0.4.0" +source = "git+https://github.com/dsherret/deno_task_shell?rev=21ed031#21ed0311f77969d41ca659289a0099f21c0f3aef" +dependencies = [ + "anyhow", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "proc-macro2" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rs_lib" +version = "0.0.0" +dependencies = [ + "console_error_panic_hook", + "deno_task_shell", + "wasm-bindgen", +] + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "serde" +version = "1.0.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" + +[[package]] +name = "wasm-bindgen" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +dependencies = [ + "cfg-if", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..3c579d8 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "rs_lib", +] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4839751 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 David Sherret + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7ff61b7 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# ax + +**Note:** This is very early stages. Just started working on it. A lot is not tested and won't work. + +An automation toolkit for Deno inspired by [zx](https://github.com/google/zx). + +Differences: + +1. No globals or custom CLI command to execute—import into a script then use `deno run -A your_script.ts`. +1. Cross platform shell to help the code work on Windows. + - Uses [deno_task_shell](https://github.com/denoland/deno_task_shell)'s parser. + - This is very early stages, so I only have simple commands working at the moment and no cross platform commands. + - This also means you will be able to use `cd` like so if you wanted (not implemented, but trivial to implement): + ```ts + await $`cd someDir`; + await $`pwd`.inherit(); // outputs a directory containing "someDir" + ``` + +## Example + +```ts +// note: this is not published yet... +import $ from "https://deno.land/x/ax@{VERSION_GOES_HERE}/mod.ts"; + +const result = await $`deno eval 'console.log(5);'`; +console.log(result.stdout.trim()); // 5 + +// runs the script showing stdout and stderr +await $`deno run my_script.ts`.inherit(); + +await $.sleep(1000); +await $.which("deno"); // path to deno executable +await $.withRetries({ + count: 5, + delay: 5_000, + action: async () => { + await $`cargo publish`; + }, +}); + +// re-export of deno_std's path +$.path.basename("./deno/std/path/mod.ts"); // mod.ts + +// re-export of deno_std's fs +for await (const file of $.fs.expandGlob("**/*.ts")) { + console.log(file); +} +``` diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..1f71dd8 --- /dev/null +++ b/deno.json @@ -0,0 +1,5 @@ +{ + "tasks": { + "wasmbuild": "deno run -A https://deno.land/x/wasmbuild@0.8.3/main.ts" + } +} diff --git a/dprint.json b/dprint.json new file mode 100644 index 0000000..589e539 --- /dev/null +++ b/dprint.json @@ -0,0 +1,19 @@ +{ + "exec": { + "associations": "**/*.rs", + "rustfmt": "rustfmt" + }, + "includes": ["**/*.{ts,tsx,js,jsx,cjs,mjs,json,md,toml,rs}"], + "excludes": [ + "**/node_modules", + "**/*-lock.json", + "**/target" + ], + "plugins": [ + "https://plugins.dprint.dev/typescript-0.69.5.wasm", + "https://plugins.dprint.dev/json-0.15.3.wasm", + "https://plugins.dprint.dev/markdown-0.13.3.wasm", + "https://plugins.dprint.dev/toml-0.5.4.wasm", + "https://plugins.dprint.dev/exec-0.3.1.json@9351b67ec7a6b58a69201c2834cba38cb3d191080aefc6422fb1320f03c8fc4d" + ] +} diff --git a/lib/rs_lib.generated.js b/lib/rs_lib.generated.js new file mode 100644 index 0000000..afa84f8 --- /dev/null +++ b/lib/rs_lib.generated.js @@ -0,0 +1,278 @@ +// @generated file from wasmbuild -- do not edit +// deno-lint-ignore-file +// deno-fmt-ignore-file +// source-hash: b8d4de1c9bb9d6f551e28bc4fbc06c25117498e9 +let wasm; + +const cachedTextDecoder = new TextDecoder("utf-8", { + ignoreBOM: true, + fatal: true, +}); + +cachedTextDecoder.decode(); + +let cachedUint8Memory0; +function getUint8Memory0() { + if (cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +const heap = new Array(32).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getObject(idx) { + return heap[idx]; +} + +function dropObject(idx) { + if (idx < 36) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = new TextEncoder("utf-8"); + +const encodeString = function(arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length); + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len); + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3); + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedInt32Memory0; +function getInt32Memory0() { + if (cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} +/** + * @param {string} command + * @returns {any} + */ +export function parse(command) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0( + command, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len0 = WASM_VECTOR_LEN; + wasm.parse(retptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_json_parse: function(arg0, arg1) { + const ret = JSON.parse(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, + __wbindgen_object_drop_ref: function(arg0) { + takeObject(arg0); + }, + __wbg_error_09919627ac0992f5: function(arg0, arg1) { + try { + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(arg0, arg1); + } + }, + __wbg_new_693216e109162396: function() { + const ret = new Error(); + return addHeapObject(ret); + }, + __wbg_stack_0ddaca5d1abfb52f: function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr0 = passStringToWasm0( + ret, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }, + __wbindgen_throw: function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + }, +}; + +const wasm_url = new URL("rs_lib_bg.wasm", import.meta.url); + +/** + * Decompression callback + * + * @callback decompressCallback + * @param {Uint8Array} compressed + * @return {Uint8Array} decompressed + */ + +/** Instantiates an instance of the Wasm module returning its functions. + * @remarks It is safe to call this multiple times and once successfully + * loaded it will always return a reference to the same object. + * @param {decompressCallback=} transform + */ +export async function instantiate(transform) { + return (await instantiateWithInstance(transform)).exports; +} + +let instanceWithExports; +let lastLoadPromise; + +/** Instantiates an instance of the Wasm module along with its exports. + * @remarks It is safe to call this multiple times and once successfully + * loaded it will always return a reference to the same object. + * @param {decompressCallback=} transform + * @returns {Promise<{ + * instance: WebAssembly.Instance; + * exports: { parse: typeof parse } + * }>} + */ +export function instantiateWithInstance(transform) { + if (instanceWithExports != null) { + return Promise.resolve(instanceWithExports); + } + if (lastLoadPromise == null) { + lastLoadPromise = (async () => { + try { + const instance = (await instantiateModule(transform)).instance; + wasm = instance.exports; + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + instanceWithExports = { + instance, + exports: getWasmInstanceExports(), + }; + return instanceWithExports; + } finally { + lastLoadPromise = null; + } + })(); + } + return lastLoadPromise; +} + +function getWasmInstanceExports() { + return { parse }; +} + +/** Gets if the Wasm module has been instantiated. */ +export function isInstantiated() { + return instanceWithExports != null; +} + +async function instantiateModule(transform) { + switch (wasm_url.protocol) { + case "file:": { + if (typeof Deno !== "object") { + throw new Error("file urls are not supported in this environment"); + } + + if ("permissions" in Deno) { + Deno.permissions.request({ name: "read", path: wasm_url }); + } + const wasmCode = await Deno.readFile(wasm_url); + return WebAssembly.instantiate( + !transform ? wasmCode : transform(wasmCode), + imports, + ); + } + case "https:": + case "http:": { + if (typeof Deno === "object" && "permissions" in Deno) { + Deno.permissions.request({ name: "net", host: wasm_url.host }); + } + const wasmResponse = await fetch(wasm_url); + if (transform) { + const wasmCode = new Uint8Array(await wasmResponse.arrayBuffer()); + return WebAssembly.instantiate(transform(wasmCode), imports); + } + if ( + wasmResponse.headers.get("content-type")?.toLowerCase().startsWith( + "application/wasm", + ) + ) { + return WebAssembly.instantiateStreaming(wasmResponse, imports); + } else { + return WebAssembly.instantiate( + await wasmResponse.arrayBuffer(), + imports, + ); + } + } + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); + } +} diff --git a/lib/rs_lib_bg.wasm b/lib/rs_lib_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c5d4810732e66d582ab1b01d56e60d1a8c468a65 GIT binary patch literal 257903 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 { + const output = await $`deno eval 'console.log(5);'`; + assertEquals(output.code, 0); + assertEquals(output.stdout, "5\n"); +}); diff --git a/mod.ts b/mod.ts new file mode 100644 index 0000000..58bce74 --- /dev/null +++ b/mod.ts @@ -0,0 +1,169 @@ +import { Buffer, fs, path, which, whichSync } from "./src/deps.ts"; +import { parseArgs, ShellPipeReader, spawn } from "./src/shell.ts"; + +export interface $Type { + (strings: TemplateStringsArray, ...exprs: string[]): CommandPromise; + fs: typeof fs; + path: typeof path; + sleep(ms: number): Promise; + withRetries(params: RetryParams): Promise; + which: typeof which; + whichSync: typeof whichSync; +} + +function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export interface RetryParams { + count: number; + /** Delay in milliseconds. */ + delay: number; + action: () => Promise; +} + +async function withRetries(params: RetryParams) { + for (let i = 0; i < params.count; i++) { + if (i > 0) { + console.error( + `Failed. Trying again in ${params.delay} seconds...`, + ); + await sleep(params.delay); + console.error(`Attempt ${i + 1}/${params.count}...`); + } + try { + return await params.action(); + } catch (err) { + console.error(err); + } + } + + throw new Error(`Failed after ${params.count} attempts.`); +} + +export const $: $Type = Object.assign( + (strings: TemplateStringsArray, ...exprs: string[]) => { + const parts = []; + for (let i = 0; i < Math.max(strings.length, exprs.length); i++) { + if (strings.length > i) { + parts.push(strings[i]); + } + if (exprs.length > i) { + parts.push(`"${exprs[i].replace(`"`, `\\"`)}"`); + } + } + const command = parts.join(" "); + return new CommandPromise(command); + }, + { + fs, + path, + sleep, + withRetries, + which, + whichSync, + }, +); +export default $; + +type BufferStdio = "inherit" | "null" | Buffer; + +export class CommandPromise implements PromiseLike { + #command: string; + #stdin: ShellPipeReader = "inherit"; + #stdout: BufferStdio = new Buffer(); + #stderr: BufferStdio = "inherit"; + #nothrow = false; + + constructor(command: string) { + this.#command = command; + } + + then( + onfulfilled?: ((value: CommandResult) => TResult1 | PromiseLike) | null | undefined, + onrejected?: ((reason: any) => TResult2 | PromiseLike) | null | undefined, + ): PromiseLike { + return this.spawn().then(onfulfilled).catch(onrejected); + } + + async spawn(): Promise { + const list = await parseArgs(this.#command); + const code = await spawn(list, { + stdin: this.#stdin, + stdout: this.#stdout, + stderr: this.#stderr, + }); + if (code !== 0 && !this.#nothrow) { + throw new Error(`Exited with error code: ${code}`); + } + return new CommandResult(code, this.#stdout, this.#stderr); + } + + nothrow(): this { + this.#nothrow = true; + return this; + } + + /** Sets stdin, stdout, and stderr to all inherit. */ + inherit(): this { + this.#stdin = "inherit"; + this.#stdout = "inherit"; + this.#stderr = "inherit"; + return this; + } + + stdout(kind: "pipe" | "inherit" | "null") { + if (kind === "pipe") { + this.#stdout = new Buffer(); + } else { + this.#stdout = kind; + } + } + + stderr(kind: "pipe" | "inherit" | "null") { + if (kind === "pipe") { + this.#stderr = new Buffer(); + } else { + this.#stderr = kind; + } + } +} + +const textDecoder = new TextDecoder(); + +export class CommandResult { + #stdout: BufferStdio; + #stderr: BufferStdio; + /** The exit code. */ + readonly code: number; + + constructor(code: number, stdout: BufferStdio, stderr: BufferStdio) { + this.code = code; + this.#stdout = stdout; + this.#stderr = stderr; + } + + get stdout() { + // todo: memoize + return textDecoder.decode(this.stdoutBytes); + } + + get stdoutBytes(): Uint8Array { + if (typeof this.#stdout === "string") { + throw new Error(`Stdout was not piped (was ${this.#stdout}). By default stdout is piped.`); + } + return this.#stdout.bytes(); + } + + get stderr() { + // todo: memoize + return textDecoder.decode(this.stderrBytes); + } + + get stderrBytes(): Uint8Array { + if (typeof this.#stderr === "string") { + throw new Error(`Stderr was not piped (was ${this.#stderr}). Call .stderr("pipe") on the process.`); + } + return this.#stderr.bytes(); + } +} diff --git a/rs_lib/Cargo.toml b/rs_lib/Cargo.toml new file mode 100644 index 0000000..c445037 --- /dev/null +++ b/rs_lib/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "rs_lib" +version = "0.0.0" +edition = "2021" + +[lib] +crate_type = ["cdylib"] + +[profile.release] +codegen-units = 1 +incremental = true +lto = true +opt-level = "z" + +[dependencies] +console_error_panic_hook = { version = "0.1.6" } +deno_task_shell = { git = "https://github.com/dsherret/deno_task_shell", rev = "21ed031", default-features = false, features = ["serialization"] } +wasm-bindgen = { version = "=0.2.81", features = ["serde-serialize"] } diff --git a/rs_lib/src/lib.rs b/rs_lib/src/lib.rs new file mode 100644 index 0000000..2694dd0 --- /dev/null +++ b/rs_lib/src/lib.rs @@ -0,0 +1,11 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub fn parse(command: String) -> Result { + console_error_panic_hook::set_once(); + + match deno_task_shell::parser::parse(&command) { + Ok(list) => Ok(JsValue::from_serde(&list).unwrap()), + Err(err) => Err(JsValue::from_serde(&format!("{}", err)).unwrap()), + } +} diff --git a/src/deps.test.ts b/src/deps.test.ts new file mode 100644 index 0000000..1d5cb33 --- /dev/null +++ b/src/deps.test.ts @@ -0,0 +1 @@ +export { assertEquals } from "https://deno.land/std@0.147.0/testing/asserts.ts"; diff --git a/src/deps.ts b/src/deps.ts new file mode 100644 index 0000000..5897066 --- /dev/null +++ b/src/deps.ts @@ -0,0 +1,5 @@ +export * as fs from "https://deno.land/std@0.147.0/fs/mod.ts"; +export { Buffer } from "https://deno.land/std@0.147.0/io/buffer.ts"; +export * as path from "https://deno.land/std@0.147.0/path/mod.ts"; +export { readAll } from "https://deno.land/std@0.147.0/streams/conversion.ts"; +export { which, whichSync } from "https://deno.land/x/which@0.1.1/mod.ts"; diff --git a/src/shell.test.ts b/src/shell.test.ts new file mode 100644 index 0000000..409ab96 --- /dev/null +++ b/src/shell.test.ts @@ -0,0 +1,22 @@ +import { assertEquals } from "./deps.test.ts"; +import { parseArgsOld } from "./shell.ts"; + +Deno.test("should parse args", () => { + assertEquals(parseArgsOld("some command"), ["some", "command"]); + assertEquals(parseArgsOld(" some command "), ["some", "command"]); + assertEquals(parseArgsOld("test 'this is a test' test"), [ + "test", + "this is a test", + "test", + ]); + assertEquals(parseArgsOld(`test "this is a test" test`), [ + "test", + "this is a test", + "test", + ]); + assertEquals(parseArgsOld(`test "thi's \\"is a test" test`), [ + "test", + `thi's "is a test`, + "test", + ]); +}); diff --git a/src/shell.ts b/src/shell.ts new file mode 100644 index 0000000..9759203 --- /dev/null +++ b/src/shell.ts @@ -0,0 +1,366 @@ +import { instantiate } from "../lib/rs_lib.generated.js"; + +export interface SequentialList { + items: SequentialListItem[]; +} + +export interface SequentialListItem { + isAsync: boolean; + sequence: Sequence; +} + +export type Sequence = ShellVar | Pipeline | BooleanList; + +export interface ShellVar extends EnvVar { + kind: "shellVar"; +} + +export interface EnvVar { + // todo... +} + +export interface Pipeline { + kind: "pipeline"; + negated: boolean; + inner: PipelineInner; +} + +export type PipelineInner = Command | PipeSequence; + +export interface Command { + kind: "command"; + inner: CommandInner; + redirect: Redirect | undefined; +} + +export type CommandInner = SimpleCommand | TaggedSequentialList; + +export interface SimpleCommand { + kind: "simple"; + envVars: EnvVar[]; + args: StringOrWord[]; +} + +export type StringOrWord = Word | StringOrWordString; + +export interface Word { + kind: "word"; + value: StringPart[]; +} + +export interface StringOrWordString { + kind: "string"; + value: StringPart[]; +} + +export type StringPart = Text | Variable | StringPartCommand; + +export interface Text { + kind: "text"; + value: string; +} + +export interface Variable { + kind: "variable"; + value: string; +} + +export interface StringPartCommand { + kind: "command"; + value: SequentialList; +} + +export interface TaggedSequentialList extends SequentialList { + kind: "sequentialList"; +} + +export interface Redirect { + // todo... +} + +export interface PipeSequence { + kind: "pipeSequence"; + // todo... +} + +export interface BooleanList { + kind: "booleanList"; + // todo... +} + +export type ShellPipeReader = "inherit" | "null" | Deno.Reader; +export type ShellPipeWriter = "inherit" | "null" | Deno.Writer; + +type ExecuteResult = ExitExecuteResult | ContinueExecuteResult; + +function resultFromCode(code: number): ContinueExecuteResult { + return { + kind: "continue", + code, + }; +} + +export interface ExitExecuteResult { + kind: "exit"; + code: number; +} + +export interface ContinueExecuteResult { + kind: "continue"; + code: number; + changes?: EnvChange[]; +} + +export type EnvChange = SetEnvVarChange | SetShellVarChange | CdChange; + +export interface SetEnvVarChange { + kind: "envvar"; + // todo... +} + +export interface SetShellVarChange { + kind: "shellvar"; + // todo... +} + +export interface CdChange { + kind: "cd"; + // todo... +} + +class Context { + stdin: ShellPipeReader; + stdout: ShellPipeWriter; + stderr: ShellPipeWriter; + cwd: string; + env: { + [key: string]: string; + }; + + constructor(opts: { + stdin: ShellPipeReader; + stdout: ShellPipeWriter; + stderr: ShellPipeWriter; + }) { + this.stdin = opts.stdin; + this.stdout = opts.stdout; + this.stderr = opts.stderr; + // todo: configurable + this.cwd = Deno.cwd(); + this.env = Deno.env.toObject(); + } +} + +export async function parseArgs(command: string) { + const { parse } = await instantiate(); + return parse(command) as SequentialList; +} + +export interface SpawnOpts { + stdin: ShellPipeReader; + stdout: ShellPipeWriter; + stderr: ShellPipeWriter; +} + +export async function spawn(list: SequentialList, opts: SpawnOpts) { + const context = new Context(opts); + let code = 0; + for (const item of list.items) { + if (item.isAsync) { + throw new Error("Async commands are not implemented."); + } + const result = await executeSequence(item.sequence, context); + switch (result.kind) { + case "continue": + code = result.code; + break; + case "exit": + return result.code; + default: + const _assertNever: never = result; + } + } + return code; +} + +function executeSequence(sequence: Sequence, context: Context): Promise { + switch (sequence.kind) { + case "pipeline": + return executePipeline(sequence, context); + case "booleanList": + case "shellVar": + default: + throw new Error(`Not implemented: ${sequence.kind}`); + } +} + +function executePipeline(pipeline: Pipeline, context: Context): Promise { + if (pipeline.negated) { + throw new Error("Negated pipelines are not implemented."); + } + return executePipelineInner(pipeline.inner, context); +} + +function executePipelineInner(inner: PipelineInner, context: Context): Promise { + switch (inner.kind) { + case "command": + return executeCommand(inner, context); + case "pipeSequence": + throw new Error(`Not implemented: ${inner.kind}`); + } +} + +function executeCommand(command: Command, context: Context): Promise { + if (command.redirect != null) { + throw new Error("Redirects are not implemented."); + } + return executeCommandInner(command.inner, context); +} + +async function executeCommandInner(command: CommandInner, context: Context): Promise { + switch (command.kind) { + case "simple": + if (command.envVars.length > 0) { + throw new Error("Env vars on commands are not implemented."); + } + const commandArgs = await evaluateArgs(command.args, context); + const p = Deno.run({ + cmd: commandArgs, + cwd: context.cwd, + env: context.env, + stdin: getStdioStringValue(context.stdin), + stdout: getStdioStringValue(context.stdout), + stderr: getStdioStringValue(context.stderr), + }); + try { + const writeStdinTask = writeStdin(context.stdin, p); + const readStdoutTask = readStdOutOrErr(p.stdout, context.stdout); + const readStderrTask = readStdOutOrErr(p.stderr, context.stderr); + const [status] = await Promise.all([ + p.status(), + writeStdinTask, + readStdoutTask, + readStderrTask, + ]); + return resultFromCode(status.code); + } finally { + p.close(); + p.stdout?.close(); + p.stderr?.close(); + } + case "sequentialList": + default: + throw new Error(`Not implemented: ${command.kind}`); + } + + async function writeStdin(stdin: ShellPipeReader, p: Deno.Process) { + if (typeof stdin === "string") { + return; + } + await pipeReaderToWriter(stdin, p.stdin!); + } + + async function readStdOutOrErr(reader: Deno.Reader | null, writer: ShellPipeWriter) { + if (typeof writer === "string" || reader == null) { + return; + } + await pipeReaderToWriter(reader, writer); + } + + async function pipeReaderToWriter(reader: Deno.Reader, writer: Deno.Writer) { + while (true) { + const buffer = new Uint8Array(1024); + const length = await reader.read(buffer); + if (length === 0 || length == null) { + break; + } + await writer.write(buffer.subarray(0, length)); + } + } + + function getStdioStringValue(value: ShellPipeReader | ShellPipeWriter) { + if (value === "inherit" || value === "null") { + return value; + } + return "piped"; + } +} + +async function evaluateArgs(stringOrWords: StringOrWord[], context: Context) { + const result = []; + for (const stringOrWord of stringOrWords) { + switch (stringOrWord.kind) { + case "word": + result.push(...await evaluateStringParts(stringOrWord.value, context)); + break; + case "string": + result.push((await evaluateStringParts(stringOrWord.value, context)).join(" ")); + break; + default: + const _assertNever: never = stringOrWord; + throw new Error(`Not implemented: ${(stringOrWord as any).kind}`); + } + } + return result; +} + +async function evaluateStringParts(stringParts: StringPart[], context: Context) { + // not implemented mostly, and copying from deno_task_shell + const result: string[] = []; + let currentText = ""; + for (const stringPart of stringParts) { + switch (stringPart.kind) { + case "text": + currentText += stringPart.value; + break; + case "variable": + case "command": + default: + throw new Error(`Not implemented: ${stringPart.kind}`); + } + } + if (currentText.length !== 0) { + result.push(currentText); + } + return result; +} + +// todo: remove and replace with above +export function parseArgsOld(command: string) { + const args: string[] = []; + let current = ""; + for (let i = 0; i < command.length; i++) { + let char = command[i]; + if (char === "'" || char === "\"") { + const startChar = char; + i++; + for (; i < command.length; i++) { + char = command[i]; + if (char === startChar) { + break; + } else if (char === "\\" && command[i + 1] === startChar) { + // skip the escaped quote + i++; + current += startChar; + } else { + current += char; + } + } + } else if (char === " ") { + checkAddArg(); + } else { + current += char; + } + } + + checkAddArg(); + return args; + + function checkAddArg() { + const arg = current.trim(); + if (arg.length > 0) { + args.push(arg); + } + current = ""; + } +}