Skip to content

Commit 687c5b2

Browse files
committedSep 3, 2023
fix: improve error message upon code defined inside header files
1 parent f3e447c commit 687c5b2

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed
 

‎vite-plugin-ssr/node/plugin/plugins/importUserCode/v1-design/serializePageConfigs.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
export { serializePageConfigs }
44

5-
import { assert, assertUsage, objectEntries } from '../../../utils.js'
5+
import { assert, assertUsage, getPropAccessNotation, hasProp, objectEntries } from '../../../utils.js'
66
import type {
77
ConfigValue,
88
ConfigValueSource,
@@ -15,6 +15,7 @@ import { debug } from './debug.js'
1515
import { stringify } from '@brillout/json-serializer/stringify'
1616
import { skipConfigValue } from './getVirtualFileImportCodeFiles.js'
1717
import { getConfigEnv } from './helpers.js'
18+
import pc from '@brillout/picocolors'
1819

1920
function serializePageConfigs(
2021
pageConfigsData: PageConfigData[],
@@ -159,12 +160,19 @@ function serializeConfigValueSource(
159160
}
160161
function getConfigValueSerialized(value: unknown, configName: string, configDefinedByFile: string): string {
161162
let configValueSerialized: string
163+
const valueName = `config${getPropAccessNotation(configName)}`
162164
try {
163-
configValueSerialized = stringify(value)
164-
} catch {
165+
configValueSerialized = stringify(value, { valueName })
166+
} catch (err) {
167+
assert(hasProp(err, 'messageCore', 'string'))
168+
const configPath = pc.bold(configDefinedByFile)
165169
assertUsage(
166170
false,
167-
`The value of the config '${configName}' cannot live inside ${configDefinedByFile}, see https://vite-plugin-ssr.com/header-file`
171+
[
172+
`The value of the config ${pc.cyan(configName)} cannot be defined inside the file ${configPath}.`,
173+
`Its value must be defined in an another file and then imported by ${configPath} (because it isn't serializable: ${err.messageCore}).`,
174+
`Only serializable config values can be defined inside ${configPath}, see https://vite-plugin-ssr.com/header-file.`
175+
].join(' ')
168176
)
169177
}
170178
configValueSerialized = JSON.stringify(configValueSerialized)

‎vite-plugin-ssr/node/plugin/utils.ts

+1
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ export * from '../../utils/stripAnsi.js'
2424
export * from '../../utils/trimWithAnsi.js'
2525
export * from '../../utils/removeEmptyLines.js'
2626
export * from '../../utils/findUserPackageJsonPath.js'
27+
export * from '../../utils/getPropAccessNotation.js'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export { getPropAccessNotation }
2+
3+
function getPropAccessNotation(key: string): `.${string}` | `[${string}]` {
4+
return isKeyDotNotationCompatible(key) ? `.${key}` : `[${JSON.stringify(key)}]`
5+
}
6+
function isKeyDotNotationCompatible(key: string): boolean {
7+
return /^[a-z0-9\$_]+$/i.test(key)
8+
}

0 commit comments

Comments
 (0)
Please sign in to comment.