@superblocksteam/sdk 2.0.93 → 2.0.94-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 (88) 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 +2 -0
  4. package/dist/application-build.mjs.map +1 -1
  5. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.d.ts +5 -0
  6. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.d.ts.map +1 -0
  7. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.js +61 -0
  8. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.js.map +1 -0
  9. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.d.ts +2 -0
  10. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.d.ts.map +1 -0
  11. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.js +32 -0
  12. package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.js.map +1 -0
  13. package/dist/cli-replacement/dev.d.mts.map +1 -1
  14. package/dist/cli-replacement/dev.mjs +350 -16
  15. package/dist/cli-replacement/dev.mjs.map +1 -1
  16. package/dist/client-sync.test.d.mts +2 -0
  17. package/dist/client-sync.test.d.mts.map +1 -0
  18. package/dist/client-sync.test.mjs +57 -0
  19. package/dist/client-sync.test.mjs.map +1 -0
  20. package/dist/client.d.ts +22 -0
  21. package/dist/client.d.ts.map +1 -1
  22. package/dist/client.js +50 -0
  23. package/dist/client.js.map +1 -1
  24. package/dist/collect-sdk-apis.d.mts +18 -0
  25. package/dist/collect-sdk-apis.d.mts.map +1 -0
  26. package/dist/collect-sdk-apis.mjs +26 -0
  27. package/dist/collect-sdk-apis.mjs.map +1 -0
  28. package/dist/collect-sdk-apis.test.d.mts +2 -0
  29. package/dist/collect-sdk-apis.test.d.mts.map +1 -0
  30. package/dist/collect-sdk-apis.test.mjs +72 -0
  31. package/dist/collect-sdk-apis.test.mjs.map +1 -0
  32. package/dist/dbfs/client.d.ts +1 -0
  33. package/dist/dbfs/client.d.ts.map +1 -1
  34. package/dist/dbfs/client.js +12 -0
  35. package/dist/dbfs/client.js.map +1 -1
  36. package/dist/dev-utils/dev-server.d.mts +4 -1
  37. package/dist/dev-utils/dev-server.d.mts.map +1 -1
  38. package/dist/dev-utils/dev-server.mjs +14 -6
  39. package/dist/dev-utils/dev-server.mjs.map +1 -1
  40. package/dist/dev-utils/vite-plugin-build-manifest-stub.mjs +1 -1
  41. package/dist/dev-utils/vite-plugin-build-manifest-stub.mjs.map +1 -1
  42. package/dist/parse-sdk-registry.d.mts +20 -0
  43. package/dist/parse-sdk-registry.d.mts.map +1 -0
  44. package/dist/parse-sdk-registry.mjs +161 -0
  45. package/dist/parse-sdk-registry.mjs.map +1 -0
  46. package/dist/parse-sdk-registry.test.d.mts +2 -0
  47. package/dist/parse-sdk-registry.test.d.mts.map +1 -0
  48. package/dist/parse-sdk-registry.test.mjs +83 -0
  49. package/dist/parse-sdk-registry.test.mjs.map +1 -0
  50. package/dist/sdk.d.ts +10 -1
  51. package/dist/sdk.d.ts.map +1 -1
  52. package/dist/sdk.js +14 -2
  53. package/dist/sdk.js.map +1 -1
  54. package/dist/vite-plugin-generate-api-build-manifest.d.mts.map +1 -1
  55. package/dist/vite-plugin-generate-api-build-manifest.mjs +13 -1
  56. package/dist/vite-plugin-generate-api-build-manifest.mjs.map +1 -1
  57. package/dist/vite-plugin-sdk-api-entry-point.d.mts +10 -0
  58. package/dist/vite-plugin-sdk-api-entry-point.d.mts.map +1 -0
  59. package/dist/vite-plugin-sdk-api-entry-point.mjs +63 -0
  60. package/dist/vite-plugin-sdk-api-entry-point.mjs.map +1 -0
  61. package/dist/vite-plugin-sdk-api-entry-point.test.d.mts +2 -0
  62. package/dist/vite-plugin-sdk-api-entry-point.test.d.mts.map +1 -0
  63. package/dist/vite-plugin-sdk-api-entry-point.test.mjs +166 -0
  64. package/dist/vite-plugin-sdk-api-entry-point.test.mjs.map +1 -0
  65. package/eslint.config.js +1 -1
  66. package/lint-staged.config.mjs +2 -1
  67. package/package.json +19 -21
  68. package/src/application-build.mts +2 -0
  69. package/src/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.ts +60 -0
  70. package/src/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.ts +70 -0
  71. package/src/cli-replacement/dev.mts +528 -18
  72. package/src/client-sync.test.mts +66 -0
  73. package/src/client.ts +102 -0
  74. package/src/collect-sdk-apis.mts +43 -0
  75. package/src/collect-sdk-apis.test.mts +91 -0
  76. package/src/dbfs/client.ts +16 -0
  77. package/src/dev-utils/dev-server.mts +25 -4
  78. package/src/dev-utils/vite-plugin-build-manifest-stub.mts +1 -1
  79. package/src/parse-sdk-registry.mts +227 -0
  80. package/src/parse-sdk-registry.test.mts +133 -0
  81. package/src/sdk.ts +52 -0
  82. package/src/vite-plugin-generate-api-build-manifest.mts +17 -1
  83. package/src/vite-plugin-sdk-api-entry-point.mts +76 -0
  84. package/src/vite-plugin-sdk-api-entry-point.test.mts +266 -0
  85. package/tsconfig.json +2 -2
  86. package/tsconfig.tsbuildinfo +1 -1
  87. package/turbo.json +3 -8
  88. package/.prettierrc +0 -18
@@ -1,4 +1,5 @@
1
1
  import path from "node:path";
2
+ import { isSdkApiTemplate } from "@superblocksteam/shared";
2
3
  import { resolveLanguageSpecificStepContentFromBlocks } from "@superblocksteam/util";
3
4
  import { getPageName, getScopeIdFromName, } from "@superblocksteam/vite-plugin-file-sync";
4
5
  import { yellow, red } from "colorette";
@@ -6,6 +7,7 @@ import fg from "fast-glob";
6
7
  import fs from "fs-extra";
7
8
  import { createLogger } from "vite";
8
9
  import yaml from "yaml";
10
+ import { collectSdkApisFromRegistry } from "./collect-sdk-apis.mjs";
9
11
  import { getLogger } from "./telemetry/logging.js";
10
12
  /**
11
13
  * Vite plugin that generates a build manifest for the application.
@@ -37,13 +39,16 @@ export function generateApiBuildManifestPlugin(root) {
37
39
  logger.error(red(msg));
38
40
  };
39
41
  viteLogger.clearScreen = () => { };
42
+ const sdkApiEnabled = isSdkApiTemplate(process.env.SUPERBLOCKS_APP_TEMPLATE_NAME);
40
43
  const apiFiles = {};
41
- let buildManifest = { apis: {}, apiDependencies: [] };
44
+ let buildManifest = { apis: {}, apiDependencies: [], sdkApis: {} };
42
45
  return {
43
46
  name: "sb-generate-build-manifest",
44
47
  apply: "build",
45
48
  enforce: "pre",
46
49
  async buildStart() {
50
+ if (sdkApiEnabled)
51
+ return;
47
52
  const apiDocuments = await fg(["**/api.yaml", "**/api.yml"], {
48
53
  cwd: root,
49
54
  });
@@ -65,9 +70,16 @@ export function generateApiBuildManifestPlugin(root) {
65
70
  };
66
71
  return acc;
67
72
  }, {});
73
+ const sdkApis = sdkApiEnabled
74
+ ? await collectSdkApisFromRegistry(root, {
75
+ pathExists: (p) => fs.pathExists(p),
76
+ readFile: (p, enc) => fs.readFile(p, enc),
77
+ })
78
+ : {};
68
79
  buildManifest = {
69
80
  apis: allApis,
70
81
  apiDependencies: [],
82
+ sdkApis,
71
83
  };
72
84
  // Find the existing hashed build-manifest file in the bundle and replace its content
73
85
  for (const [fileName, chunk] of Object.entries(bundle)) {
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin-generate-api-build-manifest.mjs","sourceRoot":"","sources":["../src/vite-plugin-generate-api-build-manifest.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vite-plugin-generate-api-build-manifest.mjs","sourceRoot":"","sources":["../src/vite-plugin-generate-api-build-manifest.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Plugin } from "vite";
2
+ /**
3
+ * Vite plugin that prepends `__setEntryPoint(relativePath)` to SDK API files
4
+ * so that `api()` / `streamingApi()` can stamp the authoritative source file
5
+ * path onto the compiled API object.
6
+ *
7
+ * Runs in both dev and build. The user's source code is never modified on disk.
8
+ */
9
+ export declare function sdkApiEntryPointPlugin(root: string): Plugin;
10
+ //# sourceMappingURL=vite-plugin-sdk-api-entry-point.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin-sdk-api-entry-point.d.mts","sourceRoot":"","sources":["../src/vite-plugin-sdk-api-entry-point.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAwBnC;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2C3D"}
@@ -0,0 +1,63 @@
1
+ import path from "node:path";
2
+ /**
3
+ * Build a sourcemap `mappings` string for a simple prepend operation.
4
+ *
5
+ * The prepended lines get no source mapping (empty segments).
6
+ * Each original line maps 1:1 to its position in the source file.
7
+ *
8
+ * VLQ values used:
9
+ * AAAA = (col 0, source 0, srcLine 0, srcCol 0) — first original line
10
+ * AACA = (col 0, source 0, srcLine +1, srcCol 0) — each subsequent line
11
+ */
12
+ function buildPrependMappings(prependLineCount, originalLineCount) {
13
+ const empty = ";".repeat(prependLineCount);
14
+ if (originalLineCount === 0)
15
+ return empty;
16
+ const original = ["AAAA"]
17
+ .concat(Array(Math.max(0, originalLineCount - 1)).fill("AACA"))
18
+ .join(";");
19
+ return empty + original;
20
+ }
21
+ /**
22
+ * Vite plugin that prepends `__setEntryPoint(relativePath)` to SDK API files
23
+ * so that `api()` / `streamingApi()` can stamp the authoritative source file
24
+ * path onto the compiled API object.
25
+ *
26
+ * Runs in both dev and build. The user's source code is never modified on disk.
27
+ */
28
+ export function sdkApiEntryPointPlugin(root) {
29
+ return {
30
+ name: "sb-sdk-api-entry-point",
31
+ enforce: "pre",
32
+ transform(code, id) {
33
+ const relative = path.relative(root, id).replace(/\\/g, "/");
34
+ if (!relative.startsWith("server/apis/") ||
35
+ relative === "server/apis/index.ts") {
36
+ return null;
37
+ }
38
+ if (!relative.endsWith(".ts") && !relative.endsWith(".tsx")) {
39
+ return null;
40
+ }
41
+ const prependLines = [
42
+ `import { __setEntryPoint as __sb_set_ep } from "@superblocksteam/sdk-api";`,
43
+ `__sb_set_ep(${JSON.stringify(relative)});`,
44
+ "",
45
+ ];
46
+ const prepend = prependLines.join("\n");
47
+ const originalLineCount = code.split("\n").length;
48
+ const prependNewlineCount = prependLines.length - 1;
49
+ return {
50
+ code: prepend + code,
51
+ map: {
52
+ version: 3,
53
+ file: id,
54
+ sources: [id],
55
+ sourcesContent: [code],
56
+ names: [],
57
+ mappings: buildPrependMappings(prependNewlineCount, originalLineCount),
58
+ },
59
+ };
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=vite-plugin-sdk-api-entry-point.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin-sdk-api-entry-point.mjs","sourceRoot":"","sources":["../src/vite-plugin-sdk-api-entry-point.mts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAC3B,gBAAwB,EACxB,iBAAyB;IAEzB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3C,IAAI,iBAAiB,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC;SACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9D,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,KAAK,GAAG,QAAQ,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC7D,IACE,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC;gBACpC,QAAQ,KAAK,sBAAsB,EACnC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,YAAY,GAAG;gBACnB,4EAA4E;gBAC5E,eAAe,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI;gBAC3C,EAAE;aACH,CAAC;YACF,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAElD,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YAEpD,OAAO;gBACL,IAAI,EAAE,OAAO,GAAG,IAAI;gBACpB,GAAG,EAAE;oBACH,OAAO,EAAE,CAAC;oBACV,IAAI,EAAE,EAAE;oBACR,OAAO,EAAE,CAAC,EAAE,CAAC;oBACb,cAAc,EAAE,CAAC,IAAI,CAAC;oBACtB,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,oBAAoB,CAC5B,mBAAmB,EACnB,iBAAiB,CAClB;iBACF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vite-plugin-sdk-api-entry-point.test.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin-sdk-api-entry-point.test.d.mts","sourceRoot":"","sources":["../src/vite-plugin-sdk-api-entry-point.test.mts"],"names":[],"mappings":""}
@@ -0,0 +1,166 @@
1
+ import path from "node:path";
2
+ import { describe, it, expect } from "vitest";
3
+ import { sdkApiEntryPointPlugin } from "./vite-plugin-sdk-api-entry-point.mjs";
4
+ function createPlugin(root) {
5
+ const plugin = sdkApiEntryPointPlugin(root);
6
+ const transform = plugin.transform;
7
+ return { plugin, transform };
8
+ }
9
+ const VLQ_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
10
+ function decodeVlqSegment(encoded) {
11
+ const values = [];
12
+ let shift = 0;
13
+ let value = 0;
14
+ for (const char of encoded) {
15
+ const digit = VLQ_CHARS.indexOf(char);
16
+ value += (digit & 31) << shift;
17
+ if (digit & 32) {
18
+ shift += 5;
19
+ }
20
+ else {
21
+ values.push(value & 1 ? -(value >> 1) : value >> 1);
22
+ shift = 0;
23
+ value = 0;
24
+ }
25
+ }
26
+ return values;
27
+ }
28
+ /**
29
+ * Decode sourcemap mappings into per-output-line source line numbers.
30
+ * Returns null for unmapped lines.
31
+ */
32
+ function decodeMappings(mappings) {
33
+ let currentSourceLine = 0;
34
+ return mappings.split(";").map((group) => {
35
+ if (group === "")
36
+ return null;
37
+ const fields = decodeVlqSegment(group.split(",")[0]);
38
+ if (fields.length >= 4) {
39
+ currentSourceLine += fields[2];
40
+ return currentSourceLine;
41
+ }
42
+ return null;
43
+ });
44
+ }
45
+ /**
46
+ * Validate the core sourcemap invariants for a prepend transform:
47
+ * 1. Mapping group count === output line count
48
+ * 2. Every original source line is mapped (none dropped)
49
+ * 3. Mapped source lines are sequential 0..N-1
50
+ */
51
+ function expectValidSourcemap(result, originalCode) {
52
+ const outputLineCount = result.code.split("\n").length;
53
+ const groups = result.map.mappings.split(";");
54
+ expect(groups).toHaveLength(outputLineCount);
55
+ const decoded = decodeMappings(result.map.mappings);
56
+ const originalLineCount = originalCode.split("\n").length;
57
+ const mappedLines = decoded.filter((line) => line !== null);
58
+ expect(mappedLines).toHaveLength(originalLineCount);
59
+ mappedLines.forEach((sourceLine, i) => {
60
+ expect(sourceLine).toBe(i);
61
+ });
62
+ }
63
+ describe("sdkApiEntryPointPlugin", () => {
64
+ const root = "/app";
65
+ it("has the correct plugin name and enforce order", () => {
66
+ const { plugin } = createPlugin(root);
67
+ expect(plugin.name).toBe("sb-sdk-api-entry-point");
68
+ expect(plugin.enforce).toBe("pre");
69
+ });
70
+ describe("transform", () => {
71
+ it("prepends __setEntryPoint for a standard API file", () => {
72
+ const { transform } = createPlugin(root);
73
+ const result = transform('export default api({ name: "GetUsers" });', path.join(root, "server/apis/GetUsers/api.ts"));
74
+ expect(result).not.toBeNull();
75
+ expect(result.code).toContain('import { __setEntryPoint as __sb_set_ep } from "@superblocksteam/sdk-api";');
76
+ expect(result.code).toContain('__sb_set_ep("server/apis/GetUsers/api.ts");');
77
+ expect(result.code).toContain('export default api({ name: "GetUsers"');
78
+ });
79
+ it("prepends __setEntryPoint for a .tsx API file", () => {
80
+ const { transform } = createPlugin(root);
81
+ const result = transform("export default api({ name: 'Render' });", path.join(root, "server/apis/Render/api.tsx"));
82
+ expect(result).not.toBeNull();
83
+ expect(result.code).toContain('__sb_set_ep("server/apis/Render/api.tsx");');
84
+ });
85
+ it("skips server/apis/index.ts", () => {
86
+ const { transform } = createPlugin(root);
87
+ const result = transform("export default {};", path.join(root, "server/apis/index.ts"));
88
+ expect(result).toBeNull();
89
+ });
90
+ it("skips files outside server/apis/", () => {
91
+ const { transform } = createPlugin(root);
92
+ const result = transform("export default {};", path.join(root, "src/components/App.ts"));
93
+ expect(result).toBeNull();
94
+ });
95
+ it("skips non-.ts/.tsx files under server/apis/", () => {
96
+ const { transform } = createPlugin(root);
97
+ const result = transform("{}", path.join(root, "server/apis/GetUsers/config.json"));
98
+ expect(result).toBeNull();
99
+ });
100
+ it("handles nested API directories", () => {
101
+ const { transform } = createPlugin(root);
102
+ const result = transform("export default api({});", path.join(root, "server/apis/v2/GetUsers/api.ts"));
103
+ expect(result).not.toBeNull();
104
+ expect(result.code).toContain('__sb_set_ep("server/apis/v2/GetUsers/api.ts");');
105
+ });
106
+ it("preserves original code after the prepend", () => {
107
+ const { transform } = createPlugin(root);
108
+ const originalCode = [
109
+ 'import { api, z } from "@superblocksteam/sdk-api";',
110
+ "export default api({",
111
+ ' name: "GetUsers",',
112
+ " input: z.object({}),",
113
+ " output: z.object({ users: z.array(z.string()) }),",
114
+ " async run() { return { users: [] }; },",
115
+ "});",
116
+ ].join("\n");
117
+ const result = transform(originalCode, path.join(root, "server/apis/GetUsers/api.ts"));
118
+ expect(result).not.toBeNull();
119
+ expect(result.code.endsWith(originalCode)).toBe(true);
120
+ });
121
+ });
122
+ describe("sourcemap", () => {
123
+ it("returns a valid v3 sourcemap", () => {
124
+ const { transform } = createPlugin(root);
125
+ const id = path.join(root, "server/apis/GetUsers/api.ts");
126
+ const result = transform("export default api({});", id);
127
+ expect(result).not.toBeNull();
128
+ expect(result.map.version).toBe(3);
129
+ expect(result.map.file).toBe(id);
130
+ expect(result.map.sources).toEqual([id]);
131
+ });
132
+ it("includes the original source in sourcesContent", () => {
133
+ const { transform } = createPlugin(root);
134
+ const originalCode = 'export default api({ name: "Foo" });';
135
+ const result = transform(originalCode, path.join(root, "server/apis/Foo/api.ts"));
136
+ expect(result).not.toBeNull();
137
+ expect(result.map.sourcesContent).toEqual([originalCode]);
138
+ });
139
+ it("maps prepended lines to nothing and original lines 1:1", () => {
140
+ const { transform } = createPlugin(root);
141
+ const originalCode = ["line1", "line2", "line3"].join("\n");
142
+ const result = transform(originalCode, path.join(root, "server/apis/Test/api.ts"));
143
+ expect(result).not.toBeNull();
144
+ expectValidSourcemap(result, originalCode);
145
+ const decoded = decodeMappings(result.map.mappings);
146
+ expect(decoded).toEqual([null, null, 0, 1, 2]);
147
+ });
148
+ it("handles single-line source files", () => {
149
+ const { transform } = createPlugin(root);
150
+ const originalCode = "export default api({});";
151
+ const result = transform(originalCode, path.join(root, "server/apis/One/api.ts"));
152
+ expect(result).not.toBeNull();
153
+ expectValidSourcemap(result, originalCode);
154
+ const decoded = decodeMappings(result.map.mappings);
155
+ expect(decoded).toEqual([null, null, 0]);
156
+ });
157
+ it.each([1, 2, 3, 7, 20])("mapping group count equals output line count for %i-line source", (lineCount) => {
158
+ const { transform } = createPlugin(root);
159
+ const originalCode = Array.from({ length: lineCount }, (_, i) => `const x${i} = ${i};`).join("\n");
160
+ const result = transform(originalCode, path.join(root, "server/apis/Sized/api.ts"));
161
+ expect(result).not.toBeNull();
162
+ expectValidSourcemap(result, originalCode);
163
+ });
164
+ });
165
+ });
166
+ //# sourceMappingURL=vite-plugin-sdk-api-entry-point.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin-sdk-api-entry-point.test.mjs","sourceRoot":"","sources":["../src/vite-plugin-sdk-api-entry-point.test.mts"],"names":[],"mappings":"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"}
package/eslint.config.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import js from "@eslint/js";
2
2
  import { defineConfig } from "eslint/config";
3
+ import prettier from "eslint-config-prettier";
3
4
  import turbo from "eslint-config-turbo/flat";
4
5
  import importPlugin from "eslint-plugin-import";
5
- import prettier from "eslint-plugin-prettier/recommended";
6
6
  import unicorn from "eslint-plugin-unicorn";
7
7
  import globals from "globals";
8
8
  import * as tseslint from "typescript-eslint";
@@ -1,5 +1,6 @@
1
1
  export default {
2
2
  "*.{js,jsx,ts,tsx,mjs,mts}":
3
- "eslint --fix --max-warnings 0 --concurrency=auto",
3
+ "eslint --fix --max-warnings 0 --no-warn-ignored --concurrency=auto",
4
+ "*": "oxfmt --no-error-on-unmatched-pattern",
4
5
  "**/*.{ts,tsx,mts}": () => "pnpm typecheck",
5
6
  };
package/package.json CHANGED
@@ -1,14 +1,10 @@
1
1
  {
2
2
  "name": "@superblocksteam/sdk",
3
- "version": "2.0.93",
4
- "type": "module",
3
+ "version": "2.0.94-next.0",
5
4
  "description": "Superblocks JS SDK",
6
5
  "homepage": "https://www.superblocks.com",
7
6
  "license": "Superblocks Community Software License",
8
- "engines": {
9
- "node": ">=24",
10
- "npm": ">=10.x"
11
- },
7
+ "type": "module",
12
8
  "exports": {
13
9
  ".": {
14
10
  "types": "./dist/index.d.ts",
@@ -44,7 +40,6 @@
44
40
  "jwt-decode": "^4.0.0",
45
41
  "lodash-es": "^4.17.21",
46
42
  "package-manager-detector": "^1.3.0",
47
- "prettier": "^3.7.4",
48
43
  "read-pkg": "^9.0.1",
49
44
  "semver": "^7.5.4",
50
45
  "simple-git": "^3.20.0",
@@ -53,19 +48,11 @@
53
48
  "vite-tsconfig-paths": "^6.0.4",
54
49
  "winston": "^3.17.0",
55
50
  "yaml": "^2.7.1",
56
- "@superblocksteam/library-shared": "2.0.93",
57
- "@superblocksteam/shared": "0.9566.2",
58
- "@superblocksteam/telemetry": "2.0.93",
59
- "@superblocksteam/util": "2.0.93",
60
- "@superblocksteam/vite-plugin-file-sync": "2.0.93"
61
- },
62
- "optionalDependencies": {
63
- "@rollup/rollup-darwin-arm64": "^4.34.9",
64
- "@rollup/rollup-darwin-x64": "^4.34.9",
65
- "@rollup/rollup-linux-arm64-gnu": "^4.34.9",
66
- "@rollup/rollup-linux-x64-gnu": "^4.34.9",
67
- "@rollup/rollup-win32-arm64-msvc": "^4.34.9",
68
- "@rollup/rollup-win32-x64-msvc": "^4.34.9"
51
+ "@superblocksteam/library-shared": "2.0.94-next.0",
52
+ "@superblocksteam/shared": "0.9567.0",
53
+ "@superblocksteam/telemetry": "2.0.94-next.0",
54
+ "@superblocksteam/util": "2.0.94-next.0",
55
+ "@superblocksteam/vite-plugin-file-sync": "2.0.94-next.0"
69
56
  },
70
57
  "devDependencies": {
71
58
  "@eslint/js": "^9.39.2",
@@ -80,7 +67,6 @@
80
67
  "eslint-config-prettier": "^10.1.8",
81
68
  "eslint-config-turbo": "^2.8.3",
82
69
  "eslint-plugin-import": "^2.32.0",
83
- "eslint-plugin-prettier": "^5.5.5",
84
70
  "eslint-plugin-unicorn": "^62.0.0",
85
71
  "globals": "^17.3.0",
86
72
  "tsx": "^4.19.2",
@@ -88,6 +74,18 @@
88
74
  "typescript-eslint": "^8.54.0",
89
75
  "vitest": "^4.0.17"
90
76
  },
77
+ "optionalDependencies": {
78
+ "@rollup/rollup-darwin-arm64": "^4.34.9",
79
+ "@rollup/rollup-darwin-x64": "^4.34.9",
80
+ "@rollup/rollup-linux-arm64-gnu": "^4.34.9",
81
+ "@rollup/rollup-linux-x64-gnu": "^4.34.9",
82
+ "@rollup/rollup-win32-arm64-msvc": "^4.34.9",
83
+ "@rollup/rollup-win32-x64-msvc": "^4.34.9"
84
+ },
85
+ "engines": {
86
+ "node": ">=24",
87
+ "npm": ">=10.x"
88
+ },
91
89
  "publishConfig": {
92
90
  "registry": "https://registry.npmjs.org"
93
91
  },
@@ -11,6 +11,7 @@ import { getLogger } from "./telemetry/logging.js";
11
11
  import { generateApiBuildManifestPlugin } from "./vite-plugin-generate-api-build-manifest.mjs";
12
12
  import { injectSuperblocksIdsPlugin } from "./vite-plugin-inject-sb-ids-transform.mjs";
13
13
  import createLucideReactImportOptimizer from "./vite-plugin-optimize-lucide-imports.js";
14
+ import { sdkApiEntryPointPlugin } from "./vite-plugin-sdk-api-entry-point.mjs";
14
15
 
15
16
  export async function buildApplication({
16
17
  root,
@@ -114,6 +115,7 @@ async function buildWithVite({
114
115
  logLevel: "info",
115
116
  plugins: [
116
117
  tsconfigPaths(),
118
+ sdkApiEntryPointPlugin(root),
117
119
  injectIndexVitePlugin({ assetsCdnUrl }),
118
120
  customComponentsPlugin(),
119
121
  injectSuperblocksIdsPlugin(root),
@@ -0,0 +1,60 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ buildGithubSuperblocksSyncWorkflow,
4
+ buildGithubSuperblocksSyncWorkflowFromBaseUrl,
5
+ DEFAULT_SUPERBLOCKS_DOMAIN,
6
+ getSuperblocksDomainFromBaseUrl,
7
+ } from "./github-superblocks-sync-workflow.js";
8
+
9
+ describe("github-superblocks-sync-workflow asset", () => {
10
+ it("defaults to app.superblocks.com", () => {
11
+ expect(buildGithubSuperblocksSyncWorkflow()).toContain(
12
+ `domain: ${DEFAULT_SUPERBLOCKS_DOMAIN}`,
13
+ );
14
+ });
15
+
16
+ it("derives domain host from a valid base URL", () => {
17
+ expect(
18
+ getSuperblocksDomainFromBaseUrl("https://example.superblocks.com"),
19
+ ).toBe("example.superblocks.com");
20
+ });
21
+
22
+ it("preserves port in derived domain host", () => {
23
+ expect(
24
+ getSuperblocksDomainFromBaseUrl("https://example.superblocks.com:8443"),
25
+ ).toBe("example.superblocks.com:8443");
26
+ });
27
+
28
+ it("falls back to default domain for invalid base URL", () => {
29
+ expect(getSuperblocksDomainFromBaseUrl("not-a-url")).toBe(
30
+ DEFAULT_SUPERBLOCKS_DOMAIN,
31
+ );
32
+ });
33
+
34
+ it("builds workflow with domain derived from base URL", () => {
35
+ const workflow = buildGithubSuperblocksSyncWorkflowFromBaseUrl(
36
+ "https://app.superblocks.com",
37
+ );
38
+ expect(workflow).toContain("name: Sync changes to Superblocks");
39
+ expect(workflow).toContain("domain: app.superblocks.com");
40
+ expect(workflow).toContain("uses: superblocksteam/sync-action@v1");
41
+ });
42
+
43
+ it("derives production domain correctly", () => {
44
+ expect(getSuperblocksDomainFromBaseUrl("https://app.superblocks.com")).toBe(
45
+ "app.superblocks.com",
46
+ );
47
+ });
48
+
49
+ it("derives staging domain correctly", () => {
50
+ expect(
51
+ getSuperblocksDomainFromBaseUrl("https://staging.superblockshq.com"),
52
+ ).toBe("staging.superblockshq.com");
53
+ });
54
+
55
+ it("derives preview domain correctly", () => {
56
+ expect(
57
+ getSuperblocksDomainFromBaseUrl("https://pr-15000.superblocks.dev"),
58
+ ).toBe("pr-15000.superblocks.dev");
59
+ });
60
+ });
@@ -0,0 +1,70 @@
1
+ export const DEFAULT_SUPERBLOCKS_DOMAIN = "app.superblocks.com";
2
+
3
+ export function buildGithubSuperblocksSyncWorkflow(
4
+ domain: string = DEFAULT_SUPERBLOCKS_DOMAIN,
5
+ ): string {
6
+ return `name: Sync changes to Superblocks
7
+
8
+ on:
9
+ push:
10
+ branches:
11
+ - main
12
+ workflow_dispatch:
13
+
14
+ jobs:
15
+ superblocks-sync:
16
+ runs-on: ubuntu-latest
17
+ name: Sync to Superblocks
18
+ permissions:
19
+ contents: read
20
+ packages: read
21
+ steps:
22
+ - name: Checkout
23
+ uses: actions/checkout@v4
24
+ with:
25
+ fetch-depth: 0
26
+
27
+ # Optional: needed only if the CLI version is private in GitHub Packages.
28
+ - name: Setup npm credentials
29
+ env:
30
+ NPM_AUTH_TOKEN: \${{ secrets.NPM_AUTH_TOKEN }}
31
+ run: |
32
+ if [ -n "$NPM_AUTH_TOKEN" ]; then
33
+ echo "@superblocksteam:registry=https://npm.pkg.github.com" >> .npmrc
34
+ echo "always-auth=true" >> .npmrc
35
+ echo "//npm.pkg.github.com/:_authToken=$NPM_AUTH_TOKEN" >> .npmrc
36
+ fi
37
+
38
+ - name: Sync
39
+ uses: superblocksteam/sync-action@v1
40
+ env:
41
+ NPM_CONFIG_USERCONFIG: \${{ github.workspace }}/.npmrc
42
+ with:
43
+ token: \${{ secrets.SUPERBLOCKS_TOKEN }}
44
+ domain: ${domain}
45
+ path: .
46
+ sha: \${{ github.sha }}
47
+ `;
48
+ }
49
+
50
+ export function getSuperblocksDomainFromBaseUrl(
51
+ superblocksBaseUrl: string,
52
+ ): string {
53
+ const trimmed = superblocksBaseUrl.trim();
54
+ if (!trimmed) {
55
+ return DEFAULT_SUPERBLOCKS_DOMAIN;
56
+ }
57
+ try {
58
+ return new URL(trimmed).host || DEFAULT_SUPERBLOCKS_DOMAIN;
59
+ } catch {
60
+ return DEFAULT_SUPERBLOCKS_DOMAIN;
61
+ }
62
+ }
63
+
64
+ export function buildGithubSuperblocksSyncWorkflowFromBaseUrl(
65
+ superblocksBaseUrl: string,
66
+ ): string {
67
+ return buildGithubSuperblocksSyncWorkflow(
68
+ getSuperblocksDomainFromBaseUrl(superblocksBaseUrl),
69
+ );
70
+ }