{"version":3,"file":"route-autoimport-plugin.cjs","names":[],"sources":["../../../src/core/route-autoimport-plugin.ts"],"sourcesContent":["import { generateFromAst, logDiff, parseAst } from '@tanstack/router-utils'\nimport * as babel from '@babel/core'\nimport * as template from '@babel/template'\nimport { getConfig } from './config'\nimport { debug, normalizePath } from './utils'\nimport type { Config } from './config'\nimport type { UnpluginFactory } from 'unplugin'\n\n/**\n * This plugin adds imports for createFileRoute and createLazyFileRoute to the file route.\n */\nexport const unpluginRouteAutoImportFactory: UnpluginFactory<\n  Partial<Config | (() => Config)> | undefined\n> = (options = {}) => {\n  let ROOT: string = process.cwd()\n  let userConfig: Config\n\n  function initUserConfig() {\n    if (typeof options === 'function') {\n      userConfig = options()\n    } else {\n      userConfig = getConfig(options, ROOT)\n    }\n  }\n  return {\n    name: 'tanstack-router:autoimport',\n    enforce: 'pre',\n\n    transform: {\n      filter: {\n        // this is necessary for webpack / rspack to avoid matching .html files\n        id: /\\.(m|c)?(j|t)sx?$/,\n        code: /createFileRoute\\(|createLazyFileRoute\\(/,\n      },\n      handler(code, id) {\n        const normalizedId = normalizePath(id)\n        if (!globalThis.TSR_ROUTES_BY_ID_MAP?.has(normalizedId)) {\n          return null\n        }\n        let routeType: 'createFileRoute' | 'createLazyFileRoute'\n        if (code.includes('createFileRoute(')) {\n          routeType = 'createFileRoute'\n        } else if (code.includes('createLazyFileRoute(')) {\n          routeType = 'createLazyFileRoute'\n        } else {\n          return null\n        }\n\n        const routerImportPath = `@tanstack/${userConfig.target}-router`\n\n        const ast = parseAst({ code })\n\n        let isCreateRouteFunctionImported = false as boolean\n\n        babel.traverse(ast, {\n          Program: {\n            enter(programPath) {\n              programPath.traverse({\n                ImportDeclaration(path) {\n                  const importedSpecifiers = path.node.specifiers.map(\n                    (specifier) => specifier.local.name,\n                  )\n                  if (\n                    importedSpecifiers.includes(routeType) &&\n                    path.node.source.value === routerImportPath\n                  ) {\n                    isCreateRouteFunctionImported = true\n                  }\n                },\n              })\n            },\n          },\n        })\n\n        if (!isCreateRouteFunctionImported) {\n          if (debug) console.info('Adding autoimports to route ', normalizedId)\n\n          const autoImportStatement = template.statement(\n            `import { ${routeType} } from '${routerImportPath}'`,\n          )()\n          ast.program.body.unshift(autoImportStatement)\n\n          const result = generateFromAst(ast, {\n            sourceMaps: true,\n            filename: normalizedId,\n            sourceFileName: normalizedId,\n          })\n          if (debug) {\n            logDiff(code, result.code)\n            console.log('Output:\\n', result.code + '\\n\\n')\n          }\n          return result\n        }\n\n        return null\n      },\n    },\n\n    vite: {\n      configResolved(config) {\n        ROOT = config.root\n        initUserConfig()\n      },\n      // this check may only happen after config is resolved, so we use applyToEnvironment (apply is too early)\n      applyToEnvironment() {\n        return userConfig.verboseFileRoutes === false\n      },\n    },\n\n    rspack() {\n      ROOT = process.cwd()\n      initUserConfig()\n    },\n\n    webpack() {\n      ROOT = process.cwd()\n      initUserConfig()\n    },\n  }\n}\n"],"mappings":";;;;;;;;;;;;AAWA,IAAa,kCAER,UAAU,EAAE,KAAK;CACpB,IAAI,OAAe,QAAQ,KAAK;CAChC,IAAI;CAEJ,SAAS,iBAAiB;AACxB,MAAI,OAAO,YAAY,WACrB,cAAa,SAAS;MAEtB,cAAa,eAAA,UAAU,SAAS,KAAK;;AAGzC,QAAO;EACL,MAAM;EACN,SAAS;EAET,WAAW;GACT,QAAQ;IAEN,IAAI;IACJ,MAAM;IACP;GACD,QAAQ,MAAM,IAAI;IAChB,MAAM,eAAe,cAAA,cAAc,GAAG;AACtC,QAAI,CAAC,WAAW,sBAAsB,IAAI,aAAa,CACrD,QAAO;IAET,IAAI;AACJ,QAAI,KAAK,SAAS,mBAAmB,CACnC,aAAY;aACH,KAAK,SAAS,uBAAuB,CAC9C,aAAY;QAEZ,QAAO;IAGT,MAAM,mBAAmB,aAAa,WAAW,OAAO;IAExD,MAAM,OAAA,GAAA,uBAAA,UAAe,EAAE,MAAM,CAAC;IAE9B,IAAI,gCAAgC;AAEpC,gBAAM,SAAS,KAAK,EAClB,SAAS,EACP,MAAM,aAAa;AACjB,iBAAY,SAAS,EACnB,kBAAkB,MAAM;AAItB,UAH2B,KAAK,KAAK,WAAW,KAC7C,cAAc,UAAU,MAAM,KAChC,CAEoB,SAAS,UAAU,IACtC,KAAK,KAAK,OAAO,UAAU,iBAE3B,iCAAgC;QAGrC,CAAC;OAEL,EACF,CAAC;AAEF,QAAI,CAAC,+BAA+B;AAClC,SAAI,cAAA,MAAO,SAAQ,KAAK,gCAAgC,aAAa;KAErE,MAAM,sBAAsB,gBAAS,UACnC,YAAY,UAAU,WAAW,iBAAiB,GACnD,EAAE;AACH,SAAI,QAAQ,KAAK,QAAQ,oBAAoB;KAE7C,MAAM,UAAA,GAAA,uBAAA,iBAAyB,KAAK;MAClC,YAAY;MACZ,UAAU;MACV,gBAAgB;MACjB,CAAC;AACF,SAAI,cAAA,OAAO;AACT,OAAA,GAAA,uBAAA,SAAQ,MAAM,OAAO,KAAK;AAC1B,cAAQ,IAAI,aAAa,OAAO,OAAO,OAAO;;AAEhD,YAAO;;AAGT,WAAO;;GAEV;EAED,MAAM;GACJ,eAAe,QAAQ;AACrB,WAAO,OAAO;AACd,oBAAgB;;GAGlB,qBAAqB;AACnB,WAAO,WAAW,sBAAsB;;GAE3C;EAED,SAAS;AACP,UAAO,QAAQ,KAAK;AACpB,mBAAgB;;EAGlB,UAAU;AACR,UAAO,QAAQ,KAAK;AACpB,mBAAgB;;EAEnB"}