UNPKG

@storybook/svelte

Version:

Storybook Svelte renderer: Develop, document, and test UI components in isolation.

91 lines (87 loc) 3.52 kB
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 };