|
| 1 | +import type { Expect, Equal } from "type-testing"; |
| 2 | + |
| 3 | +type GetRoute< |
| 4 | + Path extends string, |
| 5 | + Segments extends unknown[] = [], |
| 6 | + Distant extends 1[] = [], |
| 7 | +> = Path extends "" |
| 8 | + ? Segments |
| 9 | + : Path extends `${infer Segment}-${infer Rest}` |
| 10 | + ? Segment extends "" |
| 11 | + ? GetRoute< |
| 12 | + Rest, |
| 13 | + Segments, |
| 14 | + Segments extends [] ? Segments : [...Distant, 1] |
| 15 | + > |
| 16 | + : GetRoute<Rest, [...Segments, [Segment, Distant["length"]]], [1]> |
| 17 | + : [...Segments, [Path, Distant["length"]]]; |
| 18 | + |
| 19 | +// ------------------- Test section --------------------- |
| 20 | + |
| 21 | +type t0_actual = |
| 22 | + GetRoute<"north_pole--candycane_forest----gumdrop_sea-------hawaii">; // => |
| 23 | +type t0_expected = [ |
| 24 | + // => |
| 25 | + ["north_pole", 0], |
| 26 | + ["candycane_forest", 2], |
| 27 | + ["gumdrop_sea", 4], |
| 28 | + ["hawaii", 7], |
| 29 | +]; |
| 30 | +type t0 = Expect<Equal<t0_actual, t0_expected>>; |
| 31 | + |
| 32 | +type t1_actual = GetRoute<"a-b-c-d">; // => |
| 33 | +type t1_expected = [ |
| 34 | + // => |
| 35 | + ["a", 0], |
| 36 | + ["b", 1], |
| 37 | + ["c", 1], |
| 38 | + ["d", 1], |
| 39 | +]; |
| 40 | +type t1 = Expect<Equal<t1_actual, t1_expected>>; |
| 41 | + |
| 42 | +type t2_actual = GetRoute<"🎅--🎄---🏠----🤶">; // => |
| 43 | +type t2_expected = [ |
| 44 | + // => |
| 45 | + ["🎅", 0], |
| 46 | + ["🎄", 2], |
| 47 | + ["🏠", 3], |
| 48 | + ["🤶", 4], |
| 49 | +]; |
| 50 | +type t2 = Expect<Equal<t2_actual, t2_expected>>; |
| 51 | + |
| 52 | +type t3_actual = GetRoute<"">; // => |
| 53 | +type t3_expected = []; // => |
| 54 | +type t3 = Expect<Equal<t3_actual, t3_expected>>; |
| 55 | + |
| 56 | +type t4_actual = GetRoute<"north_pole">; // => |
| 57 | +type t4_expected = [["north_pole", 0]]; // => |
| 58 | +type t4 = Expect<Equal<t4_actual, t4_expected>>; |
| 59 | + |
| 60 | +type t5_actual = GetRoute<"a--b----c-d---e">; // => |
| 61 | +type t5_expected = [ |
| 62 | + // => |
| 63 | + ["a", 0], |
| 64 | + ["b", 2], |
| 65 | + ["c", 4], |
| 66 | + ["d", 1], |
| 67 | + ["e", 3], |
| 68 | +]; |
| 69 | +type t5 = Expect<Equal<t5_actual, t5_expected>>; |
| 70 | + |
| 71 | +type t6_actual = GetRoute<"--a-b">; // => |
| 72 | +type t6_expected = [["a", 0], ["b", 1]]; // => |
| 73 | +type t6 = Expect<Equal<t6_actual, t6_expected>>; |
| 74 | + |
| 75 | +type t7_actual = GetRoute<"a-b--">; // => |
| 76 | +type t7_expected = [["a", 0], ["b", 1]]; // => |
| 77 | +type t7 = Expect<Equal<t7_actual, t7_expected>>; |
| 78 | + |
| 79 | +type t8_actual = GetRoute<"north pole-candy.cane">; // => |
| 80 | +type t8_expected = [["north pole", 0], ["candy.cane", 1]]; // => |
| 81 | +type t8 = Expect<Equal<t8_actual, t8_expected>>; |
| 82 | + |
| 83 | +type t9_actual = |
| 84 | + GetRoute<"a--------------------------------------------------b">; // => |
| 85 | +type t9_expected = [["a", 0], ["b", 50]]; // => |
| 86 | +type t9 = Expect<Equal<t9_actual, t9_expected>>; |
| 87 | + |
| 88 | +type t10_actual = GetRoute<"a--a-a---a">; // => |
| 89 | +type t10_expected = [["a", 0], ["a", 2], ["a", 1], ["a", 3]]; // => |
| 90 | +type t10 = Expect<Equal<t10_actual, t10_expected>>; |
| 91 | + |
| 92 | +// @ts-expect-error should not be a generic array |
| 93 | +type e0 = Expect<Equal<t0_actual, [string, number][]>>; |
| 94 | + |
| 95 | +// @ts-expect-error should only accept string input |
| 96 | +type e1 = GetRoute<123>; |
0 commit comments