{"record":{"id":"4eba8e708a1fd262","repo":"parcel-bundler/parcel","slug":"pluginname-does-not-have-a-generate-method","errorCode":null,"errorMessage":"${pluginName} does not have a generate method","messagePattern":"(.+?) does not have a generate method","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/core/src/assetUtils.js","lineNumber":168,"sourceCode":"  if (ast == null) {\n    throw new Error('Asset has no AST');\n  }\n\n  let pluginName = nullthrows(asset.value.plugin);\n  let {plugin} = nullthrows(\n    await loadPlugin<Transformer<mixed>>(\n      pluginName,\n      fromProjectPath(\n        asset.options.projectRoot,\n        nullthrows(asset.value.configPath),\n      ),\n      nullthrows(asset.value.configKeyPath),\n      asset.options,\n    ),\n  );\n  let generate = plugin.generate?.bind(plugin);\n  if (!generate) {\n    throw new Error(`${pluginName} does not have a generate method`);\n  }\n\n  let {content, map} = await generate({\n    asset: new PublicAsset(asset),\n    ast,\n    options: new PluginOptions(asset.options),\n    logger: new PluginLogger({origin: pluginName}),\n    tracer: new PluginTracer({origin: pluginName, category: 'asset-generate'}),\n  });\n\n  let mapBuffer = map?.toBuffer();\n  // Store the results in the cache so we can avoid generating again next time\n  await Promise.all([\n    asset.options.cache.setStream(\n      nullthrows(asset.value.contentKey),\n      blobToStream(content),\n    ),\n    mapBuffer != null &&","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/parcel-bundler/parcel/blob/59484858a1a0bcbb71f74088956bb437a2db6505/packages/core/core/src/assetUtils.js#L150-L186","documentation":"`generateFromAST` (in assetUtils) loads the transformer plugin that produced the asset's AST, then calls its `generate()`. If the plugin object has no `generate` function bound, there is nothing to run and Parcel reports which plugin is at fault via the interpolated name.","triggerScenarios":"An asset whose `configPath`/`configKeyPath` points at a transformer plugin that lacks a `generate` method is asked to generate code from its AST.","commonSituations":"A third-party transformer that parses but doesn't implement generate; a transformer plugin that was partially authored.","solutions":["Ensure the named plugin implements `generate`.","Switch to a transformer that supports generation (e.g. `@parcel/transformer-js`).","If you authored the plugin, add `generate({asset, ast, options})` returning `{content, map}`."],"exampleFix":"// before\nexport default new Transformer({ transform({asset}) { ... } });\n\n// after\nexport default new Transformer({\n  transform({asset}) { ... },\n  generate({asset, ast}) { return {content: print(ast)}; }\n});","handlingStrategy":"type-guard","validationCode":"// Confirm the plugin exposes generate before relying on AST generation.\nif (typeof plugin.generate !== 'function') {\n  throw new Error(`${name} cannot generate; choose an AST-capable transformer`);\n}","typeGuard":"function hasGenerate(p: {generate?: Function}): boolean {\n  return typeof p.generate === 'function';\n}","tryCatchPattern":null,"preventionTips":["Prefer @parcel/transformer-js for JS AST flows.","Document generate() as required in your transformer's README."],"tags":["transformer","plugin","ast"],"backgroundTag":null,"analyzedSha":"59484858a1a0bcbb71f74088956bb437a2db6505","analyzedAt":"2026-08-13T04:06:35.925Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}