fastify / fastify/fast-json-stringify

Error using stringify on schema with uri-encoded definition property containing anyOf, allOf or oneOf

Open
#740 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
JavaScript
Stars
3.7k
Forks
226
Avg merge
1d 59m
Merged PRs (30d)
3

Description

### Prerequisites

- [X] I have written a descriptive issue title
- [X] I have searched existing issues to ensure the bug has not already been reported

### Fastify version

Latest version

### Plugin version

6.0.0

### Node.js version

20.1.0

### Operating system

Linux

### Operating system version (i.e. 20.04, 11.3, 10)

22.04.4 LTS

### Description

While using stringify I started getting "can't resolve reference" error.
It seems that when you have a definition property using a uri-encoding like '%3C' or '%22', and this property has fields contaning oneOf, allOf or anyOf, it returns the error.

The following code can be run on the fast-json-stringify test suite to confirm the error.

```javascript
'use strict'

const { test } = require('tap')
const build = require('..')

process.env.TZ = 'UTC'

test('ref internal - properties', (t) => {
t.plan(1)

const schema = {
title: 'object with $ref',
definitions: {
'Some%3Cloremipsum%3E': {
additionalProperties: {
oneOf: [
{ type: 'string' },
{ type: 'number' },
{ type: 'object' },
{ type: 'null' }
]
},
type: 'object'
}
},
type: 'object',
properties: {
obj: {
$ref: '#/definitions/Some%3Cloremipsum%3E'
}
}
}

const object = {
obj: {
str: 'test'
}
}

const stringify = build(schema)
const output = stringify(object)

JSON.parse(output)
t.pass()

t.equal(output, '{"obj":{"str":"test"}}')
})
```

The error exhibited is

```
FAIL test/anyof.test.js 1 failed of 1 1.183s
✖ ref internal - properties > can't resolve reference
#/definitions/Some%3Cloremipsum%3E from id __fjs_root_0
node_modules/ajv/lib/vocabularies/core/ref.ts
16 const {root} = env
17 if (($ref === "#" || $ref === "#/") && baseId === root.baseId)
return callRootRef()
18 const schOrEnv = resolveRef.call(self, root, baseId, $ref)
19 if (schOrEnv === undefined) throw new
MissingRefError(it.opts.uriResolver, baseId, $ref)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
20 if (schOrEnv instanceof SchemaEnv) return callValidate(schOrEnv)
21 return inlineRefSchema(schOrEnv)
22
23 function callRootRef(): void {
missingRef: __fjs_root_0#/definitions/Some%3Cloremipsum%3E
missingSchema: __fjs_root_0
tapCaught: testFunctionThrow
Object.code (node_modules/ajv/lib/vocabularies/core/ref.ts:19:39)
keywordCode (node_modules/ajv/lib/compile/validate/index.ts:532:9)
(node_modules/ajv/lib/compile/validate/index.ts:228:21)
CodeGen.code (node_modules/ajv/lib/compile/codegen/index.ts:545:33)
CodeGen.block (node_modules/ajv/lib/compile/codegen/index.ts:700:20)
schemaKeywords (node_modules/ajv/lib/compile/validate/index.ts:228:9)
typeAndKeywords (node_modules/ajv/lib/compile/validate/index.ts:161:3)
subSchemaObjCode (node_modules/ajv/lib/compile/validate/index.ts:147:3)
subschemaCode (node_modules/ajv/lib/compile/validate/index.ts:124:7)
KeywordCxt.subschema
(node_modules/ajv/lib/compile/validate/index.ts:500:5)
```

Removing the '%' on the definition property OR removing oneOf like in the following code returns no error.
```javascript
'Some%3Cloremipsum%3E': {
additionalProperties: {
type: 'string' ,
},
type: 'object'
}
```

### Link to code that reproduces the bug

_No response_

### Expected Behavior

_No response_

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.