@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.
- package/.turbo/turbo-build.log +1 -1
- package/dist/application-build.d.mts.map +1 -1
- package/dist/application-build.mjs +2 -0
- package/dist/application-build.mjs.map +1 -1
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.d.ts +5 -0
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.d.ts.map +1 -0
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.js +61 -0
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.js.map +1 -0
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.d.ts +2 -0
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.d.ts.map +1 -0
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.js +32 -0
- package/dist/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.js.map +1 -0
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.mjs +350 -16
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/client-sync.test.d.mts +2 -0
- package/dist/client-sync.test.d.mts.map +1 -0
- package/dist/client-sync.test.mjs +57 -0
- package/dist/client-sync.test.mjs.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +50 -0
- package/dist/client.js.map +1 -1
- package/dist/collect-sdk-apis.d.mts +18 -0
- package/dist/collect-sdk-apis.d.mts.map +1 -0
- package/dist/collect-sdk-apis.mjs +26 -0
- package/dist/collect-sdk-apis.mjs.map +1 -0
- package/dist/collect-sdk-apis.test.d.mts +2 -0
- package/dist/collect-sdk-apis.test.d.mts.map +1 -0
- package/dist/collect-sdk-apis.test.mjs +72 -0
- package/dist/collect-sdk-apis.test.mjs.map +1 -0
- package/dist/dbfs/client.d.ts +1 -0
- package/dist/dbfs/client.d.ts.map +1 -1
- package/dist/dbfs/client.js +12 -0
- package/dist/dbfs/client.js.map +1 -1
- package/dist/dev-utils/dev-server.d.mts +4 -1
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +14 -6
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/dev-utils/vite-plugin-build-manifest-stub.mjs +1 -1
- package/dist/dev-utils/vite-plugin-build-manifest-stub.mjs.map +1 -1
- package/dist/parse-sdk-registry.d.mts +20 -0
- package/dist/parse-sdk-registry.d.mts.map +1 -0
- package/dist/parse-sdk-registry.mjs +161 -0
- package/dist/parse-sdk-registry.mjs.map +1 -0
- package/dist/parse-sdk-registry.test.d.mts +2 -0
- package/dist/parse-sdk-registry.test.d.mts.map +1 -0
- package/dist/parse-sdk-registry.test.mjs +83 -0
- package/dist/parse-sdk-registry.test.mjs.map +1 -0
- package/dist/sdk.d.ts +10 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +14 -2
- package/dist/sdk.js.map +1 -1
- package/dist/vite-plugin-generate-api-build-manifest.d.mts.map +1 -1
- package/dist/vite-plugin-generate-api-build-manifest.mjs +13 -1
- package/dist/vite-plugin-generate-api-build-manifest.mjs.map +1 -1
- package/dist/vite-plugin-sdk-api-entry-point.d.mts +10 -0
- package/dist/vite-plugin-sdk-api-entry-point.d.mts.map +1 -0
- package/dist/vite-plugin-sdk-api-entry-point.mjs +63 -0
- package/dist/vite-plugin-sdk-api-entry-point.mjs.map +1 -0
- package/dist/vite-plugin-sdk-api-entry-point.test.d.mts +2 -0
- package/dist/vite-plugin-sdk-api-entry-point.test.d.mts.map +1 -0
- package/dist/vite-plugin-sdk-api-entry-point.test.mjs +166 -0
- package/dist/vite-plugin-sdk-api-entry-point.test.mjs.map +1 -0
- package/eslint.config.js +1 -1
- package/lint-staged.config.mjs +2 -1
- package/package.json +19 -21
- package/src/application-build.mts +2 -0
- package/src/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.test.ts +60 -0
- package/src/cli-replacement/assets/git-workflows/github-superblocks-sync-workflow.ts +70 -0
- package/src/cli-replacement/dev.mts +528 -18
- package/src/client-sync.test.mts +66 -0
- package/src/client.ts +102 -0
- package/src/collect-sdk-apis.mts +43 -0
- package/src/collect-sdk-apis.test.mts +91 -0
- package/src/dbfs/client.ts +16 -0
- package/src/dev-utils/dev-server.mts +25 -4
- package/src/dev-utils/vite-plugin-build-manifest-stub.mts +1 -1
- package/src/parse-sdk-registry.mts +227 -0
- package/src/parse-sdk-registry.test.mts +133 -0
- package/src/sdk.ts +52 -0
- package/src/vite-plugin-generate-api-build-manifest.mts +17 -1
- package/src/vite-plugin-sdk-api-entry-point.mts +76 -0
- package/src/vite-plugin-sdk-api-entry-point.test.mts +266 -0
- package/tsconfig.json +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/turbo.json +3 -8
- 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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,4CAA4C,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EACL,WAAW,EACX,kBAAkB,GACnB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAWnD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAAY;IACzD,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,UAAU,CAAC,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,UAAU,CAAC,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,UAAU,CAAC,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,UAAU,CAAC,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;QACjC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,UAAU,CAAC,WAAW,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAuC,EAAE,CAAC;IACxD,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"vite-plugin-generate-api-build-manifest.mjs","sourceRoot":"","sources":["../src/vite-plugin-generate-api-build-manifest.mts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,4CAA4C,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EACL,WAAW,EACX,kBAAkB,GACnB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAWnD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAAY;IACzD,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,UAAU,CAAC,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,UAAU,CAAC,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,UAAU,CAAC,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,UAAU,CAAC,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;QACjC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,UAAU,CAAC,WAAW,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAElC,MAAM,aAAa,GAAG,gBAAgB,CACpC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAC1C,CAAC;IACF,MAAM,QAAQ,GAAuC,EAAE,CAAC;IACxD,IAAI,aAAa,GAIb,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEnD,OAAO;QACL,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,KAAK;QAEd,KAAK,CAAC,UAAU;YACd,IAAI,aAAa;gBAAE,OAAO;YAE1B,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE;gBAC3D,GAAG,EAAE,IAAI;aACV,CAAC,CAAC;YAEH,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAEzD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;gBACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAEnC,MAAM,4CAA4C,CAChD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EACjC,KAAK,CAAC,MAAM,IAAI,EAAE,EAClB,EAAE,CACH,CAAC;gBAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;gBAC1C,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,QAAa,EAAE,MAAW;YAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC7C,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;gBACjB,GAAG,CAAC,EAAE,CAAC,GAAG;oBACR,GAAG;oBACH,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC;iBACnC,CAAC;gBACF,OAAO,GAAG,CAAC;YACb,CAAC,EACD,EAAkE,CACnE,CAAC;YAEF,MAAM,OAAO,GAAG,aAAa;gBAC3B,CAAC,CAAC,MAAM,0BAA0B,CAAC,IAAI,EAAE;oBACrC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;oBACnC,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;iBAC1C,CAAC;gBACJ,CAAC,CAAC,EAAE,CAAC;YAEP,aAAa,GAAG;gBACd,IAAI,EAAE,OAAO;gBACb,eAAe,EAAE,EAAE;gBACnB,OAAO;aACR,CAAC;YAEF,qFAAqF;YACrF,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,kEAAkE;gBAClE,IACE,QAAQ,CAAC,UAAU,CAAC,uBAAuB,CAAC;oBAC5C,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EACxB,CAAC;oBACD,8DAA8D;oBAC9D,IAAK,KAAa,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBACnC,KAAa,CAAC,IAAI;4BACjB,kBAAkB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KACQ,CAAC;AACd,CAAC"}
|
|
@@ -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 @@
|
|
|
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";
|
package/lint-staged.config.mjs
CHANGED
|
@@ -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.
|
|
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
|
-
"
|
|
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.
|
|
57
|
-
"@superblocksteam/shared": "0.
|
|
58
|
-
"@superblocksteam/telemetry": "2.0.
|
|
59
|
-
"@superblocksteam/util": "2.0.
|
|
60
|
-
"@superblocksteam/vite-plugin-file-sync": "2.0.
|
|
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
|
+
}
|