Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a JSON schema #146

Closed
UnderKoen opened this issue Jul 7, 2023 · 4 comments
Closed

Add a JSON schema #146

UnderKoen opened this issue Jul 7, 2023 · 4 comments

Comments

@UnderKoen
Copy link

UnderKoen commented Jul 7, 2023

Description

I would like to have the benefits of #130 without using js.

Suggested Solution

Define a JSON schema in the repository,
This can be automaticly done by: https://github.com/vega/ts-json-schema-generator

Help needed

When running on this project it fails, due to an type error with @types/fs-extra. Idk what it is

npx ts-json-schema-generator --path 'src/index.ts' --type 'RcFile'
@JamieMason
Copy link
Owner

Thanks @UnderKoen, sounds good.
For anyone wanting to pick this up, I think fs-extra could be quite easily removed as a dependency.

JamieMason added a commit that referenced this issue Aug 13, 2023
@JamieMason
Copy link
Owner

JamieMason commented Aug 13, 2023

@UnderKoen I have the following schema generated:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "definitions": {
        "Record<string,CustomTypeConfig.Any>": {
            "type": "object"
        },
        "SemverGroupConfig.Any": {
            "anyOf": [
                {
                    "$ref": "#/definitions/{isIgnored:true;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];range?:never;}"
                },
                {
                    "$ref": "#/definitions/{range:SemverRange;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;}"
                }
            ]
        },
        "SemverRange": {
            "default": "",
            "description": "Aliases for semver range formats supported by syncpack\n\nDefaults to `\"\"` to ensure that exact dependency versions are used\ninstead of loose ranges, but this can be overridden in your config file\nor via the `--semver-range` command line option.\n\n| Supported Range |   Example |\n| --------------- | --------: |\n| `\"<\"`           |  `<1.4.2` |\n| `\"<=\"`          | `<=1.4.2` |\n| `\"\"`            |   `1.4.2` |\n| `\"~\"`           |  `~1.4.2` |\n| `\"^\"`           |  `^1.4.2` |\n| `\">=\"`          | `>=1.4.2` |\n| `\">\"`           |  `>1.4.2` |\n| `\"*\"`           |       `*` |",
            "enum": [
                "",
                "*",
                ".x",
                "<",
                "<=",
                ">",
                ">=",
                "^",
                "~"
            ],
            "type": "string"
        },
        "VersionGroupConfig.Any": {
            "anyOf": [
                {
                    "$ref": "#/definitions/{isBanned:true;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;pinVersion?:never;snapTo?:never;policy?:never;preferVersion?:never;}"
                },
                {
                    "$ref": "#/definitions/{isIgnored:true;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isBanned?:never;pinVersion?:never;snapTo?:never;policy?:never;preferVersion?:never;}"
                },
                {
                    "$ref": "#/definitions/{pinVersion:string;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;snapTo?:never;policy?:never;preferVersion?:never;}"
                },
                {
                    "$ref": "#/definitions/{snapTo:string[];dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;pinVersion?:never;policy?:never;preferVersion?:never;}"
                },
                {
                    "$ref": "#/definitions/{policy:\"sameRange\";dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;pinVersion?:never;snapTo?:never;preferVersion?:never;}"
                },
                {
                    "$ref": "#/definitions/{preferVersion?:\"highestSemver\"|\"lowestSemver\";dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;pinVersion?:never;snapTo?:never;policy?:never;}"
                }
            ]
        },
        "{isBanned:true;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;pinVersion?:never;snapTo?:never;policy?:never;preferVersion?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "isBanned": {
                    "const": true,
                    "type": "boolean"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                }
            },
            "type": "object"
        },
        "{isIgnored:true;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isBanned?:never;pinVersion?:never;snapTo?:never;policy?:never;preferVersion?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "isIgnored": {
                    "const": true,
                    "type": "boolean"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                }
            },
            "type": "object"
        },
        "{isIgnored:true;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];range?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "isIgnored": {
                    "const": true,
                    "type": "boolean"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                }
            },
            "type": "object"
        },
        "{pinVersion:string;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;snapTo?:never;policy?:never;preferVersion?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "pinVersion": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        "{policy:\"sameRange\";dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;pinVersion?:never;snapTo?:never;preferVersion?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "policy": {
                    "const": "sameRange",
                    "type": "string"
                }
            },
            "type": "object"
        },
        "{preferVersion?:\"highestSemver\"|\"lowestSemver\";dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;pinVersion?:never;snapTo?:never;policy?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "preferVersion": {
                    "enum": [
                        "highestSemver",
                        "lowestSemver"
                    ],
                    "type": "string"
                }
            },
            "type": "object"
        },
        "{range:SemverRange;dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "range": {
                    "$ref": "#/definitions/SemverRange"
                }
            },
            "type": "object"
        },
        "{snapTo:string[];dependencies:string[];dependencyTypes?:string[];label?:string;packages:string[];isIgnored?:never;isBanned?:never;pinVersion?:never;policy?:never;preferVersion?:never;}": {
            "properties": {
                "dependencies": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "dependencyTypes": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "label": {
                    "type": "string"
                },
                "packages": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "snapTo": {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                }
            },
            "type": "object"
        }
    },
    "properties": {
        "customTypes": {
            "$ref": "#/definitions/Record<string,CustomTypeConfig.Any>"
        },
        "dependencyTypes": {
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "filter": {
            "type": "string"
        },
        "indent": {
            "type": "string"
        },
        "semverGroups": {
            "items": {
                "$ref": "#/definitions/SemverGroupConfig.Any"
            },
            "type": "array"
        },
        "semverRange": {
            "$ref": "#/definitions/SemverRange"
        },
        "sortAz": {
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "sortFirst": {
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "source": {
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "versionGroups": {
            "items": {
                "$ref": "#/definitions/VersionGroupConfig.Any"
            },
            "type": "array"
        }
    },
    "type": "object"
}

I can't find any guides on how JSON Schema files should generally be published and/or consumed, the file is currently in ./dist so would be located in published packages at 'syncpack/schema.json' – how would an end user use this please @UnderKoen?

EDIT: Ok I think I need to host it somewhere based on this guide. I could suggest in the docs that users use eg "$schema": "https://unpkg.com/syncpack@11.2.1/dist/schema.json" where 11.2.1 is a future version once this is released.

@UnderKoen
Copy link
Author

Yes, that would work

@JamieMason
Copy link
Owner

Released in 11.2.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants