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