tanstack-start-sitemap 0.0.1 β†’ 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,17 +1,60 @@
1
- # React Component Library Template
1
+ # Tanstack start Sitemap Plugin
2
2
 
3
- A robust and customizable React component library template built with modern tools and best practices. Ideal for developers looking to create reusable UI components with ease.
3
+ A Tanstack start plugin that generates a `sitemap.xml` file during the build process by reading a route tree file and extracting the routes. This plugin makes it easy to maintain your website’s sitemap based on your application's routing configuration.
4
4
 
5
- ## πŸš€ Features
5
+ ## Features
6
6
 
7
- - **Storybook**: Interactive UI component explorer and documentation.
8
- - **Tailwind CSS**: Utility-first CSS framework for rapid UI development.
9
- - **ShadCN**: Accessible and customizable component primitives.
10
- - **Playwright**: End-to-end testing for reliable and maintainable tests.
11
- - **Dark Mode Toggle**: Easily switch between light and dark themes for testing.
12
- - **ESM & CJS Support**: Generates both ES Modules and CommonJS for maximum compatibility.
13
- - **Typescript Support**: Generates properly .d.ts.
14
- - **Structured Folder Layout**: Organized directory structure for scalability and maintainability.
15
- - **Example Folder**: Contains example usage of components with a simple setup.
7
+ - **Automatic Sitemap Generation:** Automatically creates a `sitemap.xml` during the build process.
8
+ - **Customizable Options:** Configure per-route settings such as `changefreq`, `priority`, and `lastmod`.
16
9
 
10
+ ## Installation
17
11
 
12
+ ### Using pnpm
13
+
14
+ ```bash
15
+ pnpm add -D tanstack-start-sitemap
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ Add the plugin to your tanstack start configuration `app.config.ts`:
21
+
22
+ ```ts
23
+ // app.config.ts
24
+ import { defineConfig } from 'vite';
25
+ import { sitemapPlugin } from './plugins/vite-sitemap-plugin';
26
+
27
+ export default defineConfig({
28
+ vite: {
29
+ plugins: [
30
+ tsConfigPaths({
31
+ projects: ["./tsconfig.json"],
32
+ }),
33
+ sitemapPlugin({
34
+ hostname: 'https://example.com',
35
+
36
+ }),
37
+ ],
38
+ },
39
+
40
+ });
41
+ ```
42
+
43
+ ## Plugin Options
44
+
45
+ | Option | Type | Default | Description |
46
+ | -------------------- | --------------------------------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------- |
47
+ | `hostname` | `string` | **Required** | The base URL of your site (e.g., `https://example.com`). |
48
+ | `routeTreePath` | `string` | `'app/routeTree.gen.ts'` | The path to your route tree file. The plugin will search several possible paths to locate it. |
49
+ | `routes` | `{ [key: string]: { changefreq?: string; priority?: number; lastmod?: string } }` | `{}` | Per-route configuration that allows overriding default settings for specific routes. |
50
+ | `defaultChangefreq` | `'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'` | `'weekly'` | The default change frequency applied to routes that don't have an override. |
51
+ | `defaultPriority` | `number` | `0.5` | The default priority applied to routes that don't have an override. |
52
+
53
+ ## Troubleshooting
54
+
55
+ - **Route Tree File Not Found:**
56
+ Ensure that the path provided in `routeTreePath` is correct or that your file exists in one of the expected locations.
57
+
58
+ ## License
59
+
60
+ This project is licensed under the [MIT License](LICENSE).
package/dist/index.cjs.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=n=>{const s=n.match(/ROUTE_MANIFEST_START([\s\S]*?)ROUTE_MANIFEST_END/);if(!s)return[];try{const e=JSON.parse(s[1]);return Object.keys(e.routes).filter(t=>t!=="__root__").map(t=>t==="/"?t:t.replace(/\/$/,""))}catch(e){return console.error("Error parsing route manifest:",e),[]}},T=n=>{const{hostname:s,routeTreePath:e="app/routeTree.gen.ts",routes:t={},defaultChangefreq:f="weekly",defaultPriority:d=.5}=n;return{name:"vite-plugin-sitemap",apply:"build",closeBundle:async()=>{try{const{promises:r}=await Promise.resolve().then(()=>m),{resolve:u}=await Promise.resolve().then(()=>m),p=[e,`src/${e}`,`${process.cwd()}/${e}`,`${process.cwd()}/src/${e}`];let a=null,i=null;for(const o of p)try{a=await r.readFile(o,"utf-8"),i=o;break}catch{}if(!a||!i)throw new Error(`Could not find route tree file. Tried the following paths:
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=n=>{const s=n.match(/ROUTE_MANIFEST_START([\s\S]*?)ROUTE_MANIFEST_END/);if(!s)return[];try{const e=JSON.parse(s[1]);return Object.keys(e.routes).filter(t=>t!=="__root__").map(t=>t==="/"?t:t.replace(/\/$/,""))}catch(e){return console.error("Error parsing route manifest:",e),[]}},T=n=>{const{hostname:s,routeTreePath:e="routeTree.gen.ts",routes:t={},defaultChangefreq:f="weekly",defaultPriority:d=.5}=n;return{name:"vite-plugin-sitemap",apply:"build",closeBundle:async()=>{try{const{promises:r}=await Promise.resolve().then(()=>m),{resolve:u}=await Promise.resolve().then(()=>m),p=[e,`src/${e}`,`${process.cwd()}/${e}`,`${process.cwd()}/src/${e}`];let a=null,i=null;for(const o of p)try{a=await r.readFile(o,"utf-8"),i=o;break}catch{}if(!a||!i)throw new Error(`Could not find route tree file. Tried the following paths:
2
2
  ${p.join(`
3
3
  `)}`);console.log(`Found route tree at: ${i}`);const g=y(a),h=new Date().toISOString().split("T")[0],w=`<?xml version="1.0" encoding="UTF-8"?>
4
4
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/lib/gen-sitemap.ts"],"sourcesContent":["// vite-sitemap-plugin.ts\nimport type { Plugin } from \"vite\";\n\nexport interface SitemapOptions {\n hostname: string;\n routeTreePath?: string;\n routes?: {\n [key: string]: {\n changefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n priority?: number;\n lastmod?: string;\n };\n };\n defaultChangefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n defaultPriority?: number;\n}\n\nconst extractRoutesFromManifest = (content: string): string[] => {\n const manifestMatch = content.match(\n /ROUTE_MANIFEST_START([\\s\\S]*?)ROUTE_MANIFEST_END/\n );\n if (!manifestMatch) return [];\n\n try {\n const manifest = JSON.parse(manifestMatch[1]);\n return Object.keys(manifest.routes)\n .filter((route) => route !== \"__root__\")\n .map((route) => (route === \"/\" ? route : route.replace(/\\/$/, \"\")));\n } catch (e) {\n console.error(\"Error parsing route manifest:\", e);\n return [];\n }\n};\n\nexport const sitemapPlugin = (options: SitemapOptions): Plugin => {\n const {\n hostname,\n routeTreePath = \"app/routeTree.gen.ts\",\n routes = {},\n defaultChangefreq = \"weekly\",\n defaultPriority = 0.5,\n } = options;\n\n return {\n name: \"vite-plugin-sitemap\",\n apply: \"build\",\n closeBundle: async () => {\n try {\n // Dynamically import Node built-in modules to avoid bundling issues\n const { promises: fsPromises } = await import(\"fs\");\n const { resolve } = await import(\"path\");\n\n const possiblePaths = [\n routeTreePath,\n `src/${routeTreePath}`,\n `${process.cwd()}/${routeTreePath}`,\n `${process.cwd()}/src/${routeTreePath}`,\n ];\n\n let routeTreeContent: string | null = null;\n let foundPath: string | null = null;\n\n // Attempt to read the route tree file from the possible paths\n for (const testPath of possiblePaths) {\n try {\n routeTreeContent = await fsPromises.readFile(testPath, \"utf-8\");\n foundPath = testPath;\n break;\n } catch {\n // Try the next path if this one fails\n }\n }\n\n if (!routeTreeContent || !foundPath) {\n throw new Error(\n `Could not find route tree file. Tried the following paths:\\n${possiblePaths.join(\n \"\\n\"\n )}`\n );\n }\n\n console.log(`Found route tree at: ${foundPath}`);\n\n const allRoutes = extractRoutesFromManifest(routeTreeContent);\n const today = new Date().toISOString().split(\"T\")[0];\n\n const sitemapContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${allRoutes\n .map((route) => {\n const routeConfig = routes[route] || {};\n return ` <url>\n <loc>${hostname}${route}</loc>\n <lastmod>${routeConfig.lastmod || today}</lastmod>\n <changefreq>${routeConfig.changefreq || defaultChangefreq}</changefreq>\n <priority>${routeConfig.priority || defaultPriority}</priority>\n </url>`;\n })\n .join(\"\\n\")}\n</urlset>`;\n\n const publicDir = resolve(process.cwd(), \"public\");\n\n // Ensure the public directory exists\n try {\n await fsPromises.access(publicDir);\n } catch {\n await fsPromises.mkdir(publicDir, { recursive: true });\n }\n\n // Write the sitemap.xml file to the public directory\n await fsPromises.writeFile(\n resolve(publicDir, \"sitemap.xml\"),\n sitemapContent\n );\n\n console.log(\"βœ“ Sitemap generated successfully\");\n } catch (error) {\n console.error(\"Error generating sitemap:\", error);\n }\n },\n };\n};\n\nexport default sitemapPlugin;\n"],"names":["extractRoutesFromManifest","content","manifestMatch","manifest","route","sitemapPlugin","options","hostname","routeTreePath","routes","defaultChangefreq","defaultPriority","fsPromises","__viteBrowserExternal","resolve","possiblePaths","routeTreeContent","foundPath","testPath","allRoutes","today","sitemapContent","routeConfig","publicDir","error"],"mappings":"gFA+BA,MAAMA,EAA6BC,GAA8B,CAC/D,MAAMC,EAAgBD,EAAQ,MAC5B,kDACF,EACI,GAAA,CAACC,EAAe,MAAO,CAAC,EAExB,GAAA,CACF,MAAMC,EAAW,KAAK,MAAMD,EAAc,CAAC,CAAC,EACrC,OAAA,OAAO,KAAKC,EAAS,MAAM,EAC/B,OAAQC,GAAUA,IAAU,UAAU,EACtC,IAAKA,GAAWA,IAAU,IAAMA,EAAQA,EAAM,QAAQ,MAAO,EAAE,CAAE,QAC7D,EAAG,CACF,eAAA,MAAM,gCAAiC,CAAC,EACzC,CAAC,CAAA,CAEZ,EAEaC,EAAiBC,GAAoC,CAC1D,KAAA,CACJ,SAAAC,EACA,cAAAC,EAAgB,uBAChB,OAAAC,EAAS,CAAC,EACV,kBAAAC,EAAoB,SACpB,gBAAAC,EAAkB,EAAA,EAChBL,EAEG,MAAA,CACL,KAAM,sBACN,MAAO,QACP,YAAa,SAAY,CACnB,GAAA,CAEF,KAAM,CAAE,SAAUM,CAAe,EAAA,MAAM,QAAW,QAAA,EAAA,KAAA,IAAAC,CAAA,EAC5C,CAAE,QAAAC,CAAY,EAAA,MAAM,QAAa,QAAA,EAAA,KAAA,IAAAD,CAAA,EAEjCE,EAAgB,CACpBP,EACA,OAAOA,CAAa,GACpB,GAAG,QAAQ,IAAK,CAAA,IAAIA,CAAa,GACjC,GAAG,QAAQ,KAAK,QAAQA,CAAa,EACvC,EAEA,IAAIQ,EAAkC,KAClCC,EAA2B,KAG/B,UAAWC,KAAYH,EACjB,GAAA,CACFC,EAAmB,MAAMJ,EAAW,SAASM,EAAU,OAAO,EAClDD,EAAAC,EACZ,KAAA,MACM,CAAA,CAKN,GAAA,CAACF,GAAoB,CAACC,EACxB,MAAM,IAAI,MACR;AAAA,EAA+DF,EAAc,KAC3E;AAAA,CAAA,CACD,EACH,EAGM,QAAA,IAAI,wBAAwBE,CAAS,EAAE,EAEzC,MAAAE,EAAYnB,EAA0BgB,CAAgB,EACtDI,MAAY,KAAK,EAAE,cAAc,MAAM,GAAG,EAAE,CAAC,EAE7CC,EAAiB;AAAA;AAAA,EAE7BF,EACC,IAAKf,GAAU,CACd,MAAMkB,EAAcb,EAAOL,CAAK,GAAK,CAAC,EAC/B,MAAA;AAAA,WACAG,CAAQ,GAAGH,CAAK;AAAA,eACZkB,EAAY,SAAWF,CAAK;AAAA,kBACzBE,EAAY,YAAcZ,CAAiB;AAAA,gBAC7CY,EAAY,UAAYX,CAAe;AAAA,SAAA,CAEpD,EACA,KAAK;AAAA,CAAI,CAAC;AAAA,WAGCY,EAAYT,EAAQ,QAAQ,IAAA,EAAO,QAAQ,EAG7C,GAAA,CACI,MAAAF,EAAW,OAAOW,CAAS,CAAA,MAC3B,CACN,MAAMX,EAAW,MAAMW,EAAW,CAAE,UAAW,GAAM,CAAA,CAIvD,MAAMX,EAAW,UACfE,EAAQS,EAAW,aAAa,EAChCF,CACF,EAEA,QAAQ,IAAI,kCAAkC,QACvCG,EAAO,CACN,QAAA,MAAM,4BAA6BA,CAAK,CAAA,CAClD,CAEJ,CACF"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/lib/gen-sitemap.ts"],"sourcesContent":["// vite-sitemap-plugin.ts\nimport type { Plugin } from \"vite\";\n\nexport interface SitemapOptions {\n hostname: string;\n routeTreePath?: string;\n routes?: {\n [key: string]: {\n changefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n priority?: number;\n lastmod?: string;\n };\n };\n defaultChangefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n defaultPriority?: number;\n}\n\nconst extractRoutesFromManifest = (content: string): string[] => {\n const manifestMatch = content.match(\n /ROUTE_MANIFEST_START([\\s\\S]*?)ROUTE_MANIFEST_END/\n );\n if (!manifestMatch) return [];\n\n try {\n const manifest = JSON.parse(manifestMatch[1]);\n return Object.keys(manifest.routes)\n .filter((route) => route !== \"__root__\")\n .map((route) => (route === \"/\" ? route : route.replace(/\\/$/, \"\")));\n } catch (e) {\n console.error(\"Error parsing route manifest:\", e);\n return [];\n }\n};\n\nexport const sitemapPlugin = (options: SitemapOptions): Plugin => {\n const {\n hostname,\n routeTreePath = \"routeTree.gen.ts\",\n routes = {},\n defaultChangefreq = \"weekly\",\n defaultPriority = 0.5,\n } = options;\n\n return {\n name: \"vite-plugin-sitemap\",\n apply: \"build\",\n closeBundle: async () => {\n try {\n // Dynamically import Node built-in modules to avoid bundling issues\n const { promises: fsPromises } = await import(\"fs\");\n const { resolve } = await import(\"path\");\n\n const possiblePaths = [\n routeTreePath,\n `src/${routeTreePath}`,\n `${process.cwd()}/${routeTreePath}`,\n `${process.cwd()}/src/${routeTreePath}`,\n ];\n\n let routeTreeContent: string | null = null;\n let foundPath: string | null = null;\n\n // Attempt to read the route tree file from the possible paths\n for (const testPath of possiblePaths) {\n try {\n routeTreeContent = await fsPromises.readFile(testPath, \"utf-8\");\n foundPath = testPath;\n break;\n } catch {\n // Try the next path if this one fails\n }\n }\n\n if (!routeTreeContent || !foundPath) {\n throw new Error(\n `Could not find route tree file. Tried the following paths:\\n${possiblePaths.join(\n \"\\n\"\n )}`\n );\n }\n\n console.log(`Found route tree at: ${foundPath}`);\n\n const allRoutes = extractRoutesFromManifest(routeTreeContent);\n const today = new Date().toISOString().split(\"T\")[0];\n\n const sitemapContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${allRoutes\n .map((route) => {\n const routeConfig = routes[route] || {};\n return ` <url>\n <loc>${hostname}${route}</loc>\n <lastmod>${routeConfig.lastmod || today}</lastmod>\n <changefreq>${routeConfig.changefreq || defaultChangefreq}</changefreq>\n <priority>${routeConfig.priority || defaultPriority}</priority>\n </url>`;\n })\n .join(\"\\n\")}\n</urlset>`;\n\n const publicDir = resolve(process.cwd(), \"public\");\n\n // Ensure the public directory exists\n try {\n await fsPromises.access(publicDir);\n } catch {\n await fsPromises.mkdir(publicDir, { recursive: true });\n }\n\n // Write the sitemap.xml file to the public directory\n await fsPromises.writeFile(\n resolve(publicDir, \"sitemap.xml\"),\n sitemapContent\n );\n\n console.log(\"βœ“ Sitemap generated successfully\");\n } catch (error) {\n console.error(\"Error generating sitemap:\", error);\n }\n },\n };\n};\n\nexport default sitemapPlugin;\n"],"names":["extractRoutesFromManifest","content","manifestMatch","manifest","route","sitemapPlugin","options","hostname","routeTreePath","routes","defaultChangefreq","defaultPriority","fsPromises","__viteBrowserExternal","resolve","possiblePaths","routeTreeContent","foundPath","testPath","allRoutes","today","sitemapContent","routeConfig","publicDir","error"],"mappings":"gFA+BA,MAAMA,EAA6BC,GAA8B,CAC/D,MAAMC,EAAgBD,EAAQ,MAC5B,kDACF,EACI,GAAA,CAACC,EAAe,MAAO,CAAC,EAExB,GAAA,CACF,MAAMC,EAAW,KAAK,MAAMD,EAAc,CAAC,CAAC,EACrC,OAAA,OAAO,KAAKC,EAAS,MAAM,EAC/B,OAAQC,GAAUA,IAAU,UAAU,EACtC,IAAKA,GAAWA,IAAU,IAAMA,EAAQA,EAAM,QAAQ,MAAO,EAAE,CAAE,QAC7D,EAAG,CACF,eAAA,MAAM,gCAAiC,CAAC,EACzC,CAAC,CAAA,CAEZ,EAEaC,EAAiBC,GAAoC,CAC1D,KAAA,CACJ,SAAAC,EACA,cAAAC,EAAgB,mBAChB,OAAAC,EAAS,CAAC,EACV,kBAAAC,EAAoB,SACpB,gBAAAC,EAAkB,EAAA,EAChBL,EAEG,MAAA,CACL,KAAM,sBACN,MAAO,QACP,YAAa,SAAY,CACnB,GAAA,CAEF,KAAM,CAAE,SAAUM,CAAe,EAAA,MAAM,QAAW,QAAA,EAAA,KAAA,IAAAC,CAAA,EAC5C,CAAE,QAAAC,CAAY,EAAA,MAAM,QAAa,QAAA,EAAA,KAAA,IAAAD,CAAA,EAEjCE,EAAgB,CACpBP,EACA,OAAOA,CAAa,GACpB,GAAG,QAAQ,IAAK,CAAA,IAAIA,CAAa,GACjC,GAAG,QAAQ,KAAK,QAAQA,CAAa,EACvC,EAEA,IAAIQ,EAAkC,KAClCC,EAA2B,KAG/B,UAAWC,KAAYH,EACjB,GAAA,CACFC,EAAmB,MAAMJ,EAAW,SAASM,EAAU,OAAO,EAClDD,EAAAC,EACZ,KAAA,MACM,CAAA,CAKN,GAAA,CAACF,GAAoB,CAACC,EACxB,MAAM,IAAI,MACR;AAAA,EAA+DF,EAAc,KAC3E;AAAA,CAAA,CACD,EACH,EAGM,QAAA,IAAI,wBAAwBE,CAAS,EAAE,EAEzC,MAAAE,EAAYnB,EAA0BgB,CAAgB,EACtDI,MAAY,KAAK,EAAE,cAAc,MAAM,GAAG,EAAE,CAAC,EAE7CC,EAAiB;AAAA;AAAA,EAE7BF,EACC,IAAKf,GAAU,CACd,MAAMkB,EAAcb,EAAOL,CAAK,GAAK,CAAC,EAC/B,MAAA;AAAA,WACAG,CAAQ,GAAGH,CAAK;AAAA,eACZkB,EAAY,SAAWF,CAAK;AAAA,kBACzBE,EAAY,YAAcZ,CAAiB;AAAA,gBAC7CY,EAAY,UAAYX,CAAe;AAAA,SAAA,CAEpD,EACA,KAAK;AAAA,CAAI,CAAC;AAAA,WAGCY,EAAYT,EAAQ,QAAQ,IAAA,EAAO,QAAQ,EAG7C,GAAA,CACI,MAAAF,EAAW,OAAOW,CAAS,CAAA,MAC3B,CACN,MAAMX,EAAW,MAAMW,EAAW,CAAE,UAAW,GAAM,CAAA,CAIvD,MAAMX,EAAW,UACfE,EAAQS,EAAW,aAAa,EAChCF,CACF,EAEA,QAAQ,IAAI,kCAAkC,QACvCG,EAAO,CACN,QAAA,MAAM,4BAA6BA,CAAK,CAAA,CAClD,CAEJ,CACF"}
package/dist/index.es.js CHANGED
@@ -12,7 +12,7 @@ const y = (n) => {
12
12
  }, _ = (n) => {
13
13
  const {
14
14
  hostname: s,
15
- routeTreePath: e = "app/routeTree.gen.ts",
15
+ routeTreePath: e = "routeTree.gen.ts",
16
16
  routes: t = {},
17
17
  defaultChangefreq: f = "weekly",
18
18
  defaultPriority: d = 0.5
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/lib/gen-sitemap.ts"],"sourcesContent":["// vite-sitemap-plugin.ts\nimport type { Plugin } from \"vite\";\n\nexport interface SitemapOptions {\n hostname: string;\n routeTreePath?: string;\n routes?: {\n [key: string]: {\n changefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n priority?: number;\n lastmod?: string;\n };\n };\n defaultChangefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n defaultPriority?: number;\n}\n\nconst extractRoutesFromManifest = (content: string): string[] => {\n const manifestMatch = content.match(\n /ROUTE_MANIFEST_START([\\s\\S]*?)ROUTE_MANIFEST_END/\n );\n if (!manifestMatch) return [];\n\n try {\n const manifest = JSON.parse(manifestMatch[1]);\n return Object.keys(manifest.routes)\n .filter((route) => route !== \"__root__\")\n .map((route) => (route === \"/\" ? route : route.replace(/\\/$/, \"\")));\n } catch (e) {\n console.error(\"Error parsing route manifest:\", e);\n return [];\n }\n};\n\nexport const sitemapPlugin = (options: SitemapOptions): Plugin => {\n const {\n hostname,\n routeTreePath = \"app/routeTree.gen.ts\",\n routes = {},\n defaultChangefreq = \"weekly\",\n defaultPriority = 0.5,\n } = options;\n\n return {\n name: \"vite-plugin-sitemap\",\n apply: \"build\",\n closeBundle: async () => {\n try {\n // Dynamically import Node built-in modules to avoid bundling issues\n const { promises: fsPromises } = await import(\"fs\");\n const { resolve } = await import(\"path\");\n\n const possiblePaths = [\n routeTreePath,\n `src/${routeTreePath}`,\n `${process.cwd()}/${routeTreePath}`,\n `${process.cwd()}/src/${routeTreePath}`,\n ];\n\n let routeTreeContent: string | null = null;\n let foundPath: string | null = null;\n\n // Attempt to read the route tree file from the possible paths\n for (const testPath of possiblePaths) {\n try {\n routeTreeContent = await fsPromises.readFile(testPath, \"utf-8\");\n foundPath = testPath;\n break;\n } catch {\n // Try the next path if this one fails\n }\n }\n\n if (!routeTreeContent || !foundPath) {\n throw new Error(\n `Could not find route tree file. Tried the following paths:\\n${possiblePaths.join(\n \"\\n\"\n )}`\n );\n }\n\n console.log(`Found route tree at: ${foundPath}`);\n\n const allRoutes = extractRoutesFromManifest(routeTreeContent);\n const today = new Date().toISOString().split(\"T\")[0];\n\n const sitemapContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${allRoutes\n .map((route) => {\n const routeConfig = routes[route] || {};\n return ` <url>\n <loc>${hostname}${route}</loc>\n <lastmod>${routeConfig.lastmod || today}</lastmod>\n <changefreq>${routeConfig.changefreq || defaultChangefreq}</changefreq>\n <priority>${routeConfig.priority || defaultPriority}</priority>\n </url>`;\n })\n .join(\"\\n\")}\n</urlset>`;\n\n const publicDir = resolve(process.cwd(), \"public\");\n\n // Ensure the public directory exists\n try {\n await fsPromises.access(publicDir);\n } catch {\n await fsPromises.mkdir(publicDir, { recursive: true });\n }\n\n // Write the sitemap.xml file to the public directory\n await fsPromises.writeFile(\n resolve(publicDir, \"sitemap.xml\"),\n sitemapContent\n );\n\n console.log(\"βœ“ Sitemap generated successfully\");\n } catch (error) {\n console.error(\"Error generating sitemap:\", error);\n }\n },\n };\n};\n\nexport default sitemapPlugin;\n"],"names":["extractRoutesFromManifest","content","manifestMatch","manifest","route","sitemapPlugin","options","hostname","routeTreePath","routes","defaultChangefreq","defaultPriority","fsPromises","__viteBrowserExternal","resolve","possiblePaths","routeTreeContent","foundPath","testPath","allRoutes","today","sitemapContent","routeConfig","publicDir","error"],"mappings":"AA+BA,MAAMA,IAA4B,CAACC,MAA8B;AAC/D,QAAMC,IAAgBD,EAAQ;AAAA,IAC5B;AAAA,EACF;AACI,MAAA,CAACC,EAAe,QAAO,CAAC;AAExB,MAAA;AACF,UAAMC,IAAW,KAAK,MAAMD,EAAc,CAAC,CAAC;AACrC,WAAA,OAAO,KAAKC,EAAS,MAAM,EAC/B,OAAO,CAACC,MAAUA,MAAU,UAAU,EACtC,IAAI,CAACA,MAAWA,MAAU,MAAMA,IAAQA,EAAM,QAAQ,OAAO,EAAE,CAAE;AAAA,WAC7D,GAAG;AACF,mBAAA,MAAM,iCAAiC,CAAC,GACzC,CAAC;AAAA,EAAA;AAEZ,GAEaC,IAAgB,CAACC,MAAoC;AAC1D,QAAA;AAAA,IACJ,UAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,QAAAC,IAAS,CAAC;AAAA,IACV,mBAAAC,IAAoB;AAAA,IACpB,iBAAAC,IAAkB;AAAA,EAAA,IAChBL;AAEG,SAAA;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa,YAAY;AACnB,UAAA;AAEF,cAAM,EAAE,UAAUM,EAAe,IAAA,MAAM,QAAW,QAAA,EAAA,KAAA,MAAAC,CAAA,GAC5C,EAAE,SAAAC,EAAY,IAAA,MAAM,QAAa,QAAA,EAAA,KAAA,MAAAD,CAAA,GAEjCE,IAAgB;AAAA,UACpBP;AAAA,UACA,OAAOA,CAAa;AAAA,UACpB,GAAG,QAAQ,IAAK,CAAA,IAAIA,CAAa;AAAA,UACjC,GAAG,QAAQ,KAAK,QAAQA,CAAa;AAAA,QACvC;AAEA,YAAIQ,IAAkC,MAClCC,IAA2B;AAG/B,mBAAWC,KAAYH;AACjB,cAAA;AACF,YAAAC,IAAmB,MAAMJ,EAAW,SAASM,GAAU,OAAO,GAClDD,IAAAC;AACZ;AAAA,UAAA,QACM;AAAA,UAAA;AAKN,YAAA,CAACF,KAAoB,CAACC;AACxB,gBAAM,IAAI;AAAA,YACR;AAAA,EAA+DF,EAAc;AAAA,cAC3E;AAAA;AAAA,YAAA,CACD;AAAA,UACH;AAGM,gBAAA,IAAI,wBAAwBE,CAAS,EAAE;AAEzC,cAAAE,IAAYnB,EAA0BgB,CAAgB,GACtDI,yBAAY,KAAK,GAAE,cAAc,MAAM,GAAG,EAAE,CAAC,GAE7CC,IAAiB;AAAA;AAAA,EAE7BF,EACC,IAAI,CAACf,MAAU;AACd,gBAAMkB,IAAcb,EAAOL,CAAK,KAAK,CAAC;AAC/B,iBAAA;AAAA,WACAG,CAAQ,GAAGH,CAAK;AAAA,eACZkB,EAAY,WAAWF,CAAK;AAAA,kBACzBE,EAAY,cAAcZ,CAAiB;AAAA,gBAC7CY,EAAY,YAAYX,CAAe;AAAA;AAAA,QAAA,CAEpD,EACA,KAAK;AAAA,CAAI,CAAC;AAAA,YAGCY,IAAYT,EAAQ,QAAQ,IAAA,GAAO,QAAQ;AAG7C,YAAA;AACI,gBAAAF,EAAW,OAAOW,CAAS;AAAA,QAAA,QAC3B;AACN,gBAAMX,EAAW,MAAMW,GAAW,EAAE,WAAW,IAAM;AAAA,QAAA;AAIvD,cAAMX,EAAW;AAAA,UACfE,EAAQS,GAAW,aAAa;AAAA,UAChCF;AAAA,QACF,GAEA,QAAQ,IAAI,kCAAkC;AAAA,eACvCG,GAAO;AACN,gBAAA,MAAM,6BAA6BA,CAAK;AAAA,MAAA;AAAA,IAClD;AAAA,EAEJ;AACF;;;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/lib/gen-sitemap.ts"],"sourcesContent":["// vite-sitemap-plugin.ts\nimport type { Plugin } from \"vite\";\n\nexport interface SitemapOptions {\n hostname: string;\n routeTreePath?: string;\n routes?: {\n [key: string]: {\n changefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n priority?: number;\n lastmod?: string;\n };\n };\n defaultChangefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n defaultPriority?: number;\n}\n\nconst extractRoutesFromManifest = (content: string): string[] => {\n const manifestMatch = content.match(\n /ROUTE_MANIFEST_START([\\s\\S]*?)ROUTE_MANIFEST_END/\n );\n if (!manifestMatch) return [];\n\n try {\n const manifest = JSON.parse(manifestMatch[1]);\n return Object.keys(manifest.routes)\n .filter((route) => route !== \"__root__\")\n .map((route) => (route === \"/\" ? route : route.replace(/\\/$/, \"\")));\n } catch (e) {\n console.error(\"Error parsing route manifest:\", e);\n return [];\n }\n};\n\nexport const sitemapPlugin = (options: SitemapOptions): Plugin => {\n const {\n hostname,\n routeTreePath = \"routeTree.gen.ts\",\n routes = {},\n defaultChangefreq = \"weekly\",\n defaultPriority = 0.5,\n } = options;\n\n return {\n name: \"vite-plugin-sitemap\",\n apply: \"build\",\n closeBundle: async () => {\n try {\n // Dynamically import Node built-in modules to avoid bundling issues\n const { promises: fsPromises } = await import(\"fs\");\n const { resolve } = await import(\"path\");\n\n const possiblePaths = [\n routeTreePath,\n `src/${routeTreePath}`,\n `${process.cwd()}/${routeTreePath}`,\n `${process.cwd()}/src/${routeTreePath}`,\n ];\n\n let routeTreeContent: string | null = null;\n let foundPath: string | null = null;\n\n // Attempt to read the route tree file from the possible paths\n for (const testPath of possiblePaths) {\n try {\n routeTreeContent = await fsPromises.readFile(testPath, \"utf-8\");\n foundPath = testPath;\n break;\n } catch {\n // Try the next path if this one fails\n }\n }\n\n if (!routeTreeContent || !foundPath) {\n throw new Error(\n `Could not find route tree file. Tried the following paths:\\n${possiblePaths.join(\n \"\\n\"\n )}`\n );\n }\n\n console.log(`Found route tree at: ${foundPath}`);\n\n const allRoutes = extractRoutesFromManifest(routeTreeContent);\n const today = new Date().toISOString().split(\"T\")[0];\n\n const sitemapContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${allRoutes\n .map((route) => {\n const routeConfig = routes[route] || {};\n return ` <url>\n <loc>${hostname}${route}</loc>\n <lastmod>${routeConfig.lastmod || today}</lastmod>\n <changefreq>${routeConfig.changefreq || defaultChangefreq}</changefreq>\n <priority>${routeConfig.priority || defaultPriority}</priority>\n </url>`;\n })\n .join(\"\\n\")}\n</urlset>`;\n\n const publicDir = resolve(process.cwd(), \"public\");\n\n // Ensure the public directory exists\n try {\n await fsPromises.access(publicDir);\n } catch {\n await fsPromises.mkdir(publicDir, { recursive: true });\n }\n\n // Write the sitemap.xml file to the public directory\n await fsPromises.writeFile(\n resolve(publicDir, \"sitemap.xml\"),\n sitemapContent\n );\n\n console.log(\"βœ“ Sitemap generated successfully\");\n } catch (error) {\n console.error(\"Error generating sitemap:\", error);\n }\n },\n };\n};\n\nexport default sitemapPlugin;\n"],"names":["extractRoutesFromManifest","content","manifestMatch","manifest","route","sitemapPlugin","options","hostname","routeTreePath","routes","defaultChangefreq","defaultPriority","fsPromises","__viteBrowserExternal","resolve","possiblePaths","routeTreeContent","foundPath","testPath","allRoutes","today","sitemapContent","routeConfig","publicDir","error"],"mappings":"AA+BA,MAAMA,IAA4B,CAACC,MAA8B;AAC/D,QAAMC,IAAgBD,EAAQ;AAAA,IAC5B;AAAA,EACF;AACI,MAAA,CAACC,EAAe,QAAO,CAAC;AAExB,MAAA;AACF,UAAMC,IAAW,KAAK,MAAMD,EAAc,CAAC,CAAC;AACrC,WAAA,OAAO,KAAKC,EAAS,MAAM,EAC/B,OAAO,CAACC,MAAUA,MAAU,UAAU,EACtC,IAAI,CAACA,MAAWA,MAAU,MAAMA,IAAQA,EAAM,QAAQ,OAAO,EAAE,CAAE;AAAA,WAC7D,GAAG;AACF,mBAAA,MAAM,iCAAiC,CAAC,GACzC,CAAC;AAAA,EAAA;AAEZ,GAEaC,IAAgB,CAACC,MAAoC;AAC1D,QAAA;AAAA,IACJ,UAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,QAAAC,IAAS,CAAC;AAAA,IACV,mBAAAC,IAAoB;AAAA,IACpB,iBAAAC,IAAkB;AAAA,EAAA,IAChBL;AAEG,SAAA;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa,YAAY;AACnB,UAAA;AAEF,cAAM,EAAE,UAAUM,EAAe,IAAA,MAAM,QAAW,QAAA,EAAA,KAAA,MAAAC,CAAA,GAC5C,EAAE,SAAAC,EAAY,IAAA,MAAM,QAAa,QAAA,EAAA,KAAA,MAAAD,CAAA,GAEjCE,IAAgB;AAAA,UACpBP;AAAA,UACA,OAAOA,CAAa;AAAA,UACpB,GAAG,QAAQ,IAAK,CAAA,IAAIA,CAAa;AAAA,UACjC,GAAG,QAAQ,KAAK,QAAQA,CAAa;AAAA,QACvC;AAEA,YAAIQ,IAAkC,MAClCC,IAA2B;AAG/B,mBAAWC,KAAYH;AACjB,cAAA;AACF,YAAAC,IAAmB,MAAMJ,EAAW,SAASM,GAAU,OAAO,GAClDD,IAAAC;AACZ;AAAA,UAAA,QACM;AAAA,UAAA;AAKN,YAAA,CAACF,KAAoB,CAACC;AACxB,gBAAM,IAAI;AAAA,YACR;AAAA,EAA+DF,EAAc;AAAA,cAC3E;AAAA;AAAA,YAAA,CACD;AAAA,UACH;AAGM,gBAAA,IAAI,wBAAwBE,CAAS,EAAE;AAEzC,cAAAE,IAAYnB,EAA0BgB,CAAgB,GACtDI,yBAAY,KAAK,GAAE,cAAc,MAAM,GAAG,EAAE,CAAC,GAE7CC,IAAiB;AAAA;AAAA,EAE7BF,EACC,IAAI,CAACf,MAAU;AACd,gBAAMkB,IAAcb,EAAOL,CAAK,KAAK,CAAC;AAC/B,iBAAA;AAAA,WACAG,CAAQ,GAAGH,CAAK;AAAA,eACZkB,EAAY,WAAWF,CAAK;AAAA,kBACzBE,EAAY,cAAcZ,CAAiB;AAAA,gBAC7CY,EAAY,YAAYX,CAAe;AAAA;AAAA,QAAA,CAEpD,EACA,KAAK;AAAA,CAAI,CAAC;AAAA,YAGCY,IAAYT,EAAQ,QAAQ,IAAA,GAAO,QAAQ;AAG7C,YAAA;AACI,gBAAAF,EAAW,OAAOW,CAAS;AAAA,QAAA,QAC3B;AACN,gBAAMX,EAAW,MAAMW,GAAW,EAAE,WAAW,IAAM;AAAA,QAAA;AAIvD,cAAMX,EAAW;AAAA,UACfE,EAAQS,GAAW,aAAa;AAAA,UAChCF;AAAA,QACF,GAEA,QAAQ,IAAI,kCAAkC;AAAA,eACvCG,GAAO;AACN,gBAAA,MAAM,6BAA6BA,CAAK;AAAA,MAAA;AAAA,IAClD;AAAA,EAEJ;AACF;;;"}
package/dist/index.umd.js CHANGED
@@ -1,4 +1,4 @@
1
- (function(r,s){typeof exports=="object"&&typeof module<"u"?s(exports):typeof define=="function"&&define.amd?define(["exports"],s):(r=typeof globalThis<"u"?globalThis:r||self,s(r["tanstack-start-sitemap"]={}))})(this,function(r){"use strict";const s=a=>{const i=a.match(/ROUTE_MANIFEST_START([\s\S]*?)ROUTE_MANIFEST_END/);if(!i)return[];try{const e=JSON.parse(i[1]);return Object.keys(e.routes).filter(t=>t!=="__root__").map(t=>t==="/"?t:t.replace(/\/$/,""))}catch(e){return console.error("Error parsing route manifest:",e),[]}},h=a=>{const{hostname:i,routeTreePath:e="app/routeTree.gen.ts",routes:t={},defaultChangefreq:g="weekly",defaultPriority:y=.5}=a;return{name:"vite-plugin-sitemap",apply:"build",closeBundle:async()=>{try{const{promises:o}=await Promise.resolve().then(()=>f),{resolve:m}=await Promise.resolve().then(()=>f),d=[e,`src/${e}`,`${process.cwd()}/${e}`,`${process.cwd()}/src/${e}`];let l=null,c=null;for(const n of d)try{l=await o.readFile(n,"utf-8"),c=n;break}catch{}if(!l||!c)throw new Error(`Could not find route tree file. Tried the following paths:
1
+ (function(r,s){typeof exports=="object"&&typeof module<"u"?s(exports):typeof define=="function"&&define.amd?define(["exports"],s):(r=typeof globalThis<"u"?globalThis:r||self,s(r["tanstack-start-sitemap"]={}))})(this,function(r){"use strict";const s=a=>{const i=a.match(/ROUTE_MANIFEST_START([\s\S]*?)ROUTE_MANIFEST_END/);if(!i)return[];try{const e=JSON.parse(i[1]);return Object.keys(e.routes).filter(t=>t!=="__root__").map(t=>t==="/"?t:t.replace(/\/$/,""))}catch(e){return console.error("Error parsing route manifest:",e),[]}},h=a=>{const{hostname:i,routeTreePath:e="routeTree.gen.ts",routes:t={},defaultChangefreq:g="weekly",defaultPriority:y=.5}=a;return{name:"vite-plugin-sitemap",apply:"build",closeBundle:async()=>{try{const{promises:o}=await Promise.resolve().then(()=>f),{resolve:m}=await Promise.resolve().then(()=>f),d=[e,`src/${e}`,`${process.cwd()}/${e}`,`${process.cwd()}/src/${e}`];let l=null,c=null;for(const n of d)try{l=await o.readFile(n,"utf-8"),c=n;break}catch{}if(!l||!c)throw new Error(`Could not find route tree file. Tried the following paths:
2
2
  ${d.join(`
3
3
  `)}`);console.log(`Found route tree at: ${c}`);const w=s(l),T=new Date().toISOString().split("T")[0],_=`<?xml version="1.0" encoding="UTF-8"?>
4
4
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/lib/gen-sitemap.ts"],"sourcesContent":["// vite-sitemap-plugin.ts\nimport type { Plugin } from \"vite\";\n\nexport interface SitemapOptions {\n hostname: string;\n routeTreePath?: string;\n routes?: {\n [key: string]: {\n changefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n priority?: number;\n lastmod?: string;\n };\n };\n defaultChangefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n defaultPriority?: number;\n}\n\nconst extractRoutesFromManifest = (content: string): string[] => {\n const manifestMatch = content.match(\n /ROUTE_MANIFEST_START([\\s\\S]*?)ROUTE_MANIFEST_END/\n );\n if (!manifestMatch) return [];\n\n try {\n const manifest = JSON.parse(manifestMatch[1]);\n return Object.keys(manifest.routes)\n .filter((route) => route !== \"__root__\")\n .map((route) => (route === \"/\" ? route : route.replace(/\\/$/, \"\")));\n } catch (e) {\n console.error(\"Error parsing route manifest:\", e);\n return [];\n }\n};\n\nexport const sitemapPlugin = (options: SitemapOptions): Plugin => {\n const {\n hostname,\n routeTreePath = \"app/routeTree.gen.ts\",\n routes = {},\n defaultChangefreq = \"weekly\",\n defaultPriority = 0.5,\n } = options;\n\n return {\n name: \"vite-plugin-sitemap\",\n apply: \"build\",\n closeBundle: async () => {\n try {\n // Dynamically import Node built-in modules to avoid bundling issues\n const { promises: fsPromises } = await import(\"fs\");\n const { resolve } = await import(\"path\");\n\n const possiblePaths = [\n routeTreePath,\n `src/${routeTreePath}`,\n `${process.cwd()}/${routeTreePath}`,\n `${process.cwd()}/src/${routeTreePath}`,\n ];\n\n let routeTreeContent: string | null = null;\n let foundPath: string | null = null;\n\n // Attempt to read the route tree file from the possible paths\n for (const testPath of possiblePaths) {\n try {\n routeTreeContent = await fsPromises.readFile(testPath, \"utf-8\");\n foundPath = testPath;\n break;\n } catch {\n // Try the next path if this one fails\n }\n }\n\n if (!routeTreeContent || !foundPath) {\n throw new Error(\n `Could not find route tree file. Tried the following paths:\\n${possiblePaths.join(\n \"\\n\"\n )}`\n );\n }\n\n console.log(`Found route tree at: ${foundPath}`);\n\n const allRoutes = extractRoutesFromManifest(routeTreeContent);\n const today = new Date().toISOString().split(\"T\")[0];\n\n const sitemapContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${allRoutes\n .map((route) => {\n const routeConfig = routes[route] || {};\n return ` <url>\n <loc>${hostname}${route}</loc>\n <lastmod>${routeConfig.lastmod || today}</lastmod>\n <changefreq>${routeConfig.changefreq || defaultChangefreq}</changefreq>\n <priority>${routeConfig.priority || defaultPriority}</priority>\n </url>`;\n })\n .join(\"\\n\")}\n</urlset>`;\n\n const publicDir = resolve(process.cwd(), \"public\");\n\n // Ensure the public directory exists\n try {\n await fsPromises.access(publicDir);\n } catch {\n await fsPromises.mkdir(publicDir, { recursive: true });\n }\n\n // Write the sitemap.xml file to the public directory\n await fsPromises.writeFile(\n resolve(publicDir, \"sitemap.xml\"),\n sitemapContent\n );\n\n console.log(\"βœ“ Sitemap generated successfully\");\n } catch (error) {\n console.error(\"Error generating sitemap:\", error);\n }\n },\n };\n};\n\nexport default sitemapPlugin;\n"],"names":["extractRoutesFromManifest","content","manifestMatch","manifest","route","sitemapPlugin","options","hostname","routeTreePath","routes","defaultChangefreq","defaultPriority","fsPromises","__viteBrowserExternal","resolve","possiblePaths","routeTreeContent","foundPath","testPath","allRoutes","today","sitemapContent","routeConfig","publicDir","error"],"mappings":"iPA+BA,MAAMA,EAA6BC,GAA8B,CAC/D,MAAMC,EAAgBD,EAAQ,MAC5B,kDACF,EACI,GAAA,CAACC,EAAe,MAAO,CAAC,EAExB,GAAA,CACF,MAAMC,EAAW,KAAK,MAAMD,EAAc,CAAC,CAAC,EACrC,OAAA,OAAO,KAAKC,EAAS,MAAM,EAC/B,OAAQC,GAAUA,IAAU,UAAU,EACtC,IAAKA,GAAWA,IAAU,IAAMA,EAAQA,EAAM,QAAQ,MAAO,EAAE,CAAE,QAC7D,EAAG,CACF,eAAA,MAAM,gCAAiC,CAAC,EACzC,CAAC,CAAA,CAEZ,EAEaC,EAAiBC,GAAoC,CAC1D,KAAA,CACJ,SAAAC,EACA,cAAAC,EAAgB,uBAChB,OAAAC,EAAS,CAAC,EACV,kBAAAC,EAAoB,SACpB,gBAAAC,EAAkB,EAAA,EAChBL,EAEG,MAAA,CACL,KAAM,sBACN,MAAO,QACP,YAAa,SAAY,CACnB,GAAA,CAEF,KAAM,CAAE,SAAUM,CAAe,EAAA,MAAM,QAAW,QAAA,EAAA,KAAA,IAAAC,CAAA,EAC5C,CAAE,QAAAC,CAAY,EAAA,MAAM,QAAa,QAAA,EAAA,KAAA,IAAAD,CAAA,EAEjCE,EAAgB,CACpBP,EACA,OAAOA,CAAa,GACpB,GAAG,QAAQ,IAAK,CAAA,IAAIA,CAAa,GACjC,GAAG,QAAQ,KAAK,QAAQA,CAAa,EACvC,EAEA,IAAIQ,EAAkC,KAClCC,EAA2B,KAG/B,UAAWC,KAAYH,EACjB,GAAA,CACFC,EAAmB,MAAMJ,EAAW,SAASM,EAAU,OAAO,EAClDD,EAAAC,EACZ,KAAA,MACM,CAAA,CAKN,GAAA,CAACF,GAAoB,CAACC,EACxB,MAAM,IAAI,MACR;AAAA,EAA+DF,EAAc,KAC3E;AAAA,CAAA,CACD,EACH,EAGM,QAAA,IAAI,wBAAwBE,CAAS,EAAE,EAEzC,MAAAE,EAAYnB,EAA0BgB,CAAgB,EACtDI,MAAY,KAAK,EAAE,cAAc,MAAM,GAAG,EAAE,CAAC,EAE7CC,EAAiB;AAAA;AAAA,EAE7BF,EACC,IAAKf,GAAU,CACd,MAAMkB,EAAcb,EAAOL,CAAK,GAAK,CAAC,EAC/B,MAAA;AAAA,WACAG,CAAQ,GAAGH,CAAK;AAAA,eACZkB,EAAY,SAAWF,CAAK;AAAA,kBACzBE,EAAY,YAAcZ,CAAiB;AAAA,gBAC7CY,EAAY,UAAYX,CAAe;AAAA,SAAA,CAEpD,EACA,KAAK;AAAA,CAAI,CAAC;AAAA,WAGCY,EAAYT,EAAQ,QAAQ,IAAA,EAAO,QAAQ,EAG7C,GAAA,CACI,MAAAF,EAAW,OAAOW,CAAS,CAAA,MAC3B,CACN,MAAMX,EAAW,MAAMW,EAAW,CAAE,UAAW,GAAM,CAAA,CAIvD,MAAMX,EAAW,UACfE,EAAQS,EAAW,aAAa,EAChCF,CACF,EAEA,QAAQ,IAAI,kCAAkC,QACvCG,EAAO,CACN,QAAA,MAAM,4BAA6BA,CAAK,CAAA,CAClD,CAEJ,CACF"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/lib/gen-sitemap.ts"],"sourcesContent":["// vite-sitemap-plugin.ts\nimport type { Plugin } from \"vite\";\n\nexport interface SitemapOptions {\n hostname: string;\n routeTreePath?: string;\n routes?: {\n [key: string]: {\n changefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n priority?: number;\n lastmod?: string;\n };\n };\n defaultChangefreq?:\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n defaultPriority?: number;\n}\n\nconst extractRoutesFromManifest = (content: string): string[] => {\n const manifestMatch = content.match(\n /ROUTE_MANIFEST_START([\\s\\S]*?)ROUTE_MANIFEST_END/\n );\n if (!manifestMatch) return [];\n\n try {\n const manifest = JSON.parse(manifestMatch[1]);\n return Object.keys(manifest.routes)\n .filter((route) => route !== \"__root__\")\n .map((route) => (route === \"/\" ? route : route.replace(/\\/$/, \"\")));\n } catch (e) {\n console.error(\"Error parsing route manifest:\", e);\n return [];\n }\n};\n\nexport const sitemapPlugin = (options: SitemapOptions): Plugin => {\n const {\n hostname,\n routeTreePath = \"routeTree.gen.ts\",\n routes = {},\n defaultChangefreq = \"weekly\",\n defaultPriority = 0.5,\n } = options;\n\n return {\n name: \"vite-plugin-sitemap\",\n apply: \"build\",\n closeBundle: async () => {\n try {\n // Dynamically import Node built-in modules to avoid bundling issues\n const { promises: fsPromises } = await import(\"fs\");\n const { resolve } = await import(\"path\");\n\n const possiblePaths = [\n routeTreePath,\n `src/${routeTreePath}`,\n `${process.cwd()}/${routeTreePath}`,\n `${process.cwd()}/src/${routeTreePath}`,\n ];\n\n let routeTreeContent: string | null = null;\n let foundPath: string | null = null;\n\n // Attempt to read the route tree file from the possible paths\n for (const testPath of possiblePaths) {\n try {\n routeTreeContent = await fsPromises.readFile(testPath, \"utf-8\");\n foundPath = testPath;\n break;\n } catch {\n // Try the next path if this one fails\n }\n }\n\n if (!routeTreeContent || !foundPath) {\n throw new Error(\n `Could not find route tree file. Tried the following paths:\\n${possiblePaths.join(\n \"\\n\"\n )}`\n );\n }\n\n console.log(`Found route tree at: ${foundPath}`);\n\n const allRoutes = extractRoutesFromManifest(routeTreeContent);\n const today = new Date().toISOString().split(\"T\")[0];\n\n const sitemapContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${allRoutes\n .map((route) => {\n const routeConfig = routes[route] || {};\n return ` <url>\n <loc>${hostname}${route}</loc>\n <lastmod>${routeConfig.lastmod || today}</lastmod>\n <changefreq>${routeConfig.changefreq || defaultChangefreq}</changefreq>\n <priority>${routeConfig.priority || defaultPriority}</priority>\n </url>`;\n })\n .join(\"\\n\")}\n</urlset>`;\n\n const publicDir = resolve(process.cwd(), \"public\");\n\n // Ensure the public directory exists\n try {\n await fsPromises.access(publicDir);\n } catch {\n await fsPromises.mkdir(publicDir, { recursive: true });\n }\n\n // Write the sitemap.xml file to the public directory\n await fsPromises.writeFile(\n resolve(publicDir, \"sitemap.xml\"),\n sitemapContent\n );\n\n console.log(\"βœ“ Sitemap generated successfully\");\n } catch (error) {\n console.error(\"Error generating sitemap:\", error);\n }\n },\n };\n};\n\nexport default sitemapPlugin;\n"],"names":["extractRoutesFromManifest","content","manifestMatch","manifest","route","sitemapPlugin","options","hostname","routeTreePath","routes","defaultChangefreq","defaultPriority","fsPromises","__viteBrowserExternal","resolve","possiblePaths","routeTreeContent","foundPath","testPath","allRoutes","today","sitemapContent","routeConfig","publicDir","error"],"mappings":"iPA+BA,MAAMA,EAA6BC,GAA8B,CAC/D,MAAMC,EAAgBD,EAAQ,MAC5B,kDACF,EACI,GAAA,CAACC,EAAe,MAAO,CAAC,EAExB,GAAA,CACF,MAAMC,EAAW,KAAK,MAAMD,EAAc,CAAC,CAAC,EACrC,OAAA,OAAO,KAAKC,EAAS,MAAM,EAC/B,OAAQC,GAAUA,IAAU,UAAU,EACtC,IAAKA,GAAWA,IAAU,IAAMA,EAAQA,EAAM,QAAQ,MAAO,EAAE,CAAE,QAC7D,EAAG,CACF,eAAA,MAAM,gCAAiC,CAAC,EACzC,CAAC,CAAA,CAEZ,EAEaC,EAAiBC,GAAoC,CAC1D,KAAA,CACJ,SAAAC,EACA,cAAAC,EAAgB,mBAChB,OAAAC,EAAS,CAAC,EACV,kBAAAC,EAAoB,SACpB,gBAAAC,EAAkB,EAAA,EAChBL,EAEG,MAAA,CACL,KAAM,sBACN,MAAO,QACP,YAAa,SAAY,CACnB,GAAA,CAEF,KAAM,CAAE,SAAUM,CAAe,EAAA,MAAM,QAAW,QAAA,EAAA,KAAA,IAAAC,CAAA,EAC5C,CAAE,QAAAC,CAAY,EAAA,MAAM,QAAa,QAAA,EAAA,KAAA,IAAAD,CAAA,EAEjCE,EAAgB,CACpBP,EACA,OAAOA,CAAa,GACpB,GAAG,QAAQ,IAAK,CAAA,IAAIA,CAAa,GACjC,GAAG,QAAQ,KAAK,QAAQA,CAAa,EACvC,EAEA,IAAIQ,EAAkC,KAClCC,EAA2B,KAG/B,UAAWC,KAAYH,EACjB,GAAA,CACFC,EAAmB,MAAMJ,EAAW,SAASM,EAAU,OAAO,EAClDD,EAAAC,EACZ,KAAA,MACM,CAAA,CAKN,GAAA,CAACF,GAAoB,CAACC,EACxB,MAAM,IAAI,MACR;AAAA,EAA+DF,EAAc,KAC3E;AAAA,CAAA,CACD,EACH,EAGM,QAAA,IAAI,wBAAwBE,CAAS,EAAE,EAEzC,MAAAE,EAAYnB,EAA0BgB,CAAgB,EACtDI,MAAY,KAAK,EAAE,cAAc,MAAM,GAAG,EAAE,CAAC,EAE7CC,EAAiB;AAAA;AAAA,EAE7BF,EACC,IAAKf,GAAU,CACd,MAAMkB,EAAcb,EAAOL,CAAK,GAAK,CAAC,EAC/B,MAAA;AAAA,WACAG,CAAQ,GAAGH,CAAK;AAAA,eACZkB,EAAY,SAAWF,CAAK;AAAA,kBACzBE,EAAY,YAAcZ,CAAiB;AAAA,gBAC7CY,EAAY,UAAYX,CAAe;AAAA,SAAA,CAEpD,EACA,KAAK;AAAA,CAAI,CAAC;AAAA,WAGCY,EAAYT,EAAQ,QAAQ,IAAA,EAAO,QAAQ,EAG7C,GAAA,CACI,MAAAF,EAAW,OAAOW,CAAS,CAAA,MAC3B,CACN,MAAMX,EAAW,MAAMW,EAAW,CAAE,UAAW,GAAM,CAAA,CAIvD,MAAMX,EAAW,UACfE,EAAQS,EAAW,aAAa,EAChCF,CACF,EAEA,QAAQ,IAAI,kCAAkC,QACvCG,EAAO,CACN,QAAA,MAAM,4BAA6BA,CAAK,CAAA,CAClD,CAEJ,CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tanstack-start-sitemap",
3
3
  "private": false,
4
- "version": "0.0.1",
4
+ "version": "0.0.3",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",