astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
88 lines (87 loc) • 2.5 kB
JavaScript
import { shouldAppendForwardSlash } from "../core/build/util.js";
import {
NOOP_ACTIONS,
RESOLVED_VIRTUAL_INTERNAL_MODULE_ID,
RESOLVED_VIRTUAL_MODULE_ID,
VIRTUAL_INTERNAL_MODULE_ID,
VIRTUAL_MODULE_ID
} from "./consts.js";
import { isActionsFilePresent } from "./utils.js";
function vitePluginUserActions({ settings }) {
let resolvedActionsId;
return {
name: "@astro/plugin-actions",
async resolveId(id) {
if (id === NOOP_ACTIONS) {
return NOOP_ACTIONS;
}
if (id === VIRTUAL_INTERNAL_MODULE_ID) {
const resolvedModule = await this.resolve(
`${decodeURI(new URL("actions", settings.config.srcDir).pathname)}`
);
if (!resolvedModule) {
return NOOP_ACTIONS;
}
resolvedActionsId = resolvedModule.id;
return RESOLVED_VIRTUAL_INTERNAL_MODULE_ID;
}
},
load(id) {
if (id === NOOP_ACTIONS) {
return "export const server = {}";
} else if (id === RESOLVED_VIRTUAL_INTERNAL_MODULE_ID) {
return `export { server } from '${resolvedActionsId}';`;
}
}
};
}
function vitePluginActions({
fs,
settings
}) {
return {
name: VIRTUAL_MODULE_ID,
enforce: "pre",
resolveId(id) {
if (id === VIRTUAL_MODULE_ID) {
return RESOLVED_VIRTUAL_MODULE_ID;
}
},
async configureServer(server) {
const filePresentOnStartup = await isActionsFilePresent(fs, settings.config.srcDir);
async function watcherCallback() {
const filePresent = await isActionsFilePresent(fs, settings.config.srcDir);
if (filePresentOnStartup !== filePresent) {
server.restart();
}
}
server.watcher.on("add", watcherCallback);
server.watcher.on("change", watcherCallback);
},
async load(id, opts) {
if (id !== RESOLVED_VIRTUAL_MODULE_ID) return;
let code = await fs.promises.readFile(
new URL("../../templates/actions.mjs", import.meta.url),
"utf-8"
);
if (opts?.ssr) {
code += `
export * from 'astro/actions/runtime/virtual/server.js';`;
} else {
code += `
export * from 'astro/actions/runtime/virtual/client.js';`;
}
code = code.replace(
"'/** @TRAILING_SLASH@ **/'",
JSON.stringify(
shouldAppendForwardSlash(settings.config.trailingSlash, settings.config.build.format)
)
);
return code;
}
};
}
export {
vitePluginActions,
vitePluginUserActions
};