diff --git a/.c8rc.json b/.c8rc.json new file mode 100644 index 000000000..93f8eac6e --- /dev/null +++ b/.c8rc.json @@ -0,0 +1,32 @@ +{ + "all": true, + + "include": [ + "packages/*/src/**/**/*.js" + ], + + "exclude": [ + "packages/cli/src/lib/*-interface.js" + ], + + "reporter": [ + "cobertura", + "html", + "text", + "text-summary" + ], + + "checkCoverage": true, + + "statements": 85, + "branches": 85, + "functions": 90, + "lines": 85, + + "watermarks": { + "statements": [75, 85], + "branches": [75, 85], + "functions": [75, 85], + "lines": [75, 85] + } +} \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index 579a76834..7862cff23 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,6 @@ **/.greenwood/** **/public/** **/node_modules/** -!.eslintrc.js +!.eslintrc.cjs !.mocharc.js packages/plugin-babel/test/cases/**/*main.js \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/.github/workflows/ci-win.yml b/.github/workflows/ci-win.yml index 92f91680e..185a96f13 100644 --- a/.github/workflows/ci-win.yml +++ b/.github/workflows/ci-win.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node: [14] + node: [14, 16] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b4731705..58faed016 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node: [14] + node: [14, 16] steps: - uses: actions/checkout@v1 diff --git a/.mocharc.js b/.mocharc.cjs similarity index 100% rename from .mocharc.js rename to .mocharc.cjs diff --git a/README.md b/README.md index 12abca907..fb9fe5bcf 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,15 @@ npm install @greenwood/cli --save-dev yarn add @greenwood/cli --dev ``` -Then in your _package.json_, you can run the CLI like so: -```javascript -"scripts": { - "build": "greenwood build", - "start": "greenwood develop", - "serve": "greenwood serve" +Then in your _package.json_, add the `type` field and `scripts` for the CLI, like so: +```json +{ + "type": "module", + "scripts": { + "build": "greenwood build", + "start": "greenwood develop", + "serve": "greenwood serve" + } } ``` diff --git a/greenwood.config.js b/greenwood.config.js index deed0dfd9..967e33b6f 100644 --- a/greenwood.config.js +++ b/greenwood.config.js @@ -1,17 +1,17 @@ -const path = require('path'); -const pluginGraphQL = require('@greenwood/plugin-graphql'); -const pluginIncludeHtml = require('@greenwood/plugin-include-html'); -const pluginImportCss = require('@greenwood/plugin-import-css'); -const pluginImportJson = require('@greenwood/plugin-import-json'); -const pluginPolyfills = require('@greenwood/plugin-polyfills'); -const pluginPostCss = require('@greenwood/plugin-postcss'); -const rollupPluginAnalyzer = require('rollup-plugin-analyzer'); +import { greenwoodPluginGraphQL } from '@greenwood/plugin-graphql'; +import { greenwoodPluginIncludeHTML } from '@greenwood/plugin-include-html'; +import { greenwoodPluginImportCss } from '@greenwood/plugin-import-css'; +import { greenwoodPluginImportJson } from '@greenwood/plugin-import-json'; +import { greenwoodPluginPolyfills } from '@greenwood/plugin-polyfills'; +import { greenwoodPluginPostCss } from '@greenwood/plugin-postcss'; +import rollupPluginAnalyzer from 'rollup-plugin-analyzer'; +import { fileURLToPath, URL } from 'url'; const META_DESCRIPTION = 'A modern and performant static site generator supporting Web Component based development'; const FAVICON_HREF = '/assets/favicon.ico'; -module.exports = { - workspace: path.join(__dirname, 'www'), +export default { + workspace: fileURLToPath(new URL('./www', import.meta.url)), mode: 'mpa', optimization: 'inline', title: 'Greenwood', @@ -28,11 +28,11 @@ module.exports = { { name: 'google-site-verification', content: '4rYd8k5aFD0jDnN0CCFgUXNe4eakLP4NnA18mNnK5P0' } ], plugins: [ - ...pluginGraphQL(), - ...pluginPolyfills(), - pluginPostCss(), - ...pluginImportJson(), - ...pluginImportCss(), + ...greenwoodPluginGraphQL(), + ...greenwoodPluginPolyfills(), + greenwoodPluginPostCss(), + ...greenwoodPluginImportJson(), + ...greenwoodPluginImportCss(), { type: 'rollup', name: 'rollup-plugin-analyzer', @@ -47,7 +47,7 @@ module.exports = { ]; } }, - ...pluginIncludeHtml() + ...greenwoodPluginIncludeHTML() ], markdown: { plugins: [ diff --git a/lerna.json b/lerna.json index c0b9154b7..94ac8721a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "0.19.4", + "version": "0.20.0-alpha.1", "packages": [ "packages/*", "www" diff --git a/nyc.config.js b/nyc.config.js deleted file mode 100644 index 9d8dcd622..000000000 --- a/nyc.config.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = { - - all: true, - - include: [ - 'packages/*/src/**/**/*.js' - ], - - exclude: [ - 'packages/cli/src/lib/*-interface.js' - ], - - reporter: [ - 'cobertura', - 'html', - 'text', - 'text-summary' - ], - - checkCoverage: true, - - statements: 85, - branches: 75, - functions: 85, - lines: 85, - - watermarks: { - statements: [75, 85], - branches: [75, 85], - functions: [75, 85], - lines: [75, 85] - } -}; \ No newline at end of file diff --git a/package.json b/package.json index ac9bee644..8c1df9665 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "author": "Owen Buckley ", "license": "MIT", "main": "./packages/cli/src/index.js", + "type": "module", "workspaces": { "packages": [ "packages/*", @@ -19,7 +20,7 @@ "build": "cross-env __GWD_ROLLUP_MODE__=strict node . build", "serve": "node . serve", "develop": "node . develop", - "test": "cross-env BROWSERSLIST_IGNORE_OLD_DATA=true __GWD_ROLLUP_MODE__=strict nyc mocha", + "test": "cross-env BROWSERSLIST_IGNORE_OLD_DATA=true __GWD_ROLLUP_MODE__=strict c8 mocha", "test:tdd": "yarn test --watch", "lint:js": "eslint \"*.js\" \"./packages/**/**/*.js\" \"./test/*.js\" \"./www/**/**/*.js\"", "lint:ts": "eslint \"./packages/**/**/*.ts\"", @@ -34,6 +35,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.2", "@typescript-eslint/parser": "^4.28.2", "babel-eslint": "^10.1.0", + "c8": "^7.10.0", "chai": "^4.2.0", "cross-env": "^7.0.3", "eslint": "^6.8.0", @@ -42,8 +44,7 @@ "glob-promise": "^3.4.0", "jsdom": "^14.0.0", "lerna": "^3.16.4", - "mocha": "^6.1.4", - "nyc": "^14.0.0", + "mocha": "^9.1.3", "rimraf": "^2.6.3", "stylelint": "^13.8.0", "stylelint-a11y": "^1.2.3", diff --git a/packages/cli/README.md b/packages/cli/README.md index db69e398d..150858c6d 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -16,11 +16,14 @@ yarn add @greenwood/cli --dev ``` ## Usage -Then in your _package.json_, you can run the CLI like so: -```javascript -"scripts": { - "build": "greenwood build", - "start": "greenwood develop" +Then in your _package.json_, add the `type` field and `scripts` for the CLI like so: +```json +{ + "type": "module", + "scripts": { + "build": "greenwood build", + "start": "greenwood develop" + } } ``` diff --git a/packages/cli/package.json b/packages/cli/package.json index 6a3044471..e4a8e9296 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,8 @@ { "name": "@greenwood/cli", - "version": "0.19.4", + "version": "0.20.0-alpha.1", "description": "Greenwood CLI.", + "type": "module", "repository": "https://github.com/ProjectEvergreen/greenwood/tree/master/packages/cli", "author": "Owen Buckley ", "license": "MIT", @@ -11,7 +12,7 @@ "Web Components" ], "engines": { - "node": ">=12.x" + "node": ">=14" }, "bin": { "greenwood": "./src/index.js" @@ -29,7 +30,7 @@ "acorn": "^8.0.1", "acorn-walk": "^8.0.0", "commander": "^2.20.0", - "cssnano": "^4.1.10", + "cssnano": "^5.0.11", "es-module-shims": "^0.5.2", "front-matter": "^4.0.2", "koa": "^2.13.0", @@ -37,8 +38,8 @@ "markdown-toc": "^1.2.0", "node-fetch": "^2.6.1", "node-html-parser": "^1.2.21", - "postcss": "^7.0.32", - "postcss-import": "^12.0.0", + "postcss": "^8.3.11", + "postcss-import": "^13.0.0", "puppeteer": "^10.2.0", "rehype-raw": "^5.0.0", "rehype-stringify": "^8.0.0", diff --git a/packages/cli/src/commands/build.js b/packages/cli/src/commands/build.js index 0ecc143de..87d72d9db 100644 --- a/packages/cli/src/commands/build.js +++ b/packages/cli/src/commands/build.js @@ -1,12 +1,12 @@ -const bundleCompilation = require('../lifecycles/bundle'); -const copyAssets = require('../lifecycles/copy'); -const { devServer } = require('../lifecycles/serve'); -const fs = require('fs'); -const generateCompilation = require('../lifecycles/compile'); -const { preRenderCompilation, staticRenderCompilation } = require('../lifecycles/prerender'); -const { ServerInterface } = require('../lib/server-interface'); +import { bundleCompilation } from '../lifecycles/bundle.js'; +import { copyAssets } from '../lifecycles/copy.js'; +import { devServer } from '../lifecycles/serve.js'; +import fs from 'fs'; +import { generateCompilation } from '../lifecycles/compile.js'; +import { preRenderCompilation, staticRenderCompilation } from '../lifecycles/prerender.js'; +import { ServerInterface } from '../lib/server-interface.js'; -module.exports = runProductionBuild = async () => { +const runProductionBuild = async () => { return new Promise(async (resolve, reject) => { @@ -21,9 +21,9 @@ module.exports = runProductionBuild = async () => { } if (prerender) { - await new Promise((resolve, reject) => { + await new Promise(async (resolve, reject) => { try { - devServer(compilation).listen(port, async () => { + (await devServer(compilation)).listen(port, async () => { console.info(`Started local development server at localhost:${port}`); const servers = [...compilation.config.plugins.filter((plugin) => { @@ -65,4 +65,6 @@ module.exports = runProductionBuild = async () => { } }); -}; \ No newline at end of file +}; + +export { runProductionBuild }; \ No newline at end of file diff --git a/packages/cli/src/commands/develop.js b/packages/cli/src/commands/develop.js index 3b4af4566..311a64bde 100644 --- a/packages/cli/src/commands/develop.js +++ b/packages/cli/src/commands/develop.js @@ -1,8 +1,8 @@ -const generateCompilation = require('../lifecycles/compile'); -const { ServerInterface } = require('../lib/server-interface'); -const { devServer } = require('../lifecycles/serve'); +import { generateCompilation } from '../lifecycles/compile.js'; +import { ServerInterface } from '../lib/server-interface.js'; +import { devServer } from '../lifecycles/serve.js'; -module.exports = runDevServer = async () => { +const runDevServer = async () => { return new Promise(async (resolve, reject) => { @@ -10,7 +10,7 @@ module.exports = runDevServer = async () => { const compilation = await generateCompilation(); const { port } = compilation.config.devServer; - devServer(compilation).listen(port, () => { + (await devServer(compilation)).listen(port, () => { console.info(`Started local development server at localhost:${port}`); @@ -27,7 +27,7 @@ module.exports = runDevServer = async () => { })]; return Promise.all(servers.map(async (server) => { - return server.start(); + return await server.start(); })); }); } catch (err) { @@ -35,4 +35,6 @@ module.exports = runDevServer = async () => { } }); -}; \ No newline at end of file +}; + +export { runDevServer }; \ No newline at end of file diff --git a/packages/cli/src/commands/eject.js b/packages/cli/src/commands/eject.js index c2108c757..8c8612d30 100644 --- a/packages/cli/src/commands/eject.js +++ b/packages/cli/src/commands/eject.js @@ -1,15 +1,17 @@ -const fs = require('fs'); -const generateCompilation = require('../lifecycles/compile'); -const path = require('path'); +import fs from 'fs'; +import { generateCompilation } from '../lifecycles/compile.js'; +import path from 'path'; +import { fileURLToPath, URL } from 'url'; -module.exports = ejectConfiguration = async () => { +const ejectConfiguration = async () => { return new Promise(async (resolve, reject) => { try { const compilation = await generateCompilation(); - const configFilePaths = fs.readdirSync(path.join(__dirname, '../config')); - - configFilePaths.forEach((configFile) => { - const from = path.join(__dirname, '../config', configFile); + const configFilePath = fileURLToPath(new URL('../config', import.meta.url)); + const configFiles = fs.readdirSync(configFilePath); + + configFiles.forEach((configFile) => { + const from = path.join(configFilePath, configFile); const to = `${compilation.context.projectDirectory}/${configFile}`; fs.copyFileSync(from, to); @@ -24,4 +26,6 @@ module.exports = ejectConfiguration = async () => { reject(err); } }); -}; \ No newline at end of file +}; + +export { ejectConfiguration }; \ No newline at end of file diff --git a/packages/cli/src/commands/serve.js b/packages/cli/src/commands/serve.js index efbd450cd..ce512e232 100644 --- a/packages/cli/src/commands/serve.js +++ b/packages/cli/src/commands/serve.js @@ -1,7 +1,7 @@ -const generateCompilation = require('../lifecycles/compile'); -const { prodServer } = require('../lifecycles/serve'); +import { generateCompilation } from '../lifecycles/compile.js'; +import { prodServer } from '../lifecycles/serve.js'; -module.exports = runProdServer = async () => { +const runProdServer = async () => { return new Promise(async (resolve, reject) => { @@ -9,7 +9,7 @@ module.exports = runProdServer = async () => { const compilation = await generateCompilation(); const port = 8080; - prodServer(compilation).listen(port, () => { + (await prodServer(compilation)).listen(port, () => { console.info(`Started production test server at localhost:${port}`); }); } catch (err) { @@ -17,4 +17,6 @@ module.exports = runProdServer = async () => { } }); -}; \ No newline at end of file +}; + +export { runProdServer }; \ No newline at end of file diff --git a/packages/cli/src/config/rollup.config.js b/packages/cli/src/config/rollup.config.js index f772a12b8..4d6750d57 100644 --- a/packages/cli/src/config/rollup.config.js +++ b/packages/cli/src/config/rollup.config.js @@ -1,9 +1,10 @@ /* eslint-disable max-depth, no-loop-func */ -const fs = require('fs'); -const htmlparser = require('node-html-parser'); -const path = require('path'); -const postcss = require('postcss'); -const postcssImport = require('postcss-import'); +import fs from 'fs'; +import htmlparser from 'node-html-parser'; +import path from 'path'; +import postcss from 'postcss'; +import postcssImport from 'postcss-import'; + const tokenSuffix = 'scratch'; const tokenNodeModules = 'node_modules'; @@ -506,7 +507,7 @@ function greenwoodHtmlPlugin(compilation) { }; } -module.exports = getRollupConfig = async (compilation) => { +const getRollupConfig = async (compilation) => { const { scratchDir, outputDir } = compilation.context; const inputs = compilation.graph.map((page) => { return path.normalize(`${scratchDir}${page.outputPath}`); @@ -570,4 +571,6 @@ module.exports = getRollupConfig = async (compilation) => { ] }]; -}; \ No newline at end of file +}; + +export { getRollupConfig }; \ No newline at end of file diff --git a/packages/cli/src/index.js b/packages/cli/src/index.js index 979bc4b8d..74621ca12 100755 --- a/packages/cli/src/index.js +++ b/packages/cli/src/index.js @@ -5,13 +5,16 @@ // https://github.com/ProjectEvergreen/greenwood/issues/141 process.setMaxListeners(0); -const program = require('commander'); -const runProductionBuild = require('./commands/build'); -const runDevServer = require('./commands/develop'); -const runProdServer = require('./commands/serve'); -const ejectConfiguration = require('./commands/eject'); -const greenwoodPackageJson = require('../package.json'); +import program from 'commander'; +import fs from 'fs/promises'; +import { URL } from 'url'; +import { runDevServer } from './commands/develop.js'; +import { runProductionBuild } from './commands/build.js'; +import { runProdServer } from './commands/serve.js'; +import { ejectConfiguration } from './commands/eject.js'; + +const greenwoodPackageJson = JSON.parse(await fs.readFile(new URL('../package.json', import.meta.url), 'utf-8')); let cmdOption = {}; let command = ''; diff --git a/packages/cli/src/lib/browser.js b/packages/cli/src/lib/browser.js index 62468dba6..2dc65458e 100644 --- a/packages/cli/src/lib/browser.js +++ b/packages/cli/src/lib/browser.js @@ -8,7 +8,7 @@ * Wraps Puppeteer's interface to Headless Chrome to expose high level rendering * APIs that are able to handle web components and PWAs. */ -const puppeteer = require('puppeteer'); +import puppeteer from 'puppeteer'; class BrowserRunner { @@ -84,4 +84,4 @@ class BrowserRunner { } } -module.exports = BrowserRunner; \ No newline at end of file +export { BrowserRunner }; \ No newline at end of file diff --git a/packages/cli/src/lib/node-modules-utils.js b/packages/cli/src/lib/node-modules-utils.js index 19d90ce81..3113eed05 100644 --- a/packages/cli/src/lib/node-modules-utils.js +++ b/packages/cli/src/lib/node-modules-utils.js @@ -1,12 +1,13 @@ -const fs = require('fs'); +import { createRequire } from 'module'; // https://stackoverflow.com/a/62499498/417806 +import fs from 'fs'; -// defer to NodeJS to find where on disk a package is located using require.resolve +// defer to NodeJS to find where on disk a package is located using import.meta.resolve // and return the root absolute location -function getNodeModulesLocationForPackage(packageName) { +async function getNodeModulesLocationForPackage(packageName) { let nodeModulesUrl; try { - const packageEntryLocation = require.resolve(packageName).replace(/\\/g, '/'); // force / for consistency and path matching + const packageEntryLocation = (await import.meta.resolve(packageName)).replace(/\\/g, '/'); // force / for consistency and path matching if (packageName.indexOf('@greenwood') === 0) { const subPackage = packageEntryLocation.indexOf('@greenwood') > 0 @@ -26,6 +27,7 @@ function getNodeModulesLocationForPackage(packageName) { // require.resolve may fail in the event a package has no main in its package.json // so as a fallback, ask for node_modules paths and find its location manually // https://github.com/ProjectEvergreen/greenwood/issues/557#issuecomment-923332104 + const require = createRequire(import.meta.url); const locations = require.resolve.paths(packageName); for (const location in locations) { @@ -58,7 +60,7 @@ function getPackageNameFromUrl(url) { return packageName; } -module.exports = { +export { getNodeModulesLocationForPackage, getPackageNameFromUrl }; \ No newline at end of file diff --git a/packages/cli/src/lib/resource-interface.js b/packages/cli/src/lib/resource-interface.js index 05f972d47..0fdf96476 100644 --- a/packages/cli/src/lib/resource-interface.js +++ b/packages/cli/src/lib/resource-interface.js @@ -1,5 +1,5 @@ -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; class ResourceInterface { constructor(compilation, options = {}) { @@ -90,6 +90,4 @@ class ResourceInterface { } } -module.exports = { - ResourceInterface -}; \ No newline at end of file +export { ResourceInterface }; \ No newline at end of file diff --git a/packages/cli/src/lib/server-interface.js b/packages/cli/src/lib/server-interface.js index aeaed6d7e..f7aeb855b 100644 --- a/packages/cli/src/lib/server-interface.js +++ b/packages/cli/src/lib/server-interface.js @@ -13,6 +13,4 @@ class ServerInterface { } } -module.exports = { - ServerInterface -}; \ No newline at end of file +export { ServerInterface }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/bundle.js b/packages/cli/src/lifecycles/bundle.js index 3c63f0ac5..7ee0dad60 100644 --- a/packages/cli/src/lifecycles/bundle.js +++ b/packages/cli/src/lifecycles/bundle.js @@ -1,7 +1,7 @@ -const getRollupConfig = require('../config/rollup.config'); -const rollup = require('rollup'); +import { getRollupConfig } from '../config/rollup.config.js'; +import { rollup } from 'rollup'; -module.exports = bundleCompilation = async (compilation) => { +const bundleCompilation = async (compilation) => { return new Promise(async (resolve, reject) => { try { @@ -9,7 +9,7 @@ module.exports = bundleCompilation = async (compilation) => { if (compilation.graph.length > 0) { const rollupConfigs = await getRollupConfig(compilation); - const bundle = await rollup.rollup(rollupConfigs[0]); + const bundle = await rollup(rollupConfigs[0]); await bundle.write(rollupConfigs[0].output); } @@ -19,4 +19,6 @@ module.exports = bundleCompilation = async (compilation) => { reject(err); } }); -}; \ No newline at end of file +}; + +export { bundleCompilation }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/compile.js b/packages/cli/src/lifecycles/compile.js index 80fc0adf1..698d73435 100644 --- a/packages/cli/src/lifecycles/compile.js +++ b/packages/cli/src/lifecycles/compile.js @@ -1,8 +1,8 @@ -const initConfig = require('./config'); -const initContext = require('./context'); -const generateGraph = require('./graph'); +import { readAndMergeConfig as initConfig } from './config.js'; +import { initContext } from './context.js'; +import { generateGraph } from './graph.js'; -module.exports = generateCompilation = () => { +const generateCompilation = () => { return new Promise(async (resolve, reject) => { try { @@ -28,4 +28,6 @@ module.exports = generateCompilation = () => { reject(err); } }); -}; \ No newline at end of file +}; + +export { generateCompilation }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/config.js b/packages/cli/src/lifecycles/config.js index e05e326e8..db8ad730c 100644 --- a/packages/cli/src/lifecycles/config.js +++ b/packages/cli/src/lifecycles/config.js @@ -1,29 +1,33 @@ -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath, pathToFileURL, URL } from 'url'; // get and "tag" all plugins provided / maintained by the @greenwood/cli // and include as the default set, with all user plugins getting appended -const greenwoodPluginsBasePath = path.join(__dirname, '../', 'plugins'); -const greenwoodPlugins = [ - path.join(greenwoodPluginsBasePath, 'copy'), +const greenwoodPluginsBasePath = fileURLToPath(new URL('../plugins', import.meta.url)); + +const greenwoodPlugins = (await Promise.all([ + path.join(greenwoodPluginsBasePath, 'copy'), path.join(greenwoodPluginsBasePath, 'resource'), path.join(greenwoodPluginsBasePath, 'server') -].map((pluginDirectory) => { - return fs.readdirSync(pluginDirectory) - .map((filename) => { - const plugin = require(`${pluginDirectory}/${filename}`); - - return Array.isArray(plugin) - ? plugin - : [plugin]; - }).flat(); -}).flat() - .map((plugin) => { - return { - isGreenwoodDefaultPlugin: true, - ...plugin - }; - }); +].map(async (pluginDirectory) => { + const files = await fs.promises.readdir(pluginDirectory); + + return (await Promise.all(files.map(async(file) => { + const importPaTh = pathToFileURL(`${pluginDirectory}${path.sep}${file}`); + const pluginImport = await import(importPaTh); + const plugin = pluginImport[Object.keys(pluginImport)[0]]; + + return Array.isArray(plugin) + ? plugin + : [plugin]; + }))).flat(); +}).flat())).flat().map((plugin) => { + return { + isGreenwoodDefaultPlugin: true, + ...plugin + }; +}); const modes = ['ssg', 'mpa', 'spa']; const optimizations = ['default', 'none', 'static', 'inline']; @@ -46,7 +50,7 @@ const defaultConfig = { templatesDirectory: 'templates' }; -module.exports = readAndMergeConfig = async() => { +const readAndMergeConfig = async() => { // eslint-disable-next-line complexity return new Promise(async (resolve, reject) => { try { @@ -54,7 +58,7 @@ module.exports = readAndMergeConfig = async() => { let customConfig = Object.assign({}, defaultConfig); if (fs.existsSync(path.join(process.cwd(), 'greenwood.config.js'))) { - const userCfgFile = require(path.join(process.cwd(), 'greenwood.config.js')); + const userCfgFile = (await import(pathToFileURL(path.join(process.cwd(), 'greenwood.config.js')))).default; const { workspace, devServer, title, markdown, meta, mode, optimization, plugins, prerender, pagesDirectory, templatesDirectory } = userCfgFile; // workspace validation @@ -195,4 +199,6 @@ module.exports = readAndMergeConfig = async() => { reject(err); } }); -}; \ No newline at end of file +}; + +export { readAndMergeConfig }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/context.js b/packages/cli/src/lifecycles/context.js index e1b20d9de..2751882fe 100644 --- a/packages/cli/src/lifecycles/context.js +++ b/packages/cli/src/lifecycles/context.js @@ -1,10 +1,11 @@ -const fs = require('fs'); -const path = require('path'); -const scratchDir = path.join(process.cwd(), './.greenwood/'); -const outputDir = path.join(process.cwd(), './public'); -const dataDir = path.join(__dirname, '../data'); +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath, URL } from 'url'; -module.exports = initContexts = async({ config }) => { +const initContext = async({ config }) => { + const scratchDir = path.join(process.cwd(), './.greenwood/'); + const outputDir = path.join(process.cwd(), './public'); + const dataDir = fileURLToPath(new URL('../data', import.meta.url)); return new Promise(async (resolve, reject) => { try { @@ -35,4 +36,6 @@ module.exports = initContexts = async({ config }) => { reject(err); } }); -}; \ No newline at end of file +}; + +export { initContext }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/copy.js b/packages/cli/src/lifecycles/copy.js index 7c3b37afe..171f5faa3 100644 --- a/packages/cli/src/lifecycles/copy.js +++ b/packages/cli/src/lifecycles/copy.js @@ -1,5 +1,5 @@ -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; async function rreaddir (dir, allFiles = []) { const files = (await fs.promises.readdir(dir)).map(f => path.join(dir, f)); @@ -65,16 +65,16 @@ async function copyDirectory(from, to) { }); } -module.exports = copyAssets = (compilation) => { +const copyAssets = (compilation) => { return new Promise(async (resolve, reject) => { try { const copyPlugins = compilation.config.plugins.filter(plugin => plugin.type === 'copy'); - for (plugin of copyPlugins) { - const locations = plugin.provider(compilation); + for (const plugin of copyPlugins) { + const locations = await plugin.provider(compilation); - for (location of locations) { + for (const location of locations) { const { from, to } = location; if (path.extname(from) === '') { @@ -92,4 +92,6 @@ module.exports = copyAssets = (compilation) => { reject(err); } }); -}; \ No newline at end of file +}; + +export { copyAssets }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/graph.js b/packages/cli/src/lifecycles/graph.js index 76a047e15..b7cbf1720 100644 --- a/packages/cli/src/lifecycles/graph.js +++ b/packages/cli/src/lifecycles/graph.js @@ -1,11 +1,12 @@ -#!/usr/bin/env node /* eslint-disable complexity */ -const fs = require('fs'); -const fm = require('front-matter'); -const path = require('path'); -const toc = require('markdown-toc'); +import fs from 'fs'; +import fm from 'front-matter'; +import path from 'path'; +import toc from 'markdown-toc'; +// const fm = require('front-matter'); +// const toc = require('markdown-toc'); -module.exports = generateGraph = async (compilation) => { +const generateGraph = async (compilation) => { return new Promise(async (resolve, reject) => { try { @@ -193,4 +194,6 @@ module.exports = generateGraph = async (compilation) => { } }); -}; \ No newline at end of file +}; + +export { generateGraph }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/prerender.js b/packages/cli/src/lifecycles/prerender.js index 703d09e8b..46c59b99a 100644 --- a/packages/cli/src/lifecycles/prerender.js +++ b/packages/cli/src/lifecycles/prerender.js @@ -1,6 +1,6 @@ -const BrowserRunner = require('../lib/browser'); -const fs = require('fs'); -const path = require('path'); +import { BrowserRunner } from '../lib/browser.js'; +import fs from 'fs'; +import path from 'path'; async function optimizePage(compilation, contents, route, outputPath, outputDir) { const optimizeResources = compilation.config.plugins.filter((plugin) => { @@ -118,7 +118,7 @@ async function staticRenderCompilation(compilation) { console.info('success, done generating all pages!'); } -module.exports = { +export { preRenderCompilation, staticRenderCompilation }; \ No newline at end of file diff --git a/packages/cli/src/lifecycles/serve.js b/packages/cli/src/lifecycles/serve.js index eb9d9aa8f..094a1da7d 100644 --- a/packages/cli/src/lifecycles/serve.js +++ b/packages/cli/src/lifecycles/serve.js @@ -1,10 +1,9 @@ -const fs = require('fs'); -const path = require('path'); -const Koa = require('koa'); +import fs from 'fs'; +import path from 'path'; +import Koa from 'koa'; +import { ResourceInterface } from '../lib/resource-interface.js'; -const { ResourceInterface } = require('../lib/resource-interface'); - -function getDevServer(compilation) { +const getDevServer = async(compilation) => { const app = new Koa(); const compilationCopy = Object.assign({}, compilation); const resources = [ @@ -120,10 +119,10 @@ function getDevServer(compilation) { ctx.body = reducedResponse.body; }); - return app; -} + return Promise.resolve(app); +}; -function getProdServer(compilation) { +const getProdServer = async(compilation) => { const app = new Koa(); const standardResources = compilation.config.plugins.filter((plugin) => { // html is intentionally omitted @@ -209,10 +208,10 @@ function getProdServer(compilation) { ctx.body = reducedResponse.body; }); - return app; -} + return Promise.resolve(app); +}; -module.exports = { - devServer: getDevServer, - prodServer: getProdServer +export { + getDevServer as devServer, + getProdServer as prodServer }; \ No newline at end of file diff --git a/packages/cli/src/plugins/copy/plugin-copy-assets.js b/packages/cli/src/plugins/copy/plugin-copy-assets.js index bd5031fdc..802bf03b3 100644 --- a/packages/cli/src/plugins/copy/plugin-copy-assets.js +++ b/packages/cli/src/plugins/copy/plugin-copy-assets.js @@ -1,7 +1,7 @@ -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; -module.exports = [{ +const greenwoodPluginCopyAssets = [{ type: 'copy', name: 'plugin-copy-assets', provider: (compilation) => { @@ -18,4 +18,6 @@ module.exports = [{ return assets; } -}]; \ No newline at end of file +}]; + +export { greenwoodPluginCopyAssets }; \ No newline at end of file diff --git a/packages/cli/src/plugins/copy/plugin-copy-graph-json.js b/packages/cli/src/plugins/copy/plugin-copy-graph-json.js index bb3b44a4b..50f9df92a 100644 --- a/packages/cli/src/plugins/copy/plugin-copy-graph-json.js +++ b/packages/cli/src/plugins/copy/plugin-copy-graph-json.js @@ -1,6 +1,6 @@ -const path = require('path'); +import path from 'path'; -module.exports = [{ +const greenwoodPluginCopyGraphJson = [{ type: 'copy', name: 'plugin-copy-graph-json', provider: (compilation) => { @@ -11,4 +11,6 @@ module.exports = [{ to: path.join(context.outputDir, 'graph.json') }]; } -}]; \ No newline at end of file +}]; + +export { greenwoodPluginCopyGraphJson }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-dev-proxy.js b/packages/cli/src/plugins/resource/plugin-dev-proxy.js index 64992b67f..ee9d031ad 100644 --- a/packages/cli/src/plugins/resource/plugin-dev-proxy.js +++ b/packages/cli/src/plugins/resource/plugin-dev-proxy.js @@ -3,8 +3,8 @@ * Manages routing devServer.proxy entries to their destination. * */ -const fetch = require('node-fetch'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fetch from 'node-fetch'; +import { ResourceInterface } from '../../lib/resource-interface.js'; class DevProxyResource extends ResourceInterface { constructor(compilation, options) { @@ -38,8 +38,10 @@ class DevProxyResource extends ResourceInterface { } } -module.exports = { +const greenwoodPluginDevProxy = { type: 'resource', name: 'plugin-dev-proxy', provider: (compilation, options) => new DevProxyResource(compilation, options) -}; \ No newline at end of file +}; + +export { greenwoodPluginDevProxy }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-node-modules.js b/packages/cli/src/plugins/resource/plugin-node-modules.js index ffbff05b6..33d4e8eae 100644 --- a/packages/cli/src/plugins/resource/plugin-node-modules.js +++ b/packages/cli/src/plugins/resource/plugin-node-modules.js @@ -1,16 +1,17 @@ +/* eslint-disable max-depth,complexity */ /* * * Detects and fully resolves requests to node_modules and handles creating an importMap. * */ -const acorn = require('acorn'); -const fs = require('fs'); -const path = require('path'); -const { nodeResolve } = require('@rollup/plugin-node-resolve'); -const replace = require('@rollup/plugin-replace'); -const { getNodeModulesLocationForPackage, getPackageNameFromUrl } = require('../../lib/node-modules-utils'); -const { ResourceInterface } = require('../../lib/resource-interface'); -const walk = require('acorn-walk'); +import * as acorn from 'acorn'; +import fs from 'fs'; +import path from 'path'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import replace from '@rollup/plugin-replace'; +import { getNodeModulesLocationForPackage, getPackageNameFromUrl } from '../../lib/node-modules-utils.js'; +import { ResourceInterface } from '../../lib/resource-interface.js'; +import * as walk from 'acorn-walk'; const importMap = {}; @@ -23,7 +24,7 @@ const updateImportMap = (entry, entryPath) => { importMap[entry] = entryPath; }; -const getPackageEntryPath = (packageJson) => { +const getPackageEntryPath = async (packageJson) => { let entry = packageJson.exports ? Object.keys(packageJson.exports) // first favor export maps first : packageJson.module // next favor ESM entry points @@ -33,21 +34,21 @@ const getPackageEntryPath = (packageJson) => { : 'index.js'; // lastly, fallback to index.js // use .mjs version if it exists, for packages like redux - if (!Array.isArray(entry) && fs.existsSync(`${getNodeModulesLocationForPackage(packageJson.name)}/${entry.replace('.js', '.mjs')}`)) { + if (!Array.isArray(entry) && fs.existsSync(`${await getNodeModulesLocationForPackage(packageJson.name)}/${entry.replace('.js', '.mjs')}`)) { entry = entry.replace('.js', '.mjs'); } return entry; }; -const walkModule = (module, dependency) => { +const walkModule = async (module, dependency) => { walk.simple(acorn.parse(module, { ecmaVersion: '2020', sourceType: 'module' }), { - ImportDeclaration(node) { + async ImportDeclaration(node) { let { value: sourceValue } = node.source; - const absoluteNodeModulesLocation = getNodeModulesLocationForPackage(dependency); + const absoluteNodeModulesLocation = await getNodeModulesLocationForPackage(dependency); if (path.extname(sourceValue) === '' && sourceValue.indexOf('http') !== 0 && sourceValue.indexOf('./') < 0) { if (!importMap[sourceValue]) { @@ -56,7 +57,7 @@ const walkModule = (module, dependency) => { updateImportMap(sourceValue, `/node_modules/${sourceValue}`); } - walkPackageJson(path.join(absoluteNodeModulesLocation, 'package.json')); + await walkPackageJson(path.join(absoluteNodeModulesLocation, 'package.json')); } else if (sourceValue.indexOf('./') < 0) { // adding a relative import updateImportMap(sourceValue, `/node_modules/${sourceValue}`); @@ -68,10 +69,12 @@ const walkModule = (module, dependency) => { if (fs.existsSync(path.join(absoluteNodeModulesLocation, sourceValue))) { const moduleContents = fs.readFileSync(path.join(absoluteNodeModulesLocation, sourceValue)); - walkModule(moduleContents, dependency); + await walkModule(moduleContents, dependency); updateImportMap(`${dependency}/${sourceValue.replace('./', '')}`, `/node_modules/${dependency}/${sourceValue.replace('./', '')}`); } } + + return Promise.resolve(); }, ExportNamedDeclaration(node) { const sourceValue = node && node.source ? node.source.value : ''; @@ -98,27 +101,27 @@ const walkModule = (module, dependency) => { }); }; -const walkPackageJson = (packageJson = {}) => { +const walkPackageJson = async (packageJson = {}) => { // while walking a package.json we need to find its entry point, e.g. index.js // and then walk that for import / export statements // and walk its package.json for its dependencies - Object.keys(packageJson.dependencies || {}).forEach(dependency => { + for (const dependency of Object.keys(packageJson.dependencies || {})) { const dependencyPackageRootPath = path.join(process.cwd(), './node_modules', dependency); const dependencyPackageJsonPath = path.join(dependencyPackageRootPath, 'package.json'); - const dependencyPackageJson = require(dependencyPackageJsonPath); - const entry = getPackageEntryPath(dependencyPackageJson); + const dependencyPackageJson = JSON.parse(fs.readFileSync(dependencyPackageJsonPath, 'utf-8')); + const entry = await getPackageEntryPath(dependencyPackageJson); const isJavascriptPackage = Array.isArray(entry) || typeof entry === 'string' && entry.endsWith('.js') || entry.endsWith('.mjs'); if (isJavascriptPackage) { - const absoluteNodeModulesLocation = getNodeModulesLocationForPackage(dependency); + const absoluteNodeModulesLocation = await getNodeModulesLocationForPackage(dependency); // https://nodejs.org/api/packages.html#packages_determining_module_system if (Array.isArray(entry)) { // we have an exportMap const exportMap = entry; - exportMap.forEach((entry) => { + for (const entry of exportMap) { const exportMapEntry = dependencyPackageJson.exports[entry]; let packageExport; @@ -177,7 +180,7 @@ const walkPackageJson = (packageJson = {}) => { if (packageExport.endsWith('js')) { const moduleContents = fs.readFileSync(packageExportLocation); - walkModule(moduleContents, dependency); + await walkModule(moduleContents, dependency); updateImportMap(`${dependency}${entry.replace('.', '')}`, `/node_modules/${dependency}/${packageExport.replace('./', '')}`); } else if (fs.lstatSync(packageExportLocation).isDirectory()) { fs.readdirSync(packageExportLocation) @@ -189,9 +192,9 @@ const walkPackageJson = (packageJson = {}) => { console.warn('Warning, not able to handle export', `${dependency}/${packageExport}`); } } - }); + } - walkPackageJson(dependencyPackageJson); + await walkPackageJson(dependencyPackageJson); } else { const packageEntryPointPath = path.join(absoluteNodeModulesLocation, entry); @@ -199,13 +202,13 @@ const walkPackageJson = (packageJson = {}) => { if (fs.existsSync(packageEntryPointPath)) { const packageEntryModule = fs.readFileSync(packageEntryPointPath, 'utf-8'); - walkModule(packageEntryModule, dependency); + await walkModule(packageEntryModule, dependency); updateImportMap(dependency, `/node_modules/${dependency}/${entry}`); - walkPackageJson(dependencyPackageJson); + await walkPackageJson(dependencyPackageJson); } } } - }); + } }; class NodeModulesResource extends ResourceInterface { @@ -222,7 +225,7 @@ class NodeModulesResource extends ResourceInterface { const bareUrl = this.getBareUrlPath(url); const { projectDirectory } = this.compilation.context; const packageName = getPackageNameFromUrl(bareUrl); - const absoluteNodeModulesLocation = getNodeModulesLocationForPackage(packageName); + const absoluteNodeModulesLocation = await getNodeModulesLocationForPackage(packageName); const packagePathPieces = bareUrl.split('node_modules/')[1].split('/'); // double split to handle node_modules within nested paths let absoluteNodeModulesUrl; @@ -270,7 +273,7 @@ class NodeModulesResource extends ResourceInterface { } async intercept(url, body) { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { try { const { userWorkspace } = this.compilation.context; let newContents = body; @@ -284,16 +287,16 @@ class NodeModulesResource extends ResourceInterface { } const userPackageJson = fs.existsSync(`${userWorkspace}/package.json`) - ? require(path.join(userWorkspace, 'package.json')) // its a monorepo? + ? JSON.parse(fs.readFileSync(path.join(userWorkspace, 'package.json'), 'utf-8')) // its a monorepo? : fs.existsSync(`${process.cwd()}/package.json`) - ? require(path.join(process.cwd(), 'package.json')) + ? JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8')) : {}; // walk the project's pacakge.json for all its direct dependencies // for each entry found in dependencies, find its entry point // then walk its entry point (e.g. index.js) for imports / exports to add to the importMap // and then walk its package.json for transitive dependencies and all those import / exports - walkPackageJson(userPackageJson); + await walkPackageJson(userPackageJson); // apply import map and shim for users newContents = newContents.replace('', ` @@ -316,7 +319,7 @@ class NodeModulesResource extends ResourceInterface { } } -module.exports = [{ +const greenwoodPluginNodeModules = [{ type: 'resource', name: 'plugin-node-modules:resource', provider: (compilation, options) => new NodeModulesResource(compilation, options) @@ -335,4 +338,6 @@ module.exports = [{ nodeResolve() ]; } -}]; \ No newline at end of file +}]; + +export { greenwoodPluginNodeModules }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-optimization-mpa.js b/packages/cli/src/plugins/resource/plugin-optimization-mpa.js index ba6001ed4..b2d852891 100644 --- a/packages/cli/src/plugins/resource/plugin-optimization-mpa.js +++ b/packages/cli/src/plugins/resource/plugin-optimization-mpa.js @@ -4,9 +4,10 @@ * This is a Greenwood default plugin. * */ -const fs = require('fs'); -const path = require('path'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fs from 'fs'; +import path from 'path'; +import { ResourceInterface } from '../../lib/resource-interface.js'; +import { fileURLToPath, URL } from 'url'; class OptimizationMPAResource extends ResourceInterface { constructor(compilation, options) { @@ -23,7 +24,7 @@ class OptimizationMPAResource extends ResourceInterface { async resolve() { return new Promise(async (resolve, reject) => { try { - const routerUrl = path.join(__dirname, '../../', 'lib/router.js'); + const routerUrl = fileURLToPath(new URL('../../lib/router.js', import.meta.url)); resolve(routerUrl); } catch (e) { @@ -98,8 +99,10 @@ class OptimizationMPAResource extends ResourceInterface { } } -module.exports = { +const greenwoodPluginOptimzationMpa = { type: 'resource', name: 'plugin-optimization-mpa', provider: (compilation, options) => new OptimizationMPAResource(compilation, options) -}; \ No newline at end of file +}; + +export { greenwoodPluginOptimzationMpa }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-source-maps.js b/packages/cli/src/plugins/resource/plugin-source-maps.js index 7400d90a8..eb01ec38a 100644 --- a/packages/cli/src/plugins/resource/plugin-source-maps.js +++ b/packages/cli/src/plugins/resource/plugin-source-maps.js @@ -3,9 +3,9 @@ * Detects and fully resolve requests to source map (.map) files. * */ -const fs = require('fs'); -const path = require('path'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fs from 'fs'; +import path from 'path'; +import { ResourceInterface } from '../../lib/resource-interface.js'; class SourceMapsResource extends ResourceInterface { constructor(compilation, options) { @@ -33,8 +33,10 @@ class SourceMapsResource extends ResourceInterface { } } -module.exports = { +const greenwoodPluginSourceMaps = { type: 'resource', name: 'plugin-source-maps', provider: (compilation, options) => new SourceMapsResource(compilation, options) -}; \ No newline at end of file +}; + +export { greenwoodPluginSourceMaps }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-standard-css.js b/packages/cli/src/plugins/resource/plugin-standard-css.js index fbbf2f8f2..744d314b6 100644 --- a/packages/cli/src/plugins/resource/plugin-standard-css.js +++ b/packages/cli/src/plugins/resource/plugin-standard-css.js @@ -4,11 +4,11 @@ * This is a Greenwood default plugin. * */ -const fs = require('fs'); -const cssnano = require('cssnano'); -const path = require('path'); -const postcss = require('postcss'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fs from 'fs'; +import path from 'path'; +import cssnano from 'cssnano'; +import postcss from 'postcss'; +import { ResourceInterface } from '../../lib/resource-interface.js'; class StandardCssResource extends ResourceInterface { constructor(compilation, options) { @@ -53,8 +53,10 @@ class StandardCssResource extends ResourceInterface { } } -module.exports = { +const greenwoodPluginStandardCss = { type: 'resource', name: 'plugin-standard-css', provider: (compilation, options) => new StandardCssResource(compilation, options) -}; \ No newline at end of file +}; + +export { greenwoodPluginStandardCss }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-standard-font.js b/packages/cli/src/plugins/resource/plugin-standard-font.js index 5632c31b5..bbbb48a52 100644 --- a/packages/cli/src/plugins/resource/plugin-standard-font.js +++ b/packages/cli/src/plugins/resource/plugin-standard-font.js @@ -4,9 +4,9 @@ * This is a Greenwood default plugin. * */ -const fs = require('fs'); -const path = require('path'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fs from 'fs'; +import path from 'path'; +import { ResourceInterface } from '../../lib/resource-interface.js'; class StandardFontResource extends ResourceInterface { constructor(compilation, options) { @@ -31,8 +31,10 @@ class StandardFontResource extends ResourceInterface { } } -module.exports = { +const pluginGreenwoodStandardFont = { type: 'resource', name: 'plugin-standard-font', provider: (compilation, options) => new StandardFontResource(compilation, options) -}; \ No newline at end of file +}; + +export { pluginGreenwoodStandardFont }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-standard-html.js b/packages/cli/src/plugins/resource/plugin-standard-html.js index 52a214779..fcc119dbc 100644 --- a/packages/cli/src/plugins/resource/plugin-standard-html.js +++ b/packages/cli/src/plugins/resource/plugin-standard-html.js @@ -5,17 +5,18 @@ * This is a Greenwood default plugin. * */ -const frontmatter = require('front-matter'); -const fs = require('fs'); -const htmlparser = require('node-html-parser'); -const path = require('path'); -const rehypeStringify = require('rehype-stringify'); -const rehypeRaw = require('rehype-raw'); -const remarkFrontmatter = require('remark-frontmatter'); -const remarkParse = require('remark-parse'); -const remarkRehype = require('remark-rehype'); -const { ResourceInterface } = require('../../lib/resource-interface'); -const unified = require('unified'); +import frontmatter from 'front-matter'; +import fs from 'fs'; +import htmlparser from 'node-html-parser'; +import path from 'path'; +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 { ResourceInterface } from '../../lib/resource-interface.js'; +import unified from 'unified'; +import { fileURLToPath, URL } from 'url'; function getCustomPageTemplates(contextPlugins, templateName) { return contextPlugins @@ -31,6 +32,7 @@ const getPageTemplate = (barePath, templatesDir, template, contextPlugins = [], const customPluginDefaultPageTemplates = getCustomPageTemplates(contextPlugins, 'page'); const customPluginPageTemplates = getCustomPageTemplates(contextPlugins, template); const is404Page = barePath.replace(pagesDir, '').indexOf(`${path.sep}404`) === 0; + let contents; if (template && customPluginPageTemplates.length > 0 || fs.existsSync(`${templatesDir}/${template}.html`)) { // use a custom template, usually from markdown frontmatter @@ -51,11 +53,10 @@ const getPageTemplate = (barePath, templatesDir, template, contextPlugins = [], ? fs.readFileSync(`${customPluginDefaultPageTemplates[0]}/page.html`, 'utf-8') : fs.readFileSync(`${templatesDir}/page.html`, 'utf-8'); } else if (is404Page && !fs.existsSync(path.join(pagesDir, '404.html'))) { - // handle default 404.html - contents = fs.readFileSync(path.join(__dirname, '../../templates/404.html'), 'utf-8'); + contents = fs.readFileSync(fileURLToPath(new URL('../../templates/404.html', import.meta.url)), 'utf-8'); } else { // fallback to using Greenwood's stock page template - contents = fs.readFileSync(path.join(__dirname, '../../templates/page.html'), 'utf-8'); + contents = fs.readFileSync(fileURLToPath(new URL('../../templates/page.html', import.meta.url)), 'utf-8'); } return contents; @@ -69,7 +70,7 @@ const getAppTemplate = (contents, templatesDir, customImports = [], contextPlugi ? fs.readFileSync(`${customAppTemplates[0]}/app.html`, 'utf-8') : fs.existsSync(userAppTemplatePath) ? fs.readFileSync(userAppTemplatePath, 'utf-8') - : fs.readFileSync(path.join(__dirname, '../../templates/app.html'), 'utf-8'); + : fs.readFileSync(fileURLToPath(new URL('../../templates/app.html', import.meta.url)), 'utf-8'); const root = htmlparser.parse(contents, { script: true, @@ -360,15 +361,15 @@ class StandardHtmlResource extends ResourceInterface { const rehypePlugins = []; const remarkPlugins = []; - config.markdown.plugins.forEach(plugin => { + for (const plugin of config.markdown.plugins) { if (plugin.indexOf('rehype-') >= 0) { - rehypePlugins.push(require(plugin)); + rehypePlugins.push((await import(plugin)).default); } if (plugin.indexOf('remark-') >= 0) { - remarkPlugins.push(require(plugin)); + remarkPlugins.push((await import(plugin)).default); } - }); + } const settings = config.markdown.settings || {}; const fm = frontmatter(markdownContents); @@ -413,7 +414,7 @@ class StandardHtmlResource extends ResourceInterface { body = getPageTemplate(barePath, userTemplatesDir, template, contextPlugins, pagesDir); } - body = getAppTemplate(body, userTemplatesDir, customImports, contextPlugins, config.devServer.hud); + body = getAppTemplate(body, userTemplatesDir, customImports, contextPlugins, config.devServer.hud); body = getUserScripts(body, this.compilation.context); body = getMetaContent(normalizedUrl.replace(/\\/g, '/'), config, body); @@ -482,8 +483,10 @@ class StandardHtmlResource extends ResourceInterface { } } -module.exports = { +const greenwoodPluginStandardHtml = { type: 'resource', name: 'plugin-standard-html', provider: (compilation, options) => new StandardHtmlResource(compilation, options) -}; \ No newline at end of file +}; + +export { greenwoodPluginStandardHtml }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-standard-image.js b/packages/cli/src/plugins/resource/plugin-standard-image.js index 08c80e591..a75620aa4 100644 --- a/packages/cli/src/plugins/resource/plugin-standard-image.js +++ b/packages/cli/src/plugins/resource/plugin-standard-image.js @@ -4,9 +4,9 @@ * This is a Greenwood default plugin. * */ -const fs = require('fs'); -const path = require('path'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fs from 'fs'; +import path from 'path'; +import { ResourceInterface } from '../../lib/resource-interface.js'; class StandardFontResource extends ResourceInterface { constructor(compilation, options) { @@ -48,8 +48,10 @@ class StandardFontResource extends ResourceInterface { } } -module.exports = { +const greenwoodPluginStandardImage = { type: 'resource', name: 'plugin-standard-font', provider: (compilation, options) => new StandardFontResource(compilation, options) -}; \ No newline at end of file +}; + +export { greenwoodPluginStandardImage }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-standard-javascript.js b/packages/cli/src/plugins/resource/plugin-standard-javascript.js index ab6d134e6..b570c1251 100644 --- a/packages/cli/src/plugins/resource/plugin-standard-javascript.js +++ b/packages/cli/src/plugins/resource/plugin-standard-javascript.js @@ -4,9 +4,9 @@ * This is a Greenwood default plugin. * */ -const fs = require('fs'); -const { ResourceInterface } = require('../../lib/resource-interface'); -const { terser } = require('rollup-plugin-terser'); +import fs from 'fs'; +import { ResourceInterface } from '../../lib/resource-interface.js'; +import { terser } from 'rollup-plugin-terser'; class StandardJavaScriptResource extends ResourceInterface { constructor(compilation, options) { @@ -31,7 +31,7 @@ class StandardJavaScriptResource extends ResourceInterface { } } -module.exports = [{ +const greenwoodPluginStandardJavascript = [{ type: 'resource', name: 'plugin-standard-javascript:resource', provider: (compilation, options) => new StandardJavaScriptResource(compilation, options) @@ -43,4 +43,6 @@ module.exports = [{ ? [terser()] : []; } -}]; \ No newline at end of file +}]; + +export { greenwoodPluginStandardJavascript }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-standard-json.js b/packages/cli/src/plugins/resource/plugin-standard-json.js index f2d5320e2..0c96c664f 100644 --- a/packages/cli/src/plugins/resource/plugin-standard-json.js +++ b/packages/cli/src/plugins/resource/plugin-standard-json.js @@ -4,8 +4,8 @@ * This is a Greenwood default plugin. * */ -const fs = require('fs'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fs from 'fs'; +import { ResourceInterface } from '../../lib/resource-interface.js'; class StandardJsonResource extends ResourceInterface { constructor(compilation, options) { @@ -34,8 +34,10 @@ class StandardJsonResource extends ResourceInterface { } } -module.exports = [{ +const pluginGreenwoodStandardJson = [{ type: 'resource', name: 'plugin-standard-json:resource', provider: (compilation, options) => new StandardJsonResource(compilation, options) -}]; \ No newline at end of file +}]; + +export { pluginGreenwoodStandardJson }; \ No newline at end of file diff --git a/packages/cli/src/plugins/resource/plugin-user-workspace.js b/packages/cli/src/plugins/resource/plugin-user-workspace.js index 2a3d60251..2c308d725 100644 --- a/packages/cli/src/plugins/resource/plugin-user-workspace.js +++ b/packages/cli/src/plugins/resource/plugin-user-workspace.js @@ -4,9 +4,9 @@ * This sets the default value for requests in Greenwood. * */ -const fs = require('fs'); -const path = require('path'); -const { ResourceInterface } = require('../../lib/resource-interface'); +import fs from 'fs'; +import path from 'path'; +import { ResourceInterface } from '../../lib/resource-interface.js'; class UserWorkspaceResource extends ResourceInterface { constructor(compilation, options) { @@ -43,8 +43,10 @@ class UserWorkspaceResource extends ResourceInterface { } } -module.exports = { +const greenwoodPluginUserWorkspace = { type: 'resource', name: 'plugin-user-workspace', provider: (compilation, options) => new UserWorkspaceResource(compilation, options) -}; \ No newline at end of file +}; + +export { greenwoodPluginUserWorkspace }; \ No newline at end of file diff --git a/packages/cli/src/plugins/server/plugin-livereload.js b/packages/cli/src/plugins/server/plugin-livereload.js index 3b265a14b..82deca0b1 100644 --- a/packages/cli/src/plugins/server/plugin-livereload.js +++ b/packages/cli/src/plugins/server/plugin-livereload.js @@ -1,8 +1,8 @@ -const fs = require('fs'); -const livereload = require('livereload'); -const path = require('path'); -const { ResourceInterface } = require('../../lib/resource-interface'); -const { ServerInterface } = require('../../lib/server-interface'); +import fs from 'fs'; +import livereload from 'livereload'; +import { ResourceInterface } from '../../lib/resource-interface.js'; +import { ServerInterface } from '../../lib/server-interface.js'; +import { fileURLToPath, pathToFileURL } from 'url'; class LiveReloadServer extends ServerInterface { constructor(compilation, options = {}) { @@ -11,12 +11,15 @@ class LiveReloadServer extends ServerInterface { async start() { const { userWorkspace } = this.compilation.context; - const standardPluginsPath = path.join(__dirname, '../', 'resource'); - const standardPluginsExtensions = fs.readdirSync(standardPluginsPath) - .filter(filename => filename.indexOf('plugin-standard') === 0) - .map((filename) => { - return require(`${standardPluginsPath}/${filename}`); - }) + const standardPluginsPath = fileURLToPath(new URL('../resource', import.meta.url)); + const standardPluginsNames = fs.readdirSync(standardPluginsPath) + .filter(filename => filename.indexOf('plugin-standard') === 0); + const standardPluginsExtensions = (await Promise.all(standardPluginsNames.map(async (filename) => { + const pluginImport = await import(pathToFileURL(`${standardPluginsPath}/${filename}`)); + const plugin = pluginImport[Object.keys(pluginImport)[0]]; + + return plugin; + }))) .map((plugin) => { // assume that if it is an array, the second item is a rollup plugin const instance = plugin.length @@ -77,7 +80,7 @@ class LiveReloadResource extends ResourceInterface { } } -module.exports = [{ +const greenwoodPluginLivereload = [{ type: 'server', name: 'plugin-live-reload:server', provider: (compilation) => new LiveReloadServer(compilation) @@ -85,4 +88,6 @@ module.exports = [{ type: 'resource', name: 'plugin-live-reload:resource', provider: (compilation) => new LiveReloadResource(compilation) -}]; \ No newline at end of file +}]; + +export { greenwoodPluginLivereload }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.default/build.config.default.spec.js b/packages/cli/test/cases/build.config.default/build.config.default.spec.js index 301dcbe5d..46f27d520 100644 --- a/packages/cli/test/cases/build.config.default/build.config.default.spec.js +++ b/packages/cli/test/cases/build.config.default/build.config.default.spec.js @@ -14,15 +14,16 @@ * User Workspace * Greenwood default (src/) */ -const path = require('path'); -const runSmokeTest = require('../../../../../test/smoke-test'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import path from 'path'; +import { runSmokeTest } from '../../../../../test/smoke-test.js'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; describe('Build Greenwood With: ', function() { const LABEL = 'Empty Configuration and Default Workspace'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(function() { diff --git a/packages/cli/test/cases/build.config.error-dev-server-extensions/build.config.error-dev-server-extensions.spec.js b/packages/cli/test/cases/build.config.error-dev-server-extensions/build.config.error-dev-server-extensions.spec.js index ce386e873..d224d4d62 100644 --- a/packages/cli/test/cases/build.config.error-dev-server-extensions/build.config.error-dev-server-extensions.spec.js +++ b/packages/cli/test/cases/build.config.error-dev-server-extensions/build.config.error-dev-server-extensions.spec.js @@ -18,13 +18,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-dev-server-extensions/greenwood.config.js b/packages/cli/test/cases/build.config.error-dev-server-extensions/greenwood.config.js index 2ecb9a330..6e461b4e1 100644 --- a/packages/cli/test/cases/build.config.error-dev-server-extensions/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-dev-server-extensions/greenwood.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { devServer: { extensions: true } diff --git a/packages/cli/test/cases/build.config.error-dev-server-hud/build.config.error-dev-server-hud.spec.js b/packages/cli/test/cases/build.config.error-dev-server-hud/build.config.error-dev-server-hud.spec.js index 6592b5731..49ecb6603 100644 --- a/packages/cli/test/cases/build.config.error-dev-server-hud/build.config.error-dev-server-hud.spec.js +++ b/packages/cli/test/cases/build.config.error-dev-server-hud/build.config.error-dev-server-hud.spec.js @@ -18,13 +18,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-dev-server-hud/greenwood.config.js b/packages/cli/test/cases/build.config.error-dev-server-hud/greenwood.config.js index c3a8390e2..ff000bfdc 100644 --- a/packages/cli/test/cases/build.config.error-dev-server-hud/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-dev-server-hud/greenwood.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { devServer: { hud: 1234 } diff --git a/packages/cli/test/cases/build.config.error-mode/build.config.error-mode.spec.js b/packages/cli/test/cases/build.config.error-mode/build.config.error-mode.spec.js index 97ff2d100..62bda0639 100644 --- a/packages/cli/test/cases/build.config.error-mode/build.config.error-mode.spec.js +++ b/packages/cli/test/cases/build.config.error-mode/build.config.error-mode.spec.js @@ -16,13 +16,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(function() { diff --git a/packages/cli/test/cases/build.config.error-mode/greenwood.config.js b/packages/cli/test/cases/build.config.error-mode/greenwood.config.js index 92ceb3337..ee0435bb1 100644 --- a/packages/cli/test/cases/build.config.error-mode/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-mode/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { mode: 'loremipsum' }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.error-optimization/build.config.error-optimization.spec.js b/packages/cli/test/cases/build.config.error-optimization/build.config.error-optimization.spec.js index b6efe40c7..f1cc86cfc 100644 --- a/packages/cli/test/cases/build.config.error-optimization/build.config.error-optimization.spec.js +++ b/packages/cli/test/cases/build.config.error-optimization/build.config.error-optimization.spec.js @@ -16,13 +16,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-optimization/greenwood.config.js b/packages/cli/test/cases/build.config.error-optimization/greenwood.config.js index ee49cb180..04baf79d3 100644 --- a/packages/cli/test/cases/build.config.error-optimization/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-optimization/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { optimization: 'loremipsum' }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.error-pages-directory/build.config.error-pages-directory.spec.js b/packages/cli/test/cases/build.config.error-pages-directory/build.config.error-pages-directory.spec.js index 2cecd5b97..c6f08f0d8 100644 --- a/packages/cli/test/cases/build.config.error-pages-directory/build.config.error-pages-directory.spec.js +++ b/packages/cli/test/cases/build.config.error-pages-directory/build.config.error-pages-directory.spec.js @@ -16,13 +16,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-pages-directory/greenwood.config.js b/packages/cli/test/cases/build.config.error-pages-directory/greenwood.config.js index 6cbe4371b..2e4b30fda 100644 --- a/packages/cli/test/cases/build.config.error-pages-directory/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-pages-directory/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { pagesDirectory: {} }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.error-prerender/build.config.error-prerender.spec.js b/packages/cli/test/cases/build.config.error-prerender/build.config.error-prerender.spec.js index 18b05b917..01954fa76 100644 --- a/packages/cli/test/cases/build.config.error-prerender/build.config.error-prerender.spec.js +++ b/packages/cli/test/cases/build.config.error-prerender/build.config.error-prerender.spec.js @@ -16,13 +16,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-prerender/greenwood.config.js b/packages/cli/test/cases/build.config.error-prerender/greenwood.config.js index e658b0c4a..97c887a61 100644 --- a/packages/cli/test/cases/build.config.error-prerender/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-prerender/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { prerender: {} }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.error-templates-directory/build.config.error-templates-directory.spec.js b/packages/cli/test/cases/build.config.error-templates-directory/build.config.error-templates-directory.spec.js index 28cdcf963..9ce122b05 100644 --- a/packages/cli/test/cases/build.config.error-templates-directory/build.config.error-templates-directory.spec.js +++ b/packages/cli/test/cases/build.config.error-templates-directory/build.config.error-templates-directory.spec.js @@ -16,13 +16,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-templates-directory/greenwood.config.js b/packages/cli/test/cases/build.config.error-templates-directory/greenwood.config.js index 79e53d832..b8e6daaba 100644 --- a/packages/cli/test/cases/build.config.error-templates-directory/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-templates-directory/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { templatesDirectory: {} }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.error-title/build.config.error-title.spec.js b/packages/cli/test/cases/build.config.error-title/build.config.error-title.spec.js index 09274efee..dec240428 100644 --- a/packages/cli/test/cases/build.config.error-title/build.config.error-title.spec.js +++ b/packages/cli/test/cases/build.config.error-title/build.config.error-title.spec.js @@ -16,13 +16,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-title/greenwood.config.js b/packages/cli/test/cases/build.config.error-title/greenwood.config.js index e76c49235..ca9bfb644 100644 --- a/packages/cli/test/cases/build.config.error-title/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-title/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { title: {} }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.error-workspace-absolute/build.config.error-workspace-absolute.spec.js b/packages/cli/test/cases/build.config.error-workspace-absolute/build.config.error-workspace-absolute.spec.js index 6c1357d21..e1b101e84 100644 --- a/packages/cli/test/cases/build.config.error-workspace-absolute/build.config.error-workspace-absolute.spec.js +++ b/packages/cli/test/cases/build.config.error-workspace-absolute/build.config.error-workspace-absolute.spec.js @@ -10,19 +10,22 @@ * * User Config * { - * workspace: path.join(__dirname, 'noop') + * workspace: fileURLToPath(new URL('./noop', import.meta.url)) * } * * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-workspace-absolute/greenwood.config.js b/packages/cli/test/cases/build.config.error-workspace-absolute/greenwood.config.js index 29c78a6e1..3c0eb5fe5 100644 --- a/packages/cli/test/cases/build.config.error-workspace-absolute/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-workspace-absolute/greenwood.config.js @@ -1,5 +1,5 @@ -const path = require('path'); +import { fileURLToPath, URL } from 'url'; -module.exports = { - workspace: path.join(__dirname, 'noop') +export default { + workspace: fileURLToPath(new URL('./noop', import.meta.url)) }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.error-workspace/build.config.error-workspace.spec.js b/packages/cli/test/cases/build.config.error-workspace/build.config.error-workspace.spec.js index cc7a7ef0f..75c5a2e3c 100644 --- a/packages/cli/test/cases/build.config.error-workspace/build.config.error-workspace.spec.js +++ b/packages/cli/test/cases/build.config.error-workspace/build.config.error-workspace.spec.js @@ -16,13 +16,16 @@ * User Workspace * Greenwood default */ -const expect = require('chai').expect; -const path = require('path'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import path from 'path'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.error-workspace/greenwood.config.js b/packages/cli/test/cases/build.config.error-workspace/greenwood.config.js index c86f345c3..55a86750e 100644 --- a/packages/cli/test/cases/build.config.error-workspace/greenwood.config.js +++ b/packages/cli/test/cases/build.config.error-workspace/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { workspace: 123 }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.markdown-custom.plugins/build.config.markdown-custom.spec.js b/packages/cli/test/cases/build.config.markdown-custom.plugins/build.config.markdown-custom.spec.js index c95c095ce..daa893302 100644 --- a/packages/cli/test/cases/build.config.markdown-custom.plugins/build.config.markdown-custom.spec.js +++ b/packages/cli/test/cases/build.config.markdown-custom.plugins/build.config.markdown-custom.spec.js @@ -20,17 +20,20 @@ * User Workspace * Greenwood default */ -const { JSDOM } = require('jsdom'); -const path = require('path'); -const expect = require('chai').expect; -const runSmokeTest = require('../../../../../test/smoke-test'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import chai from 'chai'; +import { runSmokeTest } from '../../../../../test/smoke-test.js'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Custom Markdown Configuration and Default Workspace'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(function() { 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 index 9d7d9c31b..4695fe5dd 100644 --- 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 @@ -1,4 +1,4 @@ -module.exports = { +export default { markdown: { settings: {}, plugins: [ diff --git a/packages/cli/test/cases/build.config.markdown-custom.settings/build.config.markdown-custom.settings.spec.js b/packages/cli/test/cases/build.config.markdown-custom.settings/build.config.markdown-custom.settings.spec.js index 425d92bee..94e6c319e 100644 --- a/packages/cli/test/cases/build.config.markdown-custom.settings/build.config.markdown-custom.settings.spec.js +++ b/packages/cli/test/cases/build.config.markdown-custom.settings/build.config.markdown-custom.settings.spec.js @@ -18,16 +18,19 @@ * pages/ * index.md */ -const { JSDOM } = require('jsdom'); -const expect = require('chai').expect; -const path = require('path'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import { JSDOM } from 'jsdom'; +import chai from 'chai'; +import path from 'path'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Custom Markdown Configuration and Custom Workspace'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.markdown-custom.settings/greenwood.config.js b/packages/cli/test/cases/build.config.markdown-custom.settings/greenwood.config.js index 962222712..b9223610a 100644 --- a/packages/cli/test/cases/build.config.markdown-custom.settings/greenwood.config.js +++ b/packages/cli/test/cases/build.config.markdown-custom.settings/greenwood.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { markdown: { settings: { gfm: false } } diff --git a/packages/cli/test/cases/build.config.meta/build.config.meta.spec.js b/packages/cli/test/cases/build.config.meta/build.config.meta.spec.js index 338e97e4b..f23c56a27 100644 --- a/packages/cli/test/cases/build.config.meta/build.config.meta.spec.js +++ b/packages/cli/test/cases/build.config.meta/build.config.meta.spec.js @@ -29,20 +29,23 @@ * hello.md * index.md */ -const fs = require('fs'); -const greenwoodConfig = require('./greenwood.config'); -const { JSDOM } = require('jsdom'); -const path = require('path'); -const expect = require('chai').expect; -const runSmokeTest = require('../../../../../test/smoke-test'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import fs from 'fs'; +import greenwoodConfig from './greenwood.config.js'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import chai from 'chai'; +import { runSmokeTest } from '../../../../../test/smoke-test.js'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Custom Meta Configuration and Nested Workspace'; const meta = greenwoodConfig.meta; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(function() { diff --git a/packages/cli/test/cases/build.config.meta/greenwood.config.js b/packages/cli/test/cases/build.config.meta/greenwood.config.js index 4924ee57f..f76f50cf7 100644 --- a/packages/cli/test/cases/build.config.meta/greenwood.config.js +++ b/packages/cli/test/cases/build.config.meta/greenwood.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { title: 'My Custom Greenwood App', meta: [ { property: 'og:site', content: 'The Greenhouse I/O' }, diff --git a/packages/cli/test/cases/build.config.mode-mpa/build.config.mode-mpa.spec.js b/packages/cli/test/cases/build.config.mode-mpa/build.config.mode-mpa.spec.js index 09e60860a..81edb80bb 100644 --- a/packages/cli/test/cases/build.config.mode-mpa/build.config.mode-mpa.spec.js +++ b/packages/cli/test/cases/build.config.mode-mpa/build.config.mode-mpa.spec.js @@ -20,18 +20,22 @@ * about.md * index.md */ -const expect = require('chai').expect; -const fs = require('fs'); -const glob = require('glob-promise'); -const { JSDOM } = require('jsdom'); -const path = require('path'); -const { getSetupFiles, getDependencyFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import fs from 'fs'; +import glob from 'glob-promise'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import { getSetupFiles, getDependencyFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { runSmokeTest } from '../../../../../test/smoke-test.js'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Custom Mode'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.mode-mpa/greenwood.config.js b/packages/cli/test/cases/build.config.mode-mpa/greenwood.config.js index 646368dd0..f73323893 100644 --- a/packages/cli/test/cases/build.config.mode-mpa/greenwood.config.js +++ b/packages/cli/test/cases/build.config.mode-mpa/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { mode: 'mpa' }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.mode-spa/build.config.mode-spa.spec.js b/packages/cli/test/cases/build.config.mode-spa/build.config.mode-spa.spec.js index 89bc0c8cf..33d6f1f75 100644 --- a/packages/cli/test/cases/build.config.mode-spa/build.config.mode-spa.spec.js +++ b/packages/cli/test/cases/build.config.mode-spa/build.config.mode-spa.spec.js @@ -24,18 +24,21 @@ * index.js * index.html */ -const expect = require('chai').expect; -const glob = require('glob-promise'); -const { JSDOM } = require('jsdom'); -const path = require('path'); -const { getSetupFiles, getDependencyFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const runSmokeTest = require('../../../../../test/smoke-test'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import glob from 'glob-promise'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import { getSetupFiles, getDependencyFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { runSmokeTest } from '../../../../../test/smoke-test.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Custom Mode'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { diff --git a/packages/cli/test/cases/build.config.mode-spa/greenwood.config.js b/packages/cli/test/cases/build.config.mode-spa/greenwood.config.js index e6a5066b7..dc5d78556 100644 --- a/packages/cli/test/cases/build.config.mode-spa/greenwood.config.js +++ b/packages/cli/test/cases/build.config.mode-spa/greenwood.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { title: 'this is the wrong title', mode: 'spa' }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.mode-spa/package.json b/packages/cli/test/cases/build.config.mode-spa/package.json index c649d107f..bc59f2ff5 100644 --- a/packages/cli/test/cases/build.config.mode-spa/package.json +++ b/packages/cli/test/cases/build.config.mode-spa/package.json @@ -1,4 +1,5 @@ { + "type": "module", "dependencies": { "lit": "^2.0.0", "lit-redux-router": "~0.20.0", diff --git a/packages/cli/test/cases/build.config.optimization-default/build.config-optimization-default.spec.js b/packages/cli/test/cases/build.config.optimization-default/build.config-optimization-default.spec.js index ed4ea5b56..f9a630249 100644 --- a/packages/cli/test/cases/build.config.optimization-default/build.config-optimization-default.spec.js +++ b/packages/cli/test/cases/build.config.optimization-default/build.config-optimization-default.spec.js @@ -19,17 +19,20 @@ * styles/ * theme.css */ -const expect = require('chai').expect; -const glob = require('glob-promise'); -const { JSDOM } = require('jsdom'); -const path = require('path'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import glob from 'glob-promise'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Default Optimization Configuration'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(function() { diff --git a/packages/cli/test/cases/build.config.optimization-inline/build.config-optimization-inline.spec.js b/packages/cli/test/cases/build.config.optimization-inline/build.config-optimization-inline.spec.js index a1eec7444..9434b6f1c 100644 --- a/packages/cli/test/cases/build.config.optimization-inline/build.config-optimization-inline.spec.js +++ b/packages/cli/test/cases/build.config.optimization-inline/build.config-optimization-inline.spec.js @@ -22,17 +22,20 @@ * styles/ * theme.css */ -const expect = require('chai').expect; -const glob = require('glob-promise'); -const { JSDOM } = require('jsdom'); -const path = require('path'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import glob from 'glob-promise'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Inline Optimization Configuration'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { @@ -136,7 +139,7 @@ describe('Build Greenwood With: ', function() { // one for puppeteer expect(styleTags.length).to.be.equal(2); - expect(styleTags[1].textContent).to.be.contain('*{margin:0;padding:0;font-family:Comic Sans,sans-serif}'); + expect(styleTags[1].textContent).to.be.contain('*{font-family:Comic Sans,sans-serif;margin:0;padding:0}'); }); }); }); diff --git a/packages/cli/test/cases/build.config.optimization-inline/greenwood.config.js b/packages/cli/test/cases/build.config.optimization-inline/greenwood.config.js index 2384dd687..5235a582e 100644 --- a/packages/cli/test/cases/build.config.optimization-inline/greenwood.config.js +++ b/packages/cli/test/cases/build.config.optimization-inline/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { optimization: 'inline' }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.optimization-none/build.config-optimization-none.spec.js b/packages/cli/test/cases/build.config.optimization-none/build.config-optimization-none.spec.js index e00ebd566..b098cd197 100644 --- a/packages/cli/test/cases/build.config.optimization-none/build.config-optimization-none.spec.js +++ b/packages/cli/test/cases/build.config.optimization-none/build.config-optimization-none.spec.js @@ -22,18 +22,21 @@ * styles/ * theme.css */ -const expect = require('chai').expect; -const fs = require('fs'); -const glob = require('glob-promise'); -const { JSDOM } = require('jsdom'); -const path = require('path'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import fs from 'fs'; +import glob from 'glob-promise'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'None Optimization Configuration'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(function() { diff --git a/packages/cli/test/cases/build.config.optimization-none/greenwood.config.js b/packages/cli/test/cases/build.config.optimization-none/greenwood.config.js index 41b1c4362..0801fdef5 100644 --- a/packages/cli/test/cases/build.config.optimization-none/greenwood.config.js +++ b/packages/cli/test/cases/build.config.optimization-none/greenwood.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { optimization: 'none' }; \ No newline at end of file diff --git a/packages/cli/test/cases/build.config.optimization-overrides/build.config-optimization-overrides.spec.js b/packages/cli/test/cases/build.config.optimization-overrides/build.config-optimization-overrides.spec.js index 45acf3130..1a01f9479 100644 --- a/packages/cli/test/cases/build.config.optimization-overrides/build.config-optimization-overrides.spec.js +++ b/packages/cli/test/cases/build.config.optimization-overrides/build.config-optimization-overrides.spec.js @@ -21,17 +21,20 @@ * styles/ * theme.css */ -const expect = require('chai').expect; -const glob = require('glob-promise'); -const { JSDOM } = require('jsdom'); -const path = require('path'); -const { getSetupFiles, getOutputTeardownFiles } = require('../../../../../test/utils'); -const Runner = require('gallinago').Runner; +import chai from 'chai'; +import glob from 'glob-promise'; +import { JSDOM } from 'jsdom'; +import path from 'path'; +import { getSetupFiles, getOutputTeardownFiles } from '../../../../../test/utils.js'; +import { Runner } from 'gallinago'; +import { fileURLToPath, URL } from 'url'; + +const expect = chai.expect; describe('Build Greenwood With: ', function() { const LABEL = 'Optimization Overrides'; const cliPath = path.join(process.cwd(), 'packages/cli/src/index.js'); - const outputPath = __dirname; + const outputPath = fileURLToPath(new URL('.', import.meta.url)); let runner; before(async function() { @@ -165,7 +168,7 @@ describe('Build Greenwood With: ', function() { it('should have an inline