skybridge 0.0.0-dev.c64f28f → 0.0.0-dev.c69136e

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 (77) hide show
  1. package/README.md +9 -4
  2. package/dist/cli/detect-port.d.ts +18 -0
  3. package/dist/cli/detect-port.js +61 -0
  4. package/dist/cli/detect-port.js.map +1 -0
  5. package/dist/cli/use-nodemon.d.ts +1 -0
  6. package/dist/cli/use-nodemon.js +24 -9
  7. package/dist/cli/use-nodemon.js.map +1 -1
  8. package/dist/commands/build.js +1 -1
  9. package/dist/commands/build.js.map +1 -1
  10. package/dist/commands/dev.d.ts +1 -0
  11. package/dist/commands/dev.js +12 -1
  12. package/dist/commands/dev.js.map +1 -1
  13. package/dist/commands/start.d.ts +3 -1
  14. package/dist/commands/start.js +32 -8
  15. package/dist/commands/start.js.map +1 -1
  16. package/dist/server/const.d.ts +1 -0
  17. package/dist/server/const.js +2 -0
  18. package/dist/server/const.js.map +1 -0
  19. package/dist/server/express.d.ts +9 -0
  20. package/dist/server/express.js +72 -0
  21. package/dist/server/express.js.map +1 -0
  22. package/dist/server/express.test.d.ts +1 -0
  23. package/dist/server/express.test.js +74 -0
  24. package/dist/server/express.test.js.map +1 -0
  25. package/dist/server/server.d.ts +6 -0
  26. package/dist/server/server.js +69 -16
  27. package/dist/server/server.js.map +1 -1
  28. package/dist/server/widgetsDevServer.js +8 -2
  29. package/dist/server/widgetsDevServer.js.map +1 -1
  30. package/dist/test/widget.test.js +20 -14
  31. package/dist/test/widget.test.js.map +1 -1
  32. package/dist/web/bridges/apps-sdk/adaptor.d.ts +4 -4
  33. package/dist/web/bridges/apps-sdk/adaptor.js +26 -15
  34. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -1
  35. package/dist/web/bridges/apps-sdk/bridge.d.ts +1 -1
  36. package/dist/web/bridges/apps-sdk/index.d.ts +1 -1
  37. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  38. package/dist/web/bridges/apps-sdk/types.d.ts +14 -8
  39. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  40. package/dist/web/bridges/mcp-app/adaptor.d.ts +3 -3
  41. package/dist/web/bridges/mcp-app/adaptor.js +14 -12
  42. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -1
  43. package/dist/web/bridges/mcp-app/bridge.js +5 -0
  44. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  45. package/dist/web/bridges/types.d.ts +7 -3
  46. package/dist/web/create-store.test.js +6 -3
  47. package/dist/web/create-store.test.js.map +1 -1
  48. package/dist/web/data-llm.test.js +10 -8
  49. package/dist/web/data-llm.test.js.map +1 -1
  50. package/dist/web/hooks/index.d.ts +1 -1
  51. package/dist/web/hooks/index.js.map +1 -1
  52. package/dist/web/hooks/use-display-mode.d.ts +3 -3
  53. package/dist/web/hooks/use-display-mode.js.map +1 -1
  54. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  55. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  56. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  57. package/dist/web/hooks/use-files.test.js +5 -1
  58. package/dist/web/hooks/use-files.test.js.map +1 -1
  59. package/dist/web/hooks/use-open-external.d.ts +3 -1
  60. package/dist/web/hooks/use-open-external.js +1 -1
  61. package/dist/web/hooks/use-open-external.js.map +1 -1
  62. package/dist/web/hooks/use-open-external.test.js +11 -1
  63. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  64. package/dist/web/hooks/use-set-open-in-app-url.test.js +5 -11
  65. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  66. package/dist/web/hooks/use-widget-state.test.js +9 -6
  67. package/dist/web/hooks/use-widget-state.test.js.map +1 -1
  68. package/dist/web/plugin/plugin.js +8 -0
  69. package/dist/web/plugin/plugin.js.map +1 -1
  70. package/dist/web/plugin/validate-widget.d.ts +5 -0
  71. package/dist/web/plugin/validate-widget.js +27 -0
  72. package/dist/web/plugin/validate-widget.js.map +1 -0
  73. package/dist/web/plugin/validate-widget.test.d.ts +1 -0
  74. package/dist/web/plugin/validate-widget.test.js +42 -0
  75. package/dist/web/plugin/validate-widget.test.js.map +1 -0
  76. package/package.json +18 -14
  77. package/tsconfig.base.json +28 -0
@@ -0,0 +1,27 @@
1
+ function hasExportDefault(code) {
2
+ return (/export\s+default\s/.test(code) ||
3
+ /export\s*\{[^}]*\bas\s+default\b[^}]*}/.test(code));
4
+ }
5
+ function hasMountWidgetCall(code) {
6
+ return /mountWidget\s*\(/.test(code);
7
+ }
8
+ function stripComments(code) {
9
+ return code.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "");
10
+ }
11
+ export function validateWidget(code, filePath) {
12
+ code = stripComments(code);
13
+ const warnings = [];
14
+ const fileName = filePath.split("/").pop() ?? filePath;
15
+ if (!hasExportDefault(code)) {
16
+ warnings.push({
17
+ message: `Widget file "${fileName}" is missing a default export. Add "export default <ComponentName>" to ensure the widget is properly registered.`,
18
+ });
19
+ }
20
+ if (!hasMountWidgetCall(code)) {
21
+ warnings.push({
22
+ message: `Widget file "${fileName}" is missing a mountWidget() call. Add "mountWidget(<Component />)" to mount the component to the DOM.`,
23
+ });
24
+ }
25
+ return warnings;
26
+ }
27
+ //# sourceMappingURL=validate-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-widget.js","sourceRoot":"","sources":["../../../src/web/plugin/validate-widget.ts"],"names":[],"mappings":"AAIA,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,CACL,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,CACpD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,QAAgB;IAC3D,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;IAEvD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,gBAAgB,QAAQ,kHAAkH;SACpJ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,gBAAgB,QAAQ,wGAAwG;SAC1I,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { validateWidget } from "./validate-widget.js";
3
+ describe("validateWidget", () => {
4
+ it("returns no warnings for a valid widget", () => {
5
+ expect(validateWidget("export default MyWidget;\nmountWidget(<MyWidget />);", "src/widgets/my-widget.tsx")).toEqual([]);
6
+ });
7
+ it("accepts all default export syntaxes", () => {
8
+ for (const exportLine of [
9
+ "export default MyWidget;",
10
+ "export default function MyWidget() {}",
11
+ "export { Foo as default };",
12
+ ]) {
13
+ expect(validateWidget(`${exportLine}\nmountWidget(<MyWidget />);`, "src/widgets/my-widget.tsx")).toEqual([]);
14
+ }
15
+ });
16
+ it("warns when export default is missing", () => {
17
+ const warnings = validateWidget("mountWidget(<MyWidget />);", "src/widgets/my-widget.tsx");
18
+ expect(warnings).toHaveLength(1);
19
+ expect(warnings[0]?.message).toContain("missing a default export");
20
+ expect(warnings[0]?.message).toContain("my-widget.tsx");
21
+ });
22
+ it("warns when mountWidget() call is missing", () => {
23
+ const warnings = validateWidget("export default MyWidget;", "src/widgets/my-widget.tsx");
24
+ expect(warnings).toHaveLength(1);
25
+ expect(warnings[0]?.message).toContain("missing a mountWidget() call");
26
+ expect(warnings[0]?.message).toContain("my-widget.tsx");
27
+ });
28
+ it("ignores commented-out code", () => {
29
+ const code = `
30
+ // export default MyWidget;
31
+ // mountWidget(<MyWidget />);
32
+ /* export default MyWidget; */
33
+ /* mountWidget(<MyWidget />); */
34
+ `;
35
+ expect(validateWidget(code, "src/widgets/my-widget.tsx")).toHaveLength(2);
36
+ });
37
+ it("uses filename from path for directory widgets", () => {
38
+ const warnings = validateWidget("", "src/widgets/foo/index.tsx");
39
+ expect(warnings[0]?.message).toContain("index.tsx");
40
+ });
41
+ });
42
+ //# sourceMappingURL=validate-widget.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-widget.test.js","sourceRoot":"","sources":["../../../src/web/plugin/validate-widget.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CACJ,cAAc,CACZ,sDAAsD,EACtD,2BAA2B,CAC5B,CACF,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,KAAK,MAAM,UAAU,IAAI;YACvB,0BAA0B;YAC1B,uCAAuC;YACvC,4BAA4B;SAC7B,EAAE,CAAC;YACF,MAAM,CACJ,cAAc,CACZ,GAAG,UAAU,8BAA8B,EAC3C,2BAA2B,CAC5B,CACF,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,QAAQ,GAAG,cAAc,CAC7B,4BAA4B,EAC5B,2BAA2B,CAC5B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,QAAQ,GAAG,cAAc,CAC7B,0BAA0B,EAC1B,2BAA2B,CAC5B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACvE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG;;;;;KAKZ,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;QACjE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skybridge",
3
- "version": "0.0.0-dev.c64f28f",
3
+ "version": "0.0.0-dev.c69136e",
4
4
  "description": "Skybridge is a framework for building ChatGPT and MCP Apps",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,9 +9,12 @@
9
9
  "type": "module",
10
10
  "files": [
11
11
  "dist",
12
- "README.md"
12
+ "README.md",
13
+ "tsconfig.base.json"
13
14
  ],
14
15
  "exports": {
16
+ "./tsconfig": "./tsconfig.base.json",
17
+ "./tsconfig.json": "./tsconfig.base.json",
15
18
  "./server": {
16
19
  "types": "./dist/server/index.d.ts",
17
20
  "default": "./dist/server/index.js"
@@ -31,40 +34,41 @@
31
34
  "license": "ISC",
32
35
  "peerDependencies": {
33
36
  "@modelcontextprotocol/sdk": ">=1.0.0",
37
+ "@skybridge/devtools": ">=0.26.1",
34
38
  "nodemon": ">=3.0.0",
35
39
  "react": ">=18.0.0",
36
- "react-dom": ">=18.0.0"
40
+ "react-dom": ">=18.0.0",
41
+ "vite": "^7.3.1"
37
42
  },
38
43
  "dependencies": {
39
44
  "@babel/core": "^7.29.0",
40
- "@oclif/core": "^4.8.0",
45
+ "@oclif/core": "^4.8.4",
41
46
  "ci-info": "^4.4.0",
42
47
  "cors": "^2.8.6",
43
48
  "dequal": "^2.0.3",
44
- "es-toolkit": "^1.44.0",
49
+ "es-toolkit": "^1.45.1",
45
50
  "express": "^5.2.1",
46
51
  "handlebars": "^4.7.8",
47
- "ink": "^6.6.0",
48
- "posthog-node": "^5.24.10",
52
+ "ink": "^6.8.0",
53
+ "posthog-node": "^5.28.0",
49
54
  "superjson": "^2.2.6",
50
- "vite": "^7.3.1",
51
55
  "zustand": "^5.0.11"
52
56
  },
53
57
  "devDependencies": {
54
- "@modelcontextprotocol/ext-apps": "^1.0.1",
55
- "@modelcontextprotocol/sdk": "^1.25.3",
58
+ "@modelcontextprotocol/ext-apps": "^1.2.0",
59
+ "@modelcontextprotocol/sdk": "^1.27.1",
56
60
  "@testing-library/dom": "^10.4.1",
57
61
  "@testing-library/react": "^16.3.2",
58
62
  "@total-typescript/tsconfig": "^1.0.4",
59
63
  "@types/babel__core": "^7.20.5",
60
64
  "@types/cors": "^2.8.19",
61
65
  "@types/express": "^5.0.6",
62
- "@types/jsdom": "^27.0.0",
63
- "@types/node": "^24.10.10",
64
- "@types/react": "^19.2.11",
66
+ "@types/jsdom": "^28.0.0",
67
+ "@types/node": "^24.12.0",
68
+ "@types/react": "^19.2.14",
65
69
  "@types/react-dom": "^19.2.3",
66
70
  "@vitest/ui": "^4.0.18",
67
- "jsdom": "^28.0.0",
71
+ "jsdom": "^28.1.0",
68
72
  "shx": "^0.4.0",
69
73
  "ts-node": "^10.9.2",
70
74
  "typescript": "^5.9.3",
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ // Module resolution options
4
+ "module": "NodeNext",
5
+ "esModuleInterop": true,
6
+ "verbatimModuleSyntax": true,
7
+
8
+ // Output options
9
+ "noEmit": false,
10
+ "incremental": true,
11
+ "sourceMap": true,
12
+
13
+ // Language and environment options
14
+ "target": "ES2022",
15
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
16
+ "jsx": "react-jsx",
17
+
18
+ // Strictness and checking options
19
+ "strict": true,
20
+ "skipLibCheck": true,
21
+ "forceConsistentCasingInFileNames": true,
22
+
23
+ // Code quality & diagnostics
24
+ "noUnusedLocals": true,
25
+ "noUnusedParameters": true,
26
+ "noFallthroughCasesInSwitch": true
27
+ }
28
+ }