diff --git a/server.js b/server.js index 9fbe898..073c28f 100644 --- a/server.js +++ b/server.js @@ -34,6 +34,8 @@ const DEFAULT_OPTIONS = { pathPrefix: "/", // May be overridden by Eleventy, adds a virtual base directory to your project watch: [], // Globs to pass to separate dev server chokidar for watching aliases: {}, // Aliasing feature + rebuildUrl: null, // POST URL to trigger rebuild + rebuildUrlToken: "", // Secret token in x-11ty-rebuild-token header indexFileName: "index.html", // Allow custom index file name useCache: false, // Use a cache for file contents headers: {}, // Set default response headers @@ -79,7 +81,7 @@ class EleventyDevServer { } constructor(name, dir, options = {}) { - debug("Creating new Dev Server instance.") + debug("Creating new Dev Server instance."); this.name = name; this.normalizeOptions(options); @@ -117,6 +119,10 @@ class EleventyDevServer { this.options.pathPrefix = this.cleanupPathPrefix(this.options.pathPrefix); } + setEventBus(_eventBus) { + this.eventBus = _eventBus; + } + get watcher() { if(this.#watcher) { return this.#watcher; @@ -481,6 +487,18 @@ class EleventyDevServer { return res.end(""); } + if (this.options.rebuildUrl && req.url === this.options.rebuildUrl && req.method === 'POST') { + const token = req.headers['x-11ty-rebuild-token']; + if (token !== this.options.rebuildUrlToken) { + res.writeHead(403, { 'Content-Type': 'text/plain' }); + return res.end('Forbidden'); + } + + this.eventBus.emit('eleventyDevServer.rebuild'); + res.writeHead(200); + return res.end(); + } + for(let urlPatternString in this.options.onRequest) { let fn = this.options.onRequest[urlPatternString]; let fullPath = this.getServerPath(urlPatternString);