编辑
执行共同编辑逻辑的水电费 模拟录相器 Middleware API。 。 。 .
用于执行编辑中间软件的公用事业
示例使用
import {
dropRequestHeader,
transformJsonResponse,
redactRecursively,
asterixOut,
} from "@alwaysmeticulous/redaction";
const middleware = [
dropRequestHeader("Authorization"),
transformJsonResponse({
urlRegExp: /https:\/\/api\.example\.com\/.*/,
transform: (data) => {
return {
...data,
...(data.sensitive ? { sensitive: asterixOut(data.sensitive) } : {}),
};
},
}),
transformJsonResponse({
urlRegExp: /https:\/\/api\.example\.com\/sensitive.*/,
transform: (data) =>
redactRecursively(data, {
redactString: (str, path) =>
path[path.length - 1] === "uuid" ? str : asterixOut(str),
}),
}),
];
编辑 Javascript 对象的用法
为了方便编辑大型复合型的Javascript类型,我们提供了一些帮助.
离线
这保证了被编辑的文本的长度和原文本的白相间相同, 从而可以测试相同的布局大小写.
import { asterixOut } from "@alwaysmeticulous/redaction";
const redacted = asterixOut("some sensitive text"); // returns "**** ********* ****"
编辑字符串
校正字符串通过检查常见的数据格式来智能地编辑字符串. 这样可以减少 在Meticulous测试的回放过程中,由于操作失败,您的应用程序有错误的风险 编辑数据(例如)页:1" 不是有效的 URL :
import { redactString } from "@alwaysmeticulous/redaction";
const redacted = redactString("some sensitive text"); // returns "**** ********* ****"
const redacted2 = redactString("[email protected]"); // returns "[email protected]"
// etc.
见 编辑 需要更多的实例.
编辑url
redactUrl 替换主机名、路径、查询、散列和用户信息。 默认主机名
变成 redacted.com; 通过 baseDomain 选择不同的替换主机名 :
import { redactUrl } from "@alwaysmeticulous/redaction";
redactUrl("https://customer.example/private/path");
// => "https://redacted.com/redacted/redacted"
redactUrl("https://customer.example/private/path", {
baseDomain: "redacted.meticulous.ai",
});
// => "https://redacted.meticulous.ai/redacted/redacted"
嵌入字段编辑器
NestedFields Redactor允许您为每个不同的字段名称指定一个编辑策略(例如'sn'或'email'). 然后,它会递归性地将这个修饰政策应用到一个物体内的所有嵌入地上. 类型安全 确保编译时间出错,如果您提供了一个有字段名的对象(在任意关卡上被注销) ),但未指定修改策略.
基本用途
import {
transformJsonResponse,
NestedFieldsRedactor,
redactString,
} from "@alwaysmeticulous/redaction";
interface MyComplexApiType {
details: {
ssn: string;
phoneNumbers: Array<{ mobile?: string; home?: string }>;
};
// By default we do not require redacting boolean fields.
isUSBased: boolean;
}
// Important: include your API type explictly in the call to createRedactor (`createRedactor<MyComplexApiType>`)
const complexApiTypeRedactor =
NestedFieldsRedactor.builder().createRedactor<MyComplexApiType>({
strings: {
ssn: redactString,
mobile: redactString,
home: redactString,
},
});
const middleware = [
transformJsonResponse({
urlRegExp: /https:\/\/api\.example\.com\/.*/,
transform: (data: MyComplexApiType) => {
return complexApiTypeRedactor(data);
},
}),
];
如果您更新 MyComplexApiType 添加了新内容 name 字符串字段 :
interface MyComplexApiType {
name: string; // <<< ADDED
details: {
ssn: string;
phoneNumbers: Array<{ mobile?: string; home?: string }>;
};
isUSBased: boolean;
}
但不要为新计划增加相应的编辑政策 name 字段到“创建重做者”的调用,然后是您的
代码无法编译 。 这确保了修改是详尽无遗的.
createRedactor 将强制您编辑所有非 enum 字符串字段, 但是它不会强制您进行详尽的编辑
其他类型的字段(日期、布尔语、数字等)。 见 createRedactorStrict 如果您需要执行 详尽无遗
在编译额外数据类型时进行编辑.
有默认
但我们建议使用 NestedFieldsRedactor.builderWithDefaults(),它将提供默认的编辑器
对于最常见的字段名称。 如果有任何字符串字段没有被这些默认覆盖,那么编译器将会
强制您为他们指定一个编辑策略:
const complexApiTypeRedactor =
NestedFieldsRedactor.builderWithDefaults().createRedactor<MyComplexApiType>({
strings: {
// Don't need to specify a redaction policy for `ssn` as it's covered by the defaults,
// but we do need to specify a redaction policy for `mobile` and `home` as they're not covered by the defaults.
mobile: redactString,
home: redactString,
},
});
基于模式的编辑器
也可以指定匹配以给定后缀结尾的字段名的编辑器,同时保留 编译时间类型安全 。 见 普通编辑器 财务报告和审定财务报表 已取消的字段 对于一些例子.
编辑递归
通过应用提供的编辑函数的 JSON 对象递增。 见 编辑- recursive.spec.ts 更多细节.
这可以结合 NestedFieldsRedactor 以提供额外的安全。 例如:
const complexApiTypeRedactor =
NestedFieldsRedactor.builder().createRedactor<MyComplexApiType>({
strings: {
ssn: redactString,
mobile: redactString,
home: redactString,
},
});
const redactAnythingThatLooksLikeAnSSN = <T>(data: T) =>
redactRecursively(data, {
redactString: (str) => (looksLikeAnSSN(str) ? asterixOut(str) : str),
});
const middleware = [
transformJsonResponse({
urlRegExp: /https:\/\/api\.example\.com\/.*/,
transform: (data: MyComplexApiType) => {
return redactAnythingThatLooksLikeAnSSN(complexApiTypeRedactor(data));
},
}),
];