// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at <https://mozilla.org/MPL/2.0/>.
-import { bind, call } from "./function.js";
+import { bind, call, toFunctionName } from "./function.js";
import { ITERATOR, SPECIES, toPrimitive, type } from "./value.js";
/**
*/
constructor(loadMethods) {
if (type(loadMethods) !== "object") {
+ // The provided value is not an object; throw an error.
throw new TypeError(
`Piscēs: Cannot construct LazyLoader: Provided argument is not an object: ${loadMethods}.`,
);
} else {
+ // The provided value is an object; process it and build the
+ // result.
const result = objectCreate(getPrototype(loadMethods));
const methodKeys = getOwnPropertyKeys(loadMethods);
for (let index = 0; index < methodKeys.length; ++index) {
+ // Iterate over the property keys of the provided object and
+ // define getters and setters appropriately on the result.
const methodKey = methodKeys[index];
const { configurable, enumerable, writable } =
getOwnPropertyDescriptor(loadMethods, methodKey);
defineOwnProperty(result, methodKey, {
configurable: true,
enumerable,
- get: () => {
- const value = call(loadMethods[methodKey], result, []);
- defineOwnProperty(result, methodKey, {
- configurable,
- enumerable,
- value,
- writable,
- });
- return value;
- },
- set: writable
- ? ($) =>
+ get: defineOwnProperty(
+ () => {
+ const value = call(loadMethods[methodKey], result, []);
defineOwnProperty(result, methodKey, {
configurable,
enumerable,
- value: $,
+ value,
writable,
- })
+ });
+ return value;
+ },
+ "name",
+ { value: toFunctionName(methodKey, "get") },
+ ),
+ set: writable
+ ? defineOwnProperty(
+ ($) =>
+ defineOwnProperty(result, methodKey, {
+ configurable,
+ enumerable,
+ value: $,
+ writable,
+ }),
+ "name",
+ { value: toFunctionName(methodKey, "set") },
+ )
: void {},
});
}
// ♓🌟 Piscēs ∷ object.test.js
// ====================================================================
//
-// Copyright © 2022 Lady [@ Lady’s Computer].
+// Copyright © 2022–2023 Lady [@ Lady’s Computer].
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
} from "./object.js";
describe("LazyLoader", () => {
- const symbol = Symbol();
+ const symbol = Symbol("foo");
const prototype = {};
const etaoinMethod = spy(() => "success");
const shrdluMethod = spy(() => "success");
for (const key of Reflect.ownKeys(ll)) {
yield [
key,
- Object.getOwnPropertyDescriptor(ll, key).get !== void {},
+ Object.getOwnPropertyDescriptor(ll, key).get?.name,
];
}
}(new LazyLoader(methodsObject)),
),
{
- etaoin: true,
- shrdlu: true,
- cmfwyp: true,
- vbgkqj: true,
- xzfiflffffi: true,
- [symbol]: true,
+ etaoin: "get etaoin",
+ shrdlu: "get shrdlu",
+ cmfwyp: "get cmfwyp",
+ vbgkqj: "get vbgkqj",
+ xzfiflffffi: "get xzfiflffffi",
+ [symbol]: `get [${symbol.description}]`,
},
);
});
for (const key of Reflect.ownKeys(ll)) {
yield [
key,
- Object.getOwnPropertyDescriptor(ll, key).set !== void {},
+ Object.getOwnPropertyDescriptor(ll, key).set?.name,
];
}
}(new LazyLoader(methodsObject)),
),
{
- etaoin: false,
- shrdlu: false,
- cmfwyp: false,
- vbgkqj: false,
- xzfiflffffi: false,
- [symbol]: true,
+ etaoin: undefined,
+ shrdlu: undefined,
+ cmfwyp: undefined,
+ vbgkqj: undefined,
+ xzfiflffffi: undefined,
+ [symbol]: `set [${symbol.description}]`,
},
);
});
- describe("[[Construct]] creates a new object with correct getter behaviour", () => {
+ it("[[Construct]] creates a new object with correct getter behaviour", () => {
const ll = new LazyLoader(methodsObject);
ll.etaoin;
assertEquals(
assertThrows(() => ll[symbol]);
});
- describe("[[Construct]] creates a new object with correct setter behaviour", () => {
+ it("[[Construct]] creates a new object with correct setter behaviour", () => {
const ll = new LazyLoader(methodsObject);
ll[symbol] = "success";
assertEquals(