diff --git a/.changeset/thick-kiwis-serve.md b/.changeset/thick-kiwis-serve.md new file mode 100644 index 000000000..fe28595ed --- /dev/null +++ b/.changeset/thick-kiwis-serve.md @@ -0,0 +1,5 @@ +--- +'preact-cli': patch +--- + +Uses native FS promise API rather than promisifying manually diff --git a/packages/cli/lib/commands/create.js b/packages/cli/lib/commands/create.js index 84801bd2e..ab412b6da 100644 --- a/packages/cli/lib/commands/create.js +++ b/packages/cli/lib/commands/create.js @@ -3,7 +3,8 @@ const { promisify } = require('util'); const fetch = require('isomorphic-unfetch'); const glob = promisify(require('glob').glob); const gittar = require('gittar'); -const fs = require('../fs'); +const { existsSync, mkdirSync } = require('fs'); +const { copyFile, mkdir, readFile, writeFile } = require('fs').promises; const os = require('os'); const { green } = require('kleur'); const { resolve, join } = require('path'); @@ -148,7 +149,7 @@ async function updateTemplatesCache() { try { const repos = await fetch(TEMPLATES_REPO_URL).then(r => r.json()); - await fs.writeFile(cacheFilePath, JSON.stringify(repos, null, 2), 'utf-8'); + await writeFile(cacheFilePath, JSON.stringify(repos, null, 2), 'utf-8'); } catch (err) { error(`\nFailed to update template cache\n ${err}`); } @@ -168,14 +169,14 @@ async function fetchTemplates() { info('Fetching official templates:\n'); // check if `.cache` folder exists or not, and create if does not exists - if (!fs.existsSync(cacheFolder)) { - await fs.mkdir(cacheFolder); + if (!existsSync(cacheFolder)) { + await mkdir(cacheFolder); } // If cache file doesn't exist, then hit the API and fetch the data - if (!fs.existsSync(cacheFilePath)) { + if (!existsSync(cacheFilePath)) { const repos = await fetch(TEMPLATES_REPO_URL).then(r => r.json()); - await fs.writeFile( + await writeFile( cacheFilePath, JSON.stringify(repos, null, 2), 'utf-8' @@ -186,7 +187,7 @@ async function fetchTemplates() { updateTemplatesCache(); // fetch the API response from cache file - const templatesFromCache = await fs.readFile(cacheFilePath, 'utf-8'); + const templatesFromCache = await readFile(cacheFilePath, 'utf-8'); const parsedTemplates = JSON.parse(templatesFromCache); const officialTemplates = normalizeTemplatesResponse(parsedTemplates || []); @@ -200,8 +201,8 @@ async function fetchTemplates() { } async function copyFileToDestination(srcPath, destPath, force = false) { - if (!fs.existsSync(destPath) || force) { - await fs.copyFile(srcPath, destPath); + if (!existsSync(destPath) || force) { + await copyFile(srcPath, destPath); } } @@ -269,8 +270,8 @@ async function command(repo, dest, argv) { info(`Assuming you meant ${repo}...`); } - if (!fs.existsSync(resolve(cwd, dest, 'src'))) { - fs.mkdirSync(resolve(cwd, dest, 'src'), { recursive: true }); + if (!existsSync(resolve(cwd, dest, 'src'))) { + mkdirSync(resolve(cwd, dest, 'src'), { recursive: true }); } // Attempt to fetch the `template` @@ -330,11 +331,11 @@ async function command(repo, dest, argv) { entry, enc = 'utf8'; for (entry of keeps) { - buf = await fs.readFile(entry, enc); + buf = await readFile(entry, enc); dict.forEach((v, k) => { buf = buf.replace(k, v); }); - await fs.writeFile(entry, buf, enc); + await writeFile(entry, buf, enc); } } else { return error(`No \`template\` directory found within ${repo}!`, 1); @@ -347,7 +348,7 @@ async function command(repo, dest, argv) { pkgFile = resolve(target, 'package.json'); if (pkgFile) { - pkgData = JSON.parse(await fs.readFile(pkgFile)); + pkgData = JSON.parse(await readFile(pkgFile)); // Write default "scripts" if none found pkgData.scripts = pkgData.scripts || (await addScripts(pkgData, target, isYarn)); @@ -362,12 +363,12 @@ async function command(repo, dest, argv) { } // Find a `manifest.json`; use the first match, if any let files = await glob(target + '/**/manifest.json'); - let manifest = files[0] && JSON.parse(await fs.readFile(files[0])); + let manifest = files[0] && JSON.parse(await readFile(files[0])); if (manifest) { spinner.text = 'Updating `name` within `manifest.json` file'; manifest.name = manifest.short_name = argv.name; // Write changes to `manifest.json` - await fs.writeFile(files[0], JSON.stringify(manifest, null, 2)); + await writeFile(files[0], JSON.stringify(manifest, null, 2)); if (argv.name.length > 12) { // @see https://developer.chrome.com/extensions/manifest/name#short_name process.stdout.write('\n'); @@ -377,7 +378,7 @@ async function command(repo, dest, argv) { if (pkgData) { // Assume changes were made ¯\_(ツ)_/¯ - await fs.writeFile(pkgFile, JSON.stringify(pkgData, null, 2)); + await writeFile(pkgFile, JSON.stringify(pkgData, null, 2)); } const sourceDirectory = join(resolve(cwd, dest), 'src'); diff --git a/packages/cli/lib/fs.js b/packages/cli/lib/fs.js deleted file mode 100644 index 8ec821efc..000000000 --- a/packages/cli/lib/fs.js +++ /dev/null @@ -1,22 +0,0 @@ -const { - mkdir, - mkdirSync, - readFile, - writeFile, - copyFile, - stat, - statSync, - existsSync, -} = require('fs'); -const { promisify } = require('util'); - -module.exports = { - mkdir: promisify(mkdir), - mkdirSync, - copyFile: promisify(copyFile), - readFile: promisify(readFile), - writeFile: promisify(writeFile), - stat: promisify(stat), - statSync, - existsSync, -}; diff --git a/packages/cli/lib/lib/webpack/run-webpack.js b/packages/cli/lib/lib/webpack/run-webpack.js index d8818ebb7..531c9dedc 100644 --- a/packages/cli/lib/lib/webpack/run-webpack.js +++ b/packages/cli/lib/lib/webpack/run-webpack.js @@ -3,7 +3,7 @@ const webpack = require('webpack'); const getPort = require('get-port'); const { resolve } = require('path'); const clear = require('console-clear'); -const { writeFile } = require('../../fs'); +const { writeFile } = require('fs').promises; const { bold, red, green, magenta } = require('kleur'); const DevServer = require('webpack-dev-server'); const clientConfig = require('./webpack-client-config'); diff --git a/packages/cli/lib/lib/webpack/transform-config.js b/packages/cli/lib/lib/webpack/transform-config.js index 7a5afdc3a..efea27ff8 100644 --- a/packages/cli/lib/lib/webpack/transform-config.js +++ b/packages/cli/lib/lib/webpack/transform-config.js @@ -1,6 +1,7 @@ const { resolve } = require('path'); const webpack = require('webpack'); -const fs = require('../../fs'); +const { statSync } = require('fs'); +const { stat } = require('fs').promises; const { error } = require('../../util'); const FILE = 'preact.config'; @@ -12,7 +13,7 @@ async function findConfig(env) { let config = `${FILE}.${EXTENSIONS[idx]}`; let path = resolve(env.cwd, config); try { - await fs.stat(path); + await stat(path); return { configFile: config, isDefault: true }; } catch (e) {} } @@ -99,7 +100,7 @@ module.exports = async function (env, webpackConfig, isServer = false) { let myConfig = resolve(env.cwd, env.config); try { - await fs.stat(myConfig); + await stat(myConfig); } catch (e) { if (isDefault) return; throw new Error( @@ -285,7 +286,7 @@ class WebpackConfigHelpers { setHtmlTemplate(config, template) { let isPath; try { - fs.statSync(template); + statSync(template); isPath = true; } catch (e) {} diff --git a/packages/cli/tests/build.test.js b/packages/cli/tests/build.test.js index 9235007e6..fa0b8c56c 100644 --- a/packages/cli/tests/build.test.js +++ b/packages/cli/tests/build.test.js @@ -1,9 +1,9 @@ const { join } = require('path'); -const { readFile } = require('../lib/fs'); +const { existsSync } = require('fs'); +const { readFile } = require('fs').promises; const looksLike = require('html-looks-like'); const { create, build } = require('./lib/cli'); const { snapshot, hasKey, isWithin } = require('./lib/utils'); -const { existsSync } = require('fs'); const { subject } = require('./lib/output'); const images = require('./images/build'); const { promisify } = require('util'); diff --git a/packages/cli/tests/create.test.js b/packages/cli/tests/create.test.js index 5533da4f0..d05d6c346 100644 --- a/packages/cli/tests/create.test.js +++ b/packages/cli/tests/create.test.js @@ -1,4 +1,4 @@ -const fs = require('fs'); +const { readFileSync } = require('fs'); const { relative, resolve } = require('path'); const { create } = require('./lib/cli'); const { expand } = require('./lib/utils'); @@ -24,7 +24,7 @@ describe('preact create', () => { let dir = await create('netlify'); const templateFilePath = resolve(__dirname, dir, 'src', 'template.html'); - const template = fs.readFileSync(templateFilePath).toString('utf8'); + const template = readFileSync(templateFilePath).toString('utf8'); expect(template.includes('twitter:card')).toEqual(true); }); @@ -33,7 +33,7 @@ describe('preact create', () => { let dir = await create('simple'); const templateFilePath = resolve(__dirname, dir, 'src', 'template.html'); - const template = fs.readFileSync(templateFilePath).toString('utf8'); + const template = readFileSync(templateFilePath).toString('utf8'); expect(template.includes('apple-touch-icon')).toEqual(true); }); diff --git a/packages/cli/tests/lib/utils.js b/packages/cli/tests/lib/utils.js index fe2a43ee2..e92949f8f 100644 --- a/packages/cli/tests/lib/utils.js +++ b/packages/cli/tests/lib/utils.js @@ -1,6 +1,6 @@ /* eslint-disable no-console */ const { relative, resolve } = require('path'); -const { stat } = require('../../lib/fs'); +const { stat } = require('fs').promises; const minimatch = require('minimatch'); const pRetry = require('p-retry'); const { promisify } = require('util'); diff --git a/packages/cli/tests/service-worker.test.js b/packages/cli/tests/service-worker.test.js index acaf2fc4c..6c443b6fd 100644 --- a/packages/cli/tests/service-worker.test.js +++ b/packages/cli/tests/service-worker.test.js @@ -1,6 +1,6 @@ const { join } = require('path'); +const { readFile, writeFile } = require('fs').promises; const { create, build } = require('./lib/cli'); -const { readFile, writeFile } = require('../lib/fs'); const { sleep } = require('./lib/utils'); const { getServer } = require('./server'); const startChrome = require('./lib/chrome'); diff --git a/packages/cli/tests/watch.test.js b/packages/cli/tests/watch.test.js index 6979d4909..6499d537b 100644 --- a/packages/cli/tests/watch.test.js +++ b/packages/cli/tests/watch.test.js @@ -1,4 +1,4 @@ -const fs = require('../lib/fs'); +const { readFile, writeFile } = require('fs').promises; const { resolve } = require('path'); const startChrome = require('./lib/chrome'); const { create, watch } = require('./lib/cli'); @@ -22,9 +22,9 @@ describe('preact', () => { let page = await loadPage(chrome, 'http://127.0.0.1:8083/'); let header = resolve(app, './src/components/header/index.js'); - let original = await fs.readFile(header, 'utf8'); + let original = await readFile(header, 'utf8'); let update = original.replace('