Update build feedback with dots indicating activity (#8382)

* Add progress for analyzing and auto-prerendering

* Add typing for tty-aware-progress and use stdout

* Add fancier spinners

* Update spinner and add handling for logs while spinning

* Remove un-needed types package

* Remove progress and combine analyzing/prerendering messages
This commit is contained in:
JJ Kasper 2019-09-16 10:37:00 -05:00 committed by Tim Neutkens
parent 44bbf9ad27
commit 204028d6ab
6 changed files with 144 additions and 13 deletions

View file

@ -69,6 +69,7 @@
"@babel/preset-react": "7.0.0",
"@mdx-js/loader": "0.18.0",
"@types/jest": "24.0.13",
"@types/ora": "3.2.0",
"@types/string-hash": "1.1.1",
"@zeit/next-css": "1.0.2-canary.2",
"@zeit/next-sass": "1.0.2-canary.2",

View file

@ -39,6 +39,7 @@ import {
import getBaseWebpackConfig from './webpack-config'
import { getPageChunks } from './webpack/plugins/chunk-graph-plugin'
import { writeBuildId } from './write-build-id'
import createSpinner from './spinner'
const fsUnlink = promisify(fs.unlink)
const fsRmdir = promisify(fs.rmdir)
@ -69,8 +70,9 @@ export default async function build(dir: string, conf = null): Promise<void> {
recordNextPlugins(path.resolve(dir))
)
console.log('Creating an optimized production build ...')
console.log()
const buildSpinner = createSpinner({
prefixText: 'Creating an optimized production build',
})
const config = loadConfig(PHASE_PRODUCTION_BUILD, dir, conf)
const { target } = config
@ -158,6 +160,10 @@ export default async function build(dir: string, conf = null): Promise<void> {
}
const webpackBuildEnd = process.hrtime(webpackBuildStart)
if (buildSpinner) {
buildSpinner.stopAndPersist()
}
console.log()
result = formatWebpackMessages(result)
@ -206,6 +212,11 @@ export default async function build(dir: string, conf = null): Promise<void> {
)
}
const postBuildSpinner = createSpinner({
prefixText: 'Automatically optimizing pages',
})
const distPath = path.join(dir, config.distDir)
const pageKeys = Object.keys(mappedPages)
const manifestPath = path.join(
distDir,
@ -405,6 +416,8 @@ export default async function build(dir: string, conf = null): Promise<void> {
await fsRmdir(exportOptions.outdir)
await fsWriteFile(manifestPath, JSON.stringify(pagesManifest), 'utf8')
}
if (postBuildSpinner) postBuildSpinner.stopAndPersist()
console.log()
const analysisEnd = process.hrtime(analysisBegin)
backgroundWork.push(

View file

@ -0,0 +1,58 @@
import ora from 'ora'
const dotsSpinner = {
frames: ['.', '..', '...'],
interval: 200,
}
export default function createSpinner(
text: string | { prefixText: string },
options: ora.Options = {}
) {
let spinner: undefined | ora.Ora
let prefixText = text && typeof text === 'object' && text.prefixText
if (process.stdout.isTTY) {
spinner = ora({
text: typeof text === 'string' ? text : undefined,
prefixText: typeof prefixText === 'string' ? prefixText : undefined,
spinner: dotsSpinner,
stream: process.stdout,
...options,
}).start()
const origLog = console.log
const origWarn = console.warn
const origError = console.error
const origStop = spinner.stop.bind(spinner)
const origStopAndPersist = spinner.stopAndPersist.bind(spinner)
const logHandle = (method: any, args: any[]) => {
origStop()
method(...args)
spinner!.start()
}
console.log = (...args: any) => logHandle(origLog, args)
console.warn = (...args: any) => logHandle(origWarn, args)
console.error = (...args: any) => logHandle(origError, args)
const resetLog = () => {
console.log = origLog
}
spinner.stop = (): ora.Ora => {
origStop()
resetLog()
return spinner!
}
spinner.stopAndPersist = (): ora.Ora => {
origStopAndPersist()
resetLog()
return spinner!
}
} else if (prefixText || text) {
console.log(prefixText || text)
}
return spinner
}

View file

@ -6,7 +6,6 @@ import mkdirpModule from 'mkdirp'
import { resolve, join } from 'path'
import { API_ROUTE } from '../lib/constants'
import { existsSync, readFileSync } from 'fs'
import createProgress from 'tty-aware-progress'
import { recursiveCopy } from '../lib/recursive-copy'
import { recursiveDelete } from '../lib/recursive-delete'
import { formatAmpMessages } from '../build/output/index'
@ -22,9 +21,52 @@ import {
CLIENT_PUBLIC_FILES_PATH,
CLIENT_STATIC_FILES_PATH
} from '../next-server/lib/constants'
import createSpinner from '../build/spinner'
const mkdirp = promisify(mkdirpModule)
const createProgress = (total, label = 'Exporting') => {
let curProgress = 0
let progressSpinner = createSpinner(`${label} (${curProgress}/${total})`, {
spinner: {
frames: [
'[ ]',
'[= ]',
'[== ]',
'[=== ]',
'[ ===]',
'[ ==]',
'[ =]',
'[ ]',
'[ =]',
'[ ==]',
'[ ===]',
'[====]',
'[=== ]',
'[== ]',
'[= ]'
],
interval: 80
}
})
return () => {
curProgress++
const newText = `${label} (${curProgress}/${total})`
if (progressSpinner) {
progressSpinner.text = newText
} else {
console.log(newText)
}
if (curProgress === total && progressSpinner) {
progressSpinner.stop()
console.log(newText)
}
}
}
export default async function (dir, options, configuration) {
function log (message) {
if (options.silent) return

View file

@ -97,6 +97,7 @@
"node-fetch": "2.6.0",
"path-to-regexp": "2.1.0",
"pnp-webpack-plugin": "1.5.0",
"ora": "3.4.0",
"prop-types": "15.7.2",
"prop-types-exact": "1.2.0",
"raw-body": "2.4.0",
@ -108,7 +109,6 @@
"strip-ansi": "5.2.0",
"styled-jsx": "3.2.2",
"terser": "4.0.0",
"tty-aware-progress": "1.0.4",
"unfetch": "4.1.0",
"url": "0.11.0",
"watchpack": "2.0.0-beta.5",

View file

@ -2248,6 +2248,13 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c"
integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==
"@types/ora@3.2.0":
version "3.2.0"
resolved "https://registry.yarnpkg.com/@types/ora/-/ora-3.2.0.tgz#b2f65d1283a8f36d8b0f9ee767e0732a2f429362"
integrity sha512-jll99xUKpiFbIFZSQcxm4numfsLaOWBzWNaRk3PvTSE7BPqTzzOCFmS0mQ7m8qkTfmYhuYbehTGsxkvRLPC++w==
dependencies:
ora "*"
"@types/prompts@2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.0.1.tgz#afae5a8b0616a33cd31557bec74e2fd4a32f4afe"
@ -4022,6 +4029,11 @@ cli-spinners@^1.1.0:
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
cli-spinners@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77"
integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==
cli-truncate@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
@ -10239,6 +10251,18 @@ optjs@~3.2.2:
resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee"
integrity sha1-aabOicRCpEQDFBrS+bNwvVu29O4=
ora@*, ora@3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==
dependencies:
chalk "^2.4.2"
cli-cursor "^2.1.0"
cli-spinners "^2.0.0"
log-symbols "^2.2.0"
strip-ansi "^5.2.0"
wcwidth "^1.0.1"
ora@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ora/-/ora-2.0.0.tgz#8ec3a37fa7bffb54a3a0c188a1f6798e7e1827cd"
@ -11249,7 +11273,7 @@ process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
progress@2.0.3, progress@^2.0.0:
progress@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
@ -12978,7 +13002,7 @@ stringstream@~0.0.5:
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72"
integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==
strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0:
strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@ -13611,13 +13635,6 @@ tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
tty-aware-progress@1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/tty-aware-progress/-/tty-aware-progress-1.0.4.tgz#63564adf7f76a8ec1169f2ae52eaad8129031000"
integrity sha512-ynqjeu8FOAjnv78ku9iHSS9zJB9d4SNPeUAskOsTJfwdpGjJchSVmzngTUQZpg5hXqvE3vWF5FjN5SAHiutA0w==
dependencies:
progress "2.0.3"
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"