diff --git a/packages/vite/src/node/__tests__/plugins/json.spec.ts b/packages/vite/src/node/__tests__/plugins/json.spec.ts index 18438a007f2bec..cde30624472dfd 100644 --- a/packages/vite/src/node/__tests__/plugins/json.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/json.spec.ts @@ -35,6 +35,33 @@ describe('transform', () => { return (plugin.transform! as Function)(input, 'test.json').code } + test("namedExports: true, stringify: 'auto' should not transformed an array input", () => { + const actualSmall = transform( + '[{"a":1,"b":2}]', + { namedExports: true, stringify: 'auto' }, + false, + ) + expect(actualSmall).toMatchInlineSnapshot(` +"export default [ + { + a: 1, + b: 2 + } +];" + `) + }) + + test('namedExports: true, stringify: true should not transformed an array input', () => { + const actualSmall = transform( + '[{"a":1,"b":2}]', + { namedExports: true, stringify: true }, + false, + ) + expect(actualSmall).toMatchInlineSnapshot( + `"export default JSON.parse("[{\\"a\\":1,\\"b\\":2}]")"`, + ) + }) + test('namedExports: true, stringify: false', () => { const actual = transform( '{"a":1,\n"🫠": "",\n"const": false}', diff --git a/packages/vite/src/node/plugins/json.ts b/packages/vite/src/node/plugins/json.ts index 261250ba0227f5..3ba18f5bb60b29 100644 --- a/packages/vite/src/node/plugins/json.ts +++ b/packages/vite/src/node/plugins/json.ts @@ -29,6 +29,8 @@ export interface JsonOptions { // Custom json filter for vite const jsonExtRE = /\.json(?:$|\?)(?!commonjs-(?:proxy|external))/ +const jsonObjRE = /^\s*\{/ + const jsonLangs = `\\.(?:json|json5)(?:$|\\?)` const jsonLangRE = new RegExp(jsonLangs) export const isJSONRequest = (request: string): boolean => @@ -49,28 +51,26 @@ export function jsonPlugin( try { if (options.stringify !== false) { - if (options.namedExports) { + if (options.namedExports && jsonObjRE.test(json)) { const parsed = JSON.parse(json) - if (typeof parsed === 'object' && parsed != null) { - const keys = Object.keys(parsed) - - let code = '' - let defaultObjectCode = '{\n' - for (const key of keys) { - if (key === makeLegalIdentifier(key)) { - code += `export const ${key} = ${serializeValue(parsed[key])};\n` - defaultObjectCode += ` ${key},\n` - } else { - defaultObjectCode += ` ${JSON.stringify(key)}: ${serializeValue(parsed[key])},\n` - } + const keys = Object.keys(parsed) + + let code = '' + let defaultObjectCode = '{\n' + for (const key of keys) { + if (key === makeLegalIdentifier(key)) { + code += `export const ${key} = ${serializeValue(parsed[key])};\n` + defaultObjectCode += ` ${key},\n` + } else { + defaultObjectCode += ` ${JSON.stringify(key)}: ${serializeValue(parsed[key])},\n` } - defaultObjectCode += '}' + } + defaultObjectCode += '}' - code += `export default ${defaultObjectCode};\n` - return { - code, - map: { mappings: '' }, - } + code += `export default ${defaultObjectCode};\n` + return { + code, + map: { mappings: '' }, } }