@superblocksteam/sdk 2.0.83 → 2.0.84-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 (46) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/cli-replacement/automatic-upgrades.d.ts +0 -6
  3. package/dist/cli-replacement/automatic-upgrades.d.ts.map +1 -1
  4. package/dist/cli-replacement/automatic-upgrades.js +5 -27
  5. package/dist/cli-replacement/automatic-upgrades.js.map +1 -1
  6. package/dist/cli-replacement/dev.d.mts.map +1 -1
  7. package/dist/cli-replacement/dev.mjs +260 -217
  8. package/dist/cli-replacement/dev.mjs.map +1 -1
  9. package/dist/cli-replacement/version-detection.d.ts +71 -0
  10. package/dist/cli-replacement/version-detection.d.ts.map +1 -0
  11. package/dist/cli-replacement/version-detection.js +186 -0
  12. package/dist/cli-replacement/version-detection.js.map +1 -0
  13. package/dist/cli-replacement/version-detection.test.d.ts +5 -0
  14. package/dist/cli-replacement/version-detection.test.d.ts.map +1 -0
  15. package/dist/cli-replacement/version-detection.test.js +257 -0
  16. package/dist/cli-replacement/version-detection.test.js.map +1 -0
  17. package/dist/dev-utils/dev-server.mjs +133 -115
  18. package/dist/dev-utils/dev-server.mjs.map +1 -1
  19. package/dist/telemetry/index.d.ts +4 -4
  20. package/dist/telemetry/index.d.ts.map +1 -1
  21. package/dist/telemetry/index.js +92 -64
  22. package/dist/telemetry/index.js.map +1 -1
  23. package/dist/telemetry/index.test.d.ts +2 -0
  24. package/dist/telemetry/index.test.d.ts.map +1 -0
  25. package/dist/telemetry/index.test.js +93 -0
  26. package/dist/telemetry/index.test.js.map +1 -0
  27. package/dist/telemetry/local-obs.d.ts +73 -0
  28. package/dist/telemetry/local-obs.d.ts.map +1 -0
  29. package/dist/telemetry/local-obs.js +107 -0
  30. package/dist/telemetry/local-obs.js.map +1 -0
  31. package/dist/telemetry/util.d.ts +1 -2
  32. package/dist/telemetry/util.d.ts.map +1 -1
  33. package/dist/telemetry/util.js +26 -4
  34. package/dist/telemetry/util.js.map +1 -1
  35. package/package.json +6 -5
  36. package/src/cli-replacement/automatic-upgrades.ts +10 -42
  37. package/src/cli-replacement/dev.mts +336 -281
  38. package/src/cli-replacement/version-detection.test.ts +336 -0
  39. package/src/cli-replacement/version-detection.ts +220 -0
  40. package/src/dev-utils/dev-server.mts +149 -127
  41. package/src/telemetry/index.test.ts +130 -0
  42. package/src/telemetry/index.ts +105 -83
  43. package/src/telemetry/local-obs.ts +138 -0
  44. package/src/telemetry/util.ts +27 -4
  45. package/tsconfig.tsbuildinfo +1 -1
  46. package/turbo.json +20 -2
@@ -536,145 +536,167 @@ async function startVite({
536
536
  dispose: () => void;
537
537
  routeIndex: number;
538
538
  }> {
539
- const logger = getLogger(loggerOverride);
540
- logger.info("Creating dev server...");
541
- const viteLogger = createLogger();
542
- viteLogger.info = (msg: string) => logger.info(msg);
543
- viteLogger.warn = (msg: string) => {
544
- logger.warn(msg);
545
- };
546
- viteLogger.warnOnce = (msg: string) => {
547
- logger.warn(msg);
548
- };
549
- viteLogger.error = (msg: string) => {
550
- logger.error(msg);
551
- };
552
-
553
- viteLogger.clearScreen = () => {};
539
+ return tracer.startActiveSpan("startVite", async (startViteSpan) => {
540
+ try {
541
+ const logger = getLogger(loggerOverride);
542
+ logger.info("Creating dev server...");
543
+ const viteLogger = createLogger();
544
+ viteLogger.info = (msg: string) => logger.info(msg);
545
+ viteLogger.warn = (msg: string) => {
546
+ logger.warn(msg);
547
+ };
548
+ viteLogger.warnOnce = (msg: string) => {
549
+ logger.warn(msg);
550
+ };
551
+ viteLogger.error = (msg: string) => {
552
+ logger.error(msg);
553
+ };
554
554
 
555
- const isCustomBuildEnabled = await isCustomComponentsEnabled();
556
- logger.debug(
557
- `Custom components ${isCustomBuildEnabled ? "enabled" : "disabled"}`,
558
- );
559
- const customFolder = path.join(root, "custom");
560
- const draftsFolder = path.join(root, ".superblocks");
555
+ viteLogger.clearScreen = () => {};
561
556
 
562
- const env = loadEnv(mode, root, "");
557
+ const isCustomBuildEnabled = await isCustomComponentsEnabled();
558
+ logger.debug(
559
+ `Custom components ${isCustomBuildEnabled ? "enabled" : "disabled"}`,
560
+ );
561
+ const customFolder = path.join(root, "custom");
562
+ const draftsFolder = path.join(root, ".superblocks");
563
563
 
564
- const hmrPort = await getFreePort();
565
- logger.debug(`Allocated HMR port: ${hmrPort}`);
564
+ const env = loadEnv(mode, root, "");
566
565
 
567
- const hmrOptions: HmrOptions = {
568
- port: hmrPort,
569
- clientPort: port,
570
- server: httpServer,
571
- overlay: false,
572
- };
566
+ const hmrPort = await getFreePort();
567
+ logger.debug(`Allocated HMR port: ${hmrPort}`);
573
568
 
574
- // https://codesandbox.io/docs/learn/environment/preview-urls#using-environment-variables
575
- if (process.env.CSB_BASE_PREVIEW_HOST) {
576
- const hmrHost = `${os.hostname()}-${port}.${process.env.CSB_BASE_PREVIEW_HOST}`;
577
- hmrOptions.host = hmrHost;
578
- hmrOptions.clientPort = 443; // tells client to use default ssl port
579
- logger.debug(
580
- `CSB environment detected, HMR configured for host: ${hmrHost}`,
581
- );
582
- }
569
+ const hmrOptions: HmrOptions = {
570
+ port: hmrPort,
571
+ clientPort: port,
572
+ server: httpServer,
573
+ overlay: false,
574
+ };
583
575
 
584
- if (process.env.SABS_LIVE_EDIT_HOSTNAME) {
585
- hmrOptions.host = process.env.SABS_LIVE_EDIT_HOSTNAME;
586
- hmrOptions.clientPort = 443; // tells client to use default ssl port
587
- logger.debug(
588
- `SABS environment detected, HMR configured for host: ${hmrOptions.host}`,
589
- );
590
- }
576
+ // https://codesandbox.io/docs/learn/environment/preview-urls#using-environment-variables
577
+ if (process.env.CSB_BASE_PREVIEW_HOST) {
578
+ const hmrHost = `${os.hostname()}-${port}.${process.env.CSB_BASE_PREVIEW_HOST}`;
579
+ hmrOptions.host = hmrHost;
580
+ hmrOptions.clientPort = 443; // tells client to use default ssl port
581
+ logger.debug(
582
+ `CSB environment detected, HMR configured for host: ${hmrHost}`,
583
+ );
584
+ }
591
585
 
592
- const fileSyncPluginCreator = fileSyncVitePlugin(
593
- {
594
- fsOperationQueue,
595
- syncService,
596
- lockService,
597
- aiService,
598
- httpServer,
599
- checkAuthorization,
600
- tracer,
601
- logger,
602
- features,
603
- },
604
- { isCustomBuildEnabled },
605
- );
586
+ if (process.env.SABS_LIVE_EDIT_HOSTNAME) {
587
+ hmrOptions.host = process.env.SABS_LIVE_EDIT_HOSTNAME;
588
+ hmrOptions.clientPort = 443; // tells client to use default ssl port
589
+ logger.debug(
590
+ `SABS environment detected, HMR configured for host: ${hmrOptions.host}`,
591
+ );
592
+ }
606
593
 
607
- logger.debug("Configuring dev server with plugins and options");
608
- const viteServer = await createServer({
609
- root,
610
- mode,
611
- clearScreen: process.env.SUPERBLOCKS_CLI_ENV !== "local",
612
- customLogger: viteLogger,
613
- server: {
614
- middlewareMode: true,
615
- watch: {
616
- ignored: [`${customFolder}/**/*`, `${draftsFolder}/**/*`],
617
- },
618
- hmr: hmrOptions,
619
- cors: {
620
- origin: true,
621
- credentials: true,
622
- },
623
- },
624
- build: {
625
- rollupOptions: {
626
- external: [`${customFolder}/**/*`],
627
- },
628
- },
629
- define: {
630
- // this replaces a string in @superblocksteam/shared
631
- "process.env.SUPERBLOCKS_PUBLIC_INTEGRATIONS_CDN_URL": process.env
632
- .SUPERBLOCKS_PUBLIC_INTEGRATIONS_CDN_URL
633
- ? JSON.stringify(process.env.SUPERBLOCKS_PUBLIC_INTEGRATIONS_CDN_URL)
634
- : "undefined",
635
- },
636
- plugins: [
637
- tsconfigPaths(),
638
- customComponentsPlugin(),
639
- fileSyncPluginCreator.plugin,
640
- // Add a virtual "stub" module for the build manifest
641
- buildManifestStubPlugin(),
642
- react({
643
- babel: {
644
- plugins: [
645
- // We will bring this back later
646
- // "babel-plugin-react-compiler",
647
- [
648
- import.meta.resolve("@babel/plugin-proposal-decorators"),
649
- {
650
- version: "2023-11",
594
+ const fileSyncPluginCreator = fileSyncVitePlugin(
595
+ {
596
+ fsOperationQueue,
597
+ syncService,
598
+ lockService,
599
+ aiService,
600
+ httpServer,
601
+ checkAuthorization,
602
+ tracer,
603
+ logger,
604
+ features,
605
+ },
606
+ { isCustomBuildEnabled },
607
+ );
608
+
609
+ logger.debug("Configuring dev server with plugins and options");
610
+ const viteServer = await tracer.startActiveSpan(
611
+ "viteCreateServer",
612
+ async (viteCreateSpan) => {
613
+ try {
614
+ const server = await createServer({
615
+ root,
616
+ mode,
617
+ clearScreen: process.env.SUPERBLOCKS_CLI_ENV !== "local",
618
+ customLogger: viteLogger,
619
+ server: {
620
+ middlewareMode: true,
621
+ watch: {
622
+ ignored: [`${customFolder}/**/*`, `${draftsFolder}/**/*`],
623
+ },
624
+ hmr: hmrOptions,
625
+ cors: {
626
+ origin: true,
627
+ credentials: true,
628
+ },
629
+ },
630
+ build: {
631
+ rollupOptions: {
632
+ external: [`${customFolder}/**/*`],
633
+ },
651
634
  },
652
- ],
653
- ],
635
+ define: {
636
+ // this replaces a string in @superblocksteam/shared
637
+ "process.env.SUPERBLOCKS_PUBLIC_INTEGRATIONS_CDN_URL": process
638
+ .env.SUPERBLOCKS_PUBLIC_INTEGRATIONS_CDN_URL
639
+ ? JSON.stringify(
640
+ process.env.SUPERBLOCKS_PUBLIC_INTEGRATIONS_CDN_URL,
641
+ )
642
+ : "undefined",
643
+ },
644
+ plugins: [
645
+ tsconfigPaths(),
646
+ customComponentsPlugin(),
647
+ fileSyncPluginCreator.plugin,
648
+ // Add a virtual "stub" module for the build manifest
649
+ buildManifestStubPlugin(),
650
+ react({
651
+ babel: {
652
+ plugins: [
653
+ // We will bring this back later
654
+ // "babel-plugin-react-compiler",
655
+ [
656
+ import.meta
657
+ .resolve("@babel/plugin-proposal-decorators"),
658
+ {
659
+ version: "2023-11",
660
+ },
661
+ ],
662
+ ],
663
+ },
664
+ }),
665
+ createLucideReactImportOptimizer(),
666
+ ddRumPlugin({
667
+ clientToken: env.SUPERBLOCKS_LIBRARY_DD_CLIENT_TOKEN ?? "",
668
+ applicationId:
669
+ env.SUPERBLOCKS_LIBRARY_DD_APPLICATION_ID ?? "",
670
+ env: env.SUPERBLOCKS_LIBRARY_ENV ?? "prod",
671
+ // TODO: This version refers to the LIBRARY version for Datadog RUM, not the CLI version.
672
+ // CLI auto-upgrade still works - the caching changes in this PR only affect detection speed.
673
+ // Replace with dynamic library version injection once available.
674
+ version: "1.0.0",
675
+ }),
676
+ ],
677
+ });
678
+ return server;
679
+ } finally {
680
+ viteCreateSpan.end();
681
+ }
654
682
  },
655
- }),
656
- createLucideReactImportOptimizer(),
657
- ddRumPlugin({
658
- clientToken: env.SUPERBLOCKS_LIBRARY_DD_CLIENT_TOKEN ?? "",
659
- applicationId: env.SUPERBLOCKS_LIBRARY_DD_APPLICATION_ID ?? "",
660
- env: env.SUPERBLOCKS_LIBRARY_ENV ?? "prod",
661
- // TODO: Version should be injected from the library. Replace once we have the autoupgrade feature.
662
- version: "1.0.0",
663
- }),
664
- ],
665
- });
683
+ );
666
684
 
667
- const routeIndex = (app._router as IRouter).stack.length;
668
- app.use(viteServer.middlewares);
669
- logger.info("Dev server created and middleware attached successfully");
685
+ const routeIndex = (app._router as IRouter).stack.length;
686
+ app.use(viteServer.middlewares);
687
+ logger.info("Dev server created and middleware attached successfully");
670
688
 
671
- return {
672
- viteServer,
673
- routeIndex,
674
- dispose: () => {
675
- fileSyncPluginCreator.dispose();
676
- },
677
- };
689
+ return {
690
+ viteServer,
691
+ routeIndex,
692
+ dispose: () => {
693
+ fileSyncPluginCreator.dispose();
694
+ },
695
+ };
696
+ } finally {
697
+ startViteSpan.end();
698
+ }
699
+ });
678
700
  }
679
701
 
680
702
  const DEFAULT_HMR_PORT = 24678;
@@ -0,0 +1,130 @@
1
+ import {
2
+ describe,
3
+ it,
4
+ expect,
5
+ vi,
6
+ beforeAll,
7
+ afterAll,
8
+ beforeEach,
9
+ } from "vitest";
10
+
11
+ // Set environment variables before any imports
12
+ process.env.OTEL_SDK_DISABLED = "true";
13
+ process.env.SUPERBLOCKS_DEPLOYMENT_TYPE = "";
14
+
15
+ // Mock dd-trace before importing the module under test
16
+ vi.mock("dd-trace", () => ({
17
+ default: {
18
+ init: vi.fn(),
19
+ llmobs: { enabled: false },
20
+ },
21
+ }));
22
+
23
+ // Mock getConfiguration to avoid needing real credentials
24
+ vi.mock("./util.js", () => ({
25
+ SERVICE_NAME: "sdk-dev-server",
26
+ getConfiguration: vi.fn().mockResolvedValue({
27
+ superblocksBaseUrl: new URL("https://app.superblocks.com"),
28
+ otlpBaseUrl: "https://app.superblocks.com/api",
29
+ superblocksHostname: "app.superblocks.com",
30
+ serviceName: "sdk-dev-server",
31
+ token: "test1234",
32
+ }),
33
+ }));
34
+
35
+ // Mock the logging module
36
+ vi.mock("./logging.js", () => ({
37
+ getLogger: vi.fn().mockReturnValue({
38
+ info: vi.fn(),
39
+ debug: vi.fn(),
40
+ warn: vi.fn(),
41
+ error: vi.fn(),
42
+ }),
43
+ }));
44
+
45
+ // Import type for module shape
46
+ import type * as TelemetryModule from "./index.js";
47
+
48
+ describe("CLI SDK Telemetry Integration", () => {
49
+ let telemetryModule: typeof TelemetryModule;
50
+
51
+ beforeAll(async () => {
52
+ // Dynamic import after mocks are set up
53
+ telemetryModule = await import("./index.js");
54
+ });
55
+
56
+ afterAll(async () => {
57
+ // Clean up telemetry
58
+ const { resetTelemetry, isTelemetryInitialized, getTelemetryInstance } =
59
+ await import("@superblocksteam/telemetry");
60
+ if (isTelemetryInitialized()) {
61
+ await getTelemetryInstance().shutdown();
62
+ resetTelemetry();
63
+ }
64
+ });
65
+
66
+ beforeEach(() => {
67
+ vi.clearAllMocks();
68
+ });
69
+
70
+ describe("configureTelemetry", () => {
71
+ it("successfully initializes telemetry", async () => {
72
+ const { isTelemetryInitialized } =
73
+ await import("@superblocksteam/telemetry");
74
+
75
+ await telemetryModule.configureTelemetry();
76
+
77
+ expect(isTelemetryInitialized()).toBe(true);
78
+ });
79
+
80
+ it("initializes dd-trace for LLMObs", async () => {
81
+ const ddTrace = await import("dd-trace");
82
+
83
+ await telemetryModule.configureTelemetry();
84
+
85
+ expect(ddTrace.default.init).toHaveBeenCalled();
86
+ });
87
+ });
88
+
89
+ describe("getTracer", () => {
90
+ it("returns working tracer after initialization", async () => {
91
+ await telemetryModule.configureTelemetry();
92
+
93
+ const tracer = telemetryModule.getTracer();
94
+
95
+ expect(tracer).toBeDefined();
96
+ expect(typeof tracer.startSpan).toBe("function");
97
+ });
98
+
99
+ it("can create spans", async () => {
100
+ await telemetryModule.configureTelemetry();
101
+ const tracer = telemetryModule.getTracer();
102
+
103
+ const span = tracer.startSpan("test-span");
104
+
105
+ expect(span).toBeDefined();
106
+ span.end();
107
+ });
108
+ });
109
+
110
+ describe("getLogger", () => {
111
+ it("returns working logger after initialization", async () => {
112
+ await telemetryModule.configureTelemetry();
113
+
114
+ const logger = telemetryModule.getLogger();
115
+
116
+ expect(logger).toBeDefined();
117
+ expect(typeof logger.emit).toBe("function");
118
+ });
119
+ });
120
+
121
+ describe("deploymentType", () => {
122
+ it("exports deploymentType constant", () => {
123
+ expect(telemetryModule.deploymentType).toBeDefined();
124
+ });
125
+
126
+ it("exports isCloudPrem constant", () => {
127
+ expect(typeof telemetryModule.isCloudPrem).toBe("boolean");
128
+ });
129
+ });
130
+ });