diff --git a/greenwood.config.js b/greenwood.config.js index 465cbd070..8fcd54697 100644 --- a/greenwood.config.js +++ b/greenwood.config.js @@ -4,6 +4,7 @@ import { greenwoodPluginPolyfills } from "@greenwood/plugin-polyfills"; import { greenwoodPluginPostCss } from "@greenwood/plugin-postcss"; import { greenwoodPluginImportRaw } from "@greenwood/plugin-import-raw"; import { greenwoodPluginRendererPuppeteer } from "@greenwood/plugin-renderer-puppeteer"; +import { greenwoodPluginMarkdown } from "@greenwood/plugin-markdown"; import rollupPluginAnalyzer from "rollup-plugin-analyzer"; /** @type {import('@greenwood/cli').Config} */ @@ -14,6 +15,9 @@ export default { activeContent: true, prerender: true, plugins: [ + greenwoodPluginMarkdown({ + plugins: ["@mapbox/rehype-prism", "rehype-slug", "rehype-autolink-headings", "remark-github"], + }), greenwoodPluginGraphQL(), greenwoodPluginPolyfills({ lit: true, @@ -39,7 +43,4 @@ export default { }, }, ], - markdown: { - plugins: ["@mapbox/rehype-prism", "rehype-slug", "rehype-autolink-headings", "remark-github"], - }, }; diff --git a/greenwood.config.test-types.ts b/greenwood.config.test-types.ts index e360a53f1..dce02b5a5 100644 --- a/greenwood.config.test-types.ts +++ b/greenwood.config.test-types.ts @@ -10,6 +10,7 @@ import { greenwoodPluginImportCommonJs } from "@greenwood/plugin-import-commonjs import { greenwoodPluginImportJsx } from "@greenwood/plugin-import-jsx"; import { greenwoodPluginImportRaw } from "@greenwood/plugin-import-raw"; import { greenwoodPluginIncludeHTML } from "@greenwood/plugin-include-html"; +import { greenwoodPluginMarkdown } from "@greenwood/plugin-markdown"; import { greenwoodPluginPolyfills } from "@greenwood/plugin-polyfills"; import { greenwoodPluginPostCss } from "@greenwood/plugin-postcss"; import { greenwoodPluginRendererLit } from "@greenwood/plugin-renderer-lit"; @@ -46,15 +47,6 @@ const config: Config = { isolation: true, layoutsDirectory: "/my-layouts", optimization: "default", - markdown: { - plugins: [ - "@mapbox/rehype-prism", - { - name: "rehype-autolink-headings", - options: { behavior: "append" }, - }, - ], - }, pagesDirectory: "/my-pages", plugins: [ greenwoodPluginAdapterAws(), @@ -68,6 +60,15 @@ const config: Config = { greenwoodPluginImportJsx(), greenwoodPluginImportRaw, greenwoodPluginIncludeHTML(), + greenwoodPluginMarkdown({ + plugins: [ + "@mapbox/rehype-prism", + { + name: "rehype-autolink-headings", + options: { behavior: "append" }, + }, + ], + }), greenwoodPluginPolyfills(), greenwoodPluginPostCss(), greenwoodPluginRendererLit(), diff --git a/packages/cli/package.json b/packages/cli/package.json index aacd9843e..457778e73 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -59,21 +59,13 @@ "koa": "^3.0.1", "koa-body": "^6.0.1", "livereload": "^0.9.1", - "markdown-toc": "^1.2.0", "node-html-parser": "^7.0.1", - "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.1", - "remark-frontmatter": "^5.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.1", "rollup": "^4.26.0", - "unified": "^11.0.5", "wc-compiler": "~0.17.0" }, "devDependencies": { "@aws-sdk/client-cloudfront": "^3.726.0", "@beforesemicolon/markup": "^1.14.1", - "@mapbox/rehype-prism": "^0.5.0", "@shoelace-style/shoelace": "^2.18.0", "@spectrum-css/card": "^9.3.0", "@spectrum-web-components/action-menu": "^1.0.1", @@ -92,8 +84,6 @@ "pwa-helpers": "^0.9.1", "redux": "^5.0.1", "redux-thunk": "^3.1.0", - "rehype-autolink-headings": "^4.0.0", - "rehype-slug": "^3.0.0", "signal-utils": "^0.21.1", "simpledotcss": "^1.0.0", "tslib": "^2.8.1" diff --git a/packages/cli/src/lib/layout-utils.js b/packages/cli/src/lib/layout-utils.js index 42fd9e892..8dd051d7c 100644 --- a/packages/cli/src/lib/layout-utils.js +++ b/packages/cli/src/lib/layout-utils.js @@ -229,7 +229,9 @@ async function mergeContentIntoLayout( : childRoot.querySelector("html") && childBody ? childBody : !childRoot.querySelector("html") - ? childContents + ? childRoot.querySelector("body") + ? childBody + : childContents : ""; // we wrap SSR content in comments so we can extract it during prerendering to avoid double pre-rendering diff --git a/packages/cli/src/lifecycles/config.js b/packages/cli/src/lifecycles/config.js index fa74e5a3f..3d34e3125 100644 --- a/packages/cli/src/lifecycles/config.js +++ b/packages/cli/src/lifecycles/config.js @@ -66,7 +66,6 @@ const defaultConfig = { }, isolation: false, layoutsDirectory: "layouts", - markdown: { plugins: [] }, optimization: optimizations[0], pagesDirectory: "pages", plugins: greenwoodPlugins, diff --git a/packages/cli/src/lifecycles/graph.js b/packages/cli/src/lifecycles/graph.js index d6bdf9082..90d4c1630 100644 --- a/packages/cli/src/lifecycles/graph.js +++ b/packages/cli/src/lifecycles/graph.js @@ -3,7 +3,6 @@ import fs from "node:fs/promises"; import fm from "front-matter"; import { checkResourceExists, requestAsObject } from "../lib/resource-utils.js"; import { activeFrontmatterKeys } from "../lib/content-utils.js"; -import toc from "markdown-toc"; import { Worker } from "node:worker_threads"; function getLabelFromRoute(_route) { @@ -27,7 +26,7 @@ function getLabelFromRoute(_route) { } function getIdFromRelativePathPath(relativePathPath, extension) { - return relativePathPath.replace(extension, "").replace("./", "").replace(/\//g, "-"); + return relativePathPath.replace(`.${extension}`, "").replace("./", "").replace(/\//g, "-"); } function trackCollectionsForPage(page, collections) { @@ -79,29 +78,26 @@ const generateGraph = async (compilation) => { pages = nextPages.pages; apiRoutes = nextPages.apiRoutes; } else { - const extension = `.${filenameUrl.pathname.split(".").pop()}`; + const extension = `${filenameUrl.pathname.split(".").pop()}`; const relativePagePath = filenameUrl.pathname.replace(pagesDir.pathname, "./"); const isApiRoute = relativePagePath.startsWith("./api"); - const req = isApiRoute - ? new Request(filenameUrl, { headers: { Accept: "text/javascript" } }) - : new Request(filenameUrl, { headers: { Accept: "text/html" } }); let isCustom = null; for (const plugin of customPageFormatPlugins) { - if (plugin.shouldServe && (await plugin.shouldServe(filenameUrl, req))) { + if (plugin.servePage && plugin.extensions.includes(extension)) { isCustom = plugin.servePage; break; } } - const isStatic = isCustom === "static" || extension === ".md" || extension === ".html"; - const isDynamic = isCustom === "dynamic" || extension === ".js" || extension === ".ts"; + const isStatic = isCustom === "static" || extension === "html"; + const isDynamic = isCustom === "dynamic" || extension === "js" || extension === "ts"; const isPage = isStatic || isDynamic; - let route = `${relativePagePath.replace(".", "").replace(`${extension}`, "")}`; + let route = `${relativePagePath.replace(".", "").replace(`.${extension}`, "")}`; let fileContents; if (isApiRoute) { - if (extension !== ".js" && extension !== ".ts" && !isCustom) { + if (extension !== "js" && extension !== "ts" && !isCustom) { console.warn(`${filenameUrl} is not a supported API file extension, skipping...`); return; } @@ -123,12 +119,14 @@ const generateGraph = async (compilation) => { getIdFromRelativePathPath(relativePagePath, extension).replace("api-", ""), ), pageHref: new URL(relativePagePath, pagesDir).href, - outputHref: new URL(relativePagePath, outputDir).href.replace(extension, ".js"), + outputHref: new URL(relativePagePath, outputDir).href.replace(`.${extension}`, ".js"), route: `${basePath}${route}`, isolation, }); } else if (isPage) { - let root = filename.split("/")[filename.split("/").length - 1].replace(extension, ""); + let root = filename + .split("/") + [filename.split("/").length - 1].replace(`.${extension}`, ""); // should we even have a default page layout? // https://github.com/ProjectEvergreen/greenwood/issues/1271 let layout = "page"; @@ -223,36 +221,11 @@ const generateGraph = async (compilation) => { } } - /* - * Custom front matter - Variable Definitions - * -------------------------------------------------- - * collection: the name of the collection for the page (as a string or array) - * order: the order of this item within the collection - * tocHeading: heading size to use a Table of Contents for a page - * tableOfContents: json object containing page's table of contents (list of headings) - */ - - // prune "reserved" attributes that are supported by Greenwood + // prune "reserved" frontmatter that are supported by Greenwood [...activeFrontmatterKeys, "layout"].forEach((key) => { delete customData[key]; }); - // set flag whether to gather a list of headings on a page as menu items - customData.tocHeading = customData.tocHeading || 0; - customData.tableOfContents = []; - - if (fileContents && customData.tocHeading > 0 && customData.tocHeading <= 6) { - // parse markdown for table of contents and output to json - customData.tableOfContents = toc(fileContents).json; - - // parse table of contents for only the pages user wants linked - if (customData.tableOfContents.length > 0 && customData.tocHeading > 0) { - customData.tableOfContents = customData.tableOfContents.filter( - (item) => item.lvl === customData.tocHeading, - ); - } - } - /* * Page Properties *---------------------- diff --git a/packages/cli/src/lifecycles/serve.js b/packages/cli/src/lifecycles/serve.js index ea5a1711d..60e0aaf4d 100644 --- a/packages/cli/src/lifecycles/serve.js +++ b/packages/cli/src/lifecycles/serve.js @@ -16,21 +16,13 @@ async function getDevServer(compilation) { const app = new Koa(); const compilationCopy = Object.assign({}, compilation); const resourcePlugins = [ - // Greenwood default standard resource and import plugins ...compilation.config.plugins .filter((plugin) => { - return plugin.type === "resource" && plugin.isGreenwoodDefaultPlugin; + return plugin.type === "resource"; }) .map((plugin) => { return plugin.provider(compilationCopy); }), - - // custom user resource plugins - ...compilation.config.plugins - .filter((plugin) => { - return plugin.type === "resource" && !plugin.isGreenwoodDefaultPlugin; - }) - .map((plugin) => plugin.provider(compilationCopy)), ]; app.use(koaBody()); @@ -57,7 +49,7 @@ async function getDevServer(compilation) { await next(); }); - // handle creating responses from urls + // handle serving responses from urls app.use(async (ctx, next) => { try { const url = new URL(ctx.url); @@ -67,7 +59,7 @@ async function getDevServer(compilation) { let response = new Response(null, { status }); for (const plugin of resourcePlugins) { - if (plugin.shouldServe && (await plugin.shouldServe(url, request))) { + if (!plugin.servePage && plugin.shouldServe && (await plugin.shouldServe(url, request))) { const current = await plugin.serve(url, request); const merged = mergeResponse(response.clone(), current.clone()); @@ -101,17 +93,26 @@ async function getDevServer(compilation) { headers: new Headers(header), }); - let response = initResponse; - for (const plugin of resourcePlugins) { + // we explicitly use "async" reduce here to avoid race conditions / Body consumed errors + // when looping through and sharing responses between plugins + const response = await resourcePlugins.reduce(async (responsePromise, plugin) => { + const intermediateResponse = await responsePromise; if ( plugin.shouldPreIntercept && - (await plugin.shouldPreIntercept(url, request, response.clone())) + (await plugin.shouldPreIntercept(url, request, intermediateResponse.clone())) ) { - const current = await plugin.preIntercept(url, request, response.clone()); - - response = mergeResponse(response.clone(), current.clone()); + const current = await plugin.preIntercept( + url, + request, + await intermediateResponse.clone(), + ); + const merged = mergeResponse(intermediateResponse.clone(), current); + + return Promise.resolve(merged); + } else { + return Promise.resolve(await responsePromise); } - } + }, Promise.resolve(initResponse.clone())); ctx.body = response.body ? Readable.from(response.body) : ""; ctx.message = response.statusText; @@ -138,17 +139,22 @@ async function getDevServer(compilation) { headers: new Headers(header), }); - let response = initResponse; - for (const plugin of resourcePlugins) { + // we explicitly use "async" reduce here to avoid race conditions / Body consumed errors + // when looping through and sharing responses between plugins + const response = await resourcePlugins.reduce(async (responsePromise, plugin) => { + const intermediateResponse = await responsePromise; if ( plugin.shouldIntercept && - (await plugin.shouldIntercept(url, request, response.clone())) + (await plugin.shouldIntercept(url, request, intermediateResponse.clone())) ) { - const current = await plugin.intercept(url, request, response.clone()); + const current = await plugin.intercept(url, request, await intermediateResponse.clone()); + const merged = mergeResponse(intermediateResponse.clone(), current); - response = mergeResponse(response.clone(), current.clone()); + return Promise.resolve(merged); + } else { + return Promise.resolve(await responsePromise); } - } + }, Promise.resolve(initResponse.clone())); ctx.body = response.body ? Readable.from(response.body) : ""; ctx.message = response.statusText; @@ -250,6 +256,7 @@ async function getStaticServer(compilation, composable) { } } else { ctx.body = "Not Found"; + ctx.message = "Not Found"; ctx.status = 404; ctx.set("Content-Type", "text/plain"); } @@ -323,6 +330,7 @@ async function getStaticServer(compilation, composable) { ctx.body = body; ctx.status = 200; + ctx.message = "OK"; ctx.set("Content-Type", "text/html"); } } catch (e) { @@ -392,6 +400,7 @@ async function getHybridServer(compilation) { } ctx.body = html; + ctx.message = "OK"; ctx.set("Content-Type", "text/html"); ctx.status = 200; } else if (isApiRoute) { diff --git a/packages/cli/src/plugins/resource/plugin-standard-html.js b/packages/cli/src/plugins/resource/plugin-standard-html.js index 7eeca5fee..f1d1153df 100644 --- a/packages/cli/src/plugins/resource/plugin-standard-html.js +++ b/packages/cli/src/plugins/resource/plugin-standard-html.js @@ -5,21 +5,15 @@ * */ import fs from "node:fs/promises"; -import rehypeStringify from "rehype-stringify"; -import rehypeRaw from "rehype-raw"; -import remarkFrontmatter from "remark-frontmatter"; -import remarkParse from "remark-parse"; -import remarkRehype from "remark-rehype"; import { getPageLayout, getAppLayout, getGreenwoodScripts } from "../../lib/layout-utils.js"; import { requestAsObject } from "../../lib/resource-utils.js"; -import { unified } from "unified"; import { Worker } from "node:worker_threads"; import { parse } from "node-html-parser"; class StandardHtmlResource { constructor(compilation) { this.compilation = compilation; - this.extensions = [".html", ".md"]; + this.extensions = [".html"]; this.contentType = "text/html"; } @@ -45,56 +39,35 @@ class StandardHtmlResource { !matchingRoute.external && pageHref ? new URL(pageHref).pathname.replace(userWorkspace.pathname, "./") : ""; - const isMarkdownContent = (filePath || "").split(".").pop() === "md"; const isHtmlContent = (filePath || "").split(".").pop() === "html"; let body = ""; let ssrBody; - let processedMarkdown = null; // final contents to return from the plugin let html = ""; - const customPageFormatPlugins = config.plugins - .filter((plugin) => plugin.type === "resource" && !plugin.isGreenwoodDefaultPlugin) - .map((plugin) => plugin.provider(this.compilation)); - const isCustomStaticPage = - customPageFormatPlugins[0] && - customPageFormatPlugins[0].servePage === "static" && - customPageFormatPlugins[0].shouldServe && - (await customPageFormatPlugins[0].shouldServe(new URL(pageHref))); - - if (isMarkdownContent) { - const markdownContents = await fs.readFile(new URL(pageHref), "utf-8"); - const rehypePlugins = []; - const remarkPlugins = []; - - for (const plugin of config.markdown.plugins) { - const name = typeof plugin === "string" ? plugin : plugin.name; - const options = plugin?.options ?? null; - const pluginTypeArray = name.indexOf("rehype-") >= 0 ? rehypePlugins : remarkPlugins; - const pluginImport = (await import(name)).default; - - if (options) { - pluginTypeArray.push([pluginImport, options]); - } else { - pluginTypeArray.push(pluginImport); - } + if (isHtmlContent) { + body = await fs.readFile(new URL(pageHref), "utf-8"); + + // purge frontmatter data from HTML files that only have a `` tag + // frontmatter outside of an tag will get ignored by node-html-parser + if (body.trim().startsWith("---")) { + body = body.replace(/---(.*)---/s, ""); } + } else if (matchingRoute.servePage === "static") { + const customStaticPageFormatPlugins = config.plugins + .filter((plugin) => plugin.type === "resource" && !plugin.isGreenwoodDefaultPlugin) + .map((plugin) => plugin.provider(this.compilation)) + .filter((plugin) => plugin.servePage === "static"); - processedMarkdown = await unified() - .use(remarkParse) // parse markdown into AST - .use(remarkFrontmatter) // extract frontmatter from AST - .use(remarkPlugins) // apply userland remark plugins - .use(remarkRehype, { allowDangerousHtml: true }) // convert from markdown to HTML AST - .use(rehypeRaw) // support mixed HTML in markdown - .use(rehypePlugins) // apply userland rehype plugins - .use(rehypeStringify) // convert AST to HTML string - .process(markdownContents); - } else if (isHtmlContent) { - body = await fs.readFile(new URL(pageHref), "utf-8"); - } else if (isCustomStaticPage) { - const transformed = await customPageFormatPlugins[0].serve(new URL(pageHref)); + for (const plugin of customStaticPageFormatPlugins) { + if (await plugin.shouldServe(url, request)) { + const response = await plugin.serve(url, request); - body = await transformed.text(); + body = await response.text(); + + break; + } + } } else if (matchingRoute.isSSR) { const routeModuleLocationUrl = new URL(pageHref); const routeWorkerUrl = this.compilation.config.plugins @@ -132,24 +105,7 @@ class StandardHtmlResource { }); } - if (processedMarkdown) { - const wrappedCustomElementRegex = - /

<[a-zA-Z]*-[a-zA-Z](.*)>(.*)<\/[a-zA-Z]*-[a-zA-Z](.*)><\/p>/g; - const ceTest = wrappedCustomElementRegex.test(processedMarkdown.value); - - if (ceTest) { - const ceMatches = processedMarkdown.value.match(wrappedCustomElementRegex); - - ceMatches.forEach((match) => { - const stripWrappingTags = match.replace("

", "").replace("

", ""); - - processedMarkdown.value = processedMarkdown.value.replace(match, stripWrappingTags); - }); - } - - // https://github.com/ProjectEvergreen/greenwood/issues/1126 - body = processedMarkdown.value.replace(/\$/g, "$$$"); - } else if (matchingRoute.external) { + if (matchingRoute.external) { body = matchingRoute.body; } else if (ssrBody) { body = ssrBody; diff --git a/packages/cli/src/plugins/resource/plugin-static-router.js b/packages/cli/src/plugins/resource/plugin-static-router.js index 4522fe9d8..dc75fc27d 100644 --- a/packages/cli/src/plugins/resource/plugin-static-router.js +++ b/packages/cli/src/plugins/resource/plugin-static-router.js @@ -85,20 +85,15 @@ class StaticRouterResource { const routeTags = this.compilation.graph .filter((page) => !page.isSSR && !page.route.endsWith("/404/")) .map((page) => { - const layout = - page.pageHref && page.pageHref.split(".").pop() === this.extensions[0] - ? page.route - : page.layout; + const { layout, route } = page; const key = - page.route === "/" - ? "" - : page.route.slice(0, page.route.lastIndexOf("/")).replace(basePath, ""); + route === "/" ? "" : route.slice(0, route.lastIndexOf("/")).replace(basePath, ""); - if (pathname === page.route) { + if (pathname === route) { currentLayout = layout; } return ` - + `; }); diff --git a/packages/cli/src/types/config.d.ts b/packages/cli/src/types/config.d.ts index fdab5105f..1dd79fef8 100644 --- a/packages/cli/src/types/config.d.ts +++ b/packages/cli/src/types/config.d.ts @@ -15,9 +15,6 @@ export type Config = { isolation?: boolean; layoutsDirectory?: string; optimization?: "default" | "inline" | "none" | "static"; - markdown?: { - plugins?: Array; - }; pagesDirectory?: string; plugins?: Array>; polyfills?: { diff --git a/packages/cli/test/cases/build.config.layouts-directory/build.config.layouts-directory.spec.js b/packages/cli/test/cases/build.config.layouts-directory/build.config.layouts-directory.spec.js index bec1d08c6..3b3a2007a 100644 --- a/packages/cli/test/cases/build.config.layouts-directory/build.config.layouts-directory.spec.js +++ b/packages/cli/test/cases/build.config.layouts-directory/build.config.layouts-directory.spec.js @@ -17,7 +17,7 @@ * Greenwood default * src/ * pages/ - * index.md + * index.html * layouts/ * page.html */ @@ -33,7 +33,7 @@ import { fileURLToPath } from "node:url"; const expect = chai.expect; describe("Build Greenwood With: ", function () { - const LABEL = "Custom Pages Directory from Configuration"; + const LABEL = "Custom Layouts Directory from Configuration"; const cliPath = path.join(process.cwd(), "packages/cli/src/bin.js"); const outputPath = fileURLToPath(new URL(".", import.meta.url)); let runner; diff --git a/packages/cli/test/cases/build.config.layouts-directory/src/pages/index.html b/packages/cli/test/cases/build.config.layouts-directory/src/pages/index.html new file mode 100644 index 000000000..2de52d318 --- /dev/null +++ b/packages/cli/test/cases/build.config.layouts-directory/src/pages/index.html @@ -0,0 +1,4 @@ + +

Home Page

+

A page using a page layout from a custom layout directory.

+ diff --git a/packages/cli/test/cases/build.config.layouts-directory/src/pages/index.md b/packages/cli/test/cases/build.config.layouts-directory/src/pages/index.md deleted file mode 100644 index 3332d3216..000000000 --- a/packages/cli/test/cases/build.config.layouts-directory/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Home Page - -A page using a page layout from a custom layout directory. \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.markdown-custom.plugins/greenwood.config.js b/packages/cli/test/cases/build.config.markdown-custom.plugins/greenwood.config.js deleted file mode 100644 index e45abd2f9..000000000 --- a/packages/cli/test/cases/build.config.markdown-custom.plugins/greenwood.config.js +++ /dev/null @@ -1,12 +0,0 @@ -export default { - markdown: { - plugins: [ - "@mapbox/rehype-prism", - "rehype-slug", - { - name: "rehype-autolink-headings", - options: { behavior: "append" }, - }, - ], - }, -}; diff --git a/packages/cli/test/cases/build.config.pages-directory/build.config.pages-directory.spec.js b/packages/cli/test/cases/build.config.pages-directory/build.config.pages-directory.spec.js index 028ca90e8..c85b64a9d 100644 --- a/packages/cli/test/cases/build.config.pages-directory/build.config.pages-directory.spec.js +++ b/packages/cli/test/cases/build.config.pages-directory/build.config.pages-directory.spec.js @@ -17,7 +17,7 @@ * Greenwood default * src/ * docs/ - * index.md + * index.html */ import fs from "node:fs"; import { JSDOM } from "jsdom"; diff --git a/packages/cli/test/cases/build.config.pages-directory/src/docs/index.html b/packages/cli/test/cases/build.config.pages-directory/src/docs/index.html new file mode 100644 index 000000000..9d50c5e42 --- /dev/null +++ b/packages/cli/test/cases/build.config.pages-directory/src/docs/index.html @@ -0,0 +1,6 @@ + + +

Greenwood

+

This is the home page built by Greenwood. Make your own pages in src/pages/index.js!

+ + diff --git a/packages/cli/test/cases/build.config.pages-directory/src/docs/index.md b/packages/cli/test/cases/build.config.pages-directory/src/docs/index.md deleted file mode 100644 index 1c1a50fbb..000000000 --- a/packages/cli/test/cases/build.config.pages-directory/src/docs/index.md +++ /dev/null @@ -1,3 +0,0 @@ -### Greenwood - -This is the home page built by Greenwood. Make your own pages in src/pages/index.js! \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.prerender-collections/build.config.prerender-collections.spec.js b/packages/cli/test/cases/build.config.prerender-collections/build.config.prerender-collections.spec.js index 842c81a9d..40244a8d7 100644 --- a/packages/cli/test/cases/build.config.prerender-collections/build.config.prerender-collections.spec.js +++ b/packages/cli/test/cases/build.config.prerender-collections/build.config.prerender-collections.spec.js @@ -23,8 +23,8 @@ * toc.js * pages/ * blog/ - * first-post.md - * second-post.md + * first-post.html + * second-post.html * index.html * index.html * toc.html diff --git a/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/first-post.html b/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/first-post.html new file mode 100644 index 000000000..12c4bdc81 --- /dev/null +++ b/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/first-post.html @@ -0,0 +1,6 @@ + + +

First Post

+

Lorum Ipsum

+ + diff --git a/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/first-post.md b/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/first-post.md deleted file mode 100644 index 2f41b6873..000000000 --- a/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/first-post.md +++ /dev/null @@ -1,3 +0,0 @@ -# First Post - -Lorum Ipsum \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/second-post.html b/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/second-post.html new file mode 100644 index 000000000..2b633a11e --- /dev/null +++ b/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/second-post.html @@ -0,0 +1,6 @@ + + +

Second Post

+

Lorum Ipsum

+ + diff --git a/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/second-post.md b/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/second-post.md deleted file mode 100644 index ba4dc1e04..000000000 --- a/packages/cli/test/cases/build.config.prerender-collections/src/pages/blog/second-post.md +++ /dev/null @@ -1,3 +0,0 @@ -# Second Post - -Lorum Ipsum \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.prerender-markdown/greenwood.config.js b/packages/cli/test/cases/build.config.prerender-markdown/greenwood.config.js deleted file mode 100644 index 1d1aad744..000000000 --- a/packages/cli/test/cases/build.config.prerender-markdown/greenwood.config.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - prerender: true, -}; diff --git a/packages/cli/test/cases/build.config.static-router/build.config.static-router.spec.js b/packages/cli/test/cases/build.config.static-router/build.config.static-router.spec.js index b8fc08113..83cf8b677 100644 --- a/packages/cli/test/cases/build.config.static-router/build.config.static-router.spec.js +++ b/packages/cli/test/cases/build.config.static-router/build.config.static-router.spec.js @@ -16,9 +16,9 @@ * User Workspace * src/ * pages/ - * about.md + * about.html * artists.js - * index.md + * index.html * regex-test.html */ import chai from "chai"; @@ -146,7 +146,9 @@ describe("Build Greenwood With: ", function () { const aboutRouterOutlet = aboutDom.window.document.querySelectorAll("body > router-outlet")[0]; - expect(aboutRouterOutlet.innerHTML).to.contain(aboutPartial); + expect(aboutRouterOutlet.innerHTML.replace(/\n/g, "").trim()).to.contain( + aboutPartial.replace("", "").replace("", "").replace(/\n/g, "").trim(), + ); }); it("should have the expected partial output to match the contents of the about page in the tag in the ", function () { @@ -156,7 +158,9 @@ describe("Build Greenwood With: ", function () { ); const homeRouterOutlet = dom.window.document.querySelectorAll("body > router-outlet")[0]; - expect(homeRouterOutlet.innerHTML).to.contain(homePartial); + expect(homeRouterOutlet.innerHTML.replace(/\n/g, "").trim()).to.contain( + homePartial.replace("", "").replace("", "").replace(/\n/g, "").trim(), + ); }); }); diff --git a/packages/cli/test/cases/build.config.static-router/src/pages/about.html b/packages/cli/test/cases/build.config.static-router/src/pages/about.html new file mode 100644 index 000000000..7562e3ebb --- /dev/null +++ b/packages/cli/test/cases/build.config.static-router/src/pages/about.html @@ -0,0 +1,8 @@ +--- +layout: test +--- + + +

Greenwood

+

This is the about page built by Greenwood.

+ diff --git a/packages/cli/test/cases/build.config.static-router/src/pages/about.md b/packages/cli/test/cases/build.config.static-router/src/pages/about.md deleted file mode 100644 index 5618aaa66..000000000 --- a/packages/cli/test/cases/build.config.static-router/src/pages/about.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: test ---- - -### Greenwood - -This is the about page built by Greenwood. \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.static-router/src/pages/index.html b/packages/cli/test/cases/build.config.static-router/src/pages/index.html new file mode 100644 index 000000000..6f19a3be8 --- /dev/null +++ b/packages/cli/test/cases/build.config.static-router/src/pages/index.html @@ -0,0 +1,8 @@ +--- +author: Greenwood +--- + + +

Greenwood

+

This is the home page built by Greenwood.

+ diff --git a/packages/cli/test/cases/build.config.workspace-custom/build.config.workspace-custom.spec.js b/packages/cli/test/cases/build.config.workspace-custom/build.config.workspace-custom.spec.js index 0dae1f764..9b510fa89 100644 --- a/packages/cli/test/cases/build.config.workspace-custom/build.config.workspace-custom.spec.js +++ b/packages/cli/test/cases/build.config.workspace-custom/build.config.workspace-custom.spec.js @@ -16,8 +16,8 @@ * User Workspace * www/ * pages/ - * about.md - * index.md + * about.html + * index.html */ import chai from "chai"; import fs from "node:fs"; @@ -66,7 +66,7 @@ describe("Build Greenwood With: ", function () { it("should have the expected heading text within the custom about page in the about directory", function () { const heading = dom.window.document.querySelector("h3").textContent; - expect(heading).to.equal("Nested Custom About Page"); + expect(heading).to.equal("Custom About Page"); }); it("should have the expected paragraph text within the custom about page in the about directory", function () { diff --git a/packages/cli/test/cases/build.config.workspace-custom/www/pages/about.html b/packages/cli/test/cases/build.config.workspace-custom/www/pages/about.html new file mode 100644 index 000000000..c96d1d4f7 --- /dev/null +++ b/packages/cli/test/cases/build.config.workspace-custom/www/pages/about.html @@ -0,0 +1,6 @@ + + +

Custom About Page

+

This is a custom about page built by Greenwood.

+ + diff --git a/packages/cli/test/cases/build.config.workspace-custom/www/pages/about.md b/packages/cli/test/cases/build.config.workspace-custom/www/pages/about.md deleted file mode 100644 index e228c1606..000000000 --- a/packages/cli/test/cases/build.config.workspace-custom/www/pages/about.md +++ /dev/null @@ -1,3 +0,0 @@ -### Nested Custom About Page - -This is a custom about page built by Greenwood. \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.workspace-custom/www/pages/index.html b/packages/cli/test/cases/build.config.workspace-custom/www/pages/index.html new file mode 100644 index 000000000..2c52eaba0 --- /dev/null +++ b/packages/cli/test/cases/build.config.workspace-custom/www/pages/index.html @@ -0,0 +1,6 @@ + + +

Greenwood

+

This is the home page built by Greenwood. Make your own pages in www/pages/index.html!

+ + diff --git a/packages/cli/test/cases/build.config.workspace-custom/www/pages/index.md b/packages/cli/test/cases/build.config.workspace-custom/www/pages/index.md deleted file mode 100644 index 1c1a50fbb..000000000 --- a/packages/cli/test/cases/build.config.workspace-custom/www/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -### Greenwood - -This is the home page built by Greenwood. Make your own pages in src/pages/index.js! \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.meta/build.default.meta.spec.js b/packages/cli/test/cases/build.default.meta/build.default.meta.spec.js index 336e09dd9..2a0064a84 100644 --- a/packages/cli/test/cases/build.default.meta/build.default.meta.spec.js +++ b/packages/cli/test/cases/build.default.meta/build.default.meta.spec.js @@ -16,9 +16,9 @@ * src/ * pages/ * about/ - * index.md - * hello.md - * index.md + * index.html + * hello.html + * index.html * layout/ * app.html * page.html diff --git a/packages/cli/test/cases/build.default.meta/src/pages/about/index.md b/packages/cli/test/cases/build.default.meta/src/pages/about/index.html similarity index 100% rename from packages/cli/test/cases/build.default.meta/src/pages/about/index.md rename to packages/cli/test/cases/build.default.meta/src/pages/about/index.html diff --git a/packages/cli/test/cases/build.default.meta/src/pages/hello.html b/packages/cli/test/cases/build.default.meta/src/pages/hello.html new file mode 100644 index 000000000..5df6eba24 --- /dev/null +++ b/packages/cli/test/cases/build.default.meta/src/pages/hello.html @@ -0,0 +1,9 @@ + + + Hello Page + + +

Hello World

+

This is an example page built by Greenwood. Make your own in _src/pages_!

+ + diff --git a/packages/cli/test/cases/build.default.meta/src/pages/index.html b/packages/cli/test/cases/build.default.meta/src/pages/index.html new file mode 100644 index 000000000..ee673a5eb --- /dev/null +++ b/packages/cli/test/cases/build.default.meta/src/pages/index.html @@ -0,0 +1,4 @@ + +

Greenwood

+

This is the home page built by Greenwood. Make your own pages in src/pages/index.js!

+ diff --git a/packages/cli/test/cases/build.default.quick-start-npx/build.default.quick-start-npx.spec.js b/packages/cli/test/cases/build.default.quick-start-npx/build.default.quick-start-npx.spec.js deleted file mode 100644 index 20f6a9b47..000000000 --- a/packages/cli/test/cases/build.default.quick-start-npx/build.default.quick-start-npx.spec.js +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Use Case - * Run Greenwood build command with no config and emulating being run with npx - * - * User Result - * Should generate a bare bones Greenwood build with no errors for missing files - * by specifically not scaffolding node_modules/ needed for es-modules-shims and webcomponents-bundle. - * https://github.com/ProjectEvergreen/greenwood/issues/505 - * - * User Command - * greenwood build - * - * User Config - * None (Greenwood Default) - * - * User Workspace - * src/ - * components/ - * header.js - * pages/ - * index.md - * layouts/ - * page.html - */ -import chai from "chai"; -import { JSDOM } from "jsdom"; -import path from "node:path"; -import { getOutputTeardownFiles } from "../../../../../test/utils.js"; -import { runSmokeTest } from "../../../../../test/smoke-test.js"; -import { Runner } from "gallinago"; -import { fileURLToPath } from "node:url"; - -const expect = chai.expect; - -describe("Build Greenwood With: ", function () { - const LABEL = "Default Greenwood Configuration and Workspace and emulating npx"; - const cliPath = path.join(process.cwd(), "packages/cli/src/bin.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); - runner.runCommand(cliPath, "build"); - }); - - runSmokeTest(["public", "index"], LABEL); - - describe("Default output for index.html", function () { - let dom; - - before(async function () { - dom = await JSDOM.fromFile(path.resolve(this.context.publicDir, "./index.html")); - }); - - describe("head section tags", function () { - it("should have a tag in the <head>", function () { - const title = dom.window.document.querySelector("head title").textContent; - - expect(title).to.be.equal("My App"); - }); - - it("should have two <script> tag in the <head>", function () { - const scripts = dom.window.document.querySelectorAll("head script[type='module']"); - - expect(scripts.length).to.be.equal(1); - }); - }); - }); - }); - - after(function () { - runner.teardown(getOutputTeardownFiles(outputPath)); - }); -}); diff --git a/packages/cli/test/cases/build.default.quick-start-npx/src/components/header.js b/packages/cli/test/cases/build.default.quick-start-npx/src/components/header.js deleted file mode 100644 index 77af56529..000000000 --- a/packages/cli/test/cases/build.default.quick-start-npx/src/components/header.js +++ /dev/null @@ -1,19 +0,0 @@ -class HeaderComponent extends HTMLElement { - constructor() { - super(); - - this.root = this.attachShadow({ mode: "open" }); - } - - connectedCallback() { - this.root.innerHTML = this.getTemplate(); - } - - getTemplate() { - return ` - <header>This is the header component.</header> - `; - } -} - -customElements.define("app-header", HeaderComponent); diff --git a/packages/cli/test/cases/build.default.quick-start-npx/src/layouts/page.html b/packages/cli/test/cases/build.default.quick-start-npx/src/layouts/page.html deleted file mode 100644 index 15a3bcd02..000000000 --- a/packages/cli/test/cases/build.default.quick-start-npx/src/layouts/page.html +++ /dev/null @@ -1,14 +0,0 @@ -<!doctype html> -<html lang="en" prefix="og:http://ogp.me/ns#"> - <head> - <title>My App - - - - -
- - -
- - diff --git a/packages/cli/test/cases/build.default.quick-start-npx/src/pages/index.md b/packages/cli/test/cases/build.default.quick-start-npx/src/pages/index.md deleted file mode 100644 index a2726c5ca..000000000 --- a/packages/cli/test/cases/build.default.quick-start-npx/src/pages/index.md +++ /dev/null @@ -1 +0,0 @@ -## hello world \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.ssr-static-export/build.default.ssr-static-export.spec.js b/packages/cli/test/cases/build.default.ssr-static-export/build.default.ssr-static-export.spec.js index e907ec4f8..0bce8973b 100644 --- a/packages/cli/test/cases/build.default.ssr-static-export/build.default.ssr-static-export.spec.js +++ b/packages/cli/test/cases/build.default.ssr-static-export/build.default.ssr-static-export.spec.js @@ -18,6 +18,7 @@ * footer.js * pages/ * artists.js + * index.html * layouts/ * app.html */ diff --git a/packages/cli/test/cases/build.default.ssr-static-export/src/pages/index.html b/packages/cli/test/cases/build.default.ssr-static-export/src/pages/index.html new file mode 100644 index 000000000..7238e0538 --- /dev/null +++ b/packages/cli/test/cases/build.default.ssr-static-export/src/pages/index.html @@ -0,0 +1,4 @@ + +

Hello SSR

+

Lorum Ipsum.

+ diff --git a/packages/cli/test/cases/build.default.ssr-static-export/src/pages/index.md b/packages/cli/test/cases/build.default.ssr-static-export/src/pages/index.md deleted file mode 100644 index 5fa8f5c5d..000000000 --- a/packages/cli/test/cases/build.default.ssr-static-export/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -## Hello SSR - -Lorum Ipsum. \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.title/build.default.title.spec.js b/packages/cli/test/cases/build.default.title/build.default.title.spec.js index 89292b01f..7710f9124 100644 --- a/packages/cli/test/cases/build.default.title/build.default.title.spec.js +++ b/packages/cli/test/cases/build.default.title/build.default.title.spec.js @@ -15,8 +15,8 @@ * Greenwood default * src/ * pages/ - * index.md - * hello.md + * index.html + * hello.html * layouts/ * page.html */ diff --git a/packages/cli/test/cases/build.default.title/src/pages/about.html b/packages/cli/test/cases/build.default.title/src/pages/about.html new file mode 100644 index 000000000..f27a9e60f --- /dev/null +++ b/packages/cli/test/cases/build.default.title/src/pages/about.html @@ -0,0 +1,9 @@ +--- +label: "about" +title: "About Page" +--- + + +

About

+

This is an example page built by Greenwood. Make your own in _src/pages_!

+ diff --git a/packages/cli/test/cases/build.default.title/src/pages/about.md b/packages/cli/test/cases/build.default.title/src/pages/about.md deleted file mode 100644 index afd78bcbc..000000000 --- a/packages/cli/test/cases/build.default.title/src/pages/about.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -label: 'about' -title: 'About Page' ---- - -### About - -This is an example page built by Greenwood. Make your own in _src/pages_! \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.title/src/pages/index.html b/packages/cli/test/cases/build.default.title/src/pages/index.html new file mode 100644 index 000000000..8a40c3c3f --- /dev/null +++ b/packages/cli/test/cases/build.default.title/src/pages/index.html @@ -0,0 +1,9 @@ +--- +author: Greenwood +--- + + +

+ Greenwood This is the home page built by Greenwood. Make your own pages in src/pages/index.js! +

+ diff --git a/packages/cli/test/cases/build.default.title/src/pages/index.md b/packages/cli/test/cases/build.default.title/src/pages/index.md deleted file mode 100644 index 1c1a50fbb..000000000 --- a/packages/cli/test/cases/build.default.title/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -### Greenwood - -This is the home page built by Greenwood. Make your own pages in src/pages/index.js! \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-frontmatter-imports/build.default.workspace-frontmatter-imports.spec.js b/packages/cli/test/cases/build.default.workspace-frontmatter-imports/build.default.workspace-frontmatter-imports.spec.js index e78a2d2e9..df2b19004 100644 --- a/packages/cli/test/cases/build.default.workspace-frontmatter-imports/build.default.workspace-frontmatter-imports.spec.js +++ b/packages/cli/test/cases/build.default.workspace-frontmatter-imports/build.default.workspace-frontmatter-imports.spec.js @@ -23,6 +23,8 @@ * counter/ * counter.js * counter.css + * multi-hyphen/ + * multi-hyphen.js * scripts/ * frontmatter-standard.js * frontmatter-typescript.ts @@ -31,8 +33,8 @@ * frontmatter-custom.scss * pages/ * examples/ - * counter.md - * index.md + * demo.html + * index.html */ import chai from "chai"; import fs from "node:fs"; diff --git a/packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/examples/demo.md b/packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/examples/demo.html similarity index 75% rename from packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/examples/demo.md rename to packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/examples/demo.html index 755212e71..9ed25ac15 100644 --- a/packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/examples/demo.md +++ b/packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/examples/demo.html @@ -10,8 +10,9 @@ - /styles/frontmatter-custom.scss --- -## Demo Page Example + +

Demo Page Example

+ - - - \ No newline at end of file + + diff --git a/packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/index.html b/packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/index.html new file mode 100644 index 000000000..a7bf4c968 --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-frontmatter-imports/src/pages/index.html @@ -0,0 +1,4 @@ + +

Home Page

+

This is just a test.

+ diff --git a/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/build.default.workspace-layouts-page-and-app-dynamic.spec.js b/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/build.default.workspace-layouts-page-and-app-dynamic.spec.js index 615f8f8d8..0fe3797f9 100644 --- a/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/build.default.workspace-layouts-page-and-app-dynamic.spec.js +++ b/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/build.default.workspace-layouts-page-and-app-dynamic.spec.js @@ -14,7 +14,7 @@ * User Workspace * src/ * pages/ - * about.md + * about.html * index.html * layouts/ * app.js diff --git a/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/src/pages/about.html b/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/src/pages/about.html new file mode 100644 index 000000000..a2a70fd4b --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/src/pages/about.html @@ -0,0 +1,4 @@ + +

About Page

+

Learn more about us

+ diff --git a/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/src/pages/about.md b/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/src/pages/about.md deleted file mode 100644 index 3eb3f6d59..000000000 --- a/packages/cli/test/cases/build.default.workspace-layouts-page-and-app-dynamic/src/pages/about.md +++ /dev/null @@ -1,3 +0,0 @@ -### About Page - -Learn more about us \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/build.default.workspace-layouts-page-bare-merging.spec.js b/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/build.default.workspace-layouts-page-bare-merging.spec.js index 46975e0b1..b7f996396 100644 --- a/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/build.default.workspace-layouts-page-bare-merging.spec.js +++ b/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/build.default.workspace-layouts-page-bare-merging.spec.js @@ -14,7 +14,7 @@ * User Workspace * src/ * pages/ - * index.md + * index.html * layouts/ * page.html */ diff --git a/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/src/pages/index.html b/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/src/pages/index.html new file mode 100644 index 000000000..0bae863de --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/src/pages/index.html @@ -0,0 +1,4 @@ + +

Quick Start

+

This is a test.

+ diff --git a/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/src/pages/index.md b/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/src/pages/index.md deleted file mode 100644 index 062a1c311..000000000 --- a/packages/cli/test/cases/build.default.workspace-layouts-page-bare-merging/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -## Quick Start - -This is a test. \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/build.default.workspace-layouts-relative-paths.spec.js b/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/build.default.workspace-layouts-relative-paths.spec.js index ac048b3fc..097bed332 100644 --- a/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/build.default.workspace-layouts-relative-paths.spec.js +++ b/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/build.default.workspace-layouts-relative-paths.spec.js @@ -25,7 +25,7 @@ * one/ * two/ * three/ - * index.md + * index.html * index.html * layouts/ * app.html diff --git a/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/src/pages/one/two/three/index.html b/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/src/pages/one/two/three/index.html new file mode 100644 index 000000000..c6fb2e13d --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/src/pages/one/two/three/index.html @@ -0,0 +1,10 @@ +--- +imports: + - ../../../components/greeting.js +--- + + +

One Two Three

+

We made it!

+ + diff --git a/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/src/pages/one/two/three/index.md b/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/src/pages/one/two/three/index.md deleted file mode 100644 index da7e2e5ba..000000000 --- a/packages/cli/test/cases/build.default.workspace-layouts-relative-paths/src/pages/one/two/three/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -imports: - - ../../../components/greeting.js ---- - -# One Two Three - -We made it! - - \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-top-level-pages/build.default.workspace-top-level-pages.spec.js b/packages/cli/test/cases/build.default.workspace-top-level-pages/build.default.workspace-top-level-pages.spec.js index 076801502..766c8aa48 100644 --- a/packages/cli/test/cases/build.default.workspace-top-level-pages/build.default.workspace-top-level-pages.spec.js +++ b/packages/cli/test/cases/build.default.workspace-top-level-pages/build.default.workspace-top-level-pages.spec.js @@ -15,7 +15,7 @@ * src/ * pages/ * about.html - * contact.md + * contact.html * index.html */ import chai from "chai"; diff --git a/packages/cli/test/cases/build.default.workspace-top-level-pages/src/pages/contact.html b/packages/cli/test/cases/build.default.workspace-top-level-pages/src/pages/contact.html new file mode 100644 index 000000000..e70c3ad09 --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-top-level-pages/src/pages/contact.html @@ -0,0 +1,4 @@ + +

Contact Page

+

Thanks for contacting us.

+ diff --git a/packages/cli/test/cases/build.default.workspace-top-level-pages/src/pages/contact.md b/packages/cli/test/cases/build.default.workspace-top-level-pages/src/pages/contact.md deleted file mode 100644 index f6d45df3c..000000000 --- a/packages/cli/test/cases/build.default.workspace-top-level-pages/src/pages/contact.md +++ /dev/null @@ -1,3 +0,0 @@ -### Contact Page - -Thanks for contacting us. \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/build.default.workspace-user-directory-mapping.spec.js b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/build.default.workspace-user-directory-mapping.spec.js index e4187a52d..04dfd7795 100644 --- a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/build.default.workspace-user-directory-mapping.spec.js +++ b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/build.default.workspace-user-directory-mapping.spec.js @@ -19,10 +19,10 @@ * header.js * pages/ * plugins/ - * index-hooks.md - * index.md - * index.md - * pages.md + * index-hooks.html + * index.html + * index.html + * pages.html * services/ * pages/ * pages.js diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/index.html b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/index.html new file mode 100644 index 000000000..ee673a5eb --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/index.html @@ -0,0 +1,4 @@ + +

Greenwood

+

This is the home page built by Greenwood. Make your own pages in src/pages/index.js!

+ diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/index.md b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/index.md deleted file mode 100644 index 1c1a50fbb..000000000 --- a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -### Greenwood - -This is the home page built by Greenwood. Make your own pages in src/pages/index.js! \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/pages.html b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/pages.html new file mode 100644 index 000000000..3ce44d830 --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/pages.html @@ -0,0 +1,4 @@ + +

Pages page

+

This is a custom about page built by Greenwood.

+ diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/pages.md b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/pages.md deleted file mode 100644 index 2682ce0bb..000000000 --- a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/pages.md +++ /dev/null @@ -1,3 +0,0 @@ -## Pages page - -This is a custom about page built by Greenwood. \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index-hooks.html b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index-hooks.html new file mode 100644 index 000000000..b7bd12a98 --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index-hooks.html @@ -0,0 +1,4 @@ + +

Index Hooks

+

Some more Lorum Ipsum.

+ diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index-hooks.md b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index-hooks.md deleted file mode 100644 index 82aa3bb6b..000000000 --- a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index-hooks.md +++ /dev/null @@ -1,3 +0,0 @@ -## Index Hooks - -Some more Lorum Ipsum. \ No newline at end of file diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index.html b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index.html new file mode 100644 index 000000000..d45e64699 --- /dev/null +++ b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index.html @@ -0,0 +1,4 @@ + +

Plugins

+

Lorum Ipsum

+ diff --git a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index.md b/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index.md deleted file mode 100644 index 01e43c002..000000000 --- a/packages/cli/test/cases/build.default.workspace-user-directory-mapping/src/pages/plugins/index.md +++ /dev/null @@ -1,3 +0,0 @@ -## Plugins - -Lorum Ipsum \ No newline at end of file diff --git a/packages/cli/test/cases/build.plugins.context/build.plugins.context.spec.js b/packages/cli/test/cases/build.plugins.context/build.plugins.context.spec.js index ff84f0d3c..acf342220 100644 --- a/packages/cli/test/cases/build.plugins.context/build.plugins.context.spec.js +++ b/packages/cli/test/cases/build.plugins.context/build.plugins.context.spec.js @@ -15,9 +15,9 @@ * src/ * pages/ * slides/ - * index.md - * about-me.md - * index.md + * index.html + * about-me.html + * index.html */ import chai from "chai"; import glob from "glob-promise"; @@ -126,7 +126,7 @@ describe("Build Greenwood With: ", function () { ); }); - it("should have expected text from user workspace pages/index.md", function () { + it("should have expected text from user workspace about-me.md", function () { const pageHeadingPrimary = dom.window.document.querySelectorAll("body h3")[0]; const pageHeadingSecondary = dom.window.document.querySelectorAll("body p")[0]; @@ -158,12 +158,14 @@ describe("Build Greenwood With: ", function () { ); }); - it("should have expected text from user workspace pages/index.md", function () { + it("should have expected text from user workspace slides/index.html", function () { const pageHeadingPrimary = dom.window.document.querySelectorAll("body h3")[0]; const pageHeadingSecondary = dom.window.document.querySelectorAll("body h4")[0]; expect(pageHeadingPrimary.textContent).to.be.equal("Title Page"); - expect(pageHeadingSecondary.textContent).to.be.equal("Some content from title.md."); + expect(pageHeadingSecondary.textContent).to.be.equal( + "Some content from slides/index.html.", + ); }); }); diff --git a/packages/cli/test/cases/build.plugins.context/src/pages/about-me.html b/packages/cli/test/cases/build.plugins.context/src/pages/about-me.html new file mode 100644 index 000000000..1a0a9bd46 --- /dev/null +++ b/packages/cli/test/cases/build.plugins.context/src/pages/about-me.html @@ -0,0 +1,4 @@ + +

About Me

+

Hello from me!

+ diff --git a/packages/cli/test/cases/build.plugins.context/src/pages/about-me.md b/packages/cli/test/cases/build.plugins.context/src/pages/about-me.md deleted file mode 100644 index 143b70633..000000000 --- a/packages/cli/test/cases/build.plugins.context/src/pages/about-me.md +++ /dev/null @@ -1,3 +0,0 @@ -### About Me - -Hello from me! \ No newline at end of file diff --git a/packages/cli/test/cases/build.plugins.context/src/pages/index.html b/packages/cli/test/cases/build.plugins.context/src/pages/index.html new file mode 100644 index 000000000..f6f4e0175 --- /dev/null +++ b/packages/cli/test/cases/build.plugins.context/src/pages/index.html @@ -0,0 +1,8 @@ +--- +layout: index +--- + + +

Context Plugin Theme Pack Test

+

From user workspace pages/index.html

+ diff --git a/packages/cli/test/cases/build.plugins.context/src/pages/index.md b/packages/cli/test/cases/build.plugins.context/src/pages/index.md deleted file mode 100644 index 116f33d18..000000000 --- a/packages/cli/test/cases/build.plugins.context/src/pages/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: index ---- - -### Context Plugin Theme Pack Test - -#### From user workspace pages/index.md \ No newline at end of file diff --git a/packages/cli/test/cases/build.plugins.context/src/pages/slides/index.html b/packages/cli/test/cases/build.plugins.context/src/pages/slides/index.html new file mode 100644 index 000000000..f1a7f91fc --- /dev/null +++ b/packages/cli/test/cases/build.plugins.context/src/pages/slides/index.html @@ -0,0 +1,8 @@ +--- +layout: "title" +--- + + +

Title Page

+

Some content from slides/index.html.

+ diff --git a/packages/cli/test/cases/build.plugins.context/src/pages/slides/index.md b/packages/cli/test/cases/build.plugins.context/src/pages/slides/index.md deleted file mode 100644 index 0f24fda7f..000000000 --- a/packages/cli/test/cases/build.plugins.context/src/pages/slides/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: 'title' ---- - -### Title Page - -#### Some content from title.md. \ No newline at end of file diff --git a/packages/cli/test/cases/build.plugins.source/build.plugins-source.spec.js b/packages/cli/test/cases/build.plugins.source/build.plugins-source.spec.js index 432dba952..f2a5a42d4 100644 --- a/packages/cli/test/cases/build.plugins.source/build.plugins-source.spec.js +++ b/packages/cli/test/cases/build.plugins.source/build.plugins-source.spec.js @@ -27,8 +27,8 @@ * Custom Workspace * src/ * pages/ - * about.md - * index.md + * about.html + * index.html * 404.html * layouts/ * app.html diff --git a/packages/cli/test/cases/build.plugins.source/src/pages/about.html b/packages/cli/test/cases/build.plugins.source/src/pages/about.html new file mode 100644 index 000000000..8a1e9715d --- /dev/null +++ b/packages/cli/test/cases/build.plugins.source/src/pages/about.html @@ -0,0 +1,4 @@ + +

About Us

+

Lorem ipsum.

+ diff --git a/packages/cli/test/cases/build.plugins.source/src/pages/about.md b/packages/cli/test/cases/build.plugins.source/src/pages/about.md deleted file mode 100644 index 4093eb641..000000000 --- a/packages/cli/test/cases/build.plugins.source/src/pages/about.md +++ /dev/null @@ -1,3 +0,0 @@ -# About Us - -Lorem ipsum. \ No newline at end of file diff --git a/packages/cli/test/cases/build.plugins.source/src/pages/index.html b/packages/cli/test/cases/build.plugins.source/src/pages/index.html new file mode 100644 index 000000000..07673d6e2 --- /dev/null +++ b/packages/cli/test/cases/build.plugins.source/src/pages/index.html @@ -0,0 +1,4 @@ + +

Home Page

+

Welcome!

+ diff --git a/packages/cli/test/cases/build.plugins.source/src/pages/index.md b/packages/cli/test/cases/build.plugins.source/src/pages/index.md deleted file mode 100644 index 46c5f357e..000000000 --- a/packages/cli/test/cases/build.plugins.source/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -## Home Page - -Welcome! \ No newline at end of file diff --git a/packages/cli/test/cases/build.typescript.default/build.typescript.default.spec.js b/packages/cli/test/cases/build.typescript.default/build.typescript.default.spec.js index f959c6c2a..6bbcb2ad1 100644 --- a/packages/cli/test/cases/build.typescript.default/build.typescript.default.spec.js +++ b/packages/cli/test/cases/build.typescript.default/build.typescript.default.spec.js @@ -16,6 +16,9 @@ * layouts/ * app.ts * pages/ + * blog/ + * index.html + *. contact.html * index.html * scripts/ * main.ts diff --git a/packages/cli/test/cases/build.typescript.default/src/pages/blog/index.html b/packages/cli/test/cases/build.typescript.default/src/pages/blog/index.html new file mode 100644 index 000000000..5c65ebba5 --- /dev/null +++ b/packages/cli/test/cases/build.typescript.default/src/pages/blog/index.html @@ -0,0 +1,8 @@ +--- +layout: "blog" +--- + + +

My Blog Posts

+

Lorum Ipsum

+ diff --git a/packages/cli/test/cases/build.typescript.default/src/pages/blog/index.md b/packages/cli/test/cases/build.typescript.default/src/pages/blog/index.md deleted file mode 100644 index e59242fcf..000000000 --- a/packages/cli/test/cases/build.typescript.default/src/pages/blog/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: "blog" ---- - -### My Blog Posts - -Lorum Ipsum diff --git a/packages/cli/test/cases/build.typescript.default/src/pages/contact.html b/packages/cli/test/cases/build.typescript.default/src/pages/contact.html new file mode 100644 index 000000000..d56ddf7a9 --- /dev/null +++ b/packages/cli/test/cases/build.typescript.default/src/pages/contact.html @@ -0,0 +1,4 @@ + +

Contact Page

+

Please reach out!

+ diff --git a/packages/cli/test/cases/build.typescript.default/src/pages/contact.md b/packages/cli/test/cases/build.typescript.default/src/pages/contact.md deleted file mode 100644 index b86349628..000000000 --- a/packages/cli/test/cases/build.typescript.default/src/pages/contact.md +++ /dev/null @@ -1,3 +0,0 @@ -### Contact Page - -Please reach out! diff --git a/packages/cli/test/cases/develop.config.active-content/develop.config.active-content.spec.js b/packages/cli/test/cases/develop.config.active-content/develop.config.active-content.spec.js index 809385176..97dab8273 100644 --- a/packages/cli/test/cases/develop.config.active-content/develop.config.active-content.spec.js +++ b/packages/cli/test/cases/develop.config.active-content/develop.config.active-content.spec.js @@ -21,8 +21,8 @@ * toc.js * pages/ * blog/ - * first-post.md - * second-post.md + * first-post.html + * second-post.html * index.html * contact.html * index.html diff --git a/packages/cli/test/cases/develop.config.active-content/src/pages/blog/first-post.html b/packages/cli/test/cases/develop.config.active-content/src/pages/blog/first-post.html new file mode 100644 index 000000000..2c7a8c989 --- /dev/null +++ b/packages/cli/test/cases/develop.config.active-content/src/pages/blog/first-post.html @@ -0,0 +1,4 @@ + +

First Post

+

Lorum Ipsum

+ diff --git a/packages/cli/test/cases/develop.config.active-content/src/pages/blog/first-post.md b/packages/cli/test/cases/develop.config.active-content/src/pages/blog/first-post.md deleted file mode 100644 index 2f41b6873..000000000 --- a/packages/cli/test/cases/develop.config.active-content/src/pages/blog/first-post.md +++ /dev/null @@ -1,3 +0,0 @@ -# First Post - -Lorum Ipsum \ No newline at end of file diff --git a/packages/cli/test/cases/develop.config.active-content/src/pages/blog/second-post.html b/packages/cli/test/cases/develop.config.active-content/src/pages/blog/second-post.html new file mode 100644 index 000000000..c7654d899 --- /dev/null +++ b/packages/cli/test/cases/develop.config.active-content/src/pages/blog/second-post.html @@ -0,0 +1,4 @@ + +

Second Post

+

Lorum Ipsum

+ diff --git a/packages/cli/test/cases/develop.config.active-content/src/pages/blog/second-post.md b/packages/cli/test/cases/develop.config.active-content/src/pages/blog/second-post.md deleted file mode 100644 index ba4dc1e04..000000000 --- a/packages/cli/test/cases/develop.config.active-content/src/pages/blog/second-post.md +++ /dev/null @@ -1,3 +0,0 @@ -# Second Post - -Lorum Ipsum \ No newline at end of file diff --git a/packages/cli/test/cases/develop.default/import-map.snapshot.json b/packages/cli/test/cases/develop.default/import-map.snapshot.json index 1c071c95f..2d2c3e902 100644 --- a/packages/cli/test/cases/develop.default/import-map.snapshot.json +++ b/packages/cli/test/cases/develop.default/import-map.snapshot.json @@ -4213,8 +4213,7 @@ "robust-predicates": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/robust-predicates/index.js", "d3-dsv/umd": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/d3-dsv/dist/d3-dsv.min.js", "d3-dsv": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/d3-dsv/src/index.js", - "commander": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/commander/esm.mjs", - "commander/esm.mjs": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/commander/esm.mjs", + "commander": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/commander/index", "iconv-lite": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/iconv-lite/lib/index.js", "safer-buffer": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/safer-buffer/safer.js", "rw": "/~/Users/owenbuckley/Workspace/project-evergreen/greenwood/node_modules/rw/index.js", diff --git a/packages/cli/test/cases/develop.plugins.context/develop.plugins.context.spec.js b/packages/cli/test/cases/develop.plugins.context/develop.plugins.context.spec.js index 106b576c8..ffd20dfd2 100644 --- a/packages/cli/test/cases/develop.plugins.context/develop.plugins.context.spec.js +++ b/packages/cli/test/cases/develop.plugins.context/develop.plugins.context.spec.js @@ -15,8 +15,8 @@ * src/ * pages/ * slides/ - * index.md - * index.md + * index.html + * index.html */ import chai from "chai"; import fs from "node:fs"; @@ -94,12 +94,14 @@ describe("Develop Greenwood With: ", function () { done(); }); - it("should have expected text from user workspace pages/index.md", function (done) { + it("should have expected text from user workspace pages/index.html", function (done) { const pageHeadingPrimary = dom.window.document.querySelectorAll("body h3")[0]; const pageHeadingSecondary = dom.window.document.querySelectorAll("body h4")[0]; expect(pageHeadingPrimary.textContent).to.be.equal("Context Plugin Theme Pack Test"); - expect(pageHeadingSecondary.textContent).to.be.equal("From user workspace pages/index.md"); + expect(pageHeadingSecondary.textContent).to.be.equal( + "From user workspace pages/index.html", + ); done(); }); }); diff --git a/packages/cli/test/cases/develop.plugins.context/src/pages/index.html b/packages/cli/test/cases/develop.plugins.context/src/pages/index.html new file mode 100644 index 000000000..b453c7611 --- /dev/null +++ b/packages/cli/test/cases/develop.plugins.context/src/pages/index.html @@ -0,0 +1,4 @@ + +

Context Plugin Theme Pack Test

+

From user workspace pages/index.html

+ diff --git a/packages/cli/test/cases/develop.plugins.context/src/pages/index.md b/packages/cli/test/cases/develop.plugins.context/src/pages/index.md deleted file mode 100644 index f70ea49d0..000000000 --- a/packages/cli/test/cases/develop.plugins.context/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -### Context Plugin Theme Pack Test - -#### From user workspace pages/index.md \ No newline at end of file diff --git a/packages/cli/test/cases/develop.plugins.context/src/pages/slides/index.html b/packages/cli/test/cases/develop.plugins.context/src/pages/slides/index.html new file mode 100644 index 000000000..f1a7f91fc --- /dev/null +++ b/packages/cli/test/cases/develop.plugins.context/src/pages/slides/index.html @@ -0,0 +1,8 @@ +--- +layout: "title" +--- + + +

Title Page

+

Some content from slides/index.html.

+ diff --git a/packages/cli/test/cases/develop.plugins.context/src/pages/slides/index.md b/packages/cli/test/cases/develop.plugins.context/src/pages/slides/index.md deleted file mode 100644 index 0f24fda7f..000000000 --- a/packages/cli/test/cases/develop.plugins.context/src/pages/slides/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: 'title' ---- - -### Title Page - -#### Some content from title.md. \ No newline at end of file diff --git a/packages/cli/test/cases/loaders-build.plugins.resource-page/greenwood.config.js b/packages/cli/test/cases/loaders-build.plugins.resource-page/greenwood.config.js index 018eff2ad..8e81e854c 100644 --- a/packages/cli/test/cases/loaders-build.plugins.resource-page/greenwood.config.js +++ b/packages/cli/test/cases/loaders-build.plugins.resource-page/greenwood.config.js @@ -11,11 +11,16 @@ class FooResource { } async shouldServe(url) { - return url.pathname.split(".").pop() === this.extensions[0] && this.servePage; + const { pathname } = url; + const hasMatchingPageRoute = this.compilation.graph.find((node) => node.route === pathname); + + return hasMatchingPageRoute?.pageHref?.endsWith(this.extensions[0]); } async serve(url) { - const body = await fs.readFile(url, "utf-8"); + const { pathname } = url; + const matchingPageRoute = this.compilation.graph.find((node) => node.route === pathname); + const body = await fs.readFile(new URL(matchingPageRoute.pageHref), "utf-8"); return new Response(body, { headers: new Headers({ @@ -40,7 +45,12 @@ class BarResource { } async serve(url) { - let body = await fs.readFile(url, "utf-8"); + const { pathname } = url; + const matchingPageRoute = this.compilation.graph.find((node) => node.route === pathname); + // handle as page file being used as a page vs being imported using ESM or as an API route + let body = matchingPageRoute + ? await fs.readFile(new URL(matchingPageRoute.pageHref), "utf-8") + : await fs.readFile(url, "utf-8"); body = body.replace(/interface (.*){(.*)}/, ""); diff --git a/packages/cli/test/cases/serve.config.base-path/serve.config.base-path.spec.js b/packages/cli/test/cases/serve.config.base-path/serve.config.base-path.spec.js index 478b1166c..d6a05df2f 100644 --- a/packages/cli/test/cases/serve.config.base-path/serve.config.base-path.spec.js +++ b/packages/cli/test/cases/serve.config.base-path/serve.config.base-path.spec.js @@ -11,7 +11,12 @@ * User Config * devServer: { * basePath: '/my-path', - * staticRouter: true + * staticRouter: true, + * devServer: { + * proxy: { + * "/posts": "https://jsonplaceholder.typicode.com", + * }, + * }, * } * * User Workspace @@ -24,7 +29,7 @@ * api/ * greeting.js * 404.html - * about.md + * about.html * index.html * users.js * styles/ @@ -292,7 +297,7 @@ describe("Serve Greenwood With: ", function () { expect(routerScriptTags.length).to.be.equal(1); expect(routerScriptTags[0].textContent.replace(/ /g, "").replace(/\n/g, "")).to.contain( - `window.__greenwood=window.__greenwood||{};window.__greenwood.currentLayout="${basePath}/"`, + `window.__greenwood=window.__greenwood||{};window.__greenwood.currentLayout="page"`, ); }); @@ -326,7 +331,7 @@ describe("Serve Greenwood With: ", function () { const dataset = aboutRouteTag[0].dataset; expect(aboutRouteTag.length).to.be.equal(1); - expect(dataset.layout).to.be.equal(`${basePath}/`); + expect(dataset.layout).to.be.equal("page"); expect(dataset.key).to.be.equal(`${basePath}/_routes/index.html`); }); diff --git a/packages/cli/test/cases/serve.config.base-path/src/pages/about.html b/packages/cli/test/cases/serve.config.base-path/src/pages/about.html new file mode 100644 index 000000000..7562e3ebb --- /dev/null +++ b/packages/cli/test/cases/serve.config.base-path/src/pages/about.html @@ -0,0 +1,8 @@ +--- +layout: test +--- + + +

Greenwood

+

This is the about page built by Greenwood.

+ diff --git a/packages/cli/test/cases/serve.config.static-router/serve.config.static-router.spec.js b/packages/cli/test/cases/serve.config.static-router/serve.config.static-router.spec.js index d705e2237..8c63676de 100644 --- a/packages/cli/test/cases/serve.config.static-router/serve.config.static-router.spec.js +++ b/packages/cli/test/cases/serve.config.static-router/serve.config.static-router.spec.js @@ -17,9 +17,9 @@ * User Workspace * src/ * pages/ - * about.md + * about.html * artists.js - * index.md + * index.html */ import chai from "chai"; import path from "node:path"; diff --git a/packages/cli/test/cases/serve.config.static-router/src/pages/about.html b/packages/cli/test/cases/serve.config.static-router/src/pages/about.html new file mode 100644 index 000000000..e77143df8 --- /dev/null +++ b/packages/cli/test/cases/serve.config.static-router/src/pages/about.html @@ -0,0 +1,10 @@ +--- +layout: test +--- + + + +

Greenwood

+

This is the about page built by Greenwood.

+ + diff --git a/packages/cli/test/cases/serve.config.static-router/src/pages/about.md b/packages/cli/test/cases/serve.config.static-router/src/pages/about.md deleted file mode 100644 index 5618aaa66..000000000 --- a/packages/cli/test/cases/serve.config.static-router/src/pages/about.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: test ---- - -### Greenwood - -This is the about page built by Greenwood. \ No newline at end of file diff --git a/packages/cli/test/cases/serve.config.static-router/src/pages/index.html b/packages/cli/test/cases/serve.config.static-router/src/pages/index.html new file mode 100644 index 000000000..36ec8b7f6 --- /dev/null +++ b/packages/cli/test/cases/serve.config.static-router/src/pages/index.html @@ -0,0 +1,6 @@ + + +

Greenwood

+

This is the home page built by Greenwood.

+ + diff --git a/packages/cli/test/cases/serve.config.static-router/src/pages/index.md b/packages/cli/test/cases/serve.config.static-router/src/pages/index.md deleted file mode 100644 index b17b38a67..000000000 --- a/packages/cli/test/cases/serve.config.static-router/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -### Greenwood - -This is the home page built by Greenwood. \ No newline at end of file diff --git a/packages/cli/test/cases/serve.default.ssr-static-export/serve.default.ssr-static-export.spec.js b/packages/cli/test/cases/serve.default.ssr-static-export/serve.default.ssr-static-export.spec.js index 13e1b8bd2..3ec7f2cf1 100644 --- a/packages/cli/test/cases/serve.default.ssr-static-export/serve.default.ssr-static-export.spec.js +++ b/packages/cli/test/cases/serve.default.ssr-static-export/serve.default.ssr-static-export.spec.js @@ -18,6 +18,7 @@ * footer.js * pages/ * artists.js + * index.html * layouts/ * app.html */ diff --git a/packages/cli/test/cases/serve.default.ssr-static-export/src/pages/index.html b/packages/cli/test/cases/serve.default.ssr-static-export/src/pages/index.html new file mode 100644 index 000000000..f992333dd --- /dev/null +++ b/packages/cli/test/cases/serve.default.ssr-static-export/src/pages/index.html @@ -0,0 +1,6 @@ + + +

Hello SSR

+

Lorum Ipsum.

+ + diff --git a/packages/cli/test/cases/serve.default.ssr-static-export/src/pages/index.md b/packages/cli/test/cases/serve.default.ssr-static-export/src/pages/index.md deleted file mode 100644 index 5fa8f5c5d..000000000 --- a/packages/cli/test/cases/serve.default.ssr-static-export/src/pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -## Hello SSR - -Lorum Ipsum. \ No newline at end of file diff --git a/packages/cli/test/cases/serve.default.ssr/serve.default.ssr.spec.js b/packages/cli/test/cases/serve.default.ssr/serve.default.ssr.spec.js index 0c2628728..e7638de22 100644 --- a/packages/cli/test/cases/serve.default.ssr/serve.default.ssr.spec.js +++ b/packages/cli/test/cases/serve.default.ssr/serve.default.ssr.spec.js @@ -21,7 +21,7 @@ * images/ * logo.svg * pages/ - * about.md + * about.html * artists.js * blog/ * first-post.js diff --git a/packages/cli/test/cases/serve.default.ssr/src/pages/about.md b/packages/cli/test/cases/serve.default.ssr/src/pages/about.html similarity index 70% rename from packages/cli/test/cases/serve.default.ssr/src/pages/about.md rename to packages/cli/test/cases/serve.default.ssr/src/pages/about.html index 2a1e84a6f..f8551a27f 100644 --- a/packages/cli/test/cases/serve.default.ssr/src/pages/about.md +++ b/packages/cli/test/cases/serve.default.ssr/src/pages/about.html @@ -7,4 +7,6 @@ order: 1 --- -# Welcome to the about page! \ No newline at end of file + +

Welcome to the about page!

+ diff --git a/packages/cli/test/cases/theme-pack/src/pages/index.html b/packages/cli/test/cases/theme-pack/src/pages/index.html new file mode 100644 index 000000000..94b275b59 --- /dev/null +++ b/packages/cli/test/cases/theme-pack/src/pages/index.html @@ -0,0 +1,8 @@ +--- +layout: "blog-post" +--- + + +

Title of blog post

+

Lorum Ipsum, this is a test.

+ diff --git a/packages/cli/test/cases/theme-pack/src/pages/index.md b/packages/cli/test/cases/theme-pack/src/pages/index.md deleted file mode 100644 index fe28153e0..000000000 --- a/packages/cli/test/cases/theme-pack/src/pages/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: 'blog-post' ---- - -## Title of blog post - -Lorum Ipsum, this is a test. \ No newline at end of file diff --git a/packages/cli/test/cases/theme-pack/theme-pack.build.spec.js b/packages/cli/test/cases/theme-pack/theme-pack.build.spec.js index ddef5d564..793bb1463 100644 --- a/packages/cli/test/cases/theme-pack/theme-pack.build.spec.js +++ b/packages/cli/test/cases/theme-pack/theme-pack.build.spec.js @@ -21,7 +21,7 @@ * my-layouts/ * blog-post.html * pages/ - * index.md + * index.html * styles/ * theme.css */ diff --git a/packages/cli/test/cases/theme-pack/theme-pack.develop.spec.js b/packages/cli/test/cases/theme-pack/theme-pack.develop.spec.js index 2f1ab2dfb..b71121725 100644 --- a/packages/cli/test/cases/theme-pack/theme-pack.develop.spec.js +++ b/packages/cli/test/cases/theme-pack/theme-pack.develop.spec.js @@ -21,7 +21,7 @@ * layouts/ * blog-post.html * pages/ - * index.md + * index.html * styles/ * theme.css */ diff --git a/packages/plugin-graphql/README.md b/packages/plugin-graphql/README.md index abff706ab..1417936da 100644 --- a/packages/plugin-graphql/README.md +++ b/packages/plugin-graphql/README.md @@ -12,6 +12,8 @@ As of now, this plugin requires some form of [prerendering](https://www.greenwoo 1. Enabling [custom imports](https://www.greenwoodjs.dev/docs/pages/server-rendering/#custom-imports), or 1. Installing the [Puppeteer renderer plugin](https://github.com/ProjectEvergreen/greenwood/tree/master/packages/plugin-renderer-puppeteer) +It will also require setting [`activeContent`](https://greenwoodjs.dev/docs/reference/configuration/#active-content) to `true`. + ## Installation You can use your favorite JavaScript package manager to install this package. @@ -36,6 +38,7 @@ import { greenwoodPluginGraphQL } from '@greenwood/plugin-graphql'; import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer'; export default { + activeContent: true, prerender: true, plugins: [ greenwoodPluginGraphQL(), diff --git a/packages/plugin-graphql/src/schema/graph.js b/packages/plugin-graphql/src/schema/graph.js index 29bca1707..78995eb5d 100644 --- a/packages/plugin-graphql/src/schema/graph.js +++ b/packages/plugin-graphql/src/schema/graph.js @@ -1,21 +1,24 @@ import gql from "graphql-tag"; +import { + filterContentByCollection, + filterContentByRoute, +} from "@greenwood/cli/src/lib/content-utils.js"; -const getCollection = (root, { name, orderBy }, context) => { +const getCollection = async (root, { name, orderBy }, context) => { const { graph } = context; + const content = filterContentByCollection(graph, name); let items = []; - graph.forEach((page) => { + content.forEach((page) => { const { data, label, title } = page; - const { collection, tableOfContents, tocHeading } = data; + const { tableOfContents, tocHeading } = data; const toc = getParsedHeadingsFromPage(tableOfContents, tocHeading); - if (collection === name) { - items.push({ ...page, title: title || label, tableOfContents: toc }); - } + items.push({ ...page, title: title || label, tableOfContents: toc }); }); if (orderBy) { - items = sortCollection(items, orderBy); + return sortCollection(items, orderBy); } return items; @@ -50,41 +53,24 @@ const sortCollection = (collection, orderBy) => { return collection.sort(compare); }; -const getParsedHeadingsFromPage = (tableOfContents = [], headingLevel) => { +const getParsedHeadingsFromPage = (tableOfContents = []) => { let children = []; - if (tableOfContents.length > 0 && headingLevel > 0) { - tableOfContents.forEach(({ content, slug, lvl }) => { - // make sure we only add heading elements of the same level (h1, h2, h3) - if (lvl === headingLevel) { - children.push({ label: content, route: "#" + slug }); - } - }); - } + tableOfContents.forEach(({ content, slug }) => { + children.push({ label: content, route: "#" + slug }); + }); return children; }; const getPagesFromGraph = async (root, query, context) => { - return Promise.resolve(context.graph); + return context.graph; }; const getChildrenFromParentRoute = async (root, query, context) => { - const pages = []; const { parent } = query; - const { graph } = context; - // TODO handle base path - // const { basePath } = context.config; - - graph.forEach((page) => { - const { route } = page; - - if (`${parent}/` !== route && route.startsWith(parent)) { - pages.push(page); - } - }); - return Promise.resolve(pages); + return filterContentByRoute(context.graph, parent); }; const graphTypeDefs = gql` diff --git a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/greenwood.config.js b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/greenwood.config.js index 8886ba3ee..c607bb446 100644 --- a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/greenwood.config.js +++ b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/greenwood.config.js @@ -1,6 +1,7 @@ import { greenwoodPluginGraphQL } from "../../../src/index.js"; export default { + activeContent: true, prerender: true, plugins: [greenwoodPluginGraphQL()], }; diff --git a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/loaders-prerender.query-children.spec.js b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/loaders-prerender.query-children.spec.js index 5f6403fa7..b54a08483 100644 --- a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/loaders-prerender.query-children.spec.js +++ b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/loaders-prerender.query-children.spec.js @@ -56,7 +56,7 @@ describe("Build Greenwood With: ", function () { runner.runCommand(cliPath, "build"); }); - runSmokeTest(["public", "index"], LABEL); + runSmokeTest(["public"], LABEL); describe("Home Page output w/ ChildrenQuery", function () { let dom; diff --git a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/components/posts-list.js b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/components/posts-list.js index 477b0e36e..d6665bfea 100644 --- a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/components/posts-list.js +++ b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/components/posts-list.js @@ -1,14 +1,16 @@ import client from "@greenwood/plugin-graphql/src/core/client.js"; -import ChildrenQuery from "@greenwood/plugin-graphql/src/queries/children.gql" with { type: "gql" }; +import ChildrenQuery from "@greenwood/plugin-graphql/src/queries/children.gql"; export default class PostsList extends HTMLElement { async connectedCallback() { const response = await client.query({ query: ChildrenQuery, variables: { - parent: "/blog", + parent: "/blog/", }, }); + console.log({ response }); + console.log(response.errors); const posts = response.data.children; this.innerHTML = ` diff --git a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/first-post/index.html b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/first-post/index.html new file mode 100644 index 000000000..eb706d979 --- /dev/null +++ b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/first-post/index.html @@ -0,0 +1,12 @@ +--- +title: "First" +--- + + + +

My First Blog Post

+

Lorem Ipsum

+ + back + + diff --git a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/first-post/index.md b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/first-post/index.md deleted file mode 100644 index 8af878ee7..000000000 --- a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/first-post/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: 'First' ---- - -## My First Blog Post -Lorem Ipsum - -[back](/) \ No newline at end of file diff --git a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/second-post/index.html b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/second-post/index.html new file mode 100644 index 000000000..8426ef9bb --- /dev/null +++ b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/second-post/index.html @@ -0,0 +1,12 @@ +--- +title: "Second" +--- + + + +

My Second Blog Post

+

Lorem Ipsum

+ + back + + diff --git a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/second-post/index.md b/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/second-post/index.md deleted file mode 100644 index d64aad85e..000000000 --- a/packages/plugin-graphql/test/cases/loaders-prerender.query-children/src/pages/blog/second-post/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: 'Second' ---- - -## My Second Blog Post -Lorem Ipsum - -[back](/) \ No newline at end of file diff --git a/packages/plugin-graphql/test/cases/qraphql-server/greenwood.config.js b/packages/plugin-graphql/test/cases/qraphql-server/greenwood.config.js index 2bb86279c..d24c4396b 100644 --- a/packages/plugin-graphql/test/cases/qraphql-server/greenwood.config.js +++ b/packages/plugin-graphql/test/cases/qraphql-server/greenwood.config.js @@ -1,5 +1,6 @@ import { greenwoodPluginGraphQL } from "../../../src/index.js"; export default { + activeContent: true, plugins: [...greenwoodPluginGraphQL()], }; diff --git a/packages/plugin-graphql/test/cases/query-children/greenwood.config.js b/packages/plugin-graphql/test/cases/query-children/greenwood.config.js index 751886e48..0b673d5e3 100644 --- a/packages/plugin-graphql/test/cases/query-children/greenwood.config.js +++ b/packages/plugin-graphql/test/cases/query-children/greenwood.config.js @@ -2,6 +2,7 @@ import { greenwoodPluginGraphQL } from "../../../src/index.js"; import { greenwoodPluginRendererPuppeteer } from "@greenwood/plugin-renderer-puppeteer"; export default { + activeContent: true, prerender: true, plugins: [greenwoodPluginGraphQL(), greenwoodPluginRendererPuppeteer()], }; diff --git a/packages/plugin-graphql/test/cases/query-children/query-children.spec.js b/packages/plugin-graphql/test/cases/query-children/query-children.spec.js deleted file mode 100644 index 3dbb36cc8..000000000 --- a/packages/plugin-graphql/test/cases/query-children/query-children.spec.js +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Use Case - * Run Greenwood build command with GraphQL calls to get data about the projects graph using ChildrenQuery. - * - * Needs prerender to be true to get SSR and client side GQL fetching. - * - * User Result - * Should generate a Greenwood build that tests basic output from the ChildrenQuery. - * - * User Command - * greenwood build - * - * Default Config (+ plugin-graphql and prerender) - * - * Custom Workspace - * src/ - * components/ - * posts-list.js - * pages/ - * blog/ - * first-post/ - * index.md - * second-post/ - * index.md - * index.html - */ -import chai from "chai"; -import fs from "node:fs"; -import glob from "glob-promise"; -import { JSDOM } from "jsdom"; -import path from "node:path"; -import { runSmokeTest } from "../../../../../test/smoke-test.js"; -import { getOutputTeardownFiles } from "../../../../../test/utils.js"; -import { Runner } from "gallinago"; -import { fileURLToPath } from "node:url"; - -const expect = chai.expect; - -describe("Build Greenwood With: ", function () { - const LABEL = "Children from GraphQL"; - const apolloStateRegex = /window.__APOLLO_STATE__ = true/; - const cliPath = path.join(process.cwd(), "packages/cli/src/bin.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); - runner.runCommand(cliPath, "build"); - }); - - runSmokeTest(["public", "index"], LABEL); - - describe("Home Page output w/ ChildrenQuery", function () { - let dom; - - before(async function () { - dom = await JSDOM.fromFile(path.resolve(this.context.publicDir, "index.html")); - }); - - it("should have one window.__APOLLO_STATE__ + + +
+ +
+ + diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/my-layouts/page.html b/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/my-layouts/page.html new file mode 100644 index 000000000..67c5d5b39 --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/my-layouts/page.html @@ -0,0 +1,9 @@ + + +

This is a custom (default) page layout from the custom layouts directory.

+ + + + + + diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/my-layouts/title.html b/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/my-layouts/title.html new file mode 100644 index 000000000..f3c53c75f --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/my-layouts/title.html @@ -0,0 +1,11 @@ + + + + + + +

This is a custom page layout called title from the layouts directory.

+ + + + diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/styles/theme.css b/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/styles/theme.css new file mode 100644 index 000000000..6d354ec27 --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/fixtures/styles/theme.css @@ -0,0 +1,8 @@ +:root { + --color-primary: #135; + --color-secondary: #74b238; + --color-text-light: #efefef; + --color-text-dark: #020202; + --font-family: "Optima", sans-serif; + --font-size: 1.5rem; +} diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/greenwood.config.js b/packages/plugin-markdown/test/cases/build.plugins.context/greenwood.config.js new file mode 100644 index 000000000..7c5bd5f2b --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/greenwood.config.js @@ -0,0 +1,7 @@ +// shared with another test develop.plugins.context +import { myThemePackPlugin } from "./theme-pack-context-plugin.js"; +import { greenwoodPluginMarkdown } from "../../../src/index.js"; + +export default { + plugins: [greenwoodPluginMarkdown(), myThemePackPlugin()], +}; diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/package.json b/packages/plugin-markdown/test/cases/build.plugins.context/package.json new file mode 100644 index 000000000..2f68d1f7f --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/package.json @@ -0,0 +1,4 @@ +{ + "name": "my-theme-pack", + "type": "module" +} diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/about-me.html b/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/about-me.html new file mode 100644 index 000000000..1a0a9bd46 --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/about-me.html @@ -0,0 +1,4 @@ + +

About Me

+

Hello from me!

+ diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/index.html b/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/index.html new file mode 100644 index 000000000..bd8107441 --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/index.html @@ -0,0 +1,8 @@ +--- +layout: index +--- + + +

Context Plugin Theme Pack Test

+

From user workspace pages/index.md

+ diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/slides/index.md b/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/slides/index.md new file mode 100644 index 000000000..14c19e68d --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/src/pages/slides/index.md @@ -0,0 +1,7 @@ +--- +layout: "title" +--- + +### Title Page + +#### Some content from slides/index.html. \ No newline at end of file diff --git a/packages/plugin-markdown/test/cases/build.plugins.context/theme-pack-context-plugin.js b/packages/plugin-markdown/test/cases/build.plugins.context/theme-pack-context-plugin.js new file mode 100644 index 000000000..747b9e805 --- /dev/null +++ b/packages/plugin-markdown/test/cases/build.plugins.context/theme-pack-context-plugin.js @@ -0,0 +1,24 @@ +import fs from "node:fs/promises"; + +const packageJson = JSON.parse( + await fs.readFile(new URL("./package.json", import.meta.url), "utf-8"), +); +const myThemePackPlugin = (options = {}) => [ + { + type: "context", + name: "my-theme-pack:context", + provider: () => { + const { name } = packageJson; + + const layoutLocation = options.__isDevelopment + ? new URL("./fixtures/my-layouts/", import.meta.url) + : new URL(`./node_modules/${name}/dist/my-layouts/`, import.meta.url); + + return { + layouts: [layoutLocation], + }; + }, + }, +]; + +export { myThemePackPlugin }; diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/develop.plugins.context.spec.js b/packages/plugin-markdown/test/cases/develop.plugins.context/develop.plugins.context.spec.js new file mode 100644 index 000000000..e062f3fc3 --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/develop.plugins.context.spec.js @@ -0,0 +1,170 @@ +/* + * Use Case + * Develop with Greenwood when using a custom context plugin (e.g. installed via npm) that provides custom layouts (app / page) and resources (JS / CSS); aka a "theme pack". + * + * User Result + * Should start development server with expected layouts being used from node_modules along with JS and CSS. + * + * User Command + * greenwood develop + * + * User Config + * Mock Theme Pack Plugin (from fixtures) + greenwoodPluginMarkdown() + * + * Custom Workspace + * src/ + * pages/ + * slides/ + * index.md + * index.md + */ +import chai from "chai"; +import fs from "node:fs"; +import { JSDOM } from "jsdom"; +import path from "node:path"; +import { runSmokeTest } from "../../../../../test/smoke-test.js"; +import { Runner } from "gallinago"; +import { fileURLToPath } from "node:url"; + +const expect = chai.expect; +const packageJson = JSON.parse( + await fs.promises.readFile(new URL("./package.json", import.meta.url), "utf-8"), +); + +describe("Develop Greenwood With: ", function () { + const LABEL = "Custom Context Plugin and Default Workspace (aka Theme Packs) with Markdown"; + const cliPath = path.join(process.cwd(), "packages/cli/src/bin.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 }); + }); + }); + + runSmokeTest(["serve"], LABEL); + + describe("Develop command specific HTML behaviors", function () { + let response = {}; + let dom; + + before(async function () { + response = await fetch(`${hostname}:${port}`); + const body = await response.clone().text(); + dom = new JSDOM(body); + }); + + it("should return a 200", function (done) { + expect(response.status).to.equal(200); + done(); + }); + + it("should have expected text from from a mock package layout/app.html in node_modules/", function (done) { + const pageLayoutHeading = dom.window.document.querySelectorAll("body h1")[0]; + + expect(pageLayoutHeading.textContent).to.be.equal( + "This is a custom app layout from the custom layouts directory.", + ); + done(); + }); + + it("should have expected text from from a mock package layout/page.html in node_modules/", function (done) { + const pageLayoutHeading = dom.window.document.querySelectorAll("body h2")[0]; + + expect(pageLayoutHeading.textContent).to.be.equal( + "This is a custom (default) page layout from the custom layouts directory.", + ); + done(); + }); + + it("should have expected text from user workspace pages/index.md", function (done) { + const pageHeadingPrimary = dom.window.document.querySelectorAll("body h3")[0]; + const pageHeadingSecondary = dom.window.document.querySelectorAll("body h4")[0]; + + expect(pageHeadingPrimary.textContent).to.be.equal("Context Plugin Theme Pack Test"); + expect(pageHeadingSecondary.textContent).to.be.equal("From user workspace pages/index.md"); + done(); + }); + }); + + describe("Custom Theme Pack internal logic for resolving theme.css for local development", function () { + let response = {}; + let body; + + before(async function () { + response = await fetch( + `${hostname}:${port}/node_modules/${packageJson.name}/dist/styles/theme.css`, + ); + body = await response.clone().text(); + }); + + it("should return a 200", function (done) { + expect(response.status).to.equal(200); + + done(); + }); + + it("should return the correct content type", function (done) { + expect(response.headers.get("content-type")).to.equal("text/css"); + done(); + }); + + it("should correctly return CSS from the developers local files", function (done) { + expect(body).to.equal(":root{--color-primary:#135}"); + + done(); + }); + }); + + describe("Custom Theme Pack internal logic for resolving greeting.js for local development", function () { + let response = {}; + let body; + + before(async function () { + response = await fetch( + `${hostname}:${port}/node_modules/${packageJson.name}/dist/components/greeting.js`, + ); + body = await response.clone().text(); + }); + + it("should return a 200", function (done) { + expect(response.status).to.equal(200); + + done(); + }); + + it("should return the correct content type", function (done) { + expect(response.headers.get("content-type")).to.equal("text/javascript"); + done(); + }); + + it("should correctly return JavaScript from the developers local files", function (done) { + expect(body).to.contain('customElements.define("x-greeting", GreetingComponent);'); + + done(); + }); + }); + }); + + after(function () { + runner.stopCommand(); + // runner.teardown([path.join(outputPath, ".greenwood")]); + }); +}); diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/components/greeting.js b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/components/greeting.js new file mode 100644 index 000000000..e9f8a08dc --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/components/greeting.js @@ -0,0 +1,18 @@ +const template = document.createElement("template"); + +template.innerHTML = ` +

Hello from the greeting component!

+`; + +class GreetingComponent extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: "open" }); + } + + async connectedCallback() { + this.shadowRoot.appendChild(template.content.cloneNode(true)); + } +} + +customElements.define("x-greeting", GreetingComponent); diff --git a/packages/cli/test/cases/build.default.markdown/src/layouts/app.html b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/app.html similarity index 56% rename from packages/cli/test/cases/build.default.markdown/src/layouts/app.html rename to packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/app.html index 618531563..d8c9551d8 100644 --- a/packages/cli/test/cases/build.default.markdown/src/layouts/app.html +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/app.html @@ -1,10 +1,14 @@ + My App + + +

This is a custom app layout from the custom layouts directory.

diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/page.html b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/page.html new file mode 100644 index 000000000..67c5d5b39 --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/page.html @@ -0,0 +1,9 @@ + + +

This is a custom (default) page layout from the custom layouts directory.

+ + + + + + diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/title.html b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/title.html new file mode 100644 index 000000000..f3c53c75f --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/my-layouts/title.html @@ -0,0 +1,11 @@ + + + + + + +

This is a custom page layout called title from the layouts directory.

+ + + + diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/styles/theme.css b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/styles/theme.css new file mode 100644 index 000000000..d16598e31 --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/fixtures/styles/theme.css @@ -0,0 +1,3 @@ +:root { + --color-primary: #135; +} diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/greenwood.config.js b/packages/plugin-markdown/test/cases/develop.plugins.context/greenwood.config.js new file mode 100644 index 000000000..39e7ed624 --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/greenwood.config.js @@ -0,0 +1,42 @@ +// shared from another test +import fs from "node:fs/promises"; +import { myThemePackPlugin } from "../build.plugins.context/theme-pack-context-plugin.js"; +import { greenwoodPluginMarkdown } from "../../../src/index.js"; + +const packageName = JSON.parse( + await fs.readFile(new URL("./package.json", import.meta.url), "utf-8"), +).name; + +class MyThemePackDevelopmentResource { + constructor(compilation) { + this.compilation = compilation; + } + + async shouldResolve(url) { + return url.pathname.indexOf(`node_modules/${packageName}`) >= 0; + } + + async resolve(url) { + const themePackPathname = url.pathname.replace( + `/node_modules/${packageName}/dist`, + "/fixtures", + ); + const themePackUrl = new URL(`.${themePackPathname}`, import.meta.url); + + return new Request(themePackUrl); + } +} + +export default { + plugins: [ + greenwoodPluginMarkdown(), + myThemePackPlugin({ + __isDevelopment: true, + }), + { + type: "resource", + name: "my-theme-pack:resource", + provider: (compilation) => new MyThemePackDevelopmentResource(compilation), + }, + ], +}; diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/package.json b/packages/plugin-markdown/test/cases/develop.plugins.context/package.json new file mode 100644 index 000000000..2f68d1f7f --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/package.json @@ -0,0 +1,4 @@ +{ + "name": "my-theme-pack", + "type": "module" +} diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/src/pages/index.md b/packages/plugin-markdown/test/cases/develop.plugins.context/src/pages/index.md new file mode 100644 index 000000000..d50ffc804 --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/src/pages/index.md @@ -0,0 +1,3 @@ +### Context Plugin Theme Pack Test + +#### From user workspace pages/index.md diff --git a/packages/plugin-markdown/test/cases/develop.plugins.context/src/pages/slides/index.md b/packages/plugin-markdown/test/cases/develop.plugins.context/src/pages/slides/index.md new file mode 100644 index 000000000..9a31cf00e --- /dev/null +++ b/packages/plugin-markdown/test/cases/develop.plugins.context/src/pages/slides/index.md @@ -0,0 +1,7 @@ +--- +layout: "title" +--- + +### Title Page + +#### Some content from slides/index.html. diff --git a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/build.prerender.getting-started.spec.js b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/build.prerender.getting-started.spec.js index 40d9bf7dd..ee8261b77 100644 --- a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/build.prerender.getting-started.spec.js +++ b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/build.prerender.getting-started.spec.js @@ -29,9 +29,9 @@ * header.js * pages/ * blog/ - * first-post.md - * second-post.md - * index.md + * first-post.html + * second-post.html + * index.html * styles/ * theme.css * layouts/ diff --git a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/first-post.html b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/first-post.html new file mode 100644 index 000000000..ec90fab99 --- /dev/null +++ b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/first-post.html @@ -0,0 +1,12 @@ +--- +layout: "blog" +--- + + + +

My First Blog Post

+

Lorem Ipsum

+ + back + + diff --git a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/first-post.md b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/first-post.md deleted file mode 100644 index 6b222d070..000000000 --- a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/first-post.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: 'blog' ---- - -## My First Blog Post -Lorem Ipsum - -[back](/) \ No newline at end of file diff --git a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/second-post.html b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/second-post.html new file mode 100644 index 000000000..bd47739de --- /dev/null +++ b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/second-post.html @@ -0,0 +1,12 @@ +--- +layout: "blog" +--- + + + +

My Second Blog Post

+

Lorem Ipsum

+ + back + + diff --git a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/second-post.md b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/second-post.md deleted file mode 100644 index 313dc1f59..000000000 --- a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/blog/second-post.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: 'blog' ---- - -## My Second Blog Post -Lorem Ipsum - -[back](/) \ No newline at end of file diff --git a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/index.html b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/index.html new file mode 100644 index 000000000..9f2e58a72 --- /dev/null +++ b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/index.html @@ -0,0 +1,16 @@ + + +

Home Page

+

This is the Getting Started home page!

+ +

### My Posts

+ + + diff --git a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/index.md b/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/index.md deleted file mode 100644 index b38fc3cfd..000000000 --- a/packages/plugin-renderer-lit/test/cases/build.prerender.getting-started/src/pages/index.md +++ /dev/null @@ -1,7 +0,0 @@ -## Home Page - -This is the Getting Started home page! - -### My Posts -- [my-second-post](/blog/second-post/) -- [my-first-post](/blog/first-post/) diff --git a/test/smoke-test.js b/test/smoke-test.js index 5494e2475..c5049f9d9 100644 --- a/test/smoke-test.js +++ b/test/smoke-test.js @@ -131,6 +131,15 @@ function commonIndexSpecs(dom, html, label) { it("should not have any sourcemap inlining for Rollup HTML entry points", function () { expect(html).not.to.contain(/\/\/# sourceMappingURL=(.*)\.html\.map/); }); + + it("should not have any frontmatter fence blocks", function () { + const body = dom.window.document.querySelectorAll("body"); + // make sure we also ignore SSR comment markers, e.g. + const frontmatterFenceBlockRegex = /---/g; + const matches = body[0].innerHTML.match(frontmatterFenceBlockRegex); + + expect(matches).to.be.equal(null); + }); }); }); } diff --git a/yarn.lock b/yarn.lock index 79b5e1338..1f0a0593c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2039,6 +2039,35 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@greenwood/cli@^0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@greenwood/cli/-/cli-0.32.0.tgz#7011a65553bf43dee28d364fa9a79f686cbb1ecb" + integrity sha512-8n4ja1ZTDho29JTv+ZjCTOVlB36YT0Uo4XmN/zp/tleprE5/Y1olwWD2gi9zLMyPRIzez6X7wyNwPEj8Eu+rQA== + dependencies: + "@rollup/plugin-commonjs" "^28.0.0" + "@rollup/plugin-node-resolve" "^15.0.0" + "@rollup/plugin-terser" "^0.4.4" + acorn "^8.14.0" + acorn-walk "^8.3.4" + commander "^2.20.0" + css-tree "^3.0.0" + es-module-shims "^1.8.3" + front-matter "^4.0.2" + koa "^2.13.0" + koa-body "^6.0.1" + livereload "^0.9.1" + markdown-toc "^1.2.0" + node-html-parser "^1.2.21" + rehype-raw "^7.0.0" + rehype-stringify "^10.0.1" + remark-frontmatter "^5.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.1.1" + rollup "^4.26.0" + sucrase "^3.35.0" + unified "^11.0.5" + wc-compiler "~0.17.0" + "@grpc/grpc-js@^1.7.1", "@grpc/grpc-js@^1.7.3": version "1.9.0" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.0.tgz#bdb599e339adabb16aa7243e70c311f75a572867" @@ -7193,6 +7222,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + cacheable-lookup@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" @@ -7711,6 +7748,11 @@ co-body@^6.1.0: raw-body "^2.3.3" type-is "^1.6.16" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -7989,14 +8031,14 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -content-disposition@0.5.4, content-disposition@^0.5.3, content-disposition@^0.5.4, content-disposition@~0.5.4: +content-disposition@0.5.4, content-disposition@^0.5.3, content-disposition@^0.5.4, content-disposition@~0.5.2, content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" -content-type@1.0.5, content-type@^1.0.5, content-type@~1.0.4: +content-type@1.0.5, content-type@^1.0.4, content-type@^1.0.5, content-type@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -8106,7 +8148,7 @@ cookie@0.5.0, cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookies@~0.9.1: +cookies@~0.9.0, cookies@~0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== @@ -8939,7 +8981,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@2.0.0, depd@~2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -8964,7 +9006,7 @@ dequal@^2.0.0: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@1.2.0, destroy@^1.2.0: +destroy@1.2.0, destroy@^1.0.4, destroy@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -9299,16 +9341,16 @@ enabled@2.0.x: resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== +encodeurl@^1.0.2, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + encodeurl@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -11692,7 +11734,7 @@ html-void-elements@^3.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== -http-assert@^1.5.0: +http-assert@^1.3.0, http-assert@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== @@ -11721,7 +11763,7 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@^1.7.3, http-errors@~1.8.0, http-errors@~1.8.1: +http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0, http-errors@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== @@ -12376,7 +12418,7 @@ is-fullwidth-code-point@^5.0.0: dependencies: get-east-asian-width "^1.0.0" -is-generator-function@^1.0.10: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.1.0" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== @@ -13118,6 +13160,43 @@ koa-compose@^4.1.0: resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== +koa-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" + integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== + dependencies: + co "^4.6.0" + koa-compose "^4.1.0" + +koa@^2.13.0: + version "2.16.2" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.16.2.tgz#1292a3b415a9b9f3dd6872c1835229630a4ecae3" + integrity sha512-+CCssgnrWKx9aI3OeZwroa/ckG4JICxvIFnSiOUyl2Uv+UTI+xIw0FfFrWS7cQFpoePpr9o8csss7KzsTzNL8Q== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.9.0" + debug "^4.3.2" + delegates "^1.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^2.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + koa@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/koa/-/koa-3.0.1.tgz#b211a0f350d1cc6185047671f8ef7e019c16351d" @@ -14527,7 +14606,7 @@ mime-db@^1.54.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -15162,6 +15241,13 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" +node-html-parser@^1.2.21: + version "1.4.9" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" + integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== + dependencies: + he "1.2.0" + node-html-parser@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-7.0.1.tgz#e3056550bae48517ebf161a0b0638f4b0123dfe3" @@ -15553,7 +15639,7 @@ on-exit-leak-free@^2.1.0: resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" integrity sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w== -on-finished@2.4.1, on-finished@^2.4.1: +on-finished@2.4.1, on-finished@^2.3.0, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -15607,6 +15693,11 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" +only@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ== + open-props@^1.7.4: version "1.7.15" resolved "https://registry.yarnpkg.com/open-props/-/open-props-1.7.15.tgz#d5b870507869124d3591a9e82ad2c505b4cd2a6c" @@ -18581,7 +18672,7 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.5.0 < 2": +"statuses@>= 1.5.0 < 2", statuses@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -20727,6 +20818,11 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +ylru@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.4.0.tgz#0cf0aa57e9c24f8a2cbde0cc1ca2c9592ac4e0f6" + integrity sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA== + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"