diff --git a/nix-js/runtime-ts/src/builtins/attrs.ts b/nix-js/runtime-ts/src/builtins/attrs.ts index bfb0784..88fe3fd 100644 --- a/nix-js/runtime-ts/src/builtins/attrs.ts +++ b/nix-js/runtime-ts/src/builtins/attrs.ts @@ -4,6 +4,7 @@ import type { NixValue, NixAttrs, NixList } from "../types"; import { forceAttrs, forceString, forceFunction, forceList } from "../type-assert"; +import { createThunk } from "../thunk"; export const attrNames = (set: NixValue): string[] => Object.keys(forceAttrs(set)).sort(); @@ -22,17 +23,13 @@ export const hasAttr = export const mapAttrs = (f: NixValue) => (attrs: NixValue): NixAttrs => { - const forced_attrs = forceAttrs(attrs); - const forced_f = forceFunction(f); - const new_attrs: NixAttrs = {}; - for (const key in forced_attrs) { - Object.defineProperty(new_attrs, key, { - get: () => forceFunction(forced_f(key))(forced_attrs[key]), - enumerable: true, - configurable: true, - }); + const forcedAttrs = forceAttrs(attrs); + const forcedF = forceFunction(f); + const newAttrs: NixAttrs = {}; + for (const key in forcedAttrs) { + newAttrs[key] = createThunk(() => forceFunction(forcedF(key))(forcedAttrs[key])); } - return new_attrs; + return newAttrs; }; export const removeAttrs = diff --git a/nix-js/runtime-ts/src/operators.ts b/nix-js/runtime-ts/src/operators.ts index 5d05522..fa06582 100644 --- a/nix-js/runtime-ts/src/operators.ts +++ b/nix-js/runtime-ts/src/operators.ts @@ -250,27 +250,5 @@ export const op = { return Array.prototype.concat.call(forceList(a), forceList(b)); }, - update: (a: NixValue, b: NixValue): NixAttrs => { - const forcedA = forceAttrs(a); - const forcedB = forceAttrs(b); - const newAttrs: NixAttrs = {}; - - for (const key in forcedA) { - Object.defineProperty(newAttrs, key, { - get: () => force(forcedA[key]), - enumerable: true, - configurable: true, - }); - } - - for (const key in forcedB) { - Object.defineProperty(newAttrs, key, { - get: () => force(forcedB[key]), - enumerable: true, - configurable: true, - }); - } - - return newAttrs; - }, + update: (a: NixValue, b: NixValue): NixAttrs => ({ ...forceAttrs(a), ...forceAttrs(b) }), };