91 lines
2.6 KiB
Plaintext
91 lines
2.6 KiB
Plaintext
|
import { telemetry } from "../events/index.js";
|
||
|
import { eventAppToggled } from "../events/toolbar.js";
|
||
|
const VIRTUAL_MODULE_ID = "astro:dev-toolbar";
|
||
|
const resolvedVirtualModuleId = "\0" + VIRTUAL_MODULE_ID;
|
||
|
function astroDevToolbar({ settings, logger }) {
|
||
|
let telemetryTimeout;
|
||
|
return {
|
||
|
name: "astro:dev-toolbar",
|
||
|
config() {
|
||
|
return {
|
||
|
optimizeDeps: {
|
||
|
// Optimize CJS dependencies used by the dev toolbar
|
||
|
include: ["astro > aria-query", "astro > axobject-query"]
|
||
|
}
|
||
|
};
|
||
|
},
|
||
|
resolveId(id) {
|
||
|
if (id === VIRTUAL_MODULE_ID) {
|
||
|
return resolvedVirtualModuleId;
|
||
|
}
|
||
|
},
|
||
|
configureServer(server) {
|
||
|
server.ws.on("astro:devtoolbar:error:load", (args) => {
|
||
|
logger.error(
|
||
|
"toolbar",
|
||
|
`Failed to load dev toolbar app from ${args.entrypoint}: ${args.error}`
|
||
|
);
|
||
|
});
|
||
|
server.ws.on("astro:devtoolbar:error:init", (args) => {
|
||
|
logger.error(
|
||
|
"toolbar",
|
||
|
`Failed to initialize dev toolbar app ${args.app.name} (${args.app.id}):
|
||
|
${args.error}`
|
||
|
);
|
||
|
});
|
||
|
server.ws.on("astro:devtoolbar:app:toggled", (args) => {
|
||
|
clearTimeout(telemetryTimeout);
|
||
|
telemetryTimeout = setTimeout(() => {
|
||
|
let nameToRecord = args?.app?.id;
|
||
|
if (!nameToRecord || !nameToRecord.startsWith("astro:")) {
|
||
|
nameToRecord = "other";
|
||
|
}
|
||
|
telemetry.record(
|
||
|
eventAppToggled({
|
||
|
appName: nameToRecord
|
||
|
})
|
||
|
);
|
||
|
}, 200);
|
||
|
});
|
||
|
},
|
||
|
async load(id) {
|
||
|
if (id === resolvedVirtualModuleId) {
|
||
|
return `
|
||
|
export const loadDevToolbarApps = async () => {
|
||
|
return (await Promise.all([${settings.devToolbarApps.map(
|
||
|
(plugin) => `safeLoadPlugin(async () => (await import(${JSON.stringify(
|
||
|
plugin
|
||
|
)})).default, ${JSON.stringify(plugin)})`
|
||
|
).join(",")}])).filter(app => app);
|
||
|
};
|
||
|
|
||
|
async function safeLoadPlugin(importEntrypoint, entrypoint) {
|
||
|
try {
|
||
|
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.");
|
||
|
}
|
||
|
|
||
|
return app;
|
||
|
} catch (err) {
|
||
|
console.error(\`Failed to load dev toolbar app from \${entrypoint}: \${err.message}\`);
|
||
|
|
||
|
if (import.meta.hot) {
|
||
|
import.meta.hot.send('astro:devtoolbar:error:load', { entrypoint: entrypoint, error: err.message })
|
||
|
}
|
||
|
|
||
|
return undefined;
|
||
|
}
|
||
|
|
||
|
return undefined;
|
||
|
}
|
||
|
`;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
export {
|
||
|
astroDevToolbar as default
|
||
|
};
|