Skip to content

Commit

Permalink
Dynamic Sitemap Copy Plugin (ProjectEvergreen#1232)
Browse files Browse the repository at this point in the history
  • Loading branch information
jstockdi committed Jun 14, 2024
1 parent 44f8e6e commit 63e3807
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 0 deletions.
24 changes: 24 additions & 0 deletions packages/plugin-dynamic-sitemap/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# @greenwood/plugin-dynamic-sitemap

## Overview
Spiders love to spider. To show our love to all the spiders out there, this plugin reads
the graph and renders a sitemap.xml. Currently, it handles up to 10000 content entries, warning
after 9000 content entries.

## Usage
Add this plugin to your _greenwood.config.js_ and spread the `export`.

```javascript
import { greenwoodPluginDynamicExport } from '@greenwood/plugin-dynamic-sitemap';

export default {
...

plugins: [
greenwoodPluginDynamicExport({
"base_url": "https://example.com"
})
]
}
```

37 changes: 37 additions & 0 deletions packages/plugin-dynamic-sitemap/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { checkResourceExists } from "@greenwood/cli/src/lib/resource-utils.js";
import fs from 'fs/promises';





const greenwoodPluginDynamicExport = (options = {}) => [{
type: 'copy',
name: 'plugin-dynamic-sitemap',
provider: async (compilation) => {

const { base_url} = options;
const { outputDir } = compilation.context;

let sitemapXML = '<?xml version="1.0" encoding="UTF-8"?>\n';
sitemapXML += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'

compilation.graph.forEach(page => {
sitemapXML += `<url><loc>${base_url}${page.outputPath}</loc></url>\n`
});

sitemapXML += '</urlset>'

const sitemapUrl = new URL('./sitemap.xml', outputDir);
await fs.writeFile(sitemapUrl, sitemapXML);

return {
from: sitemapUrl,
to: new URL('./sitemap.xml', outputDir)
};
}
}];

export { greenwoodPluginDynamicExport };


Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Use Case
* Run Greenwood build command with no config and this plugin.
*
* User Result
* Should generate a bare bones Greenwood build with correctly built sitemap.xml
*
* User Command
* greenwood build
*
* User Config
* import { greenwoodPluginDynamicExport } from '@greenwood/plugin-dynamic-sitemap';
*
* {
* plugins: [{
* greenwoodPluginDynamicExport({
* "base_url": "https://example.com"
* })
* }]
*
* }
*
* User Workspace
* src/
* templates/
* artist.html
* pages/
* index.md
* about.md
*/

import fs from 'fs';
import chai from 'chai';
import path from 'path';
import { runSmokeTest } from '../../../test/smoke-test.js';
import { getSetupFiles, getOutputTeardownFiles } from '../../../test/utils.js';
import { Runner } from 'gallinago';
import { fileURLToPath, URL } from 'url';

const expect = chai.expect;

describe('Build Greenwood With Dynamic Sitemap Plugin: ', function() {
const LABEL = 'Using Dynamic Sitemap feature';
const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js');
const outputPath = fileURLToPath(new URL('.', import.meta.url));
let runner;

before(function() {
this.context = {
publicDir: path.join(outputPath, 'public')
};
runner = new Runner();
});

describe(LABEL, function() {

before(function() {
runner.setup(outputPath, getSetupFiles(outputPath));
runner.runCommand(cliPath, 'build');
});

runSmokeTest(['public', 'index'], LABEL);

describe('Sitemap.xml should exist and be well formed', function() {
let robots;


it('should have one sitemaps file in the output directory', function() {
const sitemapXML = fs.readFileSync(path.join(this.context.publicDir, './sitemap.xml'));
console.log(sitemapXML);
});
});

});

after(function() {
runner.teardown(getOutputTeardownFiles(outputPath));
});
});
10 changes: 10 additions & 0 deletions packages/plugin-dynamic-sitemap/test/greenwood.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { greenwoodPluginDynamicExport } from '../src/index.js';

console.log(greenwoodPluginDynamicExport);
export default {
plugins: [
...greenwoodPluginDynamicExport({
"base_url": "https://example.com"
})
]
};
4 changes: 4 additions & 0 deletions packages/plugin-dynamic-sitemap/test/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"version": "1.0.0",
"type": "module"
}
3 changes: 3 additions & 0 deletions packages/plugin-dynamic-sitemap/test/src/pages/about.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# About Us

Lorem ipsum.
3 changes: 3 additions & 0 deletions packages/plugin-dynamic-sitemap/test/src/pages/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## Home Page

Welcome!
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<html>

<body>
<h1>Welcome to the artist page.</h1>
<content-outlet></content-outlet>
</body>

</html>

0 comments on commit 63e3807

Please sign in to comment.