Skip to content

Commit 889dc56

Browse files
committed
fix: fix bug of unrecognized expression when containing z char
1 parent 15fa4c9 commit 889dc56

File tree

4 files changed

+24
-24
lines changed

4 files changed

+24
-24
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ path-segment = 1*( path-literal / template-expression )
246246
slash = "/"
247247
path-literal = 1*pchar
248248
template-expression = "{" template-expression-param-name "}"
249-
template-expression-param-name = 1*( %x00-79 / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)
249+
template-expression-param-name = 1*( %x00-79 / %x7C / %x7E-10FFFF / "z" ) ; every UTF8 character except { and } (from OpenAPI)
250250
251251
; Characters definitions (from RFC 3986)
252252
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"

src/path-templating.bnf

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ path-segment = 1*( path-literal / template-expression )
44
slash = "/"
55
path-literal = 1*pchar
66
template-expression = "{" template-expression-param-name "}"
7-
template-expression-param-name = 1*( %x00-79 / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)
7+
template-expression-param-name = 1*( %x00-79 / %x7C / %x7E-10FFFF / "z" ) ; every UTF8 character except { and } (from OpenAPI)
88

99
; Characters definitions (from RFC 3986)
1010
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"

src/path-templating.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ export default function grammar(){
77
// SUMMARY
88
// rules = 13
99
// udts = 0
10-
// opcodes = 65
10+
// opcodes = 66
1111
// --- ABNF original opcodes
1212
// ALT = 7
1313
// CAT = 4
1414
// REP = 5
1515
// RNM = 16
16-
// TLS = 27
16+
// TLS = 28
1717
// TBS = 1
1818
// TRG = 5
1919
// --- SABNF superset opcodes
@@ -82,10 +82,11 @@ export default function grammar(){
8282
/* template-expression-param-name */
8383
this.rules[5].opcodes = [];
8484
this.rules[5].opcodes[0] = { type: 3, min: 1, max: Infinity };// REP
85-
this.rules[5].opcodes[1] = { type: 1, children: [2,3,4] };// ALT
85+
this.rules[5].opcodes[1] = { type: 1, children: [2,3,4,5] };// ALT
8686
this.rules[5].opcodes[2] = { type: 5, min: 0, max: 121 };// TRG
8787
this.rules[5].opcodes[3] = { type: 6, string: [124] };// TBS
8888
this.rules[5].opcodes[4] = { type: 5, min: 126, max: 1114111 };// TRG
89+
this.rules[5].opcodes[5] = { type: 7, string: [122] };// TLS
8990

9091
/* pchar */
9192
this.rules[6].opcodes = [];
@@ -158,7 +159,7 @@ export default function grammar(){
158159
str += "slash = \"/\"\n";
159160
str += "path-literal = 1*pchar\n";
160161
str += "template-expression = \"{\" template-expression-param-name \"}\"\n";
161-
str += "template-expression-param-name = 1*( %x00-79 / %x7C / %x7E-10FFFF ) ; every UTF8 character except { and } (from OpenAPI)\n";
162+
str += "template-expression-param-name = 1*( %x00-79 / %x7C / %x7E-10FFFF / \"z\" ) ; every UTF8 character except { and } (from OpenAPI)\n";
162163
str += "\n";
163164
str += "; Characters definitions (from RFC 3986)\n";
164165
str += "pchar = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n";

test/test.js

+17-18
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { test } from '../src/index.js';
44

55
describe('test', function () {
66
it('should detect as path template', function () {
7-
assert.isTrue(test('/{path}'));
87
assert.isTrue(test('/{path}/')); // trailing slash is allowed
98
assert.isTrue(test('/pets/{petId}'));
109
assert.isTrue(test('/{entity}/me'));
1110
assert.isTrue(test('/books/{id}'));
1211
assert.isTrue(test('/a{test}'));
12+
assert.isTrue(test('/foo/bar/{baz}/test/{foo_id}/baz/{bar_id}'));
1313
assert.isTrue(test('/{test}a'));
1414
assert.isTrue(test('/range({x},{y})')); // parentheses are allowed
1515
assert.isTrue(test('/range({x},{y})/secondRange({x},{y})')); // repeated parameter names are allowed
@@ -29,9 +29,24 @@ describe('test', function () {
2929
assert.isTrue(test('/users/{user-id}'));
3030
assert.isTrue(test('/{❤️}'));
3131
assert.isTrue(test('/{%}'));
32-
// RFC 6570 operators
32+
assert.isTrue(test('/{foo:}'));
33+
assert.isTrue(test('/{foo:bar}'));
34+
assert.isTrue(test('/{=bar}'));
35+
assert.isTrue(test('/{$bar}'));
36+
assert.isTrue(test('/{~bar}'));
37+
assert.isTrue(test('/{#bar}'));
38+
assert.isTrue(test('/{?bar}'));
39+
assert.isTrue(test('/{/bar}'));
40+
assert.isTrue(test('/{foo bar}'));
41+
assert.isTrue(test('/{|bar}'));
42+
assert.isTrue(test('/{^bar}'));
43+
assert.isTrue(test('/{`bar}'));
44+
// RFC 6570 operators are allowed
3345
assert.isTrue(test('/{y,x}'), '/{y,x}');
3446
assert.isTrue(test('/{count*}'));
47+
assert.isTrue(test('/{;bar}'));
48+
assert.isTrue(test('/{&bar}'));
49+
assert.isTrue(test('/{.bar}'));
3550
});
3651

3752
it('should not detect expression', function () {
@@ -46,22 +61,6 @@ describe('test', function () {
4661
assert.isFalse(test('/#baz'));
4762
// special characters in literals are not allowed
4863
assert.isFalse(test('/❤️'));
49-
// special characters in parameters names are not allowed
50-
assert.isFalse(test('/{foo:baz}'));
51-
assert.isFalse(test('/{=baz}'));
52-
assert.isFalse(test('/{$baz}'));
53-
assert.isFalse(test('/{~baz}'));
54-
assert.isFalse(test('/{#baz}'));
55-
assert.isFalse(test('/{?baz}'));
56-
assert.isFalse(test('/{/baz}'));
57-
assert.isFalse(test('/{foo baz}'));
58-
assert.isFalse(test('/{|baz}'));
59-
assert.isFalse(test('/{^baz}'));
60-
assert.isFalse(test('/{`baz}'));
61-
// RFC 6570 operators
62-
assert.isFalse(test('/{;baz}'));
63-
assert.isFalse(test('/{&baz}'));
64-
assert.isFalse(test('/{.baz}'));
6564
// invalid types
6665
assert.isFalse(test(1));
6766
assert.isFalse(test(null));

0 commit comments

Comments
 (0)