{"version":3,"sources":["../src/plugins/rewrites.ts"],"sourcesContent":["import type { FarmPlugin, FarmPluginContext } from \"../plugin\";\nimport type { RewriteConfig } from \"../config\";\nimport type { FarmRequest, FarmResponse } from \"../types\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport { resolveFarmRequestURL } from \"../server/request\";\nimport {\n  compileConfigRoutePattern,\n  interpolateConfigRouteDestination,\n  localizeConfigRouteDestination,\n  resolveConfigRoutePathname,\n} from \"./route-pattern\";\n\nexport const FARM_CONFIG_REWRITES_PLUGIN_NAME = \"farm:rewrites\";\n\nexport function createRewritesPlugin(\n  rewrites: RewriteConfig[],\n  {\n    beforeRequest: overrideBeforeRequest,\n    afterResponse: overrideAfterResponse,\n    i18n,\n  }: {\n    beforeRequest?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n    afterResponse?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n    i18n?: ResolvedFarmI18nConfig;\n  } = {},\n): FarmPlugin {\n  const compiledRewrites = rewrites.map((rewrite) => ({\n    rewrite,\n    pattern: compileConfigRoutePattern(rewrite.source),\n  }));\n\n  return {\n    name: FARM_CONFIG_REWRITES_PLUGIN_NAME,\n    enforce: \"pre\",\n\n    async beforeRequest(req, res, context) {\n      if (overrideBeforeRequest) {\n        await overrideBeforeRequest(req, res, context);\n      }\n      const url = resolveFarmRequestURL(req);\n      const routePath = resolveConfigRoutePathname(url.pathname, i18n);\n      const pathname = routePath.pathname;\n\n      for (const { rewrite, pattern } of compiledRewrites) {\n        const match = pathname.match(pattern.regex);\n        if (match) {\n          const newPath = localizeConfigRouteDestination(\n            interpolateConfigRouteDestination(rewrite.destination, match, pattern.tokens),\n            routePath.locale,\n            i18n,\n          );\n          const destinationUrl = new URL(newPath, url);\n          if (!destinationUrl.search && url.search) {\n            destinationUrl.search = url.search;\n          }\n          req.url =\n            destinationUrl.origin === url.origin\n              ? destinationUrl.pathname + destinationUrl.search\n              : destinationUrl.href;\n          break;\n        }\n      }\n    },\n\n    async afterResponse(req, res, context) {\n      if (overrideAfterResponse) {\n        await overrideAfterResponse(req, res, context);\n      }\n    },\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;AAYO,IAAM,mCAAmC;AAEzC,SAAS,qBACd,UACA;AAAA,EACE,eAAe;AAAA,EACf,eAAe;AAAA,EACf;AACF,IAYI,CAAC,GACO;AACZ,QAAM,mBAAmB,SAAS,IAAI,CAAC,aAAa;AAAA,IAClD;AAAA,IACA,SAAS,0BAA0B,QAAQ,MAAM;AAAA,EACnD,EAAE;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,MAAM,cAAc,KAAK,KAAK,SAAS;AACrC,UAAI,uBAAuB;AACzB,cAAM,sBAAsB,KAAK,KAAK,OAAO;AAAA,MAC/C;AACA,YAAM,MAAM,sBAAsB,GAAG;AACrC,YAAM,YAAY,2BAA2B,IAAI,UAAU,IAAI;AAC/D,YAAM,WAAW,UAAU;AAE3B,iBAAW,EAAE,SAAS,QAAQ,KAAK,kBAAkB;AACnD,cAAM,QAAQ,SAAS,MAAM,QAAQ,KAAK;AAC1C,YAAI,OAAO;AACT,gBAAM,UAAU;AAAA,YACd,kCAAkC,QAAQ,aAAa,OAAO,QAAQ,MAAM;AAAA,YAC5E,UAAU;AAAA,YACV;AAAA,UACF;AACA,gBAAM,iBAAiB,IAAI,IAAI,SAAS,GAAG;AAC3C,cAAI,CAAC,eAAe,UAAU,IAAI,QAAQ;AACxC,2BAAe,SAAS,IAAI;AAAA,UAC9B;AACA,cAAI,MACF,eAAe,WAAW,IAAI,SAC1B,eAAe,WAAW,eAAe,SACzC,eAAe;AACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,KAAK,KAAK,SAAS;AACrC,UAAI,uBAAuB;AACzB,cAAM,sBAAsB,KAAK,KAAK,OAAO;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;AAhEgB;","names":[]}