diff --git a/packages/stacks-svelte/README.md b/packages/stacks-svelte/README.md index 0ac20d08e9..6b0b5fcb5d 100644 --- a/packages/stacks-svelte/README.md +++ b/packages/stacks-svelte/README.md @@ -4,6 +4,11 @@ This package is an implementation of the [Stacks Design System](https://stackove [Documentation](https://svelte.stackoverflow.design) +The documentation hosting contract uses `main` for +`svelte.stackoverflow.design` and `v2` for +`v2.svelte.stackoverflow.design`. The former beta domain redirects to the +current documentation. + ## Installation Stacks Svelte can be installed via npm: diff --git a/packages/stacks-svelte/netlify.toml b/packages/stacks-svelte/netlify.toml index 9c731442af..813a2bc909 100644 --- a/packages/stacks-svelte/netlify.toml +++ b/packages/stacks-svelte/netlify.toml @@ -11,3 +11,9 @@ # variable through the Netlify UI otherwise netlify won't be able to clone the repo due to all our images. # https://docs.netlify.com/build/configure-builds/environment-variables/#netlify-configuration-variables GIT_LFS_ENABLED = "true" # just here as a reminder + +[[redirects]] + from = "https://beta.svelte.stackoverflow.design/*" + to = "https://svelte.stackoverflow.design/:splat" + status = 301 + force = true diff --git a/packages/stacks-svelte/tools/netlify-config.test.js b/packages/stacks-svelte/tools/netlify-config.test.js new file mode 100644 index 0000000000..81759a021a --- /dev/null +++ b/packages/stacks-svelte/tools/netlify-config.test.js @@ -0,0 +1,20 @@ +import { readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import assert from "node:assert"; +import { describe, test } from "node:test"; + +const toolsDirectory = dirname(fileURLToPath(import.meta.url)); +const netlifyConfig = readFileSync( + join(toolsDirectory, "..", "netlify.toml"), + "utf8" +); + +describe("Netlify configuration", () => { + test("redirects the beta hostname to the current documentation", () => { + assert.match( + netlifyConfig, + /\[\[redirects\]\][\s\S]*from = "https:\/\/beta\.svelte\.stackoverflow\.design\/\*"[\s\S]*to = "https:\/\/svelte\.stackoverflow\.design\/:splat"[\s\S]*status = 301[\s\S]*force = true/ + ); + }); +}); diff --git a/packages/stacks-svelte/tools/storybook-llms-extractor.js b/packages/stacks-svelte/tools/storybook-llms-extractor.js index c1042233c3..87f02de156 100755 --- a/packages/stacks-svelte/tools/storybook-llms-extractor.js +++ b/packages/stacks-svelte/tools/storybook-llms-extractor.js @@ -21,7 +21,10 @@ import process from "node:process"; const __dirname = dirname(fileURLToPath(import.meta.url)); function getCurrentBranch() { - return execSync("git branch --show-current", { encoding: "utf-8" }).trim(); + return ( + process.env.BRANCH ?? + execSync("git branch --show-current", { encoding: "utf-8" }).trim() + ); } const currentBranch = getCurrentBranch(); @@ -34,6 +37,8 @@ const CONFIG = { }; const { distPath, summaryBaseUrl, summaryTitle, summaryDescription } = CONFIG; +export { summaryBaseUrl }; + export function parseStorybookIndex(distPath) { const content = readFileSync(join(distPath, "index.json"), "utf-8"); return JSON.parse(content); @@ -366,7 +371,7 @@ function findSubcomponents(componentPath) { })); } -function generateDocs(groups) { +export function generateDocs(groups) { let md = `# ${summaryTitle}\n\n${summaryDescription}\n\n`; md += `> Generated Storybook documentation optimized for LLM consumption.\n\n---\n\n## Table of Contents\n\n`; diff --git a/packages/stacks-svelte/tools/storybook-llms-extractor.test.js b/packages/stacks-svelte/tools/storybook-llms-extractor.test.js index 4f35b70d3e..e074eeac61 100644 --- a/packages/stacks-svelte/tools/storybook-llms-extractor.test.js +++ b/packages/stacks-svelte/tools/storybook-llms-extractor.test.js @@ -7,10 +7,38 @@ import { extractPropsFromInterface, extractPropsFromExports, extractStoryExamples, + generateDocs, parseArgsTable, + summaryBaseUrl, } from "./storybook-llms-extractor.js"; describe("Storybook LLM Extractor", () => { + test("uses the current documentation hostname", () => { + assert.strictEqual( + summaryBaseUrl, + "https://svelte.stackoverflow.design" + ); + }); + + test("generates current documentation and story links", () => { + const result = generateDocs([ + { + title: "Components/Button", + docs: { id: "components-button--docs" }, + stories: [{ id: "components-button--base", name: "Base" }], + }, + ]); + + assert.match( + result, + /https:\/\/svelte\.stackoverflow\.design\/\?path=\/docs\/components-button--docs/ + ); + assert.match( + result, + /https:\/\/svelte\.stackoverflow\.design\/\?path=\/story\/components-button--base/ + ); + }); + describe("cleanJSDoc", () => { test("should remove JSDoc asterisks and trim whitespace", () => { const input = `