Skip to content

Commit 6aeb802

Browse files
authored
Split statuses code into several files (#1288)
1 parent aaf423f commit 6aeb802

File tree

8 files changed

+142
-139
lines changed

8 files changed

+142
-139
lines changed

packages/build/src/core/commands.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ const { pipeOutput, unpipeOutput } = require('../log/stream')
1212
const { startTimer, endTimer } = require('../log/timer')
1313
const { EVENTS } = require('../plugins/events')
1414
const { callChild } = require('../plugins/ipc')
15-
16-
const { getSuccessStatus, addStatus } = require('./status')
15+
const { getSuccessStatus, addStatus } = require('../status/add')
1716

1817
// Get commands for all events
1918
const getCommands = function(pluginsCommands, netlifyConfig) {

packages/build/src/core/main.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ const { startUtils } = require('../plugins/child/utils')
2121
const { loadPlugins } = require('../plugins/load')
2222
const { getPluginsOptions } = require('../plugins/options')
2323
const { startPlugins, stopPlugins } = require('../plugins/spawn')
24+
const { reportStatuses } = require('../status/report')
2425
const { trackBuildComplete } = require('../telemetry/complete')
2526

2627
const { getCommands, runCommands } = require('./commands')
2728
const { normalizeFlags, loadConfig } = require('./config')
2829
const { doDryRun } = require('./dry')
29-
const { reportStatuses } = require('./status')
3030

3131
/**
3232
* Netlify Build

packages/build/src/core/status.js

-134
This file was deleted.

packages/build/src/plugins/load.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { reportPluginLoadError } = require('../core/status')
1+
const { reportPluginLoadError } = require('../status/report')
22

33
const { callChild } = require('./ipc')
44

packages/build/src/plugins/manifest/main.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { reportPluginLoadError } = require('../../core/status')
1+
const { reportPluginLoadError } = require('../../status/report')
22

33
const { checkInputs } = require('./check')
44
const { loadManifest } = require('./load')

packages/build/src/status/add.js

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// The last event handler of a plugin (except for `onError` and `onEnd`)
2+
// defaults to `utils.status.show({ state: 'success' })` without any `summary`.
3+
const getSuccessStatus = function(newStatus, { commands, event, package }) {
4+
if (newStatus === undefined && isLastMainCommand({ commands, event, package })) {
5+
return IMPLICIT_STATUS
6+
}
7+
8+
return newStatus
9+
}
10+
11+
const isLastMainCommand = function({ commands, event, package }) {
12+
const mainCommands = commands.filter(command => command.package === package && isMainCommand(command))
13+
return mainCommands.length === 0 || mainCommands[mainCommands.length - 1].event === event
14+
}
15+
16+
const isMainCommand = function({ event }) {
17+
return event !== 'onEnd' && event !== 'onError'
18+
}
19+
20+
const IMPLICIT_STATUS = { state: 'success', implicit: true }
21+
22+
// Merge plugin status to the list of plugin statuses.
23+
const addStatus = function({ newStatus, statuses, event, package, packageJson: { version } = {} }) {
24+
// Either:
25+
// - `build.command`
26+
// - no status was set
27+
if (newStatus === undefined) {
28+
return statuses
29+
}
30+
31+
const formerStatus = statuses.find(status => status.package === package)
32+
if (!canOverrideStatus(formerStatus, newStatus)) {
33+
return statuses
34+
}
35+
36+
// Overrides plugin's previous status and add more information
37+
const newStatuses = statuses.filter(status => status !== formerStatus)
38+
return [...newStatuses, { ...newStatus, event, package, version }]
39+
}
40+
41+
const canOverrideStatus = function(formerStatus, newStatus) {
42+
// No previous status
43+
if (formerStatus === undefined) {
44+
return true
45+
}
46+
47+
// Implicit statuses can never override
48+
if (newStatus.implicit) {
49+
return false
50+
}
51+
52+
// Error statuses can only be overwritten by other error statuses
53+
return formerStatus.state === 'success' || newStatus.state !== 'success'
54+
}
55+
56+
module.exports = { getSuccessStatus, addStatus }

packages/build/src/status/colors.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const stripAnsi = require('strip-ansi')
2+
3+
// Remove colors from statuses
4+
const removeStatusesColors = function(statuses) {
5+
return statuses.map(removeStatusColors)
6+
}
7+
8+
const removeStatusColors = function(status) {
9+
const attributes = COLOR_ATTRIBUTES.map(attribute => removeAttrColor(status, attribute))
10+
return Object.assign({}, status, ...attributes)
11+
}
12+
13+
const COLOR_ATTRIBUTES = ['title', 'summary', 'text']
14+
15+
const removeAttrColor = function(status, attribute) {
16+
const value = status[attribute]
17+
if (value === undefined) {
18+
return {}
19+
}
20+
21+
const valueA = stripAnsi(value)
22+
return { [attribute]: valueA }
23+
}
24+
25+
module.exports = { removeStatusesColors }

packages/build/src/status/report.js

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
const { env } = require('process')
2+
3+
const { serializeErrorStatus } = require('../error/parse/serialize_status')
4+
const { logStatuses } = require('../log/main')
5+
6+
const { removeStatusesColors } = require('./colors')
7+
8+
// Errors that happen during plugin loads should be reported as error statuses
9+
const reportPluginLoadError = async function({ error, api, mode, event, package, version }) {
10+
const errorStatus = serializeErrorStatus(error)
11+
const statuses = [{ ...errorStatus, event, package, version }]
12+
await reportStatuses(statuses, api, mode)
13+
}
14+
15+
const reportStatuses = async function(statuses, api, mode) {
16+
const statusesA = removeStatusesColors(statuses)
17+
printStatuses(statusesA, mode)
18+
await sendStatuses(statusesA, api, mode)
19+
}
20+
21+
// When not in production, print statuses to console.
22+
// Only print successful ones, since errors are logged afterwards.
23+
const printStatuses = function(statuses, mode) {
24+
if (mode === 'buildbot') {
25+
return
26+
}
27+
28+
const successStatuses = statuses.filter(shouldPrintStatus)
29+
30+
if (successStatuses.length === 0) {
31+
return
32+
}
33+
34+
logStatuses(successStatuses)
35+
}
36+
37+
const shouldPrintStatus = function({ state, summary }) {
38+
return state === 'success' && summary !== undefined
39+
}
40+
41+
// In production, send statuses to the API
42+
const sendStatuses = async function(statuses, api, mode) {
43+
if ((mode !== 'buildbot' && env.NETLIFY_BUILD_TEST_STATUS !== '1') || api === undefined || !env.DEPLOY_ID) {
44+
return
45+
}
46+
47+
await Promise.all(statuses.map(status => sendStatus(api, status)))
48+
}
49+
50+
const sendStatus = async function(api, { package, version, state, event, title, summary, text }) {
51+
await api.createPluginRun({
52+
deploy_id: env.DEPLOY_ID,
53+
body: { package, version, state, reporting_event: event, title, summary, text },
54+
})
55+
}
56+
57+
module.exports = { reportPluginLoadError, reportStatuses }

0 commit comments

Comments
 (0)