Skip to content

Commit

Permalink
- Improved export
Browse files Browse the repository at this point in the history
  • Loading branch information
iamvishnusankar committed Aug 23, 2020
1 parent fa087be commit 46028d2
Show file tree
Hide file tree
Showing 13 changed files with 208 additions and 40 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ Above is the minimal configuration to split a large sitemap. When the number of
| robotsTxtOptions.additionalSitemaps | Options to add addition sitemap to `robots.txt` host entry | string[] |
| autoLastmod (optional) | Add `<lastmod/>` property. Default to `true` | true | |
| exclude | Array of **relative** paths to exclude from listing on `sitemap.xml` or `sitemap-*.xml`. e.g.: `['/page-0', '/page-4']` | string[] |
| sourceDir | next.js build directory. Default `.next` | string |
| outDir | All the generated files will be exported to this directory. Default `public` | string |

## Full configuration

Expand Down
112 changes: 112 additions & 0 deletions azure-pipeline.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
name: 1.1$(rev:.r)
trigger:
branches:
include:
- master
pr:
branches:
include:
- master

pool:
vmImage: 'ubuntu-latest'
demands: npm

steps:
# Setup Node
- task: UseNode@1
displayName: Setup Node
inputs:
version: '14.x'

# Authenticate
- task: npmAuthenticate@0
displayName: NPM Auth
inputs:
workingFile: .npmrc
customEndpoint: 'NPM(Vishnu Sankar)'

# Install
- task: Bash@3
displayName: 'Install'
inputs:
targetType: 'inline'
script: 'yarn install'

# Build
- task: Bash@3
displayName: 'Build'
inputs:
targetType: 'inline'
script: 'yarn build'
failOnStderr: true

# Lint
- task: Bash@3
displayName: 'Lint'
inputs:
targetType: 'inline'
script: 'yarn lint'
failOnStderr: true

# Test
- task: Bash@3
displayName: 'Test'
inputs:
targetType: 'inline'
script: 'yarn test --ci'

# Set Version
- task: Bash@3
displayName: 'Set Version'
inputs:
targetType: 'inline'
script: 'yarn set-version'
failOnStderr: true

# Copy README
- task: Bash@3
displayName: 'Copy README'
inputs:
targetType: 'inline'
script: 'cp README.md packages/next-sitemap/README.md'
failOnStderr: true

# Test Result
- task: PublishTestResults@2
displayName: Publish Test Result
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: 'junit.xml'
failTaskOnFailedTests: true

# Coverage Result
- task: PublishCodeCoverageResults@1
displayName: Publish Coverage Result
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: 'coverage/cobertura-coverage.xml'
failIfCoverageEmpty: true

# Publish Packages
- task: Bash@3
displayName: 'Publish Packages'
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
inputs:
targetType: 'inline'
script: 'yarn ywc publish'
failOnStderr: true

# Github Release
- task: GitHubRelease@1
displayName: Github Release
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
inputs:
gitHubConnection: 'iamvishnusankar'
repositoryName: '$(Build.Repository.Name)'
action: 'create'
target: '$(Build.SourceVersion)'
tagSource: 'userSpecifiedTag'
tag: 'v$(Build.BuildNumber)'
changeLogCompareToRelease: 'lastFullRelease'
changeLogType: 'commitBased'
1 change: 1 addition & 0 deletions example/next-sitemap.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module.exports = {
siteUrl: 'https://example.com',
generateRobotsTxt: true,
sourceDir: 'custom-outdir',
// optional
robotsTxtOptions: {
additionalSitemaps: [
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"dev:docker": "docker-compose up -d",
"dev:test": "jest --watchAll",
"dev:tsc": "tsc --build --watch",
"build:ywc": "ywc clean build",
"build": "ywc clean build",
"build:tsc": "tsc --build",
"set-version": "ywc set-version",
"test": "jest --ci --coverage --verbose",
Expand Down
4 changes: 2 additions & 2 deletions packages/next-sitemap/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
},
"scripts": {
"lint": "tsc --noEmit --declaration",
"build": "tsc && yarn build:cjs",
"build:cjs": "tsc --module commonjs --outDir dist/cjs"
"build": "tsc && yarn build:esnext",
"build:esnext": "tsc --module esnext --outDir dist/esnext"
},
"dependencies": {
"@corex/deepmerge": "^2.3.6"
Expand Down
45 changes: 18 additions & 27 deletions packages/next-sitemap/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,38 @@
import { loadConfig } from './config'
import { loadManifest } from './manifest'
import { createUrlSet, generateUrl } from './url'
import { buildSitemapXml } from './build-sitemap-xml'
import { exportFile } from './file'
import { generateSitemap } from './sitemap'
import { toChunks } from './array'
import { resolveSitemapChunks, KNOWN_PATHS } from './path'
import { generateRobotsTxt } from './robots-txt'
import { resolveSitemapChunks, KNOWN_PATHS, getRuntimePaths } from './path'
import { exportRobotsTxt } from './robots-txt'

// Load next-sitemap.js
const config = loadConfig(KNOWN_PATHS.CONFIG_FILE)

// Get runtime paths
const runtimePaths = getRuntimePaths(config)

// Load next.js manifest files
const manifest = loadManifest()
const manifest = loadManifest(runtimePaths)

// Create url-set based on config and manifest
const urlSet = createUrlSet(config, manifest)
const sitemapPath = `${config.sourceDir}/sitemap.xml`
const robotsTxtFile = `${config.sourceDir}/robots.txt`

export const generateSitemap = (path: string, urls: string[]): void => {
const sitemapXml = buildSitemapXml(config, urls)
exportFile(path, sitemapXml)
}
// Split sitemap into multiple files
const chunks = toChunks(urlSet, config.sitemapSize!)
const sitemapChunks = resolveSitemapChunks(runtimePaths.SITEMAP_FILE, chunks)

// All sitemaps array to keep track of generated sitemap files.
// Later to be added on robots.txt
const allSitemaps: string[] = []

// Split sitemap into multiple files
const chunks = toChunks(urlSet, config.sitemapSize!)
const sitemapChunks = resolveSitemapChunks(sitemapPath, chunks)
// Generate sitemaps from chunks
sitemapChunks.forEach((chunk) => {
generateSitemap(chunk.path, chunk.urls)
generateSitemap(config, chunk.path, chunk.urls)
allSitemaps.push(generateUrl(config.siteUrl, `/${chunk.filename}`))
})

if (config.generateRobotsTxt && config.robotsTxtOptions) {
// Push the known sitemaps to the additionalSitemapList
config.robotsTxtOptions.additionalSitemaps = [
...allSitemaps,
...config.robotsTxtOptions.additionalSitemaps!,
]

const robotsTxt = generateRobotsTxt(config)

if (robotsTxt) {
exportFile(robotsTxtFile, robotsTxt)
}
// Generate robots.txt
if (config.generateRobotsTxt) {
exportRobotsTxt(runtimePaths, config, allSitemaps)
}
7 changes: 7 additions & 0 deletions packages/next-sitemap/src/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,10 @@ export interface ISitemapChunk {
urls: string[]
filename: string
}

export interface IRuntimePaths {
BUILD_MANIFEST: string
PRERENDER_MANIFEST: string
SITEMAP_FILE: string
ROBOTS_TXT_FILE: string
}
17 changes: 13 additions & 4 deletions packages/next-sitemap/src/manifest/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { INextManifest, IPreRenderManifest, IBuildManifest } from '../interface'
import {
INextManifest,
IPreRenderManifest,
IBuildManifest,
IRuntimePaths,
} from '../interface'
import { loadFile } from '../file'

export const loadManifest = (): INextManifest => {
const build = loadFile<IBuildManifest>('')!
const preRender = loadFile<IPreRenderManifest>('')
export const loadManifest = (runtimePaths: IRuntimePaths): INextManifest => {
const build = loadFile<IBuildManifest>(runtimePaths.BUILD_MANIFEST)!

const preRender = loadFile<IPreRenderManifest>(
runtimePaths.PRERENDER_MANIFEST,
false
)

return {
build,
Expand Down
14 changes: 10 additions & 4 deletions packages/next-sitemap/src/path/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import path from 'path'
import { ISitemapChunk } from '../interface'
import { ISitemapChunk, IConfig, IRuntimePaths } from '../interface'

export const getPath = (...pathSegment: string[]): string => {
return path.resolve(process.cwd(), ...pathSegment)
Expand All @@ -21,9 +23,13 @@ export const resolveSitemapChunks = (
})
}

export const RUNTIME_PATHS = {
NEXT_MANIFEST: getPath('.next', 'build-manifest.json'),
PRERENDER_MANIFEST: getPath('.next', 'prerender-manifest.json'),
export const getRuntimePaths = (config: IConfig): IRuntimePaths => {
return {
BUILD_MANIFEST: getPath(config.sourceDir!, 'build-manifest.json'),
PRERENDER_MANIFEST: getPath(config.sourceDir!, 'prerender-manifest.json'),
SITEMAP_FILE: getPath(config.outDir!, 'sitemap.xml'),
ROBOTS_TXT_FILE: getPath(config.outDir!, 'robots.txt'),
}
}

export const KNOWN_PATHS = {
Expand Down
28 changes: 28 additions & 0 deletions packages/next-sitemap/src/robots-txt/export/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { IConfig, IRuntimePaths } from '../../interface'
import { generateRobotsTxt } from '../generate'
import { exportFile } from '../../file'
import { merge } from '@corex/deepmerge'

export const exportRobotsTxt = (
runtimePaths: IRuntimePaths,
config: IConfig,
allSitemaps: string[]
): void => {
// combine-merge allSitemaps with user-provided additionalSitemaps
const newConfig = merge([
{
robotsTxtOptions: {
additionalSitemaps: allSitemaps,
},
},
config,
])

// generate robots text
const robotsTxt = generateRobotsTxt(newConfig)

// create file
if (robotsTxt) {
exportFile(runtimePaths.ROBOTS_TXT_FILE, robotsTxt)
}
}
1 change: 1 addition & 0 deletions packages/next-sitemap/src/robots-txt/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './generate'
export * from './policy'
export * from './export'
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { IConfig } from '../interface'
import { exportFile } from '../file'

export const withXMLTemplate = (content: string): string => {
return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">\n${content}</urlset>`
Expand All @@ -19,3 +20,12 @@ export const buildSitemapXml = (config: IConfig, urls: string[]): string => {

return withXMLTemplate(content)
}

export const generateSitemap = (
config: IConfig,
path: string,
urls: string[]
): void => {
const sitemapXml = buildSitemapXml(config, urls)
exportFile(path, sitemapXml)
}
5 changes: 3 additions & 2 deletions packages/next-sitemap/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
"extends": "@corex/tsconfig",
"compilerOptions": {
"rootDir": "src",
"outDir": "dist/esnext",
"declarationDir": "dist/@types"
"outDir": "dist/cjs",
"declarationDir": "dist/@types",
"module": "CommonJS"
},
"include": ["src"]
}

0 comments on commit 46028d2

Please sign in to comment.