feat(payment): expand Stripe methods and checkout handoff
Docker Image / Build and Push Docker Image (push) Successful in 2m10s

This commit is contained in:
Codex
2026-07-28 16:27:03 +08:00
parent 2e402de15b
commit 59e4eac736
42 changed files with 1151 additions and 92 deletions
+49 -16
View File
@@ -107,9 +107,13 @@ export class Logger {
const trimmed = value.trim();
if (trimmed.length === 0) return "";
try {
return JSON.stringify(JSON.parse(trimmed), null, 2);
return JSON.stringify(
Logger.toSerializableLogValue(JSON.parse(trimmed)),
null,
2,
);
} catch {
return value;
return Logger.redactSensitiveString(value);
}
}
@@ -149,28 +153,31 @@ export class Logger {
}
private write(level: LogLevel, args: LogArgs): void {
Logger.reportImportantProductionLog(level, this.component, args);
const safeArgs = args.map((value) =>
Logger.toSerializableLogValue(value),
);
Logger.reportImportantProductionLog(level, this.component, safeArgs);
if (Logger.shouldUseBrowserConsole()) {
Logger.writeBrowserConsole(level, this.component, args);
Logger.writeBrowserConsole(level, this.component, safeArgs);
return;
}
switch (level) {
case "debug":
this.logger.debug(...Logger.normalizeLogArgs(args));
this.logger.debug(...Logger.normalizeLogArgs(safeArgs));
return;
case "info":
this.logger.info(...Logger.normalizeLogArgs(args));
this.logger.info(...Logger.normalizeLogArgs(safeArgs));
return;
case "warn":
this.logger.warn(...Logger.normalizeLogArgs(args));
this.logger.warn(...Logger.normalizeLogArgs(safeArgs));
return;
case "error":
this.logger.error(...Logger.normalizeLogArgs(args));
this.logger.error(...Logger.normalizeLogArgs(safeArgs));
return;
case "fatal":
this.logger.fatal(...Logger.normalizeLogArgs(args));
this.logger.fatal(...Logger.normalizeLogArgs(safeArgs));
return;
}
}
@@ -266,6 +273,10 @@ export class Logger {
return value.map((item) => Logger.toSerializableLogValue(item, seen));
}
if (typeof value === "string") {
return Logger.redactSensitiveString(value);
}
if (typeof value !== "object" || value === null) {
return value;
}
@@ -281,19 +292,39 @@ export class Logger {
const output: Record<string, unknown> = {};
for (const [key, item] of Object.entries(value)) {
output[key] = Logger.toSerializableLogValue(item, seen);
output[key] = Logger.isSensitiveLogKey(key)
? "[REDACTED]"
: Logger.toSerializableLogValue(item, seen);
}
return output;
}
private static isSensitiveLogKey(key: string): boolean {
const normalized = key.replace(/[^a-z0-9]/gi, "").toLowerCase();
return (
normalized === "clientsecret" ||
normalized === "customersessionclientsecret" ||
normalized === "handofftoken" ||
normalized === "accesstoken" ||
normalized === "refreshtoken" ||
normalized === "authorization"
);
}
private static redactSensitiveString(value: string): string {
return /_secret_/i.test(value) ? "[REDACTED]" : value;
}
private static serializeError(
error: Error,
seen: WeakSet<object>,
): Record<string, unknown> {
const output: Record<string, unknown> = {
name: error.name,
message: error.message,
stack: error.stack,
message: Logger.redactSensitiveString(error.message),
stack: error.stack
? Logger.redactSensitiveString(error.stack)
: undefined,
};
if (seen.has(error)) {
@@ -303,10 +334,12 @@ export class Logger {
for (const key of Object.getOwnPropertyNames(error)) {
if (key in output) continue;
output[key] = Logger.toSerializableLogValue(
(error as unknown as Record<string, unknown>)[key],
seen,
);
output[key] = Logger.isSensitiveLogKey(key)
? "[REDACTED]"
: Logger.toSerializableLogValue(
(error as unknown as Record<string, unknown>)[key],
seen,
);
}
return output;
}