skybridge 0.0.0-dev.c7e90f9 → 0.0.0-dev.c884459
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/dist/server/templates/development.hbs +1 -0
- package/dist/server/templates/production.hbs +2 -1
- package/dist/server/widgetsDevServer.js +0 -2
- package/dist/server/widgetsDevServer.js.map +1 -1
- package/dist/web/plugin/plugin.js +0 -6
- package/dist/web/plugin/plugin.js.map +1 -1
- package/package.json +1 -1
- package/README.md +0 -143
- package/dist/server/asset-base-url-transform-plugin.d.ts +0 -11
- package/dist/server/asset-base-url-transform-plugin.js +0 -34
- package/dist/server/asset-base-url-transform-plugin.js.map +0 -1
- package/dist/server/asset-base-url-transform-plugin.test.d.ts +0 -1
- package/dist/server/asset-base-url-transform-plugin.test.js +0 -56
- package/dist/server/asset-base-url-transform-plugin.test.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
<
|
|
1
|
+
<base href="{{serverUrl}}" />
|
|
2
|
+
<script type="module">window.skybridge = { hostType: "{{hostType}}" };</script>
|
|
2
3
|
<div id="root"></div>
|
|
3
4
|
<script type="module">
|
|
4
5
|
import('{{serverUrl}}/assets/{{widgetFile}}');
|
|
@@ -2,7 +2,6 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import cors from "cors";
|
|
4
4
|
import express, {} from "express";
|
|
5
|
-
import { assetBaseUrlTransformPlugin } from "./asset-base-url-transform-plugin.js";
|
|
6
5
|
/**
|
|
7
6
|
* Install Vite dev server
|
|
8
7
|
* This router MUST be installed at the application root, like so:
|
|
@@ -40,7 +39,6 @@ export const widgetsDevServer = async () => {
|
|
|
40
39
|
optimizeDeps: {
|
|
41
40
|
include: ["react", "react-dom/client"],
|
|
42
41
|
},
|
|
43
|
-
plugins: [assetBaseUrlTransformPlugin({ devServerOrigin: "http://localhost:3000" })],
|
|
44
42
|
});
|
|
45
43
|
router.use(cors());
|
|
46
44
|
router.use("/", vite.middlewares);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widgetsDevServer.js","sourceRoot":"","sources":["../../src/server/widgetsDevServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAC/C
|
|
1
|
+
{"version":3,"file":"widgetsDevServer.js","sourceRoot":"","sources":["../../src/server/widgetsDevServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAC/C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAqB,EAAE;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,GAChE,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvB,kFAAkF;IAClF,gFAAgF;IAChF,+FAA+F;IAC/F,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAEjD,0DAA0D;IAC1D,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EACzC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EACvC,UAAU,CACX,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC;IAEpE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC;QAC9B,GAAG,SAAS;QACZ,UAAU,EAAE,KAAK,EAAE,kFAAkF;QACrG,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE;YACN,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;SACrB;QACD,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC;SACvC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { transform as dataLlmTransform } from "./transform-data-llm.js";
|
|
2
|
-
import { assetBaseUrlTransform } from "../../server/asset-base-url-transform-plugin.js";
|
|
3
2
|
export function skybridge() {
|
|
4
3
|
return {
|
|
5
4
|
name: "skybridge",
|
|
@@ -29,11 +28,6 @@ export function skybridge() {
|
|
|
29
28
|
input,
|
|
30
29
|
},
|
|
31
30
|
},
|
|
32
|
-
experimental: {
|
|
33
|
-
renderBuiltUrl: (filename) => {
|
|
34
|
-
return { runtime: `window.skybridge.serverUrl + "/assets/${filename}"` };
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
31
|
};
|
|
38
32
|
},
|
|
39
33
|
enforce: "pre",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/web/plugin/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/web/plugin/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,IAAI,EAAE,WAAW;QAEjB,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,4EAA4E;YAC5E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAE9C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACjD,MAAM,iBAAiB,GAAG,OAAO,CAC/B,WAAW,EACX,oCAAoC,CACrC,CAAC;YACF,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;YAEzE,MAAM,WAAW,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5D,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,IAAI;aACL,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1D,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrD,IAAI;aACL,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;YAElE,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE;oBACL,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;oBACZ,YAAY,EAAE,KAAK;oBACnB,aAAa,EAAE;wBACb,KAAK;qBACN;iBACF;aACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK;QACd,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;YACtB,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/README.md
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
<img alt="Skybridge" src="https://raw.githubusercontent.com/alpic-ai/skybridge/main/docs/images/github-banner.png" width="100%">
|
|
4
|
-
|
|
5
|
-
<br />
|
|
6
|
-
|
|
7
|
-
# Skybridge
|
|
8
|
-
|
|
9
|
-
**Build ChatGPT & MCP Apps. The Modern TypeScript Way.**
|
|
10
|
-
|
|
11
|
-
The fullstack TypeScript framework for AI-embedded widgets.<br />
|
|
12
|
-
**Type-safe. React-powered. Platform-agnostic.**
|
|
13
|
-
|
|
14
|
-
<br />
|
|
15
|
-
|
|
16
|
-
[](https://www.npmjs.com/package/skybridge)
|
|
17
|
-
[](https://www.npmjs.com/package/skybridge)
|
|
18
|
-
[](https://github.com/alpic-ai/skybridge/blob/main/LICENSE)
|
|
19
|
-
|
|
20
|
-
<br />
|
|
21
|
-
|
|
22
|
-
[Documentation](https://docs.skybridge.tech) · [Quick Start](https://docs.skybridge.tech/quickstart/create-new-app) · [Showcase](https://docs.skybridge.tech/showcase)
|
|
23
|
-
|
|
24
|
-
</div>
|
|
25
|
-
|
|
26
|
-
<br />
|
|
27
|
-
|
|
28
|
-
## ✨ Why Skybridge?
|
|
29
|
-
|
|
30
|
-
ChatGPT Apps and MCP Apps let you embed **rich, interactive UIs** directly in AI conversations. But the raw SDKs are low-level—no hooks, no type safety, no dev tools, and no HMR.
|
|
31
|
-
|
|
32
|
-
**Skybridge fixes that.**
|
|
33
|
-
|
|
34
|
-
| | |
|
|
35
|
-
|:--|:--|
|
|
36
|
-
| 👨💻 **Full Dev Environment** — HMR, debug traces, and local devtools. No more refresh loops. | ✅ **End-to-End Type Safety** — tRPC-style inference from server to widget. Autocomplete everywhere. |
|
|
37
|
-
| 🔄 **Widget-to-Model Sync** — Keep the model aware of UI state with `data-llm`. Dual surfaces, one source of truth. | ⚒️ **React Query-style Hooks** — `isPending`, `isError`, callbacks. State management you already know. |
|
|
38
|
-
| 🌐 **Platform Agnostic** — Write once, run anywhere. Works with ChatGPT (Apps SDK) and MCP-compatible clients. | 📦 **Showcase Examples** — Production-ready examples to learn from and build upon. |
|
|
39
|
-
|
|
40
|
-
<br />
|
|
41
|
-
|
|
42
|
-
## 🚀 Get Started
|
|
43
|
-
|
|
44
|
-
**Create a new app:**
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
npm create skybridge@latest
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**Or add to an existing project:**
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
npm i skybridge
|
|
54
|
-
yarn add skybridge
|
|
55
|
-
pnpm add skybridge
|
|
56
|
-
bun add skybridge
|
|
57
|
-
deno add skybridge
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
<div align="center">
|
|
61
|
-
|
|
62
|
-
**👉 [Read the Docs](https://docs.skybridge.tech) 👈**
|
|
63
|
-
|
|
64
|
-
</div>
|
|
65
|
-
|
|
66
|
-
<br />
|
|
67
|
-
|
|
68
|
-
## 📦 Architecture
|
|
69
|
-
|
|
70
|
-
Skybridge is a fullstack framework with unified server and client modules:
|
|
71
|
-
|
|
72
|
-
- **`skybridge/server`** — Define tools and widgets with full type inference. Extends the MCP SDK.
|
|
73
|
-
- **`skybridge/web`** — React hooks that consume your server types. Works with Apps SDK (ChatGPT) and MCP Apps.
|
|
74
|
-
- **Dev Environment** — Vite plugin with HMR, DevTools emulator, and optimized builds.
|
|
75
|
-
|
|
76
|
-
### Server
|
|
77
|
-
|
|
78
|
-
```ts
|
|
79
|
-
import { McpServer } from "skybridge/server";
|
|
80
|
-
|
|
81
|
-
server.registerWidget("flights", {}, {
|
|
82
|
-
inputSchema: { destination: z.string() },
|
|
83
|
-
}, async ({ destination }) => {
|
|
84
|
-
const flights = await searchFlights(destination);
|
|
85
|
-
return { structuredContent: { flights } };
|
|
86
|
-
});
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### Widget
|
|
90
|
-
|
|
91
|
-
```tsx
|
|
92
|
-
import { useToolInfo } from "skybridge/web";
|
|
93
|
-
|
|
94
|
-
function FlightsWidget() {
|
|
95
|
-
const { output } = useToolInfo();
|
|
96
|
-
|
|
97
|
-
return output.structuredContent.flights.map(flight =>
|
|
98
|
-
<FlightCard key={flight.id} flight={flight} />
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
<br />
|
|
104
|
-
|
|
105
|
-
## 🎯 Features at a Glance
|
|
106
|
-
|
|
107
|
-
- **Live Reload** — Vite HMR. See changes instantly without reinstalling.
|
|
108
|
-
- **Typed Hooks** — Full autocomplete for tools, inputs, outputs.
|
|
109
|
-
- **Widget → Tool Calls** — Trigger server actions from UI.
|
|
110
|
-
- **Dual Surface Sync** — Keep model aware of what users see with `data-llm`.
|
|
111
|
-
- **React Query-style API** — `isPending`, `isError`, callbacks.
|
|
112
|
-
- **Platform Agnostic** — Works with ChatGPT (Apps SDK) and MCP Apps clients (Goose, VSCode, etc.).
|
|
113
|
-
- **MCP Compatible** — Extends the official SDK. Works with any MCP client.
|
|
114
|
-
|
|
115
|
-
<br />
|
|
116
|
-
|
|
117
|
-
## 📖 Showcase
|
|
118
|
-
|
|
119
|
-
Explore production-ready examples:
|
|
120
|
-
|
|
121
|
-
| Example | Description | Demo | Code |
|
|
122
|
-
|---------|-------------|------|------|
|
|
123
|
-
| **Capitals Explorer** | Interactive world map with geolocation and Wikipedia integration | [Try Demo](https://capitals.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/capitals) |
|
|
124
|
-
| **Ecommerce Carousel** | Product carousel with cart, localization, and modals | [Try Demo](https://ecommerce.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/ecom-carousel) |
|
|
125
|
-
| **Everything** | Comprehensive playground showcasing all hooks and features | [Try Demo](https://everything.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/everything) |
|
|
126
|
-
|
|
127
|
-
See all examples in the [Showcase](https://docs.skybridge.tech/showcase) or browse the [examples/](examples/) directory.
|
|
128
|
-
|
|
129
|
-
<br />
|
|
130
|
-
|
|
131
|
-
<div align="center">
|
|
132
|
-
|
|
133
|
-
[](https://github.com/alpic-ai/skybridge/discussions)
|
|
134
|
-
[](https://github.com/alpic-ai/skybridge/issues)
|
|
135
|
-
[](https://discord.com/invite/gNAazGueab)
|
|
136
|
-
|
|
137
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions
|
|
138
|
-
|
|
139
|
-
<br />
|
|
140
|
-
|
|
141
|
-
**[MIT License](LICENSE)** · Made with ❤️ by **[Alpic](https://alpic.ai)**
|
|
142
|
-
|
|
143
|
-
</div>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Plugin } from "vite";
|
|
2
|
-
/**
|
|
3
|
-
* Transforms asset import paths to use the development server base URL.
|
|
4
|
-
*/
|
|
5
|
-
export declare function assetBaseUrlTransform(code: string, devServerOrigin: string): string;
|
|
6
|
-
/**
|
|
7
|
-
* Vite plugin that transforms asset import paths to use the development server base URL.
|
|
8
|
-
*/
|
|
9
|
-
export declare function assetBaseUrlTransformPlugin(options: {
|
|
10
|
-
devServerOrigin: string;
|
|
11
|
-
}): Plugin;
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Transforms asset import paths to use the development server base URL.
|
|
3
|
-
*/
|
|
4
|
-
export function assetBaseUrlTransform(code, devServerOrigin) {
|
|
5
|
-
const assetStringPattern = /(?<!https?:\/\/)(["'`])(\/[^"'`]+\.(svg|png|jpeg|jpg|gif|webp|mp3|mp4|woff|woff2|ttf|eot))\1/g;
|
|
6
|
-
code = code.replace(assetStringPattern, (match, quote, assetPath) => {
|
|
7
|
-
return `${quote}${devServerOrigin}${assetPath}${quote}`;
|
|
8
|
-
});
|
|
9
|
-
return code;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Vite plugin that transforms asset import paths to use the development server base URL.
|
|
13
|
-
*/
|
|
14
|
-
export function assetBaseUrlTransformPlugin(options) {
|
|
15
|
-
const { devServerOrigin } = options;
|
|
16
|
-
return {
|
|
17
|
-
name: "asset-base-url-transform",
|
|
18
|
-
enforce: "pre",
|
|
19
|
-
transform(code, id) {
|
|
20
|
-
if (!code) {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
const transformedCode = assetBaseUrlTransform(code, devServerOrigin);
|
|
24
|
-
if (transformedCode === code) {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
return {
|
|
28
|
-
code: transformedCode,
|
|
29
|
-
map: null,
|
|
30
|
-
};
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=asset-base-url-transform-plugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-base-url-transform-plugin.js","sourceRoot":"","sources":["../../src/server/asset-base-url-transform-plugin.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,eAAuB;IAEvB,MAAM,kBAAkB,GAAG,+FAA+F,CAAC;IAE3H,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAClE,OAAO,GAAG,KAAK,GAAG,eAAe,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAEC;IAED,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAEpC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QACd,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAErE,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,IAAI;aACV,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { assetBaseUrlTransform } from "./asset-base-url-transform-plugin.js";
|
|
3
|
-
describe("assetBaseUrlTransform", () => {
|
|
4
|
-
const devServerOrigin = "http://localhost:3000";
|
|
5
|
-
it("should transform asset paths in single, double, and backtick quotes", () => {
|
|
6
|
-
const cases = [
|
|
7
|
-
{
|
|
8
|
-
desc: "single-quoted",
|
|
9
|
-
code: `const image = '/assets/logo.png';`,
|
|
10
|
-
expected: `const image = '${devServerOrigin}/assets/logo.png';`
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
desc: "double-quoted",
|
|
14
|
-
code: `const image = "/assets/logo.png";`,
|
|
15
|
-
expected: `const image = "${devServerOrigin}/assets/logo.png";`
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
desc: "backtick-quoted",
|
|
19
|
-
code: "const image = `/assets/logo.png`;",
|
|
20
|
-
expected: `const image = \`${devServerOrigin}/assets/logo.png\`;`
|
|
21
|
-
},
|
|
22
|
-
];
|
|
23
|
-
for (const { desc, code, expected } of cases) {
|
|
24
|
-
const result = assetBaseUrlTransform(code, devServerOrigin);
|
|
25
|
-
expect(result).toBe(expected);
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
it("should transform multiple asset paths", () => {
|
|
29
|
-
const code = `
|
|
30
|
-
const logo = '/assets/logo.png';
|
|
31
|
-
const icon = '/assets/icon.svg';
|
|
32
|
-
const font = '/assets/font.woff2';
|
|
33
|
-
`;
|
|
34
|
-
const result = assetBaseUrlTransform(code, devServerOrigin);
|
|
35
|
-
expect(result).toContain(`${devServerOrigin}/assets/logo.png`);
|
|
36
|
-
expect(result).toContain(`${devServerOrigin}/assets/icon.svg`);
|
|
37
|
-
expect(result).toContain(`${devServerOrigin}/assets/font.woff2`);
|
|
38
|
-
});
|
|
39
|
-
it("should not transform already absolute URLs", () => {
|
|
40
|
-
const code = `
|
|
41
|
-
const local = '/assets/logo.png';
|
|
42
|
-
const http = 'http://example.com/image.png';
|
|
43
|
-
const https = 'https://example.com/image.png';
|
|
44
|
-
`;
|
|
45
|
-
const result = assetBaseUrlTransform(code, devServerOrigin);
|
|
46
|
-
expect(result).toContain(`${devServerOrigin}/assets/logo.png`);
|
|
47
|
-
expect(result).toContain("http://example.com/image.png");
|
|
48
|
-
expect(result).toContain("https://example.com/image.png");
|
|
49
|
-
});
|
|
50
|
-
it("should not transform code without asset paths", () => {
|
|
51
|
-
const code = `const text = "Hello World";`;
|
|
52
|
-
const result = assetBaseUrlTransform(code, devServerOrigin);
|
|
53
|
-
expect(result).toBe(code);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
//# sourceMappingURL=asset-base-url-transform-plugin.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-base-url-transform-plugin.test.js","sourceRoot":"","sources":["../../src/server/asset-base-url-transform-plugin.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,eAAe,GAAG,uBAAuB,CAAC;IAEhD,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,KAAK,GAAG;YACZ;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,kBAAkB,eAAe,oBAAoB;aAChE;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,kBAAkB,eAAe,oBAAoB;aAChE;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,mBAAmB,eAAe,qBAAqB;aAClE;SACF,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG;;;;KAIZ,CAAC;QACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,kBAAkB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,kBAAkB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,oBAAoB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG;;;;KAIZ,CAAC;QACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,kBAAkB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,6BAA6B,CAAC;QAC3C,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|