Skip to content

Commit a44a436

Browse files
committed
fix(core): prevent exponential build
1 parent a0a0850 commit a44a436

File tree

5 files changed

+41
-61
lines changed

5 files changed

+41
-61
lines changed

packages/smooth-core/package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
"smooth": "./bin/smooth"
3030
},
3131
"peerDependencies": {
32-
"react": ">=16.3.0",
33-
"react-dom": ">=16.3.0"
32+
"react": ">=16.8.0",
33+
"react-dom": ">=16.8.0"
3434
},
3535
"dependencies": {
3636
"@babel/core": "^7.3.3",
@@ -66,7 +66,6 @@
6666
"graphql-tag": "^2.10.1",
6767
"graphql-tools": "^4.0.4",
6868
"humanize-string": "^1.0.2",
69-
"log-update": "^2.3.0",
7069
"merge-deep": "^3.0.2",
7170
"pluralize": "^7.0.0",
7271
"progress-estimator": "^0.2.2",

packages/smooth-core/src/build/index.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ export async function buildSchema({ config }) {
2020
const { schemaDefinition, schema } = await buildSchemaDefinition({ config })
2121
await applyAsyncHook(config, 'onBuild', { schemaDefinition })
2222
const fragmentTypes = await getFragmentTypes({ schema })
23-
cache.writeCacheFile('fragmentTypes.json', JSON.stringify(fragmentTypes))
23+
await cache.writeCacheFile(
24+
'fragmentTypes.json',
25+
JSON.stringify(fragmentTypes),
26+
)
2427
return { schema, fragmentTypes }
2528
}
2629

2730
export function watchSchema({ logger, ...options }) {
28-
const watcher = new Watcher(async () =>
29-
logger(buildSchema(options), 'Schemas'),
30-
)
31+
const watcher = new Watcher(async () => logger(buildSchema(options)))
3132
watchFs(options.config.srcPath, () => watcher.tick())
3233
return watcher
3334
}
@@ -45,7 +46,7 @@ export async function buildWebpack({ config }) {
4546
})
4647
}
4748

48-
export function watchWebpack({ logger, config }) {
49+
export function watchWebpack({ config, logger }) {
4950
const resolver = {
5051
done: result => {
5152
if (resolver.resolve) {
@@ -54,23 +55,26 @@ export function watchWebpack({ logger, config }) {
5455
}
5556
},
5657
task: async () => {
57-
resolver.done()
58+
if (resolver.resolve) return
5859
resolver.promise = new Promise(resolve => {
5960
resolver.resolve = resolve
6061
})
61-
return logger(resolver.promise, 'Webpack')
62+
return logger(resolver.promise)
6263
},
6364
}
6465

6566
const watcher = new Watcher(resolver.task)
67+
watcher.tick()
6668

6769
const middleware = webpackMiddleware({ config }, compiler => {
6870
compiler.hooks.done.tap('smooth', (compiler, stats) => {
6971
resolver.done(stats)
7072
})
71-
compiler.hooks.invalid.tap('smooth', () => watcher.tick())
72-
compiler.hooks.run.tap('smooth', () => watcher.tick())
73-
compiler.hooks.watchRun.tap('smooth', () => watcher.tick())
73+
compiler.hooks.invalid.tap('smooth', (filename, changeTime) => {
74+
if (!filename.match(/\/\.smooth\//)) {
75+
watcher.tick()
76+
}
77+
})
7478
})
7579

7680
watcher.middleware = middleware

packages/smooth-core/src/build/webpackMiddleware.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const ignored = ['.git', /\/\.smooth\//, 'node_modules']
2+
13
export default function webpackMiddleware({ config }, onCreateCompiler) {
24
const webpackDevMiddleware = require('webpack-dev-middleware')
35
const webpackHotMiddleware = require('webpack-hot-middleware')
@@ -9,8 +11,9 @@ export default function webpackMiddleware({ config }, onCreateCompiler) {
911
const devMiddlewareInstance = webpackDevMiddleware(
1012
compiler,
1113
config.webpackDevMiddleware({
12-
logLevel: 'error',
1314
publicPath: '/web/static/',
15+
logLevel: 'error',
16+
watchOptions: { ignored, aggregateTimeout: 300 },
1417
writeToDisk(filePath) {
1518
return /node\/static/.test(filePath) || /loadable-stats/.test(filePath)
1619
},

packages/smooth-core/src/cli/index.js

Lines changed: 18 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/* eslint-disable no-console */
22
import path from 'path'
33
import program from 'commander'
4-
import logUpdate from 'log-update'
54
import createLogger from 'progress-estimator'
65
import { getConfig } from '../config'
76
import { start } from '../server'
@@ -13,50 +12,30 @@ import {
1312
buildWebpack,
1413
} from '../build'
1514

16-
let stdout = `Smooth CMS 👨‍🚀
17-
18-
19-
20-
21-
`
22-
function createCustomLogFunction(line) {
23-
function logFunction(str) {
24-
const lines = stdout.split('\n')
25-
lines[line] = str
26-
stdout = lines.join('\n')
27-
logUpdate(stdout)
28-
}
29-
30-
logFunction.clear = logUpdate.clear
31-
logFunction.done = () => {}
32-
return logFunction
33-
}
34-
35-
function createCustomLogger(line) {
36-
return createLogger({ logFunction: createCustomLogFunction(line) })
37-
}
15+
const logger = createLogger()
3816

3917
function watch({ config }) {
18+
let webpackWatcher
19+
4020
const schemaWatcher = watchSchema({
4121
config,
42-
logger: createCustomLogger(2),
22+
logger: promise => logger(promise, 'Build schemas'),
4323
})
4424

45-
const logServer = createCustomLogFunction(5)
46-
47-
let count = 0
48-
function done() {
49-
count += 1
50-
if (count === 2) {
51-
logServer('Project ready 🚀')
52-
}
53-
}
54-
5525
schemaWatcher.on('done', ({ schema, fragmentTypes }) => {
56-
const webpackWatcher = watchWebpack({
57-
config,
58-
logger: createCustomLogger(3),
59-
})
26+
if (!webpackWatcher) {
27+
webpackWatcher = watchWebpack({
28+
config,
29+
logger: promise => logger(promise, 'Build webpack'),
30+
})
31+
32+
webpackWatcher.once('done', () => {
33+
console.log('🚀 Ready on http://localhost:3000')
34+
})
35+
36+
// eslint-disable-next-line no-console
37+
webpackWatcher.on('error', console.error)
38+
}
6039

6140
start({
6241
dev: true,
@@ -65,13 +44,8 @@ function watch({ config }) {
6544
config,
6645
webpackMiddleware: webpackWatcher.middleware,
6746
})
68-
69-
webpackWatcher.on('done', done)
70-
// eslint-disable-next-line no-console
71-
webpackWatcher.on('error', console.error)
7247
})
7348

74-
schemaWatcher.on('done', done)
7549
// eslint-disable-next-line no-console
7650
schemaWatcher.on('error', console.error)
7751
}
@@ -84,8 +58,8 @@ function clearConsole() {
8458

8559
async function devCommand() {
8660
clearConsole()
61+
console.log('> smooth.js 👨‍🚀')
8762
const config = await getConfig({ dev: true })
88-
logUpdate.done()
8963
watch({ config })
9064
}
9165

yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5547,9 +5547,9 @@ https-proxy-agent@^2.2.1:
55475547
debug "^3.1.0"
55485548

55495549
humanize-duration@^3.15.3:
5550-
version "3.16.0"
5551-
resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.16.0.tgz#c7ec3b898305f007c63893f891870b2b5a2e0a7d"
5552-
integrity sha512-LDnNSe8EkJjhRsijWgUK12UK7ivbCww2R3LW9quKdBDoQjeAewqnGHch5AJTCOny1cPLhnXTzvniXVP3B9O6Ew==
5550+
version "3.17.0"
5551+
resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.17.0.tgz#a2cec75f9329ce68f8797b23d31d1f988992d11b"
5552+
integrity sha512-9em7CXFa0my1DF3aIQg0sTRyAX2znEOMHolUvu9nSTUjS+bRD32y0MH+Hnm3Xu0cSWrxpYb2isXSfH9pF2LP8g==
55535553

55545554
humanize-ms@^1.2.1:
55555555
version "1.2.1"

0 commit comments

Comments
 (0)