@netlify/build 28.0.0-beta → 28.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/bin.js +5 -0
  2. package/lib/core/bin.js +66 -0
  3. package/lib/core/build.js +355 -0
  4. package/lib/core/config.js +121 -0
  5. package/lib/core/constants.js +116 -0
  6. package/lib/core/dev.js +27 -0
  7. package/lib/core/dry.js +21 -0
  8. package/lib/core/feature_flags.js +19 -0
  9. package/lib/core/flags.js +201 -0
  10. package/lib/core/lingering.js +68 -0
  11. package/lib/core/main.js +123 -0
  12. package/lib/core/missing_side_file.js +17 -0
  13. package/lib/core/normalize_flags.js +59 -0
  14. package/lib/core/severity.js +20 -0
  15. package/lib/core/user_node_version.js +32 -0
  16. package/lib/env/changes.js +43 -0
  17. package/lib/env/main.js +14 -0
  18. package/lib/env/metadata.js +68 -0
  19. package/lib/error/api.js +37 -0
  20. package/lib/error/build.js +36 -0
  21. package/{src → lib}/error/cancel.js +5 -6
  22. package/lib/error/colors.js +9 -0
  23. package/lib/error/handle.js +46 -0
  24. package/lib/error/info.js +37 -0
  25. package/lib/error/monitor/location.js +16 -0
  26. package/lib/error/monitor/normalize.js +86 -0
  27. package/lib/error/monitor/print.js +20 -0
  28. package/lib/error/monitor/report.js +120 -0
  29. package/lib/error/monitor/start.js +58 -0
  30. package/lib/error/parse/clean_stack.js +70 -0
  31. package/lib/error/parse/location.js +50 -0
  32. package/lib/error/parse/normalize.js +24 -0
  33. package/lib/error/parse/parse.js +67 -0
  34. package/lib/error/parse/plugin.js +55 -0
  35. package/lib/error/parse/properties.js +16 -0
  36. package/lib/error/parse/serialize_log.js +34 -0
  37. package/lib/error/parse/serialize_status.js +18 -0
  38. package/lib/error/parse/stack.js +34 -0
  39. package/lib/error/type.js +171 -0
  40. package/lib/install/functions.js +20 -0
  41. package/lib/install/local.js +45 -0
  42. package/lib/install/main.js +67 -0
  43. package/lib/install/missing.js +54 -0
  44. package/{src → lib}/log/colors.js +15 -22
  45. package/lib/log/description.js +21 -0
  46. package/lib/log/header.js +14 -0
  47. package/lib/log/header_func.js +13 -0
  48. package/lib/log/logger.js +130 -0
  49. package/lib/log/messages/compatibility.js +120 -0
  50. package/lib/log/messages/config.js +91 -0
  51. package/lib/log/messages/core.js +50 -0
  52. package/lib/log/messages/core_steps.js +75 -0
  53. package/lib/log/messages/dry.js +41 -0
  54. package/lib/log/messages/install.js +25 -0
  55. package/lib/log/messages/ipc.js +29 -0
  56. package/lib/log/messages/mutations.js +62 -0
  57. package/{src → lib}/log/messages/plugins.js +18 -32
  58. package/lib/log/messages/status.js +14 -0
  59. package/lib/log/messages/steps.js +18 -0
  60. package/lib/log/old_version.js +32 -0
  61. package/lib/log/serialize.js +10 -0
  62. package/lib/log/stream.js +68 -0
  63. package/lib/log/theme.js +25 -0
  64. package/lib/plugins/child/diff.js +46 -0
  65. package/lib/plugins/child/error.js +26 -0
  66. package/lib/plugins/child/lazy.js +15 -0
  67. package/lib/plugins/child/load.js +22 -0
  68. package/lib/plugins/child/logic.js +57 -0
  69. package/lib/plugins/child/main.js +37 -0
  70. package/lib/plugins/child/run.js +19 -0
  71. package/lib/plugins/child/status.js +63 -0
  72. package/lib/plugins/child/typescript.js +28 -0
  73. package/lib/plugins/child/utils.js +42 -0
  74. package/lib/plugins/child/validate.js +31 -0
  75. package/lib/plugins/compatibility.js +104 -0
  76. package/{src → lib}/plugins/error.js +31 -35
  77. package/{src → lib}/plugins/events.js +7 -12
  78. package/lib/plugins/expected_version.js +81 -0
  79. package/lib/plugins/ipc.js +120 -0
  80. package/lib/plugins/list.js +73 -0
  81. package/lib/plugins/load.js +50 -0
  82. package/lib/plugins/manifest/check.js +85 -0
  83. package/lib/plugins/manifest/load.js +38 -0
  84. package/lib/plugins/manifest/main.js +17 -0
  85. package/lib/plugins/manifest/path.js +24 -0
  86. package/lib/plugins/manifest/validate.js +91 -0
  87. package/lib/plugins/node_version.js +30 -0
  88. package/lib/plugins/options.js +55 -0
  89. package/lib/plugins/pinned_version.js +83 -0
  90. package/lib/plugins/resolve.js +110 -0
  91. package/lib/plugins/spawn.js +54 -0
  92. package/lib/plugins_core/add.js +35 -0
  93. package/lib/plugins_core/build_command.js +50 -0
  94. package/lib/plugins_core/deploy/buildbot_client.js +87 -0
  95. package/lib/plugins_core/deploy/index.js +49 -0
  96. package/{src → lib}/plugins_core/deploy/manifest.yml +0 -0
  97. package/lib/plugins_core/edge_functions/index.js +79 -0
  98. package/lib/plugins_core/edge_functions/lib/error.js +17 -0
  99. package/lib/plugins_core/edge_functions/lib/internal_manifest.js +50 -0
  100. package/lib/plugins_core/edge_functions/validate_manifest/validate_edge_functions_manifest.js +75 -0
  101. package/lib/plugins_core/functions/error.js +123 -0
  102. package/lib/plugins_core/functions/feature_flags.js +6 -0
  103. package/lib/plugins_core/functions/index.js +114 -0
  104. package/lib/plugins_core/functions/utils.js +45 -0
  105. package/lib/plugins_core/functions/zisi.js +39 -0
  106. package/{src → lib}/plugins_core/functions_install/index.js +8 -11
  107. package/{src → lib}/plugins_core/functions_install/manifest.yml +0 -0
  108. package/lib/plugins_core/list.js +20 -0
  109. package/lib/status/add.js +30 -0
  110. package/lib/status/colors.js +18 -0
  111. package/lib/status/load_error.js +10 -0
  112. package/lib/status/report.js +83 -0
  113. package/lib/status/success.js +14 -0
  114. package/lib/steps/core_step.js +57 -0
  115. package/lib/steps/error.js +65 -0
  116. package/lib/steps/get.js +43 -0
  117. package/lib/steps/plugin.js +55 -0
  118. package/lib/steps/return.js +25 -0
  119. package/lib/steps/run_core_steps.js +147 -0
  120. package/lib/steps/run_step.js +188 -0
  121. package/lib/steps/run_steps.js +96 -0
  122. package/lib/steps/update_config.js +66 -0
  123. package/lib/telemetry/main.js +97 -0
  124. package/lib/time/aggregate.js +120 -0
  125. package/lib/time/main.js +37 -0
  126. package/lib/time/measure.js +18 -0
  127. package/lib/time/report.js +47 -0
  128. package/lib/utils/errors.js +13 -0
  129. package/lib/utils/json.js +15 -0
  130. package/{src → lib}/utils/omit.js +3 -4
  131. package/lib/utils/package.js +22 -0
  132. package/lib/utils/remove_falsy.js +8 -0
  133. package/lib/utils/resolve.js +41 -0
  134. package/lib/utils/runtime.js +5 -0
  135. package/lib/utils/semver.js +28 -0
  136. package/package.json +39 -20
  137. package/types/config/netlify_config.d.ts +4 -4
  138. package/types/netlify_plugin_constants.d.ts +8 -8
  139. package/src/core/bin.js +0 -83
  140. package/src/core/config.js +0 -186
  141. package/src/core/constants.js +0 -156
  142. package/src/core/dry.js +0 -39
  143. package/src/core/feature_flags.js +0 -21
  144. package/src/core/flags.js +0 -194
  145. package/src/core/lingering.js +0 -85
  146. package/src/core/main.js +0 -692
  147. package/src/core/missing_side_file.js +0 -29
  148. package/src/core/normalize_flags.js +0 -69
  149. package/src/core/severity.js +0 -22
  150. package/src/core/user_node_version.js +0 -41
  151. package/src/env/changes.js +0 -52
  152. package/src/env/main.js +0 -19
  153. package/src/env/metadata.js +0 -81
  154. package/src/error/api.js +0 -46
  155. package/src/error/build.js +0 -50
  156. package/src/error/colors.js +0 -11
  157. package/src/error/handle.js +0 -57
  158. package/src/error/info.js +0 -46
  159. package/src/error/monitor/location.js +0 -21
  160. package/src/error/monitor/normalize.js +0 -77
  161. package/src/error/monitor/print.js +0 -42
  162. package/src/error/monitor/report.js +0 -133
  163. package/src/error/monitor/start.js +0 -69
  164. package/src/error/parse/clean_stack.js +0 -87
  165. package/src/error/parse/location.js +0 -58
  166. package/src/error/parse/normalize.js +0 -29
  167. package/src/error/parse/parse.js +0 -97
  168. package/src/error/parse/plugin.js +0 -70
  169. package/src/error/parse/properties.js +0 -23
  170. package/src/error/parse/serialize_log.js +0 -42
  171. package/src/error/parse/serialize_status.js +0 -23
  172. package/src/error/parse/stack.js +0 -43
  173. package/src/error/type.js +0 -182
  174. package/src/install/functions.js +0 -28
  175. package/src/install/local.js +0 -62
  176. package/src/install/main.js +0 -81
  177. package/src/install/missing.js +0 -67
  178. package/src/log/description.js +0 -26
  179. package/src/log/header.js +0 -16
  180. package/src/log/header_func.js +0 -17
  181. package/src/log/logger.js +0 -107
  182. package/src/log/messages/compatibility.js +0 -164
  183. package/src/log/messages/config.js +0 -105
  184. package/src/log/messages/core.js +0 -70
  185. package/src/log/messages/core_steps.js +0 -104
  186. package/src/log/messages/dry.js +0 -63
  187. package/src/log/messages/install.js +0 -20
  188. package/src/log/messages/ipc.js +0 -38
  189. package/src/log/messages/mutations.js +0 -82
  190. package/src/log/messages/status.js +0 -16
  191. package/src/log/messages/steps.js +0 -22
  192. package/src/log/old_version.js +0 -41
  193. package/src/log/serialize.js +0 -13
  194. package/src/log/stream.js +0 -85
  195. package/src/log/theme.js +0 -26
  196. package/src/plugins/child/diff.js +0 -55
  197. package/src/plugins/child/error.js +0 -32
  198. package/src/plugins/child/lazy.js +0 -18
  199. package/src/plugins/child/load.js +0 -29
  200. package/src/plugins/child/logic.js +0 -57
  201. package/src/plugins/child/main.js +0 -51
  202. package/src/plugins/child/run.js +0 -28
  203. package/src/plugins/child/status.js +0 -67
  204. package/src/plugins/child/typescript.js +0 -45
  205. package/src/plugins/child/utils.js +0 -56
  206. package/src/plugins/child/validate.js +0 -34
  207. package/src/plugins/compatibility.js +0 -128
  208. package/src/plugins/expected_version.js +0 -119
  209. package/src/plugins/ipc.js +0 -145
  210. package/src/plugins/list.js +0 -86
  211. package/src/plugins/load.js +0 -70
  212. package/src/plugins/manifest/check.js +0 -106
  213. package/src/plugins/manifest/load.js +0 -41
  214. package/src/plugins/manifest/main.js +0 -22
  215. package/src/plugins/manifest/path.js +0 -31
  216. package/src/plugins/manifest/validate.js +0 -108
  217. package/src/plugins/node_version.js +0 -50
  218. package/src/plugins/options.js +0 -88
  219. package/src/plugins/pinned_version.js +0 -131
  220. package/src/plugins/resolve.js +0 -152
  221. package/src/plugins/spawn.js +0 -66
  222. package/src/plugins_core/add.js +0 -49
  223. package/src/plugins_core/build_command.js +0 -75
  224. package/src/plugins_core/deploy/buildbot_client.js +0 -102
  225. package/src/plugins_core/deploy/index.js +0 -73
  226. package/src/plugins_core/edge_functions/index.js +0 -107
  227. package/src/plugins_core/edge_functions/lib/internal_manifest.js +0 -54
  228. package/src/plugins_core/functions/error.js +0 -163
  229. package/src/plugins_core/functions/feature_flags.js +0 -6
  230. package/src/plugins_core/functions/index.js +0 -160
  231. package/src/plugins_core/functions/utils.js +0 -66
  232. package/src/plugins_core/functions/zisi.js +0 -53
  233. package/src/plugins_core/list.js +0 -27
  234. package/src/status/add.js +0 -36
  235. package/src/status/colors.js +0 -23
  236. package/src/status/load_error.js +0 -11
  237. package/src/status/report.js +0 -128
  238. package/src/status/success.js +0 -18
  239. package/src/steps/core_step.js +0 -90
  240. package/src/steps/error.js +0 -102
  241. package/src/steps/get.js +0 -32
  242. package/src/steps/plugin.js +0 -85
  243. package/src/steps/return.js +0 -52
  244. package/src/steps/run_core_steps.js +0 -194
  245. package/src/steps/run_step.js +0 -300
  246. package/src/steps/run_steps.js +0 -179
  247. package/src/steps/update_config.js +0 -93
  248. package/src/telemetry/main.js +0 -136
  249. package/src/time/aggregate.js +0 -146
  250. package/src/time/main.js +0 -48
  251. package/src/time/measure.js +0 -22
  252. package/src/time/report.js +0 -59
  253. package/src/utils/errors.js +0 -12
  254. package/src/utils/json.js +0 -19
  255. package/src/utils/package.js +0 -23
  256. package/src/utils/remove_falsy.js +0 -10
  257. package/src/utils/resolve.js +0 -46
  258. package/src/utils/semver.js +0 -34
@@ -1,133 +0,0 @@
1
- import { type as osType, freemem, totalmem } from 'os'
2
- import { promisify } from 'util'
3
-
4
- import osName from 'os-name'
5
-
6
- import { getEnvMetadata } from '../../env/metadata.js'
7
- import { log } from '../../log/logger.js'
8
- import { parseErrorInfo } from '../parse/parse.js'
9
- import { getHomepage } from '../parse/plugin.js'
10
-
11
- import { getLocationMetadata } from './location.js'
12
- import { normalizeGroupingMessage } from './normalize.js'
13
- import { printEventForTest } from './print.js'
14
-
15
- // Report a build failure for monitoring purpose
16
- export const reportBuildError = async function ({ error, errorMonitor, childEnv, logs, testOpts }) {
17
- if (errorMonitor === undefined) {
18
- return
19
- }
20
-
21
- const { errorInfo, type, severity, title, group = title } = parseErrorInfo(error)
22
- const severityA = getSeverity(severity, errorInfo)
23
- const groupA = getGroup(group, errorInfo)
24
- const groupingHash = getGroupingHash(groupA, error, type)
25
- const metadata = getMetadata(errorInfo, childEnv, groupingHash)
26
- const app = getApp()
27
- const eventProps = getEventProps({ severity: severityA, group: groupA, groupingHash, metadata, app })
28
-
29
- const errorName = updateErrorName(error, type)
30
- try {
31
- await reportError({ errorMonitor, error, logs, testOpts, eventProps })
32
- } finally {
33
- error.name = errorName
34
- }
35
- }
36
-
37
- // Plugin authors test their plugins as local plugins. Errors there are more
38
- // like development errors, and should be reported as `info` only.
39
- const getSeverity = function (severity, { location: { loadedFrom } = {} }) {
40
- if (loadedFrom === 'local' || severity === 'none') {
41
- return 'info'
42
- }
43
-
44
- return severity
45
- }
46
-
47
- const getGroup = function (group, errorInfo) {
48
- if (typeof group !== 'function') {
49
- return group
50
- }
51
-
52
- return group(errorInfo)
53
- }
54
-
55
- const getGroupingHash = function (group, error, type) {
56
- const message = error instanceof Error && typeof error.message === 'string' ? error.message : String(error)
57
- const messageA = normalizeGroupingMessage(message, type)
58
- return `${group}\n${messageA}`
59
- }
60
-
61
- const getMetadata = function ({ location, plugin, tsConfig }, childEnv, groupingHash) {
62
- const pluginMetadata = getPluginMetadata({ location, plugin })
63
- const envMetadata = getEnvMetadata(childEnv)
64
- const locationMetadata = getLocationMetadata(location, envMetadata)
65
- return { location: locationMetadata, ...pluginMetadata, tsConfig, env: envMetadata, other: { groupingHash } }
66
- }
67
-
68
- const getPluginMetadata = function ({ location, plugin }) {
69
- if (plugin === undefined) {
70
- return {}
71
- }
72
-
73
- const { pluginPackageJson, ...pluginA } = plugin
74
- const homepage = getHomepage(pluginPackageJson, location)
75
- return { plugin: { ...pluginA, homepage }, pluginPackageJson }
76
- }
77
-
78
- const getApp = function () {
79
- return {
80
- osName: osType(),
81
- osVersion: osName(),
82
- freeMemory: freemem(),
83
- totalMemory: totalmem(),
84
- }
85
- }
86
-
87
- // `error.name` is shown proeminently in the Bugsnag UI. We need to update it to
88
- // match error `type` since it is more granular and useful.
89
- // But we change it back after Bugsnag is done reporting.
90
- const updateErrorName = function (error, type) {
91
- const { name } = error
92
- // This might fail if `name` is a getter or is non-writable.
93
- try {
94
- error.name = type
95
- } catch {}
96
- return name
97
- }
98
-
99
- const reportError = async function ({ errorMonitor, error, logs, testOpts, eventProps }) {
100
- if (testOpts.errorMonitor) {
101
- printEventForTest(error, eventProps, logs)
102
- return
103
- }
104
-
105
- try {
106
- await promisify(errorMonitor.notify)(error, (event) => onError(event, eventProps))
107
- // Failsafe
108
- } catch {
109
- log(logs, `Error monitor could not notify\n${error.stack}`)
110
- }
111
- }
112
-
113
- const getEventProps = function ({ severity, group, groupingHash, metadata, app }) {
114
- // `unhandled` is used to calculate Releases "stabiity score", which is
115
- // basically the percentage of unhandled errors. Since we handle all errors,
116
- // we need to implement this according to error types.
117
- const unhandled = severity === 'error'
118
- return { severity, context: group, groupingHash, _metadata: metadata, app, unhandled }
119
- }
120
-
121
- // Add more information to Bugsnag events
122
- const onError = function (event, eventProps) {
123
- // Bugsnag client requires directly mutating the `event`
124
- // eslint-disable-next-line fp/no-mutating-assign
125
- Object.assign(event, {
126
- ...eventProps,
127
- unhandled: event.unhandled || eventProps.unhandled,
128
- // eslint-disable-next-line no-underscore-dangle
129
- _metadata: { ...event._metadata, ...eventProps._metadata },
130
- app: { ...event.app, ...eventProps.app },
131
- })
132
- return true
133
- }
@@ -1,69 +0,0 @@
1
- import { fileURLToPath } from 'url'
2
-
3
- import Bugsnag from '@bugsnag/js'
4
- import memoizeOne from 'memoize-one'
5
-
6
- import { log } from '../../log/logger.js'
7
- import { ROOT_PACKAGE_JSON } from '../../utils/json.js'
8
-
9
- const projectRoot = fileURLToPath(new URL('../../..', import.meta.url))
10
-
11
- // Start a client to monitor errors
12
- export const startErrorMonitor = function ({ flags: { mode }, logs, bugsnagKey }) {
13
- if (!bugsnagKey) {
14
- return
15
- }
16
-
17
- const isTest = isBugsnagTest(bugsnagKey)
18
- const releaseStage = getReleaseStage(mode)
19
- const logger = getLogger(logs, isTest)
20
- try {
21
- const errorMonitor = startBugsnag({
22
- apiKey: bugsnagKey,
23
- appVersion: `${ROOT_PACKAGE_JSON.name} ${ROOT_PACKAGE_JSON.version}`,
24
- appType: ROOT_PACKAGE_JSON.name,
25
- releaseStage,
26
- logger,
27
- projectRoot,
28
- })
29
-
30
- // Allows knowing the percentage of failed builds per release
31
- if (!isTest) {
32
- errorMonitor.startSession()
33
- }
34
-
35
- return errorMonitor
36
- // Failsafe
37
- } catch (error) {
38
- log(logs, `Error monitor could not start\n${error.stack}`)
39
- }
40
- }
41
-
42
- const isBugsnagTest = function (bugsnagKey) {
43
- return bugsnagKey === BUGSNAG_TEST_KEY
44
- }
45
-
46
- const BUGSNAG_TEST_KEY = '00000000000000000000000000000000'
47
-
48
- // Bugsnag.start() caches a global instance and warns on duplicate calls.
49
- // This ensures the warning message is not shown when calling the main function
50
- // several times.
51
- const startBugsnag = memoizeOne(Bugsnag.start.bind(Bugsnag), () => true)
52
-
53
- // Based the release stage on the `mode`
54
- const getReleaseStage = function (mode = DEFAULT_RELEASE_STAGE) {
55
- return mode
56
- }
57
-
58
- const DEFAULT_RELEASE_STAGE = 'unknown'
59
-
60
- // We don't want Bugsnag logs except on warnings/errors.
61
- // We also want to use our own `log` utility, unprefixed.
62
- // In tests, we don't print Bugsnag because it sometimes randomly fails to
63
- // send sessions, which prints warning messags in test snapshots.
64
- const getLogger = function (logs, isTest) {
65
- const logFunc = isTest ? noop : log.bind(null, logs)
66
- return { debug: noop, info: noop, warn: logFunc, error: logFunc }
67
- }
68
-
69
- const noop = function () {}
@@ -1,87 +0,0 @@
1
- import { cwd } from 'process'
2
-
3
- import cleanStack from 'clean-stack'
4
- import stripAnsi from 'strip-ansi'
5
-
6
- // Clean stack traces:
7
- // - remove our internal code, e.g. the logic spawning plugins
8
- // - remove node modules and Node.js internals
9
- // - strip process.cwd()
10
- // - remove colors
11
- // Keep non stack trace lines as is.
12
- // We do not use libraries that patch `Error.prepareStackTrace()` because they
13
- // tend to create issues.
14
- export const cleanStacks = function ({ stack, rawStack, debug }) {
15
- if (stack === undefined) {
16
- return
17
- }
18
-
19
- // Internal errors / bugs keep their full stack trace
20
- // Same in debug mode
21
- if (rawStack || debug) {
22
- return stack
23
- }
24
-
25
- return stack.split('\n').reduce(cleanStackLine, '').replace(INITIAL_NEWLINES, '')
26
- }
27
-
28
- const cleanStackLine = function (lines, line) {
29
- const lineA = line.replace(getCwd(), '')
30
- const lineB = stripAnsi(lineA)
31
-
32
- if (!STACK_LINE_REGEXP.test(lineB)) {
33
- return `${lines}\n${lineA}`
34
- }
35
-
36
- if (shouldRemoveStackLine(lineB)) {
37
- return lines
38
- }
39
-
40
- const lineC = cleanStack(lineB)
41
-
42
- if (lineC === '') {
43
- return lines
44
- }
45
-
46
- return `${lines}\n${lineC}`
47
- }
48
-
49
- // `process.cwd()` can sometimes fail: directory name too long, current
50
- // directory has been removed, access denied.
51
- const getCwd = function () {
52
- try {
53
- return cwd()
54
- } catch {
55
- return ''
56
- }
57
- }
58
-
59
- // Check if a line is part of a stack trace
60
- const STACK_LINE_REGEXP = /^\s+at /
61
-
62
- const shouldRemoveStackLine = function (line) {
63
- const lineA = normalizePathSlashes(line)
64
- return INTERNAL_STACK_STRINGS.some((stackString) => lineA.includes(stackString)) || INTERNAL_STACK_REGEXP.test(lineA)
65
- }
66
-
67
- const INTERNAL_STACK_STRINGS = [
68
- // Anonymous function
69
- '<anonymous>',
70
- '(index 0)',
71
- // nyc internal code
72
- 'node_modules/append-transform',
73
- 'node_modules/signal-exit',
74
- // Node internals
75
- '(node:',
76
- ]
77
-
78
- // This is only needed for local builds and tests
79
- const INTERNAL_STACK_REGEXP = /(packages|@netlify)\/build\/(src\/|tests\/helpers\/|tests\/.*\/tests.js|node_modules)/
80
-
81
- const INITIAL_NEWLINES = /^\n+/
82
-
83
- const normalizePathSlashes = function (line) {
84
- return line.replace(BACKLASH_REGEXP, '/')
85
- }
86
-
87
- const BACKLASH_REGEXP = /\\/g
@@ -1,58 +0,0 @@
1
- import { getBuildCommandDescription, getPluginOrigin } from '../../log/description.js'
2
-
3
- // Retrieve an error's location to print in logs.
4
- // Each error type has its own logic (or none if there's no location to print).
5
- export const getLocationInfo = function ({ stack, location, locationType }) {
6
- // No location to print
7
- if (locationType === undefined && stack === undefined) {
8
- return
9
- }
10
-
11
- // The location is only the stack trace
12
- if (locationType === undefined) {
13
- return stack
14
- }
15
-
16
- const locationString = LOCATIONS[locationType](location)
17
- return [locationString, stack].filter(Boolean).join('\n')
18
- }
19
-
20
- const getBuildCommandLocation = function ({ buildCommand, buildCommandOrigin }) {
21
- const description = getBuildCommandDescription(buildCommandOrigin)
22
- return `In ${description}:
23
- ${buildCommand}`
24
- }
25
-
26
- const getFunctionsBundlingLocation = function ({ functionName }) {
27
- return `While bundling Function "${functionName}"`
28
- }
29
-
30
- const getCoreStepLocation = function ({ coreStepName }) {
31
- return `During ${coreStepName}`
32
- }
33
-
34
- const getBuildFailLocation = function ({ event, packageName, loadedFrom, origin }) {
35
- const eventMessage = getEventMessage(event)
36
- const pluginOrigin = getPluginOrigin(loadedFrom, origin)
37
- return `${eventMessage} "${packageName}" ${pluginOrigin}`
38
- }
39
-
40
- const getEventMessage = function (event) {
41
- if (event === 'load') {
42
- return `While loading`
43
- }
44
-
45
- return `In "${event}" event in`
46
- }
47
-
48
- const getApiLocation = function ({ endpoint, parameters }) {
49
- return `While calling the Netlify API endpoint '${endpoint}' with:\n${JSON.stringify(parameters, null, 2)}`
50
- }
51
-
52
- const LOCATIONS = {
53
- buildCommand: getBuildCommandLocation,
54
- functionsBundling: getFunctionsBundlingLocation,
55
- coreStep: getCoreStepLocation,
56
- buildFail: getBuildFailLocation,
57
- api: getApiLocation,
58
- }
@@ -1,29 +0,0 @@
1
- // Ensure error is an `Error` instance.
2
- // If is an `Error` instance but is missing usual `Error` properties, we make
3
- // sure its static properties are preserved.
4
- export const normalizeError = function (error) {
5
- if (Array.isArray(error)) {
6
- return normalizeArray(error)
7
- }
8
-
9
- if (!(error instanceof Error)) {
10
- return new Error(String(error))
11
- }
12
-
13
- if (typeof error.message !== 'string') {
14
- error.message = String(error)
15
- }
16
-
17
- if (typeof error.stack !== 'string') {
18
- Error.captureStackTrace(error, normalizeError)
19
- }
20
-
21
- return error
22
- }
23
-
24
- // Some libraries throw arrays of Errors
25
- const normalizeArray = function (errorArray) {
26
- const [error, ...errors] = errorArray.map(normalizeError)
27
- error.errors = errors
28
- return error
29
- }
@@ -1,97 +0,0 @@
1
- import { serializeObject } from '../../log/serialize.js'
2
- import { getErrorInfo } from '../info.js'
3
- import { getTypeInfo } from '../type.js'
4
-
5
- import { getLocationInfo } from './location.js'
6
- import { normalizeError } from './normalize.js'
7
- import { getPluginInfo } from './plugin.js'
8
- import { getErrorProps } from './properties.js'
9
- import { getStackInfo } from './stack.js'
10
-
11
- // Add additional type-specific error information
12
- export const getFullErrorInfo = function ({ error, colors, debug }) {
13
- const basicErrorInfo = parseErrorInfo(error)
14
- const {
15
- message,
16
- stack,
17
- errorProps,
18
- errorInfo,
19
- errorInfo: { location = {}, plugin = {}, tsConfig },
20
- severity,
21
- title,
22
- stackType,
23
- locationType,
24
- showErrorProps,
25
- rawStack,
26
- } = basicErrorInfo
27
-
28
- const titleA = getTitle(title, errorInfo)
29
-
30
- const { message: messageA, stack: stackA } = getStackInfo({ message, stack, stackType, rawStack, severity, debug })
31
-
32
- const pluginInfo = getPluginInfo(plugin, location)
33
- const tsConfigInfo = getTsConfigInfo(tsConfig)
34
- const locationInfo = getLocationInfo({ stack: stackA, location, locationType })
35
- const errorPropsA = getErrorProps({ errorProps, showErrorProps, colors })
36
-
37
- return {
38
- ...basicErrorInfo,
39
- title: titleA,
40
- message: messageA,
41
- tsConfigInfo,
42
- pluginInfo,
43
- locationInfo,
44
- errorProps: errorPropsA,
45
- }
46
- }
47
-
48
- // Serialize the `tsConfig` error information
49
- const getTsConfigInfo = function (tsConfig) {
50
- if (tsConfig === undefined) {
51
- return
52
- }
53
-
54
- return serializeObject(tsConfig)
55
- }
56
-
57
- // Parse error instance into all the basic properties containing information
58
- export const parseErrorInfo = function (error) {
59
- const { message, stack, ...errorProps } = normalizeError(error)
60
- const [errorInfo, errorPropsA] = getErrorInfo(errorProps)
61
- const {
62
- type,
63
- severity,
64
- title,
65
- group,
66
- stackType,
67
- locationType,
68
- showErrorProps,
69
- showInBuildLog = true,
70
- rawStack,
71
- } = getTypeInfo(errorInfo)
72
- const basicErrorInfo = {
73
- message,
74
- stack,
75
- errorProps: errorPropsA,
76
- errorInfo,
77
- type,
78
- severity,
79
- title,
80
- group,
81
- stackType,
82
- locationType,
83
- showInBuildLog,
84
- showErrorProps,
85
- rawStack,
86
- }
87
- return basicErrorInfo
88
- }
89
-
90
- // Retrieve title to print in logs
91
- const getTitle = function (title, errorInfo) {
92
- if (typeof title !== 'function') {
93
- return title
94
- }
95
-
96
- return title(errorInfo)
97
- }
@@ -1,70 +0,0 @@
1
- // Retrieve plugin's package.json details to include in error messages.
2
- // Please note `pluginPackageJson` has been normalized by `normalize-package-data`.
3
- export const getPluginInfo = function ({ pluginPackageJson = {} }, { packageName, loadedFrom }) {
4
- if (Object.keys(pluginPackageJson).length === 0) {
5
- return
6
- }
7
-
8
- return Object.entries(FIELDS)
9
- .map(([name, getField]) => serializeField({ name, getField, pluginPackageJson, packageName, loadedFrom }))
10
- .filter(Boolean)
11
- .join('\n')
12
- }
13
-
14
- // Serialize a single package.json field
15
- const serializeField = function ({ name, getField, pluginPackageJson, packageName, loadedFrom }) {
16
- const field = getField(pluginPackageJson, { packageName, loadedFrom })
17
- if (field === undefined) {
18
- return
19
- }
20
-
21
- const nameA = `${name}:`.padEnd(NAME_PADDING)
22
- return `${nameA}${field}`
23
- }
24
-
25
- const NAME_PADDING = 16
26
-
27
- const getPackage = function (pluginPackageJson, { packageName }) {
28
- return packageName
29
- }
30
-
31
- const getVersion = function ({ version }) {
32
- if (version === '') {
33
- return
34
- }
35
-
36
- return version
37
- }
38
-
39
- export const getHomepage = function (pluginPackageJson = {}, { loadedFrom } = {}) {
40
- return (
41
- getRepository(pluginPackageJson) ||
42
- getNpmLink(pluginPackageJson, { loadedFrom }) ||
43
- getIssuesLink(pluginPackageJson)
44
- )
45
- }
46
-
47
- const getRepository = function ({ repository: { url } = {} }) {
48
- return url
49
- }
50
-
51
- const getNpmLink = function ({ name }, { loadedFrom }) {
52
- if (!name || loadedFrom === 'local') {
53
- return
54
- }
55
-
56
- return `https://www.npmjs.com/package/${name}`
57
- }
58
-
59
- const getIssuesLink = function ({ bugs: { url } = {} }) {
60
- return url
61
- }
62
-
63
- // List of package.json to serialize
64
- const FIELDS = {
65
- Package: getPackage,
66
- Version: getVersion,
67
- Repository: getRepository,
68
- 'npm link': getNpmLink,
69
- 'Report issues': getIssuesLink,
70
- }
@@ -1,23 +0,0 @@
1
- import { inspect } from 'util'
2
-
3
- import { omit } from '../../utils/omit.js'
4
-
5
- // In uncaught exceptions, print error static properties
6
- export const getErrorProps = function ({ errorProps, showErrorProps, colors }) {
7
- if (!showErrorProps) {
8
- return
9
- }
10
-
11
- const errorPropsA = omit(errorProps, CLEANED_ERROR_PROPS)
12
-
13
- if (Object.keys(errorPropsA).length === 0) {
14
- return
15
- }
16
-
17
- return inspect(errorPropsA, { colors, depth: INSPECT_MAX_DEPTH })
18
- }
19
-
20
- const INSPECT_MAX_DEPTH = 5
21
-
22
- // Remove error static properties that should not be logged
23
- const CLEANED_ERROR_PROPS = ['requireStack']
@@ -1,42 +0,0 @@
1
- import { THEME } from '../../log/theme.js'
2
-
3
- // Serialize an error object into a title|body string to print in logs
4
- export const serializeLogError = function ({
5
- fullErrorInfo: { title, severity, message, pluginInfo, locationInfo, tsConfigInfo, errorProps },
6
- }) {
7
- const body = getBody({ message, pluginInfo, locationInfo, tsConfigInfo, errorProps, severity })
8
- return { title, body }
9
- }
10
-
11
- const getBody = function ({ message, pluginInfo, locationInfo, tsConfigInfo, errorProps, severity }) {
12
- if (severity === 'none') {
13
- return message
14
- }
15
-
16
- return Object.entries({
17
- message,
18
- tsConfigInfo,
19
- pluginInfo,
20
- locationInfo,
21
- errorProps,
22
- })
23
- .filter(blockHasValue)
24
- .map(serializeBlock)
25
- .join('\n\n')
26
- }
27
-
28
- const blockHasValue = function ([, value]) {
29
- return value !== undefined
30
- }
31
-
32
- const serializeBlock = function ([key, value]) {
33
- return `${THEME.errorSubHeader(LOG_BLOCK_NAMES[key])}\n${value}`
34
- }
35
-
36
- const LOG_BLOCK_NAMES = {
37
- message: 'Error message',
38
- pluginInfo: 'Plugin details',
39
- locationInfo: 'Error location',
40
- tsConfigInfo: 'TypeScript configuration',
41
- errorProps: 'Error properties',
42
- }
@@ -1,23 +0,0 @@
1
- // Serialize an error object to `statuses` properties
2
- export const serializeErrorStatus = function ({ fullErrorInfo: { title, message, locationInfo, errorProps }, state }) {
3
- const text = getText({ locationInfo, errorProps })
4
- return { state, title, summary: message, text }
5
- }
6
-
7
- const getText = function ({ locationInfo, errorProps }) {
8
- const parts = [locationInfo, getErrorProps(errorProps)].filter(Boolean)
9
-
10
- if (parts.length === 0) {
11
- return
12
- }
13
-
14
- return parts.join('\n\n')
15
- }
16
-
17
- const getErrorProps = function (errorProps) {
18
- if (errorProps === undefined) {
19
- return
20
- }
21
-
22
- return `Error properties:\n${errorProps}`
23
- }
@@ -1,43 +0,0 @@
1
- import { cleanStacks } from './clean_stack.js'
2
-
3
- // Retrieve the stack trace
4
- export const getStackInfo = function ({ message, stack, stackType, rawStack, severity, debug }) {
5
- const { message: messageA, stack: stackA } = splitStackInfo({ message, stack, stackType })
6
- const messageB = severity === 'none' ? messageA.replace(SUCCESS_ERROR_NAME, '') : messageA
7
- const stackB = cleanStacks({ stack: stackA, rawStack, debug })
8
- return { message: messageB, stack: stackB }
9
- }
10
-
11
- const splitStackInfo = function ({ message, stack, stackType }) {
12
- // Some errors should not show any stack trace
13
- if (stackType === 'none') {
14
- return { message }
15
- }
16
-
17
- // Some errors have their stack trace inside `error.message` instead of
18
- // `error.stack` due to IPC
19
- if (stackType === 'message') {
20
- return splitStack(message)
21
- }
22
-
23
- return splitStack(stack)
24
- }
25
-
26
- const splitStack = function (string) {
27
- const lines = string.split('\n')
28
- const stackIndex = lines.findIndex(isStackTrace)
29
-
30
- if (stackIndex === -1) {
31
- return { message: string }
32
- }
33
-
34
- const messageA = lines.slice(0, stackIndex).join('\n')
35
- const stackA = lines.slice(stackIndex).join('\n')
36
- return { message: messageA, stack: stackA }
37
- }
38
-
39
- const isStackTrace = function (line) {
40
- return line.trim().startsWith('at ')
41
- }
42
-
43
- const SUCCESS_ERROR_NAME = 'Error: '