Skip to content

Releases: ProjectEvergreen/greenwood

v0.28.0-alpha.2

20 Feb 15:11
Compare
Choose a tag to compare
v0.28.0-alpha.2 Pre-release
Pre-release

Overview

This alpha release for the v0.28.0 line aims to fix some bugs identified with the previous release as well as including some refactoring and enhancements.

In development docs here, full release blog will come out with the final release.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.28.0+label%3Aalpha.2

  1. API calls are getting treated as API routes with the serve command
  2. SPA fallback handling not working
  3. correctly name standard resource plugins
  4. remove setMaxListeners suppression call

Breaking Changes

N / A

Known Issues

  1. serve command not serving prerendered SSR content

Diff

git diff v0.28.0-alpha.1 v0.28.0-alpha.2 --stat | grep -v "www"
 lerna.json                                         |   2 +-
 packages/cli/package.json                          |   2 +-
 packages/cli/src/commands/serve.js                 |   3 +-
 packages/cli/src/index.js                          |   4 -
 packages/cli/src/lib/resource-utils.js             |   2 +-
 packages/cli/src/lifecycles/serve.js               |  21 ++-
 .../src/plugins/resource/plugin-standard-font.js   |   2 +-
 .../src/plugins/resource/plugin-standard-html.js   |   3 +-
 .../src/plugins/resource/plugin-standard-image.js  |   8 +-
 .../src/plugins/resource/plugin-standard-json.js   |   2 +-
 .../cli/test/cases/develop.spa/develop.spa.spec.js |  40 ++++-
 packages/cli/test/cases/develop.spa/src/main.css   |   3 +
 .../test/cases/serve.default/serve.default.spec.js |  35 ++++
 .../cli/test/cases/serve.spa/serve.spa.spec.js     | 192 +++++++++++++++++++++
 packages/cli/test/cases/serve.spa/src/index.html   |  12 ++
 packages/init/package.json                         |   2 +-
 packages/plugin-babel/package.json                 |   4 +-
 packages/plugin-google-analytics/package.json      |   4 +-
 packages/plugin-graphql/package.json               |   4 +-
 packages/plugin-import-commonjs/package.json       |   4 +-
 packages/plugin-import-css/package.json            |   4 +-
 packages/plugin-import-json/package.json           |   4 +-
 packages/plugin-include-html/package.json          |   4 +-
 packages/plugin-polyfills/package.json             |   4 +-
 packages/plugin-postcss/package.json               |   4 +-
 packages/plugin-renderer-lit/package.json          |   4 +-
 packages/plugin-renderer-puppeteer/package.json    |   4 +-
 packages/plugin-typescript/package.json            |   4 +-
 29 files changed, 333 insertions(+), 50 deletions(-)

v0.28.0-alpha.1

08 Feb 02:40
Compare
Choose a tag to compare
v0.28.0-alpha.1 Pre-release
Pre-release

Overview

This alpha release for the v0.28.0 line introduces a big refactor throughout Greenwood to adopt more Web APIs where possible, like URL / Request / Response.

In development docs here, full release blog will come out with the final release.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.28.0+label%3Aalpha.1

  1. Standardize on Web APIs (Request / Response / URL / etc)
  2. Standardize mapping of browser URLs to file paths (for Resource plugins)

Breaking Changes

There are a few breaking changes in this release due to the adoption of more web standard APIs.

greenwood.config.js

Workspace

You can now pass in a URL object directly instead of having to convert it to a path

import { fileURLToPath } from 'url';

// before
export default {
  workspace: fileURLToPath(new URL('./www', import.meta.url))
};
// after
export default {
  workspace: new URL('./www', import.meta.url)
};

devServer.extensions

No period (.) is needed when passing in custom extensions.

// before
extensions: ['.txt', '.rtf']
// after
extensions: ['txt', 'rtf']

Plugins

Resource

Resource plugins have had their lifecycle signatures and return types refactored to align exclusively with Web APIs. The docs have been updated with more in depth examples so it is recommended to review those, but otherwise the business logic of those lifecycles should still apply. Below is a high level breakdown of the changes and an example.

shouldResolve / resolve

  • Function signature now provides an instance of URL instead of just a string path
  • Expects a Request to be returned
// before
async shouldResolve(url = '/') {
  const { userWorkspace } = this.compilation.context;

  return fs.existsSync(path.join(userWorkspace, url));
}

async resolve(url = '/') {
  const { userWorkspace } = this.compilation.context;

  return path.join(userWorkspace, bareUrl));
}
// after
async shouldResolve(url) {
  const { userWorkspace } = this.compilation.context;
  const { pathname } = url;
 
  try {
    await fs.access(new URL(`.${pathname}`, userWorkspace);
    return true;
  } catch(}{
    return false;
  }
}

async resolve(url) {
  const { pathname } = url;
  const { userWorkspace } = this.compilation.context;

  return new Request(new URL(`.${pathname}`, userWorkspace));
}

shouldServe / serve

  • Function signature now provides an instance of URL and Request
  • Expects a Response to be returned
// before
async shouldServe(url) {
   return path.extname(url) === '.css' && fs.existsSync(url);
}

async serve(url) {
  const css = await fs.promises.readFile(url, 'utf-8');

  resolve({
    body: css,
    contentType: this.contentType
  });
}
// after
async shouldServe(url) {
  return url.protocol === 'file:' && this.extensions.indexOf(url.pathname.split('.').pop()) >= 0;
}

async serve(url) {
  const body = await fs.readFile(url, 'utf-8');

  return new Response(body, {
    headers: {
      'Content-Type': 'text/css'
    }
  });
}

shouldIntercept / intercept

  • Function signature now provides an instance of URL, Request, and Response
  • Expects a Response to be returned
// before
async shouldIntercept(url, body, headers = { request: {} }) {
  const { originalUrl = '' } = headers.request;
  const accept = headers.request.accept || '';
  const isCssFile = path.extname(url) === '.css';
  const notFromBrowser = accept.indexOf('text/css') < 0 && accept.indexOf('application/signed-exchange') < 0;

  // https://github.com/ProjectEvergreen/greenwood/issues/492
  const isCssInJs = originalUrl.indexOf('?type=css') >= 0
    || isCssFile && notFromBrowser
    || isCssFile && notFromBrowser && url.indexOf('/node_modules/') >= 0;

  return isCssInJs
}

async intercept(url, body) {
  const finalBody = body || await fs.promises.readFile(pathToFileURL(url), 'utf-8');
  const cssInJsBody = `const css = \`${finalBody.replace(/\r?\n|\r/g, ' ').replace(/\\/g, '\\\\')}\`;\nexport default css;`;
  
  return {
    body: cssInJsBody,
    contentType: this.contentType
  };
}
// after
async shouldIntercept(url, request) {
  const { pathname } = url;
  const accepts = request.headers.get('accept') || '';
  const isCssFile = pathname.split('.').pop() === 'css';
  const notFromBrowser = accepts.indexOf('text/css') < 0 && accepts.indexOf('application/signed-exchange') < 0;

  // https://github.com/ProjectEvergreen/greenwood/issues/492
  const isCssInJs = url.searchParams.has('type') && url.searchParams.get('type') === this.extensions[0]
    || isCssFile && notFromBrowser
    || isCssFile && notFromBrowser && pathname.startsWith('/node_modules/');

  return isCssInJs;
}

async intercept(url, request, response) {
  const body = await response.text();
  const cssInJsBody = `const css = \`${body.replace(/\r?\n|\r/g, ' ').replace(/\\/g, '\\\\')}\`;\nexport default css;`;
  
  return new Response(cssInJsBody, {
    headers: new Headers({
      'Content-Type': this.contentType
    })
  });
}

shouldOptimize / optimize

  • Function signature now provides an instance of URL and Response
  • Expects a Response to be returned
// before
async shouldOptimize(url) {
  return path.extname(url) === '.css' && this.compilation.config.optimization !== 'none'
}

async optimize(url, body) {
  return bundleCss(body);
}
// after
async shouldOptimize(url, response) {
  const { protocol, pathname } = url;
  const isValidCss = pathname.split('.').pop() === 'css'
    && protocol === 'file:'
    && response.headers.get('Content-Type').indexOf('text/css') >= 0;

  return this.compilation.config.optimization !== 'none' && isValidCss;
}

async optimize(url, response) {
  const body = await response.text();
  const optimizedBody = bundleCss(body);

  return new Response(optimizedBody);
}

Copy

Now the Copy plugin expects to the to and from properties to be URLs.

For directories, make sure to add a trailing /!

// before
[{
  // copy a file
  from: path.join(context.userWorkspace, 'robots.txt'),
  to: path.join(context.outputDir, 'robots.txt')
}, {
  // copy a directory
  from: path.join(context.userWorkspace, 'pdfs'),
  to: path.join(context.outputDir, 'pdfs')
}];
// after
[{
  // copy a file
  from: new URL('./robots.txt', context.userWorkspace),
  to: new URL('./robots.txt', context.outputDir)
}, {
  // copy a directory
  from: new URL('./pdfs/', context.userWorkspace),
  to: new URL('./pdfs/', context.outputDir)
}];

Context (Theme Packs)

For Context plugins, a URL is now expected for template locations.

// before
import { fileURLToPath } from 'urt';

return {
  templates: [
    fileURLToPath(new URL('./dist/layouts', import.meta.url))
  ]
};
// after
return {
  templates: [
    new URL('./dist/layouts/', import.meta.url)
  ]
};

Integrations (e.g. WTR)

For custom 3rd party tools like WTR (Web Test Runner), you can still use your resource plugins, updated for the new API. Below are a couple examples for supporting TypeScript and importing CSS-in-JS.

import fs from 'fs/promises';
import { greenwoodPluginImportCss } from '@greenwood/plugin-import-css/src/index.js';
import { greenwoodPluginTypeScript } from '@greenwood/plugin-typescript/src/index.js';

// create a direct instance of ImportCssResource
const importCssResource = greenwoodPluginImportCss()[0].provider({});

// create a direct instance of TypeScriptResource
const typeScriptResource = greenwoodPluginTypeScript()[0].provider({
  context: {
    projectDirectory: new URL(import.meta.url)
  }
});

export default {
  plugins: [{
    name: 'transpile-typescript',
    async transform(context) {
      const { url } = context.request;

      if (url.endsWith('.ts')) {
        const response = await typeScriptResource.serve(new URL(`.${url}`, import.meta.url));
        // https://github.com/ProjectEvergreen/greenwood/issues/661
        const body = (await response.text()).replace(/\/\/# sourceMappingURL=module.js.map/, '');

        return {
          body,
          type: 'js'
        };
      }
    }
  }, {
    name: 'import-css',
    async transform(context) {
      const url = new URL(`.${context.request.url}`, import.meta.url);
      const request = new Request(url, { headers: new Headers(context.headers) });
      const shouldIntercept = await importCssResource.shouldIntercept(url, request);

      if (shouldIntercept) {
        const contents = await fs.readFile(url);
        const initResponse = new Response(contents, { headers: new Headers(context.headers) });
        const response = await importCssResource.intercept(url, request, initResponse.clone());

        return {
          body: await response.text(),
          headers: {
            'Content-Type': response.headers.get...
Read more

v0.27.3

19 Jan 02:38
Compare
Choose a tag to compare

Overview

This patch release fixes an implementation error with Greenwood's experimental loader for supporting custom imports.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.27.3

  1. invalid URL when using SSR custom imports

Breaking Changes

N / A

Known Issues

N / A

Diff

$ git diff v0.27.2 v0.27.3 --stat | grep -v "www"
 .github/ISSUE_TEMPLATE.md                       |   6 +-
 lerna.json                                      |   2 +-
 packages/cli/package.json                       |   2 +-
 packages/cli/src/loader.js                      |   4 +-
 packages/init/package.json                      |   2 +-
 packages/plugin-babel/package.json              |   4 +-
 packages/plugin-google-analytics/package.json   |   4 +-
 packages/plugin-graphql/package.json            |   4 +-
 packages/plugin-import-commonjs/package.json    |   4 +-
 packages/plugin-import-css/package.json         |   4 +-
 packages/plugin-import-json/package.json        |   4 +-
 packages/plugin-include-html/package.json       |   4 +-
 packages/plugin-polyfills/package.json          |   4 +-
 packages/plugin-postcss/package.json            |   4 +-
 packages/plugin-renderer-lit/package.json       |   4 +-
 packages/plugin-renderer-puppeteer/package.json |   4 +-
 packages/plugin-typescript/package.json         |   4 +-
 test/test-loader.js                             |  12 +-
 yarn.lock                                       | 509 ++++++++++++------------
 21 files changed, 313 insertions(+), 283 deletions(-)

v0.28.0-alpha.0

17 Dec 20:01
Compare
Choose a tag to compare
v0.28.0-alpha.0 Pre-release
Pre-release

Overview

This initial release for v0.28.0 sets Node v18 as the new minimum version and also introduces API routes.

In development docs here, full release blog will come out with the final release.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.28.0+label%3Aalpha.0

  1. upgrade to Node v18 as minimum supported version
  2. API Routes

Breaking Changes

Node 18

The new minimum supported Node version with Greenwood is now v18. So make sure you update your GitHub Actions, hosting configuration; e.g. _netlify.toml, .nvmrc, etc.

Additionally, Greenwood now longer depends on node-fetch however native fetch in Node 18 can / should be a drop in replacement for most cases. Just remove your import line for node-fetch and test, and if so, you should be good to go! (You can always self install node-fetch if you want it back though).

Known Issues

N / A

Diff

$ git diff v0.27.2 v0.28.0-alpha.0 --stat | grep -v "www"
 .github/ISSUE_TEMPLATE.md                          |   6 +-
 .github/workflows/ci-exp.yml                       |   4 +-
 .github/workflows/ci-win-exp.yml                   |   2 +-
 .github/workflows/ci-win.yml                       |   2 +-
 .github/workflows/ci.yml                           |   4 +-
 .github/workflows/master.yml                       |   4 +-
 .github/workflows/release.yml                      |   4 +-
 .nvmrc                                             |   2 +-
 lerna.json                                         |   2 +-
 netlify.toml                                       |   2 +-
 package.json                                       |   2 +-
 packages/cli/package.json                          |   5 +-
 packages/cli/src/commands/serve.js                 |   3 +-
 packages/cli/src/lifecycles/context.js             |   2 +
 packages/cli/src/lifecycles/serve.js               |  16 +
 packages/cli/src/loader.js                         |   6 +-
 .../cli/src/plugins/resource/plugin-api-routes.js  |  53 +++
 .../cli/src/plugins/resource/plugin-dev-proxy.js   |   1 -
 .../src/pages/artists.js                           |   2 -
 .../cases/build.default.ssr/src/pages/artists.js   |   2 -
 .../cases/build.default.ssr/src/pages/users.js     |   1 -
 .../cases/develop.default/develop.default.spec.js  |  29 ++
 .../test/cases/develop.default/src/api/greeting.js |  11 +
 .../test/cases/develop.ssr/src/pages/artists.js    |   2 -
 .../serve.default.api/serve.default.api.spec.js    | 137 ++++++
 .../cases/serve.default.api/src/api/fragment.js    |  18 +
 .../cases/serve.default.api/src/api/greeting.js    |  11 +
 .../cases/serve.default.api/src/components/card.js |  11 +
 packages/init/package.json                         |   3 +-
 packages/init/src/index.js                         |   1 -
 packages/plugin-babel/package.json                 |   4 +-
 packages/plugin-google-analytics/package.json      |   4 +-
 packages/plugin-graphql/package.json               |   7 +-
 packages/plugin-graphql/src/core/cache.js          |   1 -
 packages/plugin-import-commonjs/package.json       |   4 +-
 packages/plugin-import-css/package.json            |   4 +-
 packages/plugin-import-json/package.json           |   4 +-
 packages/plugin-include-html/package.json          |   4 +-
 packages/plugin-polyfills/package.json             |   4 +-
 packages/plugin-postcss/package.json               |   4 +-
 packages/plugin-renderer-lit/package.json          |   4 +-
 packages/plugin-renderer-puppeteer/package.json    |   4 +-
 packages/plugin-typescript/package.json            |   4 +-
 yarn.lock                                          | 511 +++++++++++----------
 50 files changed, 684 insertions(+), 318 deletions(-)

v0.27.2

10 Dec 15:04
Compare
Choose a tag to compare

Overview

This patch release addresses critical bugs with CSS minification identified as part of the initial v0.27.0 release and resolving an issue with staticRouter (now marked as experimental in the docs) not deep linking to hash routes correctly. There was also a a technical enhancement upgrading a Rollup plugin dependency.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.27.2

  1. CSS functions in declarations not getting padded with a space
  2. deeply nested direct hash link breaks the router if pathname not already present
  3. upgrade to official Rollup terser plugin

Breaking Changes

N / A

Known Issues

N / A

Diff

$ git diff v0.27.1 v0.27.2 --stat | grep -v "www"
.eslintrc.cjs                                      |   1 +
 lerna.json                                         |   2 +-
 package.json                                       |   3 +-
 packages/cli/package.json                          |   4 +-
 packages/cli/src/config/rollup.config.js           |   4 +-
 packages/cli/src/lib/router.js                     |  30 +++--
 .../src/plugins/resource/plugin-standard-css.js    |  12 +-
 .../plugins/resource/plugin-standard-javascript.js |   2 +-
 .../fixtures/expected.css                          |   2 +-
 .../src/styles/main.css                            |   2 +
 .../build.config-optimization-inline.spec.js       |   4 +-
 packages/init/package.json                         |   2 +-
 packages/plugin-babel/README.md                    |   4 +-
 packages/plugin-babel/package.json                 |   4 +-
 packages/plugin-google-analytics/README.md         |   1 +
 packages/plugin-google-analytics/package.json      |   4 +-
 packages/plugin-graphql/README.md                  |   8 +-
 packages/plugin-graphql/package.json               |   4 +-
 packages/plugin-import-commonjs/package.json       |   4 +-
 .../test/cases/default/default.spec.js             |   2 +-
 packages/plugin-import-css/README.md               |  17 +--
 packages/plugin-import-css/package.json            |   4 +-
 packages/plugin-import-json/README.md              |  11 +-
 packages/plugin-import-json/package.json           |   4 +-
 .../test/cases/default/default.spec.js             |   2 +-
 packages/plugin-include-html/package.json          |   4 +-
 packages/plugin-polyfills/package.json             |   4 +-
 packages/plugin-postcss/README.md                  |   4 +-
 packages/plugin-postcss/package.json               |   4 +-
 packages/plugin-renderer-lit/package.json          |   4 +-
 packages/plugin-renderer-puppeteer/package.json    |   4 +-
 packages/plugin-typescript/README.md               |   8 +-
 packages/plugin-typescript/package.json            |   4 +-
 .../test/cases/default/default.spec.js             |   2 +-
 yarn.lock                                          | 132 ++++++++++++++-------
 54 files changed, 310 insertions(+), 226 deletions(-)

v0.27.1

09 Dec 03:22
Compare
Choose a tag to compare

Overview

This patch release addresses some bugs identified as part of the last release.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.27.1

  1. CSS minification not handling / relative paths to node_modules
  2. <style> tags in the <body> are not getting optimized
  3. nested directories breaking copy plugin

Breaking Changes

N / A

Known Issues

N / A

Diff

$ git diff v0.27.0 v0.27.1 --stat | grep -v "www"
 lerna.json                                         |  2 +-
 packages/cli/package.json                          |  2 +-
 packages/cli/src/lifecycles/copy.js                | 10 ++--
 packages/cli/src/lifecycles/prerender.js           |  2 +-
 .../src/plugins/resource/plugin-standard-css.js    | 13 ++--
 .../build.config-optimization-default.spec.js      | 28 ++++++++-
 .../src/pages/index.html                           | 11 +++-
 .../build.default.workspace-javascript-css.spec.js |  6 +-
 .../build.plugins.copy/build.plugins.copy.spec.js  | 70 ++++++++++++++++++++++
 .../cases/build.plugins.copy/greenwood.config.js   | 19 ++++++
 packages/init/package.json                         |  2 +-
 packages/plugin-babel/package.json                 |  4 +-
 packages/plugin-google-analytics/package.json      |  4 +-
 packages/plugin-graphql/package.json               |  4 +-
 packages/plugin-import-commonjs/package.json       |  4 +-
 packages/plugin-import-css/package.json            |  4 +-
 packages/plugin-import-json/package.json           |  4 +-
 packages/plugin-include-html/package.json          |  4 +-
 packages/plugin-polyfills/package.json             |  4 +-
 packages/plugin-postcss/package.json               |  4 +-
 packages/plugin-renderer-lit/package.json          |  4 +-
 packages/plugin-renderer-puppeteer/package.json    |  4 +-
 packages/plugin-typescript/package.json            |  4 +-
 26 files changed, 173 insertions(+), 46 deletions(-)

v0.27.0

23 Nov 21:22
Compare
Choose a tag to compare

Overview

In addition to some general refactoring around bundling, this release introduces some exciting new feature and enhancements for Greenwood!

  • 📚 Full Stack Web Components
  • 📦 CSS Bundling and Minification (custom implementation)
  • ⚙️ Improved Build Capacity

Checkout the accompanying blog post for more information on all these features.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.27.0

  1. CSS Bundling (and dropping PostCSS as core dependency)
  2. refactor bundling lifecycle and resource optimizations
  3. avoid Rollup double bundling for pre-bundled static assets for server routes
  4. ensure inline <script> and <style> tags are getting minified / optimized when running build command
  5. fix incorrect HUD noopener implementation
  6. auto spread arrays of plugins
  7. remove hardcoded directory references in rollup configuration
  8. introduce worker thread pools for SSR page generation
  9. upgrade to WCC 0.6.x
  10. update rollup preserveEntrySignatures to neutral setting to silence warning output
  11. support resource plugin based transformations for standard module formats (ex: import JSON, CSS) for SSR

Breaking Changes

Import CSS Plugin

Not a breaking change per se, but if using the plugin "externally" like with Web Test Runner, you will need to ensure certain headers are polyfilled

// before
const url = importCssResource.getBareUrlPath(context.request.url); // need to remove query strings first
const shouldIntercept = await importCssResource.shouldIntercept(url, context.body, { request: context.headers })

if (shouldIntercept) {
  const cssResource = await importCssResource.intercept(url, context.body);
  
  ...
}      

// after
const url = importCssResource.getBareUrlPath(context.request.url); // need to remove query strings first
const customHeaders = {
  request: {
    originalUrl: url,
    ...context.headers
  }
};
const shouldIntercept = await importCssResource.shouldIntercept(url, context.body, customHeaders);

if (shouldIntercept) {
  const cssResource = await importCssResource.intercept(url, context.body, customHeaders);
  ...
}

Known Issues

  1. CSS functions in declarations not getting padded with a space
  2. CSS minification not handling / relative paths to node_modules
  3. <style> tags in the <body> are not getting optimized

Diff

$ git diff v0.26.0 v0.27.0 --stat | grep -v "www"
 .github/workflows/ci-exp.yml                       |   28 +
 .github/workflows/ci-win-exp.yml                   |   25 +
 .mocharc.cjs                                       |    5 +-
 .nvmrc                                             |    2 +-
 greenwood.config.js                                |   12 +-
 lerna.json                                         |    2 +-
 netlify.toml                                       |    6 +-
 package.json                                       |    8 +-
 packages/cli/package.json                          |    8 +-
 packages/cli/src/commands/build.js                 |   17 +-
 packages/cli/src/commands/serve.js                 |    2 +-
 packages/cli/src/config/rollup.config.js           |  619 ++----------
 packages/cli/src/index.js                          |    2 +-
 packages/cli/src/lib/resource-utils.js             |   50 +
 packages/cli/src/lib/ssr-route-worker.js           |    6 +-
 packages/cli/src/lib/threadpool.js                 |   79 ++
 packages/cli/src/lifecycles/bundle.js              |  156 ++-
 packages/cli/src/lifecycles/compile.js             |    3 +-
 packages/cli/src/lifecycles/config.js              |   25 +-
 packages/cli/src/lifecycles/context.js             |    2 +-
 packages/cli/src/lifecycles/graph.js               |   94 +-
 packages/cli/src/lifecycles/prerender.js           |  207 ++--
 packages/cli/src/lifecycles/serve.js               |   14 -
 packages/cli/src/loader.js                         |   68 ++
 .../src/plugins/resource/plugin-node-modules.js    |    3 +-
 .../src/plugins/resource/plugin-standard-css.js    |  198 +++-
 .../src/plugins/resource/plugin-standard-html.js   |  314 +++---
 .../src/plugins/resource/plugin-standard-json.js   |    8 +
 .../src/plugins/resource/plugin-static-router.js   |   57 +-
 .../build.config.interpolate-frontmatter.spec.js   |    4 +-
 .../build.config-optimization-default.spec.js      |   17 +-
 .../fixtures/expected.css                          |   57 ++
 .../src/pages/index.html                           |    2 +-
 .../src/styles/main.css                            |  122 +++
 .../src/styles/theme.css                           |   11 +-
 .../src/system/variables.css                       |   16 +
 .../build.config-optimization-inline.spec.js       |   10 +-
 .../build.config-optimization-none.spec.js         |   12 +-
 .../build.config-optimization-overrides.spec.js    |    2 +-
 .../build.config.static-router.spec.js             |    5 +-
 .../build.default.import-node-modules.spec.js      |    7 +-
 .../build.default.meta/build.default.meta.spec.js  |    9 +
 .../cases/build.default.meta/src/pages/index.md    |    4 +
 .../build.default.spa/build.default.spa.spec.js    |    3 +-
 .../build.default.ssr-prerender.spec.js            |   88 ++
 .../greenwood.config.js                            |    3 +
 .../src/components/footer.js                       |   16 +
 .../build.default.ssr-prerender/src/pages/index.js |    7 +
 .../src/templates/app.html                         |   13 +
 .../build.default.ssr-static-export.spec.js        |   18 +-
 .../build.default.ssr/build.default.ssr.spec.js    |   42 +-
 .../cases/build.default.ssr/src/pages/about.md     |    3 +
 .../cases/build.default.ssr/src/pages/index.js     |    9 +
 .../cases/build.default.ssr/src/pages/index.md     |    3 -
 .../build.default.workspace-javascript-css.spec.js |   66 +-
 .../src/pages/index.html                           |   11 +-
 .../src/scripts/popup.js                           |    1 +
 ...default.workspace-template-page-and-app.spec.js |   15 +-
 .../build.default.workspace-template-page.spec.js  |    2 +-
 .../cases/develop.default/develop.default.spec.js  |    7 +-
 .../test/cases/develop.default/greenwood.config.js |    2 +-
 .../cli/test/cases/develop.ssr/develop.ssr.spec.js |    2 +-
 .../test/cases/serve.default/greenwood.config.js   |    2 +-
 .../test/cases/serve.default/serve.default.spec.js |    7 +-
 .../test/cases/theme-pack/theme-pack.build.spec.js |    2 +-
 packages/init/package.json                         |    2 +-
 packages/plugin-babel/README.md                    |    5 +-
 packages/plugin-babel/package.json                 |    4 +-
 packages/plugin-google-analytics/package.json      |    4 +-
 packages/plugin-google-analytics/src/index.js      |    2 +-
 .../test/cases/default/default.spec.js             |    2 +-
 .../option-anonymous/option-anonymous.spec.js      |    2 +-
 packages/plugin-graphql/README.md                  |    4 +-
 packages/plugin-graphql/package.json               |    4 +-
 packages/plugin-graphql/src/index.js               |   10 +-
 .../cases/query-children/query-children.spec.js    |    4 +-
 .../query-custom-schema.spec.js                    |    4 +-
 .../test/cases/query-graph/query-graph.spec.js     |    8 +-
 .../plugin-graphql/test/unit/schema/graph.spec.js  |    2 +-
 packages/plugin-import-commonjs/README.md          |    2 +-
 packages/plugin-import-commonjs/package.json       |    4 +-
 packages/plugin-import-css/README.md               |   53 +-
 packages/plugin-import-css/package.json            |   10 +-
 packages/plugin-import-css/src/index.js            |   35 +-
 .../test/cases/default/default.spec.js             |    3 +-
 .../exp-build.prerender.spec.js                    |   89 ++
 .../cases/exp-build.prerender/greenwood.config.js  |    8 +
 .../test/cases/exp-build.prerender/package.json    |    4 +
 .../exp-build.prerender/src/components/footer.css  |    1 +
 .../exp-build.prerender/src/components/footer.js   |   25 +
 .../cases/exp-build.prerender/src/pages/index.md   |    3 +
 .../exp-build.prerender/src/templates/app.html     |   12 +
 packages/plugin-import-json/README.md              |   25 +-
 packages/plugin-import-json/package.json           |    7 +-
 packages/plugin-import-json/src/index.js           |   29 +-
 .../test/cases/default/default.spec.js             |    2 +-
 .../cases/develop.default/develop.default.spec.js  |    4 +-
 .../exp-build.prerender.spec.js                    |   89 ++
 .../cases/exp-build.prerender/greenwood.config.js  |    8 +
 .../test/cases/exp-build.prerender/package.json ...
Read more

v0.27.0-alpha.7

21 Nov 19:29
Compare
Choose a tag to compare
v0.27.0-alpha.7 Pre-release
Pre-release

Overview

This version introduces the ability to leverage Greenwood's import plugins for CSS and JSON on the server side so that they can be used with ESM / import. Assuming all goes well, this will be the last alpha release prior to making v0.27.0 generally available. See the last release notes for prior breaking changes.

In development docs here, full release blog will come out with the final release.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.27.0+label%3Aalpha.7

  1. support resource plugin based transformations for standard module formats (ex: import JSON, CSS) for SSR

Breaking Changes

None

Known Issues

N / A

Diff

$ git diff v0.27.0-alpha.6 v0.27.0-alpha.7 --stat | grep -v "www"
 .github/workflows/ci-exp.yml                       | 28 +++++++
 .github/workflows/ci-win-exp.yml                   | 25 ++++++
 .mocharc.cjs                                       |  5 +-
 .nvmrc                                             |  2 +-
 lerna.json                                         |  2 +-
 package.json                                       |  6 +-
 packages/cli/package.json                          |  2 +-
 packages/cli/src/config/rollup.config.js           |  3 +-
 packages/cli/src/lifecycles/graph.js               |  2 +-
 packages/cli/src/loader.js                         | 68 +++++++++++++++++
 packages/init/package.json                         |  2 +-
 packages/plugin-babel/package.json                 |  4 +-
 packages/plugin-google-analytics/package.json      |  4 +-
 packages/plugin-graphql/package.json               |  4 +-
 packages/plugin-import-commonjs/package.json       |  4 +-
 packages/plugin-import-css/README.md               | 51 ++++++-------
 packages/plugin-import-css/package.json            |  4 +-
 packages/plugin-import-css/src/index.js            |  5 +-
 .../exp-build.prerender.spec.js                    | 89 ++++++++++++++++++++++
 .../cases/exp-build.prerender/greenwood.config.js  |  8 ++
 .../test/cases/exp-build.prerender/package.json    |  4 +
 .../exp-build.prerender/src/components/footer.css  |  1 +
 .../exp-build.prerender/src/components/footer.js   | 25 ++++++
 .../cases/exp-build.prerender/src/pages/index.md   |  3 +
 .../exp-build.prerender/src/templates/app.html     | 12 +++
 packages/plugin-import-json/README.md              | 23 +++---
 packages/plugin-import-json/package.json           |  4 +-
 packages/plugin-import-json/src/index.js           | 10 ++-
 .../exp-build.prerender.spec.js                    | 89 ++++++++++++++++++++++
 .../cases/exp-build.prerender/greenwood.config.js  |  8 ++
 .../test/cases/exp-build.prerender/package.json    |  5 ++
 .../exp-build.prerender/src/components/footer.js   | 22 ++++++
 .../cases/exp-build.prerender/src/pages/index.md   |  3 +
 .../exp-build.prerender/src/templates/app.html     | 12 +++
 packages/plugin-include-html/package.json          |  4 +-
 packages/plugin-polyfills/package.json             |  4 +-
 packages/plugin-postcss/package.json               |  4 +-
 packages/plugin-renderer-lit/package.json          |  4 +-
 packages/plugin-renderer-puppeteer/package.json    |  4 +-
 packages/plugin-typescript/package.json            |  4 +-
 test/test-loader.js                                | 35 +++++++++
 yarn.lock                                          |  8 +-
 44 files changed, 547 insertions(+), 81 deletions(-)

v0.27.0-alpha.6

19 Nov 02:23
Compare
Choose a tag to compare
v0.27.0-alpha.6 Pre-release
Pre-release

Overview

Restored a reverted a commit around preserving expectations around default configuration for the PostCSS plugin. See the last release notes for prior breaking changes.

In development docs here, full release blog will come out with the final release.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.27.0+label%3Aalpha.6

  1. Revert "Revert "Enhancement/issue 763 restore postcss import""

Breaking Changes

None

Known Issues

N / A

Diff

$ git diff v0.27.0-alpha.5 v0.27.0-alpha.6 --stat | grep -v "www"
 lerna.json                                         |  2 +-
 packages/cli/package.json                          |  2 +-
 packages/init/package.json                         |  2 +-
 packages/plugin-babel/package.json                 |  4 +--
 packages/plugin-google-analytics/package.json      |  4 +--
 packages/plugin-graphql/package.json               |  4 +--
 packages/plugin-import-commonjs/package.json       |  4 +--
 packages/plugin-import-css/package.json            |  4 +--
 packages/plugin-import-json/package.json           |  4 +--
 packages/plugin-include-html/package.json          |  4 +--
 packages/plugin-polyfills/package.json             |  4 +--
 packages/plugin-postcss/README.md                  |  1 +
 packages/plugin-postcss/package.json               |  5 +--
 packages/plugin-postcss/src/postcss.config.js      |  1 +
 .../options.extend-config.spec.js                  |  2 +-
 .../options.extend-config/src/styles/main.css      |  2 ++
 .../options.extend-config/src/styles/theme.css     |  3 ++
 packages/plugin-renderer-lit/package.json          |  4 +--
 packages/plugin-renderer-puppeteer/package.json    |  4 +--
 packages/plugin-typescript/package.json            |  4 +--
 yarn.lock                                          | 37 ++++++++++++++++++++++
 22 files changed, 74 insertions(+), 29 deletions(-)

v0.27.0-alpha.5

19 Nov 01:37
Compare
Choose a tag to compare
v0.27.0-alpha.5 Pre-release
Pre-release

Overview

Inadvertently reverted a commit that removed intended functionality around intended default configuration for the PostCSS plugin. Next release will restore it. See the last release notes for prior breaking changes.

In development docs here, full release blog will come out with the final release.

If using Yarn, you can can upgrade all your @greenwood packages at once

$ yarn upgrade --scope @greenwood --latest

Changelog

https://github.com/ProjectEvergreen/greenwood/issues?q=label%3Av0.27.0+label%3Aalpha.5

  1. Revert "Enhancement/issue 763 restore postcss import"

Breaking Changes

None

Known Issues

  1. Need to restore removal of postcss-import to default PostCSS configuration

Diff

$ git diff v0.27.0-alpha.4 v0.27.0-alpha.5 --stat | grep -v "www"
 lerna.json                                         |  2 +-
 packages/cli/package.json                          |  2 +-
 packages/init/package.json                         |  2 +-
 packages/plugin-babel/package.json                 |  4 +--
 packages/plugin-google-analytics/package.json      |  4 +--
 packages/plugin-graphql/package.json               |  4 +--
 packages/plugin-import-commonjs/package.json       |  4 +--
 packages/plugin-import-css/package.json            |  4 +--
 packages/plugin-import-json/package.json           |  4 +--
 packages/plugin-include-html/package.json          |  4 +--
 packages/plugin-polyfills/package.json             |  4 +--
 packages/plugin-postcss/README.md                  |  1 -
 packages/plugin-postcss/package.json               |  5 ++-
 packages/plugin-postcss/src/postcss.config.js      |  1 -
 .../options.extend-config.spec.js                  |  2 +-
 .../options.extend-config/src/styles/main.css      |  2 --
 .../options.extend-config/src/styles/theme.css     |  3 --
 packages/plugin-renderer-lit/package.json          |  4 +--
 packages/plugin-renderer-puppeteer/package.json    |  4 +--
 packages/plugin-typescript/package.json            |  4 +--
 yarn.lock                                          | 37 ----------------------
 22 files changed, 29 insertions(+), 74 deletions(-)