@storybook/svelte
Version:
Storybook Svelte renderer: Develop, document, and test UI components in isolation.
91 lines (87 loc) • 3.52 kB
JavaScript
import CJS_COMPAT_NODE_URL_yx1i39d6a5l from 'node:url';
import CJS_COMPAT_NODE_PATH_yx1i39d6a5l from 'node:path';
import CJS_COMPAT_NODE_MODULE_yx1i39d6a5l from "node:module";
var __filename = CJS_COMPAT_NODE_URL_yx1i39d6a5l.fileURLToPath(import.meta.url);
var __dirname = CJS_COMPAT_NODE_PATH_yx1i39d6a5l.dirname(__filename);
var require = CJS_COMPAT_NODE_MODULE_yx1i39d6a5l.createRequire(import.meta.url);
// ------------------------------------------------------------
// end of CJS compatibility banner, injected by Storybook's esbuild configuration
// ------------------------------------------------------------
// src/parsers/svelteImportParser.ts
import {
ChangeDetectionFailureError
} from "storybook/internal/core-server";
var svelteCompilerPromise;
async function getSvelteCompiler() {
return svelteCompilerPromise || (svelteCompilerPromise = import("svelte/compiler").catch((error) => {
throw svelteCompilerPromise = void 0, new ChangeDetectionFailureError(
`Failed to load 'svelte/compiler'; is 'svelte' installed? Original error: ${error instanceof Error ? error.message : String(error)}`,
error instanceof Error ? { cause: error } : void 0
);
})), svelteCompilerPromise;
}
function readLangFromAttributes(attributes) {
if (Array.isArray(attributes)) {
for (let attr of attributes)
if (attr.name === "lang") {
if (attr.value === !0)
return;
if (Array.isArray(attr.value) && attr.value.length > 0) {
let first = attr.value[0];
if (typeof first?.data == "string")
return first.data;
}
return;
}
}
}
function extractScriptSource(source, script) {
let range = script?.content;
if (!range || typeof range.start != "number" || typeof range.end != "number" || range.start < 0 || range.end > source.length || range.end <= range.start)
return;
let lang = readLangFromAttributes(script?.attributes);
return { scriptSource: source.slice(range.start, range.end), lang };
}
function virtualExtensionForLang(lang) {
switch (lang) {
case "ts":
return "ts";
case "tsx":
return "tsx";
case "jsx":
return "jsx";
default:
return "js";
}
}
var svelteImportParser = {
extensions: [".svelte"],
async parse({ filePath, source }, ctx) {
let compiler = await getSvelteCompiler(), ast;
try {
ast = compiler.parse(source, { filename: filePath, modern: !0 });
} catch (error) {
throw new ChangeDetectionFailureError(
`svelte/compiler failed to parse ${filePath}: ${error instanceof Error ? error.message : String(error)}`,
error instanceof Error ? { cause: error } : void 0
);
}
let root = ast ?? {}, scripts = [], moduleResult = extractScriptSource(source, root.module);
moduleResult !== void 0 && scripts.push(moduleResult);
let instanceResult = extractScriptSource(source, root.instance);
if (instanceResult !== void 0 && scripts.push(instanceResult), scripts.length === 0)
return [];
let edges = [], seen = /* @__PURE__ */ new Set();
for (let { scriptSource, lang } of scripts) {
let ext = virtualExtensionForLang(lang), virtualFilePath = `${filePath}.script.${ext}`, scriptEdges = await ctx.parseScriptWithOxc(scriptSource, virtualFilePath);
for (let edge of scriptEdges) {
let key = `${edge.kind}:${edge.specifier}`;
seen.has(key) || (seen.add(key), edges.push(edge));
}
}
return edges;
}
};
export {
svelteImportParser
};