vega / ts-json-schema-generator

Generate JSON schema from your Typescript sources
MIT License
1.44k stars 190 forks source link

Missing $id prefix in $ref #1732

Open wizardpisces opened 1 year ago

wizardpisces commented 1 year ago

How to produce

ts-json-schema-generator -f './tsconfig.json' -p './type.ts' -o './scheme.json' --id='api'

./type.ts


export type ApiSchema = {
    N: B
}

export type B = string

What to expect?

./schema.json


{
  "$id": "api",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "ApiSchema": {
      "type": "object",
      "properties": {
        "N": {
          "$ref": "api#/definitions/B" // with api prefix
        }
      },
      "required": [
        "N"
      ],
      "additionalProperties": false
    },
    "B": {
      "type": "string"
    }
  }
}

What is actually happening?

./schema.json


{
  "$id": "api",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "ApiSchema": {
      "type": "object",
      "properties": {
        "N": {
          "$ref": "#/definitions/B" // missing api prefix
        }
      },
      "required": [
        "N"
      ],
      "additionalProperties": false
    },
    "B": {
      "type": "string"
    }
  }
}

Is this by design?

I think it's a serious bug, because it sabotages the combination with ajv validation

By the way typescript-json-schema can generate the expected result

domoritz commented 1 year ago

Huh, can you look into why ID is being ignored?

wizardpisces commented 1 year ago

Huh, can you look into why ID is being ignored?

No idea why it's designed like this, but I searched source code and got below discover

In ts-json-schema-generator, DefinitionTypeFormatter and ReferenceTypeFormatter hard coded '#/definition' as prefix

image

While in typescript-json-schema, $id will be used as prefix

image

Since ts-json-schema-generator is an extended version of typescript-json-schema, so I think their basic behavior should be same?

domoritz commented 1 year ago

Yeah, looks like we accidentally broke that at some point. Let's fix it.

arthurfiorette commented 4 months ago

Would you like to start a PR? I'm happy to review it