path-to-regexp 4.0.4 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -154,10 +154,9 @@ var TESTS = [
154
154
  {
155
155
  name: "test",
156
156
  prefix: "/",
157
- delimiter: "/",
158
- optional: false,
159
- repeat: false,
160
- pattern: "[^\\/]+?"
157
+ suffix: "",
158
+ modifier: "",
159
+ pattern: "[^\\/#\\?]+?"
161
160
  }
162
161
  ],
163
162
  [
@@ -181,9 +180,9 @@ var TESTS = [
181
180
  [
182
181
  [{}, null],
183
182
  [{ test: "abc" }, "/abc"],
184
- [{ test: "a+b" }, "/a+b", { encode: function (value) { return value; } }],
183
+ [{ test: "a+b" }, "/a+b"],
185
184
  [{ test: "a+b" }, "/test", { encode: function (_, token) { return String(token.name); } }],
186
- [{ test: "a+b" }, "/a%2Bb"]
185
+ [{ test: "a+b" }, "/a%2Bb", { encode: encodeURIComponent }]
187
186
  ]
188
187
  ],
189
188
  [
@@ -195,10 +194,9 @@ var TESTS = [
195
194
  {
196
195
  name: "test",
197
196
  prefix: "/",
198
- delimiter: "/",
199
- optional: false,
200
- repeat: false,
201
- pattern: "[^\\/]+?"
197
+ suffix: "",
198
+ modifier: "",
199
+ pattern: "[^\\/#\\?]+?"
202
200
  },
203
201
  "/"
204
202
  ],
@@ -266,19 +264,18 @@ var TESTS = [
266
264
  {
267
265
  name: "test",
268
266
  prefix: "/",
269
- delimiter: "/",
270
- optional: false,
271
- repeat: false,
272
- pattern: "[^\\/]+?"
267
+ suffix: "",
268
+ modifier: "",
269
+ pattern: "[^\\/#\\?]+?"
273
270
  }
274
271
  ],
275
272
  [["/route", ["/route", "route"]]],
276
273
  [
277
274
  [{}, null],
278
275
  [{ test: "abc" }, "/abc"],
279
- [{ test: "a+b" }, "/a+b", { encode: function (value) { return value; } }],
276
+ [{ test: "a+b" }, "/a+b"],
280
277
  [{ test: "a+b" }, "/test", { encode: function (_, token) { return String(token.name); } }],
281
- [{ test: "a+b" }, "/a%2Bb"]
278
+ [{ test: "a+b" }, "/a%2Bb", { encode: encodeURIComponent }]
282
279
  ]
283
280
  ],
284
281
  [
@@ -290,10 +287,9 @@ var TESTS = [
290
287
  {
291
288
  name: "test",
292
289
  prefix: "/",
293
- delimiter: "/",
294
- optional: false,
295
- repeat: false,
296
- pattern: "[^\\/]+?"
290
+ suffix: "",
291
+ modifier: "",
292
+ pattern: "[^\\/#\\?]+?"
297
293
  },
298
294
  "/"
299
295
  ],
@@ -374,10 +370,9 @@ var TESTS = [
374
370
  {
375
371
  name: "test",
376
372
  prefix: "/",
377
- delimiter: "/",
378
- optional: false,
379
- repeat: false,
380
- pattern: "[^\\/]+?"
373
+ suffix: "",
374
+ modifier: "",
375
+ pattern: "[^\\/#\\?]+?"
381
376
  }
382
377
  ],
383
378
  [
@@ -399,10 +394,9 @@ var TESTS = [
399
394
  {
400
395
  name: "test",
401
396
  prefix: "/",
402
- delimiter: "/",
403
- optional: false,
404
- repeat: false,
405
- pattern: "[^\\/]+?"
397
+ suffix: "",
398
+ modifier: "",
399
+ pattern: "[^\\/#\\?]+?"
406
400
  },
407
401
  "/"
408
402
  ],
@@ -468,10 +462,9 @@ var TESTS = [
468
462
  {
469
463
  name: "test",
470
464
  prefix: "/",
471
- delimiter: "/",
472
- optional: false,
473
- repeat: false,
474
- pattern: "[^\\/]+?"
465
+ suffix: "",
466
+ modifier: "",
467
+ pattern: "[^\\/#\\?]+?"
475
468
  }
476
469
  ],
477
470
  [
@@ -493,10 +486,9 @@ var TESTS = [
493
486
  {
494
487
  name: "test",
495
488
  prefix: "/",
496
- delimiter: "/",
497
- optional: false,
498
- repeat: false,
499
- pattern: "[^\\/]+?"
489
+ suffix: "",
490
+ modifier: "",
491
+ pattern: "[^\\/#\\?]+?"
500
492
  },
501
493
  "/"
502
494
  ],
@@ -543,10 +535,9 @@ var TESTS = [
543
535
  {
544
536
  name: "test",
545
537
  prefix: "/",
546
- delimiter: "/",
547
- optional: false,
548
- repeat: false,
549
- pattern: "[^\\/]+?"
538
+ suffix: "",
539
+ modifier: "",
540
+ pattern: "[^\\/#\\?]+?"
550
541
  }
551
542
  ],
552
543
  [
@@ -563,8 +554,16 @@ var TESTS = [
563
554
  ],
564
555
  [
565
556
  [{ test: "route" }, "/route"],
566
- [{ test: "something/else" }, "/something%2Felse"],
567
- [{ test: "something/else/more" }, "/something%2Felse%2Fmore"]
557
+ [
558
+ { test: "something/else" },
559
+ "/something%2Felse",
560
+ { encode: encodeURIComponent }
561
+ ],
562
+ [
563
+ { test: "something/else/more" },
564
+ "/something%2Felse%2Fmore",
565
+ { encode: encodeURIComponent }
566
+ ]
568
567
  ]
569
568
  ],
570
569
  [
@@ -576,10 +575,9 @@ var TESTS = [
576
575
  {
577
576
  name: "test",
578
577
  prefix: "/",
579
- delimiter: "/",
580
- optional: false,
581
- repeat: false,
582
- pattern: "[^\\/]+?"
578
+ suffix: "",
579
+ modifier: "",
580
+ pattern: "[^\\/#\\?]+?"
583
581
  }
584
582
  ],
585
583
  [
@@ -597,10 +595,9 @@ var TESTS = [
597
595
  {
598
596
  name: "test",
599
597
  prefix: "/",
600
- delimiter: "/",
601
- optional: false,
602
- repeat: false,
603
- pattern: "[^\\/]+?"
598
+ suffix: "",
599
+ modifier: "",
600
+ pattern: "[^\\/#\\?]+?"
604
601
  },
605
602
  "/"
606
603
  ],
@@ -619,10 +616,9 @@ var TESTS = [
619
616
  {
620
617
  name: "test",
621
618
  prefix: "/",
622
- delimiter: "/",
623
- optional: false,
624
- repeat: false,
625
- pattern: "[^\\/]+?"
619
+ suffix: "",
620
+ modifier: "",
621
+ pattern: "[^\\/#\\?]+?"
626
622
  }
627
623
  ],
628
624
  [
@@ -641,10 +637,9 @@ var TESTS = [
641
637
  {
642
638
  name: "test",
643
639
  prefix: "/",
644
- delimiter: "/",
645
- optional: true,
646
- repeat: false,
647
- pattern: "[^\\/]+?"
640
+ suffix: "",
641
+ modifier: "?",
642
+ pattern: "[^\\/#\\?]+?"
648
643
  }
649
644
  ],
650
645
  [
@@ -671,10 +666,9 @@ var TESTS = [
671
666
  {
672
667
  name: "test",
673
668
  prefix: "/",
674
- delimiter: "/",
675
- optional: true,
676
- repeat: false,
677
- pattern: "[^\\/]+?"
669
+ suffix: "",
670
+ modifier: "?",
671
+ pattern: "[^\\/#\\?]+?"
678
672
  }
679
673
  ],
680
674
  [
@@ -696,10 +690,9 @@ var TESTS = [
696
690
  {
697
691
  name: "test",
698
692
  prefix: "/",
699
- delimiter: "/",
700
- optional: true,
701
- repeat: false,
702
- pattern: "[^\\/]+?"
693
+ suffix: "",
694
+ modifier: "?",
695
+ pattern: "[^\\/#\\?]+?"
703
696
  },
704
697
  "/"
705
698
  ],
@@ -721,10 +714,9 @@ var TESTS = [
721
714
  {
722
715
  name: "test",
723
716
  prefix: "/",
724
- delimiter: "/",
725
- optional: true,
726
- repeat: false,
727
- pattern: "[^\\/]+?"
717
+ suffix: "",
718
+ modifier: "?",
719
+ pattern: "[^\\/#\\?]+?"
728
720
  },
729
721
  "/bar"
730
722
  ],
@@ -744,10 +736,9 @@ var TESTS = [
744
736
  {
745
737
  name: "test",
746
738
  prefix: "/",
747
- delimiter: "/",
748
- optional: true,
749
- repeat: false,
750
- pattern: "[^\\/]+?"
739
+ suffix: "",
740
+ modifier: "?",
741
+ pattern: "[^\\/#\\?]+?"
751
742
  },
752
743
  "-bar"
753
744
  ],
@@ -768,10 +759,9 @@ var TESTS = [
768
759
  {
769
760
  name: "test",
770
761
  prefix: "/",
771
- delimiter: "/",
772
- optional: true,
773
- repeat: true,
774
- pattern: "[^\\/]+?"
762
+ suffix: "",
763
+ modifier: "*",
764
+ pattern: "[^\\/#\\?]+?"
775
765
  },
776
766
  "-bar"
777
767
  ],
@@ -793,10 +783,9 @@ var TESTS = [
793
783
  {
794
784
  name: "test",
795
785
  prefix: "/",
796
- delimiter: "/",
797
- optional: false,
798
- repeat: true,
799
- pattern: "[^\\/]+?"
786
+ suffix: "",
787
+ modifier: "+",
788
+ pattern: "[^\\/#\\?]+?"
800
789
  }
801
790
  ],
802
791
  [
@@ -830,9 +819,8 @@ var TESTS = [
830
819
  {
831
820
  name: "test",
832
821
  prefix: "/",
833
- delimiter: "/",
834
- optional: false,
835
- repeat: true,
822
+ suffix: "",
823
+ modifier: "+",
836
824
  pattern: "\\d+"
837
825
  }
838
826
  ],
@@ -854,9 +842,8 @@ var TESTS = [
854
842
  {
855
843
  name: "ext",
856
844
  prefix: ".",
857
- delimiter: ".",
858
- optional: false,
859
- repeat: true,
845
+ suffix: "",
846
+ modifier: "+",
860
847
  pattern: "json|xml"
861
848
  }
862
849
  ],
@@ -873,17 +860,16 @@ var TESTS = [
873
860
  ]
874
861
  ],
875
862
  [
876
- "/route.:ext/test",
863
+ "/route.:ext(\\w+)/test",
877
864
  undefined,
878
865
  [
879
866
  "/route",
880
867
  {
881
868
  name: "ext",
882
869
  prefix: ".",
883
- delimiter: ".",
884
- optional: false,
885
- repeat: false,
886
- pattern: "[^\\.\\/]+?"
870
+ suffix: "",
871
+ modifier: "",
872
+ pattern: "\\w+"
887
873
  },
888
874
  "/test"
889
875
  ],
@@ -905,10 +891,9 @@ var TESTS = [
905
891
  {
906
892
  name: "test",
907
893
  prefix: "/",
908
- delimiter: "/",
909
- optional: true,
910
- repeat: true,
911
- pattern: "[^\\/]+?"
894
+ suffix: "",
895
+ modifier: "*",
896
+ pattern: "[^\\/#\\?]+?"
912
897
  }
913
898
  ],
914
899
  [
@@ -944,9 +929,8 @@ var TESTS = [
944
929
  {
945
930
  name: "ext",
946
931
  prefix: ".",
947
- delimiter: ".",
948
- optional: true,
949
- repeat: true,
932
+ suffix: "",
933
+ modifier: "*",
950
934
  pattern: "[a-z]+"
951
935
  }
952
936
  ],
@@ -974,9 +958,8 @@ var TESTS = [
974
958
  {
975
959
  name: "test",
976
960
  prefix: "/",
977
- delimiter: "/",
978
- optional: false,
979
- repeat: false,
961
+ suffix: "",
962
+ modifier: "",
980
963
  pattern: "\\d+"
981
964
  }
982
965
  ],
@@ -1000,9 +983,8 @@ var TESTS = [
1000
983
  {
1001
984
  name: "test",
1002
985
  prefix: "/",
1003
- delimiter: "/",
1004
- optional: false,
1005
- repeat: false,
986
+ suffix: "",
987
+ modifier: "",
1006
988
  pattern: "\\d+"
1007
989
  }
1008
990
  ],
@@ -1020,9 +1002,8 @@ var TESTS = [
1020
1002
  {
1021
1003
  name: "test",
1022
1004
  prefix: "/",
1023
- delimiter: "/",
1024
- optional: false,
1025
- repeat: false,
1005
+ suffix: "",
1006
+ modifier: "",
1026
1007
  pattern: ".*"
1027
1008
  }
1028
1009
  ],
@@ -1033,8 +1014,12 @@ var TESTS = [
1033
1014
  [
1034
1015
  [{ test: "" }, "/"],
1035
1016
  [{ test: "abc" }, "/abc"],
1036
- [{ test: "abc/123" }, "/abc%2F123"],
1037
- [{ test: "abc/123/456" }, "/abc%2F123%2F456"]
1017
+ [{ test: "abc/123" }, "/abc%2F123", { encode: encodeURIComponent }],
1018
+ [
1019
+ { test: "abc/123/456" },
1020
+ "/abc%2F123%2F456",
1021
+ { encode: encodeURIComponent }
1022
+ ]
1038
1023
  ]
1039
1024
  ],
1040
1025
  [
@@ -1044,9 +1029,8 @@ var TESTS = [
1044
1029
  {
1045
1030
  name: "route",
1046
1031
  prefix: "/",
1047
- delimiter: "/",
1048
- optional: false,
1049
- repeat: false,
1032
+ suffix: "",
1033
+ modifier: "",
1050
1034
  pattern: "[a-z]+"
1051
1035
  }
1052
1036
  ],
@@ -1069,9 +1053,8 @@ var TESTS = [
1069
1053
  {
1070
1054
  name: "route",
1071
1055
  prefix: "/",
1072
- delimiter: "/",
1073
- optional: false,
1074
- repeat: false,
1056
+ suffix: "",
1057
+ modifier: "",
1075
1058
  pattern: "this|that"
1076
1059
  }
1077
1060
  ],
@@ -1094,9 +1077,8 @@ var TESTS = [
1094
1077
  {
1095
1078
  name: "path",
1096
1079
  prefix: "/",
1097
- delimiter: "/",
1098
- optional: true,
1099
- repeat: true,
1080
+ suffix: "",
1081
+ modifier: "*",
1100
1082
  pattern: "abc|xyz"
1101
1083
  }
1102
1084
  ],
@@ -1138,10 +1120,9 @@ var TESTS = [
1138
1120
  {
1139
1121
  name: "test",
1140
1122
  prefix: "",
1141
- delimiter: "/",
1142
- optional: false,
1143
- repeat: false,
1144
- pattern: "[^\\/]+?"
1123
+ suffix: "",
1124
+ modifier: "",
1125
+ pattern: "[^\\/#\\?]+?"
1145
1126
  }
1146
1127
  ],
1147
1128
  [
@@ -1165,10 +1146,9 @@ var TESTS = [
1165
1146
  {
1166
1147
  name: "test",
1167
1148
  prefix: "",
1168
- delimiter: "/",
1169
- optional: false,
1170
- repeat: false,
1171
- pattern: "[^\\/]+?"
1149
+ suffix: "",
1150
+ modifier: "",
1151
+ pattern: "[^\\/#\\?]+?"
1172
1152
  }
1173
1153
  ],
1174
1154
  [
@@ -1187,10 +1167,9 @@ var TESTS = [
1187
1167
  {
1188
1168
  name: "test",
1189
1169
  prefix: "",
1190
- delimiter: "/",
1191
- optional: false,
1192
- repeat: false,
1193
- pattern: "[^\\/]+?"
1170
+ suffix: "",
1171
+ modifier: "",
1172
+ pattern: "[^\\/#\\?]+?"
1194
1173
  }
1195
1174
  ],
1196
1175
  [
@@ -1208,10 +1187,9 @@ var TESTS = [
1208
1187
  {
1209
1188
  name: "test",
1210
1189
  prefix: "",
1211
- delimiter: "/",
1212
- optional: true,
1213
- repeat: false,
1214
- pattern: "[^\\/]+?"
1190
+ suffix: "",
1191
+ modifier: "?",
1192
+ pattern: "[^\\/#\\?]+?"
1215
1193
  }
1216
1194
  ],
1217
1195
  [
@@ -1227,29 +1205,28 @@ var TESTS = [
1227
1205
  ]
1228
1206
  ],
1229
1207
  [
1230
- ":test+",
1208
+ "{:test/}+",
1231
1209
  undefined,
1232
1210
  [
1233
1211
  {
1234
1212
  name: "test",
1235
1213
  prefix: "",
1236
- delimiter: "/",
1237
- optional: false,
1238
- repeat: true,
1239
- pattern: "[^\\/]+?"
1214
+ suffix: "/",
1215
+ modifier: "+",
1216
+ pattern: "[^\\/#\\?]+?"
1240
1217
  }
1241
1218
  ],
1242
1219
  [
1243
- ["route", ["route", "route"]],
1220
+ ["route/", ["route/", "route"]],
1244
1221
  ["/route", null],
1245
1222
  ["", null],
1246
- ["foo/bar", ["foo/bar", "foo/bar"]]
1223
+ ["foo/bar/", ["foo/bar/", "foo/bar"]]
1247
1224
  ],
1248
1225
  [
1249
1226
  [{}, null],
1250
1227
  [{ test: "" }, null],
1251
- [{ test: ["route"] }, "route"],
1252
- [{ test: ["foo", "bar"] }, "foo/bar"]
1228
+ [{ test: ["route"] }, "route/"],
1229
+ [{ test: ["foo", "bar"] }, "foo/bar/"]
1253
1230
  ]
1254
1231
  ],
1255
1232
  /**
@@ -1272,10 +1249,9 @@ var TESTS = [
1272
1249
  {
1273
1250
  name: "test",
1274
1251
  prefix: "/",
1275
- delimiter: "/",
1276
- optional: false,
1277
- repeat: false,
1278
- pattern: "[^\\/]+?"
1252
+ suffix: "",
1253
+ modifier: "",
1254
+ pattern: "[^\\/#\\?]+?"
1279
1255
  },
1280
1256
  ".json"
1281
1257
  ],
@@ -1294,17 +1270,16 @@ var TESTS = [
1294
1270
  * Format params.
1295
1271
  */
1296
1272
  [
1297
- "/test.:format",
1273
+ "/test.:format(\\w+)",
1298
1274
  undefined,
1299
1275
  [
1300
1276
  "/test",
1301
1277
  {
1302
1278
  name: "format",
1303
1279
  prefix: ".",
1304
- delimiter: ".",
1305
- optional: false,
1306
- repeat: false,
1307
- pattern: "[^\\.\\/]+?"
1280
+ suffix: "",
1281
+ modifier: "",
1282
+ pattern: "\\w+"
1308
1283
  }
1309
1284
  ],
1310
1285
  [
@@ -1318,25 +1293,23 @@ var TESTS = [
1318
1293
  ]
1319
1294
  ],
1320
1295
  [
1321
- "/test.:format.:format",
1296
+ "/test.:format(\\w+).:format(\\w+)",
1322
1297
  undefined,
1323
1298
  [
1324
1299
  "/test",
1325
1300
  {
1326
1301
  name: "format",
1327
1302
  prefix: ".",
1328
- delimiter: ".",
1329
- optional: false,
1330
- repeat: false,
1331
- pattern: "[^\\.\\/]+?"
1303
+ suffix: "",
1304
+ modifier: "",
1305
+ pattern: "\\w+"
1332
1306
  },
1333
1307
  {
1334
1308
  name: "format",
1335
1309
  prefix: ".",
1336
- delimiter: ".",
1337
- optional: false,
1338
- repeat: false,
1339
- pattern: "[^\\.\\/]+?"
1310
+ suffix: "",
1311
+ modifier: "",
1312
+ pattern: "\\w+"
1340
1313
  }
1341
1314
  ],
1342
1315
  [
@@ -1349,17 +1322,16 @@ var TESTS = [
1349
1322
  ]
1350
1323
  ],
1351
1324
  [
1352
- "/test.:format+",
1325
+ "/test{.:format}+",
1353
1326
  undefined,
1354
1327
  [
1355
1328
  "/test",
1356
1329
  {
1357
1330
  name: "format",
1358
1331
  prefix: ".",
1359
- delimiter: ".",
1360
- optional: false,
1361
- repeat: true,
1362
- pattern: "[^\\.\\/]+?"
1332
+ suffix: "",
1333
+ modifier: "+",
1334
+ pattern: "[^\\/#\\?]+?"
1363
1335
  }
1364
1336
  ],
1365
1337
  [
@@ -1373,7 +1345,7 @@ var TESTS = [
1373
1345
  ]
1374
1346
  ],
1375
1347
  [
1376
- "/test.:format",
1348
+ "/test.:format(\\w+)",
1377
1349
  {
1378
1350
  end: false
1379
1351
  },
@@ -1382,10 +1354,9 @@ var TESTS = [
1382
1354
  {
1383
1355
  name: "format",
1384
1356
  prefix: ".",
1385
- delimiter: ".",
1386
- optional: false,
1387
- repeat: false,
1388
- pattern: "[^\\.\\/]+?"
1357
+ suffix: "",
1358
+ modifier: "",
1359
+ pattern: "\\w+"
1389
1360
  }
1390
1361
  ],
1391
1362
  [
@@ -1402,10 +1373,9 @@ var TESTS = [
1402
1373
  {
1403
1374
  name: "format",
1404
1375
  prefix: ".",
1405
- delimiter: ".",
1406
- optional: false,
1407
- repeat: false,
1408
- pattern: "[^\\.\\/]+?"
1376
+ suffix: "",
1377
+ modifier: "",
1378
+ pattern: "[^\\/#\\?]+?"
1409
1379
  },
1410
1380
  "."
1411
1381
  ],
@@ -1428,24 +1398,22 @@ var TESTS = [
1428
1398
  {
1429
1399
  name: "test",
1430
1400
  prefix: "/",
1431
- delimiter: "/",
1432
- optional: false,
1433
- repeat: false,
1434
- pattern: "[^\\/]+?"
1401
+ suffix: "",
1402
+ modifier: "",
1403
+ pattern: "[^\\/#\\?]+?"
1435
1404
  },
1436
1405
  {
1437
1406
  name: "format",
1438
1407
  prefix: ".",
1439
- delimiter: ".",
1440
- optional: false,
1441
- repeat: false,
1442
- pattern: "[^\\.\\/]+?"
1408
+ suffix: "",
1409
+ modifier: "",
1410
+ pattern: "[^\\/#\\?]+?"
1443
1411
  }
1444
1412
  ],
1445
1413
  [
1446
1414
  ["/route.html", ["/route.html", "route", "html"]],
1447
1415
  ["/route", null],
1448
- ["/route.html.json", ["/route.html.json", "route.html", "json"]]
1416
+ ["/route.html.json", ["/route.html.json", "route", "html.json"]]
1449
1417
  ],
1450
1418
  [
1451
1419
  [{}, null],
@@ -1453,30 +1421,28 @@ var TESTS = [
1453
1421
  ]
1454
1422
  ],
1455
1423
  [
1456
- "/:test.:format?",
1424
+ "/:test{.:format}?",
1457
1425
  undefined,
1458
1426
  [
1459
1427
  {
1460
1428
  name: "test",
1461
1429
  prefix: "/",
1462
- delimiter: "/",
1463
- optional: false,
1464
- repeat: false,
1465
- pattern: "[^\\/]+?"
1430
+ suffix: "",
1431
+ modifier: "",
1432
+ pattern: "[^\\/#\\?]+?"
1466
1433
  },
1467
1434
  {
1468
1435
  name: "format",
1469
1436
  prefix: ".",
1470
- delimiter: ".",
1471
- optional: true,
1472
- repeat: false,
1473
- pattern: "[^\\.\\/]+?"
1437
+ suffix: "",
1438
+ modifier: "?",
1439
+ pattern: "[^\\/#\\?]+?"
1474
1440
  }
1475
1441
  ],
1476
1442
  [
1477
1443
  ["/route", ["/route", "route", undefined]],
1478
1444
  ["/route.json", ["/route.json", "route", "json"]],
1479
- ["/route.json.html", ["/route.json.html", "route.json", "html"]]
1445
+ ["/route.json.html", ["/route.json.html", "route", "json.html"]]
1480
1446
  ],
1481
1447
  [
1482
1448
  [{ test: "route" }, "/route"],
@@ -1493,24 +1459,22 @@ var TESTS = [
1493
1459
  {
1494
1460
  name: "test",
1495
1461
  prefix: "/",
1496
- delimiter: "/",
1497
- optional: false,
1498
- repeat: false,
1499
- pattern: "[^\\/]+?"
1462
+ suffix: "",
1463
+ modifier: "",
1464
+ pattern: "[^\\/#\\?]+?"
1500
1465
  },
1501
1466
  {
1502
1467
  name: "format",
1503
1468
  prefix: ".",
1504
- delimiter: ".",
1505
- optional: true,
1506
- repeat: false,
1507
- pattern: "[^\\.\\/]+?"
1469
+ suffix: "",
1470
+ modifier: "?",
1471
+ pattern: "[^\\/#\\?]+?"
1508
1472
  }
1509
1473
  ],
1510
1474
  [
1511
1475
  ["/route", ["/route", "route", undefined]],
1512
1476
  ["/route.json", ["/route.json", "route", "json"]],
1513
- ["/route.json.html", ["/route.json.html", "route.json", "html"]]
1477
+ ["/route.json.html", ["/route.json.html", "route", "json.html"]]
1514
1478
  ],
1515
1479
  [
1516
1480
  [{ test: "route" }, "/route"],
@@ -1529,9 +1493,8 @@ var TESTS = [
1529
1493
  {
1530
1494
  name: "format",
1531
1495
  prefix: ".",
1532
- delimiter: ".",
1533
- optional: false,
1534
- repeat: false,
1496
+ suffix: "",
1497
+ modifier: "",
1535
1498
  pattern: ".*"
1536
1499
  },
1537
1500
  "z"
@@ -1557,9 +1520,8 @@ var TESTS = [
1557
1520
  {
1558
1521
  name: 0,
1559
1522
  prefix: "/",
1560
- delimiter: "/",
1561
- optional: false,
1562
- repeat: false,
1523
+ suffix: "",
1524
+ modifier: "",
1563
1525
  pattern: "\\d+"
1564
1526
  }
1565
1527
  ],
@@ -1582,9 +1544,8 @@ var TESTS = [
1582
1544
  {
1583
1545
  name: 0,
1584
1546
  prefix: "/",
1585
- delimiter: "/",
1586
- optional: false,
1587
- repeat: false,
1547
+ suffix: "",
1548
+ modifier: "",
1588
1549
  pattern: "\\d+"
1589
1550
  }
1590
1551
  ],
@@ -1603,9 +1564,8 @@ var TESTS = [
1603
1564
  {
1604
1565
  name: 0,
1605
1566
  prefix: "/",
1606
- delimiter: "/",
1607
- optional: true,
1608
- repeat: false,
1567
+ suffix: "",
1568
+ modifier: "?",
1609
1569
  pattern: "\\d+"
1610
1570
  }
1611
1571
  ],
@@ -1625,9 +1585,8 @@ var TESTS = [
1625
1585
  {
1626
1586
  name: 0,
1627
1587
  prefix: "/",
1628
- delimiter: "/",
1629
- optional: false,
1630
- repeat: false,
1588
+ suffix: "",
1589
+ modifier: "",
1631
1590
  pattern: ".*"
1632
1591
  }
1633
1592
  ],
@@ -1649,9 +1608,8 @@ var TESTS = [
1649
1608
  {
1650
1609
  name: 0,
1651
1610
  prefix: "",
1652
- delimiter: "/",
1653
- optional: false,
1654
- repeat: false,
1611
+ suffix: "",
1612
+ modifier: "",
1655
1613
  pattern: "\\d+\\\\"
1656
1614
  },
1657
1615
  ")"
@@ -1660,23 +1618,61 @@ var TESTS = [
1660
1618
  []
1661
1619
  ],
1662
1620
  [
1663
- "/(login)?",
1621
+ "{/login}?",
1622
+ undefined,
1623
+ [
1624
+ {
1625
+ name: "",
1626
+ prefix: "/login",
1627
+ suffix: "",
1628
+ modifier: "?",
1629
+ pattern: ""
1630
+ }
1631
+ ],
1632
+ [
1633
+ ["/", ["/"]],
1634
+ ["/login", ["/login"]]
1635
+ ],
1636
+ [
1637
+ [null, ""],
1638
+ [{ "": "" }, "/login"]
1639
+ ]
1640
+ ],
1641
+ [
1642
+ "{/login}",
1643
+ undefined,
1644
+ [
1645
+ {
1646
+ name: "",
1647
+ prefix: "/login",
1648
+ suffix: "",
1649
+ modifier: "",
1650
+ pattern: ""
1651
+ }
1652
+ ],
1653
+ [
1654
+ ["/", null],
1655
+ ["/login", ["/login"]]
1656
+ ],
1657
+ [[{ "": "" }, "/login"]]
1658
+ ],
1659
+ [
1660
+ "{/(.*)}",
1664
1661
  undefined,
1665
1662
  [
1666
1663
  {
1667
1664
  name: 0,
1668
1665
  prefix: "/",
1669
- delimiter: "/",
1670
- optional: true,
1671
- repeat: false,
1672
- pattern: "login"
1666
+ suffix: "",
1667
+ modifier: "",
1668
+ pattern: ".*"
1673
1669
  }
1674
1670
  ],
1675
1671
  [
1676
- ["/", ["/", undefined]],
1672
+ ["/", ["/", ""]],
1677
1673
  ["/login", ["/login", "login"]]
1678
1674
  ],
1679
- []
1675
+ [[{ 0: "test" }, "/test"]]
1680
1676
  ],
1681
1677
  /**
1682
1678
  * Regexps.
@@ -1689,9 +1685,8 @@ var TESTS = [
1689
1685
  {
1690
1686
  name: 0,
1691
1687
  prefix: "",
1692
- delimiter: "",
1693
- optional: false,
1694
- repeat: false,
1688
+ suffix: "",
1689
+ modifier: "",
1695
1690
  pattern: ""
1696
1691
  }
1697
1692
  ],
@@ -1705,9 +1700,8 @@ var TESTS = [
1705
1700
  {
1706
1701
  name: 0,
1707
1702
  prefix: "",
1708
- delimiter: "",
1709
- optional: false,
1710
- repeat: false,
1703
+ suffix: "",
1704
+ modifier: "",
1711
1705
  pattern: ""
1712
1706
  }
1713
1707
  ],
@@ -1727,9 +1721,8 @@ var TESTS = [
1727
1721
  {
1728
1722
  name: 0,
1729
1723
  prefix: "",
1730
- delimiter: "",
1731
- optional: false,
1732
- repeat: false,
1724
+ suffix: "",
1725
+ modifier: "",
1733
1726
  pattern: ""
1734
1727
  }
1735
1728
  ],
@@ -1743,17 +1736,15 @@ var TESTS = [
1743
1736
  {
1744
1737
  name: "test",
1745
1738
  prefix: "/",
1746
- delimiter: "/",
1747
- optional: false,
1748
- repeat: false,
1739
+ suffix: "",
1740
+ modifier: "",
1749
1741
  pattern: "\\d+"
1750
1742
  },
1751
1743
  {
1752
1744
  name: 0,
1753
1745
  prefix: "",
1754
- delimiter: "",
1755
- optional: false,
1756
- repeat: false,
1746
+ suffix: "",
1747
+ modifier: "",
1757
1748
  pattern: ""
1758
1749
  }
1759
1750
  ],
@@ -1773,18 +1764,16 @@ var TESTS = [
1773
1764
  {
1774
1765
  name: "test",
1775
1766
  prefix: "/",
1776
- delimiter: "/",
1777
- optional: false,
1778
- repeat: false,
1779
- pattern: "[^\\/]+?"
1767
+ suffix: "",
1768
+ modifier: "",
1769
+ pattern: "[^\\/#\\?]+?"
1780
1770
  },
1781
1771
  {
1782
1772
  name: "test",
1783
1773
  prefix: "/",
1784
- delimiter: "/",
1785
- optional: false,
1786
- repeat: false,
1787
- pattern: "[^\\/]+?"
1774
+ suffix: "",
1775
+ modifier: "",
1776
+ pattern: "[^\\/#\\?]+?"
1788
1777
  }
1789
1778
  ],
1790
1779
  [
@@ -1800,17 +1789,15 @@ var TESTS = [
1800
1789
  {
1801
1790
  name: 0,
1802
1791
  prefix: "",
1803
- delimiter: "",
1804
- optional: false,
1805
- repeat: false,
1792
+ suffix: "",
1793
+ modifier: "",
1806
1794
  pattern: ""
1807
1795
  },
1808
1796
  {
1809
1797
  name: 0,
1810
1798
  prefix: "",
1811
- delimiter: "",
1812
- optional: false,
1813
- repeat: false,
1799
+ suffix: "",
1800
+ modifier: "",
1814
1801
  pattern: ""
1815
1802
  }
1816
1803
  ],
@@ -1844,11 +1831,11 @@ var TESTS = [
1844
1831
  [[null, "/(testing)"]]
1845
1832
  ],
1846
1833
  [
1847
- "/.+*?=^!:${}[]|",
1834
+ "/.\\+\\*\\?\\{\\}=^!\\:$[]|",
1848
1835
  undefined,
1849
- ["/.+*?=^!:${}[]|"],
1850
- [["/.+*?=^!:${}[]|", ["/.+*?=^!:${}[]|"]]],
1851
- [[null, "/.+*?=^!:${}[]|"]]
1836
+ ["/.+*?{}=^!:$[]|"],
1837
+ [["/.+*?{}=^!:$[]|", ["/.+*?{}=^!:$[]|"]]],
1838
+ [[null, "/.+*?{}=^!:$[]|"]]
1852
1839
  ],
1853
1840
  [
1854
1841
  "/test\\/:uid(u\\d+)?:cid(c\\d+)?",
@@ -1858,17 +1845,15 @@ var TESTS = [
1858
1845
  {
1859
1846
  name: "uid",
1860
1847
  prefix: "",
1861
- delimiter: "/",
1862
- optional: true,
1863
- repeat: false,
1848
+ suffix: "",
1849
+ modifier: "?",
1864
1850
  pattern: "u\\d+"
1865
1851
  },
1866
1852
  {
1867
1853
  name: "cid",
1868
1854
  prefix: "",
1869
- delimiter: "/",
1870
- optional: true,
1871
- repeat: false,
1855
+ suffix: "",
1856
+ modifier: "?",
1872
1857
  pattern: "c\\d+"
1873
1858
  }
1874
1859
  ],
@@ -1888,32 +1873,30 @@ var TESTS = [
1888
1873
  * Unnamed group prefix.
1889
1874
  */
1890
1875
  [
1891
- "\\/(apple-)?icon-:res(\\d+).png",
1876
+ "/{apple-}?icon-:res(\\d+).png",
1892
1877
  undefined,
1893
1878
  [
1894
1879
  "/",
1895
1880
  {
1896
- name: 0,
1897
- prefix: "",
1898
- delimiter: "/",
1899
- optional: true,
1900
- repeat: false,
1901
- pattern: "apple-"
1881
+ name: "",
1882
+ prefix: "apple-",
1883
+ suffix: "",
1884
+ modifier: "?",
1885
+ pattern: ""
1902
1886
  },
1903
- "icon",
1887
+ "icon-",
1904
1888
  {
1905
1889
  name: "res",
1906
- prefix: "-",
1907
- delimiter: "-",
1908
- optional: false,
1909
- repeat: false,
1890
+ prefix: "",
1891
+ suffix: "",
1892
+ modifier: "",
1910
1893
  pattern: "\\d+"
1911
1894
  },
1912
1895
  ".png"
1913
1896
  ],
1914
1897
  [
1915
- ["/icon-240.png", ["/icon-240.png", undefined, "240"]],
1916
- ["/apple-icon-240.png", ["/apple-icon-240.png", "apple-", "240"]]
1898
+ ["/icon-240.png", ["/icon-240.png", "240"]],
1899
+ ["/apple-icon-240.png", ["/apple-icon-240.png", "240"]]
1917
1900
  ],
1918
1901
  []
1919
1902
  ],
@@ -1927,34 +1910,31 @@ var TESTS = [
1927
1910
  {
1928
1911
  name: "foo",
1929
1912
  prefix: "/",
1930
- delimiter: "/",
1931
- optional: false,
1932
- repeat: false,
1933
- pattern: "[^\\/]+?"
1913
+ suffix: "",
1914
+ modifier: "",
1915
+ pattern: "[^\\/#\\?]+?"
1934
1916
  },
1935
1917
  {
1936
1918
  name: "bar",
1937
1919
  prefix: "/",
1938
- delimiter: "/",
1939
- optional: false,
1940
- repeat: false,
1941
- pattern: "[^\\/]+?"
1920
+ suffix: "",
1921
+ modifier: "",
1922
+ pattern: "[^\\/#\\?]+?"
1942
1923
  }
1943
1924
  ],
1944
1925
  [["/match/route", ["/match/route", "match", "route"]]],
1945
1926
  [[{ foo: "a", bar: "b" }, "/a/b"]]
1946
1927
  ],
1947
1928
  [
1948
- "/:foo(test\\)/bar",
1929
+ "/:foo\\(test\\)/bar",
1949
1930
  undefined,
1950
1931
  [
1951
1932
  {
1952
1933
  name: "foo",
1953
1934
  prefix: "/",
1954
- delimiter: "/",
1955
- optional: false,
1956
- repeat: false,
1957
- pattern: "[^\\/]+?"
1935
+ suffix: "",
1936
+ modifier: "",
1937
+ pattern: "[^\\/#\\?]+?"
1958
1938
  },
1959
1939
  "(test)/bar"
1960
1940
  ],
@@ -1968,17 +1948,15 @@ var TESTS = [
1968
1948
  {
1969
1949
  name: "remote",
1970
1950
  prefix: "/",
1971
- delimiter: "/",
1972
- optional: false,
1973
- repeat: false,
1951
+ suffix: "",
1952
+ modifier: "",
1974
1953
  pattern: "[\\w-.]+"
1975
1954
  },
1976
1955
  {
1977
1956
  name: "user",
1978
1957
  prefix: "/",
1979
- delimiter: "/",
1980
- optional: false,
1981
- repeat: false,
1958
+ suffix: "",
1959
+ modifier: "",
1982
1960
  pattern: "[\\w-]+"
1983
1961
  }
1984
1962
  ],
@@ -1999,10 +1977,9 @@ var TESTS = [
1999
1977
  {
2000
1978
  name: "foo",
2001
1979
  prefix: "/",
2002
- delimiter: "/",
2003
- optional: false,
2004
- repeat: false,
2005
- pattern: "[^\\/]+?"
1980
+ suffix: "",
1981
+ modifier: "",
1982
+ pattern: "[^\\/#\\?]+?"
2006
1983
  },
2007
1984
  "?"
2008
1985
  ],
@@ -2016,10 +1993,9 @@ var TESTS = [
2016
1993
  {
2017
1994
  name: "foo",
2018
1995
  prefix: "/",
2019
- delimiter: "/",
2020
- optional: false,
2021
- repeat: true,
2022
- pattern: "[^\\/]+?"
1996
+ suffix: "",
1997
+ modifier: "+",
1998
+ pattern: "[^\\/#\\?]+?"
2023
1999
  },
2024
2000
  "baz"
2025
2001
  ],
@@ -2030,7 +2006,7 @@ var TESTS = [
2030
2006
  ],
2031
2007
  [
2032
2008
  [{ foo: "foo" }, "/foobaz"],
2033
- [{ foo: "foo/bar" }, "/foo%2Fbarbaz"],
2009
+ [{ foo: "foo/bar" }, "/foo%2Fbarbaz", { encode: encodeURIComponent }],
2034
2010
  [{ foo: ["foo", "bar"] }, "/foo/barbaz"]
2035
2011
  ]
2036
2012
  ],
@@ -2042,10 +2018,9 @@ var TESTS = [
2042
2018
  {
2043
2019
  name: "pre",
2044
2020
  prefix: "",
2045
- delimiter: "/",
2046
- optional: true,
2047
- repeat: false,
2048
- pattern: "[^\\/]+?"
2021
+ suffix: "",
2022
+ modifier: "?",
2023
+ pattern: "[^\\/#\\?]+?"
2049
2024
  },
2050
2025
  "baz"
2051
2026
  ],
@@ -2065,19 +2040,17 @@ var TESTS = [
2065
2040
  {
2066
2041
  name: "foo",
2067
2042
  prefix: "/",
2068
- delimiter: "/",
2069
- optional: false,
2070
- repeat: false,
2071
- pattern: "[^\\/]+?"
2043
+ suffix: "",
2044
+ modifier: "",
2045
+ pattern: "[^\\/#\\?]+?"
2072
2046
  },
2073
2047
  "(",
2074
2048
  {
2075
2049
  name: "bar",
2076
2050
  prefix: "",
2077
- delimiter: "/",
2078
- optional: true,
2079
- repeat: false,
2080
- pattern: "[^\\/]+?"
2051
+ suffix: "",
2052
+ modifier: "?",
2053
+ pattern: "[^\\/#\\?]+?"
2081
2054
  },
2082
2055
  ")"
2083
2056
  ],
@@ -2097,17 +2070,15 @@ var TESTS = [
2097
2070
  {
2098
2071
  name: "postType",
2099
2072
  prefix: "/",
2100
- delimiter: "/",
2101
- optional: false,
2102
- repeat: false,
2073
+ suffix: "",
2074
+ modifier: "",
2103
2075
  pattern: "video|audio|text"
2104
2076
  },
2105
2077
  {
2106
2078
  name: 0,
2107
2079
  prefix: "",
2108
- delimiter: "/",
2109
- optional: true,
2110
- repeat: false,
2080
+ suffix: "",
2081
+ modifier: "?",
2111
2082
  pattern: "\\+.+"
2112
2083
  }
2113
2084
  ],
@@ -2128,18 +2099,16 @@ var TESTS = [
2128
2099
  {
2129
2100
  name: "foo",
2130
2101
  prefix: "/",
2131
- delimiter: "/",
2132
- optional: true,
2133
- repeat: false,
2134
- pattern: "[^\\/]+?"
2102
+ suffix: "",
2103
+ modifier: "?",
2104
+ pattern: "[^\\/#\\?]+?"
2135
2105
  },
2136
2106
  {
2137
2107
  name: "bar",
2138
2108
  prefix: "/",
2139
- delimiter: "/",
2140
- optional: true,
2141
- repeat: false,
2142
- pattern: "[^\\/]+?"
2109
+ suffix: "",
2110
+ modifier: "?",
2111
+ pattern: "[^\\/#\\?]+?"
2143
2112
  },
2144
2113
  "-ext"
2145
2114
  ],
@@ -2164,18 +2133,16 @@ var TESTS = [
2164
2133
  {
2165
2134
  name: "required",
2166
2135
  prefix: "/",
2167
- delimiter: "/",
2168
- optional: false,
2169
- repeat: false,
2170
- pattern: "[^\\/]+?"
2136
+ suffix: "",
2137
+ modifier: "",
2138
+ pattern: "[^\\/#\\?]+?"
2171
2139
  },
2172
2140
  {
2173
2141
  name: "optional",
2174
2142
  prefix: "/",
2175
- delimiter: "/",
2176
- optional: true,
2177
- repeat: false,
2178
- pattern: "[^\\/]+?"
2143
+ suffix: "",
2144
+ modifier: "?",
2145
+ pattern: "[^\\/#\\?]+?"
2179
2146
  },
2180
2147
  "-ext"
2181
2148
  ],
@@ -2184,10 +2151,7 @@ var TESTS = [
2184
2151
  ["/foo/bar-ext", ["/foo/bar-ext", "foo", "bar"]],
2185
2152
  ["/foo/-ext", null]
2186
2153
  ],
2187
- [
2188
- [{ required: "foo" }, "/foo-ext"],
2189
- [{ required: "foo", optional: "baz" }, "/foo/baz-ext"]
2190
- ]
2154
+ [[{ required: "foo" }, "/foo-ext"]]
2191
2155
  ],
2192
2156
  /**
2193
2157
  * Unicode characters.
@@ -2199,16 +2163,25 @@ var TESTS = [
2199
2163
  {
2200
2164
  name: "foo",
2201
2165
  prefix: "/",
2202
- delimiter: "/",
2203
- optional: false,
2204
- repeat: false,
2205
- pattern: "[^\\/]+?"
2166
+ suffix: "",
2167
+ modifier: "",
2168
+ pattern: "[^\\/#\\?]+?"
2206
2169
  }
2207
2170
  ],
2208
2171
  [["/café", ["/café", "café"]]],
2209
- [[{ foo: "café" }, "/caf%C3%A9"]]
2172
+ [
2173
+ [{ foo: "café" }, "/café"],
2174
+ [{ foo: "café" }, "/caf%C3%A9", { encode: encodeURIComponent }]
2175
+ ]
2210
2176
  ],
2211
2177
  ["/café", undefined, ["/café"], [["/café", ["/café"]]], [[null, "/café"]]],
2178
+ [
2179
+ "/café",
2180
+ { encode: encodeURI },
2181
+ ["/café"],
2182
+ [["/caf%C3%A9", ["/caf%C3%A9"]]],
2183
+ [[null, "/café"]]
2184
+ ],
2212
2185
  [
2213
2186
  "packages/",
2214
2187
  undefined,
@@ -2231,9 +2204,8 @@ var TESTS = [
2231
2204
  {
2232
2205
  name: "domain",
2233
2206
  prefix: "",
2234
- delimiter: ".",
2235
- optional: false,
2236
- repeat: false,
2207
+ suffix: "",
2208
+ modifier: "",
2237
2209
  pattern: "[^\\.]+?"
2238
2210
  },
2239
2211
  ".com"
@@ -2257,9 +2229,8 @@ var TESTS = [
2257
2229
  {
2258
2230
  name: "domain",
2259
2231
  prefix: ".",
2260
- delimiter: ".",
2261
- optional: false,
2262
- repeat: false,
2232
+ suffix: "",
2233
+ modifier: "",
2263
2234
  pattern: "[^\\.]+?"
2264
2235
  },
2265
2236
  ".com"
@@ -2275,18 +2246,15 @@ var TESTS = [
2275
2246
  ],
2276
2247
  [
2277
2248
  "example.:ext",
2278
- {
2279
- delimiter: "."
2280
- },
2249
+ {},
2281
2250
  [
2282
2251
  "example",
2283
2252
  {
2284
2253
  name: "ext",
2285
2254
  prefix: ".",
2286
- delimiter: ".",
2287
- optional: false,
2288
- repeat: false,
2289
- pattern: "[^\\.]+?"
2255
+ suffix: "",
2256
+ modifier: "",
2257
+ pattern: "[^\\/#\\?]+?"
2290
2258
  }
2291
2259
  ],
2292
2260
  [
@@ -2342,29 +2310,25 @@ var TESTS = [
2342
2310
  [[null, "/test"]]
2343
2311
  ],
2344
2312
  /**
2345
- * Custom delimiters.
2313
+ * Custom prefixes.
2346
2314
  */
2347
2315
  [
2348
- "$:foo$:bar?",
2349
- {
2350
- delimiter: "$"
2351
- },
2316
+ "{$:foo}{$:bar}?",
2317
+ {},
2352
2318
  [
2353
2319
  {
2354
- delimiter: "$",
2355
2320
  name: "foo",
2356
- optional: false,
2357
- pattern: "[^\\$]+?",
2321
+ pattern: "[^\\/#\\?]+?",
2358
2322
  prefix: "$",
2359
- repeat: false
2323
+ suffix: "",
2324
+ modifier: ""
2360
2325
  },
2361
2326
  {
2362
- delimiter: "$",
2363
2327
  name: "bar",
2364
- optional: true,
2365
- pattern: "[^\\$]+?",
2328
+ pattern: "[^\\/#\\?]+?",
2366
2329
  prefix: "$",
2367
- repeat: false
2330
+ suffix: "",
2331
+ modifier: "?"
2368
2332
  }
2369
2333
  ],
2370
2334
  [
@@ -2377,61 +2341,30 @@ var TESTS = [
2377
2341
  ]
2378
2342
  ],
2379
2343
  [
2380
- ":test+",
2381
- {
2382
- delimiter: " "
2383
- },
2384
- [
2385
- {
2386
- name: "test",
2387
- prefix: "",
2388
- delimiter: " ",
2389
- optional: false,
2390
- repeat: true,
2391
- pattern: "[^ ]+?"
2392
- }
2393
- ],
2394
- [
2395
- ["hello", ["hello", "hello"]],
2396
- [" hello ", null],
2397
- ["", null],
2398
- ["hello world", ["hello world", "hello world"]]
2399
- ],
2400
- [
2401
- [{}, null],
2402
- [{ test: "" }, null],
2403
- [{ test: ["hello"] }, "hello"],
2404
- [{ test: ["hello", "world"] }, "hello world"]
2405
- ]
2406
- ],
2407
- [
2408
- "name/:attr1?-:attr2?-:attr3?",
2344
+ "name/:attr1?{-:attr2}?{-:attr3}?",
2409
2345
  {},
2410
2346
  [
2411
2347
  "name",
2412
2348
  {
2413
- delimiter: "/",
2414
2349
  name: "attr1",
2415
- optional: true,
2416
- pattern: "[^\\/]+?",
2350
+ pattern: "[^\\/#\\?]+?",
2417
2351
  prefix: "/",
2418
- repeat: false
2352
+ suffix: "",
2353
+ modifier: "?"
2419
2354
  },
2420
2355
  {
2421
- delimiter: "-",
2422
2356
  name: "attr2",
2423
- optional: true,
2424
- pattern: "[^-\\/]+?",
2357
+ pattern: "[^\\/#\\?]+?",
2425
2358
  prefix: "-",
2426
- repeat: false
2359
+ suffix: "",
2360
+ modifier: "?"
2427
2361
  },
2428
2362
  {
2429
- delimiter: "-",
2430
2363
  name: "attr3",
2431
- optional: true,
2432
- pattern: "[^-\\/]+?",
2364
+ pattern: "[^\\/#\\?]+?",
2433
2365
  prefix: "-",
2434
- repeat: false
2366
+ suffix: "",
2367
+ modifier: "?"
2435
2368
  }
2436
2369
  ],
2437
2370
  [
@@ -2448,45 +2381,6 @@ var TESTS = [
2448
2381
  [{ attr2: "attr" }, "name-attr"]
2449
2382
  ]
2450
2383
  ],
2451
- [
2452
- "name/:attr1?-:attr2?",
2453
- {
2454
- whitelist: "/"
2455
- },
2456
- [
2457
- "name",
2458
- {
2459
- delimiter: "/",
2460
- name: "attr1",
2461
- optional: true,
2462
- pattern: "[^\\/]+?",
2463
- prefix: "/",
2464
- repeat: false
2465
- },
2466
- "-",
2467
- {
2468
- delimiter: "/",
2469
- name: "attr2",
2470
- optional: true,
2471
- pattern: "[^\\/]+?",
2472
- prefix: "",
2473
- repeat: false
2474
- }
2475
- ],
2476
- [
2477
- ["name/1", null],
2478
- ["name/1-", ["name/1-", "1", undefined]],
2479
- ["name/1-2", ["name/1-2", "1", "2"]],
2480
- ["name/1-2-3", ["name/1-2-3", "1", "2-3"]],
2481
- ["name/foo-bar/route", null],
2482
- ["name/test/route", null]
2483
- ],
2484
- [
2485
- [{}, "name-"],
2486
- [{ attr1: "test" }, "name/test-"],
2487
- [{ attr2: "attr" }, "name-attr"]
2488
- ]
2489
- ],
2490
2384
  /**
2491
2385
  * Case-sensitive compile tokensToFunction params.
2492
2386
  */
@@ -2499,9 +2393,8 @@ var TESTS = [
2499
2393
  {
2500
2394
  name: "test",
2501
2395
  prefix: "/",
2502
- delimiter: "/",
2503
- optional: false,
2504
- repeat: false,
2396
+ suffix: "",
2397
+ modifier: "",
2505
2398
  pattern: "abc"
2506
2399
  }
2507
2400
  ],
@@ -2521,9 +2414,8 @@ var TESTS = [
2521
2414
  {
2522
2415
  name: "test",
2523
2416
  prefix: "/",
2524
- delimiter: "/",
2525
- optional: false,
2526
- repeat: false,
2417
+ suffix: "",
2418
+ modifier: "",
2527
2419
  pattern: "abc"
2528
2420
  }
2529
2421
  ],
@@ -2546,9 +2438,8 @@ var TESTS = [
2546
2438
  {
2547
2439
  name: "test",
2548
2440
  prefix: "/",
2549
- delimiter: "/",
2550
- optional: false,
2551
- repeat: false,
2441
+ suffix: "",
2442
+ modifier: "",
2552
2443
  pattern: "\\d+(?:\\.\\d+)?"
2553
2444
  }
2554
2445
  ],
@@ -2575,9 +2466,8 @@ var TESTS = [
2575
2466
  {
2576
2467
  name: "test",
2577
2468
  prefix: "/",
2578
- delimiter: "/",
2579
- optional: false,
2580
- repeat: false,
2469
+ suffix: "",
2470
+ modifier: "",
2581
2471
  pattern: "(?!login)[^/]+"
2582
2472
  }
2583
2473
  ],
@@ -2589,6 +2479,81 @@ var TESTS = [
2589
2479
  [{ test: "route" }, "/route"],
2590
2480
  [{ test: "login" }, null]
2591
2481
  ]
2482
+ ],
2483
+ /**
2484
+ * https://github.com/pillarjs/path-to-regexp/issues/206
2485
+ */
2486
+ [
2487
+ "/user(s)?/:user",
2488
+ undefined,
2489
+ [
2490
+ "/user",
2491
+ {
2492
+ name: 0,
2493
+ prefix: "",
2494
+ suffix: "",
2495
+ modifier: "?",
2496
+ pattern: "s"
2497
+ },
2498
+ {
2499
+ name: "user",
2500
+ prefix: "/",
2501
+ suffix: "",
2502
+ modifier: "",
2503
+ pattern: "[^\\/#\\?]+?"
2504
+ }
2505
+ ],
2506
+ [
2507
+ ["/user/123", ["/user/123", undefined, "123"]],
2508
+ ["/users/123", ["/users/123", "s", "123"]]
2509
+ ],
2510
+ [[{ user: "123" }, "/user/123"]]
2511
+ ],
2512
+ /**
2513
+ * https://github.com/pillarjs/path-to-regexp/issues/209
2514
+ */
2515
+ [
2516
+ "/whatever/:foo\\?query=str",
2517
+ undefined,
2518
+ [
2519
+ "/whatever",
2520
+ {
2521
+ name: "foo",
2522
+ prefix: "/",
2523
+ suffix: "",
2524
+ modifier: "",
2525
+ pattern: "[^\\/#\\?]+?"
2526
+ },
2527
+ "?query=str"
2528
+ ],
2529
+ [["/whatever/123?query=str", ["/whatever/123?query=str", "123"]]],
2530
+ [[{ foo: "123" }, "/whatever/123?query=str"]]
2531
+ ],
2532
+ [
2533
+ "/whatever/:foo",
2534
+ {
2535
+ end: false
2536
+ },
2537
+ [
2538
+ "/whatever",
2539
+ {
2540
+ name: "foo",
2541
+ prefix: "/",
2542
+ suffix: "",
2543
+ modifier: "",
2544
+ pattern: "[^\\/#\\?]+?"
2545
+ }
2546
+ ],
2547
+ [
2548
+ ["/whatever/123", ["/whatever/123", "123"]],
2549
+ ["/whatever/123/path", ["/whatever/123", "123"]],
2550
+ ["/whatever/123#fragment", ["/whatever/123", "123"]],
2551
+ ["/whatever/123?query=str", ["/whatever/123", "123"]]
2552
+ ],
2553
+ [
2554
+ [{ foo: "123" }, "/whatever/123"],
2555
+ [{ foo: "#" }, null]
2556
+ ]
2592
2557
  ]
2593
2558
  ];
2594
2559
  /**
@@ -2599,10 +2564,9 @@ describe("path-to-regexp", function () {
2599
2564
  var TEST_PARAM = {
2600
2565
  name: "id",
2601
2566
  prefix: "/",
2602
- delimiter: "/",
2603
- optional: false,
2604
- repeat: false,
2605
- pattern: "[^\\/]+?"
2567
+ suffix: "",
2568
+ modifier: "",
2569
+ pattern: "[^\\/#\\?]+?"
2606
2570
  };
2607
2571
  describe("arguments", function () {
2608
2572
  it("should work without different call combinations", function () {
@@ -2622,15 +2586,40 @@ describe("path-to-regexp", function () {
2622
2586
  expect(keys).toEqual([TEST_PARAM]);
2623
2587
  expect(exec(re, "/user/123/show")).toEqual(["/user/123", "123"]);
2624
2588
  });
2625
- it("should throw on non-capturing pattern group", function () {
2589
+ it("should throw on non-capturing pattern", function () {
2626
2590
  expect(function () {
2627
2591
  pathToRegexp.pathToRegexp("/:foo(?:\\d+(\\.\\d+)?)");
2628
- }).toThrow(new TypeError("Path pattern must be a capturing group"));
2592
+ }).toThrow(new TypeError('Pattern cannot start with "?" at 6'));
2629
2593
  });
2630
- it("should throw on nested capturing regexp groups", function () {
2594
+ it("should throw on nested capturing group", function () {
2631
2595
  expect(function () {
2632
2596
  pathToRegexp.pathToRegexp("/:foo(\\d+(\\.\\d+)?)");
2633
- }).toThrow(new TypeError("Capturing groups are not allowed in pattern, use a non-capturing group: (\\d+(?:\\.\\d+)?)"));
2597
+ }).toThrow(new TypeError("Capturing groups are not allowed at 9"));
2598
+ });
2599
+ it("should throw on unbalanced pattern", function () {
2600
+ expect(function () {
2601
+ pathToRegexp.pathToRegexp("/:foo(abc");
2602
+ }).toThrow(new TypeError("Unbalanced pattern at 5"));
2603
+ });
2604
+ it("should throw on missing pattern", function () {
2605
+ expect(function () {
2606
+ pathToRegexp.pathToRegexp("/:foo()");
2607
+ }).toThrow(new TypeError("Missing pattern at 5"));
2608
+ });
2609
+ it("should throw on missing name", function () {
2610
+ expect(function () {
2611
+ pathToRegexp.pathToRegexp("/:(test)");
2612
+ }).toThrow(new TypeError("Missing parameter name at 1"));
2613
+ });
2614
+ it("should throw on nested groups", function () {
2615
+ expect(function () {
2616
+ pathToRegexp.pathToRegexp("/{a{b:foo}}");
2617
+ }).toThrow(new TypeError("Unexpected OPEN at 3, expected CLOSE"));
2618
+ });
2619
+ it("should throw on misplaced modifier", function () {
2620
+ expect(function () {
2621
+ pathToRegexp.pathToRegexp("/foo?");
2622
+ }).toThrow(new TypeError("Unexpected MODIFIER at 4, expected END"));
2634
2623
  });
2635
2624
  });
2636
2625
  describe("tokens", function () {
@@ -2731,22 +2720,6 @@ describe("path-to-regexp", function () {
2731
2720
  }).toThrow(new TypeError('Expected all "foo" to match "\\d+", but got "a"'));
2732
2721
  });
2733
2722
  });
2734
- describe("normalize pathname", function () {
2735
- it("should match normalized pathnames", function () {
2736
- var re = pathToRegexp.pathToRegexp("/caf\u00E9");
2737
- var input = encodeURI("/cafe\u0301");
2738
- expect(exec(re, input)).toEqual(null);
2739
- expect(exec(re, pathToRegexp.normalizePathname(input).normalize())).toEqual(["/caf\u00E9"]);
2740
- });
2741
- it("should not normalize whitelisted characters", function () {
2742
- var input = "/test/route%2F%25";
2743
- expect(pathToRegexp.normalizePathname(input)).toEqual("/test/route%2F%25");
2744
- });
2745
- it("should fix repeated slashes", function () {
2746
- var input = encodeURI("/test///route");
2747
- expect(pathToRegexp.normalizePathname(input)).toEqual("/test/route");
2748
- });
2749
- });
2750
2723
  });
2751
2724
  /**
2752
2725
  * Execute a regular expression and return a flat array for comparison.