@superblocksteam/sdk 2.0.114 → 2.0.115-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.mjs +93 -1
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +10 -2
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/dev-utils/vite-dev-server-diagnostics.d.mts +61 -0
- package/dist/dev-utils/vite-dev-server-diagnostics.d.mts.map +1 -0
- package/dist/dev-utils/vite-dev-server-diagnostics.mjs +133 -0
- package/dist/dev-utils/vite-dev-server-diagnostics.mjs.map +1 -0
- package/dist/telemetry/logging.d.ts.map +1 -1
- package/dist/telemetry/logging.js +22 -10
- package/dist/telemetry/logging.js.map +1 -1
- package/dist/telemetry/logging.test.d.ts +2 -0
- package/dist/telemetry/logging.test.d.ts.map +1 -0
- package/dist/telemetry/logging.test.js +104 -0
- package/dist/telemetry/logging.test.js.map +1 -0
- package/package.json +7 -7
- package/src/cli-replacement/dev.mts +111 -4
- package/src/dev-utils/dev-server.mts +15 -2
- package/src/dev-utils/vite-dev-server-diagnostics.mts +213 -0
- package/src/telemetry/logging.test.ts +142 -0
- package/src/telemetry/logging.ts +30 -10
- package/test/vite-dev-server-diagnostics.test.mts +336 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/turbo.json +1 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers to classify Vite / esbuild stderr and emit logs that are easy to facet in Datadog
|
|
3
|
+
* (stable tokens: sdk_dev_server_vite_error, category=module_resolve, unresolved_specifier=...).
|
|
4
|
+
*/
|
|
5
|
+
/** Maximum characters of raw Vite/esbuild output stored on the error meta stack field. */
|
|
6
|
+
export const VITE_ERROR_RAW_LOG_MAX_CHARS = 12_000;
|
|
7
|
+
function quoteFacetValue(value) {
|
|
8
|
+
if (/^[A-Za-z0-9@._:/-]+$/.test(value)) {
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
return JSON.stringify(value);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Best-effort parse of Vite/esbuild multi-line error text (optimizeDeps, build, etc.).
|
|
15
|
+
*/
|
|
16
|
+
export function diagnoseViteBuildLogMessage(msg) {
|
|
17
|
+
const resolveMatch = msg.match(/Could not resolve ['"]([^'"]+)['"]/);
|
|
18
|
+
if (resolveMatch?.[1]) {
|
|
19
|
+
return {
|
|
20
|
+
category: "module_resolve",
|
|
21
|
+
unresolvedSpecifier: resolveMatch[1],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (/\boptimizeDeps\b|pre-bundl/i.test(msg)) {
|
|
25
|
+
return { category: "optimize_deps" };
|
|
26
|
+
}
|
|
27
|
+
return { category: "unknown" };
|
|
28
|
+
}
|
|
29
|
+
export function formatViteDevServerStartedLog(params) {
|
|
30
|
+
return `sdk_dev_server_vite_ready sdk_version=${quoteFacetValue(params.sdkVersion)} vite_root=${quoteFacetValue(params.viteRootBasename)}`;
|
|
31
|
+
}
|
|
32
|
+
export function formatViteBuildErrorLogSummary(params) {
|
|
33
|
+
const { diagnostic, sdkVersion, viteRootBasename } = params;
|
|
34
|
+
const parts = [
|
|
35
|
+
"sdk_dev_server_vite_error",
|
|
36
|
+
`sdk_version=${quoteFacetValue(sdkVersion)}`,
|
|
37
|
+
`vite_root=${quoteFacetValue(viteRootBasename)}`,
|
|
38
|
+
`category=${diagnostic.category}`,
|
|
39
|
+
];
|
|
40
|
+
if (diagnostic.unresolvedSpecifier) {
|
|
41
|
+
parts.push(`unresolved_specifier=${quoteFacetValue(diagnostic.unresolvedSpecifier)}`);
|
|
42
|
+
}
|
|
43
|
+
return parts.join(" ");
|
|
44
|
+
}
|
|
45
|
+
export function viteErrorKindForDiagnostic(diagnostic) {
|
|
46
|
+
switch (diagnostic.category) {
|
|
47
|
+
case "module_resolve":
|
|
48
|
+
return "ViteModuleResolveError";
|
|
49
|
+
case "optimize_deps":
|
|
50
|
+
return "ViteOptimizeDepsError";
|
|
51
|
+
case "unknown":
|
|
52
|
+
return "ViteBuildError";
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Unhandled Vite build diagnostic category: ${String(diagnostic.category)}`);
|
|
55
|
+
}
|
|
56
|
+
export function truncateViteRawLog(msg) {
|
|
57
|
+
if (msg.length <= VITE_ERROR_RAW_LOG_MAX_CHARS) {
|
|
58
|
+
return msg;
|
|
59
|
+
}
|
|
60
|
+
return `${msg.slice(0, VITE_ERROR_RAW_LOG_MAX_CHARS)}\n...(truncated)`;
|
|
61
|
+
}
|
|
62
|
+
function defaultBuildSummary(params) {
|
|
63
|
+
return formatViteBuildErrorLogSummary({
|
|
64
|
+
diagnostic: { category: "unknown" },
|
|
65
|
+
sdkVersion: params.sdkVersion,
|
|
66
|
+
viteRootBasename: params.viteRootBasename,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function diagnosticsFailureMeta(error, rawMessage) {
|
|
70
|
+
return {
|
|
71
|
+
error: {
|
|
72
|
+
kind: "ViteDiagnosticsError",
|
|
73
|
+
message: error instanceof Error ? error.message : "unknown",
|
|
74
|
+
stack: truncateViteRawLog(rawMessage),
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function buildViteBuildErrorLog(params, overrides) {
|
|
79
|
+
const deps = {
|
|
80
|
+
diagnose: diagnoseViteBuildLogMessage,
|
|
81
|
+
errorKind: viteErrorKindForDiagnostic,
|
|
82
|
+
formatSummary: formatViteBuildErrorLogSummary,
|
|
83
|
+
truncate: truncateViteRawLog,
|
|
84
|
+
...overrides,
|
|
85
|
+
};
|
|
86
|
+
try {
|
|
87
|
+
const diagnostic = deps.diagnose(params.rawMessage);
|
|
88
|
+
return {
|
|
89
|
+
error: {
|
|
90
|
+
kind: deps.errorKind(diagnostic),
|
|
91
|
+
message: diagnostic.category === "module_resolve"
|
|
92
|
+
? `Could not resolve: ${diagnostic.unresolvedSpecifier}`
|
|
93
|
+
: "Vite or esbuild reported an error",
|
|
94
|
+
stack: deps.truncate(params.rawMessage),
|
|
95
|
+
},
|
|
96
|
+
message: deps.formatSummary({
|
|
97
|
+
diagnostic,
|
|
98
|
+
sdkVersion: params.sdkVersion,
|
|
99
|
+
viteRootBasename: params.viteRootBasename,
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Keep the final fallback independent from injected helpers so a helper bug
|
|
105
|
+
// cannot prevent us from returning some structured error payload at all.
|
|
106
|
+
return {
|
|
107
|
+
error: {
|
|
108
|
+
kind: "ViteBuildError",
|
|
109
|
+
message: "Vite or esbuild reported an error",
|
|
110
|
+
stack: truncateViteRawLog(params.rawMessage),
|
|
111
|
+
},
|
|
112
|
+
message: defaultBuildSummary(params),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export function logViteBuildError(logger, params, overrides) {
|
|
117
|
+
const build = overrides?.build ?? buildViteBuildErrorLog;
|
|
118
|
+
try {
|
|
119
|
+
const viteErrorLog = build(params);
|
|
120
|
+
logger.error(viteErrorLog.message, {
|
|
121
|
+
error: viteErrorLog.error,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
try {
|
|
126
|
+
logger.error(params.rawMessage, diagnosticsFailureMeta(error, params.rawMessage));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Prevent exceptions from propagating into Vite's logger internals.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=vite-dev-server-diagnostics.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-dev-server-diagnostics.mjs","sourceRoot":"","sources":["../../src/dev-utils/vite-dev-server-diagnostics.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"AA6DA,UAAU,SAAS;IACjB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvC,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CACpD;AAwDD,wBAAgB,SAAS,CACvB,cAAc,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,GAChD,MAAM,CAWR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAgBtD"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { SeverityNumber } from "@opentelemetry/api-logs";
|
|
2
2
|
import { createLogger, format, transports } from "winston";
|
|
3
|
+
import { sanitizeLogError, sanitizeLogMessage, } from "@superblocksteam/telemetry";
|
|
3
4
|
import { getLogger as getTracedLogger } from "./index.js";
|
|
4
5
|
import { safeStringify } from "./safe-stringify.js";
|
|
5
6
|
const activeTransports = [];
|
|
6
7
|
if (process.env.SUPERBLOCKS_IS_CSB === "true") {
|
|
7
|
-
//
|
|
8
|
+
// info to stdout for cluster log shippers / kubectl logs;
|
|
9
|
+
// debug stays in /tmp/dev-server.log for on-pod triage
|
|
8
10
|
activeTransports.push(new transports.File({
|
|
9
|
-
format: format.json(),
|
|
11
|
+
format: format.combine(format.timestamp(), format.json()),
|
|
10
12
|
filename: `/tmp/dev-server.log`,
|
|
11
13
|
level: "debug",
|
|
12
14
|
}));
|
|
15
|
+
activeTransports.push(new transports.Console({
|
|
16
|
+
format: format.combine(format.timestamp(), format.json()),
|
|
17
|
+
level: process.env.SUPERBLOCKS_SDK_LOG_LEVEL ?? "info",
|
|
18
|
+
}));
|
|
13
19
|
}
|
|
14
20
|
else {
|
|
15
21
|
// having no transport increases memory usage
|
|
@@ -30,6 +36,7 @@ const winstonLogger = createLogger({
|
|
|
30
36
|
level: "debug",
|
|
31
37
|
exitOnError: false,
|
|
32
38
|
format: format.json(),
|
|
39
|
+
defaultMeta: { process: "child" },
|
|
33
40
|
transports: activeTransports,
|
|
34
41
|
});
|
|
35
42
|
function formatMessages(messages) {
|
|
@@ -37,7 +44,7 @@ function formatMessages(messages) {
|
|
|
37
44
|
}
|
|
38
45
|
const logger = Object.freeze({
|
|
39
46
|
debug: (...messages) => {
|
|
40
|
-
const body = formatMessages(messages);
|
|
47
|
+
const body = sanitizeLogMessage(formatMessages(messages));
|
|
41
48
|
getTracedLogger().emit({
|
|
42
49
|
severityNumber: SeverityNumber.DEBUG,
|
|
43
50
|
severityText: "DEBUG",
|
|
@@ -46,7 +53,7 @@ const logger = Object.freeze({
|
|
|
46
53
|
winstonLogger.debug(body);
|
|
47
54
|
},
|
|
48
55
|
info: (...messages) => {
|
|
49
|
-
const body = formatMessages(messages);
|
|
56
|
+
const body = sanitizeLogMessage(formatMessages(messages));
|
|
50
57
|
getTracedLogger().emit({
|
|
51
58
|
severityNumber: SeverityNumber.INFO,
|
|
52
59
|
severityText: "INFO",
|
|
@@ -55,7 +62,7 @@ const logger = Object.freeze({
|
|
|
55
62
|
winstonLogger.info(body);
|
|
56
63
|
},
|
|
57
64
|
warn: (...messages) => {
|
|
58
|
-
const body = formatMessages(messages);
|
|
65
|
+
const body = sanitizeLogMessage(formatMessages(messages));
|
|
59
66
|
getTracedLogger().emit({
|
|
60
67
|
severityNumber: SeverityNumber.WARN,
|
|
61
68
|
severityText: "WARN",
|
|
@@ -64,17 +71,22 @@ const logger = Object.freeze({
|
|
|
64
71
|
winstonLogger.warn(body);
|
|
65
72
|
},
|
|
66
73
|
error: (message, meta) => {
|
|
74
|
+
const safeMessage = sanitizeLogMessage(message);
|
|
75
|
+
const safeError = meta?.error
|
|
76
|
+
? (({ kind, message, stack }) => ({ kind, message, stack }))(sanitizeLogError(meta.error))
|
|
77
|
+
: undefined;
|
|
78
|
+
const safeMeta = safeError ? { error: safeError } : undefined;
|
|
67
79
|
getTracedLogger().emit({
|
|
68
80
|
severityNumber: SeverityNumber.ERROR,
|
|
69
81
|
severityText: "ERROR",
|
|
70
|
-
body:
|
|
71
|
-
attributes:
|
|
82
|
+
body: safeMessage,
|
|
83
|
+
attributes: safeMeta,
|
|
72
84
|
});
|
|
73
|
-
if (
|
|
74
|
-
winstonLogger.error(
|
|
85
|
+
if (safeError) {
|
|
86
|
+
winstonLogger.error(safeMessage, { error: safeError });
|
|
75
87
|
}
|
|
76
88
|
else {
|
|
77
|
-
winstonLogger.error(
|
|
89
|
+
winstonLogger.error(safeMessage);
|
|
78
90
|
}
|
|
79
91
|
},
|
|
80
92
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG3D,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,gBAAgB,GAAwB,EAAE,CAAC;AAEjD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;IAC9C
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.test.d.ts","sourceRoot":"","sources":["../../src/telemetry/logging.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
const { emitMock, winstonErrorMock, winstonLoggerMock, sanitizeLogMessageMock, sanitizeLogErrorMock, } = vi.hoisted(() => {
|
|
3
|
+
const emitMock = vi.fn();
|
|
4
|
+
const winstonErrorMock = vi.fn();
|
|
5
|
+
const winstonLoggerMock = {
|
|
6
|
+
debug: vi.fn(),
|
|
7
|
+
info: vi.fn(),
|
|
8
|
+
warn: vi.fn(),
|
|
9
|
+
error: winstonErrorMock,
|
|
10
|
+
};
|
|
11
|
+
const sanitizeLogMessageMock = vi.fn((message) => `sanitized-message:${message}`);
|
|
12
|
+
const sanitizeLogErrorMock = vi.fn((error) => ({
|
|
13
|
+
...error,
|
|
14
|
+
message: `sanitized-error:${error.message}`,
|
|
15
|
+
stack: error.stack ? `sanitized-error:${error.stack}` : undefined,
|
|
16
|
+
}));
|
|
17
|
+
return {
|
|
18
|
+
emitMock,
|
|
19
|
+
winstonErrorMock,
|
|
20
|
+
winstonLoggerMock,
|
|
21
|
+
sanitizeLogMessageMock,
|
|
22
|
+
sanitizeLogErrorMock,
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
vi.mock("@superblocksteam/telemetry", () => ({
|
|
26
|
+
sanitizeLogMessage: sanitizeLogMessageMock,
|
|
27
|
+
sanitizeLogError: sanitizeLogErrorMock,
|
|
28
|
+
}));
|
|
29
|
+
vi.mock("./index.js", () => ({
|
|
30
|
+
getLogger: vi.fn(() => ({
|
|
31
|
+
emit: emitMock,
|
|
32
|
+
})),
|
|
33
|
+
}));
|
|
34
|
+
vi.mock("winston", () => ({
|
|
35
|
+
createLogger: vi.fn(() => winstonLoggerMock),
|
|
36
|
+
format: {
|
|
37
|
+
combine: vi.fn(() => ({})),
|
|
38
|
+
timestamp: vi.fn(() => ({})),
|
|
39
|
+
json: vi.fn(() => ({})),
|
|
40
|
+
printf: vi.fn(() => ({})),
|
|
41
|
+
colorize: vi.fn(() => ({})),
|
|
42
|
+
},
|
|
43
|
+
transports: {
|
|
44
|
+
File: class {
|
|
45
|
+
constructor() { }
|
|
46
|
+
},
|
|
47
|
+
Console: class {
|
|
48
|
+
constructor() { }
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
}));
|
|
52
|
+
import { getLogger } from "./logging.js";
|
|
53
|
+
describe("telemetry logger error sanitization", () => {
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
vi.clearAllMocks();
|
|
56
|
+
});
|
|
57
|
+
it.each(["debug", "info", "warn"])("sanitizes %s-level messages before emit and winston", (level) => {
|
|
58
|
+
const logger = getLogger();
|
|
59
|
+
logger[level]("api_key=secret");
|
|
60
|
+
expect(sanitizeLogMessageMock).toHaveBeenCalledWith("api_key=secret");
|
|
61
|
+
});
|
|
62
|
+
it("sanitizes error meta for traced emit and winston output", () => {
|
|
63
|
+
const logger = getLogger();
|
|
64
|
+
const meta = {
|
|
65
|
+
error: {
|
|
66
|
+
kind: "RuntimeError",
|
|
67
|
+
message: "token=super-secret-token",
|
|
68
|
+
stack: "Error: token=super-secret-token",
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
logger.error("api_key=super-secret-key", meta);
|
|
72
|
+
expect(sanitizeLogMessageMock).toHaveBeenCalledWith("api_key=super-secret-key");
|
|
73
|
+
expect(sanitizeLogErrorMock).toHaveBeenCalledWith(meta.error);
|
|
74
|
+
expect(emitMock).toHaveBeenCalledWith(expect.objectContaining({
|
|
75
|
+
body: "sanitized-message:api_key=super-secret-key",
|
|
76
|
+
attributes: {
|
|
77
|
+
error: {
|
|
78
|
+
kind: "RuntimeError",
|
|
79
|
+
message: "sanitized-error:token=super-secret-token",
|
|
80
|
+
stack: "sanitized-error:Error: token=super-secret-token",
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
}));
|
|
84
|
+
expect(winstonErrorMock).toHaveBeenCalledWith("sanitized-message:api_key=super-secret-key", {
|
|
85
|
+
error: {
|
|
86
|
+
kind: "RuntimeError",
|
|
87
|
+
message: "sanitized-error:token=super-secret-token",
|
|
88
|
+
stack: "sanitized-error:Error: token=super-secret-token",
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
it("does not sanitize or emit error attributes when meta is missing", () => {
|
|
93
|
+
const logger = getLogger();
|
|
94
|
+
logger.error("plain failure");
|
|
95
|
+
expect(sanitizeLogMessageMock).toHaveBeenCalledWith("plain failure");
|
|
96
|
+
expect(sanitizeLogErrorMock).not.toHaveBeenCalled();
|
|
97
|
+
expect(emitMock).toHaveBeenCalledWith(expect.objectContaining({
|
|
98
|
+
body: "sanitized-message:plain failure",
|
|
99
|
+
attributes: undefined,
|
|
100
|
+
}));
|
|
101
|
+
expect(winstonErrorMock).toHaveBeenCalledWith("sanitized-message:plain failure");
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=logging.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.test.js","sourceRoot":"","sources":["../../src/telemetry/logging.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@superblocksteam/sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.115-next.1",
|
|
4
4
|
"description": "Superblocks JS SDK",
|
|
5
5
|
"homepage": "https://www.superblocks.com",
|
|
6
6
|
"license": "Superblocks Community Software License",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@babel/parser": "^7.25.8",
|
|
17
17
|
"@babel/plugin-proposal-decorators": "^7.28.0",
|
|
18
18
|
"@babel/plugin-transform-typescript": "7.28.0",
|
|
19
|
-
"@opentelemetry/api": "^1.9.
|
|
19
|
+
"@opentelemetry/api": "^1.9.1",
|
|
20
20
|
"@opentelemetry/api-logs": "^0.203.0",
|
|
21
21
|
"@opentelemetry/context-async-hooks": "^2.0.1",
|
|
22
22
|
"@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
|
|
@@ -48,11 +48,11 @@
|
|
|
48
48
|
"vite-tsconfig-paths": "^6.0.4",
|
|
49
49
|
"winston": "^3.17.0",
|
|
50
50
|
"yaml": "^2.7.1",
|
|
51
|
-
"@superblocksteam/library-shared": "2.0.
|
|
52
|
-
"@superblocksteam/shared": "0.
|
|
53
|
-
"@superblocksteam/telemetry": "2.0.
|
|
54
|
-
"@superblocksteam/util": "2.0.
|
|
55
|
-
"@superblocksteam/vite-plugin-file-sync": "2.0.
|
|
51
|
+
"@superblocksteam/library-shared": "2.0.115-next.1",
|
|
52
|
+
"@superblocksteam/shared": "0.9585.0",
|
|
53
|
+
"@superblocksteam/telemetry": "2.0.115-next.1",
|
|
54
|
+
"@superblocksteam/util": "2.0.115-next.1",
|
|
55
|
+
"@superblocksteam/vite-plugin-file-sync": "2.0.115-next.1"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@eslint/js": "^9.39.2",
|
|
@@ -603,6 +603,100 @@ export async function dev(options: {
|
|
|
603
603
|
applicationId: applicationConfig.id,
|
|
604
604
|
workDir: cwd,
|
|
605
605
|
});
|
|
606
|
+
|
|
607
|
+
// In CSB mode, schedule a background retry loop. The app's
|
|
608
|
+
// git config may not be persisted yet at claim time (e.g. git
|
|
609
|
+
// was connected moments before the CSB was assigned). Without
|
|
610
|
+
// this, the CSB runs its entire lifetime without git — meaning
|
|
611
|
+
// changes are only in DBFS and are lost if the CSB recycles.
|
|
612
|
+
if (lockType === LockType.CSB) {
|
|
613
|
+
const GIT_RETRY_DELAY_MS = 30_000;
|
|
614
|
+
const GIT_RETRY_MAX_ATTEMPTS = 10;
|
|
615
|
+
const scheduleRetry = (attempt: number): void => {
|
|
616
|
+
if (attempt > GIT_RETRY_MAX_ATTEMPTS) {
|
|
617
|
+
logger.info(
|
|
618
|
+
"[git] background bootstrap retry exhausted, giving up",
|
|
619
|
+
{
|
|
620
|
+
gitCategory: "setup",
|
|
621
|
+
gitOperation: "background-retry",
|
|
622
|
+
gitOutcome: "exhausted",
|
|
623
|
+
gitAttempt: attempt - 1,
|
|
624
|
+
applicationId: applicationConfig.id,
|
|
625
|
+
},
|
|
626
|
+
);
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
const timer = setTimeout(() => {
|
|
630
|
+
void (async () => {
|
|
631
|
+
if (gitService) return;
|
|
632
|
+
try {
|
|
633
|
+
const svc = await bootstrapGitService({
|
|
634
|
+
sdk,
|
|
635
|
+
applicationId: applicationConfig.id,
|
|
636
|
+
cwd,
|
|
637
|
+
logger,
|
|
638
|
+
userName: gitUserName,
|
|
639
|
+
userEmail: gitUserEmail,
|
|
640
|
+
superblocksBaseUrl:
|
|
641
|
+
tokenConfig.superblocksBaseUrl,
|
|
642
|
+
});
|
|
643
|
+
if (!svc) {
|
|
644
|
+
scheduleRetry(attempt + 1);
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
gitService = svc;
|
|
649
|
+
|
|
650
|
+
try {
|
|
651
|
+
await fetchAndEnsureLiveBranch(
|
|
652
|
+
svc,
|
|
653
|
+
"Git background retry fetch failed",
|
|
654
|
+
);
|
|
655
|
+
} catch {
|
|
656
|
+
// non-fatal
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
activeDbfsBranchName =
|
|
660
|
+
await ensureRuntimeDbfsBranchConsistency({
|
|
661
|
+
sdk,
|
|
662
|
+
applicationConfig,
|
|
663
|
+
logger,
|
|
664
|
+
lockService,
|
|
665
|
+
syncService,
|
|
666
|
+
currentBranchName: activeDbfsBranchName,
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
logger.info(
|
|
670
|
+
"[git] background bootstrap retry succeeded",
|
|
671
|
+
{
|
|
672
|
+
gitCategory: "setup",
|
|
673
|
+
gitOperation: "background-retry",
|
|
674
|
+
gitOutcome: "success",
|
|
675
|
+
gitAttempt: attempt,
|
|
676
|
+
applicationId: applicationConfig.id,
|
|
677
|
+
},
|
|
678
|
+
);
|
|
679
|
+
} catch (err) {
|
|
680
|
+
logger.warn(
|
|
681
|
+
"[git] background bootstrap retry failed",
|
|
682
|
+
{
|
|
683
|
+
gitCategory: "setup",
|
|
684
|
+
gitOperation: "background-retry",
|
|
685
|
+
gitOutcome: "failed",
|
|
686
|
+
gitAttempt: attempt,
|
|
687
|
+
applicationId: applicationConfig.id,
|
|
688
|
+
...getGitErrorFields(err),
|
|
689
|
+
},
|
|
690
|
+
);
|
|
691
|
+
scheduleRetry(attempt + 1);
|
|
692
|
+
}
|
|
693
|
+
})();
|
|
694
|
+
}, GIT_RETRY_DELAY_MS);
|
|
695
|
+
timer.unref();
|
|
696
|
+
};
|
|
697
|
+
scheduleRetry(1);
|
|
698
|
+
}
|
|
699
|
+
|
|
606
700
|
gitSpan.end();
|
|
607
701
|
return;
|
|
608
702
|
}
|
|
@@ -1230,10 +1324,23 @@ async function ensureLiveBranchCheckedOutAfterFetch(
|
|
|
1230
1324
|
// If remote live branch exists, initialize/switch local live branch from it.
|
|
1231
1325
|
// This handles fresh repos where HEAD is unborn before first fetch.
|
|
1232
1326
|
if (await canResolveRef(git, `origin/${SUPERBLOCKS_LIVE_GIT_BRANCH}`)) {
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1327
|
+
try {
|
|
1328
|
+
await git.checkoutOrCreate(
|
|
1329
|
+
SUPERBLOCKS_LIVE_GIT_BRANCH,
|
|
1330
|
+
`origin/${SUPERBLOCKS_LIVE_GIT_BRANCH}`,
|
|
1331
|
+
);
|
|
1332
|
+
} catch {
|
|
1333
|
+
// Pre-warmed CSBs download DBFS files before git is set up, leaving
|
|
1334
|
+
// untracked working tree files that collide with the branch contents.
|
|
1335
|
+
// Force-checkout is safe here — the files are identical.
|
|
1336
|
+
await git.raw([
|
|
1337
|
+
"checkout",
|
|
1338
|
+
"-f",
|
|
1339
|
+
"-B",
|
|
1340
|
+
SUPERBLOCKS_LIVE_GIT_BRANCH,
|
|
1341
|
+
`origin/${SUPERBLOCKS_LIVE_GIT_BRANCH}`,
|
|
1342
|
+
]);
|
|
1343
|
+
}
|
|
1237
1344
|
return;
|
|
1238
1345
|
}
|
|
1239
1346
|
|
|
@@ -48,6 +48,10 @@ import {
|
|
|
48
48
|
customComponentsPlugin,
|
|
49
49
|
isCustomComponentsEnabled,
|
|
50
50
|
} from "./custom-build.mjs";
|
|
51
|
+
import {
|
|
52
|
+
formatViteDevServerStartedLog,
|
|
53
|
+
logViteBuildError,
|
|
54
|
+
} from "./vite-dev-server-diagnostics.mjs";
|
|
51
55
|
import { buildManifestStubPlugin } from "./vite-plugin-build-manifest-stub.mjs";
|
|
52
56
|
import { ddRumPlugin } from "./vite-plugin-dd-rum.mjs";
|
|
53
57
|
|
|
@@ -833,7 +837,11 @@ async function startVite({
|
|
|
833
837
|
logger.warn(msg);
|
|
834
838
|
};
|
|
835
839
|
viteLogger.error = (msg: string) => {
|
|
836
|
-
logger
|
|
840
|
+
logViteBuildError(logger, {
|
|
841
|
+
rawMessage: msg,
|
|
842
|
+
sdkVersion: pkg.version,
|
|
843
|
+
viteRootBasename: path.basename(root),
|
|
844
|
+
});
|
|
837
845
|
};
|
|
838
846
|
|
|
839
847
|
viteLogger.clearScreen = () => {};
|
|
@@ -954,7 +962,12 @@ async function startVite({
|
|
|
954
962
|
|
|
955
963
|
const routeIndex = (app._router as IRouter).stack.length;
|
|
956
964
|
app.use(viteServer.middlewares);
|
|
957
|
-
logger.info(
|
|
965
|
+
logger.info(
|
|
966
|
+
`${formatViteDevServerStartedLog({
|
|
967
|
+
sdkVersion: pkg.version,
|
|
968
|
+
viteRootBasename: path.basename(root),
|
|
969
|
+
})} Dev server created and middleware attached successfully`,
|
|
970
|
+
);
|
|
958
971
|
|
|
959
972
|
return {
|
|
960
973
|
viteServer,
|