full-stack-svelte-kit
Version:
This framework is built on top of `@sveltejs/kit`.
94 lines (74 loc) • 2.56 kB
JavaScript
import checkKeywords from "./keywords.js";
import routeHelper from "./routeHelper.js";
import loadFunction from "./template/loadFunction.js";
import metadata from "./template/metadata.js";
import ssrContent from "./template/ssrContent.js";
import {
getScripts,
writeFileIfChanged,
getGeneratedManifestFromFile,
} from "./utils.js";
export default function () {
getGeneratedManifestFromFile();
/** @type {import('svelte/types/compiler/preprocess').PreprocessorGroup} */
return {
/** @type {import('svelte/types/compiler/preprocess').Preprocessor} */
markup: ({ filename, content }) => {
const regex = /<script([^>]*?)>([\s\S]+?)<\/script>/gm;
// Only check for files within routes
if (
!filename ||
!filename.includes("/routes") ||
filename.startsWith("_")
)
return { code: content };
// Get all the scripts within the markup
const scripts = getScripts(content, regex);
const ssr_module_script = scripts.find(
(s) => s.attrs.context === "module" && s.attrs.ssr
);
const dom_module_script = scripts.find(
(s) => s.attrs.context === "module" && !s.attrs.ssr
);
if (!ssr_module_script && !dom_module_script) {
return {
code: content,
};
}
let scriptsIndex = 0;
const { hasAction, hasLoad, hasMetaFn } = checkKeywords({
ssr_content: ssr_module_script.content,
});
let code = content.replace(regex, (_, _attrs, _content) => {
const script = scripts[scriptsIndex++];
if (dom_module_script && script === dom_module_script) {
_ = "";
}
if (script === ssr_module_script) {
let ssr_content = ssr_module_script.content;
let usesTS = ssr_module_script.attrs?.lang === "ts";
ssr_content = ssrContent({
ssr_content,
hasLoad,
hasAction,
usesTS,
hasMetaFn,
});
const { fileToWrite, routesName } = routeHelper({ filename, script });
writeFileIfChanged(fileToWrite, ssr_content);
return loadFunction({
content: _,
dom_module_script_content: dom_module_script?.content,
routesName,
hasLoad,
});
}
return _;
});
code = metadata({ hasMetaFn, code });
return {
code,
};
},
};
}