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 +55 -12
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
@@ -1,17 +1,60 @@
|
|
1
|
-
#
|
1
|
+
# Tanstack start Sitemap Plugin
|
2
2
|
|
3
|
-
A
|
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
|
-
##
|
5
|
+
## Features
|
6
6
|
|
7
|
-
- **
|
8
|
-
- **
|
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="
|
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">
|
package/dist/index.cjs.js.map
CHANGED
@@ -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 = \"
|
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
package/dist/index.es.js.map
CHANGED
@@ -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 = \"
|
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="
|
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">
|
package/dist/index.umd.js.map
CHANGED
@@ -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 = \"
|
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"}
|