From 51f7f4079b8bb4b7a105714f9d40414fe39a26f6 Mon Sep 17 00:00:00 2001 From: imxyy_soope_ Date: Sat, 24 Jan 2026 22:17:23 +0800 Subject: [PATCH] feat: builtins.parseDrvName --- nix-js/runtime-ts/src/builtins/misc.ts | 17 +++++++++++++++-- nix-js/tests/builtins.rs | 7 +++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/nix-js/runtime-ts/src/builtins/misc.ts b/nix-js/runtime-ts/src/builtins/misc.ts index d4f7f09..e895e2b 100644 --- a/nix-js/runtime-ts/src/builtins/misc.ts +++ b/nix-js/runtime-ts/src/builtins/misc.ts @@ -228,8 +228,21 @@ export const outputOf = throw new Error("Not implemented: outputOf"); }; -export const parseDrvName = (s: NixValue): never => { - throw new Error("Not implemented: parseDrvName"); +export const parseDrvName = (s: NixValue): NixAttrs => { + const fullName = forceStringNoCtx(s); + let name = fullName; + let version = ""; + for (let i = 0; i < fullName.length; ++i) { + if (fullName[i] === '-' && i + 1 < fullName.length && !/[a-zA-Z]/.test(fullName[i + 1])) { + name = fullName.substring(0, i); + version = fullName.substring(i + 1); + break; + } + } + return { + name, + version + } }; export const parseFlakeName = (s: NixValue): never => { diff --git a/nix-js/tests/builtins.rs b/nix-js/tests/builtins.rs index 6016762..ba0b11f 100644 --- a/nix-js/tests/builtins.rs +++ b/nix-js/tests/builtins.rs @@ -315,3 +315,10 @@ fn builtins_function_args() { ]))) ); } + +#[test] +fn builtins_parse_drv_name() { + let result = eval(r#"builtins.parseDrvName "nix-js-0.1.0pre""#).unwrap_attr_set(); + assert_eq!(result.get("name"), Some(&Value::String("nix-js".into()))); + assert_eq!(result.get("version"), Some(&Value::String("0.1.0pre".into()))); +}