Skip to content

Commit ba942f5

Browse files
committed
feat: escape only % symbol
1 parent dda67fe commit ba942f5

File tree

3 files changed

+17
-24
lines changed

3 files changed

+17
-24
lines changed

packages/core/src/__tests__/ref-utils.test.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,8 @@ describe('ref-utils', () => {
168168
expect(escapePointerFragment(123)).toStrictEqual(123);
169169
});
170170

171-
it('should URI-encode special characters when escaping pointer fragments per https://datatracker.ietf.org/doc/html/rfc6901#section-6', () => {
171+
it('should URI-encode percent sign when escaping pointer fragments', () => {
172172
expect(escapePointerFragment('percent%')).toStrictEqual('percent%25');
173-
expect(escapePointerFragment('caret^')).toStrictEqual('caret%5E');
174-
expect(escapePointerFragment('pipe|')).toStrictEqual('pipe%7C');
175-
expect(escapePointerFragment('doublebackslash\\\\')).toStrictEqual('doublebackslash%5C');
176-
expect(escapePointerFragment('backslash\\')).toStrictEqual('backslash%22');
177-
expect(escapePointerFragment('space ')).toStrictEqual('space%20');
178173
});
179174

180175
it('should not URI-encode other special characters when escaping pointer fragments per https://datatracker.ietf.org/doc/html/rfc6901#section-6', () => {

packages/core/src/ref-utils.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,21 @@ export class Location {
4141
}
4242

4343
export function unescapePointerFragment(fragment: string): string {
44-
return decodeURIComponent(fragment).replaceAll('~1', '/').replaceAll('~0', '~');
44+
try {
45+
return decodeURIComponent(fragment.replaceAll('~1', '/').replaceAll('~0', '~'));
46+
} catch (error) {
47+
return fragment.replaceAll('~1', '/').replaceAll('~0', '~');
48+
}
4549
}
4650

4751
export function escapePointerFragment<T extends string | number>(fragment: T): T {
4852
if (typeof fragment === 'number') return fragment;
49-
return encodeURIFragmentIdentifier(fragment.replaceAll('~', '~0').replaceAll('/', '~1')) as T;
50-
}
51-
52-
// RFC 6901: https://datatracker.ietf.org/doc/html/rfc6901#section-6
53-
function encodeURIFragmentIdentifier(fragment: string): string {
54-
return fragment
55-
.replaceAll('%', '%25')
56-
.replaceAll('^', '%5E')
57-
.replaceAll('|', '%7C')
58-
.replaceAll('\\\\', '%5C')
59-
.replaceAll('\\', '%22')
60-
.replaceAll(' ', '%20');
53+
let result: string = fragment;
54+
// add only % escape if % is present
55+
if (result.includes('%')) {
56+
result = result.replaceAll('%', '%25');
57+
}
58+
return result.replaceAll('~', '~0').replaceAll('/', '~1') as T;
6159
}
6260

6361
export function parseRef(ref: string): { uri: string | null; pointer: string[] } {

packages/core/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ describe('Oas3 spec-components-invalid-map-name', () => {
4343
{
4444
"location": [
4545
{
46-
"pointer": "#/components/parameters/my%20Param",
46+
"pointer": "#/components/parameters/my Param",
4747
"reportOnKey": true,
4848
"source": Source {
4949
"absoluteRef": "",
@@ -79,7 +79,7 @@ describe('Oas3 spec-components-invalid-map-name', () => {
7979
{
8080
"location": [
8181
{
82-
"pointer": "#/components/schemas/first%20schema",
82+
"pointer": "#/components/schemas/first schema",
8383
"reportOnKey": true,
8484
"source": Source {
8585
"absoluteRef": "",
@@ -115,7 +115,7 @@ describe('Oas3 spec-components-invalid-map-name', () => {
115115
{
116116
"location": [
117117
{
118-
"pointer": "#/components/responses/400%20status",
118+
"pointer": "#/components/responses/400 status",
119119
"reportOnKey": true,
120120
"source": Source {
121121
"absoluteRef": "",
@@ -151,7 +151,7 @@ describe('Oas3 spec-components-invalid-map-name', () => {
151151
{
152152
"location": [
153153
{
154-
"pointer": "#/components/examples/invalid%20identifier",
154+
"pointer": "#/components/examples/invalid identifier",
155155
"reportOnKey": true,
156156
"source": Source {
157157
"absoluteRef": "",
@@ -251,7 +251,7 @@ describe('Oas3 spec-components-invalid-map-name', () => {
251251
{
252252
"location": [
253253
{
254-
"pointer": "#/components/parameters/my%20Param",
254+
"pointer": "#/components/parameters/my Param",
255255
"reportOnKey": true,
256256
"source": Source {
257257
"absoluteRef": "",

0 commit comments

Comments
 (0)