ts-json-schema-generator icon indicating copy to clipboard operation
ts-json-schema-generator copied to clipboard

Missing $id prefix in $ref

Open wizardpisces opened this issue 2 years ago • 4 comments

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

wizardpisces avatar Jul 26 '23 02:07 wizardpisces

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

domoritz avatar Jul 26 '23 03:07 domoritz

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?

wizardpisces avatar Jul 26 '23 03:07 wizardpisces

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

domoritz avatar Jul 26 '23 12:07 domoritz