@superblocksteam/sdk 2.0.139-next.1 → 2.0.140-next.0

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.
Files changed (80) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/application-build.d.mts.map +1 -1
  3. package/dist/application-build.mjs +3 -0
  4. package/dist/application-build.mjs.map +1 -1
  5. package/dist/dev-utils/dev-server-resolve-config.test.d.mts +2 -0
  6. package/dist/dev-utils/dev-server-resolve-config.test.d.mts.map +1 -0
  7. package/dist/dev-utils/dev-server-resolve-config.test.mjs +20 -0
  8. package/dist/dev-utils/dev-server-resolve-config.test.mjs.map +1 -0
  9. package/dist/dev-utils/dev-server-tracing.test.d.mts +2 -0
  10. package/dist/dev-utils/dev-server-tracing.test.d.mts.map +1 -0
  11. package/dist/dev-utils/dev-server-tracing.test.mjs +24 -0
  12. package/dist/dev-utils/dev-server-tracing.test.mjs.map +1 -0
  13. package/dist/dev-utils/dev-server.d.mts +10 -0
  14. package/dist/dev-utils/dev-server.d.mts.map +1 -1
  15. package/dist/dev-utils/dev-server.mjs +20 -1
  16. package/dist/dev-utils/dev-server.mjs.map +1 -1
  17. package/dist/react-compiler-runtime-shim.d.mts +23 -0
  18. package/dist/react-compiler-runtime-shim.d.mts.map +1 -0
  19. package/dist/react-compiler-runtime-shim.mjs +44 -0
  20. package/dist/react-compiler-runtime-shim.mjs.map +1 -0
  21. package/dist/react-compiler-runtime-shim.test.d.mts +2 -0
  22. package/dist/react-compiler-runtime-shim.test.d.mts.map +1 -0
  23. package/dist/react-compiler-runtime-shim.test.mjs +23 -0
  24. package/dist/react-compiler-runtime-shim.test.mjs.map +1 -0
  25. package/dist/telemetry/attributes.d.ts +0 -1
  26. package/dist/telemetry/attributes.d.ts.map +1 -1
  27. package/dist/telemetry/attributes.js +0 -1
  28. package/dist/telemetry/attributes.js.map +1 -1
  29. package/dist/telemetry/identity.d.ts +29 -0
  30. package/dist/telemetry/identity.d.ts.map +1 -0
  31. package/dist/telemetry/identity.js +9 -0
  32. package/dist/telemetry/identity.js.map +1 -0
  33. package/dist/telemetry/identity.test.d.ts +2 -0
  34. package/dist/telemetry/identity.test.d.ts.map +1 -0
  35. package/dist/telemetry/identity.test.js +25 -0
  36. package/dist/telemetry/identity.test.js.map +1 -0
  37. package/dist/telemetry/index.d.ts.map +1 -1
  38. package/dist/telemetry/index.js +55 -45
  39. package/dist/telemetry/index.js.map +1 -1
  40. package/dist/telemetry/index.test.js +29 -1
  41. package/dist/telemetry/index.test.js.map +1 -1
  42. package/dist/telemetry/local-obs.d.ts +8 -2
  43. package/dist/telemetry/local-obs.d.ts.map +1 -1
  44. package/dist/telemetry/local-obs.js +8 -3
  45. package/dist/telemetry/local-obs.js.map +1 -1
  46. package/dist/telemetry/otlp-config.d.ts +74 -0
  47. package/dist/telemetry/otlp-config.d.ts.map +1 -0
  48. package/dist/telemetry/otlp-config.js +204 -0
  49. package/dist/telemetry/otlp-config.js.map +1 -0
  50. package/dist/telemetry/otlp-config.test.d.ts +2 -0
  51. package/dist/telemetry/otlp-config.test.d.ts.map +1 -0
  52. package/dist/telemetry/otlp-config.test.js +156 -0
  53. package/dist/telemetry/otlp-config.test.js.map +1 -0
  54. package/dist/telemetry/preload.d.ts +23 -0
  55. package/dist/telemetry/preload.d.ts.map +1 -0
  56. package/dist/telemetry/preload.js +92 -0
  57. package/dist/telemetry/preload.js.map +1 -0
  58. package/dist/telemetry/util.d.ts +3 -3
  59. package/dist/telemetry/util.d.ts.map +1 -1
  60. package/dist/telemetry/util.js +6 -32
  61. package/dist/telemetry/util.js.map +1 -1
  62. package/package.json +18 -9
  63. package/src/application-build.mts +4 -0
  64. package/src/dev-utils/dev-server-resolve-config.test.mts +29 -0
  65. package/src/dev-utils/dev-server-tracing.test.mts +32 -0
  66. package/src/dev-utils/dev-server.mts +22 -1
  67. package/src/react-compiler-runtime-shim.mts +50 -0
  68. package/src/react-compiler-runtime-shim.test.mts +26 -0
  69. package/src/telemetry/attributes.ts +0 -1
  70. package/src/telemetry/identity.test.ts +30 -0
  71. package/src/telemetry/identity.ts +40 -0
  72. package/src/telemetry/index.test.ts +36 -1
  73. package/src/telemetry/index.ts +58 -47
  74. package/src/telemetry/local-obs.ts +8 -3
  75. package/src/telemetry/otlp-config.test.ts +213 -0
  76. package/src/telemetry/otlp-config.ts +250 -0
  77. package/src/telemetry/preload.ts +113 -0
  78. package/src/telemetry/util.ts +6 -32
  79. package/tsconfig.tsbuildinfo +1 -1
  80. package/turbo.json +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-config.js","sourceRoot":"","sources":["../../src/telemetry/otlp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=otlp-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-config.test.d.ts","sourceRoot":"","sources":["../../src/telemetry/otlp-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import * as http from "node:http";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { buildDeltaCounterPayload, deploymentEnvironment, emitOtlpCounter, otlpBaseUrl, otlpMetricsUrl, } from "./otlp-config.js";
4
+ describe("otlpBaseUrl", () => {
5
+ it("returns <origin>/api for a valid base URL, dropping any path", () => {
6
+ expect(otlpBaseUrl("https://app.superblocks.com/some/path")).toBe("https://app.superblocks.com/api");
7
+ });
8
+ it("returns undefined when the base URL is missing", () => {
9
+ expect(otlpBaseUrl(undefined)).toBeUndefined();
10
+ });
11
+ it("returns undefined on an unparseable base URL", () => {
12
+ expect(otlpBaseUrl("not a url")).toBeUndefined();
13
+ });
14
+ });
15
+ describe("otlpMetricsUrl", () => {
16
+ it("derives <baseUrl origin>/api/v1/metrics from SUPERBLOCKS_BASE_URL", () => {
17
+ expect(otlpMetricsUrl({
18
+ SUPERBLOCKS_BASE_URL: "https://pr-19864.superblocks.dev/some/path",
19
+ })).toBe("https://pr-19864.superblocks.dev/api/v1/metrics");
20
+ });
21
+ it("always exports through the server proxy: SUPERBLOCKS_OTEL_COLLECTOR_URL alone is ignored", () => {
22
+ // There is no direct-to-collector path anymore; the server proxies OTLP.
23
+ expect(otlpMetricsUrl({
24
+ SUPERBLOCKS_OTEL_COLLECTOR_URL: "http://localhost:4318",
25
+ })).toBeNull();
26
+ });
27
+ it("returns null when no base URL is present (emission is skipped)", () => {
28
+ expect(otlpMetricsUrl({})).toBeNull();
29
+ });
30
+ it("returns null on an unparseable base URL", () => {
31
+ expect(otlpMetricsUrl({ SUPERBLOCKS_BASE_URL: "not a url" })).toBeNull();
32
+ });
33
+ });
34
+ describe("warnIfCollectorUrlIgnored", () => {
35
+ it("warns once (and only once) when the retired direct-export var is set", async () => {
36
+ // The module-level call in otlp-config.ts latches the once-flag against
37
+ // the real process.env at import time, so a shell that exports the var
38
+ // would make the statically imported instance a no-op here. Import a
39
+ // fresh instance with the var stubbed away.
40
+ vi.stubEnv("SUPERBLOCKS_OTEL_COLLECTOR_URL", "");
41
+ vi.resetModules();
42
+ const { warnIfCollectorUrlIgnored } = await import("./otlp-config.js");
43
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
44
+ warnIfCollectorUrlIgnored({});
45
+ expect(warn).not.toHaveBeenCalled();
46
+ warnIfCollectorUrlIgnored({
47
+ SUPERBLOCKS_OTEL_COLLECTOR_URL: "http://localhost:4318",
48
+ });
49
+ warnIfCollectorUrlIgnored({
50
+ SUPERBLOCKS_OTEL_COLLECTOR_URL: "http://localhost:4318",
51
+ });
52
+ expect(warn).toHaveBeenCalledTimes(1);
53
+ expect(warn.mock.calls[0][0]).toContain("SUPERBLOCKS_OTEL_COLLECTOR_URL");
54
+ warn.mockRestore();
55
+ vi.unstubAllEnvs();
56
+ });
57
+ });
58
+ describe("deploymentEnvironment", () => {
59
+ it("maps an ephemeral pr-<n> host to 'ephemeral'", () => {
60
+ expect(deploymentEnvironment({
61
+ SUPERBLOCKS_BASE_URL: "https://pr-19864.superblocks.dev",
62
+ })).toBe("ephemeral");
63
+ });
64
+ it("maps localhost to 'local'", () => {
65
+ expect(deploymentEnvironment({ SUPERBLOCKS_BASE_URL: "http://localhost:3000" })).toBe("local");
66
+ });
67
+ it("maps the production host to 'prod'", () => {
68
+ expect(deploymentEnvironment({
69
+ SUPERBLOCKS_BASE_URL: "https://app.superblocks.com",
70
+ })).toBe("prod");
71
+ });
72
+ it("falls back to 'other' when no base URL is available", () => {
73
+ expect(deploymentEnvironment({})).toBe("other");
74
+ });
75
+ });
76
+ describe("buildDeltaCounterPayload", () => {
77
+ it("builds a monotonic DELTA sum with one int data point and the given attributes", () => {
78
+ const payload = buildDeltaCounterPayload({
79
+ name: "dev_server_child_respawn_completed_total",
80
+ description: "desc",
81
+ attributes: { reason: "flip_restart" },
82
+ environment: "ephemeral",
83
+ nowMs: 1_730_000_000_000,
84
+ });
85
+ const rm = payload.resourceMetrics[0];
86
+ const resourceAttrs = Object.fromEntries(rm.resource.attributes.map((a) => [a.key, a.value.stringValue]));
87
+ expect(resourceAttrs["service.name"]).toBe("sdk-dev-server");
88
+ expect(resourceAttrs["deployment.environment.name"]).toBe("ephemeral");
89
+ const metric = rm.scopeMetrics[0].metrics[0];
90
+ expect(metric.sum.isMonotonic).toBe(true);
91
+ expect(metric.sum.aggregationTemporality).toBe(1); // DELTA
92
+ const dp = metric.sum.dataPoints[0];
93
+ expect(dp.asInt).toBe("1");
94
+ const dpAttrs = Object.fromEntries(dp.attributes.map((a) => [a.key, a.value.stringValue]));
95
+ expect(dpAttrs.reason).toBe("flip_restart");
96
+ // Nanosecond timestamps must be decimal strings, start <= time.
97
+ expect(typeof dp.timeUnixNano).toBe("string");
98
+ expect(BigInt(dp.startTimeUnixNano) <= BigInt(dp.timeUnixNano)).toBe(true);
99
+ expect(dp.timeUnixNano).toBe((BigInt(1_730_000_000_000) * 1000000n).toString());
100
+ });
101
+ });
102
+ describe("emitOtlpCounter (integration: listens on the OTLP endpoint)", () => {
103
+ let server;
104
+ let received;
105
+ let port;
106
+ beforeEach(async () => {
107
+ received = null;
108
+ server = http.createServer((req, res) => {
109
+ let body = "";
110
+ req.on("data", (c) => (body += c));
111
+ req.on("end", () => {
112
+ received = {
113
+ url: req.url,
114
+ contentType: req.headers["content-type"],
115
+ body,
116
+ };
117
+ res.writeHead(200, { "content-type": "application/json" });
118
+ res.end("{}");
119
+ });
120
+ });
121
+ await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
122
+ port = server.address().port;
123
+ });
124
+ afterEach(async () => {
125
+ await new Promise((resolve) => server.close(() => resolve()));
126
+ });
127
+ it("POSTs the counter as OTLP JSON to the server proxy's /api/v1/metrics", async () => {
128
+ await emitOtlpCounter({
129
+ name: "dev_server_child_respawn_completed_total",
130
+ description: "desc",
131
+ attributes: { reason: "flip_restart" },
132
+ env: { SUPERBLOCKS_BASE_URL: `http://127.0.0.1:${port}` },
133
+ // Tests must observe the request, so keep the socket alive (no unref) and
134
+ // await the POST instead of fire-and-forget.
135
+ unref: false,
136
+ timeoutMs: 5000,
137
+ });
138
+ expect(received).not.toBeNull();
139
+ expect(received.url).toBe("/api/v1/metrics");
140
+ expect(received.contentType).toContain("application/json");
141
+ const parsed = JSON.parse(received.body);
142
+ const metric = parsed.resourceMetrics[0].scopeMetrics[0].metrics[0];
143
+ expect(metric.sum.dataPoints[0].asInt).toBe("1");
144
+ });
145
+ it("resolves without throwing and sends nothing when no base URL is configured", async () => {
146
+ await expect(emitOtlpCounter({
147
+ name: "dev_server_child_respawn_completed_total",
148
+ description: "desc",
149
+ attributes: { reason: "flip_restart" },
150
+ env: {},
151
+ unref: false,
152
+ })).resolves.toBeUndefined();
153
+ expect(received).toBeNull();
154
+ });
155
+ });
156
+ //# sourceMappingURL=otlp-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-config.test.js","sourceRoot":"","sources":["../../src/telemetry/otlp-config.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC,CAAC,IAAI,CAC/D,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CACJ,cAAc,CAAC;YACb,oBAAoB,EAAE,4CAA4C;SACnE,CAAC,CACH,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,yEAAyE;QACzE,MAAM,CACJ,cAAc,CAAC;YACb,8BAA8B,EAAE,uBAAuB;SACxD,CAAC,CACH,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,cAAc,CAAC,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,wEAAwE;QACxE,uEAAuE;QACvE,qEAAqE;QACrE,4CAA4C;QAC5C,EAAE,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;QACjD,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEpE,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEpC,yBAAyB,CAAC;YACxB,8BAA8B,EAAE,uBAAuB;SACxD,CAAC,CAAC;QACH,yBAAyB,CAAC;YACxB,8BAA8B,EAAE,uBAAuB;SACxD,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CACJ,qBAAqB,CAAC;YACpB,oBAAoB,EAAE,kCAAkC;SACzD,CAAC,CACH,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CACJ,qBAAqB,CAAC,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,CAAC,CACzE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CACJ,qBAAqB,CAAC;YACpB,oBAAoB,EAAE,6BAA6B;SACpD,CAAC,CACH,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,OAAO,GAAG,wBAAwB,CAAC;YACvC,IAAI,EAAE,0CAA0C;YAChD,WAAW,EAAE,MAAM;YACnB,UAAU,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;YACtC,WAAW,EAAE,WAAW;YACxB,KAAK,EAAE,iBAAiB;SACzB,CAAQ,CAAC;QAEV,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACtC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CACrE,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;QAE3D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAChC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAC5D,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE5C,gEAAgE;QAChE,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAC1B,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,QAAU,CAAC,CAAC,QAAQ,EAAE,CACpD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6DAA6D,EAAE,GAAG,EAAE;IAC3E,IAAI,MAAmB,CAAC;IACxB,IAAI,QAAqE,CAAC;IAC1E,IAAI,IAAY,CAAC;IAEjB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACtC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,QAAQ,GAAG;oBACT,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;oBACxC,IAAI;iBACL,CAAC;gBACF,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CACvC,CAAC;QACF,IAAI,GAAI,MAAM,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,eAAe,CAAC;YACpB,IAAI,EAAE,0CAA0C;YAChD,WAAW,EAAE,MAAM;YACnB,UAAU,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;YACtC,GAAG,EAAE,EAAE,oBAAoB,EAAE,oBAAoB,IAAI,EAAE,EAAE;YACzD,0EAA0E;YAC1E,6CAA6C;YAC7C,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAS,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,MAAM,CACV,eAAe,CAAC;YACd,IAAI,EAAE,0CAA0C;YAChD,WAAW,EAAE,MAAM;YACnB,UAAU,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;YACtC,GAAG,EAAE,EAAE;YACP,KAAK,EAAE,KAAK;SACb,CAAC,CACH,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Early telemetry preload for the dev-server child.
3
+ *
4
+ * This module has ONE job: start the OpenTelemetry SDK before any instrumented
5
+ * module (node:http, express, the ai-service) is loaded. OTel auto-instrumentation
6
+ * patches modules at require time, so if the SDK starts late — as it did when the
7
+ * only init was `configureTelemetry` at connect time — those modules load
8
+ * unpatched and the dev-server exports nothing. The child entry (`dev.mts`)
9
+ * imports this as its very first import so it runs before the SDK barrel.
10
+ *
11
+ * It intentionally does NOT init dd-trace/LLMObs. Those spans are created during
12
+ * generation (after connect) and need the application id that is only known then,
13
+ * so `configureTelemetry` still owns LLMObs. `configureTelemetry`'s own
14
+ * `initNodeTelemetry` call becomes a no-op here: `initNodeTelemetry` returns the
15
+ * already-created instance, so we init once, early.
16
+ *
17
+ * Config comes from the environment (available at process start), not the auth
18
+ * file, so nothing here has to await a network/disk read. The endpoint and
19
+ * environment tag are resolved by the shared `otlp-config` module, the same one
20
+ * the lightweight parent uses, so parent and child agree on where telemetry goes.
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=preload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../../src/telemetry/preload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Early telemetry preload for the dev-server child.
3
+ *
4
+ * This module has ONE job: start the OpenTelemetry SDK before any instrumented
5
+ * module (node:http, express, the ai-service) is loaded. OTel auto-instrumentation
6
+ * patches modules at require time, so if the SDK starts late — as it did when the
7
+ * only init was `configureTelemetry` at connect time — those modules load
8
+ * unpatched and the dev-server exports nothing. The child entry (`dev.mts`)
9
+ * imports this as its very first import so it runs before the SDK barrel.
10
+ *
11
+ * It intentionally does NOT init dd-trace/LLMObs. Those spans are created during
12
+ * generation (after connect) and need the application id that is only known then,
13
+ * so `configureTelemetry` still owns LLMObs. `configureTelemetry`'s own
14
+ * `initNodeTelemetry` call becomes a no-op here: `initNodeTelemetry` returns the
15
+ * already-created instance, so we init once, early.
16
+ *
17
+ * Config comes from the environment (available at process start), not the auth
18
+ * file, so nothing here has to await a network/disk read. The endpoint and
19
+ * environment tag are resolved by the shared `otlp-config` module, the same one
20
+ * the lightweight parent uses, so parent and child agree on where telemetry goes.
21
+ */
22
+ import os from "node:os";
23
+ import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
24
+ import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
25
+ import { DeploymentTypeEnum } from "@superblocksteam/shared";
26
+ import { getDefaultPolicy, initNodeTelemetry, parseDeploymentType, } from "@superblocksteam/telemetry";
27
+ import packageJson from "../../package.json" with { type: "json" };
28
+ import { ATTR_SUPERBLOCKS_BASE_URL, ATTR_SUPERBLOCKS_CSB_ID, ATTR_SUPERBLOCKS_IS_CSB, getEnvironmentFromHostname, } from "./attributes.js";
29
+ import { getTelemetryIdentity } from "./identity.js";
30
+ import { applyLocalObsEnvVars } from "./local-obs.js";
31
+ import { otlpBaseUrl, SERVICE_NAME } from "./otlp-config.js";
32
+ // Apply local-obs env defaults first so deployment type / export policy are set
33
+ // before we read them below (mirrors the module-scope call in index.ts).
34
+ applyLocalObsEnvVars();
35
+ const baseUrl = process.env.SUPERBLOCKS_BASE_URL;
36
+ const otlpUrl = otlpBaseUrl(baseUrl);
37
+ // Without a base URL we have no proxy to export to; skip early init and let the
38
+ // later configureTelemetry path (which resolves config from the auth file) run.
39
+ // Warn so the fallback is visible: by then http/express are already loaded
40
+ // unpatched, so auto-instrumented traces are missing for this run.
41
+ if (!otlpUrl) {
42
+ console.warn("[Telemetry] SUPERBLOCKS_BASE_URL is not set; skipping early OpenTelemetry init. Auto-instrumented HTTP/Express traces will be missing for this run.");
43
+ }
44
+ else {
45
+ const hostname = (() => {
46
+ try {
47
+ return baseUrl ? new URL(baseUrl).hostname : "";
48
+ }
49
+ catch {
50
+ return "";
51
+ }
52
+ })();
53
+ const isCsb = !!process.env.SUPERBLOCKS_IS_CSB;
54
+ // A typo'd SUPERBLOCKS_DEPLOYMENT_TYPE must not abort early init; default to
55
+ // CLOUD like the connect-time path in index.ts does.
56
+ const deploymentType = (() => {
57
+ try {
58
+ return parseDeploymentType(process.env.SUPERBLOCKS_DEPLOYMENT_TYPE);
59
+ }
60
+ catch (error) {
61
+ console.warn("[Telemetry] Invalid SUPERBLOCKS_DEPLOYMENT_TYPE, defaulting to CLOUD:", error);
62
+ return DeploymentTypeEnum.CLOUD;
63
+ }
64
+ })();
65
+ try {
66
+ initNodeTelemetry({
67
+ serviceName: SERVICE_NAME,
68
+ serviceVersion: packageJson.version,
69
+ environment: getEnvironmentFromHostname(hostname),
70
+ otlpUrl,
71
+ resourceAttributes: {
72
+ [ATTR_SUPERBLOCKS_BASE_URL]: hostname,
73
+ [ATTR_SUPERBLOCKS_IS_CSB]: String(isCsb),
74
+ ...(isCsb && { [ATTR_SUPERBLOCKS_CSB_ID]: os.hostname() }),
75
+ },
76
+ instrumentations: [
77
+ new HttpInstrumentation(),
78
+ new ExpressInstrumentation(),
79
+ ],
80
+ logsEnabled: true,
81
+ // Identity (application/user/org) is only known at connect;
82
+ // configureTelemetry fills it in and every span and exported log
83
+ // record picks it up here.
84
+ dynamicAttributes: getTelemetryIdentity,
85
+ }, getDefaultPolicy(deploymentType));
86
+ }
87
+ catch (error) {
88
+ // Never let telemetry init crash the dev-server boot.
89
+ console.error("[Telemetry] Early preload failed to initialize:", error);
90
+ }
91
+ }
92
+ //# sourceMappingURL=preload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.js","sourceRoot":"","sources":["../../src/telemetry/preload.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- export declare const SERVICE_NAME = "sdk-dev-server";
1
+ import { SERVICE_NAME } from "./otlp-config.js";
2
+ export { SERVICE_NAME };
2
3
  export declare function getConfiguration(): Promise<{
3
4
  superblocksBaseUrl: import("url").URL;
4
- otlpBaseUrl: string;
5
+ otlpBaseUrl: string | undefined;
5
6
  superblocksHostname: string;
6
7
  serviceName: string;
7
- token: string;
8
8
  }>;
9
9
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,mBAAmB,CAAC;AA2B7C,wBAAsB,gBAAgB;;;;;;GAwBrC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI7D,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,wBAAsB,gBAAgB;;;;;GAmBrC"}
@@ -1,45 +1,19 @@
1
1
  import { getLocalTokenWithUrl } from "@superblocksteam/util";
2
- export const SERVICE_NAME = "sdk-dev-server";
3
- /**
4
- * Get the OTLP base URL for telemetry export.
5
- *
6
- * Priority:
7
- * 1. SUPERBLOCKS_OTEL_COLLECTOR_URL env var (for local obs mode)
8
- * 2. Superblocks API endpoint derived from base URL
9
- *
10
- * When SUPERBLOCKS_OTEL_COLLECTOR_URL is set (e.g., http://localhost:4318),
11
- * telemetry is sent directly to the local OTEL collector.
12
- *
13
- * Note: This returns the BASE URL. The telemetry library appends /v1/traces,
14
- * /v1/metrics, /v1/logs to this URL.
15
- */
16
- function getOtlpBaseUrl(superblocksBaseUrl) {
17
- const localOtelUrl = process.env.SUPERBLOCKS_OTEL_COLLECTOR_URL;
18
- if (localOtelUrl) {
19
- // Remove trailing /v1/traces etc. if present (just use base URL)
20
- return localOtelUrl.replace(/\/v1\/(traces|metrics|logs)$/, "");
21
- }
22
- // Default: Superblocks API proxies OTLP requests
23
- // The server expects /api/v1/traces but the telemetry lib adds /v1/traces,
24
- // so we return /api and let telemetry lib append /v1/traces
25
- return superblocksBaseUrl.origin + "/api";
26
- }
2
+ import { otlpBaseUrl, SERVICE_NAME } from "./otlp-config.js";
3
+ // Re-exported so existing importers of `./util.js` keep resolving SERVICE_NAME
4
+ // from the single source of truth in otlp-config.
5
+ export { SERVICE_NAME };
27
6
  export async function getConfiguration() {
28
7
  try {
29
8
  const tokenWithUrl = await getLocalTokenWithUrl();
30
9
  const superblocksBaseUrl = new URL(tokenWithUrl.superblocksBaseUrl);
31
- const otlpBaseUrl = getOtlpBaseUrl(superblocksBaseUrl);
10
+ const otlpBase = otlpBaseUrl(superblocksBaseUrl);
32
11
  const superblocksHostname = superblocksBaseUrl.hostname;
33
- let token = "";
34
- if ("token" in tokenWithUrl) {
35
- token = tokenWithUrl.token.substring(0, 8);
36
- }
37
12
  return {
38
13
  superblocksBaseUrl,
39
- otlpBaseUrl,
14
+ otlpBaseUrl: otlpBase,
40
15
  superblocksHostname,
41
16
  serviceName: SERVICE_NAME,
42
- token,
43
17
  };
44
18
  }
45
19
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,SAAS,cAAc,CAAC,kBAAuB;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IAChE,IAAI,YAAY,EAAE,CAAC;QACjB,iEAAiE;QACjE,OAAO,YAAY,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,iDAAiD;IACjD,2EAA2E;IAC3E,4DAA4D;IAC5D,OAAO,kBAAkB,CAAC,MAAM,GAAG,MAAM,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAClD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QACxD,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;YAC5B,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO;YACL,kBAAkB;YAClB,WAAW;YACX,mBAAmB;YACnB,WAAW,EAAE,YAAY;YACzB,KAAK;SACN,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,4FAA4F,EAC5F,CAAC,CACF,CAAC;QACF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE7D,+EAA+E;AAC/E,kDAAkD;AAClD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAClD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QACxD,OAAO;YACL,kBAAkB;YAClB,WAAW,EAAE,QAAQ;YACrB,mBAAmB;YACnB,WAAW,EAAE,YAAY;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,4FAA4F,EAC5F,CAAC,CACF,CAAC;QACF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superblocksteam/sdk",
3
- "version": "2.0.139-next.1",
3
+ "version": "2.0.140-next.0",
4
4
  "description": "Superblocks JS SDK",
5
5
  "homepage": "https://www.superblocks.com",
6
6
  "license": "Superblocks Community Software License",
@@ -9,10 +9,18 @@
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
+ },
13
+ "./otlp-config": {
14
+ "types": "./dist/telemetry/otlp-config.d.ts",
15
+ "import": "./dist/telemetry/otlp-config.js"
16
+ },
17
+ "./telemetry-preload": {
18
+ "types": "./dist/telemetry/preload.d.ts",
19
+ "import": "./dist/telemetry/preload.js"
12
20
  }
13
21
  },
14
22
  "dependencies": {
15
- "@babel/core": "7.24.0",
23
+ "@babel/core": "7.29.6",
16
24
  "@babel/parser": "^7.25.8",
17
25
  "@babel/plugin-proposal-decorators": "^7.28.0",
18
26
  "@babel/plugin-transform-typescript": "7.28.0",
@@ -35,24 +43,25 @@
35
43
  "dd-trace": "^5.57.1",
36
44
  "express": "^4.21.1",
37
45
  "fast-glob": "^3.3.3",
38
- "form-data": "^4.0.5",
46
+ "form-data": "^4.0.6",
39
47
  "fs-extra": "^11.3.0",
40
48
  "jwt-decode": "^4.0.0",
41
49
  "lodash-es": "^4.18.1",
42
50
  "package-manager-detector": "^1.3.0",
51
+ "react-compiler-runtime": "1.0.0",
43
52
  "read-pkg": "^9.0.1",
44
53
  "semver": "^7.5.4",
45
54
  "simple-git": "^3.36.0",
46
55
  "slugify": "^1.6.6",
47
- "vite": "6.4.2",
56
+ "vite": "6.4.3",
48
57
  "vite-tsconfig-paths": "^6.0.4",
49
58
  "winston": "^3.17.0",
50
59
  "yaml": "^2.7.1",
51
- "@superblocksteam/library-shared": "2.0.139-next.1",
52
- "@superblocksteam/shared": "0.9595.4",
53
- "@superblocksteam/vite-plugin-file-sync": "2.0.139-next.1",
54
- "@superblocksteam/util": "2.0.139-next.1",
55
- "@superblocksteam/telemetry": "2.0.139-next.1"
60
+ "@superblocksteam/library-shared": "2.0.140-next.0",
61
+ "@superblocksteam/shared": "0.9597.0",
62
+ "@superblocksteam/telemetry": "2.0.140-next.0",
63
+ "@superblocksteam/util": "2.0.140-next.0",
64
+ "@superblocksteam/vite-plugin-file-sync": "2.0.140-next.0"
56
65
  },
57
66
  "devDependencies": {
58
67
  "@eslint/js": "^9.39.2",
@@ -10,6 +10,7 @@ import { injectIndexVitePlugin } from "@superblocksteam/vite-plugin-file-sync/in
10
10
 
11
11
  import { customComponentsPlugin } from "./dev-utils/custom-build.mjs";
12
12
  import { ddRumPlugin } from "./dev-utils/vite-plugin-dd-rum.mjs";
13
+ import { reactCompilerRuntimeAlias } from "./react-compiler-runtime-shim.mjs";
13
14
  import { getLogger } from "./telemetry/logging.js";
14
15
  import { generateApiBuildManifestPlugin } from "./vite-plugin-generate-api-build-manifest.mjs";
15
16
  import { injectSuperblocksIdsPlugin } from "./vite-plugin-inject-sb-ids-transform.mjs";
@@ -95,12 +96,15 @@ async function buildWithVite({
95
96
 
96
97
  const customFolder = path.join(root, "custom");
97
98
 
99
+ const compilerRuntimeAlias = reactCompilerRuntimeAlias();
100
+
98
101
  await build({
99
102
  root,
100
103
  mode,
101
104
  appType: "spa",
102
105
  clearScreen: true,
103
106
  resolve: {
107
+ alias: compilerRuntimeAlias ? [compilerRuntimeAlias] : [],
104
108
  // Deduplicate these packages to prevent multiple instances in the bundle.
105
109
  // This is critical for React context providers like react-router to work correctly.
106
110
  dedupe: ["react", "react-dom", "react-router"],
@@ -0,0 +1,29 @@
1
+ import { existsSync } from "node:fs";
2
+ import { isAbsolute } from "node:path";
3
+
4
+ import { describe, expect, it } from "vitest";
5
+
6
+ import { buildResolveConfig } from "./dev-server.mjs";
7
+
8
+ describe("buildResolveConfig", () => {
9
+ it("aliases react/compiler-runtime to an existing shim file", () => {
10
+ const config = buildResolveConfig();
11
+ const aliases = config?.alias as unknown as Array<{
12
+ find: string;
13
+ replacement: string;
14
+ }>;
15
+
16
+ const entry = aliases.find((a) => a.find === "react/compiler-runtime");
17
+ expect(entry).toBeDefined();
18
+ expect(isAbsolute(entry!.replacement)).toBe(true);
19
+ expect(existsSync(entry!.replacement)).toBe(true);
20
+ });
21
+
22
+ it("does not alias bare react or react/jsx-runtime", () => {
23
+ const aliases = buildResolveConfig()?.alias as unknown as Array<{
24
+ find: string;
25
+ }>;
26
+ expect(aliases.some((a) => a.find === "react")).toBe(false);
27
+ expect(aliases.some((a) => a.find === "react/jsx-runtime")).toBe(false);
28
+ });
29
+ });
@@ -0,0 +1,32 @@
1
+ import type { Tracer } from "@opentelemetry/api";
2
+ import { describe, expect, it, vi } from "vitest";
3
+
4
+ import type * as TelemetryModule from "../telemetry/index.js";
5
+
6
+ const { firstTracer, getTracerMock, secondTracer } = vi.hoisted(() => ({
7
+ firstTracer: { name: "first-tracer" } as unknown as Tracer,
8
+ getTracerMock: vi.fn(),
9
+ secondTracer: { name: "second-tracer" } as unknown as Tracer,
10
+ }));
11
+
12
+ vi.mock("../telemetry/index.js", async (importOriginal) => {
13
+ const actual = await importOriginal<typeof TelemetryModule>();
14
+
15
+ return {
16
+ ...actual,
17
+ getTracer: getTracerMock,
18
+ };
19
+ });
20
+
21
+ import { getDevServerTracer } from "./dev-server.mjs";
22
+
23
+ describe("getDevServerTracer", () => {
24
+ it("resolves the SDK tracer at call time", () => {
25
+ getTracerMock
26
+ .mockReturnValueOnce(firstTracer)
27
+ .mockReturnValueOnce(secondTracer);
28
+
29
+ expect(getDevServerTracer()).toBe(firstTracer);
30
+ expect(getDevServerTracer()).toBe(secondTracer);
31
+ });
32
+ });
@@ -41,6 +41,7 @@ import type { SyncService } from "@superblocksteam/vite-plugin-file-sync/sync-se
41
41
 
42
42
  import pkg from "../../package.json" with { type: "json" };
43
43
  import { flagOrEnv } from "../flag.js";
44
+ import { reactCompilerRuntimeAlias } from "../react-compiler-runtime-shim.mjs";
44
45
  import type { SuperblocksSdk } from "../sdk.js";
45
46
  import { getTracer } from "../telemetry/index.js";
46
47
  import { getErrorMeta, getLogger } from "../telemetry/logging.js";
@@ -78,9 +79,12 @@ import {
78
79
  import { buildManifestStubPlugin } from "./vite-plugin-build-manifest-stub.mjs";
79
80
  import { ddRumPlugin } from "./vite-plugin-dd-rum.mjs";
80
81
 
81
- const tracer = getTracer();
82
82
  const logger = getLogger();
83
83
 
84
+ export function getDevServerTracer() {
85
+ return getTracer();
86
+ }
87
+
84
88
  /**
85
89
  * Maps a dev-server request URL onto a low-cardinality endpoint label for
86
90
  * metrics. Returns undefined for non-`/_sb_*` URLs (Vite-proxied traffic).
@@ -162,6 +166,20 @@ const OPTIMIZE_DEPS_CONFIG: UserConfig["optimizeDeps"] = {
162
166
  },
163
167
  };
164
168
 
169
+ /**
170
+ * Vite `resolve` config shared by both the activation and pre-warm servers.
171
+ *
172
+ * Applies the `react/compiler-runtime` → shim alias via `reactCompilerRuntimeAlias()`.
173
+ * Must stay identical across both `createServer()` calls — Vite hashes this
174
+ * config into the dep-optimization cache (see OPTIMIZE_DEPS_CONFIG note).
175
+ */
176
+ export function buildResolveConfig(): UserConfig["resolve"] {
177
+ const alias = reactCompilerRuntimeAlias();
178
+ return {
179
+ alias: alias ? [alias] : [],
180
+ };
181
+ }
182
+
165
183
  /**
166
184
  * Builds the Vite plugin list shared by both pre-warm and activation.
167
185
  *
@@ -1449,6 +1467,7 @@ async function startVite({
1449
1467
  dispose: () => void;
1450
1468
  routeIndex: number;
1451
1469
  }> {
1470
+ const tracer = getDevServerTracer();
1452
1471
  return tracer.startActiveSpan("startVite", async (startViteSpan) => {
1453
1472
  try {
1454
1473
  const logger = getLogger(loggerOverride);
@@ -1541,6 +1560,7 @@ async function startVite({
1541
1560
  clearScreen: process.env.SUPERBLOCKS_CLI_ENV !== "local",
1542
1561
  customLogger: viteLogger,
1543
1562
  optimizeDeps: OPTIMIZE_DEPS_CONFIG,
1563
+ resolve: buildResolveConfig(),
1544
1564
  server: {
1545
1565
  middlewareMode: true,
1546
1566
  watch: {
@@ -1638,6 +1658,7 @@ export async function preWarmViteCache(root: string): Promise<void> {
1638
1658
  plugins: vitePlugins(root, { fileSync: fileSyncVitePlugin().plugin }),
1639
1659
  logLevel: "warn",
1640
1660
  optimizeDeps: OPTIMIZE_DEPS_CONFIG,
1661
+ resolve: buildResolveConfig(),
1641
1662
  });
1642
1663
  const depsDir = path.join(root, "node_modules", ".vite", "deps");
1643
1664
  const pollMs = 100;