{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/routing/index.ts"],"sourcesContent":["import type {\n  RewriteObject,\n  RewriteRule,\n  RewriteRules,\n} from '@intlayer/types/config';\nimport type { StrictModeLocaleMap } from '@intlayer/types/module_augmentation';\n\nconst buildRules = (\n  rules: Record<string, StrictModeLocaleMap<string>>,\n  processor: (pattern: string) => string\n): RewriteRules => ({\n  rules: Object.entries(rules).map(([canonical, localized]) => ({\n    canonical: processor(canonical),\n    localized: Object.fromEntries(\n      Object.entries(localized).map(([locale, pattern]) => [\n        locale,\n        pattern ? processor(pattern) : pattern,\n      ])\n    ) as StrictModeLocaleMap<string>,\n  })) as RewriteRule[],\n});\n\nconst cleanPath = (pattern: string) =>\n  pattern.startsWith('/') ? pattern : `/${pattern}`;\n\n/**\n * Standardizes pattern to :param syntax.\n * Supports:\n * - Next.js/SvelteKit/Nuxt: [slug], [...slug], [[slug]]\n * - TanStack Router: $slug\n * - Solid Router: *slug\n * - React/Vue Router: :slug, *\n */\nconst normalizePattern = (pattern: string, framework?: string) => {\n  let normalized = pattern;\n\n  if (framework === 'nextjs') {\n    normalized = normalized\n      .replace(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/g, ':$1*') // [[...slug]] -> :slug* (0+)\n      .replace(/\\[\\.\\.\\.([^\\]]+)\\]/g, ':$1+') // [...slug] -> :slug+ (1+)\n      .replace(/\\[([^\\]]+)\\]/g, ':$1'); // [slug] -> :slug (1)\n  } else if (framework === 'sveltekit') {\n    normalized = normalized\n      .replace(/\\[\\.\\.\\.([^\\]]+)\\]/g, ':$1*') // [...path] -> :path* (0+)\n      .replace(/\\[\\[([^\\]]+)\\]\\]/g, ':$1?') // [[optional]] -> :optional? (0-1)\n      .replace(/\\[([^\\]]+)\\]/g, ':$1'); // [slug] -> :slug (1)\n  } else if (framework === 'nuxt') {\n    normalized = normalized\n      .replace(/\\[\\.\\.\\.([^\\]]+)\\]/g, ':$1*') // [...slug] -> :slug* (0+)\n      .replace(/\\[([^\\]]+)\\]/g, ':$1'); // [slug] -> :slug (1)\n  } else {\n    // Default / Generic (React Router, Vue Router, Solid Router, TanStack Router)\n    normalized = normalized\n      .replace(/\\$([^/]+)/g, ':$1') // TanStack $slug -> :slug\n      .replace(/\\*([^/]+)/g, ':$1*') // Solid *slug -> :slug*\n      .replace(/:([^/]+)\\?/g, ':$1?') // Vue Router/React Router :slug? -> :slug?\n      .replace(/\\*/g, ':path*'); // React Router * -> :path*\n  }\n\n  return normalized;\n};\n\n/**\n * Removes locale markers from the pattern.\n */\nconst stripLocale = (pattern: string) =>\n  pattern\n    .replace(/\\/?(:locale|\\[locale\\]|\\$locale)\\/?/g, '/')\n    .replace(/\\/+/g, '/')\n    .replace(/\\/$/, '') || '/';\n\n/**\n * Factory to create formatters that populate 'url' and a specific proxy key.\n */\nconst createFormatter =\n  (proxyKey: 'nextjs' | 'vite', framework?: string) =>\n  <T extends string = string>(\n    rules: Record<T, Partial<StrictModeLocaleMap<string>>>\n  ): RewriteObject => {\n    const normalize = (pattern: string) => normalizePattern(pattern, framework);\n    const strip = (pattern: string) => stripLocale(normalize(pattern));\n\n    return {\n      url: buildRules(rules as any, (pattern) => cleanPath(strip(pattern))),\n      [proxyKey]: buildRules(rules as any, (pattern) =>\n        cleanPath(normalize(pattern))\n      ),\n    } as RewriteObject;\n  };\n\n/**\n * Formatter for Next.js style rewrites.\n * Patterns use Next.js dynamic routing syntax:\n * - Slug: `[slug]`\n * - Catch-all: `[...slug]` (1+)\n * - Optional catch-all: `[[...slug]]` (0+)\n * - Locale: `[locale]`\n */\nexport const nextjsRewrite = createFormatter('nextjs', 'nextjs');\n\n/**\n * Formatter for SvelteKit style rewrites.\n * Patterns use SvelteKit dynamic routing syntax:\n * - Slug: `[slug]`\n * - Catch-all: `[...slug]` (0+)\n * - Locale: `[locale]`\n */\nexport const svelteKitRewrite = createFormatter('vite', 'sveltekit');\n\n/**\n * Formatter for React Router style rewrites.\n * Patterns use React Router dynamic routing syntax:\n * - Slug: `:slug`\n * - Optional slug: `:slug?`\n * - Catch-all: `*`\n * - Locale: `:locale`\n */\nexport const reactRouterRewrite = createFormatter('vite');\n\n/**\n * Formatter for Vue style rewrites.\n * Patterns use Vue Router 4 dynamic routing syntax:\n * - Slug: `:slug`\n * - Optional slug: `:slug?`\n * - Catch-all: `:slug*` or `:slug+`\n * - Locale: `:locale`\n */\nexport const vueRouterRewrite = createFormatter('vite');\n\n/**\n * Formatter for Solid Router style rewrites.\n * Patterns use Solid Router dynamic routing syntax:\n * - Slug: `:slug`\n * - Catch-all: `*slug`\n * - Locale: `:locale`\n */\nexport const solidRouterRewrite = createFormatter('vite');\n\n/**\n * Formatter for Nuxt style rewrites.\n * Patterns use Nuxt 3 dynamic routing syntax:\n * - Slug: `[slug]`\n * - Catch-all: `[...slug]` (0+)\n * - Locale: `[locale]`\n */\nexport const nuxtRewrite = createFormatter('vite', 'nuxt');\n\n/**\n * Formatter for TanStack Router style rewrites.\n * Patterns use TanStack Router dynamic routing syntax:\n * - Slug: `$slug`\n * - Catch-all: `*`\n * - Locale: `$locale`\n */\nexport const tanstackRouterRewrite = createFormatter('vite');\n\n/**\n * Generic formatter for Vite-based projects.\n * Supports most dynamic routing syntaxes and normalizes them for the Vite proxy.\n */\nexport const viteRewrite = createFormatter('vite');\n"],"mappings":";AAOA,MAAM,cACJ,OACA,eACkB,EAClB,OAAO,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,gBAAgB;CAC5D,WAAW,UAAU,SAAS;CAC9B,WAAW,OAAO,YAChB,OAAO,QAAQ,SAAS,CAAC,CAAC,KAAK,CAAC,QAAQ,aAAa,CACnD,QACA,UAAU,UAAU,OAAO,IAAI,OACjC,CAAC,CACH;AACF,EAAE,EACJ;AAEA,MAAM,aAAa,YACjB,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI;;;;;;;;;AAU1C,MAAM,oBAAoB,SAAiB,cAAuB;CAChE,IAAI,aAAa;CAEjB,IAAI,cAAc,UAAU;EAC1B,aAAa,WACV,QAAQ,2BAA2B,MAAM,CAAC,CAC1C,QAAQ,uBAAuB,MAAM,CAAC,CACtC,QAAQ,iBAAiB,KAAK;CACnC,OAAO,IAAI,cAAc,aAAa;EACpC,aAAa,WACV,QAAQ,uBAAuB,MAAM,CAAC,CACtC,QAAQ,qBAAqB,MAAM,CAAC,CACpC,QAAQ,iBAAiB,KAAK;CACnC,OAAO,IAAI,cAAc,QAAQ;EAC/B,aAAa,WACV,QAAQ,uBAAuB,MAAM,CAAC,CACtC,QAAQ,iBAAiB,KAAK;CACnC,OAAO;EAEL,aAAa,WACV,QAAQ,cAAc,KAAK,CAAC,CAC5B,QAAQ,cAAc,MAAM,CAAC,CAC7B,QAAQ,eAAe,MAAM,CAAC,CAC9B,QAAQ,OAAO,QAAQ;CAC5B;CAEA,OAAO;AACT;;;;AAKA,MAAM,eAAe,YACnB,QACG,QAAQ,wCAAwC,GAAG,CAAC,CACpD,QAAQ,QAAQ,GAAG,CAAC,CACpB,QAAQ,OAAO,EAAE,KAAK;;;;AAK3B,MAAM,mBACH,UAA6B,eAE5B,UACkB;CAClB,MAAM,aAAa,YAAoB,iBAAiB,SAAS,SAAS;CAC1E,MAAM,SAAS,YAAoB,YAAY,UAAU,OAAO,CAAC;CAEjE,OAAO;EACL,KAAK,WAAW,QAAe,YAAY,UAAU,MAAM,OAAO,CAAC,CAAC;GACnE,WAAW,WAAW,QAAe,YACpC,UAAU,UAAU,OAAO,CAAC,CAC9B;CACF;AACF;;;;;;;;;AAUF,MAAa,gBAAgB,gBAAgB,UAAU,QAAQ;;;;;;;;AAS/D,MAAa,mBAAmB,gBAAgB,QAAQ,WAAW;;;;;;;;;AAUnE,MAAa,qBAAqB,gBAAgB,MAAM;;;;;;;;;AAUxD,MAAa,mBAAmB,gBAAgB,MAAM;;;;;;;;AAStD,MAAa,qBAAqB,gBAAgB,MAAM;;;;;;;;AASxD,MAAa,cAAc,gBAAgB,QAAQ,MAAM;;;;;;;;AASzD,MAAa,wBAAwB,gBAAgB,MAAM;;;;;AAM3D,MAAa,cAAc,gBAAgB,MAAM"}