aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Erika <3019731+Princesseuh@users.noreply.github.com> 2024-01-26 18:22:56 -0500
committerGravatar GitHub <noreply@github.com> 2024-01-26 17:22:56 -0600
commit1885cea308a62b173a50967cf5a0b174b3c3f3f1 (patch)
tree72b3a51c94f434fffb3883b533fe033bce183f2d
parente4370e9e9dd862425eced25823c82e77d9516927 (diff)
downloadastro-1885cea308a62b173a50967cf5a0b174b3c3f3f1.tar.gz
astro-1885cea308a62b173a50967cf5a0b174b3c3f3f1.tar.zst
astro-1885cea308a62b173a50967cf5a0b174b3c3f3f1.zip
fix(toolbar): Fix loading third-party apps using absolute paths (#9834)
* fix(toolbar): Fix loading third-party apps using absolute paths * chore: changeset * fix: pass entrypoint correctly * Update .changeset/real-lamps-design.md --------- Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
-rw-r--r--.changeset/real-lamps-design.md5
-rw-r--r--packages/astro/e2e/dev-toolbar.test.js18
-rw-r--r--packages/astro/e2e/fixtures/dev-toolbar/astro.config.mjs3
-rw-r--r--packages/astro/e2e/fixtures/dev-toolbar/custom-integration.js17
-rw-r--r--packages/astro/e2e/fixtures/dev-toolbar/custom-plugin.js20
-rw-r--r--packages/astro/src/vite-plugin-dev-toolbar/vite-plugin-dev-toolbar.ts11
6 files changed, 70 insertions, 4 deletions
diff --git a/.changeset/real-lamps-design.md b/.changeset/real-lamps-design.md
new file mode 100644
index 000000000..ab1a3eea9
--- /dev/null
+++ b/.changeset/real-lamps-design.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes third-party dev toolbar apps not loading correctly when using absolute paths on Windows
diff --git a/packages/astro/e2e/dev-toolbar.test.js b/packages/astro/e2e/dev-toolbar.test.js
index 107c80b08..e54e0e154 100644
--- a/packages/astro/e2e/dev-toolbar.test.js
+++ b/packages/astro/e2e/dev-toolbar.test.js
@@ -215,4 +215,22 @@ test.describe('Dev Toolbar', () => {
const hideToolbar = settingsWindow.getByRole('heading', { name: 'Hide toolbar' });
await expect(hideToolbar).toBeVisible();
});
+
+ test('supports third-party apps', async ({ page, astro }) => {
+ await page.goto(astro.resolveUrl('/'));
+
+ const toolbar = page.locator('astro-dev-toolbar');
+ const appButton = toolbar.locator('button[data-app-id="my-plugin"]');
+ await appButton.click();
+
+ const myAppCanvas = toolbar.locator('astro-dev-toolbar-app-canvas[data-app-id="my-plugin"]');
+ console.log(await myAppCanvas.innerHTML());
+ const myAppWindow = myAppCanvas.locator('astro-dev-toolbar-window');
+ await expect(myAppWindow).toHaveCount(1);
+ await expect(myAppWindow).toBeVisible();
+
+ // Toggle app off
+ await appButton.click();
+ await expect(myAppWindow).not.toBeVisible();
+ });
});
diff --git a/packages/astro/e2e/fixtures/dev-toolbar/astro.config.mjs b/packages/astro/e2e/fixtures/dev-toolbar/astro.config.mjs
index d24b4cc9a..c0af89b1c 100644
--- a/packages/astro/e2e/fixtures/dev-toolbar/astro.config.mjs
+++ b/packages/astro/e2e/fixtures/dev-toolbar/astro.config.mjs
@@ -1,5 +1,6 @@
import preact from '@astrojs/preact';
+import { myIntegration } from './custom-integration.js';
export default {
- integrations: [preact()],
+ integrations: [preact(), myIntegration()],
};
diff --git a/packages/astro/e2e/fixtures/dev-toolbar/custom-integration.js b/packages/astro/e2e/fixtures/dev-toolbar/custom-integration.js
new file mode 100644
index 000000000..2f29391f0
--- /dev/null
+++ b/packages/astro/e2e/fixtures/dev-toolbar/custom-integration.js
@@ -0,0 +1,17 @@
+import { dirname, join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+/** @type {() => import('astro').AstroIntegration} */
+export function myIntegration() {
+ return {
+ name: 'my-integration',
+ hooks: {
+ 'astro:config:setup': ({ addDevToolbarApp }) => {
+ const importPath = dirname(fileURLToPath(import.meta.url));
+ const pluginPath = join(importPath, 'custom-plugin.js');
+
+ addDevToolbarApp(pluginPath);
+ },
+ },
+ };
+}
diff --git a/packages/astro/e2e/fixtures/dev-toolbar/custom-plugin.js b/packages/astro/e2e/fixtures/dev-toolbar/custom-plugin.js
new file mode 100644
index 000000000..42340b1ff
--- /dev/null
+++ b/packages/astro/e2e/fixtures/dev-toolbar/custom-plugin.js
@@ -0,0 +1,20 @@
+export default {
+ id: 'my-plugin',
+ name: 'My Plugin',
+ icon: 'astro:logo',
+ init(canvas) {
+ const astroWindow = document.createElement('astro-dev-toolbar-window');
+ const myButton = document.createElement('astro-dev-toolbar-button');
+ myButton.size = 'medium';
+ myButton.buttonStyle = 'purple';
+ myButton.innerText = 'Click me!';
+
+ myButton.addEventListener('click', () => {
+ console.log('Clicked!');
+ });
+
+ astroWindow.appendChild(myButton);
+
+ canvas.appendChild(astroWindow);
+ },
+};
diff --git a/packages/astro/src/vite-plugin-dev-toolbar/vite-plugin-dev-toolbar.ts b/packages/astro/src/vite-plugin-dev-toolbar/vite-plugin-dev-toolbar.ts
index 1c2d53e1c..b4b0c3d0c 100644
--- a/packages/astro/src/vite-plugin-dev-toolbar/vite-plugin-dev-toolbar.ts
+++ b/packages/astro/src/vite-plugin-dev-toolbar/vite-plugin-dev-toolbar.ts
@@ -65,13 +65,18 @@ export default function astroDevToolbar({ settings, logger }: AstroPluginOptions
return `
export const loadDevToolbarApps = async () => {
return (await Promise.all([${settings.devToolbarApps
- .map((plugin) => `safeLoadPlugin(${JSON.stringify(plugin)})`)
+ .map(
+ (plugin) =>
+ `safeLoadPlugin(async () => (await import(${JSON.stringify(
+ plugin
+ )})).default, ${JSON.stringify(plugin)})`
+ )
.join(',')}])).filter(app => app);
};
- async function safeLoadPlugin(entrypoint) {
+ async function safeLoadPlugin(importEntrypoint, entrypoint) {
try {
- const app = (await import(/* @vite-ignore */ entrypoint)).default;
+ const app = await importEntrypoint();
if (typeof app !== 'object' || !app.id || !app.name) {
throw new Error("Apps must default export an object with an id, and a name.");