{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "https://wails.io/schemas/config.v2.json",
    "required": [],
    "title": "Wails configuration schema",
    "description": "A JSON representation of a Wails project config file.",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "The project name",
            "default": "wailsapp"
        },
        "assetdir": {
            "type": "string",
            "description": "Relative path to the directory containing the compiled assets. This is normally inferred, and can be left empty."
        },
        "reloaddirs": {
            "type": "string",
            "description": "Additional directories to trigger reloads (comma separated). Often, this is only used for advanced asset configurations."
        },
        "build:dir": {
            "type": "string",
            "description": "The directory where the build files reside.",
            "default": "build",
            "examples": [
                "./build",
                "/absolute/path/to/build",
                "C:\\absolute\\path\\to\\build"
            ]
        },
        "frontend:dir": {
            "type": "string",
            "description": "The directory where the frontend files reside.",
            "default": "frontend",
            "examples": [
                "./src",
                "/absolute/path/to/frontend",
                "C:\\absolute\\path\\to\\frontend"
            ]
        },
        "frontend:install": {
            "type": "string",
            "description": "The command to install dependencies. Run in the frontend directory.",
            "examples": [
                "npm install"
            ]
        },
        "frontend:build": {
            "type": "string",
            "description": "The command to build the assets. Run in the frontend directory.",
            "examples": [
                "npm run build"
            ]
        },
        "frontend:dev": {
            "type": "string",
            "description": "[Deprecated] This command has been replaced by `frontend:dev:build`. If `frontend:dev:build` is not specified, Wails will fall back to this command. If this command is also not specified, Wails will fall back to `frontend:build`."
        },
        "frontend:dev:build": {
            "type": "string",
            "description": "The equivalent of `frontend:build` during development. If not specified, it falls back to `frontend:dev`."
        },
        "frontend:dev:install": {
            "type": "string",
            "description": "The equivalent of `frontend:install` during development. If not specified, it falls back to `frontend:install`."
        },
        "frontend:dev:watcher": {
            "type": "string",
            "description": "This command is run in a separate process on `wails dev`. Useful for third-party watchers or for starting third-party dev servers."
        },
        "frontend:dev:serverUrl": {
            "type": "string",
            "description": "URL to a 3rd party dev server to be used to serve assets (eg. Vite). If this is set to 'auto', then the devServerUrl will be inferred from the Vite output",
            "examples": [
                "auto",
                "http://localhost:3000"
            ],
            "oneOf": [
                {
                    "format": "uri"
                },
                {
                    "const": "auto"
                }
            ]
        },
        "wailsjsdir": {
            "type": "string",
            "description": "Relative path to the directory where the auto-generated JS modules will be created.",
            "format": "uri-reference",
            "default": "The value of frontend:dir"
        },
        "version": {
            "description": "Project config version",
            "default": "2",
            "enum": [
                "2"
            ]
        },
        "outputfilename": {
            "type": "string",
            "description": "The name of the binary"
        },
        "debounceMS": {
            "type": "number",
            "description": "The debounce time for hot-reload of the built-in dev server. Measured in milliseconds.",
            "default": 100
        },
        "devServer": {
            "type": "string",
            "description": "The address to bind the wails dev server to.",
            "default": "localhost:34115",
            "format": "uri"
        },
        "appargs": {
            "type": "string",
            "description": "Arguments passed to the application in shell style when in dev mode."
        },
        "runNonNativeBuildHooks": {
            "type": "boolean",
            "description": "Whether to run build hooks that are defined for an OS other than the host OS.",
            "default": false
        },
        "preBuildHooks": {
            "$ref": "#/definitions/buildHooks"
        },
        "postBuildHooks": {
            "$ref": "#/definitions/buildHooks"
        },
        "author": {
            "type": "object",
            "description": "The application author",
            "properties": {
                "name": {
                    "type": "string"
                },
                "email": {
                    "type": "string",
                    "format": "email"
                }
            }
        },
        "info": {
            "type": "object",
            "description": "Data used to populate manifests and version info.",
            "properties": {
                "companyName": {
                    "type": "string",
                    "description": "The company name. Defaults to the project name."
                },
                "productName": {
                    "type": "string",
                    "description": "The product name. Defaults to the project name."
                },
                "productVersion": {
                    "type": "string",
                    "description": "The version of the product",
                    "default": "1.0.0"
                },
                "copyright": {
                    "type": "string",
                    "description": "A copyright string for the product",
                    "default": "Copyright........."
                },
                "comments": {
                    "type": "string",
                    "description": "A short comment for the app",
                    "default": "Built using Wails (https://wails.io)"
                },
                "fileAssociations": {
                    "type": "array",
                    "description": "File associations for the app",
                    "items": {
                        "type": "object",
                        "properties": {
                            "ext": {
                                "type": "string",
                                "description": "The extension (minus the leading period). e.g. png"
                            },
                            "name": {
                                "type": "string",
                                "description": "The name. e.g. PNG File"
                            },
                            "description": {
                                "type": "string",
                                "description": "Windows-only. The description. It is displayed on the `Type` column on Windows Explorer."
                            },
                            "iconName": {
                                "type": "string",
                                "description": "The icon name without extension. Icons should be located in build folder. Proper icons will be generated from .png file for both macOS and Windows)"
                            },
                            "role": {
                                "description": "macOS-only. The app’s role with respect to the type. Corresponds to CFBundleTypeRole.",
                                "allOf": [
                                    {
                                        "$ref": "#/definitions/BundleTypeRole"
                                    }
                                ]
                            }
                        }
                    }
                },
                "protocols": {
                    "type": "array",
                    "description": "Custom URI protocols that should be opened by the application",
                    "items": {
                        "type": "object",
                        "properties": {
                            "scheme": {
                                "type": "string",
                                "description": "protocol scheme. e.g. myapp"
                            },
                            "description": {
                                "type": "string",
                                "description": "Windows-only. The description. It is displayed on the `Type` column on Windows Explorer."
                            },
                            "role": {
                                "description": "macOS-only. The app’s role with respect to the type. Corresponds to CFBundleTypeRole.",
                                "allOf": [
                                    {
                                        "$ref": "#/definitions/BundleTypeRole"
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        },
        "nsisType": {
            "type": "string",
            "default": "multiple",
            "description": "Type of NSIS Installer for Windows",
            "oneOf": [
                {
                    "const": "multiple",
                    "description": "One installer per architecture"
                },
                {
                    "const": "single",
                    "description": "Single universal installer for all architectures being built"
                }
            ]
        },
        "obfuscated": {
            "type": "boolean",
            "default": false,
            "description": "Whether the binary should be obfuscated. Uses <https://github.com/burrowers/garble>."
        },
        "garbleargs": {
            "type": "string",
            "description": "The arguments to pass to the garble command when using the obfuscated flag"
        },
        "bindings": {
            "type": "object",
            "description": "Bindings configurations",
            "properties": {
                "ts_generation": {
                    "type": "object",
                    "description": "model.ts file generation config",
                    "properties": {
                        "prefix": {
                            "type": "string",
                            "description": "All generated JavaScript entities will be prefixed with this value"
                        },
                        "suffix": {
                            "type": "string",
                            "description": "All generated JavaScript entities will be suffixed with this value"
                        },
                        "outputType": {
                            "allOf": [
                                {
                                    "$ref": "#/definitions/BindingsOutputTypes"
                                }
                            ]
                        }
                    }
                }
            }
        }
    },
    "dependencies": {
        "garbleargs": [
            "obfuscated"
        ]
    },
    "definitions": {
        "OsHook": {
            "title": "GOOS/*",
            "type": "string",
            "description": "Executed at build level before/after a build of the specific platform"
        },
        "OsArchHook": {
            "title": "GOOS/GOARCH",
            "type": "string",
            "description": "Executed at build level before/after a build of the specific platform and arch"
        },
        "buildHooks": {
            "type": "object",
            "description": "Build hooks for different targets.",
            "additionalProperties": false,
            "properties": {
                "{GOOS}/{GOARCH}": {
                    "$ref": "#/definitions/OsArchHook"
                },
                "{GOOS}/*": {
                    "$ref": "#/definitions/OsHook"
                },
                "windows/*": {
                    "$ref": "#/definitions/OsHook"
                },
                "linux/*": {
                    "$ref": "#/definitions/OsHook"
                },
                "darwin/*": {
                    "$ref": "#/definitions/OsHook"
                },
                "*/*": {
                    "type": "string",
                    "description": "Executed at build level before/after a build"
                }
            },
            "patternProperties": {
                "^[a-zA-Z0-9]+/[a-zA-Z0-9]+$": {
                    "type": "string",
                    "title": "GOOS/GOARCH",
                    "description": "Executed at build level before/after a build of the specific platform and arch"
                },
                "^[a-zA-Z0-9]+/\\*$": {
                    "type": "string",
                    "title": "GOOS/*",
                    "description": "Executed at build level before/after a build of the specific platform"
                }
            }
        },
        "BundleTypeRole": {
            "description": "macOS-only. Corresponds to CFBundleTypeRole",
            "oneOf": [
                {
                    "description": "CFBundleTypeRole.Editor. Files can be read and edited.",
                    "type": "string",
                    "enum": [
                        "Editor"
                    ]
                },
                {
                    "description": "CFBundleTypeRole.Viewer. Files can be read.",
                    "type": "string",
                    "enum": [
                        "Viewer"
                    ]
                },
                {
                    "description": "CFBundleTypeRole.Shell",
                    "type": "string",
                    "enum": [
                        "Shell"
                    ]
                },
                {
                    "description": "CFBundleTypeRole.QLGenerator",
                    "type": "string",
                    "enum": [
                        "QLGenerator"
                    ]
                },
                {
                    "description": "CFBundleTypeRole.None",
                    "type": "string",
                    "enum": [
                        "None"
                    ]
                }
            ]
        },
        "BindingsOutputTypes": {
            "description": "Type of output to generate",
            "oneOf": [
                {
                    "description": "Classes",
                    "type": "string",
                    "enum": [
                        "classes"
                    ]
                },
                {
                    "description": "Interfaces",
                    "type": "string",
                    "enum": [
                        "interfaces"
                    ]
                }
            ]
        }
    }
}
