svelte-sitemap 4.0.2 → 4.0.4
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 +0 -8
- package/const.d.ts +1 -1
- package/dto/global.interface.d.ts +1 -1
- package/helpers/config.js +1 -1
- package/helpers/global.helper.js +2 -1
- package/helpers/global.helper.js.map +1 -1
- package/package.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
- ➡️ Designed for SvelteKit `adapter-static` with `prerender` option (SSG)
|
|
12
12
|
- 🔷 TypeScript, JavaScript, CLI and **Vite plugin** version
|
|
13
13
|
- 🔧 Useful [options](#%EF%B8%8F-options) for customizing your sitemap
|
|
14
|
-
- 📡 [Ping](#-ping-google-search-console) Google Search Console after deploy
|
|
15
14
|
- 🗂️ Support for [sitemap index](https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps) for large sites (50K+ pages)
|
|
16
15
|
- ▲ 🟠 Works with [Vercel](#-vercel-adapter) and [Cloudflare](#-cloudflare-adapter) adapters and more...
|
|
17
16
|
|
|
@@ -206,13 +205,6 @@ const config: OptionsSvelteSitemap = {
|
|
|
206
205
|
|
|
207
206
|
---
|
|
208
207
|
|
|
209
|
-
### 📡 Ping Google Search Console
|
|
210
|
-
|
|
211
|
-
Every time you deploy a new version, you can inform Google that there's a new update.
|
|
212
|
-
See this [discussion](https://github.com/bartholomej/svelte-sitemap/issues/23) with very useful tips.
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
208
|
### ▲ Vercel adapter
|
|
217
209
|
|
|
218
210
|
If you're using `adapter-vercel`, the output directory is different from the default `build/`:
|
package/const.d.ts
CHANGED
|
@@ -8,5 +8,5 @@ declare const INTEGRATION_METHODS: {
|
|
|
8
8
|
};
|
|
9
9
|
type IntegrationMethod = (typeof INTEGRATION_METHODS)[keyof typeof INTEGRATION_METHODS];
|
|
10
10
|
//#endregion
|
|
11
|
-
export { CHANGE_FREQ, IntegrationMethod };
|
|
11
|
+
export { CHANGE_FREQ, INTEGRATION_METHODS, IntegrationMethod };
|
|
12
12
|
//# sourceMappingURL=const.d.ts.map
|
|
@@ -80,5 +80,5 @@ interface PagesJson {
|
|
|
80
80
|
*/
|
|
81
81
|
type ChangeFreq = (typeof CHANGE_FREQ)[number];
|
|
82
82
|
//#endregion
|
|
83
|
-
export { Arguments, ChangeFreq, Options, OptionsSvelteSitemap, PagesJson };
|
|
83
|
+
export { Arguments, ChangeFreq, type IntegrationMethod, Options, OptionsSvelteSitemap, PagesJson };
|
|
84
84
|
//# sourceMappingURL=global.interface.d.ts.map
|
package/helpers/config.js
CHANGED
|
@@ -27,6 +27,6 @@ const withDefaultConfig = (config) => {
|
|
|
27
27
|
return updateConfig(defaultConfig, config);
|
|
28
28
|
};
|
|
29
29
|
//#endregion
|
|
30
|
-
export { defaultConfig, loadConfig, withDefaultConfig };
|
|
30
|
+
export { defaultConfig, loadConfig, updateConfig, withDefaultConfig };
|
|
31
31
|
|
|
32
32
|
//# sourceMappingURL=config.js.map
|
package/helpers/global.helper.js
CHANGED
|
@@ -42,6 +42,7 @@ async function prepareData(domain, options) {
|
|
|
42
42
|
lastMod: options?.resetTime ? (/* @__PURE__ */ new Date()).toISOString().split("T")[0] : ""
|
|
43
43
|
};
|
|
44
44
|
});
|
|
45
|
+
results.sort((a, b) => a.page.localeCompare(b.page));
|
|
45
46
|
detectErrors({
|
|
46
47
|
folder: !fs.existsSync(FOLDER),
|
|
47
48
|
htmlFiles: !pages.length
|
|
@@ -133,6 +134,6 @@ const addAttribution = (sitemap, options) => {
|
|
|
133
134
|
if (options?.attribution !== false) sitemap.com(` This file was automatically generated by https://github.com/bartholomej/svelte-sitemap v${version} `);
|
|
134
135
|
};
|
|
135
136
|
//#endregion
|
|
136
|
-
export { prepareData, writeSitemap };
|
|
137
|
+
export { checkPrerenderRoutes, detectErrors, prepareData, removeHtml, writeSitemap };
|
|
137
138
|
|
|
138
139
|
//# sourceMappingURL=global.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.helper.js","names":["pkg.version"],"sources":["../../src/helpers/global.helper.ts"],"sourcesContent":["import fg from 'fast-glob';\nimport fs from 'fs';\nimport path from 'path';\nimport { create } from 'xmlbuilder2';\nimport type { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js';\nimport pkg from '../../package.json' with { type: 'json' };\nimport { CHANGE_FREQ, CHUNK, OUT_DIR } from '../const.js';\nimport type { ChangeFreq, Options, OptionsSvelteSitemap, PagesJson } from './../dto/index.js';\nimport {\n cliColors,\n errorMsgFolder,\n errorMsgHtmlFiles,\n errorMsgWrite,\n successMsg\n} from './vars.helper.js';\n\nconst version = pkg.version;\n\nconst getUrl = (url: string, domain: string, options: Options) => {\n let slash: '' | '/' = getSlash(domain);\n\n let trimmed = url\n .split((options?.outDir ?? OUT_DIR) + '/')\n .pop()\n .replace('index.html', '');\n\n trimmed = removeHtml(trimmed);\n\n // Add all traling slashes\n if (options?.trailingSlashes) {\n trimmed = trimmed.length && !trimmed.endsWith('/') ? trimmed + '/' : trimmed;\n } else {\n trimmed = trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;\n slash = trimmed ? slash : '';\n }\n\n // URI-encode each path segment to handle special characters (e.g. spaces → %20).\n // Decode first to avoid double-encoding already percent-encoded segments.\n trimmed = trimmed\n .split('/')\n .map((segment) => {\n try {\n return encodeURIComponent(decodeURIComponent(segment));\n } catch {\n return encodeURIComponent(segment);\n }\n })\n .join('/');\n\n return `${domain}${slash}${trimmed}`;\n};\n\nexport const removeHtml = (fileName: string) => {\n if (fileName?.endsWith('.html')) {\n return fileName.slice(0, -5);\n }\n return fileName;\n};\n\nexport async function prepareData(domain: string, options?: Options): Promise<PagesJson[]> {\n const FOLDER = options?.outDir ?? OUT_DIR;\n\n const ignore = prepareIgnored(options?.ignore, options?.outDir);\n const changeFreq = prepareChangeFreq(options);\n const pages: string[] = await fg(`${FOLDER}/**/*.html`, { ignore });\n\n if (options.additional) pages.push(...options.additional);\n\n const results = pages.map((page) => {\n return {\n page: getUrl(page, domain, options),\n changeFreq: changeFreq,\n lastMod: options?.resetTime ? new Date().toISOString().split('T')[0] : ''\n };\n });\n\n detectErrors(\n {\n folder: !fs.existsSync(FOLDER),\n htmlFiles: !pages.length\n },\n FOLDER\n );\n\n await checkPrerenderRoutes(pages, FOLDER, options);\n\n return results;\n}\n\nexport const detectErrors = (\n { folder, htmlFiles }: { folder: boolean; htmlFiles: boolean },\n outDir: string = OUT_DIR\n) => {\n if (folder && htmlFiles) {\n console.error(cliColors.red, errorMsgFolder(outDir));\n } else if (htmlFiles) {\n // If no page exists, then the static adapter is probably not used\n console.error(cliColors.red, errorMsgHtmlFiles(outDir));\n }\n};\n\nexport const checkPrerenderRoutes = async (pages: string[], outDir: string, options?: Options) => {\n // Check if it's a SvelteKit build by checking for the '_app' directory in output folder\n const appDirExists = fs.existsSync(path.join(outDir, '_app'));\n\n if (appDirExists && pages.length > 0) {\n const hasOnlyRootOrFallback = pages.every((page) => {\n const relative = path.relative(outDir, page);\n return relative === 'index.html' || relative === 'fallback.html';\n });\n\n const hasNoAdditional = !options?.additional || options.additional.length === 0;\n\n if (hasOnlyRootOrFallback && hasNoAdditional) {\n console.warn(\n cliColors.yellow,\n ` ⚠️ Warning: Only the homepage or fallback page was found in '${outDir}/'.\\n` +\n ` If your SvelteKit site has multiple routes, make sure you enabled prerendering for them.\\n` +\n ` For SPA (Single Page Apps), you can add routes manually using the 'additional' option.`\n );\n }\n }\n};\n\nexport const writeSitemap = (items: PagesJson[], options: Options, domain: string): void => {\n const outDir = options?.outDir ?? OUT_DIR;\n\n if (items?.length <= CHUNK.maxSize) {\n createFile(items, options, outDir);\n } else {\n // If the number of pages is greater than the chunk size, then we split the sitemap into multiple files\n // and create an index file that links to all of them\n // https://support.google.com/webmasters/answer/183668?hl=en\n const numberOfChunks = Math.ceil(items.length / CHUNK.maxSize);\n\n console.log(\n cliColors.cyanAndBold,\n `> Oh, your site is huge! Writing sitemap in chunks of ${numberOfChunks} pages and its index sitemap.xml`\n );\n\n for (let i = 0; i < items.length; i += CHUNK.maxSize) {\n const chunk = items.slice(i, i + CHUNK.maxSize);\n createFile(chunk, options, outDir, i / CHUNK.maxSize + 1);\n }\n createIndexFile(numberOfChunks, outDir, options, domain);\n }\n};\n\nconst createFile = (\n items: PagesJson[],\n options: Options,\n outDir: string,\n chunkId?: number\n): void => {\n const sitemap = createXml('urlset');\n addAttribution(sitemap, options);\n\n for (const item of items) {\n const page = sitemap.ele('url');\n page.ele('loc').txt(item.page);\n if (item.changeFreq) {\n page.ele('changefreq').txt(item.changeFreq);\n }\n if (item.lastMod) {\n page.ele('lastmod').txt(item.lastMod);\n }\n }\n\n const xml = finishXml(sitemap);\n\n const fileName = chunkId ? `sitemap-${chunkId}.xml` : 'sitemap.xml';\n\n try {\n fs.writeFileSync(`${outDir}/${fileName}`, xml);\n console.log(cliColors.green, successMsg(outDir, fileName));\n } catch (e) {\n console.error(cliColors.red, errorMsgWrite(outDir, fileName), e);\n }\n};\n\nconst createIndexFile = (\n numberOfChunks: number,\n outDir: string,\n options: Options,\n domain: string\n): void => {\n const FILENAME = 'sitemap.xml';\n const slash = getSlash(domain);\n\n const sitemap = createXml('sitemapindex');\n addAttribution(sitemap, options);\n\n for (let i = 1; i <= numberOfChunks; i++) {\n sitemap.ele('sitemap').ele('loc').txt(`${domain}${slash}sitemap-${i}.xml`);\n }\n\n const xml = finishXml(sitemap);\n\n try {\n fs.writeFileSync(`${outDir}/${FILENAME}`, xml);\n console.log(cliColors.green, successMsg(outDir, FILENAME));\n } catch (e) {\n console.error(cliColors.red, errorMsgWrite(outDir, FILENAME), e);\n }\n};\n\nconst prepareIgnored = (\n ignored: string | string[],\n outDir: string = OUT_DIR\n): string[] | undefined => {\n let ignore: string[] | undefined;\n if (ignored) {\n ignore = Array.isArray(ignored) ? ignored : [ignored];\n ignore = ignore.map((ignoredPage) => `${outDir}/${ignoredPage}`);\n }\n return ignore;\n};\n\nconst prepareChangeFreq = (options: Options): ChangeFreq => {\n let result: ChangeFreq = null;\n\n if (options?.changeFreq) {\n if (CHANGE_FREQ.includes(options.changeFreq)) {\n result = options.changeFreq;\n } else {\n console.log(\n cliColors.red,\n ` × Option \\`--change-freq ${options.changeFreq}\\` is not a valid value. See docs: https://github.com/bartholomej/svelte-sitemap#options`\n );\n }\n }\n return result;\n};\n\nconst getSlash = (domain: string) => (domain.split('/').pop() ? '/' : '');\n\nconst createXml = (elementName: 'urlset' | 'sitemapindex'): XMLBuilder => {\n return create({ version: '1.0', encoding: 'UTF-8' }).ele(elementName, {\n xmlns: 'http://www.sitemaps.org/schemas/sitemap/0.9'\n });\n};\n\nconst finishXml = (sitemap: XMLBuilder): string => {\n return sitemap.end({ prettyPrint: true });\n};\n\nconst addAttribution = (sitemap: XMLBuilder, options: Options): void => {\n if (options?.attribution !== false) {\n sitemap.com(\n ` This file was automatically generated by https://github.com/bartholomej/svelte-sitemap v${version} `\n );\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"global.helper.js","names":["pkg.version"],"sources":["../../src/helpers/global.helper.ts"],"sourcesContent":["import fg from 'fast-glob';\nimport fs from 'fs';\nimport path from 'path';\nimport { create } from 'xmlbuilder2';\nimport type { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js';\nimport pkg from '../../package.json' with { type: 'json' };\nimport { CHANGE_FREQ, CHUNK, OUT_DIR } from '../const.js';\nimport type { ChangeFreq, Options, OptionsSvelteSitemap, PagesJson } from './../dto/index.js';\nimport {\n cliColors,\n errorMsgFolder,\n errorMsgHtmlFiles,\n errorMsgWrite,\n successMsg\n} from './vars.helper.js';\n\nconst version = pkg.version;\n\nconst getUrl = (url: string, domain: string, options: Options) => {\n let slash: '' | '/' = getSlash(domain);\n\n let trimmed = url\n .split((options?.outDir ?? OUT_DIR) + '/')\n .pop()\n .replace('index.html', '');\n\n trimmed = removeHtml(trimmed);\n\n // Add all traling slashes\n if (options?.trailingSlashes) {\n trimmed = trimmed.length && !trimmed.endsWith('/') ? trimmed + '/' : trimmed;\n } else {\n trimmed = trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;\n slash = trimmed ? slash : '';\n }\n\n // URI-encode each path segment to handle special characters (e.g. spaces → %20).\n // Decode first to avoid double-encoding already percent-encoded segments.\n trimmed = trimmed\n .split('/')\n .map((segment) => {\n try {\n return encodeURIComponent(decodeURIComponent(segment));\n } catch {\n return encodeURIComponent(segment);\n }\n })\n .join('/');\n\n return `${domain}${slash}${trimmed}`;\n};\n\nexport const removeHtml = (fileName: string) => {\n if (fileName?.endsWith('.html')) {\n return fileName.slice(0, -5);\n }\n return fileName;\n};\n\nexport async function prepareData(domain: string, options?: Options): Promise<PagesJson[]> {\n const FOLDER = options?.outDir ?? OUT_DIR;\n\n const ignore = prepareIgnored(options?.ignore, options?.outDir);\n const changeFreq = prepareChangeFreq(options);\n const pages: string[] = await fg(`${FOLDER}/**/*.html`, { ignore });\n\n if (options.additional) pages.push(...options.additional);\n\n const results = pages.map((page) => {\n return {\n page: getUrl(page, domain, options),\n changeFreq: changeFreq,\n lastMod: options?.resetTime ? new Date().toISOString().split('T')[0] : ''\n };\n });\n\n results.sort((a, b) => a.page.localeCompare(b.page));\n\n detectErrors(\n {\n folder: !fs.existsSync(FOLDER),\n htmlFiles: !pages.length\n },\n FOLDER\n );\n\n await checkPrerenderRoutes(pages, FOLDER, options);\n\n return results;\n}\n\nexport const detectErrors = (\n { folder, htmlFiles }: { folder: boolean; htmlFiles: boolean },\n outDir: string = OUT_DIR\n) => {\n if (folder && htmlFiles) {\n console.error(cliColors.red, errorMsgFolder(outDir));\n } else if (htmlFiles) {\n // If no page exists, then the static adapter is probably not used\n console.error(cliColors.red, errorMsgHtmlFiles(outDir));\n }\n};\n\nexport const checkPrerenderRoutes = async (pages: string[], outDir: string, options?: Options) => {\n // Check if it's a SvelteKit build by checking for the '_app' directory in output folder\n const appDirExists = fs.existsSync(path.join(outDir, '_app'));\n\n if (appDirExists && pages.length > 0) {\n const hasOnlyRootOrFallback = pages.every((page) => {\n const relative = path.relative(outDir, page);\n return relative === 'index.html' || relative === 'fallback.html';\n });\n\n const hasNoAdditional = !options?.additional || options.additional.length === 0;\n\n if (hasOnlyRootOrFallback && hasNoAdditional) {\n console.warn(\n cliColors.yellow,\n ` ⚠️ Warning: Only the homepage or fallback page was found in '${outDir}/'.\\n` +\n ` If your SvelteKit site has multiple routes, make sure you enabled prerendering for them.\\n` +\n ` For SPA (Single Page Apps), you can add routes manually using the 'additional' option.`\n );\n }\n }\n};\n\nexport const writeSitemap = (items: PagesJson[], options: Options, domain: string): void => {\n const outDir = options?.outDir ?? OUT_DIR;\n\n if (items?.length <= CHUNK.maxSize) {\n createFile(items, options, outDir);\n } else {\n // If the number of pages is greater than the chunk size, then we split the sitemap into multiple files\n // and create an index file that links to all of them\n // https://support.google.com/webmasters/answer/183668?hl=en\n const numberOfChunks = Math.ceil(items.length / CHUNK.maxSize);\n\n console.log(\n cliColors.cyanAndBold,\n `> Oh, your site is huge! Writing sitemap in chunks of ${numberOfChunks} pages and its index sitemap.xml`\n );\n\n for (let i = 0; i < items.length; i += CHUNK.maxSize) {\n const chunk = items.slice(i, i + CHUNK.maxSize);\n createFile(chunk, options, outDir, i / CHUNK.maxSize + 1);\n }\n createIndexFile(numberOfChunks, outDir, options, domain);\n }\n};\n\nconst createFile = (\n items: PagesJson[],\n options: Options,\n outDir: string,\n chunkId?: number\n): void => {\n const sitemap = createXml('urlset');\n addAttribution(sitemap, options);\n\n for (const item of items) {\n const page = sitemap.ele('url');\n page.ele('loc').txt(item.page);\n if (item.changeFreq) {\n page.ele('changefreq').txt(item.changeFreq);\n }\n if (item.lastMod) {\n page.ele('lastmod').txt(item.lastMod);\n }\n }\n\n const xml = finishXml(sitemap);\n\n const fileName = chunkId ? `sitemap-${chunkId}.xml` : 'sitemap.xml';\n\n try {\n fs.writeFileSync(`${outDir}/${fileName}`, xml);\n console.log(cliColors.green, successMsg(outDir, fileName));\n } catch (e) {\n console.error(cliColors.red, errorMsgWrite(outDir, fileName), e);\n }\n};\n\nconst createIndexFile = (\n numberOfChunks: number,\n outDir: string,\n options: Options,\n domain: string\n): void => {\n const FILENAME = 'sitemap.xml';\n const slash = getSlash(domain);\n\n const sitemap = createXml('sitemapindex');\n addAttribution(sitemap, options);\n\n for (let i = 1; i <= numberOfChunks; i++) {\n sitemap.ele('sitemap').ele('loc').txt(`${domain}${slash}sitemap-${i}.xml`);\n }\n\n const xml = finishXml(sitemap);\n\n try {\n fs.writeFileSync(`${outDir}/${FILENAME}`, xml);\n console.log(cliColors.green, successMsg(outDir, FILENAME));\n } catch (e) {\n console.error(cliColors.red, errorMsgWrite(outDir, FILENAME), e);\n }\n};\n\nconst prepareIgnored = (\n ignored: string | string[],\n outDir: string = OUT_DIR\n): string[] | undefined => {\n let ignore: string[] | undefined;\n if (ignored) {\n ignore = Array.isArray(ignored) ? ignored : [ignored];\n ignore = ignore.map((ignoredPage) => `${outDir}/${ignoredPage}`);\n }\n return ignore;\n};\n\nconst prepareChangeFreq = (options: Options): ChangeFreq => {\n let result: ChangeFreq = null;\n\n if (options?.changeFreq) {\n if (CHANGE_FREQ.includes(options.changeFreq)) {\n result = options.changeFreq;\n } else {\n console.log(\n cliColors.red,\n ` × Option \\`--change-freq ${options.changeFreq}\\` is not a valid value. See docs: https://github.com/bartholomej/svelte-sitemap#options`\n );\n }\n }\n return result;\n};\n\nconst getSlash = (domain: string) => (domain.split('/').pop() ? '/' : '');\n\nconst createXml = (elementName: 'urlset' | 'sitemapindex'): XMLBuilder => {\n return create({ version: '1.0', encoding: 'UTF-8' }).ele(elementName, {\n xmlns: 'http://www.sitemaps.org/schemas/sitemap/0.9'\n });\n};\n\nconst finishXml = (sitemap: XMLBuilder): string => {\n return sitemap.end({ prettyPrint: true });\n};\n\nconst addAttribution = (sitemap: XMLBuilder, options: Options): void => {\n if (options?.attribution !== false) {\n sitemap.com(\n ` This file was automatically generated by https://github.com/bartholomej/svelte-sitemap v${version} `\n );\n }\n};\n"],"mappings":"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"}
|
package/package.js
CHANGED