Skip to content

Commit

Permalink
Improve error messages
Browse files Browse the repository at this point in the history
  • Loading branch information
ehmicky committed Feb 27, 2022
1 parent 7ef5edd commit 62b80c9
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 46 deletions.
26 changes: 14 additions & 12 deletions src/config/plugin/lib/info.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,41 @@ import { wrapError } from '../../../error/wrap.js'
import { normalizePluginConfig } from './config.js'
import { PluginError } from './error.js'
import { importPlugin } from './import.js'
import { getLocationInfo } from './location_info.js'
import { normalizeLocation } from './location_normalize.js'
import { getLocationType } from './location_type.js'
import { normalizeShape } from './shape.js'
import { normalizePluginConfigTop } from './top.js'

// Get each `pluginInfo`, i.e. normalized `plugin` + `pluginConfig`
export const getPluginInfo = async function (pluginConfig, opts) {
const pluginConfigA = await normalizePluginConfigTop(pluginConfig, opts)
const { originalLocation, locationType } = getLocationInfo(
pluginConfigA,
opts,
)
const {
originalLocation,
pluginConfig: pluginConfigA,
locationName,
} = await normalizePluginConfigTop(pluginConfig, opts)

try {
const { pluginConfig: pluginConfigB, location } = await normalizeLocation(
pluginConfigA,
const locationType = getLocationType(originalLocation, opts)
const location = await normalizeLocation({
originalLocation,
locationType,
locationName,
opts,
)
})
const { plugin, path } = await importPlugin(location, locationType, opts)
const { config: pluginConfigRules, ...pluginA } = await normalizeShape({
plugin,
locationType,
originalLocation,
opts,
})
const pluginConfigC = await normalizePluginConfig({
pluginConfig: pluginConfigB,
const pluginConfigB = await normalizePluginConfig({
pluginConfig: pluginConfigA,
plugin: pluginA,
pluginConfigRules,
opts,
})
return { plugin: pluginA, path, config: pluginConfigC }
return { plugin: pluginA, path, config: pluginConfigB }
} catch (error) {
throw handlePluginError(error, originalLocation)
}
Expand Down
34 changes: 17 additions & 17 deletions src/config/plugin/lib/location_normalize.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,26 @@ import { resolveModuleLocation } from './module.js'
import { safeNormalizeConfig } from './normalize.js'

// Normalize `pluginConfig[pluginProp]`
export const normalizeLocation = async function (
pluginConfig,
export const normalizeLocation = async function ({
opts: { cwd, builtins, modulePrefix },
originalLocation,
locationName,
locationType,
{ name, cwd, pluginProp, builtins, modulePrefix },
) {
const locationRules = getLocationRules(locationType, pluginProp)
const { [pluginProp]: location, ...pluginConfigA } =
await safeNormalizeConfig(pluginConfig, locationRules, {
context: { locationType, builtins, modulePrefix },
cwd,
parent: name,
UserErrorType: ConsumerError,
SystemErrorType: CoreError,
})
return { pluginConfig: pluginConfigA, location }
}) {
const locationRules = getLocationRules(locationType)
return await safeNormalizeConfig(originalLocation, locationRules, {
context: { locationType, builtins, modulePrefix },
cwd,
parent: locationName,
UserErrorType: ConsumerError,
SystemErrorType: CoreError,
})
}

const getLocationRules = function (locationType, pluginProp) {
const getLocationRules = function (locationType) {
return [
{ name: pluginProp, ...normalizeLocationProp },
{ name: pluginProp, ...NORMALIZE_LOCATIONS[locationType] },
normalizeLocationProp,
{ name: '', ...NORMALIZE_LOCATIONS[locationType] },
]
}

Expand All @@ -44,6 +43,7 @@ export const getExampleLocation = function (value, { context: { builtins } }) {
}

const normalizeLocationProp = {
name: '',
required: true,
example: getExampleLocation,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,8 @@ import { isAbsolute } from 'path'
// - A file path starting with . or /
// - A `file:` URL
// - A Node module prefixed with `modulePrefix` (which is optional)
export const getLocationInfo = function (
pluginConfig,
{ pluginProp, builtins },
) {
const originalLocation = pluginConfig[pluginProp]
const locationType = getLocationType(originalLocation, builtins)
return { originalLocation, locationType }
}

// eslint-disable-next-line complexity
const getLocationType = function (originalLocation, builtins) {
export const getLocationType = function (originalLocation, { builtins }) {
if (originalLocation instanceof URL) {
return 'fileUrl'
}
Expand Down
18 changes: 11 additions & 7 deletions src/config/plugin/lib/top.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,17 @@ export const normalizePluginConfigTop = async function (
pluginConfig,
{ name, cwd, pluginProp, builtins },
) {
return await safeNormalizeConfig(pluginConfig, [normalizeTop], {
context: { pluginProp, builtins },
cwd,
parent: name,
UserErrorType: ConsumerError,
SystemErrorType: CoreError,
})
const locationName =
typeof pluginConfig === 'string' ? name : `${name}.${pluginProp}`
const { [pluginProp]: originalLocation, ...pluginConfigA } =
await safeNormalizeConfig(pluginConfig, [normalizeTop], {
context: { pluginProp, builtins },
cwd,
parent: name,
UserErrorType: ConsumerError,
SystemErrorType: CoreError,
})
return { originalLocation, pluginConfig: pluginConfigA, locationName }
}

const normalizeTop = {
Expand Down

0 comments on commit 62b80c9

Please sign in to comment.