@serenity-js/web
Version:
Serenity/JS Screenplay Pattern library offering a flexible, web driver-agnostic approach for interacting with web-based user interfaces and components, suitable for various testing contexts
49 lines • 2.12 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArgumentDehydrator = void 0;
const io_1 = require("@serenity-js/core/lib/io");
/**
* @group Models
*/
class ArgumentDehydrator {
shouldReference;
transformation;
constructor(shouldReference, transformation) {
this.shouldReference = shouldReference;
this.transformation = transformation;
}
async dehydrate(inputArgs) {
const result = await this.dehydrateRecursively(inputArgs);
return [
{ argsCount: result.args.length, refsCount: result.refsCount },
...result.args,
...result.refs
];
}
async dehydrateRecursively(inputArgs, refsCount = 0) {
return inputArgs.reduce(async (acc, arg) => {
const { args, refs, refsCount } = await acc;
if (Array.isArray(arg)) {
const { args: nestedArgs, refs: nestedRefs, refsCount: currentRefsCount } = await this.dehydrateRecursively(arg, refsCount);
return {
args: [...args, nestedArgs,],
refs: [...refs, ...nestedRefs],
refsCount: currentRefsCount,
};
}
if (io_1.ValueInspector.isPlainObject(arg)) {
const { args: nestedArgs, refs: nestedRefs, refsCount: currentRefsCount } = await this.dehydrateRecursively(Object.values(arg), refsCount);
return {
args: [...args, Object.fromEntries(Object.keys(arg).map((key, i) => [key, nestedArgs[i]]))],
refs: [...refs, ...nestedRefs],
refsCount: currentRefsCount,
};
}
return this.shouldReference(arg)
? { args: [...args, `$ref${refsCount}`], refs: [...refs, await this.transformation(arg)], refsCount: refsCount + 1 }
: { args: [...args, arg], refs, refsCount };
}, Promise.resolve({ args: [], refs: [], refsCount }));
}
}
exports.ArgumentDehydrator = ArgumentDehydrator;
//# sourceMappingURL=ArgumentDehydrator.js.map
;