@dsegovia90/redacted
Version:
Explicit access to sensitive data. Wraps values in a Redacted class to protect them from being leaked into loggers (ie: console.log) and serializers. Works with zod.
113 lines (112 loc) • 5.39 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _MutableRedacted_data, _MutableRedacted_jsonStringifySafe, _Redacted_data, _Redacted_jsonStringifySafe;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Redacted = exports.MutableRedacted = void 0;
/**
* MutableRedacted is a class that wraps a value and provides methods to mutate and expose the value.
* It can be used to safely expose sensitive data without exposing the entire object.
*
* @param data - The data to be redacted.
* @param properties - Optional properties to configure the behavior of the redacted object.
*
* @example
* const mutableRedacted = new MutableRedacted("secret");
* console.log(mutableRedacted.exposeSecret()); // "secret"
* mutableRedacted.mutateSecret("newSecret");
* console.log(mutableRedacted.exposeSecret()); // "newSecret"
*
* @example
* const mutableRedacted = new MutableRedacted("secret", { redactedOnJsonStringify: false });
* console.log(JSON.stringify(mutableRedacted)); // "secret"
*
* @example
* const mutableRedacted = new MutableRedacted("secret"); // <-- secure by default!
* console.log(JSON.stringify(mutableRedacted)); // "{}"
*/
class MutableRedacted {
constructor(data, properties) {
_MutableRedacted_data.set(this, void 0);
_MutableRedacted_jsonStringifySafe.set(this, void 0);
__classPrivateFieldSet(this, _MutableRedacted_data, data, "f");
__classPrivateFieldSet(this, _MutableRedacted_jsonStringifySafe, properties?.redactedOnJsonStringify ?? true, "f");
}
exposeSecret() {
return __classPrivateFieldGet(this, _MutableRedacted_data, "f");
}
mutateSecret(newData) {
__classPrivateFieldSet(this, _MutableRedacted_data, newData, "f");
}
toJSON() {
if (__classPrivateFieldGet(this, _MutableRedacted_jsonStringifySafe, "f")) {
return this;
}
return __classPrivateFieldGet(this, _MutableRedacted_data, "f");
}
}
exports.MutableRedacted = MutableRedacted;
_MutableRedacted_data = new WeakMap(), _MutableRedacted_jsonStringifySafe = new WeakMap();
/**
* Redacted is a class that wraps a value and provides methods to expose the value.
* It can be used to safely expose sensitive data without exposing the entire object.
*
* @param data - The data to be redacted.
* @param properties - Optional properties to configure the behavior of the redacted object.
*
* @example
* const redactedValue = new Redacted("secret");
* console.log(redactedValue)
* console.log(redactedValue.exposeSecret()); // "secret"
*
* @example
* const redactedValue = new Redacted("secret", { redactedOnJsonStringify: false });
* console.log(JSON.stringify(redactedValue)); // "secret"
*
* @example
* const redactedValue = new Redacted("secret"); // <-- secure by default!
* console.log(JSON.stringify(redactedValue)); // "{}"
*/
class Redacted {
constructor(data, properties) {
_Redacted_data.set(this, void 0);
_Redacted_jsonStringifySafe.set(this, void 0);
__classPrivateFieldSet(this, _Redacted_data, data, "f");
__classPrivateFieldSet(this, _Redacted_jsonStringifySafe, properties?.redactedOnJsonStringify ?? true, "f");
}
exposeSecret() {
return __classPrivateFieldGet(this, _Redacted_data, "f");
}
toJSON() {
if (__classPrivateFieldGet(this, _Redacted_jsonStringifySafe, "f")) {
return this;
}
return __classPrivateFieldGet(this, _Redacted_data, "f");
}
}
exports.Redacted = Redacted;
_Redacted_data = new WeakMap(), _Redacted_jsonStringifySafe = new WeakMap();
__exportStar(require("./zod-v3.js"), exports);