Skip to main content
Glama
recursion.test.js5.85 kB
'use strict' const { test } = require('node:test') const build = require('..') test('can stringify recursive directory tree (issue #181)', (t) => { t.plan(1) const schema = { definitions: { directory: { type: 'object', properties: { name: { type: 'string' }, subDirectories: { type: 'array', items: { $ref: '#/definitions/directory' }, default: [] } } } }, type: 'array', items: { $ref: '#/definitions/directory' } } const stringify = build(schema) t.assert.equal(stringify([ { name: 'directory 1', subDirectories: [] }, { name: 'directory 2', subDirectories: [ { name: 'directory 2.1', subDirectories: [] }, { name: 'directory 2.2', subDirectories: [] } ] } ]), '[{"name":"directory 1","subDirectories":[]},{"name":"directory 2","subDirectories":[{"name":"directory 2.1","subDirectories":[]},{"name":"directory 2.2","subDirectories":[]}]}]') }) test('can stringify when recursion in external schema', t => { t.plan(1) const referenceSchema = { $id: 'person', type: 'object', properties: { name: { type: 'string' }, children: { type: 'array', items: { $ref: '#' } } } } const schema = { $id: 'mainSchema', type: 'object', properties: { people: { $ref: 'person' } } } const stringify = build(schema, { schema: { [referenceSchema.$id]: referenceSchema } }) const value = stringify({ people: { name: 'Elizabeth', children: [{ name: 'Charles' }] } }) t.assert.equal(value, '{"people":{"name":"Elizabeth","children":[{"name":"Charles"}]}}') }) test('use proper serialize function', t => { t.plan(1) const personSchema = { $id: 'person', type: 'object', properties: { name: { type: 'string' }, children: { type: 'array', items: { $ref: '#' } } } } const directorySchema = { $id: 'directory', type: 'object', properties: { name: { type: 'string' }, subDirectories: { type: 'array', items: { $ref: '#' }, default: [] } } } const schema = { $id: 'mainSchema', type: 'object', properties: { people: { $ref: 'person' }, directory: { $ref: 'directory' } } } const stringify = build(schema, { schema: { [personSchema.$id]: personSchema, [directorySchema.$id]: directorySchema } }) const value = stringify({ people: { name: 'Elizabeth', children: [{ name: 'Charles', children: [{ name: 'William', children: [{ name: 'George' }, { name: 'Charlotte' }] }, { name: 'Harry' }] }] }, directory: { name: 'directory 1', subDirectories: [ { name: 'directory 1.1', subDirectories: [] }, { name: 'directory 1.2', subDirectories: [{ name: 'directory 1.2.1' }, { name: 'directory 1.2.2' }] } ] } }) t.assert.equal(value, '{"people":{"name":"Elizabeth","children":[{"name":"Charles","children":[{"name":"William","children":[{"name":"George"},{"name":"Charlotte"}]},{"name":"Harry"}]}]},"directory":{"name":"directory 1","subDirectories":[{"name":"directory 1.1","subDirectories":[]},{"name":"directory 1.2","subDirectories":[{"name":"directory 1.2.1","subDirectories":[]},{"name":"directory 1.2.2","subDirectories":[]}]}]}}') }) test('can stringify recursive references in object types (issue #365)', t => { t.plan(1) const schema = { type: 'object', definitions: { parentCategory: { type: 'object', properties: { parent: { $ref: '#/definitions/parentCategory' } } } }, properties: { category: { type: 'object', properties: { parent: { $ref: '#/definitions/parentCategory' } } } } } const stringify = build(schema) const data = { category: { parent: { parent: { parent: { parent: {} } } } } } const value = stringify(data) t.assert.equal(value, '{"category":{"parent":{"parent":{"parent":{"parent":{}}}}}}') }) test('can stringify recursive inline $id references (issue #410)', t => { t.plan(1) const schema = { $id: 'Node', type: 'object', properties: { id: { type: 'string' }, nodes: { type: 'array', items: { $ref: 'Node' } } }, required: [ 'id', 'nodes' ] } const stringify = build(schema) const data = { id: '0', nodes: [ { id: '1', nodes: [{ id: '2', nodes: [ { id: '3', nodes: [] }, { id: '4', nodes: [] }, { id: '5', nodes: [] } ] }] }, { id: '6', nodes: [{ id: '7', nodes: [ { id: '8', nodes: [] }, { id: '9', nodes: [] }, { id: '10', nodes: [] } ] }] }, { id: '11', nodes: [{ id: '12', nodes: [ { id: '13', nodes: [] }, { id: '14', nodes: [] }, { id: '15', nodes: [] } ] }] } ] } const value = stringify(data) t.assert.equal(value, '{"id":"0","nodes":[{"id":"1","nodes":[{"id":"2","nodes":[{"id":"3","nodes":[]},{"id":"4","nodes":[]},{"id":"5","nodes":[]}]}]},{"id":"6","nodes":[{"id":"7","nodes":[{"id":"8","nodes":[]},{"id":"9","nodes":[]},{"id":"10","nodes":[]}]}]},{"id":"11","nodes":[{"id":"12","nodes":[{"id":"13","nodes":[]},{"id":"14","nodes":[]},{"id":"15","nodes":[]}]}]}]}') })

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/krtw00/search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server