{"record":{"id":"6dc85637cd8d92d4","repo":"quasarframework/quasar","slug":"quasar-config-file-invalid-vite-plugin-specified","errorCode":null,"errorMessage":"quasar.config file > invalid Vite plugin specified: ${name}","messagePattern":"quasar\\.config file > invalid Vite plugin specified: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"app-vite/lib/config-tools.js","lineNumber":76,"sourceCode":"\n    if (typeof name === 'function') {\n      acc.push(\n        // protect against the Vite plugin mutating its own options and triggering endless cfg diff loop\n        name(merge({}, pluginOpts))\n      )\n      continue\n    }\n\n    if (Object(name) === name) {\n      acc.push(\n        // protect against the Vite plugin mutating its own options and triggering endless cfg diff loop\n        merge({}, name)\n      )\n      continue\n    }\n\n    if (typeof name !== 'string') {\n      warn('quasar.config file > invalid Vite plugin specified: ' + name)\n      warn(\n        \"Correct form: [ 'my-vite-plugin-name', { /* pluginOpts */ } ] or [ pluginFn, { /* pluginOpts */ } ]\"\n      )\n      continue\n    }\n\n    const plugin = await getPackage(name, appDir)\n\n    if (!plugin) {\n      warn(\n        'quasar.config file > invalid Vite plugin specified (cannot find it): ' +\n          name\n      )\n      continue\n    }\n\n    const pluginFn =\n      plugin.default?.default || // example: vite-plugin-checker","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/quasarframework/quasar/blob/4841521b5f635a971eb9e2710e5542efd194691b/app-vite/lib/config-tools.js#L58-L94","documentation":"quasar.config's build.vite.plugins array accepts entries of the form `'plugin-name'`, `['plugin-name', opts]`, `pluginFn` or `[pluginFn, opts]`. During Vite config parsing, if a plugin entry's name part is neither a string nor a plugin function (e.g. a plain object, number, or nested array), the CLI warns and skips that plugin, leaving it out of the build.","triggerScenarios":"parseVitePlugins encounters an entry whose name is not a string (and not a valid function form) — e.g. `plugins: [['vue', {}]]` (double-nested array) or `plugins: [{ plugin }]` (config-tools.js:76).","commonSituations":"Copy-pasting a plain Vite config's plugins array directly into quasar.config (plain Vite accepts plugin objects, Quasar's string-form requires names); over-nesting arrays; typos that turn a string into something else; spreading a plugin object into the array.","solutions":["Use the string form: `plugins: ['my-vite-plugin-name']` or `[['my-vite-plugin-name', { opts }]]` for options.","If using the function form, pass the plugin function itself: `plugins: [myPluginFn]` or `[[myPluginFn, { opts }]]`.","Check the warning's trailing value — it prints the offending entry; fix that entry's type (a plugin object imported from a package is not valid here)."],"exampleFix":"// before (quasar.config > build > vite > plugins)\nplugins: [vue(), ['legacy', {}]]\n// after\nplugins: ['vue', ['legacy', {}]]","handlingStrategy":"validation","validationCode":"const isValidEntry = e =>\n  typeof e === 'string' ||\n  typeof e === 'function' ||\n  (Array.isArray(e) && (typeof e[0] === 'string' || typeof e[0] === 'function'));\n// before build, in quasar.config or a wrapper:\nplugins.forEach(e => { if (!isValidEntry(e)) throw new Error(`bad plugin entry: ${JSON.stringify(e)}`); });","typeGuard":"function isPluginEntry(e) {\n  return typeof e === 'string' || typeof e === 'function' ||\n    (Array.isArray(e) && (typeof e[0] === 'string' || typeof e[0] === 'function'));\n}","tryCatchPattern":null,"preventionTips":["Never copy plain-Vite `plugins: [pluginObject()]` into quasar.config — use the plugin's name string.","Only nest one level: `['name', { opts }]`, not `[['name']]`.","Import plugin functions only when intentionally using the function form."],"tags":["quasar-config","vite","plugins","validation"],"backgroundTag":"invalid-vite-plugin-entry","analyzedSha":"4841521b5f635a971eb9e2710e5542efd194691b","analyzedAt":"2026-08-30T01:13:14.944Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}