@superblocksteam/sdk 2.0.6 → 2.0.7

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 (57) hide show
  1. package/dist/application-build.mjs +6 -2
  2. package/dist/application-build.mjs.map +1 -1
  3. package/dist/cli-replacement/automatic-upgrades.d.ts +5 -2
  4. package/dist/cli-replacement/automatic-upgrades.d.ts.map +1 -1
  5. package/dist/cli-replacement/automatic-upgrades.js +221 -93
  6. package/dist/cli-replacement/automatic-upgrades.js.map +1 -1
  7. package/dist/cli-replacement/dev.d.mts +1 -2
  8. package/dist/cli-replacement/dev.d.mts.map +1 -1
  9. package/dist/cli-replacement/dev.mjs +57 -32
  10. package/dist/cli-replacement/dev.mjs.map +1 -1
  11. package/dist/client.d.ts +34 -0
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +92 -1
  14. package/dist/client.js.map +1 -1
  15. package/dist/dev-utils/dev-logger.d.mts +17 -7
  16. package/dist/dev-utils/dev-logger.d.mts.map +1 -1
  17. package/dist/dev-utils/dev-logger.mjs +50 -9
  18. package/dist/dev-utils/dev-logger.mjs.map +1 -1
  19. package/dist/dev-utils/dev-server.d.mts.map +1 -1
  20. package/dist/dev-utils/dev-server.mjs +8 -12
  21. package/dist/dev-utils/dev-server.mjs.map +1 -1
  22. package/dist/dev-utils/dev-tracer.d.ts +2 -0
  23. package/dist/dev-utils/dev-tracer.d.ts.map +1 -1
  24. package/dist/dev-utils/dev-tracer.js +42 -35
  25. package/dist/dev-utils/dev-tracer.js.map +1 -1
  26. package/dist/dev-utils/vite-plugin-build-manifest-stub.d.mts +10 -0
  27. package/dist/dev-utils/vite-plugin-build-manifest-stub.d.mts.map +1 -0
  28. package/dist/dev-utils/vite-plugin-build-manifest-stub.mjs +27 -0
  29. package/dist/dev-utils/vite-plugin-build-manifest-stub.mjs.map +1 -0
  30. package/dist/dev-utils/vite-plugin-sb-cdn.d.mts.map +1 -1
  31. package/dist/dev-utils/vite-plugin-sb-cdn.mjs +13 -3
  32. package/dist/dev-utils/vite-plugin-sb-cdn.mjs.map +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/vite-plugin-generate-build-manifest.d.mts +21 -0
  38. package/dist/vite-plugin-generate-build-manifest.d.mts.map +1 -0
  39. package/dist/vite-plugin-generate-build-manifest.mjs +130 -0
  40. package/dist/vite-plugin-generate-build-manifest.mjs.map +1 -0
  41. package/dist/vite-plugin-inject-sb-ids-transform.mjs +1 -1
  42. package/dist/vite-plugin-inject-sb-ids-transform.mjs.map +1 -1
  43. package/package.json +6 -4
  44. package/src/application-build.mts +6 -3
  45. package/src/cli-replacement/automatic-upgrades.ts +278 -113
  46. package/src/cli-replacement/dev.mts +77 -43
  47. package/src/client.ts +115 -0
  48. package/src/dev-utils/dev-logger.mts +94 -20
  49. package/src/dev-utils/dev-server.mts +10 -12
  50. package/src/dev-utils/dev-tracer.ts +48 -37
  51. package/src/dev-utils/vite-plugin-build-manifest-stub.mts +30 -0
  52. package/src/dev-utils/vite-plugin-sb-cdn.mts +14 -3
  53. package/src/index.ts +4 -0
  54. package/src/vite-plugin-generate-build-manifest.mts +192 -0
  55. package/src/vite-plugin-inject-sb-ids-transform.mts +1 -1
  56. package/test/clients.test.mts +120 -0
  57. package/tsconfig.tsbuildinfo +1 -1
@@ -1,11 +1,13 @@
1
1
  import * as child_process from "node:child_process";
2
2
  import { promisify } from "node:util";
3
3
  import { isNativeError } from "node:util/types";
4
+ import { traceFunction } from "@superblocksteam/shared";
4
5
  import { resolveCommand, type DetectResult } from "package-manager-detector";
5
6
  import { detect } from "package-manager-detector/detect";
6
7
  import gt from "semver/functions/gt.js";
7
8
  import valid from "semver/functions/valid.js";
8
- import { getLogger } from "../dev-utils/dev-logger.mjs";
9
+ import { getErrorMeta, getLogger } from "../dev-utils/dev-logger.mjs";
10
+ import tracer from "../dev-utils/dev-tracer.js";
9
11
  import type { ResponseMeta } from "../socket/handlers.js";
10
12
  import type { ApplicationConfig } from "../types/common.js";
11
13
  import type { LockService } from "@superblocksteam/vite-plugin-file-sync/lock-service";
@@ -55,7 +57,7 @@ async function getRemoteVersions(
55
57
  return data.data;
56
58
  } else {
57
59
  const error = (await response.json()) as CheckVersionsErrorResponse;
58
- console.log(
60
+ logger.error(
59
61
  `Could not get latest CLI version: ${error.responseMeta.message}`,
60
62
  );
61
63
  }
@@ -68,7 +70,9 @@ async function getRemoteVersions(
68
70
  }
69
71
  }
70
72
 
71
- export async function getCurrentCliVersion(): Promise<string | undefined> {
73
+ export async function getCurrentCliVersion(): Promise<
74
+ PackageVersionInfo | undefined
75
+ > {
72
76
  try {
73
77
  const command = process.platform === "win32" ? "where" : "which";
74
78
  const { stdout } = await exec(`${command} superblocks`);
@@ -85,7 +89,16 @@ export async function getCurrentCliVersion(): Promise<string | undefined> {
85
89
  /@superblocksteam\/cli(-ephemeral)?\//,
86
90
  "",
87
91
  );
88
- return version;
92
+
93
+ const aliasMatch = json.cliVersion?.match(/@superblocksteam\/([^\/]+)/);
94
+ if (aliasMatch && aliasMatch[1] !== "cli") {
95
+ return {
96
+ version: version,
97
+ alias: `@superblocksteam/${aliasMatch[1]}`,
98
+ };
99
+ }
100
+
101
+ return { version };
89
102
  } catch (error) {
90
103
  if (isNativeError(error)) {
91
104
  logger.error(`Error getting CLI version: ${error.message}`);
@@ -104,16 +117,16 @@ export async function getCurrentLibraryVersion(
104
117
  case "pnpm":
105
118
  return await getPnpmLibraryVersion();
106
119
  default:
107
- console.error(
120
+ logger.error(
108
121
  `${pm.agent} is currently not supported for automatic upgrades.`,
109
122
  );
110
123
  return undefined;
111
124
  }
112
125
  } catch (error) {
113
- console.error(
126
+ logger.error(
114
127
  "Could not resolve current library version. Skipping automatic upgrade.",
128
+ getErrorMeta(error),
115
129
  );
116
- console.error(error);
117
130
  return undefined;
118
131
  }
119
132
  }
@@ -200,10 +213,10 @@ async function upgradeCliWithOclif(targetVersion: string): Promise<boolean> {
200
213
 
201
214
  if (!superblocksPath) return false;
202
215
 
203
- const { stdout: updateOutput } = await exec(
216
+ const { stdout: updateOutput, stderr: updateErrorOutput } = await exec(
204
217
  `${superblocksPath} update --version=${targetVersion}`,
205
218
  );
206
- return !updateOutput.includes("not updatable");
219
+ return !(updateOutput + updateErrorOutput).includes("not updatable");
207
220
  } catch (error) {
208
221
  if (isNativeError(error)) {
209
222
  logger.error(`Error checking CLI updatability: ${error.message}`);
@@ -216,21 +229,70 @@ async function upgradePackageWithPackageManager(
216
229
  pm: DetectResult,
217
230
  packageName: string,
218
231
  targetVersion: string,
219
- alias?: string,
232
+ {
233
+ alias,
234
+ global,
235
+ }: {
236
+ alias?: string;
237
+ global?: boolean;
238
+ },
220
239
  ): Promise<void> {
221
240
  const packageSpec = alias
222
241
  ? `@superblocksteam/${packageName}@npm:${alias}@${targetVersion}`
223
242
  : `@superblocksteam/${packageName}@${targetVersion}`;
224
243
 
225
- const installCommand = resolveCommand(pm.agent, "install", [packageSpec]);
244
+ // --prefer-offline will skip some staleness checks that are slow
245
+ const installArgs = [packageSpec, "--fund=false"];
246
+ if (pm.agent === "npm") {
247
+ installArgs.push("--audit=false");
248
+ }
249
+ if (packageName === "cli") {
250
+ installArgs.push("--force");
251
+ }
252
+
253
+ const installCommand = resolveCommand(
254
+ pm.agent,
255
+ global ? "global" : "install",
256
+ installArgs,
257
+ );
226
258
 
227
259
  if (!installCommand) {
228
- console.error("Could not determine how to upgrade Superblocks packages.");
260
+ logger.error("Could not determine how to upgrade Superblocks packages.");
229
261
  return;
230
262
  }
231
263
 
232
264
  const { command, args } = installCommand;
233
- await exec(`${command} ${args.join(" ")}`);
265
+ logger.info(
266
+ `Running ${command} ${args.join(" ")} to upgrade ${packageName}...`,
267
+ );
268
+ let resolver: (value: void | PromiseLike<void>) => void;
269
+ let rejecter: (reason?: any) => void;
270
+ const promise = new Promise<void>((resolve, reject) => {
271
+ resolver = resolve;
272
+ rejecter = reject;
273
+ });
274
+ const cp = child_process.exec(
275
+ `${command} ${args.join(" ")}`,
276
+ {
277
+ cwd: process.cwd(),
278
+ },
279
+ (error) => {
280
+ if (error) {
281
+ logger.error(`Failed to upgrade ${packageName} to ${targetVersion}`);
282
+ rejecter(error);
283
+ } else {
284
+ logger.info(`Successfully upgraded ${packageName} to ${targetVersion}`);
285
+ resolver();
286
+ }
287
+ },
288
+ );
289
+ cp.stdout?.on("data", (data) => {
290
+ logger.info(data);
291
+ });
292
+ cp.stderr?.on("data", (data) => {
293
+ logger.warn(data);
294
+ });
295
+ return promise;
234
296
  }
235
297
 
236
298
  export async function getCurrentLibraryVersionWithoutPM(): Promise<
@@ -255,109 +317,212 @@ export async function getCurrentLibraryVersionWithoutPM(): Promise<
255
317
  export async function checkVersionsAndUpgrade(
256
318
  lockService: LockService,
257
319
  config?: ApplicationConfig,
258
- ) {
259
- // Detect package manager
260
- const pm = await detect({
261
- strategies: [
262
- "packageManager-field",
263
- "lockfile",
264
- "install-metadata",
265
- "devEngines-field",
266
- ],
267
- cwd: process.cwd(),
268
- });
269
-
270
- if (!pm || !config?.id) return;
271
-
272
- // Get current versions
273
- const currentCliVersion = await getCurrentCliVersion();
274
- const currentLibraryInfo = await getCurrentLibraryVersion(pm);
275
-
276
- // Skip if we're in local development
277
- if (
278
- !currentCliVersion ||
279
- !valid(currentCliVersion) ||
280
- currentCliVersion.startsWith("file:") ||
281
- currentCliVersion.startsWith("link:") ||
282
- !currentLibraryInfo ||
283
- !valid(currentLibraryInfo.version) ||
284
- currentLibraryInfo.version.startsWith("file:") ||
285
- currentLibraryInfo.version.startsWith("link:")
286
- ) {
287
- return;
288
- }
320
+ ): Promise<{
321
+ cliUpdated: boolean;
322
+ libraryUpdated: boolean;
323
+ }> {
324
+ const cliUpdated = false;
325
+ const libraryUpdated = false;
326
+ let hasFailedToUpgrade = false;
327
+
328
+ logger.info("Checking versions");
329
+
330
+ await traceFunction({
331
+ name: "checkVersionsAndUpgrade",
332
+ tracer,
333
+ fn: async () => {
334
+ // Detect package manager
335
+ const pm = await traceFunction({
336
+ name: "detectPackageManager",
337
+ tracer,
338
+ fn: async () => {
339
+ return await detect({
340
+ strategies: [
341
+ "packageManager-field",
342
+ "lockfile",
343
+ "install-metadata",
344
+ "devEngines-field",
345
+ ],
346
+ cwd: process.cwd(),
347
+ });
348
+ },
349
+ });
350
+
351
+ if (!pm || !config?.id) return;
352
+
353
+ // Get current versions
354
+ const currentCliInfo = await traceFunction({
355
+ name: "getCurrentCliVersion",
356
+ tracer,
357
+ fn: async () => {
358
+ return await getCurrentCliVersion();
359
+ },
360
+ });
361
+ const currentLibraryInfo = await traceFunction({
362
+ name: "getCurrentLibraryVersion",
363
+ tracer,
364
+ fn: async () => {
365
+ return await getCurrentLibraryVersion(pm);
366
+ },
367
+ });
368
+
369
+ // Skip if we're in local development
370
+ if (
371
+ !currentCliInfo ||
372
+ !valid(currentCliInfo.version) ||
373
+ currentCliInfo.version.startsWith("file:") ||
374
+ currentCliInfo.version.startsWith("link:") ||
375
+ !currentLibraryInfo ||
376
+ !valid(currentLibraryInfo.version) ||
377
+ currentLibraryInfo.version.startsWith("file:") ||
378
+ currentLibraryInfo.version.startsWith("link:")
379
+ ) {
380
+ return;
381
+ }
382
+
383
+ // Get target versions from server
384
+ const targetVersions = await traceFunction({
385
+ name: "getRemoteVersions",
386
+ tracer,
387
+ fn: async () => {
388
+ return await getRemoteVersions(config);
389
+ },
390
+ });
391
+ if (!targetVersions) return;
392
+
393
+ let cliNeedsUpgrade: boolean | string;
394
+ let libraryNeedsUpgrade: boolean | string;
395
+ try {
396
+ // If version is latest, then semver can throw an error
397
+ // Check if CLI needs upgrade
398
+ cliNeedsUpgrade =
399
+ targetVersions.cli && gt(targetVersions.cli, currentCliInfo.version);
400
+
401
+ // Check if library needs upgrade
402
+ libraryNeedsUpgrade =
403
+ targetVersions.library &&
404
+ gt(targetVersions.library, currentLibraryInfo.version);
405
+ } catch (error) {
406
+ logger.error(
407
+ "Error checking versions to upgrade, releasing lock and exiting",
408
+ getErrorMeta(error),
409
+ );
410
+ await traceFunction({
411
+ name: "shutdownLockService",
412
+ tracer,
413
+ fn: async () => {
414
+ await lockService.shutdown({
415
+ serverInitiated: false,
416
+ });
417
+ },
418
+ });
419
+ hasFailedToUpgrade = true;
420
+ return;
421
+ }
422
+
423
+ if (!cliNeedsUpgrade && !libraryNeedsUpgrade) {
424
+ return; // Everything is up to date
425
+ }
426
+
427
+ let cliUpdated = false;
428
+ let libraryUpdated = false;
429
+
430
+ try {
431
+ const upgradePromises = [];
432
+
433
+ if (cliNeedsUpgrade) {
434
+ const cliUpgradePromise = traceFunction({
435
+ name: "upgradeCli",
436
+ tracer,
437
+ fn: async () => {
438
+ logger.info(
439
+ `Beginning CLI upgrade from ${currentCliInfo.version} to ${targetVersions.cli}`,
440
+ );
441
+ const oclifUpgradeSucceeded = await traceFunction({
442
+ name: "upgradeCliWithOclif",
443
+ tracer,
444
+ fn: async () => {
445
+ return await upgradeCliWithOclif(targetVersions.cli);
446
+ },
447
+ });
448
+ if (!oclifUpgradeSucceeded) {
449
+ logger.info(`Falling back to package manager upgrade for CLI`);
450
+ // Fall back to package manager upgrade
451
+ await traceFunction({
452
+ name: "upgradePackageWithPackageManager - cli",
453
+ tracer,
454
+ fn: async () => {
455
+ await upgradePackageWithPackageManager(
456
+ pm,
457
+ "cli",
458
+ targetVersions.cli,
459
+ {
460
+ alias: currentCliInfo.alias,
461
+ global: true,
462
+ },
463
+ );
464
+ },
465
+ });
466
+ cliUpdated = true;
467
+ }
468
+ },
469
+ });
470
+ upgradePromises.push(cliUpgradePromise);
471
+ }
472
+
473
+ if (libraryNeedsUpgrade) {
474
+ const libraryUpgradePromise = traceFunction({
475
+ name: "upgradePackageWithPackageManager - library",
476
+ tracer,
477
+ fn: async () => {
478
+ logger.info(
479
+ `Beginning library upgrade from ${currentLibraryInfo.version} to ${targetVersions.library}`,
480
+ );
481
+ await upgradePackageWithPackageManager(
482
+ pm,
483
+ "library",
484
+ targetVersions.library,
485
+ {
486
+ alias: currentLibraryInfo.alias,
487
+ global: false,
488
+ },
489
+ );
490
+ libraryUpdated = true;
491
+ },
492
+ });
493
+ upgradePromises.push(libraryUpgradePromise);
494
+ }
495
+ await Promise.all(upgradePromises);
496
+ } catch (error) {
497
+ logger.error(
498
+ "Error upgrading packages, releasing lock and exiting",
499
+ getErrorMeta(error),
500
+ );
501
+ hasFailedToUpgrade = true;
502
+ }
289
503
 
290
- // Get target versions from server
291
- const targetVersions = await getRemoteVersions(config);
292
- if (!targetVersions) return;
504
+ // Log what was updated
505
+ if (cliUpdated && libraryUpdated) {
506
+ logger.info(
507
+ "@superblocksteam/cli and @superblocksteam/library have been updated.",
508
+ );
509
+ } else if (cliUpdated) {
510
+ logger.info("@superblocksteam/cli has been updated.");
511
+ } else if (libraryUpdated) {
512
+ logger.info("@superblocksteam/library has been updated.");
513
+ } else {
514
+ logger.info("No upgrades needed");
515
+ }
516
+ },
517
+ });
293
518
 
294
- let cliNeedsUpgrade: boolean | string;
295
- let libraryNeedsUpgrade: boolean | string;
296
- try {
297
- // If version is latest, then semver can throw an error
298
- // Check if CLI needs upgrade
299
- cliNeedsUpgrade =
300
- targetVersions.cli && gt(targetVersions.cli, currentCliVersion);
301
-
302
- // Check if library needs upgrade
303
- libraryNeedsUpgrade =
304
- targetVersions.library &&
305
- gt(targetVersions.library, currentLibraryInfo.version);
306
- } catch (error) {
307
- console.warn(
308
- "Error checking versions to upgrade, releasing lock and exiting",
309
- error,
310
- );
311
- await lockService.shutdown({
312
- serverInitiated: false,
313
- });
519
+ // Restart CLI if anything was updated
520
+ if (hasFailedToUpgrade) {
314
521
  process.exit(1);
315
522
  }
316
523
 
317
- if (!cliNeedsUpgrade && !libraryNeedsUpgrade) {
318
- return; // Everything is up to date
319
- }
320
-
321
- let cliUpdated = false;
322
- let libraryUpdated = false;
323
-
324
- // Upgrade CLI if needed
325
- if (cliNeedsUpgrade) {
326
- const oclifUpgradeSucceeded = await upgradeCliWithOclif(targetVersions.cli);
327
-
328
- if (!oclifUpgradeSucceeded) {
329
- // Fall back to package manager upgrade
330
- await upgradePackageWithPackageManager(pm, "cli", targetVersions.cli);
331
- cliUpdated = true;
332
- }
333
- }
334
-
335
- // Upgrade library if needed
336
- if (libraryNeedsUpgrade) {
337
- await upgradePackageWithPackageManager(
338
- pm,
339
- "library",
340
- targetVersions.library,
341
- currentLibraryInfo.alias,
342
- );
343
- libraryUpdated = true;
344
- }
345
-
346
- // Log what was updated
347
- if (cliUpdated && libraryUpdated) {
348
- logger.info(
349
- "@superblocksteam/cli and @superblocksteam/library have been updated.",
350
- );
351
- } else if (cliUpdated) {
352
- logger.info("@superblocksteam/cli has been updated.");
353
- } else if (libraryUpdated) {
354
- logger.info("@superblocksteam/library has been updated.");
355
- }
356
-
357
- // Restart CLI if anything was updated
358
- if (cliUpdated || libraryUpdated) {
359
- logger.info("Restarting the CLI…");
360
- await lockService.releaseLock();
361
- process.exit(AUTO_UPGRADE_EXIT_CODE);
362
- }
524
+ return {
525
+ cliUpdated,
526
+ libraryUpdated,
527
+ };
363
528
  }