From e620f39a4a3566830733c2834d8df725a62bd25a Mon Sep 17 00:00:00 2001 From: imxyy_soope_ Date: Fri, 16 Jan 2026 10:08:29 +0800 Subject: [PATCH] fix: use coerceToString --- nix-js/runtime-ts/src/builtins/context.ts | 2 +- nix-js/runtime-ts/src/builtins/conversion.ts | 2 +- nix-js/runtime-ts/src/builtins/derivation.ts | 9 ++------- nix-js/runtime-ts/src/builtins/functional.ts | 4 ++-- nix-js/runtime-ts/src/builtins/io.ts | 6 +++--- nix-js/runtime-ts/src/builtins/misc.ts | 7 +------ nix-js/runtime-ts/src/builtins/string.ts | 6 +++++- nix-js/runtime-ts/src/conversion.ts | 1 + 8 files changed, 16 insertions(+), 21 deletions(-) diff --git a/nix-js/runtime-ts/src/builtins/context.ts b/nix-js/runtime-ts/src/builtins/context.ts index 4ee5e4d..00763b6 100644 --- a/nix-js/runtime-ts/src/builtins/context.ts +++ b/nix-js/runtime-ts/src/builtins/context.ts @@ -1,6 +1,6 @@ import type { NixValue, NixAttrs, NixString } from "../types"; import { isStringWithContext } from "../types"; -import { forceNixString, forceAttrs, forceBool, forceList, forceString } from "../type-assert"; +import { forceNixString, forceAttrs, forceList, forceString } from "../type-assert"; import { force } from "../thunk"; import { type NixStringContext, diff --git a/nix-js/runtime-ts/src/builtins/conversion.ts b/nix-js/runtime-ts/src/builtins/conversion.ts index e030e69..0fb0643 100644 --- a/nix-js/runtime-ts/src/builtins/conversion.ts +++ b/nix-js/runtime-ts/src/builtins/conversion.ts @@ -130,7 +130,7 @@ export interface CoerceResult { */ export const coerceToString = ( value: NixValue, - mode: StringCoercionMode = StringCoercionMode.ToString, + mode: StringCoercionMode, copyToStore: boolean = false, outContext?: NixStringContext, ): string => { diff --git a/nix-js/runtime-ts/src/builtins/derivation.ts b/nix-js/runtime-ts/src/builtins/derivation.ts index 7cf43a3..4e8a112 100644 --- a/nix-js/runtime-ts/src/builtins/derivation.ts +++ b/nix-js/runtime-ts/src/builtins/derivation.ts @@ -1,14 +1,9 @@ import type { NixValue, NixAttrs } from "../types"; -import { forceString, forceList, forceNixString } from "../type-assert"; +import { forceString, forceList } from "../type-assert"; import { force } from "../thunk"; import { type DerivationData, type OutputInfo, generateAterm } from "../derivation-helpers"; import { coerceToString, StringCoercionMode } from "./conversion"; -import { - type NixStringContext, - extractInputDrvsAndSrcs, - isStringWithContext, - HAS_CONTEXT, -} from "../string-context"; +import { type NixStringContext, extractInputDrvsAndSrcs, isStringWithContext } from "../string-context"; import { nixValueToJson } from "../conversion"; const forceAttrs = (value: NixValue): NixAttrs => { diff --git a/nix-js/runtime-ts/src/builtins/functional.ts b/nix-js/runtime-ts/src/builtins/functional.ts index 5f321c9..48590cb 100644 --- a/nix-js/runtime-ts/src/builtins/functional.ts +++ b/nix-js/runtime-ts/src/builtins/functional.ts @@ -4,7 +4,7 @@ import { CatchableError, HAS_CONTEXT, type NixValue } from "../types"; import { force } from "../thunk"; -import { forceString } from "../type-assert"; +import { coerceToString, StringCoercionMode } from "./conversion"; export const seq = (e1: NixValue) => @@ -34,7 +34,7 @@ export const abort = (s: NixValue): never => { }; export const throwFunc = (s: NixValue): never => { - throw new CatchableError(forceString(s)); + throw new CatchableError(coerceToString(s, StringCoercionMode.Base)); }; export const trace = (e1: NixValue, e2: NixValue): NixValue => { diff --git a/nix-js/runtime-ts/src/builtins/io.ts b/nix-js/runtime-ts/src/builtins/io.ts index 1af2b0f..6f06882 100644 --- a/nix-js/runtime-ts/src/builtins/io.ts +++ b/nix-js/runtime-ts/src/builtins/io.ts @@ -6,13 +6,13 @@ import { forceAttrs, forceBool, forceString } from "../type-assert"; import type { NixValue, NixAttrs } from "../types"; import { force } from "../thunk"; +import { coerceToString, StringCoercionMode } from "./conversion"; // Declare Deno.core.ops global (provided by deno_core runtime) export const importFunc = (path: NixValue): NixValue => { - // For MVP: only support string paths - // TODO: After implementing path type, also accept path values - const pathStr = forceString(path); + // TODO: context? + const pathStr = coerceToString(path, StringCoercionMode.Base); // Call Rust op - returns JS code string const code = Deno.core.ops.op_import(pathStr); diff --git a/nix-js/runtime-ts/src/builtins/misc.ts b/nix-js/runtime-ts/src/builtins/misc.ts index 153e2dc..fda2d44 100644 --- a/nix-js/runtime-ts/src/builtins/misc.ts +++ b/nix-js/runtime-ts/src/builtins/misc.ts @@ -98,12 +98,7 @@ function nextComponent(s: string, startIdx: number): ComponentResult { } } else { // Otherwise, consume the longest sequence of non-digit, non-separator characters - while ( - p < s.length && - !(s[p] >= "0" && s[p] <= "9") && - s[p] !== "." && - s[p] !== "-" - ) { + while (p < s.length && !(s[p] >= "0" && s[p] <= "9") && s[p] !== "." && s[p] !== "-") { p++; } } diff --git a/nix-js/runtime-ts/src/builtins/string.ts b/nix-js/runtime-ts/src/builtins/string.ts index 31da0bb..75a5ed3 100644 --- a/nix-js/runtime-ts/src/builtins/string.ts +++ b/nix-js/runtime-ts/src/builtins/string.ts @@ -4,6 +4,7 @@ import type { NixInt, NixValue } from "../types"; import { forceString, forceList, forceInt } from "../type-assert"; +import { coerceToString, StringCoercionMode } from "./conversion"; export const stringLength = (e: NixValue): NixInt => BigInt(forceString(e).length); @@ -20,7 +21,10 @@ export const substring = export const concatStringsSep = (sep: NixValue) => (list: NixValue): string => - forceList(list).join(forceString(sep)); + // FIXME: context? + forceList(list) + .map((elem) => coerceToString(elem, StringCoercionMode.Interpolation)) + .join(forceString(sep)); export const baseNameOf = (x: NixValue): string => { const str = forceString(x); diff --git a/nix-js/runtime-ts/src/conversion.ts b/nix-js/runtime-ts/src/conversion.ts index 51b8aca..a83a429 100644 --- a/nix-js/runtime-ts/src/conversion.ts +++ b/nix-js/runtime-ts/src/conversion.ts @@ -35,6 +35,7 @@ export const nixValueToJson = ( if (seen.has(v)) { throw new Error("derivation: circular reference detected in __structuredAttrs"); } + // FIXME: tryAttrsToString seen.add(v); }