{"record":{"id":"3401456938170594","repo":"parcel-bundler/parcel","slug":"only-one-spread-parameter-can-be-included-in-a-con","errorCode":null,"errorMessage":"Only one spread parameter can be included in a config pipeline","messagePattern":"Only one spread parameter can be included in a config pipeline","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/core/src/ParcelConfig.js","lineNumber":431,"sourceCode":"    for (let pattern in globMap) {\n      if (this.isGlobMatch(filePath, pattern)) {\n        matches.push(globMap[pattern]);\n      }\n    }\n\n    let flatten = () => {\n      let pipeline = matches.shift() || [];\n      let spreadIndex = pipeline.indexOf('...');\n      if (spreadIndex >= 0) {\n        pipeline = [\n          ...pipeline.slice(0, spreadIndex),\n          ...flatten(),\n          ...pipeline.slice(spreadIndex + 1),\n        ];\n      }\n\n      if (pipeline.includes('...')) {\n        throw new Error(\n          'Only one spread parameter can be included in a config pipeline',\n        );\n      }\n\n      return pipeline;\n    };\n\n    let res = flatten();\n    // $FlowFixMe afaik this should work\n    return res;\n  }\n\n  async missingPluginError(\n    plugins:\n      | GlobMap<ExtendableParcelConfigPipeline>\n      | GlobMap<ParcelPluginNode>\n      | PureParcelConfigPipeline,\n    message: string,","sourceCodeStart":413,"sourceCodeEnd":449,"githubUrl":"https://github.com/parcel-bundler/parcel/blob/59484858a1a0bcbb71f74088956bb437a2db6505/packages/core/core/src/ParcelConfig.js#L413-L449","documentation":"In `.parcelrc` pipeline extension, `...` means 'splice the inherited pipeline here'. Parcel flattens nested pipelines by substituting one spread with the parent's flattened pipeline. After substitution it checks for any remaining `...`; a second spread would be ambiguous (which parent? which order?) and is therefore rejected.","triggerScenarios":"Authoring a `.parcelrc` pipeline (or extended config package) whose pipeline array contains two or more `...` entries.","commonSituations":"Extending a shared config and trying to inject transforms both before and after inheritance using two spreads.","solutions":["Use exactly one `...` per pipeline and position other transforms around it to control order.","If you need pre- and post-inherited transforms, restructure as nested extended configs.","Inspect the effective pipeline with `parcel show-config` to confirm there is a single spread."],"exampleFix":"// before (.parcelrc)\n{\n  \"transforms\": {\n    \"*.js\": [\"pre-transform\", \"...\", \"post-transform\", \"...\"]\n  }\n}\n\n// after\n{\n  \"transforms\": {\n    \"*.js\": [\"pre-transform\", \"...\", \"post-transform\"]\n  }\n}","handlingStrategy":"validation","validationCode":"// Reject configs with more than one spread before running.\nfunction countSpreads(pipeline: string[]): number {\n  return pipeline.filter(s => s === '...').length;\n}\nif (pipeline.some(countSpreads > 1)) throw new Error('multiple spreads');","typeGuard":"function hasSingleSpread(pipeline: string[]): boolean {\n  return pipeline.filter(s => s === '...').length <= 1;\n}","tryCatchPattern":null,"preventionTips":["Lint .parcelrc to forbid duplicate `...` entries.","Validate extended configs with `parcel show-config` before building."],"tags":["config","pipeline","parcelrc"],"backgroundTag":null,"analyzedSha":"59484858a1a0bcbb71f74088956bb437a2db6505","analyzedAt":"2026-08-13T04:06:35.925Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}