@power-seo/sitemap 1.0.0
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 +362 -0
- package/dist/index.cjs +319 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +100 -0
- package/dist/index.d.ts +100 -0
- package/dist/index.js +311 -0
- package/dist/index.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/generator.ts","../src/types.ts","../src/sitemap-index.ts","../src/stream.ts","../src/validate.ts"],"names":["escapeXml","indexEntries","normalizeUrl"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\r\n// @power-seo/sitemap — XML Sitemap Generator\r\n// ============================================================================\r\n\r\nimport type { SitemapConfig, SitemapURL, SitemapImage, SitemapVideo, SitemapNews } from '@power-seo/core';\r\nimport { normalizeUrl } from '@power-seo/core';\r\n\r\n/** Escape special XML characters. */\r\nfunction escapeXml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\n/** Determine which namespace extensions are needed. */\r\nfunction detectNamespaces(urls: SitemapURL[]): { image: boolean; video: boolean; news: boolean } {\r\n let image = false;\r\n let video = false;\r\n let news = false;\r\n for (const url of urls) {\r\n if (url.images && url.images.length > 0) image = true;\r\n if (url.videos && url.videos.length > 0) video = true;\r\n if (url.news) news = true;\r\n if (image && video && news) break;\r\n }\r\n return { image, video, news };\r\n}\r\n\r\nfunction buildImageXml(images: SitemapImage[]): string {\r\n return images\r\n .map((img) => {\r\n let xml = ' <image:image>\\n';\r\n xml += ` <image:loc>${escapeXml(img.loc)}</image:loc>\\n`;\r\n if (img.caption) xml += ` <image:caption>${escapeXml(img.caption)}</image:caption>\\n`;\r\n if (img.geoLocation) xml += ` <image:geo_location>${escapeXml(img.geoLocation)}</image:geo_location>\\n`;\r\n if (img.title) xml += ` <image:title>${escapeXml(img.title)}</image:title>\\n`;\r\n if (img.license) xml += ` <image:license>${escapeXml(img.license)}</image:license>\\n`;\r\n xml += ' </image:image>\\n';\r\n return xml;\r\n })\r\n .join('');\r\n}\r\n\r\nfunction buildVideoXml(videos: SitemapVideo[]): string {\r\n return videos\r\n .map((vid) => {\r\n let xml = ' <video:video>\\n';\r\n xml += ` <video:thumbnail_loc>${escapeXml(vid.thumbnailLoc)}</video:thumbnail_loc>\\n`;\r\n xml += ` <video:title>${escapeXml(vid.title)}</video:title>\\n`;\r\n xml += ` <video:description>${escapeXml(vid.description)}</video:description>\\n`;\r\n if (vid.contentLoc) xml += ` <video:content_loc>${escapeXml(vid.contentLoc)}</video:content_loc>\\n`;\r\n if (vid.playerLoc) xml += ` <video:player_loc>${escapeXml(vid.playerLoc)}</video:player_loc>\\n`;\r\n if (vid.duration !== undefined) xml += ` <video:duration>${vid.duration}</video:duration>\\n`;\r\n if (vid.expirationDate) xml += ` <video:expiration_date>${escapeXml(vid.expirationDate)}</video:expiration_date>\\n`;\r\n if (vid.rating !== undefined) xml += ` <video:rating>${vid.rating}</video:rating>\\n`;\r\n if (vid.viewCount !== undefined) xml += ` <video:view_count>${vid.viewCount}</video:view_count>\\n`;\r\n if (vid.publicationDate) xml += ` <video:publication_date>${escapeXml(vid.publicationDate)}</video:publication_date>\\n`;\r\n if (vid.familyFriendly !== undefined) xml += ` <video:family_friendly>${vid.familyFriendly ? 'yes' : 'no'}</video:family_friendly>\\n`;\r\n if (vid.live !== undefined) xml += ` <video:live>${vid.live ? 'yes' : 'no'}</video:live>\\n`;\r\n xml += ' </video:video>\\n';\r\n return xml;\r\n })\r\n .join('');\r\n}\r\n\r\nfunction buildNewsXml(news: SitemapNews): string {\r\n let xml = ' <news:news>\\n';\r\n xml += ' <news:publication>\\n';\r\n xml += ` <news:name>${escapeXml(news.publication.name)}</news:name>\\n`;\r\n xml += ` <news:language>${escapeXml(news.publication.language)}</news:language>\\n`;\r\n xml += ' </news:publication>\\n';\r\n xml += ` <news:publication_date>${escapeXml(news.publicationDate)}</news:publication_date>\\n`;\r\n xml += ` <news:title>${escapeXml(news.title)}</news:title>\\n`;\r\n xml += ' </news:news>\\n';\r\n return xml;\r\n}\r\n\r\nfunction buildUrlXml(url: SitemapURL, hostname: string): string {\r\n const loc = url.loc.startsWith('http') ? url.loc : normalizeUrl(`${hostname}${url.loc.startsWith('/') ? '' : '/'}${url.loc}`);\r\n\r\n let xml = ' <url>\\n';\r\n xml += ` <loc>${escapeXml(loc)}</loc>\\n`;\r\n if (url.lastmod) xml += ` <lastmod>${escapeXml(url.lastmod)}</lastmod>\\n`;\r\n if (url.changefreq) xml += ` <changefreq>${url.changefreq}</changefreq>\\n`;\r\n if (url.priority !== undefined) xml += ` <priority>${url.priority.toFixed(1)}</priority>\\n`;\r\n if (url.images && url.images.length > 0) xml += buildImageXml(url.images);\r\n if (url.videos && url.videos.length > 0) xml += buildVideoXml(url.videos);\r\n if (url.news) xml += buildNewsXml(url.news);\r\n xml += ' </url>\\n';\r\n return xml;\r\n}\r\n\r\n/**\r\n * Generate an XML sitemap string from a sitemap configuration.\r\n *\r\n * @example\r\n * ```ts\r\n * const xml = generateSitemap({\r\n * hostname: 'https://example.com',\r\n * urls: [\r\n * { loc: '/', changefreq: 'daily', priority: 1.0 },\r\n * { loc: '/about', changefreq: 'monthly', priority: 0.8 },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport function generateSitemap(config: SitemapConfig): string {\r\n const { hostname, urls } = config;\r\n const ns = detectNamespaces(urls);\r\n\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"';\r\n if (ns.image) xml += '\\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"';\r\n if (ns.video) xml += '\\n xmlns:video=\"http://www.google.com/schemas/sitemap-video/1.1\"';\r\n if (ns.news) xml += '\\n xmlns:news=\"http://www.google.com/schemas/sitemap-news/0.9\"';\r\n xml += '>\\n';\r\n\r\n for (const url of urls) {\r\n xml += buildUrlXml(url, hostname);\r\n }\r\n\r\n xml += '</urlset>\\n';\r\n return xml;\r\n}\r\n","// ============================================================================\r\n// @power-seo/sitemap — Types\r\n// ============================================================================\r\n\r\nexport type {\r\n SitemapURL,\r\n SitemapImage,\r\n SitemapVideo,\r\n SitemapNews,\r\n SitemapConfig,\r\n} from '@power-seo/core';\r\n\r\n/** A sitemap entry in a sitemap index. */\r\nexport interface SitemapIndexEntry {\r\n loc: string;\r\n lastmod?: string;\r\n}\r\n\r\n/** Configuration for the sitemap index generator. */\r\nexport interface SitemapIndexConfig {\r\n sitemaps: SitemapIndexEntry[];\r\n}\r\n\r\n/** Result of URL validation. */\r\nexport interface SitemapValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n warnings: string[];\r\n}\r\n\r\n/** Maximum URLs allowed per sitemap file. */\r\nexport const MAX_URLS_PER_SITEMAP = 50_000;\r\n\r\n/** Maximum sitemap file size in bytes (50MB). */\r\nexport const MAX_SITEMAP_SIZE_BYTES = 50 * 1024 * 1024;\r\n","// ============================================================================\r\n// @power-seo/sitemap — Sitemap Index Generator\r\n// ============================================================================\r\n\r\nimport type { SitemapConfig } from '@power-seo/core';\r\nimport type { SitemapIndexConfig, SitemapIndexEntry } from './types.js';\r\nimport { MAX_URLS_PER_SITEMAP } from './types.js';\r\nimport { generateSitemap } from './generator.js';\r\n\r\n/** Escape special XML characters. */\r\nfunction escapeXml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\n/**\r\n * Generate a sitemap index XML string.\r\n *\r\n * @example\r\n * ```ts\r\n * const indexXml = generateSitemapIndex({\r\n * sitemaps: [\r\n * { loc: 'https://example.com/sitemap-0.xml', lastmod: '2024-01-01' },\r\n * { loc: 'https://example.com/sitemap-1.xml', lastmod: '2024-01-01' },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport function generateSitemapIndex(config: SitemapIndexConfig): string {\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += '<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n';\r\n\r\n for (const sitemap of config.sitemaps) {\r\n xml += ' <sitemap>\\n';\r\n xml += ` <loc>${escapeXml(sitemap.loc)}</loc>\\n`;\r\n if (sitemap.lastmod) {\r\n xml += ` <lastmod>${escapeXml(sitemap.lastmod)}</lastmod>\\n`;\r\n }\r\n xml += ' </sitemap>\\n';\r\n }\r\n\r\n xml += '</sitemapindex>\\n';\r\n return xml;\r\n}\r\n\r\n/**\r\n * Split a large sitemap config into multiple sitemaps + an index.\r\n *\r\n * When a site has more than 50,000 URLs, this function splits them into\r\n * multiple sitemap files and returns both the individual sitemaps and\r\n * the index that references them.\r\n *\r\n * @example\r\n * ```ts\r\n * const { index, sitemaps } = splitSitemap({\r\n * hostname: 'https://example.com',\r\n * urls: largeUrlArray,\r\n * });\r\n * // sitemaps[0].xml, sitemaps[1].xml, etc.\r\n * // index = sitemap index XML\r\n * ```\r\n */\r\nexport function splitSitemap(\r\n config: SitemapConfig,\r\n sitemapUrlPattern = '/sitemap-{index}.xml',\r\n): { index: string; sitemaps: Array<{ filename: string; xml: string }> } {\r\n const maxPerSitemap = config.maxUrlsPerSitemap ?? MAX_URLS_PER_SITEMAP;\r\n const { hostname, urls } = config;\r\n\r\n if (urls.length <= maxPerSitemap) {\r\n const xml = generateSitemap(config);\r\n const filename = sitemapUrlPattern.replace('{index}', '0');\r\n const indexEntries: SitemapIndexEntry[] = [{ loc: `${hostname}${filename}` }];\r\n return {\r\n index: generateSitemapIndex({ sitemaps: indexEntries }),\r\n sitemaps: [{ filename, xml }],\r\n };\r\n }\r\n\r\n const sitemaps: Array<{ filename: string; xml: string }> = [];\r\n const indexEntries: SitemapIndexEntry[] = [];\r\n\r\n for (let i = 0; i < urls.length; i += maxPerSitemap) {\r\n const chunk = urls.slice(i, i + maxPerSitemap);\r\n const chunkIndex = Math.floor(i / maxPerSitemap);\r\n const filename = sitemapUrlPattern.replace('{index}', String(chunkIndex));\r\n const xml = generateSitemap({ hostname, urls: chunk });\r\n\r\n sitemaps.push({ filename, xml });\r\n indexEntries.push({ loc: `${hostname}${filename}` });\r\n }\r\n\r\n return {\r\n index: generateSitemapIndex({ sitemaps: indexEntries }),\r\n sitemaps,\r\n };\r\n}\r\n","// ============================================================================\r\n// @power-seo/sitemap — Streaming Sitemap Generator\r\n// ============================================================================\r\n\r\nimport type { SitemapURL } from '@power-seo/core';\r\nimport { normalizeUrl } from '@power-seo/core';\r\n\r\n/** Escape special XML characters. */\r\nfunction escapeXml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\n/**\r\n * A streaming sitemap generator that yields XML chunks.\r\n *\r\n * Useful for server responses where you want to stream the sitemap\r\n * instead of building the entire XML string in memory.\r\n *\r\n * @example\r\n * ```ts\r\n * const stream = streamSitemap('https://example.com', urls);\r\n * for (const chunk of stream) {\r\n * response.write(chunk);\r\n * }\r\n * ```\r\n */\r\nexport function* streamSitemap(\r\n hostname: string,\r\n urls: Iterable<SitemapURL>,\r\n): Generator<string, void, undefined> {\r\n yield '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n yield '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\\n';\r\n yield ' xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\\n';\r\n yield ' xmlns:video=\"http://www.google.com/schemas/sitemap-video/1.1\"\\n';\r\n yield ' xmlns:news=\"http://www.google.com/schemas/sitemap-news/0.9\">\\n';\r\n\r\n for (const url of urls) {\r\n const loc = url.loc.startsWith('http')\r\n ? url.loc\r\n : normalizeUrl(`${hostname}${url.loc.startsWith('/') ? '' : '/'}${url.loc}`);\r\n\r\n yield ' <url>\\n';\r\n yield ` <loc>${escapeXml(loc)}</loc>\\n`;\r\n\r\n if (url.lastmod) yield ` <lastmod>${escapeXml(url.lastmod)}</lastmod>\\n`;\r\n if (url.changefreq) yield ` <changefreq>${url.changefreq}</changefreq>\\n`;\r\n if (url.priority !== undefined) yield ` <priority>${url.priority.toFixed(1)}</priority>\\n`;\r\n\r\n // Images\r\n if (url.images) {\r\n for (const img of url.images) {\r\n yield ' <image:image>\\n';\r\n yield ` <image:loc>${escapeXml(img.loc)}</image:loc>\\n`;\r\n if (img.caption) yield ` <image:caption>${escapeXml(img.caption)}</image:caption>\\n`;\r\n if (img.title) yield ` <image:title>${escapeXml(img.title)}</image:title>\\n`;\r\n yield ' </image:image>\\n';\r\n }\r\n }\r\n\r\n // Videos\r\n if (url.videos) {\r\n for (const vid of url.videos) {\r\n yield ' <video:video>\\n';\r\n yield ` <video:thumbnail_loc>${escapeXml(vid.thumbnailLoc)}</video:thumbnail_loc>\\n`;\r\n yield ` <video:title>${escapeXml(vid.title)}</video:title>\\n`;\r\n yield ` <video:description>${escapeXml(vid.description)}</video:description>\\n`;\r\n if (vid.contentLoc) yield ` <video:content_loc>${escapeXml(vid.contentLoc)}</video:content_loc>\\n`;\r\n if (vid.playerLoc) yield ` <video:player_loc>${escapeXml(vid.playerLoc)}</video:player_loc>\\n`;\r\n yield ' </video:video>\\n';\r\n }\r\n }\r\n\r\n // News\r\n if (url.news) {\r\n yield ' <news:news>\\n';\r\n yield ' <news:publication>\\n';\r\n yield ` <news:name>${escapeXml(url.news.publication.name)}</news:name>\\n`;\r\n yield ` <news:language>${escapeXml(url.news.publication.language)}</news:language>\\n`;\r\n yield ' </news:publication>\\n';\r\n yield ` <news:publication_date>${escapeXml(url.news.publicationDate)}</news:publication_date>\\n`;\r\n yield ` <news:title>${escapeXml(url.news.title)}</news:title>\\n`;\r\n yield ' </news:news>\\n';\r\n }\r\n\r\n yield ' </url>\\n';\r\n }\r\n\r\n yield '</urlset>\\n';\r\n}\r\n","// ============================================================================\r\n// @power-seo/sitemap — URL Validation\r\n// ============================================================================\r\n\r\nimport type { SitemapURL } from '@power-seo/core';\r\nimport { isAbsoluteUrl, MAX_URL_LENGTH } from '@power-seo/core';\r\nimport type { SitemapValidationResult } from './types.js';\r\n\r\nconst VALID_CHANGEFREQ = ['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'];\r\n\r\n/**\r\n * Validate a sitemap URL entry against the sitemap protocol spec.\r\n */\r\nexport function validateSitemapUrl(url: SitemapURL): SitemapValidationResult {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n // loc is required\r\n if (!url.loc || url.loc.trim().length === 0) {\r\n errors.push('URL \"loc\" is required and cannot be empty.');\r\n } else {\r\n if (!isAbsoluteUrl(url.loc)) {\r\n errors.push(`URL \"${url.loc}\" must be an absolute URL (starting with http:// or https://).`);\r\n }\r\n\r\n if (url.loc.length > 2048) {\r\n errors.push(`URL \"${url.loc}\" exceeds the maximum length of 2048 characters.`);\r\n }\r\n\r\n if (url.loc.length > MAX_URL_LENGTH) {\r\n warnings.push(\r\n `URL \"${url.loc}\" is ${url.loc.length} characters. URLs under ${MAX_URL_LENGTH} characters are recommended for SEO.`,\r\n );\r\n }\r\n }\r\n\r\n // lastmod validation\r\n if (url.lastmod) {\r\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2})?([+-]\\d{2}:\\d{2}|Z)?)?$/;\r\n if (!dateRegex.test(url.lastmod)) {\r\n errors.push(\r\n `\"lastmod\" value \"${url.lastmod}\" is not a valid W3C datetime format (YYYY-MM-DD or ISO 8601).`,\r\n );\r\n }\r\n }\r\n\r\n // changefreq validation\r\n if (url.changefreq && !VALID_CHANGEFREQ.includes(url.changefreq)) {\r\n errors.push(\r\n `\"changefreq\" value \"${url.changefreq}\" is invalid. Must be one of: ${VALID_CHANGEFREQ.join(', ')}.`,\r\n );\r\n }\r\n\r\n // priority validation\r\n if (url.priority !== undefined) {\r\n if (url.priority < 0 || url.priority > 1) {\r\n errors.push(`\"priority\" value ${url.priority} is out of range. Must be between 0.0 and 1.0.`);\r\n }\r\n }\r\n\r\n // Image validation\r\n if (url.images) {\r\n for (let i = 0; i < url.images.length; i++) {\r\n const img = url.images[i]!;\r\n if (!img.loc || img.loc.trim().length === 0) {\r\n errors.push(`Image ${i + 1}: \"loc\" is required.`);\r\n } else if (!isAbsoluteUrl(img.loc)) {\r\n errors.push(`Image ${i + 1}: \"${img.loc}\" must be an absolute URL.`);\r\n }\r\n }\r\n if (url.images.length > 1000) {\r\n warnings.push(`URL has ${url.images.length} images. Google supports up to 1,000 images per page.`);\r\n }\r\n }\r\n\r\n // Video validation\r\n if (url.videos) {\r\n for (let i = 0; i < url.videos.length; i++) {\r\n const vid = url.videos[i]!;\r\n if (!vid.title) errors.push(`Video ${i + 1}: \"title\" is required.`);\r\n if (!vid.description) errors.push(`Video ${i + 1}: \"description\" is required.`);\r\n if (!vid.thumbnailLoc) errors.push(`Video ${i + 1}: \"thumbnailLoc\" is required.`);\r\n if (!vid.contentLoc && !vid.playerLoc) {\r\n errors.push(`Video ${i + 1}: either \"contentLoc\" or \"playerLoc\" must be provided.`);\r\n }\r\n if (vid.rating !== undefined && (vid.rating < 0 || vid.rating > 5)) {\r\n errors.push(`Video ${i + 1}: \"rating\" must be between 0.0 and 5.0.`);\r\n }\r\n }\r\n }\r\n\r\n // News validation\r\n if (url.news) {\r\n if (!url.news.publication?.name) errors.push('News: \"publication.name\" is required.');\r\n if (!url.news.publication?.language) errors.push('News: \"publication.language\" is required.');\r\n if (!url.news.publicationDate) errors.push('News: \"publicationDate\" is required.');\r\n if (!url.news.title) errors.push('News: \"title\" is required.');\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n };\r\n}\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@power-seo/sitemap",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "XML sitemap generation, streaming, and validation with image, video, and news support",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"require": "./dist/index.cjs",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.cjs",
|
|
15
|
+
"module": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"lint": "eslint src/",
|
|
27
|
+
"lint:fix": "eslint src/ --fix",
|
|
28
|
+
"clean": "rimraf dist"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@power-seo/core": "workspace:*"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"rimraf": "^6.0.0",
|
|
35
|
+
"tsup": "^8.3.0",
|
|
36
|
+
"typescript": "^5.7.0",
|
|
37
|
+
"vitest": "^2.1.0"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"seo",
|
|
41
|
+
"sitemap",
|
|
42
|
+
"xml",
|
|
43
|
+
"sitemap-index",
|
|
44
|
+
"typescript"
|
|
45
|
+
],
|
|
46
|
+
"sideEffects": false,
|
|
47
|
+
"author": "CyberCraft Bangladesh <info@ccbd.dev>",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "git+https://github.com/cybercraftbd/power-seo.git",
|
|
51
|
+
"directory": "packages/sitemap"
|
|
52
|
+
},
|
|
53
|
+
"publishConfig": {
|
|
54
|
+
"access": "public"
|
|
55
|
+
}
|
|
56
|
+
}
|