glideapps / quicktype

Generate types and converters from JSON, Schema, and GraphQL
https://app.quicktype.io
Apache License 2.0
12.47k stars 1.08k forks source link

[FEATURE]: On Dart with Freezed, be able to prevent conflicts with nested types on JSON Schema #2660

Open polvallverdu opened 4 weeks ago

polvallverdu commented 4 weeks ago

Context (Input, Language)

Input Format: Json Schema Output Language: Dart Freezed

Description

Currently generating Freezed classes for Dart defines nested objects with their literal name, which may cause conflicts if multiple objects are needed. Some stuff is being done if it conflicts with it's own schema, but not for other schemas.

Current Behaviour / Output

bunx quicktype --lang dart --src-lang schema -t Fasfasfsa --just-types --use-freezed
{
  "type": "object",
  "properties": {
    "hello": {
      "type": "string"
    },
    "works": {
      "type": "object",
      "properties": {
        "yes": {
          "type": "boolean"
        },
        "no": {
          "type": "boolean"
        }
      },
      "required": ["yes", "no"],
      "additionalProperties": false
    }
  },
  "required": ["hello", "works"],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
@freezed
class Fasfasfsa with _$Fasfasfsa {
    const factory Fasfasfsa({
        required String hello,
        required Works works,
    }) = _Fasfasfsa;
}

@freezed
class Works with _$Works {
    const factory Works({
        required bool no,
        required bool yes,
    }) = _Works;
}

Proposed Behaviour / Output

bunx quicktype --lang dart --src-lang schema -t Fasfasfsa --just-types --use-freezed
{
  "type": "object",
  "properties": {
    "hello": {
      "type": "string"
    },
    "works": {
      "type": "object",
      "properties": {
        "yes": {
          "type": "boolean"
        },
        "no": {
          "type": "boolean"
        }
      },
      "required": ["yes", "no"],
      "additionalProperties": false
    }
  },
  "required": ["hello", "works"],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
@freezed
class Fasfasfsa with _$Fasfasfsa {
    const factory Fasfasfsa({
        required String hello,
        required Fasfasfsa_Works works,
    }) = _Fasfasfsa;
}

@freezed
class Fasfasfsa_Works with _$Fasfasfsa_Works {
    const factory Fasfasfsa_Works({
        required bool no,
        required bool yes,
    }) = _Fasfasfsa_Works;
}

Solution

Somehow relate nested objects with their parents, to prevent conflicts.

Alternatives

Having the ability to control those names somehow, without needing interactivity. (kinda impossible)

DmitryFrontDev commented 4 days ago

I know the issue in your project and I will bring you good solutions if you can reach out me.

himay123 commented 4 days ago

Hello @polvallverdu

I have fixed dart freezed issue in my local system Can you please help me with do testing

himay123 commented 4 days ago

Screenshot from 2024-11-20 01-38-16

check output

polvallverdu commented 4 days ago

Screenshot from 2024-11-20 01-38-16

check output

I don't see what you fixed.