From db619c84e4fb5535b2525118f5925ea6bc256e09 Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Fri, 14 Jun 2024 01:46:02 +0000 Subject: [PATCH 1/9] Dynamic Sitemap Copy Plugin (#1232) --- .../resource/plugin-resouce-sitemap.js | 50 +++++++++++ packages/plugin-adapter-sitemap/src/index.js | 30 +++++++ .../cases/build.default/build.default.spec.js | 89 +++++++++++++++++++ .../cases/build.default/greenwood.config.js | 8 ++ .../cases/build.default/src/pages/about.md | 3 + .../cases/build.default/src/pages/index.md | 3 + .../cases/build.default/src/sitemap.xml.js | 17 ++++ packages/plugin-dynamic-sitemap/README.md | 24 +++++ packages/plugin-dynamic-sitemap/src/index.js | 30 +++++++ .../test/copy.default.dynamic-sitemap.spec.js | 74 +++++++++++++++ .../test/greenwood.config.js | 10 +++ .../plugin-dynamic-sitemap/test/package.json | 4 + .../test/src/pages/about.md | 3 + .../test/src/pages/index.md | 3 + .../test/src/templates/artist.html | 8 ++ 15 files changed, 356 insertions(+) create mode 100644 packages/cli/src/plugins/resource/plugin-resouce-sitemap.js create mode 100644 packages/plugin-adapter-sitemap/src/index.js create mode 100644 packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js create mode 100644 packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js create mode 100644 packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/about.md create mode 100644 packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/index.md create mode 100644 packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js create mode 100644 packages/plugin-dynamic-sitemap/README.md create mode 100644 packages/plugin-dynamic-sitemap/src/index.js create mode 100644 packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js create mode 100644 packages/plugin-dynamic-sitemap/test/greenwood.config.js create mode 100644 packages/plugin-dynamic-sitemap/test/package.json create mode 100644 packages/plugin-dynamic-sitemap/test/src/pages/about.md create mode 100644 packages/plugin-dynamic-sitemap/test/src/pages/index.md create mode 100644 packages/plugin-dynamic-sitemap/test/src/templates/artist.html diff --git a/packages/cli/src/plugins/resource/plugin-resouce-sitemap.js b/packages/cli/src/plugins/resource/plugin-resouce-sitemap.js new file mode 100644 index 000000000..d5a28f008 --- /dev/null +++ b/packages/cli/src/plugins/resource/plugin-resouce-sitemap.js @@ -0,0 +1,50 @@ +/* + * + * Sitemap + * + */ + +import { ResourceInterface } from '../../lib/resource-interface.js'; + +class SitemapResource extends ResourceInterface { + constructor(compilation, options) { + super(compilation, options); + } + + async shouldServe(url) { + return url.pathname.endsWith('sitemap.xml') + } + + + async serve(url) { + + //TODO: check if module exists + + const { projectDirectory } = compilation.context; + + try { + const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); + const sitemap = await sitemapModule.generateSitemap(this.compilation); + return new Response(sitemap, { headers: { 'Content-Type': 'text/xml' } }); + + } catch (error) { + console.error('Error loading module: ./sitemap.xml.js', error); + return new Response("Sitemap oops.", { headers: { 'Content-Type': 'text/xml' } }); + } + + } + +} + +const greenwoodPluginResourceSitemap = { + type: 'resource', + name: 'plugin-sitemap', + provider: (compilation, options) => new SitemapResource(compilation, options) +}; + +export { greenwoodPluginResourceSitemap }; + + + + + diff --git a/packages/plugin-adapter-sitemap/src/index.js b/packages/plugin-adapter-sitemap/src/index.js new file mode 100644 index 000000000..b85f4ca3e --- /dev/null +++ b/packages/plugin-adapter-sitemap/src/index.js @@ -0,0 +1,30 @@ +import fs from 'fs/promises'; + + +async function sitemapAdapter(compilation) { + try { + const { outputDir, projectDirectory } = compilation.context; + const adapterOutputUrl = new URL('./sitemap.xml', outputDir); + + // Check if module exists + const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); + const sitemap = await sitemapModule.generateSitemap(compilation); + + await fs.writeFile(adapterOutputUrl, sitemap); + console.info('Wrote sitemap to ./sitemap.xml'); + } catch (error) { + console.error('Error in sitemapAdapter:', error); + } +} + +const greenwoodPluginAdapterSitemap = (options = {}) => [{ + type: 'adapter', + name: 'plugin-adapter-sitemap', + provider: (compilation) => { + return async () => { + await sitemapAdapter(compilation, options); + }; + } +}]; + +export { greenwoodPluginAdapterSitemap }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js b/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js new file mode 100644 index 000000000..1a592dad1 --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js @@ -0,0 +1,89 @@ +/* + * Use Case + * Run Greenwood with the sitemap adapter plugin. + * + * User Result + * Should generate a static Greenwood build with a sitemap rendered. + * + * User Command + * greenwood build + * + * User Config + * import { greenwoodPluginAdapterSitemap } from '../../../src/index.js'; +* +* export default { +* plugins: [ +* greenwoodPluginAdapterSitemap() +* ] +* }; + * + * User Workspace + * TBD + */ +import chai from 'chai'; +import fs from 'fs/promises'; +import glob from 'glob-promise'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import { checkResourceExists } from '../../../../cli/src/lib/resource-utils.js'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { normalizePathnameForWindows } from '../../../../cli/src/lib/resource-utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath } from 'url'; + +const expect = chai.expect; + +describe('Build Greenwood With: ', function() { + const LABEL = 'Sitemap Adapter plugin output'; + const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); + const outputPath = fileURLToPath(new URL('.', import.meta.url)); + const publicDir = path.join(outputPath, 'public') + + 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'); + }); + + describe('sitemap.xml', function() { + it('should be present', async function() { + const sitemapPath = path.join(publicDir, 'sitemap.xml') + + const itExists = await checkResourceExists(new URL(`file://${sitemapPath}`)); + expect(itExists).to.be.equal(true); + + }); + + it('should have the correct first element in the list', async function() { + const sitemapPath = path.join(publicDir, 'sitemap.xml'); + const text = await fs.readFile(sitemapPath, 'utf8'); + + + const regex = /(http:\/\/www\.example\.com\/about\/)<\/loc>/; + const match = text.match(regex); + + expect(match[1]).to.equal('http://www.example.com/about/'); + }); + + + }); + + }); + + // after(function() { + // runner.teardown([ + // path.join(outputPath, '.vercel'), + // ...getOutputTeardownFiles(outputPath) + // ]); + // }); + +}); \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js new file mode 100644 index 000000000..8fafa65ee --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js @@ -0,0 +1,8 @@ + +import { greenwoodPluginAdapterSitemap } from '../../../src/index.js'; + +export default { + plugins: [ + greenwoodPluginAdapterSitemap() + ] +}; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/about.md b/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/about.md new file mode 100644 index 000000000..4093eb641 --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/about.md @@ -0,0 +1,3 @@ +# About Us + +Lorem ipsum. \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/index.md b/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/index.md new file mode 100644 index 000000000..46c5f357e --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/index.md @@ -0,0 +1,3 @@ +## Home Page + +Welcome! \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js b/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js new file mode 100644 index 000000000..d6b779b4d --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js @@ -0,0 +1,17 @@ +async function generateSitemap(compilation){ + const urls = compilation.graph.map((page) => { + return ` + http://www.example.com${page.route} + `; + }); + return ` + + +${urls.join('\n')} + + `; + } + + + + export { generateSitemap }; \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/README.md b/packages/plugin-dynamic-sitemap/README.md new file mode 100644 index 000000000..33abb58b6 --- /dev/null +++ b/packages/plugin-dynamic-sitemap/README.md @@ -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({ + "baseUrl": "https://example.com" + }) + ] +} +``` + diff --git a/packages/plugin-dynamic-sitemap/src/index.js b/packages/plugin-dynamic-sitemap/src/index.js new file mode 100644 index 000000000..3c156d9cd --- /dev/null +++ b/packages/plugin-dynamic-sitemap/src/index.js @@ -0,0 +1,30 @@ +import fs from 'fs/promises'; + +const greenwoodPluginDynamicExport = (options = {}) => [{ + type: 'copy', + name: 'plugin-dynamic-sitemap', + provider: async (compilation) => { + + const { baseUrl } = options; + const { outputDir } = compilation.context; + + let sitemapXML = '\n'; + sitemapXML += '\n'; + + compilation.graph.forEach(page => { + sitemapXML += `${baseUrl}${page.outputPath}\n`; + }); + + sitemapXML += ''; + + const sitemapUrl = new URL('./sitemap.xml', outputDir); + await fs.writeFile(sitemapUrl, sitemapXML); + + return { + from: sitemapUrl, + to: new URL('./sitemap.xml', outputDir) + }; + } +}]; + +export { greenwoodPluginDynamicExport }; \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js b/packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js new file mode 100644 index 000000000..196f4ccde --- /dev/null +++ b/packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js @@ -0,0 +1,74 @@ +/* + * 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({ + * "baseUrl": "https://example.com" + * }) + * }] + * + * } + * + * User Workspace +* src/ +* templates/ +* artist.html +* pages/ +* index.md +* about.md +*/ + +import fs from 'fs'; +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'; + +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() { + + 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)); + }); +}); \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/greenwood.config.js b/packages/plugin-dynamic-sitemap/test/greenwood.config.js new file mode 100644 index 000000000..20aa502cd --- /dev/null +++ b/packages/plugin-dynamic-sitemap/test/greenwood.config.js @@ -0,0 +1,10 @@ +import { greenwoodPluginDynamicExport } from '../src/index.js'; + +console.log(greenwoodPluginDynamicExport); +export default { + plugins: [ + ...greenwoodPluginDynamicExport({ + 'baseUrl': 'https://example.com' + }) + ] +}; \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/package.json b/packages/plugin-dynamic-sitemap/test/package.json new file mode 100644 index 000000000..1a1e6d1d1 --- /dev/null +++ b/packages/plugin-dynamic-sitemap/test/package.json @@ -0,0 +1,4 @@ +{ + "version": "1.0.0", + "type": "module" +} \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/src/pages/about.md b/packages/plugin-dynamic-sitemap/test/src/pages/about.md new file mode 100644 index 000000000..4093eb641 --- /dev/null +++ b/packages/plugin-dynamic-sitemap/test/src/pages/about.md @@ -0,0 +1,3 @@ +# About Us + +Lorem ipsum. \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/src/pages/index.md b/packages/plugin-dynamic-sitemap/test/src/pages/index.md new file mode 100644 index 000000000..46c5f357e --- /dev/null +++ b/packages/plugin-dynamic-sitemap/test/src/pages/index.md @@ -0,0 +1,3 @@ +## Home Page + +Welcome! \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/src/templates/artist.html b/packages/plugin-dynamic-sitemap/test/src/templates/artist.html new file mode 100644 index 000000000..0087d30c1 --- /dev/null +++ b/packages/plugin-dynamic-sitemap/test/src/templates/artist.html @@ -0,0 +1,8 @@ + + + +

Welcome to the artist page.

+ + + + \ No newline at end of file From 076ce0f4f76afe629b7c99c3996d88d51bf20358 Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Sun, 21 Jul 2024 10:19:25 -0400 Subject: [PATCH 2/9] Dynamic Sitemap - cleanup (#1232) --- .../resource/plugin-resouce-sitemap.js | 50 ------------------- packages/plugin-adapter-sitemap/src/index.js | 46 +++++++++++++++++ .../cases/build.default/greenwood.config.js | 5 +- 3 files changed, 49 insertions(+), 52 deletions(-) delete mode 100644 packages/cli/src/plugins/resource/plugin-resouce-sitemap.js diff --git a/packages/cli/src/plugins/resource/plugin-resouce-sitemap.js b/packages/cli/src/plugins/resource/plugin-resouce-sitemap.js deleted file mode 100644 index d5a28f008..000000000 --- a/packages/cli/src/plugins/resource/plugin-resouce-sitemap.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Sitemap - * - */ - -import { ResourceInterface } from '../../lib/resource-interface.js'; - -class SitemapResource extends ResourceInterface { - constructor(compilation, options) { - super(compilation, options); - } - - async shouldServe(url) { - return url.pathname.endsWith('sitemap.xml') - } - - - async serve(url) { - - //TODO: check if module exists - - const { projectDirectory } = compilation.context; - - try { - const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); - const sitemap = await sitemapModule.generateSitemap(this.compilation); - return new Response(sitemap, { headers: { 'Content-Type': 'text/xml' } }); - - } catch (error) { - console.error('Error loading module: ./sitemap.xml.js', error); - return new Response("Sitemap oops.", { headers: { 'Content-Type': 'text/xml' } }); - } - - } - -} - -const greenwoodPluginResourceSitemap = { - type: 'resource', - name: 'plugin-sitemap', - provider: (compilation, options) => new SitemapResource(compilation, options) -}; - -export { greenwoodPluginResourceSitemap }; - - - - - diff --git a/packages/plugin-adapter-sitemap/src/index.js b/packages/plugin-adapter-sitemap/src/index.js index b85f4ca3e..5e203d87d 100644 --- a/packages/plugin-adapter-sitemap/src/index.js +++ b/packages/plugin-adapter-sitemap/src/index.js @@ -27,4 +27,50 @@ const greenwoodPluginAdapterSitemap = (options = {}) => [{ } }]; + +/* + * + * Sitemap + * + */ + +import { ResourceInterface } from '@greenwood/cli/src/lib/resource-interface.js'; + +class SitemapResource extends ResourceInterface { + constructor(compilation, options) { + super(compilation, options); + } + + async shouldServe(url) { + return url.pathname.endsWith('sitemap.xml') + } + + + async serve(url) { + + //TODO: check if module exists + + const { projectDirectory } = this.compilation.context; + + try { + const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); + const sitemap = await sitemapModule.generateSitemap(this.compilation); + return new Response(sitemap, { headers: { 'Content-Type': 'text/xml' } }); + + } catch (error) { + console.error('Error loading module: ./sitemap.xml.js', error); + return new Response("Sitemap oops.", { headers: { 'Content-Type': 'text/xml' } }); + } + + } + +} + +const greenwoodPluginResourceSitemap = { + type: 'resource', + name: 'plugin-sitemap', + provider: (compilation, options) => new SitemapResource(compilation, options) +}; + +export { greenwoodPluginResourceSitemap }; export { greenwoodPluginAdapterSitemap }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js index 8fafa65ee..1537f1e2d 100644 --- a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js @@ -1,8 +1,9 @@ -import { greenwoodPluginAdapterSitemap } from '../../../src/index.js'; +import { greenwoodPluginAdapterSitemap, greenwoodPluginResourceSitemap } from '../../../src/index.js'; export default { plugins: [ - greenwoodPluginAdapterSitemap() + greenwoodPluginAdapterSitemap(), + greenwoodPluginResourceSitemap ] }; \ No newline at end of file From e1903c3977ed38e49f5e724991fe20df863664b0 Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Sun, 21 Jul 2024 11:52:09 -0400 Subject: [PATCH 3/9] Dynamic Sitemap - develop test (#1232) --- .../cases/build.default/build.default.spec.js | 12 +-- .../develop.default/develop.default.spec.js | 73 +++++++++++++++++++ .../cases/develop.default/greenwood.config.js | 9 +++ .../cases/develop.default/src/pages/about.md | 3 + .../cases/develop.default/src/pages/index.md | 3 + .../cases/develop.default/src/sitemap.xml.js | 17 +++++ 6 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js create mode 100644 packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js create mode 100644 packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/about.md create mode 100644 packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/index.md create mode 100644 packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js b/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js index 1a592dad1..3c14d2835 100644 --- a/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js @@ -79,11 +79,11 @@ describe('Build Greenwood With: ', function() { }); - // after(function() { - // runner.teardown([ - // path.join(outputPath, '.vercel'), - // ...getOutputTeardownFiles(outputPath) - // ]); - // }); + after(function() { + runner.stopCommand(); + runner.teardown([ + path.join(outputPath, '.greenwood') + ]); + }); }); \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js new file mode 100644 index 000000000..ee01ba63b --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js @@ -0,0 +1,73 @@ + +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath } from 'url'; + +import chai from 'chai'; +const expect = chai.expect; + +describe('Develop Sitemap With: ', function() { + + const LABEL = 'Sitemap Resource plugin output'; + + const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); + const outputPath = fileURLToPath(new URL('.', import.meta.url)); + const hostname = 'http://localhost'; + const port = 1984; + let runner; + + before(function() { + this.context = { + hostname: `${hostname}:${port}` + }; + runner = new Runner(); + }); + + describe(LABEL, function() { + + before(async function() { + runner.setup(outputPath); + + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, 5000); + + runner.runCommand(cliPath, 'develop', { async: true }); + }); + }); + + describe('Sitemap.xml', function() { + let response = {}; + let text; + + before(async function() { + response = await fetch(`${hostname}:${port}/sitemap.xml`); + text = await response.text(); + }); + + it('should return a 200', function() { + expect(response.status).to.equal(200); + }); + + it('should return the correct content type', function() { + expect(response.headers.get('content-type')).to.equal('text/xml'); + }); + + it('should contain loc element', function() { + const regex = /(http:\/\/www\.example\.com\/about\/)<\/loc>/; + const match = text.match(regex); + + expect(match[1]).to.equal('http://www.example.com/about/'); + + }); + }); + }); + + after(function() { + runner.stopCommand(); + runner.teardown([ + path.join(outputPath, '.greenwood') + ]); + }); +}); \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js new file mode 100644 index 000000000..1537f1e2d --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js @@ -0,0 +1,9 @@ + +import { greenwoodPluginAdapterSitemap, greenwoodPluginResourceSitemap } from '../../../src/index.js'; + +export default { + plugins: [ + greenwoodPluginAdapterSitemap(), + greenwoodPluginResourceSitemap + ] +}; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/about.md b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/about.md new file mode 100644 index 000000000..4093eb641 --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/about.md @@ -0,0 +1,3 @@ +# About Us + +Lorem ipsum. \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/index.md b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/index.md new file mode 100644 index 000000000..46c5f357e --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/index.md @@ -0,0 +1,3 @@ +## Home Page + +Welcome! \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js new file mode 100644 index 000000000..d6b779b4d --- /dev/null +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js @@ -0,0 +1,17 @@ +async function generateSitemap(compilation){ + const urls = compilation.graph.map((page) => { + return ` + http://www.example.com${page.route} + `; + }); + return ` + + +${urls.join('\n')} + + `; + } + + + + export { generateSitemap }; \ No newline at end of file From 3de7f8a143b7adf24b64cfe134ad270cd2da45ab Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Sun, 21 Jul 2024 13:08:22 -0400 Subject: [PATCH 4/9] Dynamic Sitemap - linting (#1232) --- packages/plugin-adapter-sitemap/src/index.js | 16 ++++++--------- .../cases/build.default/build.default.spec.js | 17 ++++++---------- .../cases/build.default/src/sitemap.xml.js | 20 +++++++++---------- .../develop.default/develop.default.spec.js | 4 ++-- .../cases/develop.default/src/sitemap.xml.js | 19 +++++++++--------- 5 files changed, 32 insertions(+), 44 deletions(-) diff --git a/packages/plugin-adapter-sitemap/src/index.js b/packages/plugin-adapter-sitemap/src/index.js index 5e203d87d..bc45d10e0 100644 --- a/packages/plugin-adapter-sitemap/src/index.js +++ b/packages/plugin-adapter-sitemap/src/index.js @@ -1,6 +1,5 @@ import fs from 'fs/promises'; - async function sitemapAdapter(compilation) { try { const { outputDir, projectDirectory } = compilation.context; @@ -27,7 +26,6 @@ const greenwoodPluginAdapterSitemap = (options = {}) => [{ } }]; - /* * * Sitemap @@ -40,16 +38,14 @@ class SitemapResource extends ResourceInterface { constructor(compilation, options) { super(compilation, options); } - + async shouldServe(url) { - return url.pathname.endsWith('sitemap.xml') + return url.pathname.endsWith('sitemap.xml'); } - + // eslint-disable-next-line no-unused-vars async serve(url) { - //TODO: check if module exists - const { projectDirectory } = this.compilation.context; try { @@ -58,10 +54,10 @@ class SitemapResource extends ResourceInterface { return new Response(sitemap, { headers: { 'Content-Type': 'text/xml' } }); } catch (error) { - console.error('Error loading module: ./sitemap.xml.js', error); - return new Response("Sitemap oops.", { headers: { 'Content-Type': 'text/xml' } }); + console.error('Error loading module: ./sitemap.xml.js Does it exist?', error); + return new Response('Sitemap oops.', { headers: { 'Content-Type': 'text/xml' } }); } - + } } diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js b/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js index 3c14d2835..1d91dbee4 100644 --- a/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js @@ -10,7 +10,7 @@ * * User Config * import { greenwoodPluginAdapterSitemap } from '../../../src/index.js'; -* +* * export default { * plugins: [ * greenwoodPluginAdapterSitemap() @@ -22,12 +22,9 @@ */ import chai from 'chai'; import fs from 'fs/promises'; -import glob from 'glob-promise'; -import { JSDOM } from 'jsdom'; import path from 'path'; import { checkResourceExists } from '../../../../cli/src/lib/resource-utils.js'; -import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; -import { normalizePathnameForWindows } from '../../../../cli/src/lib/resource-utils.js'; +import { getSetupFiles } from '../../../../../test/utils.js'; import { Runner } from 'gallinago'; import { fileURLToPath } from 'url'; @@ -37,8 +34,8 @@ describe('Build Greenwood With: ', function() { const LABEL = 'Sitemap Adapter plugin output'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); const outputPath = fileURLToPath(new URL('.', import.meta.url)); - const publicDir = path.join(outputPath, 'public') - + const publicDir = path.join(outputPath, 'public'); + let runner; before(function() { @@ -56,7 +53,7 @@ describe('Build Greenwood With: ', function() { describe('sitemap.xml', function() { it('should be present', async function() { - const sitemapPath = path.join(publicDir, 'sitemap.xml') + const sitemapPath = path.join(publicDir, 'sitemap.xml'); const itExists = await checkResourceExists(new URL(`file://${sitemapPath}`)); expect(itExists).to.be.equal(true); @@ -66,15 +63,13 @@ describe('Build Greenwood With: ', function() { it('should have the correct first element in the list', async function() { const sitemapPath = path.join(publicDir, 'sitemap.xml'); const text = await fs.readFile(sitemapPath, 'utf8'); - - + const regex = /(http:\/\/www\.example\.com\/about\/)<\/loc>/; const match = text.match(regex); expect(match[1]).to.equal('http://www.example.com/about/'); }); - }); }); diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js b/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js index d6b779b4d..7fbac0ba1 100644 --- a/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js @@ -1,17 +1,15 @@ -async function generateSitemap(compilation){ - const urls = compilation.graph.map((page) => { - return ` - http://www.example.com${page.route} +async function generateSitemap(compilation) { + const urls = compilation.graph.map((page) => { + return ` + http://www.example.com${page.route} `; - }); - return ` + }); + return ` ${urls.join('\n')} - `; - } +`; +} - - - export { generateSitemap }; \ No newline at end of file +export { generateSitemap }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js index ee01ba63b..3e9efcee1 100644 --- a/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js @@ -9,7 +9,7 @@ const expect = chai.expect; describe('Develop Sitemap With: ', function() { const LABEL = 'Sitemap Resource plugin output'; - + const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); const outputPath = fileURLToPath(new URL('.', import.meta.url)); const hostname = 'http://localhost'; @@ -59,7 +59,7 @@ describe('Develop Sitemap With: ', function() { const match = text.match(regex); expect(match[1]).to.equal('http://www.example.com/about/'); - + }); }); }); diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js index d6b779b4d..2b1f8eba0 100644 --- a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js @@ -1,17 +1,16 @@ -async function generateSitemap(compilation){ - const urls = compilation.graph.map((page) => { - return ` - http://www.example.com${page.route} +async function generateSitemap(compilation) { + const urls = compilation.graph.map((page) => { + return ` + http://www.example.com${page.route} `; - }); - return ` + }); + + return ` ${urls.join('\n')} `; - } - - +} - export { generateSitemap }; \ No newline at end of file +export { generateSitemap }; \ No newline at end of file From d94bcba83a997b3ae93dc69bb93dafd8753e7c2c Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Mon, 22 Jul 2024 10:38:35 +0000 Subject: [PATCH 5/9] Dynamic Sitemap - combining plugins (#1232) --- packages/plugin-adapter-sitemap/src/index.js | 29 +++++++++---------- .../cases/build.default/greenwood.config.js | 5 ++-- .../cases/develop.default/greenwood.config.js | 5 ++-- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/packages/plugin-adapter-sitemap/src/index.js b/packages/plugin-adapter-sitemap/src/index.js index bc45d10e0..aafd11ba8 100644 --- a/packages/plugin-adapter-sitemap/src/index.js +++ b/packages/plugin-adapter-sitemap/src/index.js @@ -1,4 +1,5 @@ import fs from 'fs/promises'; +import { ResourceInterface } from '@greenwood/cli/src/lib/resource-interface.js'; async function sitemapAdapter(compilation) { try { @@ -16,24 +17,12 @@ async function sitemapAdapter(compilation) { } } -const greenwoodPluginAdapterSitemap = (options = {}) => [{ - type: 'adapter', - name: 'plugin-adapter-sitemap', - provider: (compilation) => { - return async () => { - await sitemapAdapter(compilation, options); - }; - } -}]; - /* * * Sitemap * */ -import { ResourceInterface } from '@greenwood/cli/src/lib/resource-interface.js'; - class SitemapResource extends ResourceInterface { constructor(compilation, options) { super(compilation, options); @@ -62,11 +51,19 @@ class SitemapResource extends ResourceInterface { } -const greenwoodPluginResourceSitemap = { +const greenwoodPluginSitemap = (options = {}) => [{ + type: 'adapter', + name: 'plugin-adapter-sitemap', + provider: (compilation) => { + return async () => { + await sitemapAdapter(compilation, options); + }; + } +}, +{ type: 'resource', name: 'plugin-sitemap', provider: (compilation, options) => new SitemapResource(compilation, options) -}; +}]; -export { greenwoodPluginResourceSitemap }; -export { greenwoodPluginAdapterSitemap }; \ No newline at end of file +export { greenwoodPluginSitemap }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js index 1537f1e2d..fe547b47b 100644 --- a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js @@ -1,9 +1,8 @@ -import { greenwoodPluginAdapterSitemap, greenwoodPluginResourceSitemap } from '../../../src/index.js'; +import { greenwoodPluginSitemap } from '../../../src/index.js'; export default { plugins: [ - greenwoodPluginAdapterSitemap(), - greenwoodPluginResourceSitemap + greenwoodPluginSitemap(), ] }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js index 1537f1e2d..fe547b47b 100644 --- a/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js @@ -1,9 +1,8 @@ -import { greenwoodPluginAdapterSitemap, greenwoodPluginResourceSitemap } from '../../../src/index.js'; +import { greenwoodPluginSitemap } from '../../../src/index.js'; export default { plugins: [ - greenwoodPluginAdapterSitemap(), - greenwoodPluginResourceSitemap + greenwoodPluginSitemap(), ] }; \ No newline at end of file From 53fb3b688436f6ff0a50897a3a0895041f7f328e Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Mon, 22 Jul 2024 10:43:25 +0000 Subject: [PATCH 6/9] Dynamic Sitemap - dangling comma (#1232) --- .../test/cases/build.default/greenwood.config.js | 2 +- .../test/cases/develop.default/greenwood.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js index fe547b47b..d4bed8353 100644 --- a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js +++ b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js @@ -3,6 +3,6 @@ import { greenwoodPluginSitemap } from '../../../src/index.js'; export default { plugins: [ - greenwoodPluginSitemap(), + greenwoodPluginSitemap() ] }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js index fe547b47b..d4bed8353 100644 --- a/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js +++ b/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js @@ -3,6 +3,6 @@ import { greenwoodPluginSitemap } from '../../../src/index.js'; export default { plugins: [ - greenwoodPluginSitemap(), + greenwoodPluginSitemap() ] }; \ No newline at end of file From 9564d0c446a4c867153424af112dfbd6cdfa7673 Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Sat, 27 Jul 2024 13:00:49 +0000 Subject: [PATCH 7/9] Dynamic Sitemap - moved to greenwood plugins (#1232) --- .../src/plugins/copy/plugin-copy-sitemap.js | 40 +++++++++++++++++++ .../resource/plugin-resource-sitemap.js} | 38 ++---------------- .../build.plugins.copy-sitemap.spec.js} | 0 .../greenwood.config.js | 3 ++ .../src/pages/about.md | 0 .../src/pages/index.md | 0 .../src/sitemap.xml.js | 0 .../develop.plugins.resource-sitemap.spec.js} | 0 .../greenwood.config.js | 5 +++ .../src/pages/about.md | 0 .../src/pages/index.md | 0 .../src/sitemap.xml.js | 0 .../cases/build.default/greenwood.config.js | 8 ---- .../cases/develop.default/greenwood.config.js | 8 ---- 14 files changed, 51 insertions(+), 51 deletions(-) create mode 100644 packages/cli/src/plugins/copy/plugin-copy-sitemap.js rename packages/{plugin-adapter-sitemap/src/index.js => cli/src/plugins/resource/plugin-resource-sitemap.js} (54%) rename packages/{plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js => cli/test/cases/build.plugins.copy-sitemap/build.plugins.copy-sitemap.spec.js} (100%) create mode 100644 packages/cli/test/cases/build.plugins.copy-sitemap/greenwood.config.js rename packages/{plugin-adapter-sitemap/test/cases/build.default => cli/test/cases/build.plugins.copy-sitemap}/src/pages/about.md (100%) rename packages/{plugin-adapter-sitemap/test/cases/build.default => cli/test/cases/build.plugins.copy-sitemap}/src/pages/index.md (100%) rename packages/{plugin-adapter-sitemap/test/cases/build.default => cli/test/cases/build.plugins.copy-sitemap}/src/sitemap.xml.js (100%) rename packages/{plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js => cli/test/cases/develop.plugins.resource-sitemap/develop.plugins.resource-sitemap.spec.js} (100%) create mode 100644 packages/cli/test/cases/develop.plugins.resource-sitemap/greenwood.config.js rename packages/{plugin-adapter-sitemap/test/cases/develop.default => cli/test/cases/develop.plugins.resource-sitemap}/src/pages/about.md (100%) rename packages/{plugin-adapter-sitemap/test/cases/develop.default => cli/test/cases/develop.plugins.resource-sitemap}/src/pages/index.md (100%) rename packages/{plugin-adapter-sitemap/test/cases/develop.default => cli/test/cases/develop.plugins.resource-sitemap}/src/sitemap.xml.js (100%) delete mode 100644 packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js delete mode 100644 packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js diff --git a/packages/cli/src/plugins/copy/plugin-copy-sitemap.js b/packages/cli/src/plugins/copy/plugin-copy-sitemap.js new file mode 100644 index 000000000..b69d8cb95 --- /dev/null +++ b/packages/cli/src/plugins/copy/plugin-copy-sitemap.js @@ -0,0 +1,40 @@ +import { checkResourceExists } from "@greenwood/cli/src/lib/resource-utils.js"; +import fs from 'fs/promises'; + + +async function writeSitemap(compilation) { + try { + const { scratchDir, projectDirectory } = compilation.context; + const adapterScratchUrl = new URL('./sitemap.xml', scratchDir); + + // Check if module exists + const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); + const sitemap = await sitemapModule.generateSitemap(compilation); + + await fs.writeFile(adapterScratchUrl, sitemap); + console.info('Wrote sitemap to ./sitemap.xml'); + + return adapterScratchUrl; + } catch (error) { + console.error('Error in sitemapAdapter:', error); + } + } + + + +const greenwoodPluginCopySitemap = [{ + type: 'copy', + name: 'plugin-copy-sitemap', + provider: async (compilation) => { + + const { outputDir } = compilation.context; + const sitemapScratchUrl = await writeSitemap(compilation); + + return [{ + from: sitemapScratchUrl, + to: new URL('./sitemap.xml', outputDir) + }]; + } +}]; + +export { greenwoodPluginCopySitemap }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/src/index.js b/packages/cli/src/plugins/resource/plugin-resource-sitemap.js similarity index 54% rename from packages/plugin-adapter-sitemap/src/index.js rename to packages/cli/src/plugins/resource/plugin-resource-sitemap.js index aafd11ba8..0eb9b6c80 100644 --- a/packages/plugin-adapter-sitemap/src/index.js +++ b/packages/cli/src/plugins/resource/plugin-resource-sitemap.js @@ -1,28 +1,5 @@ -import fs from 'fs/promises'; import { ResourceInterface } from '@greenwood/cli/src/lib/resource-interface.js'; -async function sitemapAdapter(compilation) { - try { - const { outputDir, projectDirectory } = compilation.context; - const adapterOutputUrl = new URL('./sitemap.xml', outputDir); - - // Check if module exists - const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); - const sitemap = await sitemapModule.generateSitemap(compilation); - - await fs.writeFile(adapterOutputUrl, sitemap); - console.info('Wrote sitemap to ./sitemap.xml'); - } catch (error) { - console.error('Error in sitemapAdapter:', error); - } -} - -/* - * - * Sitemap - * - */ - class SitemapResource extends ResourceInterface { constructor(compilation, options) { super(compilation, options); @@ -51,19 +28,10 @@ class SitemapResource extends ResourceInterface { } -const greenwoodPluginSitemap = (options = {}) => [{ - type: 'adapter', - name: 'plugin-adapter-sitemap', - provider: (compilation) => { - return async () => { - await sitemapAdapter(compilation, options); - }; - } -}, -{ +const greenwoodPluginSitemap = { type: 'resource', - name: 'plugin-sitemap', + name: 'plugin-resource-sitemap', provider: (compilation, options) => new SitemapResource(compilation, options) -}]; +}; export { greenwoodPluginSitemap }; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js b/packages/cli/test/cases/build.plugins.copy-sitemap/build.plugins.copy-sitemap.spec.js similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/build.default/build.default.spec.js rename to packages/cli/test/cases/build.plugins.copy-sitemap/build.plugins.copy-sitemap.spec.js diff --git a/packages/cli/test/cases/build.plugins.copy-sitemap/greenwood.config.js b/packages/cli/test/cases/build.plugins.copy-sitemap/greenwood.config.js new file mode 100644 index 000000000..07b79d186 --- /dev/null +++ b/packages/cli/test/cases/build.plugins.copy-sitemap/greenwood.config.js @@ -0,0 +1,3 @@ +export default { + plugins: [] +}; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/about.md b/packages/cli/test/cases/build.plugins.copy-sitemap/src/pages/about.md similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/about.md rename to packages/cli/test/cases/build.plugins.copy-sitemap/src/pages/about.md diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/index.md b/packages/cli/test/cases/build.plugins.copy-sitemap/src/pages/index.md similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/build.default/src/pages/index.md rename to packages/cli/test/cases/build.plugins.copy-sitemap/src/pages/index.md diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js b/packages/cli/test/cases/build.plugins.copy-sitemap/src/sitemap.xml.js similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/build.default/src/sitemap.xml.js rename to packages/cli/test/cases/build.plugins.copy-sitemap/src/sitemap.xml.js diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js b/packages/cli/test/cases/develop.plugins.resource-sitemap/develop.plugins.resource-sitemap.spec.js similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/develop.default/develop.default.spec.js rename to packages/cli/test/cases/develop.plugins.resource-sitemap/develop.plugins.resource-sitemap.spec.js diff --git a/packages/cli/test/cases/develop.plugins.resource-sitemap/greenwood.config.js b/packages/cli/test/cases/develop.plugins.resource-sitemap/greenwood.config.js new file mode 100644 index 000000000..0e4a08694 --- /dev/null +++ b/packages/cli/test/cases/develop.plugins.resource-sitemap/greenwood.config.js @@ -0,0 +1,5 @@ + +export default { + plugins: [ + ] +}; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/about.md b/packages/cli/test/cases/develop.plugins.resource-sitemap/src/pages/about.md similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/about.md rename to packages/cli/test/cases/develop.plugins.resource-sitemap/src/pages/about.md diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/index.md b/packages/cli/test/cases/develop.plugins.resource-sitemap/src/pages/index.md similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/develop.default/src/pages/index.md rename to packages/cli/test/cases/develop.plugins.resource-sitemap/src/pages/index.md diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js b/packages/cli/test/cases/develop.plugins.resource-sitemap/src/sitemap.xml.js similarity index 100% rename from packages/plugin-adapter-sitemap/test/cases/develop.default/src/sitemap.xml.js rename to packages/cli/test/cases/develop.plugins.resource-sitemap/src/sitemap.xml.js diff --git a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js deleted file mode 100644 index d4bed8353..000000000 --- a/packages/plugin-adapter-sitemap/test/cases/build.default/greenwood.config.js +++ /dev/null @@ -1,8 +0,0 @@ - -import { greenwoodPluginSitemap } from '../../../src/index.js'; - -export default { - plugins: [ - greenwoodPluginSitemap() - ] -}; \ No newline at end of file diff --git a/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js b/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js deleted file mode 100644 index d4bed8353..000000000 --- a/packages/plugin-adapter-sitemap/test/cases/develop.default/greenwood.config.js +++ /dev/null @@ -1,8 +0,0 @@ - -import { greenwoodPluginSitemap } from '../../../src/index.js'; - -export default { - plugins: [ - greenwoodPluginSitemap() - ] -}; \ No newline at end of file From 525780d8ea7d42db7c8ac7c5362276915126b5af Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Sat, 27 Jul 2024 13:03:52 +0000 Subject: [PATCH 8/9] Dynamic Sitemap - Oops, linting (#1232) --- .../src/plugins/copy/plugin-copy-sitemap.js | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/cli/src/plugins/copy/plugin-copy-sitemap.js b/packages/cli/src/plugins/copy/plugin-copy-sitemap.js index b69d8cb95..5e80f9f21 100644 --- a/packages/cli/src/plugins/copy/plugin-copy-sitemap.js +++ b/packages/cli/src/plugins/copy/plugin-copy-sitemap.js @@ -1,26 +1,22 @@ -import { checkResourceExists } from "@greenwood/cli/src/lib/resource-utils.js"; import fs from 'fs/promises'; - async function writeSitemap(compilation) { - try { - const { scratchDir, projectDirectory } = compilation.context; - const adapterScratchUrl = new URL('./sitemap.xml', scratchDir); - - // Check if module exists - const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); - const sitemap = await sitemapModule.generateSitemap(compilation); - - await fs.writeFile(adapterScratchUrl, sitemap); - console.info('Wrote sitemap to ./sitemap.xml'); - - return adapterScratchUrl; - } catch (error) { - console.error('Error in sitemapAdapter:', error); - } - } + try { + const { scratchDir, projectDirectory } = compilation.context; + const adapterScratchUrl = new URL('./sitemap.xml', scratchDir); + // Check if module exists + const sitemapModule = await import(`${projectDirectory}/src/sitemap.xml.js`); + const sitemap = await sitemapModule.generateSitemap(compilation); + await fs.writeFile(adapterScratchUrl, sitemap); + console.info('Wrote sitemap to ./sitemap.xml'); + + return adapterScratchUrl; + } catch (error) { + console.error('Error in sitemapAdapter:', error); + } +} const greenwoodPluginCopySitemap = [{ type: 'copy', @@ -31,8 +27,8 @@ const greenwoodPluginCopySitemap = [{ const sitemapScratchUrl = await writeSitemap(compilation); return [{ - from: sitemapScratchUrl, - to: new URL('./sitemap.xml', outputDir) + from: sitemapScratchUrl, + to: new URL('./sitemap.xml', outputDir) }]; } }]; From 5faf8c6bcbe92de08b69774b494c13f56e0a0682 Mon Sep 17 00:00:00 2001 From: Jonathan Stockdill Date: Sat, 27 Jul 2024 14:40:48 +0000 Subject: [PATCH 9/9] Removing previous implementation (#1232) --- packages/plugin-dynamic-sitemap/README.md | 24 ------ packages/plugin-dynamic-sitemap/src/index.js | 30 -------- .../test/copy.default.dynamic-sitemap.spec.js | 74 ------------------- .../test/greenwood.config.js | 10 --- .../plugin-dynamic-sitemap/test/package.json | 4 - .../test/src/pages/about.md | 3 - .../test/src/pages/index.md | 3 - .../test/src/templates/artist.html | 8 -- 8 files changed, 156 deletions(-) delete mode 100644 packages/plugin-dynamic-sitemap/README.md delete mode 100644 packages/plugin-dynamic-sitemap/src/index.js delete mode 100644 packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js delete mode 100644 packages/plugin-dynamic-sitemap/test/greenwood.config.js delete mode 100644 packages/plugin-dynamic-sitemap/test/package.json delete mode 100644 packages/plugin-dynamic-sitemap/test/src/pages/about.md delete mode 100644 packages/plugin-dynamic-sitemap/test/src/pages/index.md delete mode 100644 packages/plugin-dynamic-sitemap/test/src/templates/artist.html diff --git a/packages/plugin-dynamic-sitemap/README.md b/packages/plugin-dynamic-sitemap/README.md deleted file mode 100644 index 33abb58b6..000000000 --- a/packages/plugin-dynamic-sitemap/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# @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({ - "baseUrl": "https://example.com" - }) - ] -} -``` - diff --git a/packages/plugin-dynamic-sitemap/src/index.js b/packages/plugin-dynamic-sitemap/src/index.js deleted file mode 100644 index 3c156d9cd..000000000 --- a/packages/plugin-dynamic-sitemap/src/index.js +++ /dev/null @@ -1,30 +0,0 @@ -import fs from 'fs/promises'; - -const greenwoodPluginDynamicExport = (options = {}) => [{ - type: 'copy', - name: 'plugin-dynamic-sitemap', - provider: async (compilation) => { - - const { baseUrl } = options; - const { outputDir } = compilation.context; - - let sitemapXML = '\n'; - sitemapXML += '\n'; - - compilation.graph.forEach(page => { - sitemapXML += `${baseUrl}${page.outputPath}\n`; - }); - - sitemapXML += ''; - - const sitemapUrl = new URL('./sitemap.xml', outputDir); - await fs.writeFile(sitemapUrl, sitemapXML); - - return { - from: sitemapUrl, - to: new URL('./sitemap.xml', outputDir) - }; - } -}]; - -export { greenwoodPluginDynamicExport }; \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js b/packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js deleted file mode 100644 index 196f4ccde..000000000 --- a/packages/plugin-dynamic-sitemap/test/copy.default.dynamic-sitemap.spec.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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({ - * "baseUrl": "https://example.com" - * }) - * }] - * - * } - * - * User Workspace -* src/ -* templates/ -* artist.html -* pages/ -* index.md -* about.md -*/ - -import fs from 'fs'; -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'; - -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() { - - 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)); - }); -}); \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/greenwood.config.js b/packages/plugin-dynamic-sitemap/test/greenwood.config.js deleted file mode 100644 index 20aa502cd..000000000 --- a/packages/plugin-dynamic-sitemap/test/greenwood.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import { greenwoodPluginDynamicExport } from '../src/index.js'; - -console.log(greenwoodPluginDynamicExport); -export default { - plugins: [ - ...greenwoodPluginDynamicExport({ - 'baseUrl': 'https://example.com' - }) - ] -}; \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/package.json b/packages/plugin-dynamic-sitemap/test/package.json deleted file mode 100644 index 1a1e6d1d1..000000000 --- a/packages/plugin-dynamic-sitemap/test/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": "1.0.0", - "type": "module" -} \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/src/pages/about.md b/packages/plugin-dynamic-sitemap/test/src/pages/about.md deleted file mode 100644 index 4093eb641..000000000 --- a/packages/plugin-dynamic-sitemap/test/src/pages/about.md +++ /dev/null @@ -1,3 +0,0 @@ -# About Us - -Lorem ipsum. \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/src/pages/index.md b/packages/plugin-dynamic-sitemap/test/src/pages/index.md deleted file mode 100644 index 46c5f357e..000000000 --- a/packages/plugin-dynamic-sitemap/test/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -## Home Page - -Welcome! \ No newline at end of file diff --git a/packages/plugin-dynamic-sitemap/test/src/templates/artist.html b/packages/plugin-dynamic-sitemap/test/src/templates/artist.html deleted file mode 100644 index 0087d30c1..000000000 --- a/packages/plugin-dynamic-sitemap/test/src/templates/artist.html +++ /dev/null @@ -1,8 +0,0 @@ - - - -

Welcome to the artist page.

- - - - \ No newline at end of file