Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

[Schema Inaccuracy] Duplicate title properties and inline schemas #4622

Copy link
Copy link
Open
@wolfy1339

Description

@wolfy1339
Issue body actions

Schema Inaccuracy

The schema contains many inline schemas (that should be using re-usable components) and many inline schemas and components that have duplicate title properties

This causes problems when using tools like json-schema-to-typescript where you end up with many TypeScript interfaces named User_3, Repository_1, etc.

Expected

No inline schemas for re-used definitions, or schemas that have the same title

Reproduction Steps

This script logs all duplicate title properties found

import schema from "./packages/openapi-webhooks/generated/api.github.com.json" with { type: "json" };
import { writeFileSync } from "node:fs";

function findDuplicateTitles(schema) {
  const seen = new Set();
  const duplicates = [];

  function traverse(obj, path = []) {
    if (typeof obj !== "object" || obj === null) return;

    if (obj.title) {
      const titlePath = path.join("/");
      if (seen.has(obj.title)) {
        duplicates.push({ title: obj.title, path: titlePath });
      } else {
        seen.add(obj.title);
      }
    }

    // Traverse properties like oneOf, anyOf, etc.
    for (const [key, value] of Object.entries(obj)) {
      if (Array.isArray(value)) {
        value.forEach((item, index) => traverse(item, [...path, key, index]));
      } else if (typeof value === "object") {
        traverse(value, [...path, key]);
      }
    }
  }

  traverse(schema);
  return duplicates;
}

async function main() {
  const duplicates = findDuplicateTitles(schema)
    .sort((a, b) => {
      if (a.title < b.title) return -1;
      if (a.title > b.title) return 1;
      return 0;
    })
    .map(({ title, path }) => `- [ ] Title: ${title}, Path: \`#/${path}\``);

  writeFileSync("duplicates.txt", duplicates.join("\n"));
}

main().catch(console.error);

Here is the list of duplicates I have found, which is too long to post directly into the issue body:
duplicates.txt

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    Morty Proxy This is a proxified and sanitized view of the page, visit original site.