From 8197720a95403e2a44474231df73915dd3595b5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Sep 2022 21:01:00 +0000 Subject: [PATCH 001/152] deps: bump @typescript-eslint/parser from 5.35.1 to 5.36.1 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.35.1 to 5.36.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.36.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 98 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7230f85..565e580c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "languague-renpy", - "version": "2.0.12", + "version": "2.0.13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.0.12", + "version": "2.0.13", "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", "@types/node": "^18.7.13", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.32.0", - "@typescript-eslint/parser": "^5.35.1", + "@typescript-eslint/parser": "^5.36.1", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.7.4", @@ -244,14 +244,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", + "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.1", "debug": "^4.3.4" }, "engines": { @@ -271,13 +271,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", + "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1" + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -314,9 +314,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", + "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -327,13 +327,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", + "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -452,12 +452,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", + "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.35.1", + "@typescript-eslint/types": "5.36.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2970,25 +2970,25 @@ } }, "@typescript-eslint/parser": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", + "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", + "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1" + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1" } }, "@typescript-eslint/type-utils": { @@ -3003,19 +3003,19 @@ } }, "@typescript-eslint/types": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", + "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", + "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3081,12 +3081,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", + "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.35.1", + "@typescript-eslint/types": "5.36.1", "eslint-visitor-keys": "^3.3.0" } }, diff --git a/package.json b/package.json index b3ac5044..df24d1df 100644 --- a/package.json +++ b/package.json @@ -184,7 +184,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.7.13", "@typescript-eslint/eslint-plugin": "^5.32.0", - "@typescript-eslint/parser": "^5.35.1", + "@typescript-eslint/parser": "^5.36.1", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.7.4", From affd001e28233e0860e84a5805a3699c43a82cf0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:21:57 +0000 Subject: [PATCH 002/152] deps: bump @types/node from 18.7.13 to 18.7.23 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.7.13 to 18.7.23. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 565e580c..6e64bce7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", - "@types/node": "^18.7.13", + "@types/node": "^18.7.23", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.32.0", "@typescript-eslint/parser": "^5.36.1", @@ -152,9 +152,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", - "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==", + "version": "18.7.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", + "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", "dev": true }, "node_modules/@types/vscode": { @@ -2913,9 +2913,9 @@ "dev": true }, "@types/node": { - "version": "18.7.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", - "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==", + "version": "18.7.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", + "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", "dev": true }, "@types/vscode": { diff --git a/package.json b/package.json index df24d1df..e68f190a 100644 --- a/package.json +++ b/package.json @@ -182,7 +182,7 @@ "devDependencies": { "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", - "@types/node": "^18.7.13", + "@types/node": "^18.7.23", "@typescript-eslint/eslint-plugin": "^5.32.0", "@typescript-eslint/parser": "^5.36.1", "eslint": "^8.23.0", From 89bafd816ea8fed00f0a6b7c946eeb444c33eb96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:26:16 +0000 Subject: [PATCH 003/152] deps: bump @typescript-eslint/eslint-plugin from 5.32.0 to 5.38.1 Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.32.0 to 5.38.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.38.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 276 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 184 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e64bce7..a82fed1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.7.23", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "^5.32.0", + "@typescript-eslint/eslint-plugin": "^5.38.1", "@typescript-eslint/parser": "^5.36.1", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", @@ -164,16 +164,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz", - "integrity": "sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", + "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/type-utils": "5.32.0", - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/type-utils": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", @@ -197,13 +196,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", + "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -214,9 +213,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -227,12 +226,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.38.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -288,12 +287,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz", - "integrity": "sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", + "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -313,6 +313,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", + "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.38.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/types": { "version": "5.36.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", @@ -354,15 +411,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.32.0.tgz", - "integrity": "sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", + "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/typescript-estree": "5.38.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -378,13 +435,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", + "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -395,9 +452,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -408,13 +465,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", + "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -435,12 +492,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.38.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2925,16 +2982,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz", - "integrity": "sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", + "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/type-utils": "5.32.0", - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/type-utils": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", @@ -2942,28 +2998,28 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", + "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1" } }, "@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", "dev": true }, "@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.38.1", "eslint-visitor-keys": "^3.3.0" } } @@ -2992,14 +3048,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz", - "integrity": "sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", + "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/utils": "5.38.1", "debug": "^4.3.4", "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", + "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.1", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/types": { @@ -3024,43 +3114,43 @@ } }, "@typescript-eslint/utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.32.0.tgz", - "integrity": "sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", + "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", + "@typescript-eslint/scope-manager": "5.38.1", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/typescript-estree": "5.38.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", + "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1" } }, "@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", + "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", + "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", + "@typescript-eslint/types": "5.38.1", + "@typescript-eslint/visitor-keys": "5.38.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3069,12 +3159,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", + "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.38.1", "eslint-visitor-keys": "^3.3.0" } } diff --git a/package.json b/package.json index e68f190a..ceeb8a4a 100644 --- a/package.json +++ b/package.json @@ -183,7 +183,7 @@ "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", "@types/node": "^18.7.23", - "@typescript-eslint/eslint-plugin": "^5.32.0", + "@typescript-eslint/eslint-plugin": "^5.38.1", "@typescript-eslint/parser": "^5.36.1", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", From a01d2bc7d260c9daced90c28b65839128ca1b104 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:30:06 +0000 Subject: [PATCH 004/152] deps: bump typescript from 4.7.4 to 4.8.4 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.7.4 to 4.8.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.7.4...v4.8.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a82fed1e..f6fa2322 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@typescript-eslint/parser": "^5.36.1", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", - "typescript": "^4.7.4", + "typescript": "^4.8.4", "vscode-test": "^1.6.1" }, "engines": { @@ -2731,9 +2731,9 @@ } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -4809,9 +4809,9 @@ "dev": true }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, "unbox-primitive": { diff --git a/package.json b/package.json index ceeb8a4a..bf18a9df 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "@typescript-eslint/parser": "^5.36.1", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", - "typescript": "^4.7.4", + "typescript": "^4.8.4", "vscode-test": "^1.6.1" } } From b61fc176adec07246ff8d90175477ebcc0f3be9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 21:01:32 +0000 Subject: [PATCH 005/152] deps: bump @typescript-eslint/parser from 5.36.1 to 5.45.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.36.1 to 5.45.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.45.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 94 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index f6fa2322..ee6aee3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@types/node": "^18.7.23", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.38.1", - "@typescript-eslint/parser": "^5.36.1", + "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", @@ -243,14 +243,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", - "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", + "integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/scope-manager": "5.45.0", + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/typescript-estree": "5.45.0", "debug": "^4.3.4" }, "engines": { @@ -270,13 +270,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", - "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz", + "integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1" + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/visitor-keys": "5.45.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -371,9 +371,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", - "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", + "integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -384,13 +384,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", - "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz", + "integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1", + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/visitor-keys": "5.45.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -509,12 +509,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", - "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", + "integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/types": "5.45.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3026,25 +3026,25 @@ } }, "@typescript-eslint/parser": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", - "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", + "integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/scope-manager": "5.45.0", + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/typescript-estree": "5.45.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", - "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz", + "integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1" + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/visitor-keys": "5.45.0" } }, "@typescript-eslint/type-utils": { @@ -3093,19 +3093,19 @@ } }, "@typescript-eslint/types": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", - "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", + "integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", - "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz", + "integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1", + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/visitor-keys": "5.45.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3171,12 +3171,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", - "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", + "integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/types": "5.45.0", "eslint-visitor-keys": "^3.3.0" } }, diff --git a/package.json b/package.json index bf18a9df..ddd80640 100644 --- a/package.json +++ b/package.json @@ -184,7 +184,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.7.23", "@typescript-eslint/eslint-plugin": "^5.38.1", - "@typescript-eslint/parser": "^5.36.1", + "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.23.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", From fc95922bd4a26d6639615f42576e45e1974e9b46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Dec 2022 18:27:08 +0000 Subject: [PATCH 006/152] deps: bump eslint from 8.23.0 to 8.29.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.23.0 to 8.29.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.23.0...v8.29.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 161 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 83 insertions(+), 80 deletions(-) diff --git a/package-lock.json b/package-lock.json index ee6aee3d..bdc6bb7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.38.1", "@typescript-eslint/parser": "^5.45.0", - "eslint": "^8.23.0", + "eslint": "^8.29.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", "vscode-test": "^1.6.1" @@ -24,9 +24,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -47,29 +47,19 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -526,9 +516,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -905,15 +895,15 @@ } }, "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -929,15 +919,15 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -1279,9 +1269,9 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -1522,12 +1512,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -1600,9 +1584,9 @@ } }, "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1921,6 +1905,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -2003,6 +1996,16 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2874,9 +2877,9 @@ }, "dependencies": { "@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -2891,22 +2894,16 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -3181,9 +3178,9 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "acorn-jsx": { @@ -3468,15 +3465,15 @@ } }, "eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3492,15 +3489,15 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -3753,9 +3750,9 @@ "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -3950,12 +3947,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -4007,9 +3998,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -4229,6 +4220,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -4287,6 +4284,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", diff --git a/package.json b/package.json index ddd80640..07c410ff 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "@types/node": "^18.7.23", "@typescript-eslint/eslint-plugin": "^5.38.1", "@typescript-eslint/parser": "^5.45.0", - "eslint": "^8.23.0", + "eslint": "^8.29.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", "vscode-test": "^1.6.1" From 0cde2087df2c99ea90c913f3bbc687bc581fcc76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Dec 2022 18:28:37 +0000 Subject: [PATCH 007/152] deps: bump @typescript-eslint/eslint-plugin from 5.38.1 to 5.45.0 Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.38.1 to 5.45.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.45.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 386 ++++++++-------------------------------------- package.json | 2 +- 2 files changed, 68 insertions(+), 320 deletions(-) diff --git a/package-lock.json b/package-lock.json index bdc6bb7c..fe46625d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.7.23", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "^5.38.1", + "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.29.0", "eslint-plugin-import": "^2.26.0", @@ -147,6 +147,12 @@ "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/vscode": { "version": "1.66.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.66.0.tgz", @@ -154,16 +160,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", - "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz", + "integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/type-utils": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/scope-manager": "5.45.0", + "@typescript-eslint/type-utils": "5.45.0", + "@typescript-eslint/utils": "5.45.0", "debug": "^4.3.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -185,53 +192,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", - "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser": { "version": "5.45.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", @@ -277,13 +237,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", - "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz", + "integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/typescript-estree": "5.45.0", + "@typescript-eslint/utils": "5.45.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -303,63 +263,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", - "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { "version": "5.45.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", @@ -401,17 +304,19 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", - "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz", + "integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.45.0", + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/typescript-estree": "5.45.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -424,80 +329,6 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", - "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", - "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.45.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", @@ -2156,6 +1987,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -2972,6 +2809,12 @@ "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", "dev": true }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "@types/vscode": { "version": "1.66.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.66.0.tgz", @@ -2979,47 +2822,20 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz", - "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz", + "integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/type-utils": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/scope-manager": "5.45.0", + "@typescript-eslint/type-utils": "5.45.0", + "@typescript-eslint/utils": "5.45.0", "debug": "^4.3.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", - "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" - } - }, - "@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" - } - } } }, "@typescript-eslint/parser": { @@ -3045,48 +2861,15 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz", - "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz", + "integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/typescript-estree": "5.45.0", + "@typescript-eslint/utils": "5.45.0", "debug": "^4.3.4", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", - "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" - } - } } }, "@typescript-eslint/types": { @@ -3111,60 +2894,19 @@ } }, "@typescript-eslint/utils": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz", - "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz", + "integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.45.0", + "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/typescript-estree": "5.45.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz", - "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" - } - }, - "@typescript-eslint/types": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz", - "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz", - "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz", - "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" - } - } + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { @@ -4413,6 +4155,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", diff --git a/package.json b/package.json index 07c410ff..e259f262 100644 --- a/package.json +++ b/package.json @@ -183,7 +183,7 @@ "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", "@types/node": "^18.7.23", - "@typescript-eslint/eslint-plugin": "^5.38.1", + "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.29.0", "eslint-plugin-import": "^2.26.0", From 0fc5bd3f02466e13687f4b4ba7f89933469525fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 4 Dec 2022 18:30:46 +0000 Subject: [PATCH 008/152] deps: bump @types/node from 18.7.23 to 18.11.10 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.7.23 to 18.11.10. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe46625d..b9542012 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", - "@types/node": "^18.7.23", + "@types/node": "^18.11.10", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.45.0", @@ -142,9 +142,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", - "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "node_modules/@types/semver": { @@ -2804,9 +2804,9 @@ "dev": true }, "@types/node": { - "version": "18.7.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", - "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "@types/semver": { diff --git a/package.json b/package.json index e259f262..c3bc57c1 100644 --- a/package.json +++ b/package.json @@ -182,7 +182,7 @@ "devDependencies": { "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", - "@types/node": "^18.7.23", + "@types/node": "^18.11.10", "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.29.0", From 8a1081ec6582b883ee5e1e995ad5a1ca70a92b7e Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sun, 4 Dec 2022 19:52:21 +0100 Subject: [PATCH 009/152] fix: enables the extension when the language is renpy Fixes #178 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c3bc57c1..86e47a90 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ } }, "activationEvents": [ + "onLanguage:renpy", "workspaceContains:**/*.rpy" ], "main": "./out/extension", From a4c6bd20c1bc12b06c42a8f1fe16407a7ded1aac Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sun, 4 Dec 2022 20:19:34 +0100 Subject: [PATCH 010/152] chore: prepare v2.0.14 release --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb2c35d1..9e56d77e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 2.0.14 (2022/12/04) + +### Fixes + +* Activates the extension when the language is `renpy` [#221](https://github.com/LuqueDaniel/vscode-language-renpy/pull/221) + ## 2.0.13 (2022/08/29) ### Fixes diff --git a/package.json b/package.json index 86e47a90..ee116de0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.0.13", + "version": "2.0.14", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 7d8adc8db7cf207a5063f34851b67b69320cfe8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Jan 2023 21:01:19 +0000 Subject: [PATCH 011/152] deps: bump @typescript-eslint/eslint-plugin from 5.45.0 to 5.47.1 Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.45.0 to 5.47.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.47.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 356 +++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 320 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9542012..33b5de24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "languague-renpy", - "version": "2.0.13", + "version": "2.0.14", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.0.13", + "version": "2.0.14", "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", "@types/node": "^18.11.10", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/eslint-plugin": "^5.47.1", "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.29.0", "eslint-plugin-import": "^2.26.0", @@ -160,14 +160,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz", - "integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==", + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz", + "integrity": "sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/type-utils": "5.45.0", - "@typescript-eslint/utils": "5.45.0", + "@typescript-eslint/scope-manager": "5.47.1", + "@typescript-eslint/type-utils": "5.47.1", + "@typescript-eslint/utils": "5.47.1", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -192,6 +192,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", + "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", + "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", + "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.47.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "5.45.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", @@ -237,13 +284,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz", - "integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==", + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.1.tgz", + "integrity": "sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.45.0", - "@typescript-eslint/utils": "5.45.0", + "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/utils": "5.47.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -263,6 +310,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", + "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", + "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", + "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.47.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/types": { "version": "5.45.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", @@ -304,16 +408,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz", - "integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==", + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.1.tgz", + "integrity": "sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", + "@typescript-eslint/scope-manager": "5.47.1", + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/typescript-estree": "5.47.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -329,6 +433,80 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", + "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", + "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", + "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", + "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.47.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.45.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", @@ -2822,20 +3000,48 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz", - "integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==", + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz", + "integrity": "sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/type-utils": "5.45.0", - "@typescript-eslint/utils": "5.45.0", + "@typescript-eslint/scope-manager": "5.47.1", + "@typescript-eslint/type-utils": "5.47.1", + "@typescript-eslint/utils": "5.47.1", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", + "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1" + } + }, + "@typescript-eslint/types": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", + "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", + "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.47.1", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/parser": { @@ -2861,15 +3067,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz", - "integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==", + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.1.tgz", + "integrity": "sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.45.0", - "@typescript-eslint/utils": "5.45.0", + "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/utils": "5.47.1", "debug": "^4.3.4", "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", + "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", + "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", + "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.47.1", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/types": { @@ -2894,19 +3133,62 @@ } }, "@typescript-eslint/utils": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz", - "integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==", + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.1.tgz", + "integrity": "sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", + "@typescript-eslint/scope-manager": "5.47.1", + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/typescript-estree": "5.47.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", + "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1" + } + }, + "@typescript-eslint/types": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", + "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", + "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/visitor-keys": "5.47.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", + "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.47.1", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/visitor-keys": { diff --git a/package.json b/package.json index ee116de0..a1eeeb07 100644 --- a/package.json +++ b/package.json @@ -184,7 +184,7 @@ "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", "@types/node": "^18.11.10", - "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/eslint-plugin": "^5.47.1", "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.29.0", "eslint-plugin-import": "^2.26.0", From ece2700f483335f63ac74a7a867435774af56ffa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 05:04:11 +0000 Subject: [PATCH 012/152] deps: bump json5 from 1.0.1 to 1.0.2 Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9542012..138e0749 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "languague-renpy", - "version": "2.0.13", + "version": "2.0.14", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.0.13", + "version": "2.0.14", "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", @@ -1862,9 +1862,9 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -4054,9 +4054,9 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" From 1cf14780ad55cb2de6a4b86815623a1928be6be4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 20:17:16 +0000 Subject: [PATCH 013/152] deps: bump eslint from 8.29.0 to 8.32.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.29.0 to 8.32.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.29.0...v8.32.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 90 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 417a70ad..9a3b4f3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.47.1", "@typescript-eslint/parser": "^5.45.0", - "eslint": "^8.29.0", + "eslint": "^8.32.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", "vscode-test": "^1.6.1" @@ -24,15 +24,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -47,9 +47,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -525,9 +525,9 @@ } }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -904,13 +904,13 @@ } }, "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", + "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -929,7 +929,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -1593,9 +1593,9 @@ } }, "node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2365,9 +2365,9 @@ "dev": true }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" @@ -2892,15 +2892,15 @@ }, "dependencies": { "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2909,9 +2909,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -3202,9 +3202,9 @@ } }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-jsx": { @@ -3489,13 +3489,13 @@ } }, "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", + "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -3514,7 +3514,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -4022,9 +4022,9 @@ } }, "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -4583,9 +4583,9 @@ "dev": true }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "queue-microtask": { diff --git a/package.json b/package.json index a1eeeb07..f545263a 100644 --- a/package.json +++ b/package.json @@ -186,7 +186,7 @@ "@types/node": "^18.11.10", "@typescript-eslint/eslint-plugin": "^5.47.1", "@typescript-eslint/parser": "^5.45.0", - "eslint": "^8.29.0", + "eslint": "^8.32.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", "vscode-test": "^1.6.1" From c8e6a47d55233383870d1b58c87c5477504ed27c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 20:19:18 +0000 Subject: [PATCH 014/152] deps: bump @typescript-eslint/parser from 5.45.0 to 5.49.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.45.0 to 5.49.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.49.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 94 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a3b4f3a..e215cec4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@types/node": "^18.11.10", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.47.1", - "@typescript-eslint/parser": "^5.45.0", + "@typescript-eslint/parser": "^5.49.0", "eslint": "^8.32.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", @@ -240,14 +240,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", - "integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", + "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "debug": "^4.3.4" }, "engines": { @@ -267,13 +267,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz", - "integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -368,9 +368,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", - "integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -381,13 +381,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz", - "integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -508,12 +508,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", - "integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3045,25 +3045,25 @@ } }, "@typescript-eslint/parser": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz", - "integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", + "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz", - "integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" } }, "@typescript-eslint/type-utils": { @@ -3112,19 +3112,19 @@ } }, "@typescript-eslint/types": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz", - "integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz", - "integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3192,12 +3192,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz", - "integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.45.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" } }, diff --git a/package.json b/package.json index f545263a..429fcef2 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.11.10", "@typescript-eslint/eslint-plugin": "^5.47.1", - "@typescript-eslint/parser": "^5.45.0", + "@typescript-eslint/parser": "^5.49.0", "eslint": "^8.32.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", From a94f7b95ce8ed8593f264917856d35c0772d3ec1 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sun, 29 Jan 2023 10:41:15 +0100 Subject: [PATCH 015/152] Fix excludeCompiledFilesFromWorkspace option If renpy.excludeCompiledFilesFromWorkspace option isn't enabled, it doesn't call excludeCompiledFilesConfig function. Keeps the order of previously existing items in files.exclude. Only adds the patterns of the files generated by Ren'Py that aren't in the current file.exclude. Fix #195 --- src/extension.ts | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 29d6f549..322e14e6 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -76,16 +76,17 @@ export async function activate(context: ExtensionContext): Promise { // hide rpyc files if the setting is enabled const config = workspace.getConfiguration("renpy"); - if (config) { - updateShowCompiledFilesConfig(config.excludeCompiledFilesFromWorkspace); + if (config?.excludeCompiledFilesFromWorkspace) { + excludeCompiledFilesConfig(); } // Listen to configuration changes context.subscriptions.push( workspace.onDidChangeConfiguration((e) => { if (e.affectsConfiguration("renpy.excludeCompiledFilesFromWorkspace")) { - const newValue: boolean = workspace.getConfiguration("renpy").get("excludeCompiledFilesFromWorkspace") ?? true; - updateShowCompiledFilesConfig(newValue); + if (workspace.getConfiguration("renpy").get("excludeCompiledFilesFromWorkspace")) { + excludeCompiledFilesConfig(); + } } }) ); @@ -374,16 +375,17 @@ function updateStatusBar(text: string) { } } -function updateShowCompiledFilesConfig(hide: boolean) { +function excludeCompiledFilesConfig() { + const renpyExclude = ["**/*.rpyc", "**/*.rpa", "**/*.rpymc", "**/cache/"]; const config = workspace.getConfiguration("files"); - const newConfig = { - ...config.inspect("exclude")?.workspaceValue, - "**/*.rpyc": hide, - "**/*.rpa": hide, - "**/*.rpymc": hide, - "**/cache/": hide, - }; - config.update("exclude", newConfig, ConfigurationTarget.Workspace); + const workspaceExclude = config.inspect("exclude"); + const exclude = { ...workspaceExclude?.workspaceValue }; + renpyExclude.forEach((element) => { + if (!(element in exclude)) { + Object.assign(exclude, { [element]: true }); + } + }); + config.update("exclude", exclude, ConfigurationTarget.Workspace); } function isValidExecutable(renpyExecutableLocation: string): boolean { From a1c984afb9c613d2792fb5673f0b0c603571b07a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Feb 2023 21:00:30 +0000 Subject: [PATCH 016/152] deps: bump eslint from 8.32.0 to 8.33.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.32.0 to 8.33.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.32.0...v8.33.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index e215cec4..0286e3ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.47.1", "@typescript-eslint/parser": "^5.49.0", - "eslint": "^8.32.0", + "eslint": "^8.33.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", "vscode-test": "^1.6.1" @@ -904,9 +904,9 @@ } }, "node_modules/eslint": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", - "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.4.1", @@ -3489,9 +3489,9 @@ } }, "eslint": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", - "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", "dev": true, "requires": { "@eslint/eslintrc": "^1.4.1", diff --git a/package.json b/package.json index 429fcef2..4257f3d1 100644 --- a/package.json +++ b/package.json @@ -186,7 +186,7 @@ "@types/node": "^18.11.10", "@typescript-eslint/eslint-plugin": "^5.47.1", "@typescript-eslint/parser": "^5.49.0", - "eslint": "^8.32.0", + "eslint": "^8.33.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", "vscode-test": "^1.6.1" From 30d787a8740e21679ff13797abfeaf1826ca31e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Feb 2023 21:01:00 +0000 Subject: [PATCH 017/152] deps: bump @typescript-eslint/eslint-plugin from 5.47.1 to 5.50.0 Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.47.1 to 5.50.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.50.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 236 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 120 insertions(+), 118 deletions(-) diff --git a/package-lock.json b/package-lock.json index e215cec4..d7835e28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.11.10", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "^5.47.1", + "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.49.0", "eslint": "^8.32.0", "eslint-plugin-import": "^2.26.0", @@ -160,15 +160,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz", - "integrity": "sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", + "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/type-utils": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/type-utils": "5.50.0", + "@typescript-eslint/utils": "5.50.0", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", @@ -193,13 +194,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", - "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -210,9 +211,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -223,12 +224,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -284,13 +285,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.1.tgz", - "integrity": "sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", + "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/utils": "5.50.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -311,9 +312,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -324,13 +325,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", - "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -351,12 +352,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -408,16 +409,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.1.tgz", - "integrity": "sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", + "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -434,13 +435,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", - "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -451,9 +452,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -464,13 +465,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", - "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -491,12 +492,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3000,15 +3001,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz", - "integrity": "sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", + "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/type-utils": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/type-utils": "5.50.0", + "@typescript-eslint/utils": "5.50.0", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", @@ -3017,28 +3019,28 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", - "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" } }, "@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true }, "@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" } } @@ -3067,31 +3069,31 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.1.tgz", - "integrity": "sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", + "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/utils": "5.50.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", - "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3100,12 +3102,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" } } @@ -3133,45 +3135,45 @@ } }, "@typescript-eslint/utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.1.tgz", - "integrity": "sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", + "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", - "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" } }, "@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", - "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3180,12 +3182,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" } } diff --git a/package.json b/package.json index 429fcef2..7a296eeb 100644 --- a/package.json +++ b/package.json @@ -184,7 +184,7 @@ "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", "@types/node": "^18.11.10", - "@typescript-eslint/eslint-plugin": "^5.47.1", + "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.49.0", "eslint": "^8.32.0", "eslint-plugin-import": "^2.26.0", From 6637dc097539200498207c916ab61f2f666e43f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Feb 2023 19:47:36 +0000 Subject: [PATCH 018/152] deps: bump @typescript-eslint/parser from 5.49.0 to 5.50.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.49.0 to 5.50.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.50.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 356 +++++----------------------------------------- package.json | 2 +- 2 files changed, 38 insertions(+), 320 deletions(-) diff --git a/package-lock.json b/package-lock.json index 11682c9e..7cdb2ef0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@types/node": "^18.11.10", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.50.0", - "@typescript-eslint/parser": "^5.49.0", + "@typescript-eslint/parser": "^5.50.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", @@ -193,62 +193,15 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/parser": { "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", + "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", "dev": true, "dependencies": { + "@typescript-eslint/scope-manager": "5.50.0", "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", - "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.49.0", - "@typescript-eslint/types": "5.49.0", - "@typescript-eslint/typescript-estree": "5.49.0", + "@typescript-eslint/typescript-estree": "5.50.0", "debug": "^4.3.4" }, "engines": { @@ -268,13 +221,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", - "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.49.0", - "@typescript-eslint/visitor-keys": "5.49.0" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -311,7 +264,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", @@ -324,7 +277,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", @@ -351,63 +304,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", - "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", - "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.49.0", - "@typescript-eslint/visitor-keys": "5.49.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/utils": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", @@ -434,64 +330,7 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", @@ -508,23 +347,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", - "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.49.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -3016,56 +2838,28 @@ "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" - } - }, - "@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" - } - } } }, "@typescript-eslint/parser": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", - "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", + "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.49.0", - "@typescript-eslint/types": "5.49.0", - "@typescript-eslint/typescript-estree": "5.49.0", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", - "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.49.0", - "@typescript-eslint/visitor-keys": "5.49.0" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" } }, "@typescript-eslint/type-utils": { @@ -3078,55 +2872,22 @@ "@typescript-eslint/utils": "5.50.0", "debug": "^4.3.4", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" - } - } } }, "@typescript-eslint/types": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", - "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", - "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "dev": true, "requires": { - "@typescript-eslint/types": "5.49.0", - "@typescript-eslint/visitor-keys": "5.49.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3148,58 +2909,15 @@ "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" - } - }, - "@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.50.0", - "eslint-visitor-keys": "^3.3.0" - } - } } }, "@typescript-eslint/visitor-keys": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", - "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" } }, diff --git a/package.json b/package.json index eb39603b..feadeac6 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.11.10", "@typescript-eslint/eslint-plugin": "^5.50.0", - "@typescript-eslint/parser": "^5.49.0", + "@typescript-eslint/parser": "^5.50.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.26.0", "typescript": "^4.8.4", From e1b5db039ffcb4db4472e5b03d97b819e6216033 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Feb 2023 19:52:48 +0000 Subject: [PATCH 019/152] deps: bump @types/node from 18.11.10 to 18.11.19 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.11.10 to 18.11.19. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7cdb2ef0..964f1c78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", - "@types/node": "^18.11.10", + "@types/node": "^18.11.19", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", @@ -142,9 +142,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", - "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", + "version": "18.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", + "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==", "dev": true }, "node_modules/@types/semver": { @@ -2805,9 +2805,9 @@ "dev": true }, "@types/node": { - "version": "18.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", - "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", + "version": "18.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", + "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==", "dev": true }, "@types/semver": { diff --git a/package.json b/package.json index feadeac6..d1602802 100644 --- a/package.json +++ b/package.json @@ -183,7 +183,7 @@ "devDependencies": { "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", - "@types/node": "^18.11.10", + "@types/node": "^18.11.19", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "eslint": "^8.33.0", From 40444ed45c0c2a08fb43f5985be1146fa45d6d1c Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Mon, 13 Feb 2023 18:50:18 +0100 Subject: [PATCH 020/152] chore: prepare 2.0.15 release --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e56d77e..3e1caea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 2.0.15 (2023/02/13) + +### Fixes + +* The `excludeCompiledFilesFromWorkspace` option now doesn't overwrite existing `file.exclude` values [#238](https://github.com/LuqueDaniel/vscode-language-renpy/pull/238) + ## 2.0.14 (2022/12/04) ### Fixes diff --git a/package.json b/package.json index d1602802..ce182059 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.0.14", + "version": "2.0.15", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From ce713e329f3b36c9db45362b2111aaa5969191fe Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Tue, 14 Feb 2023 11:27:23 +0100 Subject: [PATCH 021/152] Syntax updates (#240) * Add script to generate tokenizer patterns from grammar * Minor python grammar fixes * Minor pattern updates Move some patterns to common to be used with python patterns * Update pattern generation script * Remove unused type * Fix token type * Remove path prefix again Seems to work again, but not this actually broke it. I'm confused?? * Fix comments --- package.json | 6 +- src/tokenizer/common-token-patterns.ts | 423 ++++++++++++++++++- src/tokenizer/python-token-patterns.ts | 25 +- src/tokenizer/token-patterns.ts | 424 +------------------ src/tokenizer/tokenizer.ts | 8 +- syntax-to-token-pattern.py | 154 +++++++ syntaxes/renpy.python.tmLanguage.json | 537 +++++-------------------- 7 files changed, 714 insertions(+), 863 deletions(-) create mode 100644 syntax-to-token-pattern.py diff --git a/package.json b/package.json index 1f75fa85..4b372aa8 100644 --- a/package.json +++ b/package.json @@ -176,9 +176,9 @@ }, "scripts": { "vscode:prepublish": "npm run package", - "package": "node_modules/.bin/webpack --mode production --devtool hidden-source-map", - "watch": "node_modules/.bin/webpack --mode development --watch", - "watch-release": "node_modules/.bin/webpack --mode production --watch", + "package": "webpack --mode production --devtool hidden-source-map", + "watch": "webpack --mode development --watch", + "watch-release": "webpack --mode production --watch", "test-compile": "tsc -p ./", "test": "npm run test-compile && node ./node_modules/vscode/bin/test", "lint": "eslint -c .eslintrc.json --ext .ts ./src/", diff --git a/src/tokenizer/common-token-patterns.ts b/src/tokenizer/common-token-patterns.ts index 9df6fef6..d4c17c16 100644 --- a/src/tokenizer/common-token-patterns.ts +++ b/src/tokenizer/common-token-patterns.ts @@ -1,4 +1,5 @@ -import { CharacterTokenType, LiteralTokenType, MetaTokenType, OperatorTokenType } from "./renpy-tokens"; +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { CharacterTokenType, EntityTokenType, EscapedCharacterTokenType, LiteralTokenType, MetaTokenType, OperatorTokenType } from "./renpy-tokens"; import { TokenPattern } from "./token-pattern-types"; export const newLine: TokenPattern = { @@ -33,6 +34,426 @@ export const numInt: TokenPattern = { }, }; +export const escapedChar: TokenPattern = { + debugName: "escapedChar", + + match: /(\\")|(\\')|(\\ )|(\\n)|(\\\\)|(\[\[)|({{)/dg, + captures: { + 1: { + token: EscapedCharacterTokenType.EscDoubleQuote, + }, + 2: { + token: EscapedCharacterTokenType.EscQuote, + }, + 3: { + token: EscapedCharacterTokenType.EscWhitespace, + }, + 4: { + token: EscapedCharacterTokenType.EscNewline, + }, + 5: { + token: EscapedCharacterTokenType.EscBackslash, + }, + 6: { + token: EscapedCharacterTokenType.EscOpenBracket, + }, + 7: { + token: EscapedCharacterTokenType.EscOpenSquareBracket, + }, + }, +}; + +export const hexLiteral: TokenPattern = { + debugName: "hexLiteral", + + // Note: This pattern has no end check. Only use as include pattern! + patterns: [ + { + // rgb, rgba, rrggbb, rrggbbaa + match: /#(?:[a-f0-9]{8}|[a-f0-9]{6}|[a-f0-9]{3,4})\b/gi, + token: LiteralTokenType.Color, + }, + { + match: /#[a-f0-9]+\b/gi, + token: MetaTokenType.Invalid, + }, + { + match: /(?:#[a-f0-9]*)?(.+)/dgi, + token: LiteralTokenType.Color, + captures: { + 1: { token: MetaTokenType.Invalid }, + }, + }, + ], +}; + +export const constantPlaceholder: TokenPattern = { + debugName: "constantPlaceholder", + + // Python value interpolation using [ ... ] + token: MetaTokenType.Placeholder, + match: /(\[)(.*?)(\])(?![^[]*?\])/dg, + captures: { + 1: { token: CharacterTokenType.OpenSquareBracket }, + 2: { token: MetaTokenType.PythonLine }, + 3: { token: CharacterTokenType.CloseSquareBracket }, + }, +}; + +export const stringsInterior: TokenPattern = { + debugName: "stringsInterior", + + patterns: [ + newLine, + escapedChar, + constantPlaceholder, + /*stringTags*/ // pushed below + ], +}; + +export const stringTags: TokenPattern = { + debugName: "stringTags", + + patterns: [ + { + // Valid tags without params (self-closing) + token: MetaTokenType.TagBlock, + match: /({)\s*(nw|done|fast|p|w|clear)\s*(})/dg, + captures: { + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: CharacterTokenType.CloseBracket }, + }, + }, + { + // Valid tags with numeric params (self-closing) + token: MetaTokenType.TagBlock, + match: /({)\s*(p|w)(=)(\+)?(\d*(?:.\d+)?)\s*(})/dg, + captures: { + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { token: OperatorTokenType.Plus }, + 5: { token: LiteralTokenType.Float }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + }, + { + // Valid tags with numeric params (self-closing) + token: MetaTokenType.TagBlock, + match: /({)\s*(v?space)(=)(\+)?(\d+)\s*(})/dg, + captures: { + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { token: OperatorTokenType.Plus }, + 5: { token: LiteralTokenType.Integer }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + }, + { + // Comment tag (self-closing) + token: MetaTokenType.TagBlock, + match: /({)\s*(#)\s*(.*?)\s*(})/dg, + captures: { + 0: { token: MetaTokenType.Comment }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { token: LiteralTokenType.UnquotedString }, + 5: { token: CharacterTokenType.CloseBracket }, + }, + }, + { + // Valid tags with file param + token: MetaTokenType.TagBlock, + match: /({)\s*(font|image)(=)([\w.]+)\s*(})/dg, + captures: { + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { token: LiteralTokenType.UnquotedString }, + 5: { token: CharacterTokenType.CloseBracket }, + }, + }, + { + // Valid tags without params (close required) + begin: /({)\s*(u|i|b|s|plain|alt|noalt|art|rb|rt)\s*(})/dg, + beginCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: CharacterTokenType.CloseBracket }, + }, + end: /({)(\/)(\s+)?(\2)(\s+)?(})/dg, + endCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.ForwardSlash }, + 3: { token: CharacterTokenType.WhiteSpace }, + 4: { token: EntityTokenType.Tag }, + 5: { token: CharacterTokenType.WhiteSpace }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + patterns: [stringsInterior], + }, + { + // Valid tags with numeric params (close required) + begin: /({)\s*(alpha|cps|k)(=)(?:(\*)|(-)|(\+))?(\d+(?:.\d+)?)\s*(})/dg, + beginCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { token: OperatorTokenType.Multiply }, + 5: { token: OperatorTokenType.Minus }, + 6: { token: OperatorTokenType.Plus }, + 7: { token: LiteralTokenType.Float }, + 8: { token: CharacterTokenType.CloseBracket }, + }, + end: /({)(\/)(\s+)?(\2)(\s+)?(})/dg, + endCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.ForwardSlash }, + 3: { token: CharacterTokenType.WhiteSpace }, + 4: { token: EntityTokenType.Tag }, + 5: { token: CharacterTokenType.WhiteSpace }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + patterns: [stringsInterior], + }, + { + // Valid tags with numeric params (close required) + begin: /({)\s*(size)(=)(?:(-)|(\+))?(\d+)\s*(})/dg, + beginCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { token: OperatorTokenType.Minus }, + 5: { token: OperatorTokenType.Plus }, + 6: { token: LiteralTokenType.Integer }, + 7: { token: CharacterTokenType.CloseBracket }, + }, + end: /({)(\/)(\s+)?(\2)(\s+)?(})/dg, + endCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.ForwardSlash }, + 3: { token: CharacterTokenType.WhiteSpace }, + 4: { token: EntityTokenType.Tag }, + 5: { token: CharacterTokenType.WhiteSpace }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + patterns: [stringsInterior], + }, + { + // Color tag + begin: /({)\s*(color|outlinecolor)(=)(#?[a-zA-Z0-9]+)\s*(})/dg, + beginCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { + patterns: [hexLiteral], + }, + 5: { token: CharacterTokenType.CloseBracket }, + }, + end: /({)(\/)(\s+)?(\2)(\s+)?(})/dg, + endCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.ForwardSlash }, + 3: { token: CharacterTokenType.WhiteSpace }, + 4: { token: EntityTokenType.Tag }, + 5: { token: CharacterTokenType.WhiteSpace }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + patterns: [stringsInterior], + }, + { + // a tag + begin: /({)\s*(a)(=)(.*?)\s*(})/dg, + beginCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: EntityTokenType.Tag }, + 3: { token: OperatorTokenType.Assign }, + 4: { + token: LiteralTokenType.UnquotedString, + }, + 5: { token: CharacterTokenType.CloseBracket }, + }, + end: /({)(\/)(\s+)?(\2)(\s+)?(})/dg, + endCaptures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.ForwardSlash }, + 3: { token: CharacterTokenType.WhiteSpace }, + 4: { token: EntityTokenType.Tag }, + 5: { token: CharacterTokenType.WhiteSpace }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + patterns: [stringsInterior], + }, + { + contentToken: MetaTokenType.TagBlock, + begin: /({)([ \t]+)?(\w+)\b(?:(=)(.*?))?([ \t]+)?(})/dg, + beginCaptures: { + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.WhiteSpace }, + 3: { token: EntityTokenType.Tag }, + 4: { token: OperatorTokenType.Assign }, + 5: { token: MetaTokenType.Arguments }, + 6: { token: CharacterTokenType.WhiteSpace }, + 7: { token: CharacterTokenType.CloseBracket }, + }, + end: /({)(\/)([ \t]+)?(\3)([ \t]+)?(})/dg, + endCaptures: { + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.ForwardSlash }, + 3: { token: CharacterTokenType.WhiteSpace }, + 4: { token: EntityTokenType.Tag }, + 5: { token: CharacterTokenType.WhiteSpace }, + 6: { token: CharacterTokenType.CloseBracket }, + }, + patterns: [stringsInterior], + }, + { + // Empty tag end + token: MetaTokenType.Invalid, + match: /({)(\/)?(\s+)?(})/dg, + captures: { + 0: { token: MetaTokenType.TagBlock }, + 1: { token: CharacterTokenType.OpenBracket }, + 2: { token: CharacterTokenType.ForwardSlash }, + 3: { token: CharacterTokenType.WhiteSpace }, + 4: { token: CharacterTokenType.CloseBracket }, + }, + }, + ], +}; + +stringsInterior.patterns!.push(stringTags); + +export const stringQuotedDouble: TokenPattern = { + debugName: "stringQuotedDouble", + + patterns: [ + { + // Triple quoted block string + token: LiteralTokenType.String, + begin: /(")(")(")/dg, + beginCaptures: { + 1: { token: CharacterTokenType.DoubleQuote }, + 2: { token: CharacterTokenType.DoubleQuote }, + 3: { token: CharacterTokenType.DoubleQuote }, + }, + end: /(? str: + return " " * indent + +def camelCase(st: str): + output = ''.join(x for x in st.title() if x.isalnum()) + return output[0].lower() + output[1:] + +def get_token_type(name: str) -> str: + if "invalid." in name: + return "MetaTokenType.Invalid" + elif "storage.type.string." in name: + return "LiteralTokenType.String" + + tokenPrefix = "" + token = name.replace(".python", "") + + if "meta." in token: + tokenPrefix = "MetaTokenType." + token = token.replace("meta.", "") + elif "keyword." in token: + tokenPrefix = "KeywordTokenType." + token = token.replace("keyword.", "") + elif "entity." in token: + tokenPrefix = "EntityTokenType." + token = token.replace("entity.", "") + + return "MetaTokenType.Invalid" # tokenPrefix + camelCase(token) + +def get_match_str(match: str, hasCaptures: bool) -> str: + match = match.replace("/", "\\/") # Escape forward slashes + mFlag: str = "m" if re.search("(? str: + typescript_entry = "{\n" + indent += 4 + + for key, value in captures.items(): + typescript_entry += f"{get_indent(indent)}{key}: {transform_pattern(indent, value)},\n" + + indent -= 4 + typescript_entry += f"{get_indent(indent)}}},\n" + return typescript_entry + +def transform_pattern(indent: int, value: dict[str, Any]) -> str: + typescript_entry = "{\n" + indent += 4 + + # Add comments + if "comment" in value: + comment = value["comment"].replace("\n", f"\n{get_indent(indent)}// ") + typescript_entry += f"{get_indent(indent)}// {comment}\n" + + # Add token type + if "name" in value: + name = value["name"] + token = get_token_type(name) + typescript_entry += f"{get_indent(indent)}token: {token}, // {name}\n" + + if "contentName" in value: + name = value["contentName"] + token = get_token_type(name) + typescript_entry += f"{get_indent(indent)}contentToken: {token}, // {name}\n" + + # Add match + if "match" in value: + match = get_match_str(value["match"], "captures" in value) + typescript_entry += f"{get_indent(indent)}match: {match},\n" + + # Iterate through the captures in the value + if "captures" in value: + typescript_entry += f"{get_indent(indent)}captures: " + typescript_entry += transform_captures(indent, value["captures"]) + + if "begin" in value: + match = get_match_str(value["begin"], "beginCaptures" in value) + typescript_entry += f"{get_indent(indent)}begin: {match},\n" + + # Iterate through the beginCaptures in the value + if "beginCaptures" in value: + typescript_entry += f"{get_indent(indent)}beginCaptures: " + typescript_entry += transform_captures(indent, value["beginCaptures"]) + + if "end" in value: + match = get_match_str(value["end"], "endCaptures" in value) + typescript_entry += f"{get_indent(indent)}end: {match},\n" + + # Iterate through the endCaptures in the value + if "endCaptures" in value: + typescript_entry += f"{get_indent(indent)}endCaptures: " + typescript_entry += transform_captures(indent, value["endCaptures"]) + + # Iterate through the patterns in the value + if "patterns" in value: + patterns = value["patterns"] + typescript_entry += f"{get_indent(indent)}patterns: [\n" + indent += 4 + + for i in range(len(patterns)): + pattern = patterns[i] + + # Handle includes + if "include" in pattern: + include = camelCase(PATTERN_PREFIX + pattern["include"]) + typescript_entry += f"{get_indent(indent)}{include},\n" + continue + + typescript_entry += get_indent(indent) + typescript_entry += transform_pattern(indent, pattern) + typescript_entry += ",\n" + + indent -= 4 + typescript_entry += f"{get_indent(indent)}]\n" + + indent -= 4 + typescript_entry += f"{get_indent(indent)}}}" + return typescript_entry + + +# Iterate through the repository entries +for key, value in repository.items(): + patternName = camelCase(PATTERN_PREFIX + key) + typescript_entry = f"export const {patternName}: TokenPattern = " + + typescript_entry += transform_pattern(0, value) + + typescript_entry += ";\n" + + # Add the typescript entry to the list of entries + typescript_entries.append(typescript_entry) + +# Write the typescript entries to a file +with open("./src/tokenizer/generated.output.ts", "w") as file: + contents: str = "import { KeywordTokenType, LiteralTokenType, MetaTokenType } from \"./renpy-tokens\";\n" + contents += "import { TokenPattern } from \"./token-pattern-types\";\n\n" + contents += "\n".join(typescript_entries) + file.write(contents) diff --git a/syntaxes/renpy.python.tmLanguage.json b/syntaxes/renpy.python.tmLanguage.json index ec0d9a37..3abe692c 100644 --- a/syntaxes/renpy.python.tmLanguage.json +++ b/syntaxes/renpy.python.tmLanguage.json @@ -116,11 +116,7 @@ "endCaptures": { "1": { "name": "punctuation.definition.string.end.python" } }, - "patterns": [ - { "include": "#docstring-prompt" }, - { "include": "#codetags" }, - { "include": "#docstring-guts-unicode" } - ] + "patterns": [{ "include": "#docstring-prompt" }, { "include": "#codetags" }, { "include": "#docstring-guts-unicode" }] }, { "name": "string.quoted.docstring.raw.multi.python", @@ -133,11 +129,7 @@ "endCaptures": { "1": { "name": "punctuation.definition.string.end.python" } }, - "patterns": [ - { "include": "#string-consume-escape" }, - { "include": "#docstring-prompt" }, - { "include": "#codetags" } - ] + "patterns": [{ "include": "#string-consume-escape" }, { "include": "#docstring-prompt" }, { "include": "#codetags" }] }, { "name": "string.quoted.docstring.single.python", @@ -150,10 +142,7 @@ "1": { "name": "punctuation.definition.string.end.python" }, "2": { "name": "invalid.illegal.newline.python" } }, - "patterns": [ - { "include": "#codetags" }, - { "include": "#docstring-guts-unicode" } - ] + "patterns": [{ "include": "#codetags" }, { "include": "#docstring-guts-unicode" }] }, { "name": "string.quoted.docstring.raw.single.python", @@ -167,19 +156,12 @@ "1": { "name": "punctuation.definition.string.end.python" }, "2": { "name": "invalid.illegal.newline.python" } }, - "patterns": [ - { "include": "#string-consume-escape" }, - { "include": "#codetags" } - ] + "patterns": [{ "include": "#string-consume-escape" }, { "include": "#codetags" }] } ] }, "docstring-guts-unicode": { - "patterns": [ - { "include": "#escape-sequence-unicode" }, - { "include": "#escape-sequence" }, - { "include": "#string-line-continuation" } - ] + "patterns": [{ "include": "#escape-sequence-unicode" }, { "include": "#escape-sequence" }, { "include": "#string-line-continuation" }] }, "docstring-prompt": { "match": "(?:(?:^|\\G)\\s*(?#'\\G'isnecessaryforST)((?:>>>|\\.\\.\\.)\\s)(?=\\s*\\S))", @@ -255,11 +237,7 @@ }, "expression-base": { "comment": "valid Python expressions with comments and line continuation", - "patterns": [ - { "include": "#comments" }, - { "include": "#expression-bare" }, - { "include": "#line-continuation" } - ] + "patterns": [{ "include": "#comments" }, { "include": "#expression-bare" }, { "include": "#line-continuation" }] }, "expression": { "comment": "All valid Python expressions", @@ -279,21 +257,10 @@ "beginCaptures": { "1": { "name": "punctuation.separator.period.python" } }, - "patterns": [ - { "include": "#function-call" }, - { "include": "#member-access-base" }, - { "include": "#member-access-attribute" } - ] + "patterns": [{ "include": "#function-call" }, { "include": "#member-access-base" }, { "include": "#member-access-attribute" }] }, "member-access-base": { - "patterns": [ - { "include": "#magic-names" }, - { "include": "#illegal-names" }, - { "include": "#illegal-object-name" }, - { "include": "#special-names" }, - { "include": "#line-continuation" }, - { "include": "#item-access" } - ] + "patterns": [{ "include": "#magic-names" }, { "include": "#illegal-names" }, { "include": "#illegal-object-name" }, { "include": "#special-names" }, { "include": "#line-continuation" }, { "include": "#item-access" }] }, "member-access-attribute": { "comment": "Highlight attribute access in otherwise non-specialized cases.", @@ -367,10 +334,7 @@ "beginCaptures": { "1": { "name": "punctuation.separator.continuation.line.python" } }, - "patterns": [ - { "include": "#regexp" }, - { "include": "#string" } - ] + "patterns": [{ "include": "#regexp" }, { "include": "#string" }] } ] }, @@ -434,7 +398,7 @@ }, "number-dec": { "name": "constant.numeric.dec.python", - "match": "(?" }, "regexp-base-expression": { - "patterns": [ - { "include": "#regexp-quantifier" }, - { "include": "#regexp-base-common" } - ] + "patterns": [{ "include": "#regexp-quantifier" }, { "include": "#regexp-base-common" }] }, "fregexp-base-expression": { "patterns": [ @@ -1324,13 +1197,7 @@ "match": "\\\\(.|\\n)" }, "regexp-escape-sequence": { - "patterns": [ - { "include": "#regexp-escape-special" }, - { "include": "#regexp-escape-character" }, - { "include": "#regexp-escape-unicode" }, - { "include": "#regexp-backreference-number" }, - { "include": "#regexp-escape-catchall" } - ] + "patterns": [{ "include": "#regexp-escape-special" }, { "include": "#regexp-escape-character" }, { "include": "#regexp-escape-unicode" }, { "include": "#regexp-backreference-number" }, { "include": "#regexp-escape-catchall" }] }, "regexp-charecter-set-escapes": { "patterns": [ @@ -1361,9 +1228,7 @@ "1": { "name": "punctuation.definition.comment.python" } }, "end": "($)", - "patterns": [ - { "include": "#codetags" } - ] + "patterns": [{ "include": "#codetags" }] }, "comments-string-single-three": { "name": "comment.line.number-sign.python", @@ -1372,9 +1237,7 @@ "1": { "name": "punctuation.definition.comment.python" } }, "end": "($|(?='''))", - "patterns": [ - { "include": "#codetags" } - ] + "patterns": [{ "include": "#codetags" }] }, "comments-string-double-three": { "name": "comment.line.number-sign.python", @@ -1383,9 +1246,7 @@ "1": { "name": "punctuation.definition.comment.python" } }, "end": "($|(?=\"\"\"))", - "patterns": [ - { "include": "#codetags" } - ] + "patterns": [{ "include": "#codetags" }] }, "single-one-regexp-expression": { "patterns": [ @@ -1444,9 +1305,7 @@ "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, - "patterns": [ - { "include": "#single-one-regexp-expression" } - ] + "patterns": [{ "include": "#single-one-regexp-expression" }] }, "single-one-regexp-comments": { "name": "comment.regexp", @@ -1459,9 +1318,7 @@ "1": { "name": "punctuation.comment.end.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, - "patterns": [ - { "include": "#codetags" } - ] + "patterns": [{ "include": "#codetags" }] }, "single-one-regexp-lookahead": { "begin": "(\\()\\?=", @@ -1474,9 +1331,7 @@ "1": { "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, - "patterns": [ - { "include": "#single-one-regexp-expression" } - ] + "patterns": [{ "include": "#single-one-regexp-expression" }] }, "single-one-regexp-lookahead-negative": { "begin": "(\\()\\?!", @@ -1489,9 +1344,7 @@ "1": { "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, - "patterns": [ - { "include": "#single-one-regexp-expression" } - ] + "patterns": [{ "include": "#single-one-regexp-expression" }] }, "single-one-regexp-lookbehind": { "begin": "(\\()\\?<=", @@ -1504,9 +1357,7 @@ "1": { "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, - "patterns": [ - { "include": "#single-one-regexp-expression" } - ] + "patterns": [{ "include": "#single-one-regexp-expression" }] }, "single-one-regexp-lookbehind-negative": { "begin": "(\\()\\? Date: Tue, 14 Feb 2023 13:27:34 +0100 Subject: [PATCH 022/152] Basic screen lang (#250) * Allow renpy string tags to be displayed in 'normal' python strings * Basic screen language implementation --- examples/unit_test.rpy | 19 +++ src/tokenizer/debug-decorator.ts | 2 + src/tokenizer/renpy-tokens.ts | 1 + src/tokenizer/token-patterns.ts | 3 +- syntaxes/renpy.python.tmLanguage.json | 2 +- syntaxes/renpy.tmLanguage.json | 181 ++++++++++++++++++++++---- 6 files changed, 178 insertions(+), 30 deletions(-) diff --git a/examples/unit_test.rpy b/examples/unit_test.rpy index 87ddda91..b2169233 100644 --- a/examples/unit_test.rpy +++ b/examples/unit_test.rpy @@ -3793,6 +3793,25 @@ #endregion Python and Ren'Py #region other + screen extract_dialogue: + + frame: + style_group "l" + style "l_root" + + window: + + has vbox + + label _("Extract Dialogue: [project.current.display_name!q]"): + test + + add HALF_SPACER + + frame: + style "l_indent" + xfill True + # Return Statement label main_menu: return "no_unlock" diff --git a/src/tokenizer/debug-decorator.ts b/src/tokenizer/debug-decorator.ts index 0a0c2dbb..178942ba 100644 --- a/src/tokenizer/debug-decorator.ts +++ b/src/tokenizer/debug-decorator.ts @@ -277,6 +277,7 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case KeywordTokenType.Image: case KeywordTokenType.LayeredImage: case KeywordTokenType.Window: + case KeywordTokenType.Frame: case KeywordTokenType.Transform: case KeywordTokenType.Translate: case KeywordTokenType.Extend: @@ -566,6 +567,7 @@ const tokenTypeDefinitions: EnumToString = { Image: { name: "Image", value: KeywordTokenType.Image }, LayeredImage: { name: "LayeredImage", value: KeywordTokenType.LayeredImage }, Window: { name: "Window", value: KeywordTokenType.Window }, + Frame: { name: "Frame", value: KeywordTokenType.Frame }, Transform: { name: "Transform", value: KeywordTokenType.Transform }, Translate: { name: "Translate", value: KeywordTokenType.Translate }, Extend: { name: "Extend", value: KeywordTokenType.Extend }, diff --git a/src/tokenizer/renpy-tokens.ts b/src/tokenizer/renpy-tokens.ts index 97172fa0..e51deca1 100644 --- a/src/tokenizer/renpy-tokens.ts +++ b/src/tokenizer/renpy-tokens.ts @@ -35,6 +35,7 @@ export const enum KeywordTokenType { Image, LayeredImage, Window, + Frame, Transform, Translate, Extend, diff --git a/src/tokenizer/token-patterns.ts b/src/tokenizer/token-patterns.ts index 45fa9f72..ceb3fe07 100644 --- a/src/tokenizer/token-patterns.ts +++ b/src/tokenizer/token-patterns.ts @@ -366,7 +366,7 @@ const keywords: TokenPattern = { }, { // Renpy keywords - match: /\b(?:(camera)|(image)|(label)|(layeredimage)|(menu)|(nvl[ \\t]+clear)|(play)|(queue)|(scene)|(screen)|(show)|(transform)|(translate)|(voice(?:[ \\t]+sustain)?)|(window))\b/dg, + match: /\b(?:(camera)|(image)|(label)|(layeredimage)|(menu)|(nvl[ \\t]+clear)|(play)|(queue)|(scene)|(screen)|(show)|(transform)|(translate)|(voice(?:[ \\t]+sustain)?)|(window)|(frame))\b/dg, captures: { 1: { token: KeywordTokenType.Camera }, 2: { token: KeywordTokenType.Image }, @@ -383,6 +383,7 @@ const keywords: TokenPattern = { 13: { token: KeywordTokenType.Translate }, 14: { token: KeywordTokenType.Voice }, 15: { token: KeywordTokenType.Window }, + 16: { token: KeywordTokenType.Frame }, }, }, { diff --git a/syntaxes/renpy.python.tmLanguage.json b/syntaxes/renpy.python.tmLanguage.json index 3abe692c..3cd30da0 100644 --- a/syntaxes/renpy.python.tmLanguage.json +++ b/syntaxes/renpy.python.tmLanguage.json @@ -455,7 +455,7 @@ ] }, "string-unicode-guts": { - "patterns": [{ "include": "#escape-sequence-unicode" }, { "include": "#string-entity" }, { "include": "#string-brace-formatting" }] + "patterns": [{ "include": "source.renpy#strings-interior" }, { "include": "#escape-sequence-unicode" }, { "include": "#string-entity" }, { "include": "#string-brace-formatting" }] }, "string-consume-escape": { "match": "\\\\['\"\\n\\\\]" }, "string-raw-guts": { diff --git a/syntaxes/renpy.tmLanguage.json b/syntaxes/renpy.tmLanguage.json index 29752d29..ff9fec59 100644 --- a/syntaxes/renpy.tmLanguage.json +++ b/syntaxes/renpy.tmLanguage.json @@ -109,7 +109,7 @@ { "include": "#with" }, { "include": "#style-old" }, { "include": "#use-old" }, - { "include": "#screen-old" }, + { "include": "#screen" }, { "include": "#return-statements" }, { "include": "#jump" }, { "include": "#call" } @@ -139,7 +139,7 @@ "captures": { "1": { "name": "keyword.renpy" }, "2": { - "name": "meta.with.params.renpy", + "name": "meta.at.params.renpy", "patterns": [{ "include": "#statements" }] } } @@ -150,7 +150,7 @@ "captures": { "1": { "name": "keyword.renpy" }, "2": { - "name": "meta.with.params.renpy", + "name": "meta.as.params.renpy", "patterns": [{ "include": "#statements" }] } } @@ -671,43 +671,168 @@ "2": { "name": "entity.name.class.python.renpy.screen.renpy" } } }, - "screen-old": { - "begin": "^\\s*(screen)\\s+(?=[A-Za-z_][A-Za-z0-9_]*\\s*\\()", + "builtin-screens": { + "comment": "TODO: Should combine this with builtin-labels", + "name": "support.function.builtin.renpy", + "match": "(? Date: Tue, 14 Feb 2023 18:15:55 +0100 Subject: [PATCH 023/152] chore: prepare 2.1.3-pre-release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b372aa8..dda495b7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.2", + "version": "2.1.3", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 2946d769f0087b4531042590a9ba81dd33e4dc91 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Wed, 15 Feb 2023 20:45:38 +0100 Subject: [PATCH 024/152] fix: adds missing JSON files to build (#254) Fixes #253 --- src/navigationdata.ts | 5 ++--- tsconfig.json | 39 ++++++++++++++++++--------------------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/navigationdata.ts b/src/navigationdata.ts index 8281ec71..fbbbdda6 100644 --- a/src/navigationdata.ts +++ b/src/navigationdata.ts @@ -7,6 +7,8 @@ import { cleanUpPath, extractFilenameWithoutExtension, getFileWithPath, getNavig import * as fs from "fs"; import { Displayable } from "./displayable"; import { Character } from "./character"; +import data from "./renpy.json"; +import kwData from "./renpyauto.json"; const filterCharacter = "\u2588"; @@ -27,10 +29,7 @@ export class NavigationData { static async init(extensionPath: string) { console.log(`NavigationData init`); - const data = require(`${extensionPath}/src/renpy.json`); NavigationData.renpyFunctions = data; - - const kwData = require(`${extensionPath}/src/renpyauto.json`); NavigationData.autoCompleteKeywords = kwData; NavigationData.renpyAutoComplete = []; diff --git a/tsconfig.json b/tsconfig.json index 8f943049..51527c8c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,23 +1,20 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "outDir": "out", - "lib": [ - "es6" - ], - "sourceMap": true, - "rootDir": "src", - /* Strict Type-Checking Option */ - "strict": true, /* enable all strict type-checking options */ - /* Additional Checks */ - "noUnusedLocals": true /* Report errors on unused locals. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - }, - "exclude": [ - "node_modules", - ".vscode-test" - ] + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": ["es6"], + "sourceMap": true, + "rootDir": "src", + /* Strict Type-Checking Option */ + "strict": true /* enable all strict type-checking options */, + /* Additional Checks */ + "noUnusedLocals": true /* Report errors on unused locals. */, + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + "esModuleInterop": true, + "resolveJsonModule": true + }, + "exclude": ["node_modules", ".vscode-test"] } From 2260632a44dfdb07b81307973db5f25ab406c081 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Thu, 16 Feb 2023 19:30:00 +0100 Subject: [PATCH 025/152] chore: prepare 2.0.16 release --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e1caea7..8093a76b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 2.0.16 (2023/02/16) + +## Fixes + +* Fix missing JSON files in extension package [#254](https://github.com/LuqueDaniel/vscode-language-renpy/pull/254) ref [#253](https://github.com/LuqueDaniel/vscode-language-renpy/issues/253) + ## 2.0.15 (2023/02/13) ### Fixes diff --git a/package.json b/package.json index ce182059..ea1dd1d7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.0.15", + "version": "2.0.16", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 57f39e581c4d310d16ee6cbab71eb7a54c4e6465 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Fri, 17 Feb 2023 18:48:18 +0100 Subject: [PATCH 026/152] ci: adds GitHub Actions to Dependabot updates --- .github/dependabot.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 39b18d75..0f29935a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,13 +3,19 @@ version: 2 updates: + # GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: weekly + commit-message: + prefix: deps + # NPM - package-ecosystem: "npm" directory: "/" schedule: interval: monthly ignore: - dependency-name: "@types/vscode" - assignees: - - LuqueDaniel commit-message: prefix: deps From b73c6f6a33cdc336bedc1774ba01a3127382e670 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:54:29 +0000 Subject: [PATCH 027/152] deps: bump eslint-plugin-import from 2.26.0 to 2.27.5 Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.26.0 to 2.27.5. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.26.0...v2.27.5) --- updated-dependencies: - dependency-name: eslint-plugin-import dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 799 +++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 506 insertions(+), 295 deletions(-) diff --git a/package-lock.json b/package-lock.json index 964f1c78..d1e805c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "languague-renpy", - "version": "2.0.14", + "version": "2.0.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.0.14", + "version": "2.0.16", "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", @@ -15,7 +15,7 @@ "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "eslint": "^8.33.0", - "eslint-plugin-import": "^2.26.0", + "eslint-plugin-import": "^2.27.5", "typescript": "^4.8.4", "vscode-test": "^1.6.1" }, @@ -412,15 +412,15 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -440,14 +440,32 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -457,6 +475,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -615,9 +645,9 @@ "dev": true }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", @@ -664,34 +694,44 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "dependencies": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -700,6 +740,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -783,13 +837,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -802,16 +857,20 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -824,23 +883,25 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "engines": { @@ -851,12 +912,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -871,11 +932,14 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-scope": { "version": "5.1.1", @@ -1256,18 +1320,6 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -1287,6 +1339,15 @@ "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1354,9 +1415,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -1430,6 +1491,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1450,6 +1526,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -1495,6 +1583,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -1600,12 +1700,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -1613,6 +1713,20 @@ "node": ">= 0.4" } }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -1642,9 +1756,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -1654,9 +1768,9 @@ } }, "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -1804,6 +1918,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -1893,19 +2026,6 @@ "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", "dev": true }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1995,9 +2115,9 @@ "dev": true }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2013,14 +2133,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -2031,14 +2151,14 @@ } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -2073,39 +2193,6 @@ "node": ">= 0.8.0" } }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2118,15 +2205,6 @@ "node": ">=6" } }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2340,6 +2418,20 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -2415,28 +2507,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2571,6 +2663,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", @@ -2679,6 +2785,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -2968,15 +3094,15 @@ "dev": true }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -2987,17 +3113,35 @@ "dev": true }, "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -3121,9 +3265,9 @@ "dev": true }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", @@ -3158,34 +3302,55 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" } }, "es-shim-unscopables": { @@ -3372,13 +3537,14 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" }, "dependencies": { "debug": { @@ -3393,13 +3559,12 @@ } }, "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -3414,33 +3579,35 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { @@ -3452,10 +3619,10 @@ "esutils": "^2.0.2" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -3619,15 +3786,6 @@ "to-regex-range": "^5.0.1" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -3644,6 +3802,15 @@ "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3698,9 +3865,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -3750,6 +3917,15 @@ "type-fest": "^0.20.2" } }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3764,6 +3940,15 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -3800,6 +3985,12 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3875,16 +4066,27 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -3905,15 +4107,15 @@ } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -4007,6 +4209,19 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4080,16 +4295,6 @@ "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", "dev": true }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4164,9 +4369,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-keys": { @@ -4176,26 +4381,26 @@ "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "once": { @@ -4221,30 +4426,6 @@ "word-wrap": "^1.2.3" } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4254,12 +4435,6 @@ "callsites": "^3.0.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4393,6 +4568,17 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -4450,25 +4636,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -4561,6 +4747,17 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typescript": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", @@ -4646,6 +4843,20 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index ea1dd1d7..d33e5128 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "eslint": "^8.33.0", - "eslint-plugin-import": "^2.26.0", + "eslint-plugin-import": "^2.27.5", "typescript": "^4.8.4", "vscode-test": "^1.6.1" } From 89c3b43581dc47de8607b9a711727451ce802f2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:05:47 +0000 Subject: [PATCH 028/152] deps: bump @typescript-eslint/parser from 5.50.0 to 5.52.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.50.0 to 5.52.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.52.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 143 +++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 131 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1e805c2..fc5212f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@types/node": "^18.11.19", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.50.0", - "@typescript-eslint/parser": "^5.50.0", + "@typescript-eslint/parser": "^5.52.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", "typescript": "^4.8.4", @@ -194,14 +194,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "debug": "^4.3.4" }, "engines": { @@ -220,6 +220,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", @@ -2967,15 +3041,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + } + }, + "@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/scope-manager": { diff --git a/package.json b/package.json index d33e5128..5c3d5429 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.11.19", "@typescript-eslint/eslint-plugin": "^5.50.0", - "@typescript-eslint/parser": "^5.50.0", + "@typescript-eslint/parser": "^5.52.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", "typescript": "^4.8.4", From ee2d190e4da6106255dd777fcf78600b53279e51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:09:01 +0000 Subject: [PATCH 029/152] deps: bump @typescript-eslint/eslint-plugin from 5.50.0 to 5.52.0 Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.50.0 to 5.52.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.52.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 247 ++++++++++++---------------------------------- package.json | 2 +- 2 files changed, 66 insertions(+), 183 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc5212f9..deaaa258 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^18.11.19", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", @@ -160,14 +160,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", - "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/type-utils": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -220,7 +220,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "5.52.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", @@ -237,88 +237,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", - "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -339,9 +265,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -352,13 +278,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -379,16 +305,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", - "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -405,12 +331,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/types": "5.52.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3023,14 +2949,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", - "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/type-utils": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3050,87 +2976,44 @@ "@typescript-eslint/types": "5.52.0", "@typescript-eslint/typescript-estree": "5.52.0", "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" - } - }, - "@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.52.0", - "eslint-visitor-keys": "^3.3.0" - } - } } }, "@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" } }, "@typescript-eslint/type-utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", - "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3139,28 +3022,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", - "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/types": "5.52.0", "eslint-visitor-keys": "^3.3.0" } }, diff --git a/package.json b/package.json index 5c3d5429..242c8070 100644 --- a/package.json +++ b/package.json @@ -184,7 +184,7 @@ "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", "@types/node": "^18.11.19", - "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", From 8b2cc2a502860061e644509daa459cae7808578b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:11:44 +0000 Subject: [PATCH 030/152] deps: bump @types/node from 18.11.19 to 18.13.0 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.11.19 to 18.13.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index deaaa258..92036e7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", - "@types/node": "^18.11.19", + "@types/node": "^18.13.0", "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", @@ -142,9 +142,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", - "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==", + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", "dev": true }, "node_modules/@types/semver": { @@ -2931,9 +2931,9 @@ "dev": true }, "@types/node": { - "version": "18.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", - "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==", + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", "dev": true }, "@types/semver": { diff --git a/package.json b/package.json index 242c8070..2766c290 100644 --- a/package.json +++ b/package.json @@ -183,7 +183,7 @@ "devDependencies": { "@types/vscode": "^1.63.0", "@types/mocha": "^9.1.1", - "@types/node": "^18.11.19", + "@types/node": "^18.13.0", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "eslint": "^8.33.0", From 2f508c0ffcd96e0069cc178fd32b94997e63a028 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Sun, 19 Feb 2023 00:26:08 +0100 Subject: [PATCH 031/152] First check if a key already exists (#264) * Draft: First check if a key already exists * Run prettier * impots the util module --------- Co-authored-by: Daniel Luque --- src/color.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/color.ts b/src/color.ts index 690ee09d..be1488a6 100644 --- a/src/color.ts +++ b/src/color.ts @@ -3,6 +3,7 @@ import { CancellationToken, Color, ColorInformation, ColorPresentation, Document import { injectCustomTextmateTokens, TextMateRule } from "./decorator"; import { LiteralTokenType } from "./tokenizer/renpy-tokens"; import { tokenizeDocument } from "./tokenizer/tokenizer"; +import util = require("util"); export class RenpyColorProvider implements DocumentColorProvider { public provideDocumentColors(document: TextDocument, token: CancellationToken): Thenable { @@ -120,7 +121,14 @@ export function injectCustomColorStyles(document: TextDocument) { // Build the new rules for this file colorTags.forEach((color) => { const lowerColor = document.getText(color.getRange()).toLowerCase(); - colorRules.push({ scope: `renpy.meta.color.${lowerColor}`, settings: { foreground: lowerColor } }); + const newRule = { + scope: `renpy.meta.color.${lowerColor}`, + settings: { foreground: lowerColor }, + }; + + if (colorRules.some((x) => util.isDeepStrictEqual(x, newRule))) { + colorRules.push(newRule); + } }); injectCustomTextmateTokens(colorRules); From 83561a47c6d20531920ef6a2e234c14e22a0d5a8 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sun, 19 Feb 2023 00:31:02 +0100 Subject: [PATCH 032/152] Prepare 2.1.4-pre-release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dda495b7..9df27cfe 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.3", + "version": "2.1.4", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 4939e95f80baf760d4ca16162680d86f260d6d3d Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Sun, 19 Feb 2023 08:56:34 +0100 Subject: [PATCH 033/152] Invert conditional (#266) --- src/color.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/color.ts b/src/color.ts index be1488a6..784ebec0 100644 --- a/src/color.ts +++ b/src/color.ts @@ -126,7 +126,7 @@ export function injectCustomColorStyles(document: TextDocument) { settings: { foreground: lowerColor }, }; - if (colorRules.some((x) => util.isDeepStrictEqual(x, newRule))) { + if (!colorRules.some((x) => util.isDeepStrictEqual(x, newRule))) { colorRules.push(newRule); } }); From 2b220048b843ce15cadfb3ab1f07cc5287bfb43e Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Sun, 19 Feb 2023 09:01:59 +0100 Subject: [PATCH 034/152] Bump version (#267) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9df27cfe..3eed87a0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.4", + "version": "2.1.5", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 266e598ff7dac258100993f928a8027540abf8cf Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Mon, 6 Mar 2023 00:13:34 +0100 Subject: [PATCH 035/152] Properly handle escaped slashes at the end of a string (#277) --- syntaxes/renpy.tmLanguage.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/syntaxes/renpy.tmLanguage.json b/syntaxes/renpy.tmLanguage.json index ff9fec59..8ed3eb6f 100644 --- a/syntaxes/renpy.tmLanguage.json +++ b/syntaxes/renpy.tmLanguage.json @@ -875,7 +875,7 @@ }, "4": { "name": "string.quoted.renpy punctuation.definition.string.begin.renpy" } }, - "end": "(? Date: Mon, 6 Mar 2023 20:26:45 +0100 Subject: [PATCH 036/152] Bump version (#278) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7554a836..1d428f32 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.5", + "version": "2.1.6", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 6e6c3b6f9f0a8bef55d856957643ecf727bbfc7a Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:57:41 +0100 Subject: [PATCH 037/152] Fix over extended python line (#279) * Fix over extended python line If the ':' is not found, assume the python line ends at the end of a line * Update vector functionality * Bump version --- examples/unit_test.rpy | 15 ++++++++ package.json | 2 +- src/utilities/vector.ts | 62 ++++++++++++++++++++++++++++++++-- syntaxes/renpy.tmLanguage.json | 2 +- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/examples/unit_test.rpy b/examples/unit_test.rpy index b2169233..c165657b 100644 --- a/examples/unit_test.rpy +++ b/examples/unit_test.rpy @@ -1873,6 +1873,21 @@ variant "touch" take big_red + style history_text: + xpos gui.history_text_xpos + ypos gui.history_text_ypos + xanchor gui.history_text_xalign + xsize gui.history_text_width + min_width gui.history_text_width + text_align gui.history_text_xalign + layout ("subtitle" if gui.history_text_xalign else "tex") + + style history_label: + xfill True + + style history_label_text: + xalign 0.5 + init python: style.button['Foo'].background = "#f00" style.button['Bar'].background = "#00f" diff --git a/package.json b/package.json index 1d428f32..9e701c9e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.6", + "version": "2.1.7", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", diff --git a/src/utilities/vector.ts b/src/utilities/vector.ts index 6abf66bf..75e226da 100644 --- a/src/utilities/vector.ts +++ b/src/utilities/vector.ts @@ -59,7 +59,7 @@ export class Vector { } public at(index: number): T { - if (index >= this.itemCount) throw new RangeError("Index out of range"); + if (index < 0 || index >= this.itemCount) throw new RangeError("Index out of range"); // Convert to T since we only added the null type to create a storage buffer return this.buffer[index] as T; } @@ -81,12 +81,68 @@ export class Vector { throw new Error("Not yet implemented"); } + /** + * Remove the first occurrence of the item from the vector, if it exists + * @param item The item to remove + */ public erase(item: T) { - throw new Error("Not yet implemented"); + const index = this.indexOf(item); + this.eraseAt(index); } + /** + * Remove the item at the specified index + * @param index The index of the item to remove + * @throws RangeError if the index is out of range + */ public eraseAt(index: number) { - throw new Error("Not yet implemented"); + if (index < 0 || index >= this.itemCount) throw new RangeError("Index out of range"); + + // Move all items after the index to the left + for (let i = index; i < this.itemCount - 1; ++i) { + this.buffer[i] = this.buffer[i + 1]; + } + this.popBack(); + } + + /** + * Swap the items at the specified indices + * @param elementIndexA The index of the first item + * @param elementIndexB The index of the second item + * @throws RangeError if either index is out of range + */ + public swapElements(elementIndexA: number, elementIndexB: number) { + if (elementIndexA < 0 || elementIndexA >= this.itemCount) throw new RangeError("ElementIndexA out of range"); + if (elementIndexB < 0 || elementIndexB >= this.itemCount) throw new RangeError("ElementIndexB out of range"); + + const temp = this.buffer[elementIndexB]; + this.buffer[elementIndexB] = this.buffer[elementIndexA]; + this.buffer[elementIndexA] = temp; + } + + /** + * Swap the item at the specified index with the item at the back of the vector + * @param index The index of the item to swap to the back + * @throws RangeError if the index is out of range + */ + public swapToBack(index: number) { + if (index < 0 || index >= this.itemCount) throw new RangeError("Index out of range"); + + const temp = this.back(); + this.buffer[this.headPtr] = this.buffer[index]; + this.buffer[index] = temp; + } + + /** + * Returns the index of the first occurrence of a value in an array, or -1 if it is not present. + * @param searchElement The value to locate in the array. + * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0. + */ + public indexOf(item: T, fromIndex?: number) { + const index = this.buffer.indexOf(item, fromIndex); + if (index >= this.itemCount) return -1; + + return index; } /** diff --git a/syntaxes/renpy.tmLanguage.json b/syntaxes/renpy.tmLanguage.json index 8ed3eb6f..db7328ea 100644 --- a/syntaxes/renpy.tmLanguage.json +++ b/syntaxes/renpy.tmLanguage.json @@ -1213,7 +1213,7 @@ "1": { "name": "keyword.control.conditional.renpy" }, "2": { "name": "keyword.control.flow.renpy" } }, - "end": ":", + "end": ":|$", "endCaptures": { "0": { "name": "punctuation.section.block.begin.renpy" } }, From 75d7d2c1233fe3b39ab74e1fc0b118f416bfabf4 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Tue, 7 Mar 2023 00:46:57 +0100 Subject: [PATCH 038/152] Update custom containers (#280) * Update code to use Set for unique values * Update custom containers --- src/color.ts | 14 ++--- src/decorator.ts | 81 +++++++++++++++------------ src/utilities/hashset.ts | 118 +++++++++++++++++++++++++++++++++++++++ src/utilities/stack.ts | 24 ++++++-- src/utilities/vector.ts | 27 +++++++-- 5 files changed, 207 insertions(+), 57 deletions(-) create mode 100644 src/utilities/hashset.ts diff --git a/src/color.ts b/src/color.ts index 784ebec0..86dcd0e9 100644 --- a/src/color.ts +++ b/src/color.ts @@ -3,7 +3,7 @@ import { CancellationToken, Color, ColorInformation, ColorPresentation, Document import { injectCustomTextmateTokens, TextMateRule } from "./decorator"; import { LiteralTokenType } from "./tokenizer/renpy-tokens"; import { tokenizeDocument } from "./tokenizer/tokenizer"; -import util = require("util"); +import { ValueEqualsSet } from "./utilities/hashset"; export class RenpyColorProvider implements DocumentColorProvider { public provideDocumentColors(document: TextDocument, token: CancellationToken): Thenable { @@ -116,19 +116,13 @@ export function injectCustomColorStyles(document: TextDocument) { // TODO: Should probably make sure this constant is actually part of a tag, but for now this is fine. const colorTags = documentTokens.filter((x) => x.tokenType === LiteralTokenType.Color); - const colorRules: TextMateRule[] = []; + const colorRules = new ValueEqualsSet(); // Build the new rules for this file colorTags.forEach((color) => { const lowerColor = document.getText(color.getRange()).toLowerCase(); - const newRule = { - scope: `renpy.meta.color.${lowerColor}`, - settings: { foreground: lowerColor }, - }; - - if (!colorRules.some((x) => util.isDeepStrictEqual(x, newRule))) { - colorRules.push(newRule); - } + const newRule = new TextMateRule(`renpy.meta.color.${lowerColor}`, { foreground: lowerColor }); + colorRules.add(newRule); }); injectCustomTextmateTokens(colorRules); diff --git a/src/decorator.ts b/src/decorator.ts index 7e86372e..35c2bcae 100644 --- a/src/decorator.ts +++ b/src/decorator.ts @@ -1,55 +1,66 @@ import { ConfigurationTarget, workspace } from "vscode"; +import util = require("util"); +import { IEquatable, ValueEqualsSet } from "./utilities/hashset"; -export type TextMateRule = { scope: string | string[]; settings: { fontStyle?: string; foreground?: string } }; -type TextMateRules = { textMateRules: TextMateRule[] }; +export class TextMateRule implements IEquatable { + public scope: string | string[]; + public settings: { fontStyle?: string; foreground?: string }; -const customFontStyleRules: TextMateRule[] = [ - { scope: "renpy.meta.plain", settings: { fontStyle: "" } }, - { scope: "renpy.meta.i", settings: { fontStyle: "italic" } }, - { scope: "renpy.meta.b", settings: { fontStyle: "bold" } }, - { scope: ["renpy.meta.u", "renpy.meta.a"], settings: { fontStyle: "underline" } }, - { scope: "renpy.meta.s", settings: { fontStyle: "strikethrough" } }, + constructor(scope: string | string[], settings: { fontStyle?: string; foreground?: string }) { + this.scope = scope; + this.settings = settings; + } + + equals(other: TextMateRule): boolean { + return util.isDeepStrictEqual(this, other); + } +} +type TextMateRuleConfiguration = { scope: string | string[]; settings: { fontStyle?: string; foreground?: string } }; +type TextMateRules = { textMateRules: TextMateRuleConfiguration[] }; + +const customFontStyleRules = new ValueEqualsSet([ + new TextMateRule("renpy.meta.plain", { fontStyle: "" }), + new TextMateRule("renpy.meta.i", { fontStyle: "italic" }), + new TextMateRule("renpy.meta.b", { fontStyle: "bold" }), + new TextMateRule(["renpy.meta.u", "renpy.meta.a"], { fontStyle: "underline" }), + new TextMateRule("renpy.meta.s", { fontStyle: "strikethrough" }), - { scope: "renpy.meta.i renpy.meta.b", settings: { fontStyle: "italic bold" } }, - { scope: "renpy.meta.i renpy.meta.u", settings: { fontStyle: "italic underline" } }, - { scope: "renpy.meta.i renpy.meta.s", settings: { fontStyle: "italic strikethrough" } }, - { scope: "renpy.meta.b renpy.meta.u", settings: { fontStyle: "bold underline" } }, - { scope: "renpy.meta.b renpy.meta.s", settings: { fontStyle: "bold strikethrough" } }, - { scope: "renpy.meta.u renpy.meta.s", settings: { fontStyle: "underline strikethrough" } }, + new TextMateRule("renpy.meta.i renpy.meta.b", { fontStyle: "italic bold" }), + new TextMateRule("renpy.meta.i renpy.meta.u", { fontStyle: "italic underline" }), + new TextMateRule("renpy.meta.i renpy.meta.s", { fontStyle: "italic strikethrough" }), + new TextMateRule("renpy.meta.b renpy.meta.u", { fontStyle: "bold underline" }), + new TextMateRule("renpy.meta.b renpy.meta.s", { fontStyle: "bold strikethrough" }), + new TextMateRule("renpy.meta.u renpy.meta.s", { fontStyle: "underline strikethrough" }), - { scope: "renpy.meta.i renpy.meta.b renpy.meta.u", settings: { fontStyle: "italic bold underline" } }, - { scope: "renpy.meta.i renpy.meta.b renpy.meta.s", settings: { fontStyle: "italic bold strikethrough" } }, - { scope: "renpy.meta.i renpy.meta.u renpy.meta.s", settings: { fontStyle: "italic underline strikethrough" } }, - { scope: "renpy.meta.b renpy.meta.u renpy.meta.s", settings: { fontStyle: "bold underline strikethrough" } }, + new TextMateRule("renpy.meta.i renpy.meta.b renpy.meta.u", { fontStyle: "italic bold underline" }), + new TextMateRule("renpy.meta.i renpy.meta.b renpy.meta.s", { fontStyle: "italic bold strikethrough" }), + new TextMateRule("renpy.meta.i renpy.meta.u renpy.meta.s", { fontStyle: "italic underline strikethrough" }), + new TextMateRule("renpy.meta.b renpy.meta.u renpy.meta.s", { fontStyle: "bold underline strikethrough" }), - { scope: "renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s", settings: { fontStyle: "italic bold underline strikethrough" } }, + new TextMateRule("renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s", { fontStyle: "italic bold underline strikethrough" }), - { scope: "renpy.meta.color.text", settings: { foreground: "#ffffff" } }, -]; + new TextMateRule("renpy.meta.color.text", { foreground: "#ffffff" }), +]); -export function injectCustomTextmateTokens(rules: TextMateRule[]) { +export function injectCustomTextmateTokens(rules: ValueEqualsSet) { const tokensConfig = workspace.getConfiguration("editor"); // If the config didn't exist yet, push the default tokens let tokenColorCustomizations = tokensConfig.get("tokenColorCustomizations"); - if (tokenColorCustomizations === undefined || tokenColorCustomizations.textMateRules === undefined) tokenColorCustomizations = { textMateRules: customFontStyleRules }; + if (tokenColorCustomizations === undefined || tokenColorCustomizations.textMateRules === undefined) { + tokenColorCustomizations = { textMateRules: customFontStyleRules.toArray() }; + } const currentRules = tokenColorCustomizations.textMateRules; // Build the new rules for this file - const newRules = customFontStyleRules.concat(rules); // Always add the default rules - const filteredRules = newRules.filter((y) => { - return !currentRules.some((x) => { - if (x.scope instanceof Array && y.scope instanceof Array) { - return x.scope.length === y.scope.length && x.scope.every((value, index) => value === y.scope[index]); - } - - return x.scope === y.scope || (x.scope === y.scope && (x.settings.foreground !== y.settings.foreground || x.settings.fontStyle !== y.settings.fontStyle)); - }); - }); + const newRules = customFontStyleRules.addRange(rules); // Always add the default rules + for (const rule of currentRules) { + newRules.add(new TextMateRule(rule.scope, rule.settings)); + } - if (filteredRules.length !== 0) { - tokenColorCustomizations.textMateRules = currentRules.concat(filteredRules); + if (newRules.size !== 0) { + tokenColorCustomizations.textMateRules = newRules.toArray(); tokensConfig.update("tokenColorCustomizations", tokenColorCustomizations, ConfigurationTarget.Workspace).then( () => { console.log("Successfully updated the tokenColorCustomizations config"); diff --git a/src/utilities/hashset.ts b/src/utilities/hashset.ts new file mode 100644 index 00000000..06f03f14 --- /dev/null +++ b/src/utilities/hashset.ts @@ -0,0 +1,118 @@ +export interface IEquatable { + /** + * Returns `true` if the two objects are equal, `false` otherwise. + */ + equals(object: T): boolean; +} + +/** + * A set that only allows unique values based on the `equals` method. + * @param T The type of the values in the set + * @remarks This is a workaround for the fact that `Set` doesn't allow custom equality checks. + * The current implementation is not very efficient, but it works. + */ +export class ValueEqualsSet> extends Set { + add(value: T) { + if (!this.has(value)) { + super.add(value); + } + return this; + } + + addRange(values: Iterable) { + for (const value of values) { + this.add(value); + } + return this; + } + + has(otherValue: T): boolean { + for (const value of this.values()) { + if (value.equals(otherValue)) { + return true; + } + } + return false; + } + + toArray(): T[] { + return Array.from(this); + } +} + +/** + * An optimized hash set implementation which uses a hashing function and buckets to store values. + * @remarks This is a work in progress, and has not been tested yet. + */ +export class HashSet implements Iterable { + private _buckets: T[][] = []; + private _size = 0; + + constructor(private readonly _hash: (value: T) => number) {} + + get size() { + return this._size; + } + + add(value: T) { + const hash = this._hash(value); + const bucket = this._buckets[hash]; + if (bucket === undefined) { + this._buckets[hash] = [value]; + } else { + if (!bucket.includes(value)) { + bucket.push(value); + } + } + this._size++; + } + + addRange(values: Iterable) { + for (const value of values) { + this.add(value); + } + } + + has(value: T) { + const hash = this._hash(value); + const bucket = this._buckets[hash]; + return bucket !== undefined && bucket.includes(value); + } + + remove(value: T) { + const hash = this._hash(value); + const bucket = this._buckets[hash]; + if (bucket !== undefined) { + const index = bucket.indexOf(value); + if (index >= 0) { + bucket.splice(index, 1); + this._size--; + } + } + } + + [Symbol.iterator](): Iterator { + let index = 0; + let bucketIndex = 0; + let bucket: T[] | undefined = this._buckets[0]; + return { + next: () => { + while (bucket === undefined || index >= bucket.length) { + bucket = this._buckets[++bucketIndex]; + index = 0; + } + return { value: bucket[index++], done: false }; + }, + }; + } + + toArray(): T[] { + const result: T[] = []; + for (const bucket of this._buckets) { + if (bucket !== undefined) { + result.push(...bucket); + } + } + return result; + } +} diff --git a/src/utilities/stack.ts b/src/utilities/stack.ts index 4821b79a..7a0847df 100644 --- a/src/utilities/stack.ts +++ b/src/utilities/stack.ts @@ -1,4 +1,4 @@ -export class Stack { +export class Stack implements Iterable { private buffer: Array = []; private headPtr = -1; @@ -14,12 +14,24 @@ export class Stack { if (capacity > 0) this.buffer = new Array(capacity).fill(null); } + [Symbol.iterator](): Iterator { + let index = 0; + return { + next: () => { + if (index >= this.size) { + return { done: true, value: null }; + } + return { done: false, value: this.buffer[index++] as T }; + }, + }; + } + /** * Add a new item on top of the stack * @param item The item to add */ public push(item: T) { - if (this.size() === this.capacity()) this._grow(); + if (this.size === this.capacity) this._grow(); ++this.itemCount; ++this.headPtr; @@ -62,7 +74,7 @@ export class Stack { * Get the amount of items that the stack is able to hold at this time * @returns The amount items that could fit in the internal memory buffer */ - public capacity() { + get capacity() { return this.buffer.length; } @@ -70,7 +82,7 @@ export class Stack { * Get the amount of items that are on the stack * @returns The number of items */ - public size() { + get size() { return this.itemCount; } @@ -102,14 +114,14 @@ export class Stack { * Shrink the internal memory buffer to match the size of the stack */ public shrink() { - this.buffer.length = this.size(); + this.buffer.length = this.size; } /** * Grow the buffer to double the current capacity */ private _grow() { - const currentCapacity = Math.max(this.capacity(), 1); + const currentCapacity = Math.max(this.capacity, 1); this.buffer = this.buffer.concat(new Array(currentCapacity).fill(null)); } diff --git a/src/utilities/vector.ts b/src/utilities/vector.ts index 75e226da..158aa995 100644 --- a/src/utilities/vector.ts +++ b/src/utilities/vector.ts @@ -1,4 +1,7 @@ -export class Vector { +/** + * A dynamically sized array that can be used to store items of any type. + */ +export class Vector implements Iterable { private buffer: Array = []; private headPtr = -1; @@ -15,12 +18,24 @@ export class Vector { if (capacity > 0) this.buffer = new Array(capacity).fill(null); } + [Symbol.iterator](): Iterator { + let index = 0; + return { + next: () => { + if (index >= this.size) { + return { done: true, value: null }; + } + return { done: false, value: this.buffer[index++] as T }; + }, + }; + } + /** * Add a new item to the end of the vector * @param item The item to add */ public pushBack(item: T) { - if (this.size() === this.capacity()) { + if (this.size === this.capacity) { this._grow(); } @@ -149,7 +164,7 @@ export class Vector { * Get the amount of items that the vector is able to hold at this time * @returns The amount items that could fit in the internal memory buffer */ - public capacity() { + get capacity() { return this.buffer.length; } @@ -157,7 +172,7 @@ export class Vector { * Get the amount of items that are on the vector * @returns The number of items */ - public size() { + get size() { return this.itemCount; } @@ -199,14 +214,14 @@ export class Vector { * Shrink the internal memory buffer to match the size of the vector */ public shrink() { - this.buffer.length = this.size(); + this.buffer.length = this.size; } /** * Grow the buffer to double the current capacity */ private _grow() { - const currentCapacity = Math.max(this.capacity(), 1); + const currentCapacity = Math.max(this.capacity, 1); this.buffer = this.buffer.concat(new Array(currentCapacity).fill(null)); } From 7b8bbc9cfb8b8cda224d58319d3aa45d6379ebb7 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Tue, 7 Mar 2023 08:22:09 +0100 Subject: [PATCH 039/152] Fix incorrect check (#281) !== 0 would always be true now. Let's change it to check if the number of rules has changed, and only update if they are different --- src/decorator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decorator.ts b/src/decorator.ts index 35c2bcae..dab29a9f 100644 --- a/src/decorator.ts +++ b/src/decorator.ts @@ -59,7 +59,7 @@ export function injectCustomTextmateTokens(rules: ValueEqualsSet) newRules.add(new TextMateRule(rule.scope, rule.settings)); } - if (newRules.size !== 0) { + if (newRules.size !== currentRules.length) { tokenColorCustomizations.textMateRules = newRules.toArray(); tokensConfig.update("tokenColorCustomizations", tokenColorCustomizations, ConfigurationTarget.Workspace).then( () => { From 69835d2351650d078c098219c49bfe00160ddd91 Mon Sep 17 00:00:00 2001 From: a2937 Date: Sat, 6 May 2023 20:30:52 -0400 Subject: [PATCH 040/152] Chore: Allow 000*.rpy files in renpy/common (#300) --- src/diagnostics.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagnostics.ts b/src/diagnostics.ts index 326fe1b3..c3488402 100644 --- a/src/diagnostics.ts +++ b/src/diagnostics.ts @@ -76,7 +76,7 @@ export function refreshDiagnostics(doc: TextDocument, diagnosticCollection: Diag const filename = extractFilename(doc.uri.path); if (filename) { - if (!filename.match(/^[a-zA-Z0-9]/) || filename.startsWith("00")) { + if ((!filename.match(/^[a-zA-Z0-9]/) || filename.startsWith("00")) && !doc.uri.path.includes("renpy/common")) { const invalidRange = new Range(0, 0, doc.lineCount, 0); const range = doc.validateRange(invalidRange); const diagnostic = new Diagnostic(range, "Filenames must begin with a letter or number, but may not begin with '00' as Ren'Py uses such files for its own purposes.", severity); From c2bea06c9caf2497470f9efae230efe09804b4ff Mon Sep 17 00:00:00 2001 From: seanj29 <88255342+seanj29@users.noreply.github.com> Date: Sun, 7 May 2023 20:45:03 +0100 Subject: [PATCH 041/152] RunRenpyViaplugin (#291) * Edited extensions method to add way to run renpy * Added the command to the pallete via json * Adding debug config to allow renpy to be played from play button * changed type to cmd * reformatted with prettier * This format might work? * Refactored if statement to make it more readable * Refactoring of folder names and chaning if statements * This commit fixed the issues in comment https://github.com/LuqueDaniel/vscode-language-renpy/pull/291#discussion_r1170180867, , refactoring if statement * reformated through magical means... God I hate switching computers * Reformated with the correct file, please ignore previous one --- package.json | 6 ++++ src/extension.ts | 73 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2766c290..b28ecd0d 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,12 @@ { "command": "renpy.refreshDiagnostics", "title": "Refresh Ren'Py diagnostics for the active editor window" + }, + { + "command": "renpy.runCommand", + "title": "Run Project", + "category": "Run", + "icon": "$(play)" } ], "configuration": [ diff --git a/src/extension.ts b/src/extension.ts index 322e14e6..c5e0c4f4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -16,6 +16,7 @@ import { DefinitionProvider, DocumentSemanticTokensProvider, DocumentSymbol, + debug, DocumentSymbolProvider, ExtensionContext, Hover, @@ -258,6 +259,33 @@ export async function activate(context: ExtensionContext): Promise { }); context.subscriptions.push(refreshDiagnosticsCommand); + // custom command - call renpy to run workspace + const runCommand = commands.registerCommand("renpy.runCommand", () => { + //EsLint reccommends config be removed as it has already been decrlaed in a previous scope + if (!config || !isValidExecutable(config.renpyExecutableLocation)) { + window.showErrorMessage("Ren'Py executable location not configured or is invalid."); + } else { + //this is kinda a hob botched together attempt that I'm like 30% certain has a chance of working + debug.startDebugging( + undefined, + { + type: "cmd", + name: "Run File", + request: "launch", + program: config.renpyExecutableLocation, + }, + { noDebug: true } + ); + + //call renpy + const result = RunWorkspaceFolder(); + if (result) { + window.showInformationMessage("Ren'Py is running successfully"); + } + } + }); + context.subscriptions.push(runCommand); + // custom command - call renpy to compile const compileCommand = commands.registerCommand("renpy.compileNavigationData", () => { // check Settings has the path to Ren'Py executable @@ -394,6 +422,44 @@ function isValidExecutable(renpyExecutableLocation: string): boolean { } return fs.existsSync(renpyExecutableLocation); } +// Attempts to run renpy executable through console commands. +function RunWorkspaceFolder(): boolean { + const config = workspace.getConfiguration("renpy"); + + if (config && isValidExecutable(config.renpyExecutableLocation)) { + const renpy = config.renpyExecutableLocation; + const renpyPath = cleanUpPath(Uri.file(renpy).path); + const cwd = renpyPath.substring(0, renpyPath.lastIndexOf("/")); + const workfolder = getWorkspaceFolder(); + const args: string[] = [`${workfolder}`, "run"]; + if (workfolder.endsWith("/game")) { + try { + updateStatusBar("$(sync~spin) Running Ren'Py..."); + const result = cp.spawnSync(renpy, args, { + cwd: `${cwd}`, + env: { PATH: process.env.PATH }, + }); + if (result.error) { + console.log(`renpy spawn error: ${result.error}`); + return false; + } + if (result.stderr && result.stderr.length > 0) { + console.log(`renpy spawn stderr: ${result.stderr}`); + return false; + } + } catch (error) { + console.log(`renpy spawn error: ${error}`); + return false; + } finally { + updateStatusBar(getStatusBarText()); + } + return true; + } + } else { + console.log("config for rennpy does not exist"); + return false; + } +} function ExecuteRenpyCompile(): boolean { const config = workspace.getConfiguration("renpy"); @@ -412,7 +478,12 @@ function ExecuteRenpyCompile(): boolean { try { NavigationData.isCompiling = true; updateStatusBar("$(sync~spin) Compiling Ren'Py navigation data..."); - const result = cp.spawnSync(renpy, args, { cwd: `${cwd}`, env: { PATH: process.env.PATH }, encoding: "utf-8", windowsHide: true }); + const result = cp.spawnSync(renpy, args, { + cwd: `${cwd}`, + env: { PATH: process.env.PATH }, + encoding: "utf-8", + windowsHide: true, + }); if (result.error) { console.log(`renpy spawn error: ${result.error}`); return false; From 8bc721a2df3db7cd32726bae1ee27bc405d6e33d Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Fri, 12 May 2023 15:45:52 +0100 Subject: [PATCH 042/152] Ignore dist folder (#303) --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index b28ecd0d..37df3950 100644 --- a/package.json +++ b/package.json @@ -74,19 +74,19 @@ "commands": [ { "command": "renpy.refreshNavigationData", - "title": "Refresh Ren'Py Navigation Data" + "title": "Renpy: Refresh Ren'Py Navigation Data" }, { "command": "renpy.compileNavigationData", - "title": "Compile Ren'Py Navigation Data" + "title": "Renpy: Compile Ren'Py Navigation Data" }, { "command": "renpy.refreshDiagnostics", - "title": "Refresh Ren'Py diagnostics for the active editor window" + "title": "Renpy: Refresh Ren'Py diagnostics for the active editor window" }, { "command": "renpy.runCommand", - "title": "Run Project", + "title": "Renpy: Run Project", "category": "Run", "icon": "$(play)" } From 3aff52cc4986e56be9031f430fb955677f598f0e Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Fri, 12 May 2023 15:49:07 +0100 Subject: [PATCH 043/152] Ignore dist folder (#301) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e58f6f41..170c7181 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules out *.vsix +dist/* From f62be5da1e9e47174ff3b7d7ab2cd249dcb2894c Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 12 May 2023 12:27:19 -0400 Subject: [PATCH 044/152] Chore(Enhancement) - Add a command that cleans up compiled files. --- package.json | 4 ++++ src/extension.ts | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b28ecd0d..94d3b823 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,10 @@ "command": "renpy.refreshDiagnostics", "title": "Refresh Ren'Py diagnostics for the active editor window" }, + { + "command": "renpy.migrateOldFiles", + "title": "Cleanup unused compiled Ren'Py source files" + }, { "command": "renpy.runCommand", "title": "Run Project", diff --git a/src/extension.ts b/src/extension.ts index c5e0c4f4..77e41ef0 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -41,6 +41,7 @@ import { window, workspace, WorkspaceConfiguration, + RelativePattern, } from "vscode"; import { RenpyColorProvider } from "./color"; import { getCompletionList } from "./completion"; @@ -251,7 +252,34 @@ export async function activate(context: ExtensionContext): Promise { }); context.subscriptions.push(gotoFileLocationCommand); - // custom command - refresh diagnositcs + const migrateOldFilesCommand = commands.registerCommand("renpy.migrateOldFiles", () => { + if (workspace !== null) { + workspace.findFiles("**/*.rpyc", null, 50).then((uris: Uri[]) => { + uris.forEach((uri) => { + const sourceFile = Uri.parse(uri.toString().replace(".rpyc", ".rpy")); + workspace.fs.stat(sourceFile).then( + function () { + // Do nothing + }, + function () { + const endOfPath = uri.toString().replace("game", "old-game").lastIndexOf("/"); + const properLocation = Uri.parse(uri.toString().replace("game", "old-game")); + const oldDataDirectory = Uri.parse(properLocation.toString().substring(0, endOfPath)); + workspace.fs.createDirectory(oldDataDirectory); + workspace.fs + .readFile(uri) + .then((data) => workspace.fs.writeFile(properLocation, data)) + .then(() => workspace.fs.delete(uri)); + } + ); + }); + }); + } + }); + + context.subscriptions.push(migrateOldFilesCommand); + + // custom command - refresh diagnostics const refreshDiagnosticsCommand = commands.registerCommand("renpy.refreshDiagnostics", () => { if (window.activeTextEditor) { refreshDiagnostics(window.activeTextEditor.document, diagnostics); @@ -261,7 +289,7 @@ export async function activate(context: ExtensionContext): Promise { // custom command - call renpy to run workspace const runCommand = commands.registerCommand("renpy.runCommand", () => { - //EsLint reccommends config be removed as it has already been decrlaed in a previous scope + //EsLint recommends config be removed as it has already been declared in a previous scope if (!config || !isValidExecutable(config.renpyExecutableLocation)) { window.showErrorMessage("Ren'Py executable location not configured or is invalid."); } else { @@ -455,6 +483,7 @@ function RunWorkspaceFolder(): boolean { } return true; } + return false; } else { console.log("config for rennpy does not exist"); return false; From d7d98d521724dff4ca541d5347b7d248ca09a3b1 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 12 May 2023 13:24:58 -0400 Subject: [PATCH 045/152] Update the command title to match the convention. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 94d3b823..eb5afd3a 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ }, { "command": "renpy.migrateOldFiles", - "title": "Cleanup unused compiled Ren'Py source files" + "title": "Renpy: Cleanup unused compiled Ren'Py source files" }, { "command": "renpy.runCommand", From 4a584eba2f706bbbf1755e73f331d15926bf1d03 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 12 May 2023 13:30:41 -0400 Subject: [PATCH 046/152] Use await/async syntax --- src/extension.ts | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 77e41ef0..a58fc2e8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -41,7 +41,6 @@ import { window, workspace, WorkspaceConfiguration, - RelativePattern, } from "vscode"; import { RenpyColorProvider } from "./color"; import { getCompletionList } from "./completion"; @@ -252,27 +251,23 @@ export async function activate(context: ExtensionContext): Promise { }); context.subscriptions.push(gotoFileLocationCommand); - const migrateOldFilesCommand = commands.registerCommand("renpy.migrateOldFiles", () => { + const migrateOldFilesCommand = commands.registerCommand("renpy.migrateOldFiles", async () => { if (workspace !== null) { - workspace.findFiles("**/*.rpyc", null, 50).then((uris: Uri[]) => { - uris.forEach((uri) => { - const sourceFile = Uri.parse(uri.toString().replace(".rpyc", ".rpy")); - workspace.fs.stat(sourceFile).then( - function () { - // Do nothing - }, - function () { - const endOfPath = uri.toString().replace("game", "old-game").lastIndexOf("/"); - const properLocation = Uri.parse(uri.toString().replace("game", "old-game")); - const oldDataDirectory = Uri.parse(properLocation.toString().substring(0, endOfPath)); - workspace.fs.createDirectory(oldDataDirectory); - workspace.fs - .readFile(uri) - .then((data) => workspace.fs.writeFile(properLocation, data)) - .then(() => workspace.fs.delete(uri)); - } - ); - }); + const altURIs = await workspace.findFiles("**/*.rpyc", null, 50); + altURIs.forEach(async (uri) => { + const sourceFile = Uri.parse(uri.toString().replace(".rpyc", ".rpy")); + try { + await workspace.fs.stat(sourceFile); + } catch (error) { + const endOfPath = uri.toString().replace("game", "old-game").lastIndexOf("/"); + const properLocation = Uri.parse(uri.toString().replace("game", "old-game")); + const oldDataDirectory = Uri.parse(properLocation.toString().substring(0, endOfPath)); + workspace.fs.createDirectory(oldDataDirectory); + workspace.fs + .readFile(uri) + .then((data) => workspace.fs.writeFile(properLocation, data)) + .then(() => workspace.fs.delete(uri)); + } }); } }); From e981aa58746291bdc9f49f2d2f7a82d9104a2610 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sat, 13 May 2023 12:57:22 +0200 Subject: [PATCH 047/152] Adds PR ci to master Fixes #306 --- .github/workflows/pr-check.yml | 57 + package-lock.json | 1782 +++++++++++++++++++++++++++++++- package.json | 8 +- 3 files changed, 1834 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/pr-check.yml diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml new file mode 100644 index 00000000..9b56c1f5 --- /dev/null +++ b/.github/workflows/pr-check.yml @@ -0,0 +1,57 @@ +name: PR Check + +on: + pull_request: + branches: + - master + - develop + +env: + NODE_VERSION: 16 + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup + with: + node_version: ${{ env.NODE_VERSION }} + - name: Lint + run: npm run lint + + format: + name: Format + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup + with: + node_version: ${{ env.NODE_VERSION }} + - name: Format + run: npm run format-check + + build_extension: + name: Build Extension + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup + with: + node_version: ${{ env.NODE_VERSION }} + - name: Build Extension + run: npm run vsce-package + - name: Upload Extension + uses: actions/upload-artifact@v3 + with: + name: languague-renpy-package + path: "**/*.vsix" + if-no-files-found: error + retention-days: 7 diff --git a/package-lock.json b/package-lock.json index 92036e7d..7911386f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,10 @@ "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", + "@vscode/vsce": "^2.15.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", + "prettier": "^2.7.1", "typescript": "^4.8.4", "vscode-test": "^1.6.1" }, @@ -347,6 +349,65 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@vscode/vsce/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -405,6 +466,18 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -487,12 +560,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/azure-devops-node-api": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "dev": true, + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -515,12 +619,45 @@ "node": "*" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -543,6 +680,40 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-indexof-polyfill": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", @@ -595,6 +766,89 @@ "node": "*" } }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -621,6 +875,34 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -638,6 +920,32 @@ } } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -660,6 +968,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -684,6 +1002,61 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -693,6 +1066,28 @@ "readable-stream": "^2.0.2" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-abstract": { "version": "1.21.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", @@ -780,6 +1175,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/eslint": { "version": "8.33.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", @@ -1241,6 +1645,16 @@ "node": ">=0.10.0" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1296,6 +1710,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1348,6 +1771,13 @@ "is-callable": "^1.1.3" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "optional": true + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1444,6 +1874,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "optional": true + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -1571,6 +2008,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -1622,6 +2068,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -1649,6 +2126,27 @@ "node": ">= 6" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -1699,7 +2197,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/internal-slot": { + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "optional": true + }, + "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", @@ -2007,6 +2512,33 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2020,6 +2552,15 @@ "node": ">= 0.8.0" } }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -2044,6 +2585,37 @@ "node": ">=10" } }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2066,6 +2638,31 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2096,12 +2693,32 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "optional": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true, + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2114,6 +2731,38 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "node_modules/node-abi": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", + "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", + "dev": true, + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, + "optional": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -2205,6 +2854,49 @@ "node": ">=6" } }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2238,6 +2930,12 @@ "node": ">=8" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2250,6 +2948,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2259,12 +2984,38 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -2274,6 +3025,21 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2294,6 +3060,44 @@ } ] }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -2432,6 +3236,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -2488,6 +3298,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2567,6 +3424,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2579,12 +3448,69 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2639,6 +3565,28 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2677,6 +3625,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "dev": true, + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "node_modules/typescript": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", @@ -2690,6 +3649,12 @@ "node": ">=4.2.0" } }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -2705,6 +3670,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, "node_modules/unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", @@ -2732,6 +3703,12 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2820,12 +3797,40 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -3047,6 +4052,53 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "requires": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + } + } + }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -3087,6 +4139,15 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3142,12 +4203,29 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, + "azure-devops-node-api": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "dev": true, + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "optional": true + }, "big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -3164,12 +4242,44 @@ "chainsaw": "~0.1.0" } }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3189,6 +4299,23 @@ "fill-range": "^7.0.1" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "optional": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-indexof-polyfill": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", @@ -3211,21 +4338,89 @@ "get-intrinsic": "^1.0.2" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "traverse": ">=0.3.0 <0.4" + "color-name": "1.1.3" } }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3249,6 +4444,25 @@ "which": "^2.0.1" } }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3258,6 +4472,23 @@ "ms": "2.1.2" } }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "optional": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3274,6 +4505,13 @@ "object-keys": "^1.1.1" } }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "optional": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3292,6 +4530,43 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -3301,6 +4576,22 @@ "readable-stream": "^2.0.2" } }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "optional": true, + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, "es-abstract": { "version": "1.21.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", @@ -3373,6 +4664,12 @@ "is-symbol": "^1.0.2" } }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, "eslint": { "version": "8.33.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", @@ -3717,6 +5014,13 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "optional": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3768,6 +5072,15 @@ "reusify": "^1.0.4" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3811,6 +5124,13 @@ "is-callable": "^1.1.3" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "optional": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3885,6 +5205,13 @@ "get-intrinsic": "^1.1.1" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "optional": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -3976,6 +5303,12 @@ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, "has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -4006,6 +5339,27 @@ "has-symbols": "^1.0.2" } }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -4027,6 +5381,13 @@ "debug": "4" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "optional": true + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -4065,6 +5426,13 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "optional": true + }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -4279,6 +5647,29 @@ "minimist": "^1.2.0" } }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4289,6 +5680,15 @@ "type-check": "~0.4.0" } }, + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -4310,6 +5710,33 @@ "yallist": "^4.0.0" } }, + "markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true + } + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4326,6 +5753,19 @@ "picomatch": "^2.3.1" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "optional": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4350,12 +5790,32 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "optional": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true, + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -4368,6 +5828,32 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "node-abi": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", + "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", + "dev": true, + "optional": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, + "optional": true + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -4435,6 +5921,42 @@ "callsites": "^3.0.0" } }, + "parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "requires": { + "semver": "^5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4459,36 +5981,120 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true + } + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4579,6 +6185,12 @@ "is-regex": "^1.1.4" } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -4620,6 +6232,25 @@ "object-inspect": "^1.9.0" } }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "optional": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "optional": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -4678,18 +6309,77 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4732,6 +6422,22 @@ "tslib": "^1.8.1" } }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4758,12 +6464,29 @@ "is-typed-array": "^1.1.9" } }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "dev": true, + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "typescript": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -4776,6 +6499,12 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, "unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", @@ -4803,6 +6532,12 @@ "punycode": "^2.1.0" } }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4869,12 +6604,37 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 99469684..68212662 100644 --- a/package.json +++ b/package.json @@ -188,7 +188,9 @@ "compile": "tsc -p ./", "watch": "tsc -watch -p ./", "test": "npm run compile && node ./node_modules/vscode/bin/test", - "lint": "eslint -c .eslintrc.json --ext .ts ./src/" + "lint": "eslint -c .eslintrc.json --ext .ts ./src/", + "vsce-package": "vsce package -o languague-renpy.vsix", + "format-check": "prettier --check 'src/**/*.ts' '.github/**/*.yml'" }, "devDependencies": { "@types/vscode": "^1.63.0", @@ -199,6 +201,8 @@ "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", "typescript": "^4.8.4", - "vscode-test": "^1.6.1" + "vscode-test": "^1.6.1", + "prettier": "^2.7.1", + "@vscode/vsce": "^2.15.0" } } From f2a94a393ec40050cbba9dceb6571275ec374afe Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sat, 13 May 2023 13:02:02 +0200 Subject: [PATCH 048/152] Fixes codeql-analysis.yml format --- .github/workflows/codeql-analysis.yml | 58 +++++++++++++-------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f97517a5..4efdfe45 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,14 +13,14 @@ name: "CodeQL" on: push: - branches: [ master ] + branches: [master] pull_request: # The branches below must be a subset of the branches above - branches: [ master ] + branches: [master] paths: - src/ schedule: - - cron: '00 00 1 * *' + - cron: "00 00 1 * *" permissions: security-events: write @@ -33,40 +33,40 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'javascript' ] + language: ["javascript"] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] # Learn more: # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed steps: - - name: Checkout repository - uses: actions/checkout@v3 + - name: Checkout repository + uses: actions/checkout@v3 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 From 65b41f7e5262245a4810b6b3310ea9ba2edafa92 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sat, 13 May 2023 13:05:19 +0200 Subject: [PATCH 049/152] Adds setup action --- .github/actions/setup/action.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/actions/setup/action.yml diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 00000000..14cc5654 --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,19 @@ +name: "setup" +description: "Setup Node for all workflows" + +inputs: + node_version: + description: "Version of Node to use" + required: true + +runs: + using: "composite" + steps: + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: ${{ inputs.node_version }} + cache: "npm" + - name: Install Node dependencies + run: npm ci --prefer-offline + shell: bash From ed88e98bdf65555d2cd214700e326b234796c964 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Thu, 25 May 2023 18:23:42 +0100 Subject: [PATCH 050/152] Fixed say statements messing with strings (#316) --- syntaxes/renpy.tmLanguage.json | 52 ++++++++++++++-------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/syntaxes/renpy.tmLanguage.json b/syntaxes/renpy.tmLanguage.json index db7328ea..765bb564 100644 --- a/syntaxes/renpy.tmLanguage.json +++ b/syntaxes/renpy.tmLanguage.json @@ -839,45 +839,43 @@ "say-statements": { "patterns": [ { + "name": "meta.say.statement.renpy", "contentName": "string.quoted.renpy renpy.meta.say.$1", - "begin": "(?<=^[ \\t]+)(?:([a-zA-Z_]\\w*)\\b|\"([a-zA-Z_]\\w*)\\b\")((?:[ \\t]+(?:@|\\w+))*)?[ \\t]*(\"\"\"|\"|'''|'|```|`)", + "begin": "^[ \\t]+(?:([a-zA-Z_]\\w*)\\b|\"([a-zA-Z_]\\w*)\\b\")((?:[ \\t]+(?:@|\\w+))*)?[ \\t]*(\"\"\"|\"|'''|'|```|`)", "beginCaptures": { "1": { - "name": "renpy.meta.character.$1", + "name": "variable.other.renpy renpy.meta.character.$1", "patterns": [ { "match": "extend", - "name": "keyword.other.renpy" + "name": "keyword.extend.renpy" }, { "match": "voice", - "name": "keyword.other.renpy" + "name": "keyword.voice.renpy" }, { "comment": "Match special characters", "match": "adv|nvl|narrator|name_only|centered|vcentered", "name": "variable.other.constant.renpy" - }, - { - "match": ".*" } ] }, - "2": { "name": "renpy.meta.string.character.$2" }, + "2": { "name": "meta.string.character.$2.renpy" }, "3": { - "name": "meta.say.attributes.renpy", + "name": "meta.arguments.renpy", "patterns": [ { - "name": "keyword.renpy", + "name": "keyword.at.renpy", "match": "@" } ] }, - "4": { "name": "string.quoted.renpy punctuation.definition.string.begin.renpy" } + "4": { "name": "punctuation.definition.string.begin.renpy string.quoted.renpy" } }, "end": "(? Date: Fri, 2 Jun 2023 12:04:22 +0100 Subject: [PATCH 051/152] Tokenizer updates (#317) * WIP: Tokenizer update * Split ATL patterns into it's own file * Update typescript file generator * replace with auto-generated ATL patterns * Added sort function for vector * WIP: auto generate python and renpy patterns Something is still causing the tokenizer to misalign when using the generated patterns. I'll try to fix it tomorrow * Switch last token to be the important one This is to match the behaviour of textmate, where the top most token is the last token added * Added missing token cases * Update tokenizer to match textmate behaviour on range patterns This allows the end pattern of a range to extend based on the content pattern matches * Move to separate functions * WIP optimizations * Fix bugs * Code cleanup and fixes * Delete all token position update code * Update pattern generator Due to the way typescript initializes const object, we can't have circular references to patterns. To fix that, we just push all external dependencies in a shared file after all other files have been loaded. * Fix some bugs in the syntax patterns Remove use of \G as javascript's regex engine doesn't support it Other fixes to make sure we can tokenize the python grammar file Change some renpy keyword to display as control flow keywords * Ignore generated files * Delete this file as it is no longer used * Fix custom color style injection * Fixed merge error * Use dataclass annotation * Don't display unmatched tokens to the end user Will add a special rule in our development area for displaying these in red --- .prettierignore | 5 +- examples/tokenizer_tests.rpy | 24 + examples/unit_test.rpy | 90 +- package.json | 4 + src/color.ts | 16 +- src/tokenizer/atl-token-patterns.g.ts | 399 +++ src/tokenizer/atl-token-patterns.ts | 399 --- src/tokenizer/common-token-patterns.ts | 581 ---- src/tokenizer/debug-decorator.ts | 316 ++- src/tokenizer/python-token-patterns.g.ts | 3169 ++++++++++++++++++++++ src/tokenizer/python-token-patterns.ts | 101 - src/tokenizer/renpy-token-patterns.g.ts | 1728 ++++++++++++ src/tokenizer/renpy-tokens.ts | 180 +- src/tokenizer/token-definitions.ts | 104 +- src/tokenizer/token-pattern-types.ts | 10 +- src/tokenizer/token-patterns.g.ts | 59 + src/tokenizer/token-patterns.ts | 953 ------- src/tokenizer/tokenizer.ts | 671 +++-- src/utilities/vector.ts | 17 + syntax-to-token-pattern.py | 601 +++- syntaxes/renpy.atl.tmLanguage.json | 333 +++ syntaxes/renpy.python.tmLanguage.json | 185 +- syntaxes/renpy.tmLanguage.json | 2388 ++++++++-------- 23 files changed, 8448 insertions(+), 3885 deletions(-) create mode 100644 examples/tokenizer_tests.rpy create mode 100644 src/tokenizer/atl-token-patterns.g.ts delete mode 100644 src/tokenizer/atl-token-patterns.ts delete mode 100644 src/tokenizer/common-token-patterns.ts create mode 100644 src/tokenizer/python-token-patterns.g.ts delete mode 100644 src/tokenizer/python-token-patterns.ts create mode 100644 src/tokenizer/renpy-token-patterns.g.ts create mode 100644 src/tokenizer/token-patterns.g.ts delete mode 100644 src/tokenizer/token-patterns.ts create mode 100644 syntaxes/renpy.atl.tmLanguage.json diff --git a/.prettierignore b/.prettierignore index fc483344..0c84c503 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,4 +3,7 @@ **/dist # Ignore all markdown files: -*.md \ No newline at end of file +*.md + +# Ignore all generated typescript files: +*.g.ts \ No newline at end of file diff --git a/examples/tokenizer_tests.rpy b/examples/tokenizer_tests.rpy new file mode 100644 index 00000000..00075132 --- /dev/null +++ b/examples/tokenizer_tests.rpy @@ -0,0 +1,24 @@ +init python hide early in Namespace: + + def sampleFunction(name, delay, position=(0,0)): + """ + This is a sample function. + """ +# test + renpy.pause(delay) + return name + + class Inventory: + """ + This is a fake inventory class. + """ + + def __init__(self): + self.items = [] + + def add(self, item): + """Add an item to the inventory.""" + self.items.append(item); + return + + \ No newline at end of file diff --git a/examples/unit_test.rpy b/examples/unit_test.rpy index c165657b..fe4a6637 100644 --- a/examples/unit_test.rpy +++ b/examples/unit_test.rpy @@ -837,7 +837,7 @@ queue sound "woof.mp3" volume 0.75 queue sound "woof.mp3" volume 1.0 - define audio.woof = "woof.mp23 + define audio.woof = "woof.mp3" # ... @@ -1853,7 +1853,7 @@ image big hello world = Text("Hello World", style="big") screen hello_world: - text "Hello, World" style "big" + text "Hello, World" style "big" at 0# Comment style my_text is text: size 40 @@ -3555,9 +3555,9 @@ #region Customizing the Keymap # see https://www.renpy.org/doc/html/keymap.html - init: - $ config.keymap['dismiss'].append('t') - $ config.keymap['dismiss'].remove('K_SPACE') + init python: + config.keymap['dismiss'].append('t') + config.keymap['dismiss'].remove('K_SPACE') config.keymap = dict( @@ -3678,59 +3678,59 @@ ) - config.pad_bindings = { - "pad_leftshoulder_press" : [ "rollback", ], - "pad_lefttrigger_pos" : [ "rollback", ], - "pad_back_press" : [ "rollback", ], + config.pad_bindings = { + "pad_leftshoulder_press" : [ "rollback", ], + "pad_lefttrigger_pos" : [ "rollback", ], + "pad_back_press" : [ "rollback", ], - "repeat_pad_leftshoulder_press" : [ "rollback", ], - "repeat_pad_lefttrigger_pos" : [ "rollback", ], - "repeat_pad_back_press" : [ "rollback", ], + "repeat_pad_leftshoulder_press" : [ "rollback", ], + "repeat_pad_lefttrigger_pos" : [ "rollback", ], + "repeat_pad_back_press" : [ "rollback", ], - "pad_guide_press" : [ "game_menu", ], - "pad_start_press" : [ "game_menu", ], + "pad_guide_press" : [ "game_menu", ], + "pad_start_press" : [ "game_menu", ], - "pad_y_press" : [ "hide_windows", ], + "pad_y_press" : [ "hide_windows", ], - "pad_rightshoulder_press" : [ "rollforward", ], - "repeat_pad_rightshoulder_press" : [ "rollforward", ], + "pad_rightshoulder_press" : [ "rollforward", ], + "repeat_pad_rightshoulder_press" : [ "rollforward", ], - "pad_righttrigger_pos" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate" ], - "pad_a_press" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate"], - "pad_b_press" : [ "button_alternate" ], + "pad_righttrigger_pos" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate" ], + "pad_a_press" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate"], + "pad_b_press" : [ "button_alternate" ], - "pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "repeat_pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "repeat_pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "repeat_pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "repeat_pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "repeat_pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "repeat_pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "repeat_pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "repeat_pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "repeat_pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "repeat_pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "repeat_pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "repeat_pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "repeat_pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "repeat_pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "repeat_pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "repeat_pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "repeat_pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "repeat_pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "repeat_pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "repeat_pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "repeat_pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - } + "repeat_pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "repeat_pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "repeat_pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + } #endregion Customizing the Keymap diff --git a/package.json b/package.json index 9e701c9e..6741b335 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,10 @@ { "scopeName": "source.renpy.python", "path": "./syntaxes/renpy.python.tmLanguage.json" + }, + { + "scopeName": "source.renpy.atl", + "path": "./syntaxes/renpy.atl.tmLanguage.json" } ], "snippets": [ diff --git a/src/color.ts b/src/color.ts index 86dcd0e9..4f21263b 100644 --- a/src/color.ts +++ b/src/color.ts @@ -1,9 +1,13 @@ // Color conversion methods for Color provider import { CancellationToken, Color, ColorInformation, ColorPresentation, DocumentColorProvider, Range, TextDocument, TextEdit } from "vscode"; +import { ValueEqualsSet } from "./utilities/hashset"; +import { tokenizeDocument } from "./tokenizer/tokenizer"; +import { LiteralTokenType } from "./tokenizer/renpy-tokens"; +import { TextMateRule, injectCustomTextmateTokens } from "./decorator"; +/*import { tokenizeDocument } from "./tokenizer/tokenizer"; import { injectCustomTextmateTokens, TextMateRule } from "./decorator"; import { LiteralTokenType } from "./tokenizer/renpy-tokens"; -import { tokenizeDocument } from "./tokenizer/tokenizer"; -import { ValueEqualsSet } from "./utilities/hashset"; +import { ValueEqualsSet } from "./utilities/hashset";*/ export class RenpyColorProvider implements DocumentColorProvider { public provideDocumentColors(document: TextDocument, token: CancellationToken): Thenable { @@ -112,15 +116,15 @@ export function getColorPresentations(color: Color, document: TextDocument, rang } export function injectCustomColorStyles(document: TextDocument) { + // Disabled until filter is added to the tree class const documentTokens = tokenizeDocument(document); - // TODO: Should probably make sure this constant is actually part of a tag, but for now this is fine. - const colorTags = documentTokens.filter((x) => x.tokenType === LiteralTokenType.Color); + const colorTags = documentTokens.filter((x) => x.token?.tokenType === LiteralTokenType.Color); const colorRules = new ValueEqualsSet(); // Build the new rules for this file - colorTags.forEach((color) => { - const lowerColor = document.getText(color.getRange()).toLowerCase(); + colorTags.forEach((colorNode) => { + const lowerColor = document.getText(colorNode.token?.getVSCodeRange()).toLowerCase(); const newRule = new TextMateRule(`renpy.meta.color.${lowerColor}`, { foreground: lowerColor }); colorRules.add(newRule); }); diff --git a/src/tokenizer/atl-token-patterns.g.ts b/src/tokenizer/atl-token-patterns.g.ts new file mode 100644 index 00000000..acbad446 --- /dev/null +++ b/src/tokenizer/atl-token-patterns.g.ts @@ -0,0 +1,399 @@ +/* eslint-disable no-useless-escape */ +/* eslint-disable no-useless-backreference */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +// THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR +// DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. +// ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. +// Last generated: 01/06/2023 14:57:48 (UTC+0) + +import { KeywordTokenType, EntityTokenType, MetaTokenType, CharacterTokenType } from "./renpy-tokens"; +import { TokenPattern } from "./token-pattern-types"; + +export const atl: TokenPattern = { + // https://www.renpy.org/doc/html/atl.html#atl-syntax-and-semantics + patterns: [ + ] +}; + +export const atlBuildInProperties: TokenPattern = { + // https://www.renpy.org/doc/html/atl.html#list-of-transform-properties + patterns: [ + { + debugName: "atlBuildInProperties.patterns![0]", + + // Special manipulation keywords + match: /\b(? { + const token = node.token; + if (!token) { + return; + } - tokens.forEach((token) => { - const range = token.getRange(); + const range = token.getVSCodeRange(); const content = activeEditor?.document.getText(range); const decoration: DecorationOptions = { @@ -290,15 +303,16 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case KeywordTokenType.Fadeout: case KeywordTokenType.Set: // Renpy sub expression keywords case KeywordTokenType.Expression: - case KeywordTokenType.At: - case KeywordTokenType.As: - case KeywordTokenType.With: - case KeywordTokenType.OnLayer: - case KeywordTokenType.ZOrder: - case KeywordTokenType.Behind: case KeywordTokenType.Animation: case KeywordTokenType.From: + case KeywordTokenType.Time: + case KeywordTokenType.Repeat: case KeywordTokenType.DollarSign: + case KeywordTokenType.Sensitive: + case KeywordTokenType.Text: + case KeywordTokenType.Other: + case KeywordTokenType.OtherPython: + case KeywordTokenType.OtherAudio: case KeywordTokenType.Warp: // ATL keywords case KeywordTokenType.Circles: case KeywordTokenType.Clockwise: @@ -306,13 +320,20 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case KeywordTokenType.Event: case KeywordTokenType.On: case KeywordTokenType.Function: + case KeywordTokenType.Import: // Python keywords + case KeywordTokenType.Class: + case KeywordTokenType.Metaclass: + case KeywordTokenType.Lambda: + case KeywordTokenType.Async: + case KeywordTokenType.Def: + case KeywordTokenType.Global: + case KeywordTokenType.Nonlocal: case LiteralTokenType.Boolean: // Language keywords case OperatorTokenType.And: case OperatorTokenType.Or: case OperatorTokenType.Not: case OperatorTokenType.Is: case OperatorTokenType.IsNot: - case OperatorTokenType.In: case OperatorTokenType.NotIn: keywords.push(decoration); break; @@ -320,7 +341,8 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case KeywordTokenType.If: // Conditional control flow keywords case KeywordTokenType.Elif: case KeywordTokenType.Else: - case KeywordTokenType.For: // Control flow keywords + case KeywordTokenType.In: // Control flow keywords + case KeywordTokenType.For: case KeywordTokenType.While: case KeywordTokenType.Pass: case KeywordTokenType.Return: @@ -330,11 +352,19 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case KeywordTokenType.Parallel: case KeywordTokenType.Block: case KeywordTokenType.Choice: + case KeywordTokenType.At: // Renpy control flow keywords + case KeywordTokenType.As: + case KeywordTokenType.With: + case KeywordTokenType.Onlayer: + case KeywordTokenType.Zorder: + case KeywordTokenType.Behind: controlKeywords.push(decoration); break; - case EntityTokenType.Class: // Types - case EntityTokenType.Namespace: + case EntityTokenType.ClassName: // Types + case EntityTokenType.InheritedClassName: + case EntityTokenType.TypeName: + case EntityTokenType.NamespaceName: types.push(decoration); break; @@ -346,42 +376,58 @@ ${(decoration.hoverMessage as MarkdownString).value}`); // Variables case EntityTokenType.VariableName: + case EntityTokenType.ImageName: + case EntityTokenType.TextName: + case EntityTokenType.AudioName: + case EntityTokenType.CharacterName: case EntityTokenType.PropertyName: variables.push(decoration); break; // Other entities - case EntityTokenType.Tag: + case EntityTokenType.TagName: otherEntities.push(decoration); break; // Comments case MetaTokenType.Comment: case MetaTokenType.CommentCodeTag: + case MetaTokenType.CommentRegionTag: + case MetaTokenType.TypehintComment: + case MetaTokenType.TypehintDirective: + case MetaTokenType.TypehintIgnore: + case MetaTokenType.TypehintType: + case MetaTokenType.TypehintPunctuation: + case MetaTokenType.TypehintVariable: + case MetaTokenType.Docstring: comments.push(decoration); break; + case MetaTokenType.StringBegin: + case MetaTokenType.StringEnd: case MetaTokenType.CodeBlock: case MetaTokenType.PythonLine: case MetaTokenType.PythonBlock: case MetaTokenType.Arguments: case MetaTokenType.EmptyString: + case MetaTokenType.StringTag: case MetaTokenType.TagBlock: + case MetaTokenType.TaggedString: case MetaTokenType.Placeholder: case MetaTokenType.MenuStatement: case MetaTokenType.MenuBlock: case MetaTokenType.MenuOption: case MetaTokenType.MenuOptionBlock: + case MetaTokenType.BehindStatement: + case MetaTokenType.OnlayerStatement: case MetaTokenType.CameraStatement: case MetaTokenType.SceneStatement: case MetaTokenType.ShowStatement: case MetaTokenType.ImageStatement: - case MetaTokenType.NarratorSayStatement: - case MetaTokenType.SayStatement: - case MetaTokenType.CharacterNameString: case MetaTokenType.CallStatement: case MetaTokenType.JumpStatement: case MetaTokenType.PlayAudioStatement: + case MetaTokenType.QueueAudioStatement: case MetaTokenType.StopAudioStatement: case MetaTokenType.LabelStatement: case MetaTokenType.LabelCall: @@ -389,6 +435,23 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case MetaTokenType.AtStatement: case MetaTokenType.AsStatement: case MetaTokenType.WithStatement: + case MetaTokenType.ScreenStatement: + case MetaTokenType.ScreenSensitive: + case MetaTokenType.ScreenFrame: + case MetaTokenType.ScreenWindow: + case MetaTokenType.ScreenText: + case MetaTokenType.ScreenBlock: + case MetaTokenType.NarratorSayStatement: + case MetaTokenType.SayStatement: + case MetaTokenType.CharacterNameString: + case MetaTokenType.SayNarrator: + case MetaTokenType.SayCharacter: + case MetaTokenType.AtParameters: + case MetaTokenType.AsParameters: + case MetaTokenType.BehindParameters: + case MetaTokenType.OnlayerParameters: + case MetaTokenType.WithParameters: + case MetaTokenType.ZorderParameters: case MetaTokenType.ATLBlock: case MetaTokenType.ATLChoiceBlock: case MetaTokenType.ATLContains: @@ -397,6 +460,47 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case MetaTokenType.ATLFunction: case MetaTokenType.ATLWarper: case MetaTokenType.ATLOn: + case MetaTokenType.MemberAccess: + case MetaTokenType.ItemAccess: + case MetaTokenType.IndexedName: + case MetaTokenType.Attribute: + case MetaTokenType.ClassDefinition: + case MetaTokenType.ClassInheritance: + case MetaTokenType.FunctionDefinition: + case MetaTokenType.LambdaFunction: + case MetaTokenType.FunctionLambdaParameters: + case MetaTokenType.FunctionParameters: + case MetaTokenType.FunctionDecorator: + case MetaTokenType.FunctionCall: + case MetaTokenType.FunctionCallGeneric: + case MetaTokenType.Fstring: + case MetaTokenType.ControlFlowKeyword: + case MetaTokenType.LogicalOperatorKeyword: + case MetaTokenType.Operator: + case MetaTokenType.ArithmeticOperator: + case MetaTokenType.BitwiseOperatorKeyword: + case MetaTokenType.ComparisonOperatorKeyword: + case MetaTokenType.ConstantLiteral: + case MetaTokenType.ConstantNumeric: + case MetaTokenType.ConstantCaps: + case MetaTokenType.BuiltinExceptionType: + case MetaTokenType.BuiltinType: + case MetaTokenType.MagicVariable: + case MetaTokenType.EscapeSequence: + case MetaTokenType.FormatPercent: + case MetaTokenType.FormatBrace: + case MetaTokenType.StringStorageType: + case MetaTokenType.FormatStorageType: + case MetaTokenType.ImaginaryNumberStorageType: + case MetaTokenType.NumberStorageType: + case MetaTokenType.ClassStorageType: + case MetaTokenType.CommentBegin: + case MetaTokenType.CommentEnd: + case MetaTokenType.Backreference: + case MetaTokenType.BackreferenceNamed: + case MetaTokenType.CharacterSet: + case MetaTokenType.Named: + case MetaTokenType.ModifierFlagStorageType: otherMeta.push(decoration); break; @@ -439,7 +543,7 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case OperatorTokenType.BitwiseNot: case OperatorTokenType.BitwiseLeftShift: case OperatorTokenType.BitwiseRightShift: - case OperatorTokenType.Assign: // Assignment operators + case OperatorTokenType.Assignment: // Assignment operators case OperatorTokenType.PlusAssign: case OperatorTokenType.MinusAssign: case OperatorTokenType.MultiplyAssign: @@ -461,13 +565,17 @@ ${(decoration.hoverMessage as MarkdownString).value}`); operators.push(decoration); break; - case CharacterTokenType.WhiteSpace: + case CharacterTokenType.Whitespace: case CharacterTokenType.NewLine: case CharacterTokenType.Period: case CharacterTokenType.Colon: case CharacterTokenType.Semicolon: case CharacterTokenType.Comma: case CharacterTokenType.Hashtag: + case CharacterTokenType.Caret: + case CharacterTokenType.DollarSymbol: + case CharacterTokenType.AtSymbol: + case CharacterTokenType.EqualsSymbol: case CharacterTokenType.Quote: case CharacterTokenType.DoubleQuote: case CharacterTokenType.BackQuote: @@ -499,6 +607,11 @@ ${(decoration.hoverMessage as MarkdownString).value}`); case MetaTokenType.Invalid: errors.push(decoration); break; + + case MetaTokenType.Deprecated: + deprecated.push(decoration); + break; + default: throw new Error(`Unhandled token case: ${tokenTypeToStringMap[token.tokenType]}(id: ${token.tokenType})`); } @@ -527,6 +640,7 @@ ${(decoration.hoverMessage as MarkdownString).value}`); activeEditor.setDecorations(escCharacterDecorationType, escCharacters); activeEditor.setDecorations(errorDecorationType, errors); + activeEditor.setDecorations(deprecatedDecorationType, deprecated); } function triggerUpdateDecorations(throttle = false) { @@ -557,6 +671,7 @@ const tokenTypeDefinitions: EnumToString = { Early: { name: "Early", value: KeywordTokenType.Early }, Define: { name: "Define", value: KeywordTokenType.Define }, Default: { name: "Default", value: KeywordTokenType.Default }, + Label: { name: "Label", value: KeywordTokenType.Label }, Menu: { name: "Menu", value: KeywordTokenType.Menu }, Pause: { name: "Pause", value: KeywordTokenType.Pause }, @@ -585,19 +700,25 @@ const tokenTypeDefinitions: EnumToString = { At: { name: "At", value: KeywordTokenType.At }, As: { name: "As", value: KeywordTokenType.As }, With: { name: "With", value: KeywordTokenType.With }, - OnLayer: { name: "OnLayer", value: KeywordTokenType.OnLayer }, - ZOrder: { name: "ZOrder", value: KeywordTokenType.ZOrder }, + Onlayer: { name: "Onlayer", value: KeywordTokenType.Onlayer }, + Zorder: { name: "Zorder", value: KeywordTokenType.Zorder }, Behind: { name: "Behind", value: KeywordTokenType.Behind }, Animation: { name: "Animation", value: KeywordTokenType.Animation }, From: { name: "From", value: KeywordTokenType.From }, Time: { name: "Time", value: KeywordTokenType.Time }, Repeat: { name: "Repeat", value: KeywordTokenType.Repeat }, DollarSign: { name: "DollarSign", value: KeywordTokenType.DollarSign }, + Sensitive: { name: "Sensitive", value: KeywordTokenType.Sensitive }, + Text: { name: "Text", value: KeywordTokenType.Text }, + Other: { name: "Other", value: KeywordTokenType.Other }, + OtherPython: { name: "OtherPython", value: KeywordTokenType.OtherPython }, + OtherAudio: { name: "OtherAudio", value: KeywordTokenType.OtherAudio }, If: { name: "If", value: KeywordTokenType.If }, Elif: { name: "Elif", value: KeywordTokenType.Elif }, Else: { name: "Else", value: KeywordTokenType.Else }, + In: { name: "In", value: KeywordTokenType.In }, For: { name: "For", value: KeywordTokenType.For }, While: { name: "While", value: KeywordTokenType.While }, Pass: { name: "Pass", value: KeywordTokenType.Pass }, @@ -617,12 +738,28 @@ const tokenTypeDefinitions: EnumToString = { On: { name: "On", value: KeywordTokenType.On }, Function: { name: "Function", value: KeywordTokenType.Function }, - Class: { name: "Class", value: EntityTokenType.Class }, - Namespace: { name: "Namespace", value: EntityTokenType.Namespace }, + Import: { name: "Import", value: KeywordTokenType.Import }, + Class: { name: "Class", value: KeywordTokenType.Class }, + Metaclass: { name: "Metaclass", value: KeywordTokenType.Metaclass }, + Lambda: { name: "Lambda", value: KeywordTokenType.Lambda }, + Async: { name: "Async", value: KeywordTokenType.Async }, + Def: { name: "Def", value: KeywordTokenType.Def }, + Global: { name: "Global", value: KeywordTokenType.Global }, + Nonlocal: { name: "Nonlocal", value: KeywordTokenType.Nonlocal }, + + ClassName: { name: "ClassName", value: EntityTokenType.ClassName }, + InheritedClassName: { name: "InheritedClassName", value: EntityTokenType.InheritedClassName }, + TypeName: { name: "TypeName", value: EntityTokenType.TypeName }, + NamespaceName: { name: "NamespaceName", value: EntityTokenType.NamespaceName }, FunctionName: { name: "FunctionName", value: EntityTokenType.FunctionName }, - Tag: { name: "Tag", value: EntityTokenType.Tag }, + TagName: { name: "TagName", value: EntityTokenType.TagName }, VariableName: { name: "VariableName", value: EntityTokenType.VariableName }, + ImageName: { name: "ImageName", value: EntityTokenType.ImageName }, + TextName: { name: "TextName", value: EntityTokenType.TextName }, + AudioName: { name: "AudioName", value: EntityTokenType.AudioName }, + CharacterName: { name: "CharacterName", value: EntityTokenType.CharacterName }, + EventName: { name: "EventName", value: EntityTokenType.EventName }, PropertyName: { name: "PropertyName", value: EntityTokenType.PropertyName }, @@ -651,7 +788,7 @@ const tokenTypeDefinitions: EnumToString = { BitwiseLeftShift: { name: "BitwiseLeftShift", value: OperatorTokenType.BitwiseLeftShift }, BitwiseRightShift: { name: "BitwiseRightShift", value: OperatorTokenType.BitwiseRightShift }, - Assign: { name: "Assign", value: OperatorTokenType.Assign }, + Assignment: { name: "Assignment", value: OperatorTokenType.Assignment }, PlusAssign: { name: "PlusAssign", value: OperatorTokenType.PlusAssign }, MinusAssign: { name: "MinusAssign", value: OperatorTokenType.MinusAssign }, MultiplyAssign: { name: "MultiplyAssign", value: OperatorTokenType.MultiplyAssign }, @@ -679,9 +816,21 @@ const tokenTypeDefinitions: EnumToString = { Is: { name: "Is", value: OperatorTokenType.Is }, IsNot: { name: "IsNot", value: OperatorTokenType.IsNot }, - In: { name: "In", value: OperatorTokenType.In }, NotIn: { name: "NotIn", value: OperatorTokenType.NotIn }, + Unpacking: { name: "Unpacking", value: OperatorTokenType.Unpacking }, + PositionalParameter: { name: "PositionalParameter", value: OperatorTokenType.PositionalParameter }, + + Quantifier: { name: "Quantifier", value: OperatorTokenType.Quantifier }, + Disjunction: { name: "Disjunction", value: OperatorTokenType.Disjunction }, + Negation: { name: "Negation", value: OperatorTokenType.Negation }, + Lookahead: { name: "Lookahead", value: OperatorTokenType.Lookahead }, + LookaheadNegative: { name: "LookaheadNegative", value: OperatorTokenType.LookaheadNegative }, + Lookbehind: { name: "Lookbehind", value: OperatorTokenType.Lookbehind }, + LookbehindNegative: { name: "LookbehindNegative", value: OperatorTokenType.LookbehindNegative }, + Conditional: { name: "Conditional", value: OperatorTokenType.Conditional }, + ConditionalNegative: { name: "ConditionalNegative", value: OperatorTokenType.ConditionalNegative }, + Unknown: { name: "Unknown", value: CharacterTokenType.Unknown }, OpenParentheses: { name: "OpenParentheses", value: CharacterTokenType.OpenParentheses }, @@ -693,7 +842,7 @@ const tokenTypeDefinitions: EnumToString = { OpenSquareBracket: { name: "OpenSquareBracket", value: CharacterTokenType.OpenSquareBracket }, CloseSquareBracket: { name: "CloseSquareBracket", value: CharacterTokenType.CloseSquareBracket }, - WhiteSpace: { name: "WhiteSpace", value: CharacterTokenType.WhiteSpace }, + Whitespace: { name: "Whitespace", value: CharacterTokenType.Whitespace }, NewLine: { name: "NewLine", value: CharacterTokenType.NewLine }, Period: { name: "Period", value: CharacterTokenType.Period }, @@ -701,6 +850,10 @@ const tokenTypeDefinitions: EnumToString = { Semicolon: { name: "Semicolon", value: CharacterTokenType.Semicolon }, Comma: { name: "Comma", value: CharacterTokenType.Comma }, Hashtag: { name: "Hashtag", value: CharacterTokenType.Hashtag }, + Caret: { name: "Caret", value: CharacterTokenType.Caret }, + DollarSymbol: { name: "DollarSymbol", value: CharacterTokenType.DollarSymbol }, + AtSymbol: { name: "AtSymbol", value: CharacterTokenType.AtSymbol }, + EqualsSymbol: { name: "EqualsSymbol", value: CharacterTokenType.EqualsSymbol }, Quote: { name: "Quote", value: CharacterTokenType.Quote }, DoubleQuote: { name: "DoubleQuote", value: CharacterTokenType.DoubleQuote }, @@ -719,16 +872,31 @@ const tokenTypeDefinitions: EnumToString = { EscOpenBracket: { name: "EscOpenBracket", value: EscapedCharacterTokenType.EscOpenBracket }, Invalid: { name: "Invalid", value: MetaTokenType.Invalid }, + Deprecated: { name: "Deprecated", value: MetaTokenType.Deprecated }, + Comment: { name: "Comment", value: MetaTokenType.Comment }, - CodeBlock: { name: "CodeBlock", value: MetaTokenType.CodeBlock }, + CommentCodeTag: { name: "CommentCodeTag", value: MetaTokenType.CommentCodeTag }, + CommentRegionTag: { name: "CommentRegionTag", value: MetaTokenType.CommentRegionTag }, + TypehintComment: { name: "TypehintComment", value: MetaTokenType.TypehintComment }, + TypehintDirective: { name: "TypehintDirective", value: MetaTokenType.TypehintDirective }, + TypehintIgnore: { name: "TypehintIgnore", value: MetaTokenType.TypehintIgnore }, + TypehintType: { name: "TypehintType", value: MetaTokenType.TypehintType }, + TypehintPunctuation: { name: "TypehintPunctuation", value: MetaTokenType.TypehintPunctuation }, + TypehintVariable: { name: "TypehintVariable", value: MetaTokenType.TypehintVariable }, + Docstring: { name: "Docstring", value: MetaTokenType.Docstring }, + + StringBegin: { name: "StringBegin", value: MetaTokenType.StringBegin }, + StringEnd: { name: "StringEnd", value: MetaTokenType.StringEnd }, + CodeBlock: { name: "CodeBlock", value: MetaTokenType.CodeBlock }, PythonLine: { name: "PythonLine", value: MetaTokenType.PythonLine }, PythonBlock: { name: "PythonBlock", value: MetaTokenType.PythonBlock }, Arguments: { name: "Arguments", value: MetaTokenType.Arguments }, - CommentCodeTag: { name: "CommentCodeTag", value: MetaTokenType.CommentCodeTag }, EmptyString: { name: "EmptyString", value: MetaTokenType.EmptyString }, + StringTag: { name: "StringTag", value: MetaTokenType.StringTag }, TagBlock: { name: "TagBlock", value: MetaTokenType.TagBlock }, + TaggedString: { name: "TaggedString", value: MetaTokenType.TaggedString }, Placeholder: { name: "Placeholder", value: MetaTokenType.Placeholder }, MenuStatement: { name: "MenuStatement", value: MetaTokenType.MenuStatement }, @@ -736,28 +904,48 @@ const tokenTypeDefinitions: EnumToString = { MenuOption: { name: "MenuOption", value: MetaTokenType.MenuOption }, MenuOptionBlock: { name: "MenuOptionBlock", value: MetaTokenType.MenuOptionBlock }, + LabelStatement: { name: "LabelStatement", value: MetaTokenType.LabelStatement }, + LabelCall: { name: "LabelCall", value: MetaTokenType.LabelCall }, + LabelAccess: { name: "LabelAccess", value: MetaTokenType.LabelAccess }, + + BehindStatement: { name: "BehindStatement", value: MetaTokenType.BehindStatement }, + OnlayerStatement: { name: "OnlayerStatement", value: MetaTokenType.OnlayerStatement }, + ZorderStatement: { name: "ZorderStatement", value: MetaTokenType.ZorderStatement }, + AtStatement: { name: "AtStatement", value: MetaTokenType.AtStatement }, + AsStatement: { name: "AsStatement", value: MetaTokenType.AsStatement }, + WithStatement: { name: "WithStatement", value: MetaTokenType.WithStatement }, + + ImageStatement: { name: "ImageStatement", value: MetaTokenType.ImageStatement }, CameraStatement: { name: "CameraStatement", value: MetaTokenType.CameraStatement }, SceneStatement: { name: "SceneStatement", value: MetaTokenType.SceneStatement }, ShowStatement: { name: "ShowStatement", value: MetaTokenType.ShowStatement }, - ImageStatement: { name: "ImageStatement", value: MetaTokenType.ImageStatement }, - NarratorSayStatement: { name: "NarratorSayStatement", value: MetaTokenType.NarratorSayStatement }, - SayStatement: { name: "SayStatement", value: MetaTokenType.SayStatement }, - CharacterNameString: { name: "CharacterNameString", value: MetaTokenType.CharacterNameString }, - - CallStatement: { name: "CallStatement", value: MetaTokenType.CallStatement }, JumpStatement: { name: "JumpStatement", value: MetaTokenType.JumpStatement }, + CallStatement: { name: "CallStatement", value: MetaTokenType.CallStatement }, PlayAudioStatement: { name: "PlayAudioStatement", value: MetaTokenType.PlayAudioStatement }, + QueueAudioStatement: { name: "QueueAudioStatement", value: MetaTokenType.QueueAudioStatement }, StopAudioStatement: { name: "StopAudioStatement", value: MetaTokenType.StopAudioStatement }, - LabelStatement: { name: "LabelStatement", value: MetaTokenType.LabelStatement }, - LabelCall: { name: "LabelCall", value: MetaTokenType.LabelCall }, - LabelAccess: { name: "LabelAccess", value: MetaTokenType.LabelAccess }, + ScreenStatement: { name: "ScreenStatement", value: MetaTokenType.ScreenStatement }, + ScreenSensitive: { name: "ScreenSensitive", value: MetaTokenType.ScreenSensitive }, + ScreenFrame: { name: "ScreenFrame", value: MetaTokenType.ScreenFrame }, + ScreenWindow: { name: "ScreenWindow", value: MetaTokenType.ScreenWindow }, + ScreenText: { name: "ScreenText", value: MetaTokenType.ScreenText }, + ScreenBlock: { name: "ScreenBlock", value: MetaTokenType.ScreenBlock }, - AtStatement: { name: "AtStatement", value: MetaTokenType.AtStatement }, - AsStatement: { name: "AsStatement", value: MetaTokenType.AsStatement }, - WithStatement: { name: "WithStatement", value: MetaTokenType.WithStatement }, + NarratorSayStatement: { name: "NarratorSayStatement", value: MetaTokenType.NarratorSayStatement }, + SayStatement: { name: "SayStatement", value: MetaTokenType.SayStatement }, + CharacterNameString: { name: "CharacterNameString", value: MetaTokenType.CharacterNameString }, + SayNarrator: { name: "SayNarrator", value: MetaTokenType.SayNarrator }, + SayCharacter: { name: "SayCharacter", value: MetaTokenType.SayCharacter }, + + AtParameters: { name: "AtParameters", value: MetaTokenType.AtParameters }, + AsParameters: { name: "AsParameters", value: MetaTokenType.AsParameters }, + BehindParameters: { name: "BehindParameters", value: MetaTokenType.BehindParameters }, + OnlayerParameters: { name: "OnlayerParameters", value: MetaTokenType.OnlayerParameters }, + WithParameters: { name: "WithParameters", value: MetaTokenType.WithParameters }, + ZorderParameters: { name: "ZorderParameters", value: MetaTokenType.ZorderParameters }, ATLBlock: { name: "ATLBlock", value: MetaTokenType.ATLBlock }, ATLChoiceBlock: { name: "ATLChoiceBlock", value: MetaTokenType.ATLChoiceBlock }, @@ -767,6 +955,48 @@ const tokenTypeDefinitions: EnumToString = { ATLFunction: { name: "ATLFunction", value: MetaTokenType.ATLFunction }, ATLWarper: { name: "ATLWarper", value: MetaTokenType.ATLWarper }, ATLOn: { name: "ATLOn", value: MetaTokenType.ATLOn }, + + MemberAccess: { name: "MemberAccess", value: MetaTokenType.MemberAccess }, + ItemAccess: { name: "ItemAccess", value: MetaTokenType.ItemAccess }, + IndexedName: { name: "IndexedName", value: MetaTokenType.IndexedName }, + Attribute: { name: "Attribute", value: MetaTokenType.Attribute }, + ClassDefinition: { name: "ClassDefinition", value: MetaTokenType.ClassDefinition }, + ClassInheritance: { name: "ClassInheritance", value: MetaTokenType.ClassInheritance }, + FunctionDefinition: { name: "FunctionDefinition", value: MetaTokenType.FunctionDefinition }, + LambdaFunction: { name: "LambdaFunction", value: MetaTokenType.LambdaFunction }, + FunctionLambdaParameters: { name: "FunctionLambdaParameters", value: MetaTokenType.FunctionLambdaParameters }, + FunctionParameters: { name: "FunctionParameters", value: MetaTokenType.FunctionParameters }, + FunctionDecorator: { name: "FunctionDecorator", value: MetaTokenType.FunctionDecorator }, + FunctionCall: { name: "FunctionCall", value: MetaTokenType.FunctionCall }, + FunctionCallGeneric: { name: "FunctionCallGeneric", value: MetaTokenType.FunctionCallGeneric }, + Fstring: { name: "Fstring", value: MetaTokenType.Fstring }, + ControlFlowKeyword: { name: "ControlFlowKeyword", value: MetaTokenType.ControlFlowKeyword }, + LogicalOperatorKeyword: { name: "LogicalOperatorKeyword", value: MetaTokenType.LogicalOperatorKeyword }, + Operator: { name: "Operator", value: MetaTokenType.Operator }, + ArithmeticOperator: { name: "ArithmeticOperator", value: MetaTokenType.ArithmeticOperator }, + BitwiseOperatorKeyword: { name: "BitwiseOperatorKeyword", value: MetaTokenType.BitwiseOperatorKeyword }, + ComparisonOperatorKeyword: { name: "ComparisonOperatorKeyword", value: MetaTokenType.ComparisonOperatorKeyword }, + ConstantLiteral: { name: "ConstantLiteral", value: MetaTokenType.ConstantLiteral }, + ConstantNumeric: { name: "ConstantNumeric", value: MetaTokenType.ConstantNumeric }, + ConstantCaps: { name: "ConstantCaps", value: MetaTokenType.ConstantCaps }, + BuiltinExceptionType: { name: "BuiltinExceptionType", value: MetaTokenType.BuiltinExceptionType }, + BuiltinType: { name: "BuiltinType", value: MetaTokenType.BuiltinType }, + MagicVariable: { name: "MagicVariable", value: MetaTokenType.MagicVariable }, + EscapeSequence: { name: "EscapeSequence", value: MetaTokenType.EscapeSequence }, + FormatPercent: { name: "FormatPercent", value: MetaTokenType.FormatPercent }, + FormatBrace: { name: "FormatBrace", value: MetaTokenType.FormatBrace }, + StringStorageType: { name: "StringStorageType", value: MetaTokenType.StringStorageType }, + FormatStorageType: { name: "FormatStorageType", value: MetaTokenType.FormatStorageType }, + ImaginaryNumberStorageType: { name: "ImaginaryNumberStorageType", value: MetaTokenType.ImaginaryNumberStorageType }, + NumberStorageType: { name: "NumberStorageType", value: MetaTokenType.NumberStorageType }, + ClassStorageType: { name: "ClassStorageType", value: MetaTokenType.ClassStorageType }, + CommentBegin: { name: "CommentBegin", value: MetaTokenType.CommentBegin }, + CommentEnd: { name: "CommentEnd", value: MetaTokenType.CommentEnd }, + Backreference: { name: "Backreference", value: MetaTokenType.Backreference }, + BackreferenceNamed: { name: "BackreferenceNamed", value: MetaTokenType.BackreferenceNamed }, + CharacterSet: { name: "CharacterSet", value: MetaTokenType.CharacterSet }, + Named: { name: "Named", value: MetaTokenType.Named }, + ModifierFlagStorageType: { name: "ModifierFlagStorageType", value: MetaTokenType.ModifierFlagStorageType }, }; export const tokenTypeToStringMap = Object.fromEntries(Object.entries(tokenTypeDefinitions).map(([, v]) => [v.value, v.name])); diff --git a/src/tokenizer/python-token-patterns.g.ts b/src/tokenizer/python-token-patterns.g.ts new file mode 100644 index 00000000..71dac1ee --- /dev/null +++ b/src/tokenizer/python-token-patterns.g.ts @@ -0,0 +1,3169 @@ +/* eslint-disable no-useless-escape */ +/* eslint-disable no-useless-backreference */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +// THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR +// DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. +// ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. +// Last generated: 01/06/2023 14:57:48 (UTC+0) + +import { MetaTokenType, KeywordTokenType, EntityTokenType, CharacterTokenType, OperatorTokenType, LiteralTokenType } from "./renpy-tokens"; +import { TokenPattern } from "./token-pattern-types"; + +export const python: TokenPattern = { + patterns: [ + ] +}; + +export const impossible: TokenPattern = { + debugName: "impossible", + + // This is a special rule that should be used where no match is desired. It is not a good idea to match something like '1{0}' because in some cases that can result in infinite loops in token generation. So the rule instead matches and impossible expression to allow a match to fail and move to the next token. + match: /$.^/gm, +}; + +export const statement: TokenPattern = { + patterns: [ + ] +}; + +export const semicolon: TokenPattern = { + patterns: [ + { + debugName: "semicolon.patterns![0]", + + token: MetaTokenType.Deprecated, /*invalid.deprecated.semicolon.python*/ + match: /\;$/gm, + }, + ] +}; + +export const comments: TokenPattern = { + patterns: [ + { + debugName: "comments.patterns![0]", + + token: MetaTokenType.Comment, /*comment.line.number-sign.renpy*/ + match: /^[ \t]*(#[ \t]*(?:end)?region)\b.*$/dgm, + captures: { + 1: { token: MetaTokenType.CommentRegionTag, /*punctuation.definition.tag.region*/ }, + }, + }, + { + debugName: "comments.patterns![1]", + + token: MetaTokenType.Comment, /*comment.line.number-sign.python*/ + contentToken: MetaTokenType.TypehintComment, /*meta.typehint.comment.python*/ + begin: /(?:\#\s*(type:)\s*(?!$|\#))/dgm, + beginCaptures: { + 0: { token: MetaTokenType.TypehintComment, /*meta.typehint.comment.python*/ }, + 1: { token: MetaTokenType.TypehintDirective, /*comment.typehint.directive.notation.python*/ }, + }, + end: /(?:$|(?=\#))/gm, + patterns: [ + { + debugName: "comments.patterns![1].patterns![0]", + + token: MetaTokenType.TypehintIgnore, /*comment.typehint.ignore.notation.python*/ + match: /ignore(?=\s*(?:$|\#))/gm, + }, + { + debugName: "comments.patterns![1].patterns![1]", + + token: MetaTokenType.TypehintType, /*comment.typehint.type.notation.python*/ + match: /(?))/g, + }, + { + debugName: "comments.patterns![1].patterns![3]", + + token: MetaTokenType.TypehintVariable, /*comment.typehint.variable.notation.python*/ + match: /([a-zA-Z_]\w*)/g, + }, + ] + }, + ] +}; + +export const docstringStatement: TokenPattern = { + debugName: "docstringStatement", + + // the string either terminates correctly or by the beginning of a new line (this is for single line docstrings that aren't terminated) AND it's not followed by another docstring + begin: /^(?=\s*[rR]?(\'\'\'|\"\"\"|\'|\"))/gm, + end: /((?<=\1)|^)(?!\s*[rR]?(\'\'\'|\"\"\"|\'|\"))/gm, + patterns: [ + ] +}; + +export const docstring: TokenPattern = { + patterns: [ + { + debugName: "docstring.patterns![0]", + + token: MetaTokenType.Docstring, /*string.quoted.docstring.multi.python*/ + begin: /(\'\'\'|\"\"\")/dg, + beginCaptures: { + 1: { token: MetaTokenType.StringBegin, /*punctuation.definition.string.begin.python*/ }, + }, + end: /(\1)/dg, + endCaptures: { + 1: { token: MetaTokenType.StringEnd, /*punctuation.definition.string.end.python*/ }, + }, + patterns: [ + ] + }, + { + debugName: "docstring.patterns![1]", + + token: MetaTokenType.Docstring, /*string.quoted.docstring.raw.multi.python*/ + begin: /([rR])(\'\'\'|\"\"\")/dg, + beginCaptures: { + 1: { token: MetaTokenType.StringStorageType, /*storage.type.string.python*/ }, + 2: { token: MetaTokenType.StringBegin, /*punctuation.definition.string.begin.python*/ }, + }, + end: /(\2)/dg, + endCaptures: { + 1: { token: MetaTokenType.StringEnd, /*punctuation.definition.string.end.python*/ }, + }, + patterns: [ + ] + }, + { + debugName: "docstring.patterns![2]", + + token: MetaTokenType.Docstring, /*string.quoted.docstring.single.python*/ + begin: /(\'|\")/dg, + beginCaptures: { + 1: { token: MetaTokenType.StringBegin, /*punctuation.definition.string.begin.python*/ }, + }, + end: /(\1)|(\n)/dg, + endCaptures: { + 1: { token: MetaTokenType.StringEnd, /*punctuation.definition.string.end.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + ] + }, + { + debugName: "docstring.patterns![3]", + + token: MetaTokenType.Docstring, /*string.quoted.docstring.raw.single.python*/ + begin: /([rR])(\'|\")/dg, + beginCaptures: { + 1: { token: MetaTokenType.StringStorageType, /*storage.type.string.python*/ }, + 2: { token: MetaTokenType.StringBegin, /*punctuation.definition.string.begin.python*/ }, + }, + end: /(\2)|(\n)/dg, + endCaptures: { + 1: { token: MetaTokenType.StringEnd, /*punctuation.definition.string.end.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [] + }] +}; + +export const docstringGutsUnicode: TokenPattern = { + patterns: [ + ] +}; + +export const docstringPrompt: TokenPattern = { + debugName: "docstringPrompt", + + match: /(?:\s*((?:>>>|\.\.\.)\s)(?=\s*\S))/dg, + captures: { + 1: { token: MetaTokenType.ControlFlowKeyword, /*keyword.control.flow.python*/ }, + }, +}; + +export const statementKeyword: TokenPattern = { + patterns: [ + { + debugName: "statementKeyword.patterns![0]", + + token: KeywordTokenType.Def, /*storage.type.function.python*/ + match: /\b((async\s+)?\s*def)\b/g, + }, + { + debugName: "statementKeyword.patterns![1]", + + // if `as` is eventually followed by `:` or line continuation, it's probably control flow like: with foo as bar, \ + // Foo as Bar: try: do_stuff() except Exception as e: pass + token: MetaTokenType.ControlFlowKeyword, /*keyword.control.flow.python*/ + match: /\b(?>=|\/\/=|\*\*=|\+=|-=|\/=|@=|\*=|%=|~=|\^=|&=|\|=|=(?!=)/gm, +}; + +export const operator: TokenPattern = { + debugName: "operator", + + match: /\b(?>|&|\||\^|~)|(\*\*|\*|\+|-|%|\/\/|\/|@)|(!=|==|>=|<=|<|>)|(:=)/dgm, + captures: { + 1: { token: MetaTokenType.LogicalOperatorKeyword, /*keyword.operator.logical.python*/ }, + 2: { token: MetaTokenType.ControlFlowKeyword, /*keyword.control.flow.python*/ }, + 3: { token: MetaTokenType.BitwiseOperatorKeyword, /*keyword.operator.bitwise.python*/ }, + 4: { token: MetaTokenType.ArithmeticOperator, /*keyword.operator.arithmetic.python*/ }, + 5: { token: MetaTokenType.ComparisonOperatorKeyword, /*keyword.operator.comparison.python*/ }, + 6: { token: OperatorTokenType.Assignment, /*keyword.operator.assignment.python*/ }, + }, +}; + +export const punctuation: TokenPattern = { + patterns: [ + { + debugName: "punctuation.patterns![0]", + + token: CharacterTokenType.Colon, /*punctuation.separator.colon.python*/ + match: /:/g, + }, + { + debugName: "punctuation.patterns![1]", + + token: CharacterTokenType.Comma, /*punctuation.separator.element.python*/ + match: /,/g, + }, + ] +}; + +export const literal: TokenPattern = { + patterns: [ + { + debugName: "literal.patterns![0]", + + token: MetaTokenType.ConstantLiteral, /*constant.language.python*/ + match: /\b(True|False|None|NotImplemented|Ellipsis)\b/g, + }, + ] +}; + +export const number: TokenPattern = { + patterns: [ + { + debugName: "number.patterns![6]", + + token: MetaTokenType.Invalid, /*invalid.illegal.name.python*/ + match: /\b[0-9]+\w+/g, + }, + ] +}; + +export const numberFloat: TokenPattern = { + debugName: "numberFloat", + + token: LiteralTokenType.Float, /*constant.numeric.float.python*/ + match: /(?=^]?[-+ ]?\#?\d*,?(\.\d+)?[bcdeEfFgGnosxX%]?)?}))/dgm, + captures: { + 1: { token: MetaTokenType.Placeholder, /*constant.character.format.placeholder.other.python*/ }, + 3: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + 4: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + }, + }, + { + debugName: "stringBraceFormatting.patterns![1]", + + token: MetaTokenType.FormatBrace, /*meta.format.brace.python*/ + match: /({\w*(\.[a-zA-Z_]\w*|\[[^\]'"]+\])*(![rsa])?(:)[^'"{}\n]*(?:\{[^'"}\n]*?\}[^'"{}\n]*)*})/dg, + captures: { + 1: { token: MetaTokenType.Placeholder, /*constant.character.format.placeholder.other.python*/ }, + 3: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + 4: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + }, + }, + ] +}; + +export const fstringFormatting: TokenPattern = { + patterns: [ + ] +}; + +export const fstringFormattingSingeBrace: TokenPattern = { + debugName: "fstringFormattingSingeBrace", + + token: MetaTokenType.Invalid, /*invalid.illegal.brace.python*/ + match: /(}(?!}))/g, +}; + +export const importStatement: TokenPattern = { + // Import statements used to correctly mark `from`, `import`, and `as` + patterns: [ + { + debugName: "importStatement.patterns![0]", + + begin: /\b(?)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.Colon, /*punctuation.separator.annotation.result.python*/ }, + }, + end: /(?=:)/g, + patterns: [expression] +}; + +export const itemAccess: TokenPattern = { + patterns: [ + { + debugName: "itemAccess.patterns![0]", + + token: MetaTokenType.ItemAccess, /*meta.item-access.python*/ + begin: /\b(?=[a-zA-Z_]\w*\s*\[)/g, + end: /(\])/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*punctuation.definition.arguments.end.python*/ }, + }, + patterns: [expression] + }, + ] +}; + +export const itemName: TokenPattern = { + patterns: [ + specialNames, + { + debugName: "itemName.patterns![3]", + + token: MetaTokenType.IndexedName, /*meta.indexed-name.python*/ + match: /\b([a-zA-Z_]\w*)\b/g, + }, + ] +}; + +export const itemIndex: TokenPattern = { + debugName: "itemIndex", + + contentToken: MetaTokenType.Arguments, /*meta.item-access.arguments.python*/ + begin: /(\[)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.definition.arguments.begin.python*/ }, + }, + end: /(?=\])/g, + patterns: [ + { + debugName: "itemIndex.patterns![0]", + + token: CharacterTokenType.Colon, /*punctuation.separator.slice.python*/ + match: /:/g, + }, + expression, + ] +}; + +export const decorator: TokenPattern = { + debugName: "decorator", + + token: MetaTokenType.FunctionDefinition, /*meta.function.decorator.python*/ + begin: /^\s*((@))\s*(?=[a-zA-Z_]\w*)/dgm, + beginCaptures: { + 1: { token: EntityTokenType.FunctionName, /*entity.name.function.decorator.python*/ }, + 2: { token: CharacterTokenType.AtSymbol, /*punctuation.definition.decorator.python*/ }, + }, + end: /(\))(?:(.*?)(?=\s*(?:\#|$)))|(?=\n|\#)/dgm, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*punctuation.definition.arguments.end.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.decorator.python*/ }, + }, + patterns: [ + ] +}; + +export const decoratorName: TokenPattern = { + patterns: [ + { + debugName: "decoratorName.patterns![2]", + + token: EntityTokenType.FunctionName, /*entity.name.function.decorator.python*/ + match: /([a-zA-Z_]\w*)|(\.)/dg, + captures: { + 2: { token: CharacterTokenType.Period, /*punctuation.separator.period.python*/ }, + }, + }, + lineContinuation, + { + debugName: "decoratorName.patterns![4]", + + token: MetaTokenType.Invalid, /*invalid.illegal.decorator.python*/ + match: /\s*([^(a-zA-Z\s_\.#\\].*?)(?=\#|$)/dgm, + captures: { + 1: { token: MetaTokenType.Invalid, /*invalid.illegal.decorator.python*/ }, + }, + }, + ] +}; + +export const callWrapperInheritance: TokenPattern = { + debugName: "callWrapperInheritance", + + // same as a function call, but in inheritance context + token: MetaTokenType.FunctionCall, /*meta.function-call.python*/ + begin: /\b(?=([a-zA-Z_]\w*)\s*(\())/g, + end: /(\))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*punctuation.definition.arguments.end.python*/ }, + }, + patterns: [ + ] +}; + +export const inheritanceName: TokenPattern = { + patterns: [ + lambdaIncomplete, + inheritanceIdentifier, + ] +}; + +export const functionCall: TokenPattern = { + debugName: "functionCall", + + // Regular function call of the type "name(args)" + token: MetaTokenType.FunctionCall, /*meta.function-call.python*/ + begin: /\b(?=([a-zA-Z_]\w*)\s*(\())/g, + end: /(\))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*punctuation.definition.arguments.end.python*/ }, + }, + patterns: [ + ] +}; + +export const functionName: TokenPattern = { + patterns: [ + { + debugName: "functionName.patterns![1]", + + // Some color schemas support meta.function-call.generic scope + token: MetaTokenType.FunctionCall, /*meta.function-call.generic.python*/ + match: /\b([a-zA-Z_]\w*)\b/g, + }, + ] +}; + +export const functionArguments: TokenPattern = { + debugName: "functionArguments", + + contentToken: MetaTokenType.Arguments, /*meta.function-call.arguments.python*/ + begin: /(\()/dg, + beginCaptures: { + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.definition.arguments.begin.python*/ }, + }, + end: /(?=\))(?!\)\s*\()/g, + patterns: [ + { + debugName: "functionArguments.patterns![0]", + + token: CharacterTokenType.Comma, /*punctuation.separator.arguments.python*/ + match: /(,)/g, + }, + { + debugName: "functionArguments.patterns![1]", + + match: /(?:(?<=[,(])|^)\s*(\*{1,2})/dgm, + captures: { + 1: { token: OperatorTokenType.Unpacking, /*keyword.operator.unpacking.arguments.python*/ }, + }, + }, + lambdaIncomplete, + { + debugName: "functionArguments.patterns![4]", + + match: /\b([a-zA-Z_]\w*)\s*(=)(?!=)/dg, + captures: { + 1: { token: EntityTokenType.VariableName, /*variable.parameter.function-call.python*/ }, + 2: { token: OperatorTokenType.Assignment, /*keyword.operator.assignment.python*/ }, + }, + }, + { + debugName: "functionArguments.patterns![5]", + + token: OperatorTokenType.Assignment, /*keyword.operator.assignment.python*/ + match: /=(?!=)/g, + }, + expression, + { + debugName: "functionArguments.patterns![7]", + + match: /\s*(\))\s*(\()/dg, + captures: { + 1: { token: CharacterTokenType.CloseParentheses, /*punctuation.definition.arguments.end.python*/ }, + 2: { token: CharacterTokenType.OpenParentheses, /*punctuation.definition.arguments.begin.python*/ }, + }, + }, + ] +}; + +export const builtinCallables: TokenPattern = { + patterns: [] +}; + +export const builtinPossibleCallables: TokenPattern = { + patterns: [ + builtinCallables] +}; + +export const builtinExceptions: TokenPattern = { + debugName: "builtinExceptions", + + token: MetaTokenType.BuiltinExceptionType, /*support.type.exception.python*/ + match: /(?/g, +}; + +export const regexpBaseExpression: TokenPattern = { + patterns: [ + ] +}; + +export const fregexpBaseExpression: TokenPattern = { + patterns: [ + { + debugName: "fregexpBaseExpression.patterns![2]", + + match: /\{.*?\}/g, + }, + ] +}; + +export const fstringFormattingBraces: TokenPattern = { + patterns: [ + { + debugName: "fstringFormattingBraces.patterns![0]", + + // empty braces are illegal + match: /({)(\s*?)(})/dg, + captures: { + 1: { token: MetaTokenType.Placeholder, /*constant.character.format.placeholder.other.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.brace.python*/ }, + 3: { token: MetaTokenType.Placeholder, /*constant.character.format.placeholder.other.python*/ }, + }, + }, + { + debugName: "fstringFormattingBraces.patterns![1]", + + token: MetaTokenType.EscapeSequence, /*constant.character.escape.python*/ + match: /({{|}})/g, + }, + ] +}; + +export const regexpBaseCommon: TokenPattern = { + patterns: [ + { + debugName: "regexpBaseCommon.patterns![0]", + + token: CharacterTokenType.Period, /*support.other.match.any.regexp*/ + match: /\./g, + }, + { + debugName: "regexpBaseCommon.patterns![1]", + + token: CharacterTokenType.Caret, /*support.other.match.begin.regexp*/ + match: /\^/gm, + }, + { + debugName: "regexpBaseCommon.patterns![2]", + + token: CharacterTokenType.DollarSymbol, /*support.other.match.end.regexp*/ + match: /\$/gm, + }, + { + debugName: "regexpBaseCommon.patterns![3]", + + token: OperatorTokenType.Quantifier, /*keyword.operator.quantifier.regexp*/ + match: /[+*?]\??/g, + }, + { + debugName: "regexpBaseCommon.patterns![4]", + + token: OperatorTokenType.Disjunction, /*keyword.operator.disjunction.regexp*/ + match: /\|/g, + }, + ] +}; + +export const regexpQuantifier: TokenPattern = { + debugName: "regexpQuantifier", + + token: OperatorTokenType.Quantifier, /*keyword.operator.quantifier.regexp*/ + match: /\{(\d+|\d+,(\d+)?|,\d+)\}/g, +}; + +export const fregexpQuantifier: TokenPattern = { + debugName: "fregexpQuantifier", + + token: OperatorTokenType.Quantifier, /*keyword.operator.quantifier.regexp*/ + match: /\{\{(\d+|\d+,(\d+)?|,\d+)\}\}/g, +}; + +export const regexpBackreferenceNumber: TokenPattern = { + debugName: "regexpBackreferenceNumber", + + token: MetaTokenType.Backreference, /*meta.backreference.regexp*/ + match: /(\\[1-9]\d?)/dg, + captures: { + 1: { token: EntityTokenType.TagName, /*entity.name.tag.backreference.regexp*/ }, + }, +}; + +export const regexpBackreference: TokenPattern = { + debugName: "regexpBackreference", + + token: MetaTokenType.BackreferenceNamed, /*meta.backreference.named.regexp*/ + match: /(\()(\?P=\w+(?:\s+[a-zA-Z0-9]+)?)(\))/dg, + captures: { + 1: { token: CharacterTokenType.OpenParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.begin.backreference.named.regexp*/ }, + 2: { token: EntityTokenType.TagName, /*entity.name.tag.named.backreference.regexp*/ }, + 3: { token: CharacterTokenType.CloseParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.end.backreference.named.regexp*/ }, + }, +}; + +export const regexpFlags: TokenPattern = { + debugName: "regexpFlags", + + token: MetaTokenType.ModifierFlagStorageType, /*storage.modifier.flag.regexp*/ + match: /\(\?[aiLmsux]+\)/g, +}; + +export const regexpEscapeSpecial: TokenPattern = { + debugName: "regexpEscapeSpecial", + + token: MetaTokenType.EscapeSequence, /*support.other.escape.special.regexp*/ + match: /\\([AbBdDsSwWZ])/g, +}; + +export const regexpEscapeCharacter: TokenPattern = { + debugName: "regexpEscapeCharacter", + + token: MetaTokenType.EscapeSequence, /*constant.character.escape.regexp*/ + match: /\\(x[0-9A-Fa-f]{2}|0[0-7]{1,2}|[0-7]{3})/g, +}; + +export const regexpEscapeUnicode: TokenPattern = { + debugName: "regexpEscapeUnicode", + + token: MetaTokenType.EscapeSequence, /*constant.character.unicode.regexp*/ + match: /\\(u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/g, +}; + +export const regexpEscapeCatchall: TokenPattern = { + debugName: "regexpEscapeCatchall", + + token: MetaTokenType.EscapeSequence, /*constant.character.escape.regexp*/ + match: /\\(.|\n)/g, +}; + +export const regexpEscapeSequence: TokenPattern = { + patterns: [ + regexpEscapeSpecial, + regexpEscapeCharacter, + regexpEscapeUnicode, + regexpBackreferenceNumber, + regexpEscapeCatchall, + ] +}; + +export const regexpCharecterSetEscapes: TokenPattern = { + patterns: [ + { + debugName: "regexpCharecterSetEscapes.patterns![0]", + + token: MetaTokenType.EscapeSequence, /*constant.character.escape.regexp*/ + match: /\\[abfnrtv\\]/g, + }, + regexpEscapeSpecial, + { + debugName: "regexpCharecterSetEscapes.patterns![2]", + + token: MetaTokenType.EscapeSequence, /*constant.character.escape.regexp*/ + match: /\\([0-7]{1,3})/g, + }, + regexpEscapeCharacter, + regexpEscapeUnicode, + regexpEscapeCatchall, + ] +}; + +export const codetags: TokenPattern = { + debugName: "codetags", + + match: /(?:\b(NOTE|XXX|HACK|FIXME|BUG|TODO)\b)/dg, + captures: { + 1: { token: MetaTokenType.CommentCodeTag, /*keyword.codetag.notation.python*/ }, + }, +}; + +export const commentsBase: TokenPattern = { + debugName: "commentsBase", + + token: MetaTokenType.Comment, /*comment.line.number-sign.python*/ + begin: /(\#)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.Hashtag, /*punctuation.definition.comment.python*/ }, + }, + end: /($)/gm, + patterns: [codetags] +}; + +export const commentsStringSingleThree: TokenPattern = { + debugName: "commentsStringSingleThree", + + token: MetaTokenType.Comment, /*comment.line.number-sign.python*/ + begin: /(\#)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.Hashtag, /*punctuation.definition.comment.python*/ }, + }, + end: /($|(?='''))/gm, + patterns: [codetags] +}; + +export const commentsStringDoubleThree: TokenPattern = { + debugName: "commentsStringDoubleThree", + + token: MetaTokenType.Comment, /*comment.line.number-sign.python*/ + begin: /(\#)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.Hashtag, /*punctuation.definition.comment.python*/ }, + }, + end: /($|(?="""))/gm, + patterns: [codetags] +}; + +export const singleOneRegexpExpression: TokenPattern = { + patterns: [ + regexpBaseExpression, + regexpFlags, + regexpBackreference, + ] +}; + +export const singleOneRegexpCharacterSet: TokenPattern = { + patterns: [ + { + debugName: "singleOneRegexpCharacterSet.patterns![0]", + + match: /\[\^?\](?!.*?\])/gm, + }, + { + debugName: "singleOneRegexpCharacterSet.patterns![1]", + + token: MetaTokenType.CharacterSet, /*meta.character.set.regexp*/ + begin: /(\[)(\^)?(\])?/dgm, + beginCaptures: { + 1: { token: CharacterTokenType.OpenSquareBracket, /*constant.other.set.regexp punctuation.character.set.begin.regexp*/ }, + 2: { token: OperatorTokenType.Negation, /*keyword.operator.negation.regexp*/ }, + 3: { token: MetaTokenType.CharacterSet, /*constant.character.set.regexp*/ }, + }, + end: /(\]|(?=\'))|((?=(?)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.OpenParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.begin.named.regexp*/ }, + 2: { token: EntityTokenType.TagName, /*entity.name.tag.named.group.regexp*/ }, + }, + end: /(\)|(?=\'))|((?=(?)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.OpenParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.begin.named.regexp*/ }, + 2: { token: EntityTokenType.TagName, /*entity.name.tag.named.group.regexp*/ }, + }, + end: /(\)|(?=\'\'\'))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.end.named.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + singleThreeRegexpExpression, + commentsStringSingleThree, + ] +}; + +export const singleThreeRegexpComments: TokenPattern = { + debugName: "singleThreeRegexpComments", + + token: MetaTokenType.Comment, /*comment.regexp*/ + begin: /\(\?#/dg, + beginCaptures: { + 0: { token: MetaTokenType.CommentBegin, /*punctuation.comment.begin.regexp*/ }, + }, + end: /(\)|(?=\'\'\'))/dg, + endCaptures: { + 1: { token: MetaTokenType.CommentEnd, /*punctuation.comment.end.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [codetags] +}; + +export const singleThreeRegexpLookahead: TokenPattern = { + debugName: "singleThreeRegexpLookahead", + + begin: /(\()\?=/dg, + beginCaptures: { + 0: { token: OperatorTokenType.Lookahead, /*keyword.operator.lookahead.regexp*/ }, + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.parenthesis.begin.lookahead.regexp*/ }, + }, + end: /(\)|(?=\'\'\'))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*keyword.operator.lookahead.regexp punctuation.parenthesis.end.lookahead.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + singleThreeRegexpExpression, + commentsStringSingleThree, + ] +}; + +export const singleThreeRegexpLookaheadNegative: TokenPattern = { + debugName: "singleThreeRegexpLookaheadNegative", + + begin: /(\()\?!/dg, + beginCaptures: { + 0: { token: OperatorTokenType.LookaheadNegative, /*keyword.operator.lookahead.negative.regexp*/ }, + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.parenthesis.begin.lookahead.regexp*/ }, + }, + end: /(\)|(?=\'\'\'))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*keyword.operator.lookahead.negative.regexp punctuation.parenthesis.end.lookahead.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + singleThreeRegexpExpression, + commentsStringSingleThree, + ] +}; + +export const singleThreeRegexpLookbehind: TokenPattern = { + debugName: "singleThreeRegexpLookbehind", + + begin: /(\()\?<=/dg, + beginCaptures: { + 0: { token: OperatorTokenType.Lookbehind, /*keyword.operator.lookbehind.regexp*/ }, + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.parenthesis.begin.lookbehind.regexp*/ }, + }, + end: /(\)|(?=\'\'\'))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*keyword.operator.lookbehind.regexp punctuation.parenthesis.end.lookbehind.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + singleThreeRegexpExpression, + commentsStringSingleThree, + ] +}; + +export const singleThreeRegexpLookbehindNegative: TokenPattern = { + debugName: "singleThreeRegexpLookbehindNegative", + + begin: /(\()\?)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.OpenParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.begin.named.regexp*/ }, + 2: { token: EntityTokenType.TagName, /*entity.name.tag.named.group.regexp*/ }, + }, + end: /(\)|(?="))|((?=(?)/dg, + beginCaptures: { + 1: { token: CharacterTokenType.OpenParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.begin.named.regexp*/ }, + 2: { token: EntityTokenType.TagName, /*entity.name.tag.named.group.regexp*/ }, + }, + end: /(\)|(?="""))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*support.other.parenthesis.regexp punctuation.parenthesis.end.named.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + doubleThreeRegexpExpression, + commentsStringDoubleThree, + ] +}; + +export const doubleThreeRegexpComments: TokenPattern = { + debugName: "doubleThreeRegexpComments", + + token: MetaTokenType.Comment, /*comment.regexp*/ + begin: /\(\?#/dg, + beginCaptures: { + 0: { token: MetaTokenType.CommentBegin, /*punctuation.comment.begin.regexp*/ }, + }, + end: /(\)|(?="""))/dg, + endCaptures: { + 1: { token: MetaTokenType.CommentEnd, /*punctuation.comment.end.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [codetags] +}; + +export const doubleThreeRegexpLookahead: TokenPattern = { + debugName: "doubleThreeRegexpLookahead", + + begin: /(\()\?=/dg, + beginCaptures: { + 0: { token: OperatorTokenType.Lookahead, /*keyword.operator.lookahead.regexp*/ }, + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.parenthesis.begin.lookahead.regexp*/ }, + }, + end: /(\)|(?="""))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*keyword.operator.lookahead.regexp punctuation.parenthesis.end.lookahead.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + doubleThreeRegexpExpression, + commentsStringDoubleThree, + ] +}; + +export const doubleThreeRegexpLookaheadNegative: TokenPattern = { + debugName: "doubleThreeRegexpLookaheadNegative", + + begin: /(\()\?!/dg, + beginCaptures: { + 0: { token: OperatorTokenType.LookaheadNegative, /*keyword.operator.lookahead.negative.regexp*/ }, + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.parenthesis.begin.lookahead.regexp*/ }, + }, + end: /(\)|(?="""))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*keyword.operator.lookahead.negative.regexp punctuation.parenthesis.end.lookahead.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + doubleThreeRegexpExpression, + commentsStringDoubleThree, + ] +}; + +export const doubleThreeRegexpLookbehind: TokenPattern = { + debugName: "doubleThreeRegexpLookbehind", + + begin: /(\()\?<=/dg, + beginCaptures: { + 0: { token: OperatorTokenType.Lookbehind, /*keyword.operator.lookbehind.regexp*/ }, + 1: { token: CharacterTokenType.OpenParentheses, /*punctuation.parenthesis.begin.lookbehind.regexp*/ }, + }, + end: /(\)|(?="""))/dg, + endCaptures: { + 1: { token: CharacterTokenType.CloseParentheses, /*keyword.operator.lookbehind.regexp punctuation.parenthesis.end.lookbehind.regexp*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + doubleThreeRegexpExpression, + commentsStringDoubleThree, + ] +}; + +export const doubleThreeRegexpLookbehindNegative: TokenPattern = { + debugName: "doubleThreeRegexpLookbehindNegative", + + begin: /(\()\?=^]?[-+ ]?\#?\d*,?(\.\d+)?[bcdeEfFgGnosxX%]?)(?=})/dgm, + captures: { + 1: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + 2: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + }, + }, + ] +}; + +export const fstringTerminatorSingleTail: TokenPattern = { + debugName: "fstringTerminatorSingleTail", + + begin: /((?:=?)(?:![rsa])?)(:)(?=.*?{)/dg, + beginCaptures: { + 1: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + 2: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + }, + end: /(?=})|(?=\n)/g, + patterns: [ + fstringIllegalSingleBrace, + fstringSingleBrace, + { + debugName: "fstringTerminatorSingleTail.patterns![2]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /([bcdeEfFgGnosxX%])(?=})/g, + }, + { + debugName: "fstringTerminatorSingleTail.patterns![3]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\.\d+)/g, + }, + { + debugName: "fstringTerminatorSingleTail.patterns![4]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(,)/g, + }, + { + debugName: "fstringTerminatorSingleTail.patterns![5]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\d+)/g, + }, + { + debugName: "fstringTerminatorSingleTail.patterns![6]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\#)/g, + }, + { + debugName: "fstringTerminatorSingleTail.patterns![7]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /([-+ ])/g, + }, + { + debugName: "fstringTerminatorSingleTail.patterns![8]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /([<>=^])/gm, + }, + { + debugName: "fstringTerminatorSingleTail.patterns![9]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\w)/g, + }, + ] +}; + +export const fstringFnormQuotedMultiLine: TokenPattern = { + debugName: "fstringFnormQuotedMultiLine", + + token: MetaTokenType.Fstring, /*meta.fstring.python*/ + begin: /(\b[fF])([bBuU])?('''|""")/dg, + beginCaptures: { + 1: { token: MetaTokenType.StringStorageType, /*string.interpolated.python string.quoted.multi.python storage.type.string.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.prefix.python*/ }, + 3: { token: LiteralTokenType.String, /*punctuation.definition.string.begin.python string.interpolated.python string.quoted.multi.python*/ }, + }, + end: /(\3)/dg, + endCaptures: { + 1: { token: LiteralTokenType.String, /*punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + fstringGuts, + fstringIllegalMultiBrace, + ] +}; + +export const fstringNormfQuotedMultiLine: TokenPattern = { + debugName: "fstringNormfQuotedMultiLine", + + token: MetaTokenType.Fstring, /*meta.fstring.python*/ + begin: /(\b[bBuU])([fF])('''|""")/dg, + beginCaptures: { + 1: { token: MetaTokenType.Invalid, /*invalid.illegal.prefix.python*/ }, + 2: { token: MetaTokenType.StringStorageType, /*string.interpolated.python string.quoted.multi.python storage.type.string.python*/ }, + 3: { token: MetaTokenType.StringBegin, /*string.quoted.multi.python punctuation.definition.string.begin.python*/ }, + }, + end: /(\3)/dg, + endCaptures: { + 1: { token: LiteralTokenType.String, /*punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + fstringGuts, + fstringIllegalMultiBrace, + ] +}; + +export const fstringRawQuotedMultiLine: TokenPattern = { + debugName: "fstringRawQuotedMultiLine", + + token: MetaTokenType.Fstring, /*meta.fstring.python*/ + begin: /(\b(?:[rR][fF]|[fF][rR]))('''|""")/dg, + beginCaptures: { + 1: { token: MetaTokenType.StringStorageType, /*string.interpolated.python string.quoted.raw.multi.python storage.type.string.python*/ }, + 2: { token: MetaTokenType.StringBegin, /*string.quoted.raw.multi.python punctuation.definition.string.begin.python*/ }, + }, + end: /(\2)/dg, + endCaptures: { + 1: { token: LiteralTokenType.String, /*punctuation.definition.string.end.python string.interpolated.python string.quoted.raw.multi.python*/ }, + 2: { token: MetaTokenType.Invalid, /*invalid.illegal.newline.python*/ }, + }, + patterns: [ + fstringRawGuts, + fstringIllegalMultiBrace, + ] +}; + +export const fstringMultiCore: TokenPattern = { + debugName: "fstringMultiCore", + + token: LiteralTokenType.String, /*string.interpolated.python string.quoted.multi.python*/ + match: /(.+?)(($\n?)|(?=[\\\}\{]|'''|"""))|\n/gm, +}; + +export const fstringRawMultiCore: TokenPattern = { + debugName: "fstringRawMultiCore", + + token: LiteralTokenType.String, /*string.interpolated.python string.quoted.raw.multi.python*/ + match: /(.+?)(($\n?)|(?=[\\\}\{]|'''|"""))|\n/gm, +}; + +export const fstringMultiBrace: TokenPattern = { + debugName: "fstringMultiBrace", + + // value interpolation using { ... } + begin: /(\{)/dg, + beginCaptures: { + 1: { token: MetaTokenType.Placeholder, /*constant.character.format.placeholder.other.python*/ }, + }, + end: /(\})/dg, + endCaptures: { + 1: { token: MetaTokenType.Placeholder, /*constant.character.format.placeholder.other.python*/ }, + }, + patterns: [fExpression] +}; + +export const fstringTerminatorMulti: TokenPattern = { + patterns: [ + { + debugName: "fstringTerminatorMulti.patterns![0]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(=(![rsa])?)(?=})/g, + }, + { + debugName: "fstringTerminatorMulti.patterns![1]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(=?![rsa])(?=})/g, + }, + { + debugName: "fstringTerminatorMulti.patterns![2]", + + match: /((?:=?)(?:![rsa])?)(:\w?[<>=^]?[-+ ]?\#?\d*,?(\.\d+)?[bcdeEfFgGnosxX%]?)(?=})/dgm, + captures: { + 1: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + 2: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + }, + }, + ] +}; + +export const fstringTerminatorMultiTail: TokenPattern = { + debugName: "fstringTerminatorMultiTail", + + begin: /((?:=?)(?:![rsa])?)(:)(?=.*?{)/dg, + beginCaptures: { + 1: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + 2: { token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ }, + }, + end: /(?=})/g, + patterns: [ + fstringIllegalMultiBrace, + fstringMultiBrace, + { + debugName: "fstringTerminatorMultiTail.patterns![2]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /([bcdeEfFgGnosxX%])(?=})/g, + }, + { + debugName: "fstringTerminatorMultiTail.patterns![3]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\.\d+)/g, + }, + { + debugName: "fstringTerminatorMultiTail.patterns![4]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(,)/g, + }, + { + debugName: "fstringTerminatorMultiTail.patterns![5]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\d+)/g, + }, + { + debugName: "fstringTerminatorMultiTail.patterns![6]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\#)/g, + }, + { + debugName: "fstringTerminatorMultiTail.patterns![7]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /([-+ ])/g, + }, + { + debugName: "fstringTerminatorMultiTail.patterns![8]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /([<>=^])/gm, + }, + { + debugName: "fstringTerminatorMultiTail.patterns![9]", + + token: MetaTokenType.FormatStorageType, /*storage.type.format.python*/ + match: /(\w)/g, + }, + ] +}; + +// Push pattern references that were not defined on include +python.patterns!.push(statement, expression); +statement.patterns!.push(importStatement, classDeclaration, functionDeclaration, generator, statementKeyword, assignmentOperator, decorator, docstringStatement, semicolon); +comments.patterns!.push(commentsBase); +docstringStatement.patterns!.push(docstring); +docstring.patterns![0].patterns!.push(docstringPrompt, codetags, docstringGutsUnicode); +docstring.patterns![1].patterns!.push(stringConsumeEscape, docstringPrompt, codetags); +docstring.patterns![2].patterns!.push(codetags, docstringGutsUnicode); +docstring.patterns![3].patterns!.push(stringConsumeEscape, codetags); +docstringGutsUnicode.patterns!.push(escapeSequenceUnicode, escapeSequence, stringLineContinuation); +expressionBare.patterns!.push(backticks, illegalAnno, literal, regexp, string, lambda, generator, illegalOperator, operator, curlyBraces, itemAccess, list, oddFunctionCall, roundBraces, functionCall, builtinFunctions, builtinTypes, builtinExceptions, magicNames, specialNames, illegalNames, specialVariables, ellipsis, punctuation, lineContinuation); +expressionBase.patterns!.push(lineContinuation); +expression.patterns!.splice(1, 0, memberAccess); +memberAccess.patterns!.push(functionCall, memberAccessBase, memberAccessAttribute); +memberAccessBase.patterns!.push(magicNames, illegalNames, illegalObjectName, specialNames, lineContinuation, itemAccess); +oddFunctionCall.patterns!.push(functionArguments); +lineContinuation.patterns![1].patterns!.push(regexp, string); +literal.patterns!.push(number); +number.patterns!.splice(0, 0, numberFloat); +number.patterns!.splice(1, 0, numberDec); +number.patterns!.splice(2, 0, numberHex); +number.patterns!.splice(3, 0, numberOct); +number.patterns!.splice(4, 0, numberBin); +number.patterns!.splice(5, 0, numberLong); +regexp.patterns!.push(regexpSingleThreeLine, regexpDoubleThreeLine, regexpSingleOneLine, regexpDoubleOneLine); +string.patterns!.push(stringQuotedMultiLine, stringQuotedSingleLine, stringBinQuotedMultiLine, stringBinQuotedSingleLine, stringRawQuotedMultiLine, stringRawQuotedSingleLine, stringRawBinQuotedMultiLine, stringRawBinQuotedSingleLine, fstringFnormQuotedMultiLine, fstringFnormQuotedSingleLine, fstringNormfQuotedMultiLine, fstringNormfQuotedSingleLine, fstringRawQuotedMultiLine, fstringRawQuotedSingleLine); +stringUnicodeGuts.patterns!.push(escapeSequenceUnicode, stringEntity, stringBraceFormatting); +stringRawGuts.patterns!.push(stringFormatting, stringBraceFormatting); +stringRawBinGuts.patterns!.push(stringFormatting); +stringEntity.patterns!.push(escapeSequence, stringLineContinuation, stringFormatting); +fstringGuts.patterns!.push(escapeSequenceUnicode, escapeSequence, stringLineContinuation, fstringFormatting); +fstringRawGuts.patterns!.push(fstringFormatting); +fstringIllegalSingleBrace.patterns!.push(fstringTerminatorSingle, fExpression); +fstringFormatting.patterns!.push(fstringFormattingBraces, fstringFormattingSingeBrace); +classDeclaration.patterns![0].patterns!.push(className, classInheritance); +className.patterns!.splice(0, 0, illegalObjectName); +className.patterns!.splice(1, 0, builtinPossibleCallables); +classInheritance.patterns!.splice(4, 0, illegalNames); +classInheritance.patterns!.splice(5, 0, classKwarg); +classInheritance.patterns!.splice(6, 0, callWrapperInheritance); +classInheritance.patterns!.push(memberAccessClass, inheritanceIdentifier); +memberAccessClass.patterns!.splice(0, 0, callWrapperInheritance); +lambda.patterns![2].patterns!.splice(2, 0, lambdaNestedIncomplete); +lambda.patterns![2].patterns!.splice(3, 0, illegalNames); +lambda.patterns![2].patterns!.splice(6, 0, backticks); +lambda.patterns![2].patterns!.splice(7, 0, illegalAnno); +lambda.patterns![2].patterns!.splice(8, 0, lambdaParameterWithDefault); +lambda.patterns![2].patterns!.push(illegalOperator); +functionDeclaration.patterns!.splice(0, 0, functionDefName); +functionDeclaration.patterns!.splice(1, 0, parameters); +functionDeclaration.patterns!.push(returnAnnotation); +functionDefName.patterns!.splice(0, 0, illegalObjectName); +functionDefName.patterns!.splice(1, 0, builtinPossibleCallables); +parameters.patterns!.splice(3, 0, illegalNames); +parameters.patterns!.splice(4, 0, illegalObjectName); +parameters.patterns!.splice(5, 0, parameterSpecial); +parameters.patterns!.push(looseDefault, annotatedParameter); +itemAccess.patterns![0].patterns!.splice(0, 0, itemName); +itemAccess.patterns![0].patterns!.splice(1, 0, itemIndex); +itemName.patterns!.splice(0, 0, specialVariables); +itemName.patterns!.splice(1, 0, builtinFunctions); +decorator.patterns!.push(decoratorName, functionArguments); +decoratorName.patterns!.splice(0, 0, builtinCallables); +decoratorName.patterns!.splice(1, 0, illegalObjectName); +callWrapperInheritance.patterns!.push(inheritanceName, functionArguments); +inheritanceName.patterns!.splice(1, 0, builtinPossibleCallables); +functionCall.patterns!.push(specialVariables, functionName, functionArguments); +functionName.patterns!.splice(0, 0, builtinPossibleCallables); +functionArguments.patterns!.splice(3, 0, illegalNames); +builtinCallables.patterns!.push(illegalNames, illegalObjectName, builtinExceptions, builtinFunctions, builtinTypes); +builtinPossibleCallables.patterns!.push(magicNames); +regexpBaseExpression.patterns!.push(regexpQuantifier, regexpBaseCommon); +fregexpBaseExpression.patterns!.splice(0, 0, fregexpQuantifier); +fregexpBaseExpression.patterns!.splice(1, 0, fstringFormattingBraces); +fregexpBaseExpression.patterns!.push(regexpBaseCommon); +regexpBaseCommon.patterns!.push(regexpEscapeSequence); +singleOneRegexpExpression.patterns!.splice(1, 0, singleOneRegexpCharacterSet); +singleOneRegexpExpression.patterns!.splice(2, 0, singleOneRegexpComments); +singleOneRegexpExpression.patterns!.splice(4, 0, singleOneRegexpNamedGroup); +singleOneRegexpExpression.patterns!.push(singleOneRegexpLookahead, singleOneRegexpLookaheadNegative, singleOneRegexpLookbehind, singleOneRegexpLookbehindNegative, singleOneRegexpConditional, singleOneRegexpParenthesesNonCapturing, singleOneRegexpParentheses); +singleThreeRegexpExpression.patterns!.splice(1, 0, singleThreeRegexpCharacterSet); +singleThreeRegexpExpression.patterns!.splice(2, 0, singleThreeRegexpComments); +singleThreeRegexpExpression.patterns!.splice(4, 0, singleThreeRegexpNamedGroup); +singleThreeRegexpExpression.patterns!.splice(6, 0, singleThreeRegexpLookahead); +singleThreeRegexpExpression.patterns!.splice(7, 0, singleThreeRegexpLookaheadNegative); +singleThreeRegexpExpression.patterns!.splice(8, 0, singleThreeRegexpLookbehind); +singleThreeRegexpExpression.patterns!.splice(9, 0, singleThreeRegexpLookbehindNegative); +singleThreeRegexpExpression.patterns!.splice(10, 0, singleThreeRegexpConditional); +singleThreeRegexpExpression.patterns!.splice(11, 0, singleThreeRegexpParenthesesNonCapturing); +singleThreeRegexpExpression.patterns!.splice(12, 0, singleThreeRegexpParentheses); +doubleOneRegexpExpression.patterns!.splice(1, 0, doubleOneRegexpCharacterSet); +doubleOneRegexpExpression.patterns!.splice(2, 0, doubleOneRegexpComments); +doubleOneRegexpExpression.patterns!.splice(4, 0, doubleOneRegexpNamedGroup); +doubleOneRegexpExpression.patterns!.push(doubleOneRegexpLookahead, doubleOneRegexpLookaheadNegative, doubleOneRegexpLookbehind, doubleOneRegexpLookbehindNegative, doubleOneRegexpConditional, doubleOneRegexpParenthesesNonCapturing, doubleOneRegexpParentheses); +doubleThreeRegexpExpression.patterns!.splice(1, 0, doubleThreeRegexpCharacterSet); +doubleThreeRegexpExpression.patterns!.splice(2, 0, doubleThreeRegexpComments); +doubleThreeRegexpExpression.patterns!.splice(4, 0, doubleThreeRegexpNamedGroup); +doubleThreeRegexpExpression.patterns!.splice(6, 0, doubleThreeRegexpLookahead); +doubleThreeRegexpExpression.patterns!.splice(7, 0, doubleThreeRegexpLookaheadNegative); +doubleThreeRegexpExpression.patterns!.splice(8, 0, doubleThreeRegexpLookbehind); +doubleThreeRegexpExpression.patterns!.splice(9, 0, doubleThreeRegexpLookbehindNegative); +doubleThreeRegexpExpression.patterns!.splice(10, 0, doubleThreeRegexpConditional); +doubleThreeRegexpExpression.patterns!.splice(11, 0, doubleThreeRegexpParenthesesNonCapturing); +doubleThreeRegexpExpression.patterns!.splice(12, 0, doubleThreeRegexpParentheses); +stringRawQuotedSingleLine.patterns!.splice(0, 0, stringSingleBadBrace1FormattingRaw); +stringRawQuotedSingleLine.patterns!.splice(1, 0, stringSingleBadBrace2FormattingRaw); +stringQuotedSingleLine.patterns!.splice(0, 0, stringSingleBadBrace1FormattingUnicode); +stringQuotedSingleLine.patterns!.splice(1, 0, stringSingleBadBrace2FormattingUnicode); +stringRawQuotedMultiLine.patterns!.splice(0, 0, stringMultiBadBrace1FormattingRaw); +stringRawQuotedMultiLine.patterns!.splice(1, 0, stringMultiBadBrace2FormattingRaw); +stringQuotedMultiLine.patterns!.splice(0, 0, stringMultiBadBrace1FormattingUnicode); +stringQuotedMultiLine.patterns!.splice(1, 0, stringMultiBadBrace2FormattingUnicode); +fstringFnormQuotedSingleLine.patterns!.push(fstringSingleBrace, fstringSingleCore); +fstringNormfQuotedSingleLine.patterns!.push(fstringSingleBrace, fstringSingleCore); +fstringRawQuotedSingleLine.patterns!.push(fstringSingleBrace, fstringRawSingleCore); +fstringSingleBrace.patterns!.splice(0, 0, fstringTerminatorSingle); +fstringTerminatorSingle.patterns!.push(fstringTerminatorSingleTail); +fstringFnormQuotedMultiLine.patterns!.push(fstringMultiBrace, fstringMultiCore); +fstringNormfQuotedMultiLine.patterns!.push(fstringMultiBrace, fstringMultiCore); +fstringRawQuotedMultiLine.patterns!.push(fstringMultiBrace, fstringRawMultiCore); +fstringMultiBrace.patterns!.splice(0, 0, fstringTerminatorMulti); +fstringTerminatorMulti.patterns!.push(fstringTerminatorMultiTail); \ No newline at end of file diff --git a/src/tokenizer/python-token-patterns.ts b/src/tokenizer/python-token-patterns.ts deleted file mode 100644 index 59407928..00000000 --- a/src/tokenizer/python-token-patterns.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* eslint-disable no-useless-escape */ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable no-useless-backreference */ -import { charactersPatten, strings } from "./common-token-patterns"; -import { MetaTokenType } from "./renpy-tokens"; -import { TokenPattern, TokenRepoPattern } from "./token-pattern-types"; - -export const pythonMemberAccess: TokenPattern = { - patterns: [charactersPatten], -}; - -export const pythonExpressionBare: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonExpressionBase: TokenPattern = { - patterns: [strings], -}; -export const pythonExpression: TokenPattern = { - // All valid Python expressions - patterns: [pythonExpressionBase, pythonMemberAccess, charactersPatten], -}; - -export const semicolon: TokenPattern = { - patterns: [ - { - token: MetaTokenType.Invalid, - match: /\\;$/g, - }, - ], -}; - -export const pythonLiteral: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonIllegalOperator: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonOperator: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonCurlyBraces: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonItemAccess: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonList: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonOddFunctionCall: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonRoundBraces: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonFunctionCall: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonBuiltinFunctions: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonBuiltinTypes: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonBuiltinExceptions: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonMagicNames: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonSpecialNames: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonIllegalNames: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonSpecialVariables: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonEllipsis: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonPunctuation: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonLineContinuation: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonBuiltinPossibleCallables: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonFunctionArguments: TokenPattern = { - patterns: [charactersPatten], -}; -export const pythonNumber: TokenPattern = { - patterns: [charactersPatten], -}; - -export const pythonPatterns: TokenRepoPattern = { - patterns: [], -}; diff --git a/src/tokenizer/renpy-token-patterns.g.ts b/src/tokenizer/renpy-token-patterns.g.ts new file mode 100644 index 00000000..18a72c76 --- /dev/null +++ b/src/tokenizer/renpy-token-patterns.g.ts @@ -0,0 +1,1728 @@ +/* eslint-disable no-useless-escape */ +/* eslint-disable no-useless-backreference */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +// THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR +// DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. +// ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. +// Last generated: 01/06/2023 14:57:48 (UTC+0) + +import { MetaTokenType, CharacterTokenType, LiteralTokenType, KeywordTokenType, EscapedCharacterTokenType, EntityTokenType, OperatorTokenType } from "./renpy-tokens"; +import { TokenPattern } from "./token-pattern-types"; + +export const statements: TokenPattern = { + patterns: [ + ] +}; + +export const expressions: TokenPattern = { + patterns: [ + ] +}; + +export const invalidToken: TokenPattern = { + debugName: "invalidToken", + + token: MetaTokenType.Invalid, /*invalid.unknown.token.renpy*/ + match: /.+/g, +}; + +export const newLine: TokenPattern = { + debugName: "newLine", + + token: CharacterTokenType.NewLine, /*punctuation.new-line.renpy*/ + match: /\r\n|\r|\n/g, +}; + +export const whitespace: TokenPattern = { + debugName: "whitespace", + + token: CharacterTokenType.Whitespace, /*punctuation.whitespace.renpy*/ + match: /[ \t]+/g, +}; + +export const fallbackCharacters: TokenPattern = { + // NOTE: Having these patterns separated increases performance. Benchmark before making a change! + patterns: [ + newLine, + whitespace, + { + debugName: "fallbackCharacters.patterns![2]", + + token: CharacterTokenType.OpenParentheses, /*punctuation.parenthesis.begin.renpy*/ + match: /\(/g, + }, + { + debugName: "fallbackCharacters.patterns![3]", + + token: CharacterTokenType.CloseParentheses, /*punctuation.parenthesis.end.renpy*/ + match: /\)/g, + }, + { + debugName: "fallbackCharacters.patterns![4]", + + token: CharacterTokenType.OpenBracket, /*punctuation.bracket.begin.renpy*/ + match: /{/g, + }, + { + debugName: "fallbackCharacters.patterns![5]", + + token: CharacterTokenType.CloseBracket, /*punctuation.bracket.end.renpy*/ + match: /}/g, + }, + { + debugName: "fallbackCharacters.patterns![6]", + + token: CharacterTokenType.OpenSquareBracket, /*punctuation.square-bracket.begin.renpy*/ + match: /\[/g, + }, + { + debugName: "fallbackCharacters.patterns![7]", + + token: CharacterTokenType.CloseSquareBracket, /*punctuation.square-bracket.end.renpy*/ + match: /\]/g, + }, + { + debugName: "fallbackCharacters.patterns![8]", + + token: CharacterTokenType.Period, /*punctuation.period.renpy*/ + match: /\./g, + }, + { + debugName: "fallbackCharacters.patterns![9]", + + token: CharacterTokenType.Colon, /*punctuation.colon.renpy*/ + match: /:/g, + }, + { + debugName: "fallbackCharacters.patterns![10]", + + token: CharacterTokenType.Semicolon, /*punctuation.semicolon.renpy*/ + match: /;/g, + }, + { + debugName: "fallbackCharacters.patterns![11]", + + token: CharacterTokenType.Comma, /*punctuation.comma.renpy*/ + match: /,/g, + }, + { + debugName: "fallbackCharacters.patterns![12]", + + token: CharacterTokenType.Hashtag, /*punctuation.hashtag.renpy*/ + match: /#/g, + }, + { + debugName: "fallbackCharacters.patterns![13]", + + token: CharacterTokenType.Quote, /*punctuation.quote.renpy*/ + match: /'/g, + }, + { + debugName: "fallbackCharacters.patterns![14]", + + token: CharacterTokenType.DoubleQuote, /*punctuation.double-quote.renpy*/ + match: /"/g, + }, + { + debugName: "fallbackCharacters.patterns![15]", + + token: CharacterTokenType.BackQuote, /*punctuation.back-quote.renpy*/ + match: /`/g, + }, + { + debugName: "fallbackCharacters.patterns![16]", + + token: CharacterTokenType.Backslash, /*punctuation.backslash.renpy*/ + match: /\\/g, + }, + { + debugName: "fallbackCharacters.patterns![17]", + + token: CharacterTokenType.ForwardSlash, /*punctuation.forward-slash.renpy*/ + match: /\//g, + }, + { + debugName: "fallbackCharacters.patterns![18]", + + token: CharacterTokenType.EqualsSymbol, /*punctuation.equals-symbol.renpy*/ + match: /=/g, + }, + { + debugName: "fallbackCharacters.patterns![19]", + + token: MetaTokenType.Invalid, /*invalid.illegal.word.renpy*/ + match: /\b\w+\b/g, + }, + { + debugName: "fallbackCharacters.patterns![20]", + + token: CharacterTokenType.Unknown, /*punctuation.unknown.renpy*/ + match: /./g, + }, + ] +}; + +export const literal: TokenPattern = { + patterns: [ + { + debugName: "literal.patterns![0]", + + // Python literals + token: MetaTokenType.ConstantLiteral, /*constant.language.renpy*/ + match: /\b(?> // Assignment operators - Assign, // = + Assignment, // = PlusAssign, // += MinusAssign, // -= MultiplyAssign, // *= @@ -163,8 +190,21 @@ export const enum OperatorTokenType { Is, // is IsNot, // is not - In, // in NotIn, // not in + + Unpacking, // * or ** + PositionalParameter, // / + + // Regex operators + Quantifier, // [+*?]\?? + Disjunction, // | + Negation, // ^ + Lookahead, // (?= + LookaheadNegative, // (?! + Lookbehind, // (?<= + LookbehindNegative, // (?= this.start && position <= this.end; + } +} export class TokenPosition { line: number; @@ -53,8 +72,6 @@ export class TokenPosition { export class Token { readonly tokenType: TokenType; - - // README: The tokenizer abuses that 'startPos' and 'endPos' are reference objects to move the positions! readonly startPos: TokenPosition; readonly endPos: TokenPosition; @@ -64,7 +81,7 @@ export class Token { this.endPos = endPos; } - public getRange() { + public getVSCodeRange() { const start = new Position(this.startPos.line, this.startPos.character); const end = new Position(this.endPos.line, this.endPos.character); @@ -72,7 +89,11 @@ export class Token { console.warn(`Empty token detected at L: ${start.line + 1}, C: ${start.character + 1} !`); } - return new Range(start, end); + return new VSRange(start, end); + } + + public getRange() { + return new Range(this.startPos.charStartOffset, this.endPos.charStartOffset); } public isKeyword() { @@ -123,3 +144,76 @@ export function isMatchPattern(p: TokenPattern): p is TokenMatchPattern { export function isRepoPattern(p: TokenPattern): p is TokenRepoPattern { return !isRangePattern(p) && (p as TokenRepoPattern).patterns !== undefined; } + +export class TreeNode { + public token: Token | null; + public children: Vector; + + constructor(token: Token | null = null) { + this.token = token; + this.children = new Vector(); + } + + public addChild(child: TreeNode): void { + this.children.pushBack(child); + } + + public hasChildren(): boolean { + return !this.children.isEmpty(); + } + + public isEmpty(): boolean { + return this.token === null && !this.hasChildren(); + } + + // Recursively iterate over all children + public forEach(callback: (node: TreeNode) => void): void { + this.children.forEach((child) => { + callback(child); + child.forEach(callback); + }); + } + + public filter(callback: (node: TreeNode) => boolean): TreeNode[] { + const result: TreeNode[] = []; + this.forEach((node) => { + if (callback(node)) { + result.push(node); + } + }); + return result; + } + + public count(): number { + // Recursively iterate over all children + let count = 0; + this.forEach(() => { + ++count; + }); + return count; + } +} + +export class TokenTree { + public root: TreeNode; + + constructor() { + this.root = new TreeNode(); + } + + public isEmpty(): boolean { + return !this.root.hasChildren(); + } + + public forEach(callback: (node: TreeNode) => void): void { + this.root.forEach(callback); + } + + public filter(callback: (node: TreeNode) => boolean): TreeNode[] { + return this.root.filter(callback); + } + + public count(): number { + return this.root.count(); + } +} diff --git a/src/tokenizer/token-pattern-types.ts b/src/tokenizer/token-pattern-types.ts index 9c10a95b..76d82a00 100644 --- a/src/tokenizer/token-pattern-types.ts +++ b/src/tokenizer/token-pattern-types.ts @@ -1,6 +1,10 @@ import { TokenType } from "./renpy-tokens"; -export interface TokenCapturePattern { +interface TokenPatternDebugInfo { + readonly debugName?: string; +} + +export interface TokenCapturePattern extends TokenPatternDebugInfo { readonly token?: TokenType; readonly patterns?: TokenPatternArray; } @@ -54,9 +58,5 @@ export interface TokenMatchPattern { endCaptures?: never; } -interface TokenPatternDebugInfo { - readonly debugName?: string; -} - export declare type TokenPattern = (TokenRangePattern | TokenMatchPattern | TokenRepoPattern) & TokenPatternDebugInfo; export declare type TokenPatternArray = Array; diff --git a/src/tokenizer/token-patterns.g.ts b/src/tokenizer/token-patterns.g.ts new file mode 100644 index 00000000..cd6791ab --- /dev/null +++ b/src/tokenizer/token-patterns.g.ts @@ -0,0 +1,59 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +// THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR +// DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. +// ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. +// Last generated: 01/06/2023 14:57:48 (UTC+0) + +import * as AtlPatterns from "./atl-token-patterns.g"; +import * as RenpyPatterns from "./renpy-token-patterns.g"; +import * as PythonPatterns from "./python-token-patterns.g"; + +// Push all RenpyPatterns external includes +RenpyPatterns.keywords.patterns![1].patterns!.push(PythonPatterns.expression); +RenpyPatterns.constantPlaceholder.captures![2].patterns!.push(PythonPatterns.expression); +RenpyPatterns.pythonStatements.patterns![1].patterns!.push(PythonPatterns.python); +RenpyPatterns.pythonStatements.patterns![2].patterns!.splice(2, 0, PythonPatterns.expression); +RenpyPatterns.sayStatements.patterns![0].endCaptures![3].patterns!.push(PythonPatterns.functionArguments); +RenpyPatterns.sayStatements.patterns![1].endCaptures![3].patterns!.push(PythonPatterns.functionArguments); +RenpyPatterns.transform.patterns!.push(AtlPatterns.atl); +RenpyPatterns.image.patterns![0].patterns!.push(AtlPatterns.atl); +RenpyPatterns.show.patterns![0].patterns!.push(AtlPatterns.atl); +RenpyPatterns.scene.patterns![0].patterns!.push(AtlPatterns.atl); +RenpyPatterns.camera.patterns![0].patterns!.push(AtlPatterns.atl); +RenpyPatterns.screenDefName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +RenpyPatterns.screenSimpleExpression.patterns!.push(PythonPatterns.literal, PythonPatterns.memberAccess, PythonPatterns.illegalOperator, PythonPatterns.operator, PythonPatterns.curlyBraces, PythonPatterns.itemAccess, PythonPatterns.list, PythonPatterns.oddFunctionCall, PythonPatterns.roundBraces, PythonPatterns.functionCall, PythonPatterns.builtinFunctions, PythonPatterns.builtinTypes, PythonPatterns.builtinExceptions, PythonPatterns.magicNames, PythonPatterns.specialNames, PythonPatterns.illegalNames, PythonPatterns.specialVariables, PythonPatterns.ellipsis, PythonPatterns.punctuation, PythonPatterns.lineContinuation); +RenpyPatterns.screenText.patterns![0].patterns!.push(AtlPatterns.atl); +RenpyPatterns.screen.patterns![0].beginCaptures![3].patterns!.splice(1, 0, PythonPatterns.parameters); +RenpyPatterns.labelName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +RenpyPatterns.labelCall.patterns!.splice(0, 0, PythonPatterns.specialVariables); +RenpyPatterns.labelCall.patterns!.push(PythonPatterns.functionArguments); +RenpyPatterns.labelDefName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +RenpyPatterns.label.captures![2].patterns!.splice(1, 0, PythonPatterns.parameters); +RenpyPatterns.returnStatements.patterns!.push(PythonPatterns.expression); +RenpyPatterns.callJumpExpression.patterns!.push(PythonPatterns.expression); +RenpyPatterns.callPass.patterns!.push(PythonPatterns.functionArguments); +RenpyPatterns.menuOption.beginCaptures![3].patterns!.splice(0, 0, PythonPatterns.functionArguments); +RenpyPatterns.menuOption.beginCaptures![3].patterns![1].captures![2].patterns!.push(PythonPatterns.expressionBare); +RenpyPatterns.menuSet.captures![2].patterns!.push(PythonPatterns.expressionBare); +RenpyPatterns.menu.beginCaptures![3].patterns!.push(PythonPatterns.functionArguments); +RenpyPatterns.audioParams.patterns!.push(PythonPatterns.number); +RenpyPatterns.play.patterns![0].patterns!.push(PythonPatterns.expression); +RenpyPatterns.queue.patterns![0].patterns!.push(PythonPatterns.expression); +RenpyPatterns.stop.patterns![0].patterns!.push(PythonPatterns.number); + +// Push all AtlPatterns external includes +AtlPatterns.atlSimpleExpression.patterns!.splice(0, 0, RenpyPatterns.expressions); +AtlPatterns.atlSimpleExpression.patterns!.push(PythonPatterns.literal, PythonPatterns.memberAccess, PythonPatterns.illegalOperator, PythonPatterns.operator, PythonPatterns.curlyBraces, PythonPatterns.itemAccess, PythonPatterns.list, PythonPatterns.oddFunctionCall, PythonPatterns.roundBraces, PythonPatterns.functionCall, PythonPatterns.builtinFunctions, PythonPatterns.builtinTypes, PythonPatterns.builtinExceptions, PythonPatterns.magicNames, PythonPatterns.specialNames, PythonPatterns.illegalNames, PythonPatterns.specialVariables, PythonPatterns.ellipsis, PythonPatterns.punctuation, PythonPatterns.lineContinuation); +AtlPatterns.atlExpression.patterns!.push(PythonPatterns.expression); +AtlPatterns.atlEventName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +AtlPatterns.atlEventDefName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +AtlPatterns.atlOn.beginCaptures![3].patterns!.push(RenpyPatterns.comments); +AtlPatterns.atlFunction.captures![2].patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +AtlPatterns.atlWarperName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); + +// Push all PythonPatterns external includes +PythonPatterns.stringUnicodeGuts.patterns!.splice(0, 0, RenpyPatterns.stringsInterior); + + +export { AtlPatterns, RenpyPatterns, PythonPatterns }; \ No newline at end of file diff --git a/src/tokenizer/token-patterns.ts b/src/tokenizer/token-patterns.ts deleted file mode 100644 index ceb3fe07..00000000 --- a/src/tokenizer/token-patterns.ts +++ /dev/null @@ -1,953 +0,0 @@ -/* eslint-disable no-useless-escape */ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable no-useless-backreference */ - -import { CharacterTokenType, LiteralTokenType, EntityTokenType, KeywordTokenType, MetaTokenType, OperatorTokenType } from "./renpy-tokens"; -import { comments, expressions, newLine, statements, charactersPatten, whiteSpace, numFloat, numInt, invalidToken, strings, stringsInterior } from "./common-token-patterns"; -import { atl } from "./atl-token-patterns"; -import { pythonBuiltinPossibleCallables, pythonExpression, pythonExpressionBare, pythonFunctionArguments, pythonNumber, pythonSpecialVariables } from "./python-token-patterns"; -import { TokenPattern } from "./token-pattern-types"; -// NOTE: These patterns are converted from the tmLanguage file. -// ANY CHANGES MADE HERE SHOULD BE PORTED TO THAT FILE AS WELL -// Copy the patterns (the contents of the repository group) over and apply the following find and replace patterns: - -// find: ^( +)"(\w+?)(?:[\-_](\w+?))?(?:[\-_](\w+?))?(?:[\-_](\w+?))?": \{$\n((?:^.*$\n)+?)^\1\},? -// replace with: const \L$2\u$3\u$4\u$5: TokenPattern = {\n$6}; - -// find: \{ "include": "#?(\w+?)(?:[\-_](\w+?))?(?:[\-_](\w+?))?(?:[\-_](\w+?))?" \} -// find: \{ "include": "([\w\.]+)#?(\w+?)(?:[\-_](\w+?))?(?:[\-_](\w+?))?(?:[\-_](\w+?))?" \} -// replace with: \L$1\u$2\u$3\u$4 - -// find: (?<=^ *|\{ )"comment": "(.*?)"(?=,$| \}),? -// replace with: // $1 - -// find: (?<=^ *|\{ )"name": "(.*?)"(?=,$| \}) -// replace with: token: "$1" - -// find: (?<=^ *|\{ )"contentName": "(.*?)"(?=,$| \}) -// replace with: contentToken: "$1" - -// find: (?<=^ *|\{ )"(.*?)"(?=: [{["]) -// replace with: $1 - -// find: (?<=(?:^ *|\{ )(?:match|begin|end): /.*?)\\\\(?=.*?/dg,?$) -// replace with: \ - -// find: (?<=(?:^ *|\{ )(?:match|begin|end): )"(.*?)"(?=,?$) -// replace with: /$1/dg - -// Result should be manually fixed -// Make sure to include this in internal captures to detect all newline tokens - -const lineContinuationPattern = /^(?=(?!\1)[ \t]*[^\s#]|\1[^\s#])|\Z/gm; - -export const basePatterns: TokenPattern = { - debugName: "basePatterns", - - patterns: [statements, expressions], -}; - -const literal: TokenPattern = { - debugName: "literal", - - patterns: [ - { - // Python literals, - token: LiteralTokenType.Boolean, - match: /\b(? { + if (obj === undefined) return undefined; + if (obj === null) return null; + return { ...obj }; +}; + +const cloneCache = (obj: Array): Array => { + const clone = new Array(obj.length); + for (let i = 0; i < obj.length; ++i) { + clone[i] = cloneScanResult(obj[i]); + } + return clone; +}; + +interface MatchScanResult { + pattern: ExTokenPattern; + matchBegin: RegExpExecArray; + matchEnd?: never; + expanded?: never; + contentMatches?: never; + source?: never; +} +interface RangeScanResult { + pattern: ExTokenPattern; + matchBegin: RegExpExecArray; + matchEnd: RegExpExecArray | null; + expanded: boolean; + contentMatches: Stack | null; + source: string; +} +type ScanResult = MatchScanResult | RangeScanResult | null; +type TokenCache = { readonly documentVersion: number; readonly tokens: TokenTree }; const tokenCache = new Map(); const runBenchmark = false; let uniquePatternCount = -1; -export function tokenizeDocument(document: TextDocument): Token[] { +export function tokenizeDocument(document: TextDocument): TokenTree { setupAndValidatePatterns(); - if (runBenchmark) benchmark(document); + if (runBenchmark) { + benchmark(document); + } const cachedTokens = tokenCache.get(document.uri); if (cachedTokens?.documentVersion === document.version) { @@ -29,9 +60,8 @@ export function tokenizeDocument(document: TextDocument): Token[] { console.log(`Running tokenizer on document: ${document.fileName}`); const tokenizer = new DocumentTokenizer(document); console.log(`Tokenizer completed!`); - const tokens = tokenizer.tokens.toArray(); - tokenCache.set(document.uri, { documentVersion: document.version, tokens: tokens }); - return tokens; + tokenCache.set(document.uri, { documentVersion: document.version, tokens: tokenizer.tokens }); + return tokenizer.tokens; } export function clearTokenCache() { @@ -86,9 +116,10 @@ function setupAndValidatePatterns() { uniquePatternCount = 0; const stack = new Stack(32); - stack.push(basePatterns as ExTokenRepoPattern); + stack.push(RenpyPatterns.basePatterns as ExTokenRepoPattern); const mFlagRe = /(? = new Vector(16384); + public readonly tokens: TokenTree = new TokenTree(); + private readonly document: TextDocument; constructor(document: TextDocument) { + this.document = document; const text = document.getText(); - const carret = new TokenPosition(0, 0, 0); - this.executePattern(basePatterns as ExTokenRepoPattern, text, carret); + this.executePattern(RenpyPatterns.basePatterns as ExTokenRepoPattern, text, new Range(0, text.length), this.tokens.root); + } + + private checkTokenTreeCoverage(root: TreeNode, matchRange: Range): { valid: boolean; gaps: Range[] } { + // Collect all token ranges + const tokenRanges = new Vector(root.count()); + if (root.token) { + tokenRanges.pushBack(root.token.getRange()); + } + root.forEach((node) => { + if (node.token) { + tokenRanges.pushBack(node.token.getRange()); + } + }); + + // Sort the token ranges by their start position + tokenRanges.sort((a, b) => a.start - b.start); + + // Check if the combined ranges of all tokens overlap the entire character range of the match + let currentEnd = matchRange.start; + const gaps: Range[] = []; + for (const range of tokenRanges) { + if (!matchRange.contains(range.start)) { + // The start of the next token range is outside the match range + return { valid: false, gaps }; + } + if (range.start > currentEnd) { + // There is a gap between the current end position and the start of the next token range + gaps.push(new Range(currentEnd, range.start)); + } + currentEnd = Math.max(currentEnd, range.end); + } + if (currentEnd < matchRange.end) { + // The last token range does not extend to the end of the match + gaps.push(new Range(currentEnd, matchRange.end)); + } + return { valid: gaps.length === 0, gaps }; } /** @@ -190,159 +272,195 @@ class DocumentTokenizer { * @param match The match to apply the captures on * @param caret The reader head position within the document */ - private applyCaptures(captures: TokenPatternCapture, match: RegExpExecArray, caret: TokenPosition) { - // TODO: Match 0 is like a second iteration on the previously matched text. - // What needs to happen is that all matches from the first iteration are merged with the matches from the second iteration. - const originalCaret = caret.clone(); + private applyCaptures(captures: TokenPatternCapture, match: RegExpExecArray, source: string, parentNode: TreeNode) { + let rootNode = parentNode; - let lastMatchEnd = match.index; - for (let i = 1; i < match.indices!.length; i++) { - if (match.indices![i] === undefined) continue; // If the object at i is undefined, the capture is empty + if (captures[0] !== undefined) { + // If capture 0 is used, treat it as a wrapper token. + rootNode = new TreeNode(); + parentNode.addChild(rootNode); + } - if (captures[i] === undefined) { - console.warn(`There is no pattern defined for capture group '${i}', on a pattern that matched '${match[i]}' near L:${caret.line + 1} C:${caret.character + 1}.\nThis should probably be added or be a non-capturing group.`); - continue; + for (let i = 1; i < match.indices!.length; i++) { + if (match.indices![i] === undefined) { + continue; // If the object at i is undefined, the capture is empty } - const p = captures[i]; - const content = match[i]; - - // Update the position carets const [startPos, endPos] = match.indices![i]; - // Check for missing characters in a match - const matchOffset = startPos - lastMatchEnd; - if (matchOffset !== 0) { - // TODO: Fix match 0 pattern capture to include the missing tokens - /*console.warn( - `A capture was misaligned (expected: ${startPos}, got: ${lastMatchEnd}) on a pattern that matched '${content}' near L:${caret.line + 1} C:${ - caret.character + 1 - }.\nYou should probably update the pattern to capture everything.\nApplying a fix...` - );*/ - caret.advance(matchOffset); + if (captures[i] === undefined) { + const pos = this.positionAt(startPos); + console.warn(`There is no pattern defined for capture group '${i}', on a pattern that matched '${match[i]}' near L:${pos.line + 1} C:${pos.character + 1}.\nThis should probably be added or be a non-capturing group.`); + continue; } - lastMatchEnd = endPos; - - const startCaret = caret.clone(); - const endCaret = caret.clone(); - endCaret.advance(content.length); // Move caret to end of the current match + const p = captures[i]; + const captureNode = new TreeNode(); if (p.token) { - if (p.token === CharacterTokenType.NewLine) endCaret.nextLine(); - this.tokens.pushBack(new Token(p.token, startCaret, endCaret)); + captureNode.token = new Token(p.token, this.positionAt(startPos), this.positionAt(endPos)); } if (p.patterns) { - const captureCaret = startCaret.clone(); - this.executePattern(p as ExTokenRepoPattern, content, captureCaret); - - assert(captureCaret.charStartOffset === endCaret.charStartOffset, "The token read position was misaligned by the capture context!"); - - if (captureCaret.line !== endCaret.line) { - // Note: Moving the endCaret will also move the token, since this is a reference object - endCaret.setValue(captureCaret); - } + this.executePattern(p as ExTokenRepoPattern, source, new Range(startPos, endPos), captureNode); } - caret.setValue(endCaret); + if (!captureNode.isEmpty()) { + rootNode.addChild(captureNode); + } } - // TODO: This also gets misaligned if the whole match is a token and contains additional captures - // TODO: The system should be updated to build a token list/tree. When that's done we can simply compare and merge the tokens instead of this hack. - // Special case for captures[0] which is the entire match + if (captures[0] !== undefined) { const p = captures[0]; const content = match[0]; - const startCaret = originalCaret.clone(); - const endCaret = originalCaret.clone(); - endCaret.advance(content.length); // Move caret to end of the current match + const startPos = match.index; + const endPos = startPos + content.length; if (p.token) { - if (p.token === CharacterTokenType.NewLine) endCaret.nextLine(); - this.tokens.pushBack(new Token(p.token, startCaret, endCaret)); + rootNode.token = new Token(p.token, this.positionAt(startPos), this.positionAt(endPos)); } if (p.patterns) { - const captureCaret = startCaret.clone(); - this.executePattern(p as ExTokenRepoPattern, content, captureCaret); - - assert(captureCaret.charStartOffset === endCaret.charStartOffset, "The token read position was misaligned by the capture context!"); + const captureNode = new TreeNode(); + rootNode.addChild(captureNode); - if (captureCaret.line !== endCaret.line) { - // Note: Moving the endCaret will also move the token, since this is a reference object - endCaret.setValue(captureCaret); - } + this.executePattern(p as ExTokenRepoPattern, source, new Range(startPos, endPos), captureNode); } - - // TODO: For now assume that having the 0 capture, means all characters have tokens assigned - caret.setValue(endCaret); } } - private scanMatchPattern(pattern: ExTokenMatchPattern, text: string, matchOffsetStart: number, cache: Array): ScanResult { + private scanMatchPattern(pattern: ExTokenMatchPattern, source: string, sourceStartOffset: number): MatchScanResult | null { const re = pattern.match; - re.lastIndex = matchOffsetStart; - const match = re.exec(text); + re.lastIndex = sourceStartOffset; + const match = re.exec(source); if (match) { - const result = { pattern: pattern, matchBegin: match }; - cache[pattern._patternId] = result; + const result = { pattern, matchBegin: match }; return result; } - cache[pattern._patternId] = null; return null; } - private scanRangePattern(next: ExTokenRangePattern, text: string, matchOffsetStart: number, cache: Array): ScanResult { - const reBegin = next.begin; - reBegin.lastIndex = matchOffsetStart; - const matchBegin = reBegin.exec(text); + private scanRangePattern(pattern: ExTokenRangePattern, source: string, sourceStartOffset: number): RangeScanResult | null { + const reBegin = pattern.begin; + reBegin.lastIndex = sourceStartOffset; + const matchBegin = reBegin.exec(source); if (matchBegin) { - let reEnd = next.end; + return { pattern, matchBegin: matchBegin, matchEnd: null, expanded: false, contentMatches: null, source }; + } - // Replace all back references in end source - if (next._hasBackref) { - let reEndSource = next.end.source; + return null; + } - this.backrefReplaceRe.lastIndex = 0; - reEndSource = reEndSource.replace(this.backrefReplaceRe, (_, g1) => { - const content = matchBegin.at(parseInt(g1, 10)); - if (content !== undefined) return escapeRegExpCharacters(content); - return ""; - }); + private expandRangeScanResult(result: RangeScanResult, cache: Array) { + const p = result.pattern as ExTokenRangePattern; + const matchBegin = result.matchBegin; - reEnd = new RegExp(reEndSource, next.end.flags); - } + let reEnd = p.end; + + // Replace all back references in end source + if (p._hasBackref) { + let reEndSource = p.end.source; - // Start end pattern after the last matched character in the begin pattern - reEnd.lastIndex = matchBegin.index + matchBegin[0].length; - const matchEnd = reEnd.exec(text); + this.backrefReplaceRe.lastIndex = 0; + reEndSource = reEndSource.replace(this.backrefReplaceRe, (_, g1) => { + const backref = matchBegin.at(parseInt(g1, 10)); + if (backref !== undefined) { + return escapeRegExpCharacters(backref); + } + return ""; + }); - if (matchEnd) { - const result = { pattern: next, matchBegin: matchBegin, matchEnd: matchEnd }; - cache[next._patternId] = result; - return result; + reEnd = new RegExp(reEndSource, p.end.flags); + } + + // Start end pattern after the last matched character in the begin pattern + reEnd.lastIndex = matchBegin.index + matchBegin[0].length; + let matchEnd = reEnd.exec(result.source); + const contentMatches = new Stack(); + + if (matchEnd) { + // Check if any child pattern has content that would extend the currently determined end match + if (p._patternsRepo) { + const contentStartIndex = matchBegin.index + matchBegin[0].length; + const contentEndIndex = matchEnd.index; + const lastMatchedChar = matchEnd.index + matchEnd[0].length; + + // Scan the content for any matches that would extend beyond the current end match + const tempCache = cloneCache(cache); + //const tempCache = new Array(uniquePatternCount).fill(undefined); + + for (let lastMatchIndex = contentStartIndex; lastMatchIndex < contentEndIndex; ) { + const bestChildMatch = this.scanPattern(p._patternsRepo, result.source, lastMatchIndex, tempCache); + if (!bestChildMatch) { + break; // No more matches + } + + // Update the last match index to the end of the child match, so the next scan starts after it + const childMatchBegin = bestChildMatch.matchBegin; + if (bestChildMatch.pattern._patternType === TokenPatternType.RangePattern) { + const childMatchEnd = bestChildMatch.matchEnd!; + lastMatchIndex = childMatchEnd.index + childMatchEnd[0].length; + } else { + lastMatchIndex = childMatchBegin.index + childMatchBegin[0].length; + } + + // Check if the match starts after the currently determined end match start, if so we ignore it + if (childMatchBegin.index >= contentEndIndex) { + continue; + } + + // To speed up the search, we can add any tokens that are within the content range + contentMatches.push(bestChildMatch); + + // If the child match last char doesn't extend the current range, we can also ignore it + if (lastMatchIndex <= lastMatchedChar) { + continue; + } + + // The child match is outside the range, so we should find a new end match + reEnd.lastIndex = lastMatchIndex; + matchEnd = reEnd.exec(result.source); + + // If no end match could be found, assume the whole pattern is invalid + if (!matchEnd) { + break; + } + } } } - cache[next._patternId] = null; - return null; + if (!matchEnd) { + // If no end match could be found, we'll need to expand the range to the end of the source + const reLastChar = /$(?!\r\n|\r|\n)/g; + reLastChar.lastIndex = Math.max(0, result.source.length - 1); + matchEnd = reLastChar.exec(result.source); + } + + result.matchEnd = matchEnd; + result.contentMatches = contentMatches; + result.expanded = true; } /** * Scans the text for the best matching pattern. * @param p The pattern to use for matches - * @param text The text to match on - * @param matchOffsetStart The character offset in 'text' to start the match at. + * @param source The text to match on + * @param sourceStartOffset The character offset in 'text' to start the match at. */ - public scanPattern(p: ExTokenRepoPattern, text: string, matchOffsetStart: number, cache: Array): ScanResult { - if (p.patterns.length === 0) return null; + public scanPattern(p: ExTokenRepoPattern, source: string, sourceStartOffset: number, cache: Array): ScanResult { + if (p.patterns.length === 0) { + return null; + } const cachedP = cache[p._patternId]; if (cachedP !== undefined) { // If the cached value is null, no match was found in the entire text - if (cachedP === null || cachedP.matchBegin.index >= matchOffsetStart) { + if (cachedP === null || cachedP.matchBegin.index >= sourceStartOffset) { + if (cachedP?.pattern._patternType === TokenPatternType.RangePattern && !cachedP.expanded) { + this.expandRangeScanResult(cachedP as RangeScanResult, cache); + } return cachedP; } } @@ -362,28 +480,34 @@ class DocumentTokenizer { const cachedResult = cache[next._patternId]; if (cachedResult !== undefined) { // If the cached value is null, no match was found in the entire text - if (cachedResult === null) continue; - if (cachedResult.matchBegin.index >= matchOffsetStart) { + if (cachedResult === null) { + continue; + } + + if (cachedResult.matchBegin.index >= sourceStartOffset) { scanResult = cachedResult; } } + // The result wasn't cached or was invalidated, so we need to scan for the next match if (scanResult === null) { switch (next._patternType) { case TokenPatternType.MatchPattern: - scanResult = this.scanMatchPattern(next, text, matchOffsetStart, cache); + scanResult = this.scanMatchPattern(next, source, sourceStartOffset); break; case TokenPatternType.RangePattern: - scanResult = this.scanRangePattern(next, text, matchOffsetStart, cache); + scanResult = this.scanRangePattern(next, source, sourceStartOffset); break; case TokenPatternType.RepoPattern: - scanResult = this.scanPattern(next, text, matchOffsetStart, cache); - cache[next._patternId] = scanResult; + scanResult = this.scanPattern(next, source, sourceStartOffset, cache); break; default: assert(false, "Invalid TokenPatternType found! If this triggers, setupAndValidatePatterns() didn't assign the PatternStateProperties properly."); break; } + + // Cache the result + cache[next._patternId] = scanResult; } if (!scanResult) continue; @@ -398,195 +522,186 @@ class DocumentTokenizer { bestResult = scanResult; // If true, this match is valid at the first possible location. No need to check further. - if (bestMatchRating === matchOffsetStart) { + if (bestMatchRating === sourceStartOffset) { break; } } + cache[p._patternId] = bestResult; + + if (bestResult?.pattern._patternType === TokenPatternType.RangePattern && !bestResult.expanded) { + this.expandRangeScanResult(bestResult as RangeScanResult, cache); + } + return bestResult; } + private executeRangePattern(bestMatch: ScanResult, source: string, parentNode: TreeNode) { + if (!bestMatch) { + return; + } + assert(bestMatch.expanded, "A range pattern should always be expanded on execute."); + + const p = bestMatch.pattern as ExTokenRangePattern; + const matchBegin = bestMatch.matchBegin; + const matchEnd = bestMatch.matchEnd; + + const startPos = matchBegin.index; + const endPos = matchEnd!.index + matchEnd![0].length; + const contentStart = matchBegin.index + matchBegin[0].length; + const contentEnd = matchEnd!.index; + + // p.token matches the whole range including the begin and end match content + const rangeNode = new TreeNode(); + if (p.token) { + rangeNode.token = new Token(p.token, this.positionAt(startPos), this.positionAt(endPos)); + } + // Begin captures are only applied to beginMatch[0] content + if (p.beginCaptures) { + this.applyCaptures(p.beginCaptures, matchBegin, source, rangeNode); + } + + // Add an additional node for the content of the range pattern, since the content can be wrapped by an additional token + const contentNode = new TreeNode(); + + // p.contentToken matches the range 'between'; after the end of beginMatch and before the start of endMatch + if (p.contentToken) { + contentNode.token = new Token(p.contentToken, this.positionAt(contentStart), this.positionAt(contentEnd)); + } + + // Patterns are only applied on 'content' (see p.contentToken above) + if (p._patternsRepo) { + /*while (!bestMatch.contentMatches!.isEmpty()) { + const contentScanResult = bestMatch.contentMatches!.pop()!; + this.applyScanResult(contentScanResult, source, contentNode); + }*/ + + this.executePattern(p._patternsRepo, source, new Range(contentStart, matchEnd!.index), contentNode); + } + + if (!contentNode.isEmpty()) { + rangeNode.addChild(contentNode); + } + + // End captures are only applied to endMatch[0] content + if (p.endCaptures) { + this.applyCaptures(p.endCaptures, matchEnd!, source, rangeNode); + } + + //assert(!rangeNode.isEmpty(), "A RangePattern must produce a valid token tree!"); + + const coverageResult = this.checkTokenTreeCoverage(rangeNode, new Range(startPos, endPos)); + if (!coverageResult.valid) { + console.warn(`The token tree is not covering the entire match range!`); + for (const gap of coverageResult.gaps) { + const gapStartPos = this.document.positionAt(gap.start); + const gapEndPos = this.document.positionAt(gap.end); + const text = this.document.getText(new VSRange(gapStartPos, gapEndPos)); + console.warn(`Gap from L${gapStartPos.line + 1}:${gapStartPos.character + 1} to L${gapEndPos.line + 1}:${gapEndPos.character + 1}, Text: '${text}'`); + } + } + + parentNode.addChild(rangeNode); + } + + private executeMatchPattern(bestMatch: MatchScanResult, source: string, parentNode: TreeNode) { + const p = bestMatch.pattern as ExTokenMatchPattern; + const match = bestMatch.matchBegin; + + const contentNode = new TreeNode(); + const startPos = match.index; + const endPos = startPos + match[0].length; + + if (p.token) { + contentNode.token = new Token(p.token, this.positionAt(startPos), this.positionAt(endPos)); + } + + if (p.captures) { + this.applyCaptures(p.captures, match, source, contentNode); + } + + const coverageResult = this.checkTokenTreeCoverage(contentNode, new Range(startPos, endPos)); + if (!coverageResult.valid) { + console.warn(`The token tree is not covering the entire match range!`); + for (const gap of coverageResult.gaps) { + const gapStartPos = this.document.positionAt(gap.start); + const gapEndPos = this.document.positionAt(gap.end); + const text = this.document.getText(new VSRange(gapStartPos, gapEndPos)); + console.warn(`Gap from L${gapStartPos.line + 1}:${gapStartPos.character + 1} to L${gapEndPos.line + 1}:${gapEndPos.character + 1}, Text: '${text}'`); + } + } + + assert(p.token || p.captures, "A MatchPattern must have either a token or captures!"); + assert(!contentNode.isEmpty(), "A MatchPattern must produce a valid token tree!"); + + parentNode.addChild(contentNode); + } + + private applyScanResult(bestMatch: ScanResult, source: string, parentNode: TreeNode) { + const p = bestMatch!.pattern; + switch (p._patternType) { + case TokenPatternType.RangePattern: + this.executeRangePattern(bestMatch as RangeScanResult, source, parentNode); + break; + case TokenPatternType.MatchPattern: + this.executeMatchPattern(bestMatch as MatchScanResult, source, parentNode); + break; + default: + assert(false, "Should not get here!"); + break; + } + } + /** * Executes the pattern on 'text', adding tokens to the token list. * @param pattern The repo pattern to use for matches. - * @param text The text to match on. + * @param source The text to match on. * @param caret The location of the reader head * @returns True if the pattern was matched * @todo Timeout after it was running too long */ - public executePattern(pattern: ExTokenRepoPattern, text: string, caret: TokenPosition) { + public executePattern(pattern: ExTokenRepoPattern, source: string, sourceRange: Range, parentNode: TreeNode) { + if (source.length === 0) { + return; + } + const cache = new Array(uniquePatternCount).fill(undefined); - const initialCharOffset = caret.charStartOffset; - const lastCharIndex = text.length; + const lastCharIndex = sourceRange.end; - for (let lastMatchIndex = 0; lastMatchIndex < lastCharIndex; ) { - const bestMatch = this.scanPattern(pattern, text, lastMatchIndex, cache); + let lastMatchIndex = sourceRange.start; + while (lastMatchIndex < lastCharIndex) { + const bestMatch = this.scanPattern(pattern, source, lastMatchIndex, cache); - if (bestMatch === null) { + if (bestMatch === null || bestMatch.matchBegin.index >= lastCharIndex) { // No match was found in the remaining text. Break the loop - caret.advance(lastCharIndex - lastMatchIndex); lastMatchIndex = lastCharIndex; continue; } + const failSafeIndex = lastMatchIndex; // Debug index to break in case of an infinite loop - const p = bestMatch.pattern; - switch (p._patternType) { - case TokenPatternType.RangePattern: - { - const matchBegin = bestMatch.matchBegin; - const matchEnd = bestMatch.matchEnd!; - lastMatchIndex = matchEnd.index + matchEnd[0].length; - const contentLength = matchEnd.index - (matchBegin.index + matchBegin[0].length); - - // Check for missing characters in a match - const matchOffset = initialCharOffset + matchBegin.index - caret.charStartOffset; - if (matchOffset !== 0) { - /*console.warn( - `A range begin match was misaligned (expected: ${initialCharOffset + matchBegin.index}, got: ${caret.charStartOffset}) on pattern '${p.begin.source}' that matched '${matchBegin[0]}' near L:${caret.line + 1} C:${ - caret.character + 1 - }.\nYou probably didn't catch all characters in the match or the match before this one.\nApplying a fix...`; - caret.advance(matchOffset); - );*/ - } - - const startCaret = caret.clone(); - - const contentStartCaret = startCaret.clone(); - contentStartCaret.advance(matchBegin[0].length); // Move caret to end of beginMatch - - const contentEndCaret = contentStartCaret.clone(); - contentEndCaret.advance(contentLength); // Move caret to end of content - - const endCaret = contentEndCaret.clone(); - endCaret.advance(matchEnd[0].length); // Move caret to end of match - - // p.token matches the whole range including the begin and end match content - if (p.token) { - this.tokens.pushBack(new Token(p.token, startCaret, endCaret)); - } - // Begin captures are only applied to beginMatch[0] content - if (p.beginCaptures) { - const captureCaret = startCaret.clone(); - this.applyCaptures(p.beginCaptures, matchBegin, captureCaret); - - assert( - captureCaret.charStartOffset === contentStartCaret.charStartOffset, - "The token read position was misaligned by the capture context! This means {p.beginCaptures} is not processing white spaces and new lines (individually!)." - ); - - if (captureCaret.line !== endCaret.line) { - // Line was moved, all characters should reset to 0 and move by content length - contentStartCaret.setValue(captureCaret); - - contentEndCaret.setValue(contentStartCaret); - contentEndCaret.advance(contentLength); // Move caret to end of content - - // Note: Moving the endCaret will also move the token, since this is a reference object - endCaret.setValue(contentEndCaret); - endCaret.advance(matchEnd[0].length); // Move caret to end of match - } - } - - // p.contentToken matches the range 'between'; after the end of beginMatch and before the start of endMatch - if (p.contentToken) { - this.tokens.pushBack(new Token(p.contentToken, contentStartCaret, contentEndCaret)); - } - - // Patterns are only applied on 'content' (see p.contentToken above) - if (p._patternsRepo) { - const captureCaret = contentStartCaret.clone(); - const content = text.substring(matchBegin.index + matchBegin[0].length, matchEnd.index); - this.executePattern(p._patternsRepo, content, captureCaret); - - assert( - captureCaret.charStartOffset === contentEndCaret.charStartOffset, - "The token read position was misaligned by the capture context! This means {p.patterns} is not processing white spaces and new lines (individually!)." - ); - - if (captureCaret.line !== endCaret.line) { - // Line was moved, all characters should reset to 0 and move by content length - contentEndCaret.setValue(captureCaret); - - // Note: Moving the endCaret will also move the token, since this is a reference object - endCaret.setValue(contentEndCaret); - endCaret.advance(matchEnd[0].length); // Move caret to end of match - } - } - - // End captures are only applied to endMatch[0] content - if (p.endCaptures) { - const captureCaret = contentEndCaret.clone(); - this.applyCaptures(p.endCaptures, matchEnd, captureCaret); - - assert( - captureCaret.charStartOffset === endCaret.charStartOffset, - "The token read position was misaligned by the capture context! This means {p.endCaptures} is not processing white spaces and new lines (individually!)." - ); - - if (captureCaret.line !== endCaret.line) { - // Line was moved, all characters should reset to 0 and move by content length - // Note: Moving the endCaret will also move the token, since this is a reference object - endCaret.setValue(captureCaret); - } - } - - caret.setValue(endCaret); - } - break; - case TokenPatternType.MatchPattern: - { - const match = bestMatch.matchBegin; - lastMatchIndex = match.index + match[0].length; - - // Check for missing characters in a match - const matchOffset = initialCharOffset + match.index - caret.charStartOffset; - if (matchOffset !== 0) { - /*console.warn( - `A match was misaligned (expected: ${initialCharOffset + match.index}, got: ${caret.charStartOffset}) on pattern '${p.match.source}' that matched '${match[0]}' near L:${caret.line + 1} C:${ - caret.character + 1 - }.\nYou probably didn't catch all characters in the match or the match before this one.\nApplying a fix...` - );*/ - caret.advance(matchOffset); - } - - const startCaret = caret.clone(); - - const endCaret = startCaret.clone(); - endCaret.advance(match[0].length); // Move carret to end of match - - if (p.token) { - if (p.token === CharacterTokenType.NewLine) endCaret.nextLine(); - - this.tokens.pushBack(new Token(p.token, startCaret, endCaret)); - } - - if (p.captures) { - const captureCaret = startCaret.clone(); - this.applyCaptures(p.captures, match, captureCaret); - - assert(captureCaret.charStartOffset === endCaret.charStartOffset, "The token read position was misaligned by the capture context!"); - - // Note: Moving the endCaret will also move the token, since this is a reference object - if (captureCaret.line !== endCaret.line) { - endCaret.setValue(captureCaret); - } - } - - caret.setValue(endCaret); - } - break; - default: - assert(false, "Should not get here!"); - break; + if (bestMatch.pattern._patternType === TokenPatternType.RangePattern) { + assert(bestMatch.expanded, "A RangePattern must be expanded!"); + const matchEnd = bestMatch.matchEnd!; + lastMatchIndex = matchEnd.index + matchEnd[0].length; + } else { + const matchBegin = bestMatch.matchBegin; + lastMatchIndex = matchBegin.index + matchBegin[0].length; } + this.applyScanResult(bestMatch, source, parentNode); + if (failSafeIndex === lastMatchIndex) { console.error("The loop has not advanced since the last cycle. This indicates a programming error. Breaking the loop!"); break; } } } + + public positionAt(offset: number): TokenPosition { + const pos = this.document.positionAt(offset); + return new TokenPosition(pos.line, pos.character, offset); + } } // eslint-disable-next-line no-shadow diff --git a/src/utilities/vector.ts b/src/utilities/vector.ts index 158aa995..7182e8ef 100644 --- a/src/utilities/vector.ts +++ b/src/utilities/vector.ts @@ -50,6 +50,17 @@ export class Vector implements Iterable { } } + /** + * Sort the vector using the specified comparison function + * @param compareFn The comparison function to use + */ + public sort(compareFn: (a: T, b: T) => number) { + this.buffer.sort((a, b) => { + if (a === null || b === null) return 0; + return compareFn(a, b); + }); + } + /** * Get the item at the end of the vector, and remove it from the vector * @returns The item at the end @@ -135,6 +146,12 @@ export class Vector implements Iterable { this.buffer[elementIndexA] = temp; } + public forEach(callback: (item: T) => void) { + for (let i = 0; i < this.itemCount; ++i) { + callback(this.buffer[i] as T); + } + } + /** * Swap the item at the specified index with the item at the back of the vector * @param index The index of the item to swap to the back diff --git a/syntax-to-token-pattern.py b/syntax-to-token-pattern.py index 56719d0f..7fd47f30 100644 --- a/syntax-to-token-pattern.py +++ b/syntax-to-token-pattern.py @@ -1,18 +1,17 @@ +from datetime import datetime import json import re from typing import Any -PATTERN_PREFIX = "python#" +from dataclasses import dataclass, field -# load the input data from the file -with open("./syntaxes/renpy.python.tmLanguage.json", "r") as file: - data = json.load(file) - -# get the repository value -repository = data.get("repository", {}) - -# Create an empty list to store the typescript strings -typescript_entries: list[str] = [] +@dataclass +class GeneratorState: + defined_variables: list[str] = field(default_factory=list[str]) + used_token_types: list[str] = field(default_factory=list[str]) + pattern_include_entries: list[str] = field(default_factory=list[str]) + external_pattern_include_entries: list[str] = field(default_factory=list[str]) + source_imports: list[str] = field(default_factory=list[str]) def get_indent(indent: int) -> str: return " " * indent @@ -21,48 +20,375 @@ def camelCase(st: str): output = ''.join(x for x in st.title() if x.isalnum()) return output[0].lower() + output[1:] -def get_token_type(name: str) -> str: - if "invalid." in name: - return "MetaTokenType.Invalid" - elif "storage.type.string." in name: - return "LiteralTokenType.String" - - tokenPrefix = "" - token = name.replace(".python", "") - - if "meta." in token: - tokenPrefix = "MetaTokenType." - token = token.replace("meta.", "") - elif "keyword." in token: - tokenPrefix = "KeywordTokenType." - token = token.replace("keyword.", "") - elif "entity." in token: - tokenPrefix = "EntityTokenType." - token = token.replace("entity.", "") +def titleCase(st: str): + return ''.join(x for x in st.title() if x.isalnum()) + +def convert_token_type_split(name: str) -> str: + token_parts = name.split(".") + if len(token_parts) <= 1: + return "Error" + + def get_part(index: int) -> str: + if index >= len(token_parts): + return "" + return token_parts[index] + + def get_parts(range: slice) -> str: + if range.start >= len(token_parts): + return "" + return ".".join(token_parts[range]) - return "MetaTokenType.Invalid" # tokenPrefix + camelCase(token) + if get_part(0) == "string": + if get_part(1) == "quoted" and get_part(2) == "docstring": + return "MetaTokenType.Docstring" + else: + return "LiteralTokenType.String" + + elif get_part(0) == "variable": + return "EntityTokenType.VariableName" + + elif get_part(0) == "storage": + if get_part(1) == "type": + if get_part(2) == "string": + return "MetaTokenType.StringStorageType" + elif get_part(2) == "format": + return "MetaTokenType.FormatStorageType" + elif get_part(2) == "class": + return "KeywordTokenType.Class" + elif get_part(2) == "imaginary": + return "MetaTokenType.ImaginaryNumberStorageType" + elif get_part(2) == "number": + return "MetaTokenType.NumberStorageType" + elif get_part(2) == "function": + if get_part(3) == "lambda": + return "KeywordTokenType.Lambda" + elif get_part(3) == "async": + return "KeywordTokenType.Async" + elif get_part(3) == "label": + return "KeywordTokenType.Label" + else: + return "KeywordTokenType.Def" + + elif get_part(1) == "modifier": + if get_part(2) == "declaration": + return "KeywordTokenType." + titleCase(get_parts(slice(3, -1))) + elif get_part(2) == "flag": + return "MetaTokenType.ModifierFlagStorageType" + + elif get_part(0) == "constant": + if get_part(1) == "numeric": + if get_part(2) == "integer": + return "LiteralTokenType.Integer" + elif get_part(2) == "float": + return "LiteralTokenType.Float" + elif get_part(2) == "boolean": + return "LiteralTokenType.Boolean" + elif get_part(2) == "character": + return "LiteralTokenType.Character" + elif get_part(2) == "escape": + return "LiteralTokenType.Escape" + else: + return "MetaTokenType.ConstantNumeric" + + elif get_part(1) == "language": + return "MetaTokenType.ConstantLiteral" + + elif get_part(1) == "color": + return "LiteralTokenType.Color" + + elif get_part(1) == "character": + if get_part(2) == "escape": + if get_part(3) == "python" or get_part(3) == "regexp": + return "MetaTokenType.EscapeSequence" + else: + return "EscapedCharacterTokenType.Esc" + titleCase(get_parts(slice(3, -2))) + + elif get_part(2) == "unicode": + return "MetaTokenType.EscapeSequence" + + elif get_part(2) == "set": + return "MetaTokenType.CharacterSet" + + elif get_part(2) == "format" and get_part(3) == "placeholder": + return "MetaTokenType.Placeholder" + + + elif get_part(1) == "other": + return "MetaTokenType.ConstantCaps" + + elif get_part(0) == "invalid": + if get_part(1) == "deprecated": + return "MetaTokenType.Deprecated" + else: + return "MetaTokenType.Invalid" + + elif get_part(0) == "punctuation": + if get_part(1) == "definition": + if get_part(2) == "tag" or get_part(2) == "dict" or get_part(2) == "inheritance": + if get_part(3) == "begin": + return "CharacterTokenType.OpenBracket" + elif get_part(3) == "end": + return "CharacterTokenType.CloseBracket" + elif get_part(3) == "region": + return "MetaTokenType.CommentRegionTag" + + elif get_part(2) == "list": + if get_part(3) == "begin": + return "CharacterTokenType.OpenSquareBracket" + elif get_part(3) == "end": + return "CharacterTokenType.CloseSquareBracket" + + elif get_part(2) == "arguments" or get_part(2) == "parameters": + if get_part(3) == "begin": + return "CharacterTokenType.OpenParentheses" + elif get_part(3) == "end": + return "CharacterTokenType.CloseParentheses" + + elif get_part(2) == "string": + if get_part(3) == "begin": + return "MetaTokenType.StringBegin" + elif get_part(3) == "end": + return "MetaTokenType.StringEnd" + + elif get_part(2) == "comment": + return "CharacterTokenType.Hashtag" + elif get_part(2) == "decorator": + return "CharacterTokenType.AtSymbol" + + elif get_part(1) == "parenthesis": + if get_part(2) == "begin": + return "CharacterTokenType.OpenParentheses" + elif get_part(2) == "end": + return "CharacterTokenType.CloseParentheses" + + elif get_part(1) == "bracket": + if get_part(2) == "begin": + return "CharacterTokenType.OpenBracket" + elif get_part(2) == "end": + return "CharacterTokenType.CloseBracket" + + elif get_part(1) == "square-bracket": + if get_part(2) == "begin": + return "CharacterTokenType.OpenSquareBracket" + elif get_part(2) == "end": + return "CharacterTokenType.CloseSquareBracket" + + elif get_part(1) == "section": + if (get_part(2) == "python" or get_part(2) =="block" or \ + get_part(2) == "class" or get_part(2) == "function" or \ + get_part(2) == "atl" or get_part(2) == "label" or \ + get_part(2) == "menu" or get_part(2) == "menu-option"): + if get_part(3) == "begin" or get_part(4) == "begin": + return "CharacterTokenType.Colon" + + elif get_part(1) == "separator": + if get_part(2) == "parameters" or get_part(2) == "arguments" or get_part(2) == "element" or get_part(2) == "inheritance": + return "CharacterTokenType.Comma" + elif get_part(2) == "dict" or get_part(2) == "annotation" or get_part(2) == "slice": + return "CharacterTokenType.Colon" + elif get_part(2) == "continuation": + return "CharacterTokenType.Backslash" + elif get_part(2) == "key-value": + return "CharacterTokenType.EqualsSymbol" + else: + return "CharacterTokenType." + titleCase(get_part(2)) + + elif get_part(1) == "character": + if get_part(2) == "set": + if get_part(3) == "begin": + return "CharacterTokenType.OpenSquareBracket" + elif get_part(3) == "end": + return "CharacterTokenType.CloseSquareBracket" + + elif get_part(1) == "comment": + if get_part(2) == "begin": + return "MetaTokenType.CommentBegin" + elif get_part(2) == "end": + return "MetaTokenType.CommentEnd" + + else: + return "CharacterTokenType." + titleCase(get_part(1)) + + elif get_part(0) == "support": + if get_part(1) == "type": + if get_part(2) == "property-name": + return "EntityTokenType.PropertyName" + elif get_part(2) == "class": + return "EntityTokenType.ClassName" + elif get_part(2) == "function": + return "EntityTokenType.FunctionName" + elif get_part(2) == "variable": + return "EntityTokenType.VariableName" + elif get_part(2) == "namespace": + return "EntityTokenType.NamespaceName" + elif get_part(2) == "metaclass": + return "KeywordTokenType.Metaclass" + elif get_part(2) == "exception": + return "MetaTokenType.BuiltinExceptionType" + else: + return "MetaTokenType.BuiltinType" + + elif get_part(1) == "variable": + return "EntityTokenType.VariableName" + + elif get_part(1) == "function": + if get_part(2) == "event": + return "EntityTokenType.EventName" + else: + return "EntityTokenType.FunctionName" + + elif get_part(1) == "other": + if get_part(2) == "match": + if get_part(3) == "any": + return "CharacterTokenType.Period" + elif get_part(3) == "begin": + return "CharacterTokenType.Caret" + elif get_part(3) == "end": + return "CharacterTokenType.DollarSymbol" + + elif get_part(2) == "escape": + return "MetaTokenType.EscapeSequence" + + elif get_part(0) == "comment": + if get_part(1) == "typehint": + return "MetaTokenType.Typehint" + titleCase(get_part(2)) + else: + return "MetaTokenType.Comment" + + elif get_part(0) == "keyword": + if get_part(1) == "operator": + if get_part(2) == "arithmetic": + if get_part(3) == "python" or get_part(3) == "renpy": + return "MetaTokenType.ArithmeticOperator" + else: + return "OperatorTokenType." + titleCase(get_part(3)) + elif get_part(2) == "logical": + return "MetaTokenType.LogicalOperatorKeyword" + elif get_part(2) == "bitwise": + return "MetaTokenType.BitwiseOperatorKeyword" + elif get_part(2) == "comparison": + return "MetaTokenType.ComparisonOperatorKeyword" + elif get_part(2) == "python": + return "MetaTokenType.Operator" + elif get_part(2) == "unpacking": + return "OperatorTokenType." + titleCase(get_part(2)) + else: + return "OperatorTokenType." + titleCase(get_parts(slice(2, -1))) + + elif get_part(1) == "codetag": + return "MetaTokenType.CommentCodeTag" + + elif get_part(1) == "control": + if get_part(2) == "flow": + if get_part(3) == "python" or get_part(3) == "renpy": # TODO + return "MetaTokenType.ControlFlowKeyword" + else: + return "KeywordTokenType." + titleCase(get_part(3)) + elif get_part(2) == "import": + return "KeywordTokenType.Import" + elif get_part(2) == "conditional": + return "KeywordTokenType.If" + + elif get_part(1) == "illegal" and get_part(2) == "name": + return "MetaTokenType.Invalid" + else: + return "KeywordTokenType." + titleCase(get_parts(slice(1, -1))) + + elif get_part(0) == "entity": + if get_part(1) == "name": + if get_part(2) == "type": + return "EntityTokenType." + titleCase(get_part(3)) + "Name" + else: + return "EntityTokenType." + titleCase(get_part(2)) + "Name" + + elif get_part(1) == "other": + if get_part(2) == "inherited-class": + return "EntityTokenType.InheritedClassName" + + elif get_part(0) == "meta": + if get_part(1) == "embedded": + if get_part(2) == "block": + return "MetaTokenType.PythonBlock" + elif get_part(2) == "line": + return "MetaTokenType.PythonLine" + + elif get_part(1) == "arguments" or get_part(2) == "arguments" or get_part(3) == "arguments": + return "MetaTokenType.Arguments" + + elif get_part(1) == "function-call": + if get_part(2) == "label": + return "MetaTokenType.LabelCall" + else: + return "MetaTokenType.FunctionCall" + + elif get_part(1) == "member": + if get_part(2) == "access": + if get_part(3) == "label": + return "MetaTokenType.LabelAccess" + else: + return "MetaTokenType.MemberAccess" + + elif get_part(1) == "string": + if get_part(2) == "tag": + return "MetaTokenType.StringTag" + elif get_part(2) == "character": + return "MetaTokenType.CharacterNameString" + + elif (get_part(1) == "class" or get_part(1) == "function") and get_part(2) != "inheritance": + return "MetaTokenType." + titleCase(get_part(1)) + "Definition" + + else: + return "MetaTokenType." + titleCase(get_parts(slice(1, -1))) + + return "Error" + " /*Error: Could not convert token type*/" + +def get_token_type(state: GeneratorState, name: str) -> str: + token = name.split(" ")[-1] # Multi-tokens are not yet supported. For now assume the last token is the important one + token = convert_token_type_split(token) + + import_token_type = token.split(".")[0] + if not import_token_type in state.used_token_types: + state.used_token_types.append(import_token_type) + + return token.replace("Atl", "ATL") # Upper case ATL def get_match_str(match: str, hasCaptures: bool) -> str: match = match.replace("/", "\\/") # Escape forward slashes + + iFlagSet = False + if "(?i)" in match: + iFlagSet = True + match = match.replace("(?i)", "") + + match = match.replace("[:alpha:]", "a-zA-Z") + match = match.replace("[:alnum:]", "a-zA-Z0-9") + match = match.replace("[:upper:]", "A-Z") + + iFlag: str = "i" if iFlagSet else "" mFlag: str = "m" if re.search("(? str: +def transform_captures(state: GeneratorState, indent: int, captures: dict[str, Any], access_str: str) -> str: typescript_entry = "{\n" indent += 4 for key, value in captures.items(): - typescript_entry += f"{get_indent(indent)}{key}: {transform_pattern(indent, value)},\n" + capture_access_str = f"{access_str}[{key}]" + typescript_entry += f"{get_indent(indent)}{key}: {transform_pattern(state, indent, value, capture_access_str)},\n" indent -= 4 typescript_entry += f"{get_indent(indent)}}},\n" return typescript_entry -def transform_pattern(indent: int, value: dict[str, Any]) -> str: +def transform_pattern(state: GeneratorState, indent: int, value: dict[str, Any], access_str: str) -> str: typescript_entry = "{\n" indent += 4 + # Add debugName for patterns with regex + if "match" in value or "begin" in value or "end" in value: + typescript_entry += f"{get_indent(indent)}debugName: \"{access_str}\",\n\n" + # Add comments if "comment" in value: comment = value["comment"].replace("\n", f"\n{get_indent(indent)}// ") @@ -71,13 +397,13 @@ def transform_pattern(indent: int, value: dict[str, Any]) -> str: # Add token type if "name" in value: name = value["name"] - token = get_token_type(name) - typescript_entry += f"{get_indent(indent)}token: {token}, // {name}\n" + token = get_token_type(state, name) + typescript_entry += f"{get_indent(indent)}token: {token}, /*{name}*/\n" if "contentName" in value: name = value["contentName"] - token = get_token_type(name) - typescript_entry += f"{get_indent(indent)}contentToken: {token}, // {name}\n" + token = get_token_type(state, name) + typescript_entry += f"{get_indent(indent)}contentToken: {token}, /*{name}*/\n" # Add match if "match" in value: @@ -87,7 +413,7 @@ def transform_pattern(indent: int, value: dict[str, Any]) -> str: # Iterate through the captures in the value if "captures" in value: typescript_entry += f"{get_indent(indent)}captures: " - typescript_entry += transform_captures(indent, value["captures"]) + typescript_entry += transform_captures(state, indent, value["captures"], f"{access_str}.captures!") if "begin" in value: match = get_match_str(value["begin"], "beginCaptures" in value) @@ -96,7 +422,7 @@ def transform_pattern(indent: int, value: dict[str, Any]) -> str: # Iterate through the beginCaptures in the value if "beginCaptures" in value: typescript_entry += f"{get_indent(indent)}beginCaptures: " - typescript_entry += transform_captures(indent, value["beginCaptures"]) + typescript_entry += transform_captures(state, indent, value["beginCaptures"], f"{access_str}.beginCaptures!") if "end" in value: match = get_match_str(value["end"], "endCaptures" in value) @@ -105,7 +431,7 @@ def transform_pattern(indent: int, value: dict[str, Any]) -> str: # Iterate through the endCaptures in the value if "endCaptures" in value: typescript_entry += f"{get_indent(indent)}endCaptures: " - typescript_entry += transform_captures(indent, value["endCaptures"]) + typescript_entry += transform_captures(state, indent, value["endCaptures"], f"{access_str}.endCaptures!") # Iterate through the patterns in the value if "patterns" in value: @@ -113,17 +439,85 @@ def transform_pattern(indent: int, value: dict[str, Any]) -> str: typescript_entry += f"{get_indent(indent)}patterns: [\n" indent += 4 + includes: list[tuple[str, int]] = [] + external_includes: list[tuple[str, int]] = [] + last_pattern_index = 0 + + # Handle includes first to make sure they are pushed in the correct order + for i in range(len(patterns)): + pattern = patterns[i] + + if "include" not in pattern: + last_pattern_index = i + continue + + include: str = pattern["include"] + + if include.startswith("source.renpy"): + include_parts = include.split("#") + + source = include_parts[0] + reference = include_parts[1] if len(include_parts) > 1 else None + + language = source.split(".")[-1] + language_accessor = titleCase(language) + "Patterns." + + if reference == None: + include = language_accessor + language + else: + include = language_accessor + camelCase(reference) + + if language not in state.source_imports: + state.source_imports.append(language) + + external_includes.append((include, i)) + else: + include = camelCase(include) + + # All includes that have not been defined yet, are pushed at the bottom of the file + if include not in state.defined_variables: + includes.append((include, i)) + else: + last_pattern_index = i + + # Add the includes to the list of includes + def process_includes(include_list: list[tuple[str, int]], entries_list: list[str]): + push_list: list[str] = [] + for i in range(len(include_list)): + [include, index] = include_list[i] + if index < last_pattern_index: # 0 < 0 + entries_list.append(f"{access_str}.patterns!.splice({index}, 0, {include});") + else: + push_list.append(include) + + if len(push_list) > 0: + entries_list.append(f"{access_str}.patterns!.push({', '.join(push_list)});") + + if len(includes) > 0: + process_includes(includes, state.pattern_include_entries) + last_pattern_index = includes[-1][1] + + if len(external_includes) > 0: + process_includes(external_includes, state.external_pattern_include_entries) + + # Now write the pattern source for i in range(len(patterns)): pattern = patterns[i] # Handle includes if "include" in pattern: - include = camelCase(PATTERN_PREFIX + pattern["include"]) - typescript_entry += f"{get_indent(indent)}{include},\n" + include: str = pattern["include"] + if include.startswith("source.renpy"): + continue + + include = camelCase(include) + if include in state.defined_variables: + typescript_entry += f"{get_indent(indent)}{include},\n" + continue typescript_entry += get_indent(indent) - typescript_entry += transform_pattern(indent, pattern) + typescript_entry += transform_pattern(state, indent, pattern, f"{access_str}.patterns![{i}]") typescript_entry += ",\n" indent -= 4 @@ -133,22 +527,109 @@ def transform_pattern(indent: int, value: dict[str, Any]) -> str: typescript_entry += f"{get_indent(indent)}}}" return typescript_entry - -# Iterate through the repository entries -for key, value in repository.items(): - patternName = camelCase(PATTERN_PREFIX + key) - typescript_entry = f"export const {patternName}: TokenPattern = " - - typescript_entry += transform_pattern(0, value) +def generate_file(state: GeneratorState, source_file: str, output_file: str): - typescript_entry += ";\n" - # Add the typescript entry to the list of entries - typescript_entries.append(typescript_entry) - -# Write the typescript entries to a file -with open("./src/tokenizer/generated.output.ts", "w") as file: - contents: str = "import { KeywordTokenType, LiteralTokenType, MetaTokenType } from \"./renpy-tokens\";\n" - contents += "import { TokenPattern } from \"./token-pattern-types\";\n\n" - contents += "\n".join(typescript_entries) - file.write(contents) + # load the input data from the file + with open(source_file, "r") as file: + data = json.load(file) + + # get the repository value + repository = data.get("repository", {}) + + # Iterate through the repository entries + src_lines: list[str] = [] + for key, value in repository.items(): + patternName = camelCase(key) + + # Keep track of the defined variables to reduce the amount of variables we need to push later + state.defined_variables.append(patternName) + + typescript_entry = f"export const {patternName}: TokenPattern = " + + typescript_entry += transform_pattern(state, 0, value, patternName) + + typescript_entry += ";\n" + + # Add the typescript entry to the list of entries + src_lines.append(typescript_entry) + + # Write the typescript entries to a file + with open(output_file, "w") as file: + eslint_comments: list[str] = [ + "/* eslint-disable no-useless-escape */", + "/* eslint-disable no-useless-backreference */", + "/* eslint-disable @typescript-eslint/no-non-null-assertion */", + ] + + contents: str = "\n".join(eslint_comments) + "\n\n" + contents += "// THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR\n" + contents += "// DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT.\n" + contents += "// ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED.\n" + contents += f"// Last generated: {datetime.utcnow().strftime('%d/%m/%Y %H:%M:%S')} (UTC+0)\n" + contents += "\n" + + contents += f"import {{ {', '.join(state.used_token_types)} }} from \"./renpy-tokens\";\n" + contents += "import { TokenPattern } from \"./token-pattern-types\";\n\n" + contents += "\n".join(src_lines) + + if len(state.pattern_include_entries) > 0: + contents += "\n// Push pattern references that were not defined on include\n" + contents += "\n".join(state.pattern_include_entries) + + # Remove any newlines from the body of a single line array + contents = re.sub(r':\s*\[\n\s*([^,]*),\n?\s*\]', r': [\1]', contents, flags=re.MULTILINE) + + # Remove any newlines from the body of a single line definition + contents = re.sub(r':\s*{\n\s*(.*)\n?\s*}', r': { \1 }', contents, flags=re.MULTILINE) + + file.write(contents) + +def generate_token_patterns(): + renpy_state = GeneratorState() + atl_state = GeneratorState() + python_state = GeneratorState() + + generate_file(renpy_state, "./syntaxes/renpy.tmLanguage.json", "./src/tokenizer/renpy-token-patterns.g.ts") + generate_file(atl_state, "./syntaxes/renpy.atl.tmLanguage.json", "./src/tokenizer/atl-token-patterns.g.ts") + generate_file(python_state, "./syntaxes/renpy.python.tmLanguage.json", "./src/tokenizer/python-token-patterns.g.ts") + + # Write the typescript entries to a file + output_file = "./src/tokenizer/token-patterns.g.ts" + with open(output_file, "w") as file: + contents = "/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\n" + contents += "// THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR\n" + contents += "// DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT.\n" + contents += "// ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED.\n" + contents += f"// Last generated: {datetime.utcnow().strftime('%d/%m/%Y %H:%M:%S')} (UTC+0)\n" + contents += "\n" + + # Add all source import from all states, but only the unique ones + source_imports = set(renpy_state.source_imports + atl_state.source_imports + python_state.source_imports) + + for source_import in source_imports: + contents += f"import * as {titleCase(source_import)}Patterns from \"./{source_import}-token-patterns.g\";\n" + + def add_entries(entries: list[str], prefix: str) -> str: + contents = "" + if len(entries) > 0: + contents += f"\n// Push all {prefix} external includes\n" + for entry in entries: + contents += f"{prefix}.{entry}\n" + + return contents + + contents += add_entries(renpy_state.external_pattern_include_entries, "RenpyPatterns") + contents += add_entries(atl_state.external_pattern_include_entries, "AtlPatterns") + contents += add_entries(python_state.external_pattern_include_entries, "PythonPatterns") + + exports: list[str] = [] + for source_import in source_imports: + exports.append(f"{titleCase(source_import)}Patterns") + + contents += f"\n\nexport {{ {', '.join(exports)} }};" + + file.write(contents) + +# main +generate_token_patterns() \ No newline at end of file diff --git a/syntaxes/renpy.atl.tmLanguage.json b/syntaxes/renpy.atl.tmLanguage.json new file mode 100644 index 00000000..c0e7ebd4 --- /dev/null +++ b/syntaxes/renpy.atl.tmLanguage.json @@ -0,0 +1,333 @@ +{ + "information_for_contributors": ["Please remeber to regenerate the ts token patterns using the 'syntax-to-token-pattern.py' python script"], + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "Ren'Py ATL", + "scopeName": "source.renpy.atl", + "patterns": [{ "include": "#atl" }], + "repository": { + "atl": { + "comment": "https://www.renpy.org/doc/html/atl.html#atl-syntax-and-semantics", + "patterns": [{ "include": "#atl-keywords" }, { "include": "#atl-blocks" }, { "include": "#atl-simple-expression" }, { "include": "#atl-warper" }, { "include": "#atl-event" }, { "include": "#atl-on" }, { "include": "#atl-function" }] + }, + "atl-build-in-properties": { + "comment": "https://www.renpy.org/doc/html/atl.html#list-of-transform-properties", + "patterns": [ + { + "comment": "Special manipulation keywords", + "match": "\\b(?>>|\\.\\.\\.)\\s)(?=\\s*\\S))", + "match": "(?:\\s*((?:>>>|\\.\\.\\.)\\s)(?=\\s*\\S))", "captures": { "1": { "name": "keyword.control.flow.python" } } @@ -190,8 +194,11 @@ "match": "\\b(?>=|//=|\\*\\*=|\\+=|-=|/=|@=|\\*=|%=|~=|\\^=|&=|\\|=|=(?!=)" }, "operator": { - "match": "\\b(?>|&|\\||\\^|~)(?#3)|(\\*\\*|\\*|\\+|-|%|//|/|@)(?#4)|(!=|==|>=|<=|<|>)(?#5)|(:=)(?#6)", + "match": "\\b(?>|&|\\||\\^|~)|(\\*\\*|\\*|\\+|-|%|//|/|@)|(!=|==|>=|<=|<|>)|(:=)", "captures": { "1": { "name": "keyword.operator.logical.python" }, "2": { "name": "keyword.control.flow.python" }, @@ -375,7 +383,6 @@ ] }, "number": { - "name": "constant.numeric.python", "patterns": [ { "include": "#number-float" }, { "include": "#number-dec" }, @@ -551,7 +558,7 @@ "name": "invalid.illegal.brace.python", "match": "(}(?!}))" }, - "import": { + "import-statement": { "comment": "Import statements used to correctly mark `from`, `import`, and `as`", "patterns": [ { @@ -754,7 +761,7 @@ }, "function-declaration": { "name": "meta.function.python", - "begin": "\\s*(?:\\b(async)\\s+)?\\b(def)\\s+(?=[[:alpha:]_][[:word:]]*\\s*\\()", + "begin": "\\s*(?:\\b(async)\\s+)?\\b(def)\\s+(?=\\w+\\s*\\()", "end": "(:|(?=[#'\"\\n]))", "beginCaptures": { "1": { "name": "storage.type.function.async.python" }, @@ -898,7 +905,7 @@ "decorator": { "name": "meta.function.decorator.python", "begin": "^\\s*((@))\\s*(?=[[:alpha:]_]\\w*)", - "end": "(\\))#trailingwhitespaceandcommentsarelegal(?:(.*?)(?=\\s*(?:\\#|$)))|(?=\\n|\\#)", + "end": "(\\))(?:(.*?)(?=\\s*(?:\\#|$)))|(?=\\n|\\#)", "beginCaptures": { "1": { "name": "entity.name.function.decorator.python" }, "2": { "name": "punctuation.definition.decorator.python" } @@ -1028,7 +1035,7 @@ }, "builtin-types": { "name": "support.type.python", - "match": "(?)", "end": "(\\)|(?=\\'))|((?=(?)", "end": "(\\)|(?=\\'\\'\\'))", "beginCaptures": { - "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp" }, + "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.named.regexp" }, "2": { "name": "entity.name.tag.named.group.regexp" } }, "endCaptures": { - "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp" }, + "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.named.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#single-three-regexp-expression" }, { "include": "#comments-string-single-three" }] @@ -1487,10 +1494,10 @@ "end": "(\\)|(?=\\'\\'\\'))", "beginCaptures": { "0": { "name": "keyword.operator.lookahead.regexp" }, - "1": { "name": "punctuation.parenthesis.lookahead.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookahead.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp" }, + "1": { "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.end.lookahead.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#single-three-regexp-expression" }, { "include": "#comments-string-single-three" }] @@ -1500,10 +1507,10 @@ "end": "(\\)|(?=\\'\\'\\'))", "beginCaptures": { "0": { "name": "keyword.operator.lookahead.negative.regexp" }, - "1": { "name": "punctuation.parenthesis.lookahead.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookahead.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp" }, + "1": { "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.end.lookahead.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#single-three-regexp-expression" }, { "include": "#comments-string-single-three" }] @@ -1513,10 +1520,10 @@ "end": "(\\)|(?=\\'\\'\\'))", "beginCaptures": { "0": { "name": "keyword.operator.lookbehind.regexp" }, - "1": { "name": "punctuation.parenthesis.lookbehind.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookbehind.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp" }, + "1": { "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.end.lookbehind.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#single-three-regexp-expression" }, { "include": "#comments-string-single-three" }] @@ -1526,10 +1533,10 @@ "end": "(\\)|(?=\\'\\'\\'))", "beginCaptures": { "0": { "name": "keyword.operator.lookbehind.negative.regexp" }, - "1": { "name": "punctuation.parenthesis.lookbehind.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookbehind.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp" }, + "1": { "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.end.lookbehind.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#single-three-regexp-expression" }, { "include": "#comments-string-single-three" }] @@ -1539,10 +1546,10 @@ "end": "(\\)|(?=\\'\\'\\'))", "beginCaptures": { "0": { "name": "keyword.operator.conditional.regexp" }, - "1": { "name": "punctuation.parenthesis.conditional.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.conditional.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp" }, + "1": { "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.end.conditional.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#single-three-regexp-expression" }, { "include": "#comments-string-single-three" }] @@ -1551,10 +1558,10 @@ "begin": "\\(\\?:", "end": "(\\)|(?=\\'\\'\\'))", "beginCaptures": { - "0": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp" } + "0": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.non-capturing.regexp" } }, "endCaptures": { - "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp" }, + "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.non-capturing.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#single-three-regexp-expression" }, { "include": "#comments-string-single-three" }] @@ -1598,12 +1605,12 @@ "begin": "(\\[)(\\^)?(\\])?", "end": "(\\]|(?=\"))|((?=(?)", "end": "(\\)|(?=\"))|((?=(?)", "end": "(\\)|(?=\"\"\"))", "beginCaptures": { - "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp" }, + "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.named.regexp" }, "2": { "name": "entity.name.tag.named.group.regexp" } }, "endCaptures": { - "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp" }, + "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.named.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#double-three-regexp-expression" }, { "include": "#comments-string-double-three" }] @@ -1810,10 +1817,10 @@ "end": "(\\)|(?=\"\"\"))", "beginCaptures": { "0": { "name": "keyword.operator.lookahead.regexp" }, - "1": { "name": "punctuation.parenthesis.lookahead.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookahead.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp" }, + "1": { "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.end.lookahead.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#double-three-regexp-expression" }, { "include": "#comments-string-double-three" }] @@ -1823,10 +1830,10 @@ "end": "(\\)|(?=\"\"\"))", "beginCaptures": { "0": { "name": "keyword.operator.lookahead.negative.regexp" }, - "1": { "name": "punctuation.parenthesis.lookahead.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookahead.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp" }, + "1": { "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.end.lookahead.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#double-three-regexp-expression" }, { "include": "#comments-string-double-three" }] @@ -1836,10 +1843,10 @@ "end": "(\\)|(?=\"\"\"))", "beginCaptures": { "0": { "name": "keyword.operator.lookbehind.regexp" }, - "1": { "name": "punctuation.parenthesis.lookbehind.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookbehind.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp" }, + "1": { "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.end.lookbehind.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#double-three-regexp-expression" }, { "include": "#comments-string-double-three" }] @@ -1849,10 +1856,10 @@ "end": "(\\)|(?=\"\"\"))", "beginCaptures": { "0": { "name": "keyword.operator.lookbehind.negative.regexp" }, - "1": { "name": "punctuation.parenthesis.lookbehind.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.lookbehind.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp" }, + "1": { "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.end.lookbehind.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#double-three-regexp-expression" }, { "include": "#comments-string-double-three" }] @@ -1862,10 +1869,10 @@ "end": "(\\)|(?=\"\"\"))", "beginCaptures": { "0": { "name": "keyword.operator.conditional.regexp" }, - "1": { "name": "punctuation.parenthesis.conditional.begin.regexp" } + "1": { "name": "punctuation.parenthesis.begin.conditional.regexp" } }, "endCaptures": { - "1": { "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp" }, + "1": { "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.end.conditional.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#double-three-regexp-expression" }, { "include": "#comments-string-double-three" }] @@ -1874,10 +1881,10 @@ "begin": "\\(\\?:", "end": "(\\)|(?=\"\"\"))", "beginCaptures": { - "0": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp" } + "0": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.non-capturing.regexp" } }, "endCaptures": { - "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp" }, + "1": { "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.non-capturing.regexp" }, "2": { "name": "invalid.illegal.newline.python" } }, "patterns": [{ "include": "#double-three-regexp-expression" }, { "include": "#comments-string-double-three" }] @@ -2144,7 +2151,7 @@ "beginCaptures": { "1": { "name": "invalid.illegal.prefix.python" }, "2": { "name": "string.interpolated.python string.quoted.single.python storage.type.string.python" }, - "3": { "name": "punctuation.definition.string.begin.python string.quoted.single.python" } + "3": { "name": "string.quoted.single.python punctuation.definition.string.begin.python" } }, "endCaptures": { "1": { "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.single.python" }, @@ -2158,7 +2165,7 @@ "end": "(\\2)|((? Date: Fri, 2 Jun 2023 13:57:46 +0100 Subject: [PATCH 052/152] Merge master into develop (#318) * Chore: Allow 000*.rpy files in renpy/common (#300) * RunRenpyViaplugin (#291) * Edited extensions method to add way to run renpy * Added the command to the pallete via json * Adding debug config to allow renpy to be played from play button * changed type to cmd * reformatted with prettier * This format might work? * Refactored if statement to make it more readable * Refactoring of folder names and chaning if statements * This commit fixed the issues in comment https://github.com/LuqueDaniel/vscode-language-renpy/pull/291#discussion_r1170180867, , refactoring if statement * reformated through magical means... God I hate switching computers * Reformated with the correct file, please ignore previous one * Ignore dist folder (#303) * Ignore dist folder (#301) * Chore(Enhancement) - Add a command that cleans up compiled files. * Update the command title to match the convention. * Use await/async syntax * Merge pull request #304 from a2937/old-file-command Chore(Enhancement) - Add a command that cleans up compiled files. --------- Co-authored-by: a2937 Co-authored-by: seanj29 <88255342+seanj29@users.noreply.github.com> Co-authored-by: Daniel Luque --- .gitignore | 1 + package.json | 10 +++++ src/diagnostics.ts | 2 +- src/extension.ts | 97 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 108 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 05203c8c..001fb001 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules out dist *.vsix +dist/* diff --git a/package.json b/package.json index 6741b335..3dcdfacc 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,16 @@ { "command": "renpy.toggleTokenDebugView", "title": "Renpy: Toggle token debug visualization" + }, + { + "command": "renpy.migrateOldFiles", + "title": "Renpy: Cleanup unused compiled Ren'Py source files" + }, + { + "command": "renpy.runCommand", + "title": "Renpy: Run Project", + "category": "Run", + "icon": "$(play)" } ], "configuration": [ diff --git a/src/diagnostics.ts b/src/diagnostics.ts index 1644fa8e..63888104 100644 --- a/src/diagnostics.ts +++ b/src/diagnostics.ts @@ -76,7 +76,7 @@ export function refreshDiagnostics(doc: TextDocument, diagnosticCollection: Diag const filename = extractFilename(doc.uri.path); if (filename) { - if (!filename.match(/^[a-zA-Z0-9]/) || filename.startsWith("00")) { + if ((!filename.match(/^[a-zA-Z0-9]/) || filename.startsWith("00")) && !doc.uri.path.includes("renpy/common")) { const invalidRange = new Range(0, 0, doc.lineCount, 0); const range = doc.validateRange(invalidRange); const diagnostic = new Diagnostic(range, "Filenames must begin with a letter or number, but may not begin with '00' as Ren'Py uses such files for its own purposes.", severity); diff --git a/src/extension.ts b/src/extension.ts index 174a2d88..43d5d9a9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -20,6 +20,7 @@ import { DefinitionProvider, DocumentSemanticTokensProvider, DocumentSymbol, + debug, DocumentSymbolProvider, Hover, HoverProvider, @@ -242,6 +243,29 @@ export async function activate(context: ExtensionContext): Promise { }); context.subscriptions.push(gotoFileLocationCommand); + const migrateOldFilesCommand = commands.registerCommand("renpy.migrateOldFiles", async () => { + if (workspace !== null) { + const altURIs = await workspace.findFiles("**/*.rpyc", null, 50); + altURIs.forEach(async (uri) => { + const sourceFile = Uri.parse(uri.toString().replace(".rpyc", ".rpy")); + try { + await workspace.fs.stat(sourceFile); + } catch (error) { + const endOfPath = uri.toString().replace("game", "old-game").lastIndexOf("/"); + const properLocation = Uri.parse(uri.toString().replace("game", "old-game")); + const oldDataDirectory = Uri.parse(properLocation.toString().substring(0, endOfPath)); + workspace.fs.createDirectory(oldDataDirectory); + workspace.fs + .readFile(uri) + .then((data) => workspace.fs.writeFile(properLocation, data)) + .then(() => workspace.fs.delete(uri)); + } + }); + } + }); + + context.subscriptions.push(migrateOldFilesCommand); + // custom command - refresh diagnostics const refreshDiagnosticsCommand = commands.registerCommand("renpy.refreshDiagnostics", () => { if (window.activeTextEditor) { @@ -263,6 +287,33 @@ export async function activate(context: ExtensionContext): Promise { }); context.subscriptions.push(toggleTokenDebugViewCommand); + // custom command - call renpy to run workspace + const runCommand = commands.registerCommand("renpy.runCommand", () => { + //EsLint recommends config be removed as it has already been declared in a previous scope + if (!config || !isValidExecutable(config.renpyExecutableLocation)) { + window.showErrorMessage("Ren'Py executable location not configured or is invalid."); + } else { + //this is kinda a hob botched together attempt that I'm like 30% certain has a chance of working + debug.startDebugging( + undefined, + { + type: "cmd", + name: "Run File", + request: "launch", + program: config.renpyExecutableLocation, + }, + { noDebug: true } + ); + + //call renpy + const result = RunWorkspaceFolder(); + if (result) { + window.showInformationMessage("Ren'Py is running successfully"); + } + } + }); + context.subscriptions.push(runCommand); + // custom command - call renpy to compile const compileCommand = commands.registerCommand("renpy.compileNavigationData", () => { // check Settings has the path to Ren'Py executable @@ -399,6 +450,45 @@ function isValidExecutable(renpyExecutableLocation: string): boolean { } return fs.existsSync(renpyExecutableLocation); } +// Attempts to run renpy executable through console commands. +function RunWorkspaceFolder(): boolean { + const config = workspace.getConfiguration("renpy"); + + if (config && isValidExecutable(config.renpyExecutableLocation)) { + const renpy = config.renpyExecutableLocation; + const renpyPath = cleanUpPath(Uri.file(renpy).path); + const cwd = renpyPath.substring(0, renpyPath.lastIndexOf("/")); + const workfolder = getWorkspaceFolder(); + const args: string[] = [`${workfolder}`, "run"]; + if (workfolder.endsWith("/game")) { + try { + updateStatusBar("$(sync~spin) Running Ren'Py..."); + const result = cp.spawnSync(renpy, args, { + cwd: `${cwd}`, + env: { PATH: process.env.PATH }, + }); + if (result.error) { + console.log(`renpy spawn error: ${result.error}`); + return false; + } + if (result.stderr && result.stderr.length > 0) { + console.log(`renpy spawn stderr: ${result.stderr}`); + return false; + } + } catch (error) { + console.log(`renpy spawn error: ${error}`); + return false; + } finally { + updateStatusBar(getStatusBarText()); + } + return true; + } + return false; + } else { + console.log("config for rennpy does not exist"); + return false; + } +} function ExecuteRenpyCompile(): boolean { const config = workspace.getConfiguration("renpy"); @@ -417,7 +507,12 @@ function ExecuteRenpyCompile(): boolean { try { NavigationData.isCompiling = true; updateStatusBar("$(sync~spin) Compiling Ren'Py navigation data..."); - const result = cp.spawnSync(renpy, args, { cwd: `${cwd}`, env: { PATH: process.env.PATH }, encoding: "utf-8", windowsHide: true }); + const result = cp.spawnSync(renpy, args, { + cwd: `${cwd}`, + env: { PATH: process.env.PATH }, + encoding: "utf-8", + windowsHide: true, + }); if (result.error) { console.log(`renpy spawn error: ${result.error}`); return false; From dabd2b717306ec98c1004bcb1ad3e9759d1adadc Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Fri, 2 Jun 2023 14:16:42 +0100 Subject: [PATCH 053/152] Merge master into develop (#320) * Chore: Allow 000*.rpy files in renpy/common (#300) * RunRenpyViaplugin (#291) * Edited extensions method to add way to run renpy * Added the command to the pallete via json * Adding debug config to allow renpy to be played from play button * changed type to cmd * reformatted with prettier * This format might work? * Refactored if statement to make it more readable * Refactoring of folder names and chaning if statements * This commit fixed the issues in comment https://github.com/LuqueDaniel/vscode-language-renpy/pull/291#discussion_r1170180867, , refactoring if statement * reformated through magical means... God I hate switching computers * Reformated with the correct file, please ignore previous one * Ignore dist folder (#303) * Ignore dist folder (#301) * Chore(Enhancement) - Add a command that cleans up compiled files. * Update the command title to match the convention. * Use await/async syntax * Adds PR ci to master Fixes #306 * Fixes codeql-analysis.yml format * Adds setup action * Fix package lock after merge --------- Co-authored-by: a2937 Co-authored-by: seanj29 <88255342+seanj29@users.noreply.github.com> Co-authored-by: Daniel Luque --- .github/workflows/pr-check.yml | 3 + package-lock.json | 235 ++++++++++++++++++++++++++++++++- package.json | 3 +- 3 files changed, 238 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index f297e918..9b56c1f5 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -2,6 +2,9 @@ name: PR Check on: pull_request: + branches: + - master + - develop env: NODE_VERSION: 16 diff --git a/package-lock.json b/package-lock.json index 620c7188..067ff16a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "languague-renpy", - "version": "2.1.5", + "version": "2.1.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.1.5", + "version": "2.1.7", "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", @@ -15,6 +15,7 @@ "@types/webpack": "^5.28.0", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", + "@vscode/vsce": "^2.15.0", "copy-webpack-plugin": "^11.0.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", @@ -597,6 +598,127 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@vscode/vsce/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@vscode/vsce/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@vscode/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -3786,6 +3908,12 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -6708,6 +6836,103 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "requires": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + } + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -9043,6 +9268,12 @@ "minimist": "^1.2.0" } }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", diff --git a/package.json b/package.json index 3dcdfacc..51030f5d 100644 --- a/package.json +++ b/package.json @@ -219,6 +219,7 @@ "webpack": "^5.72.1", "webpack-cli": "^4.9.2", "vsce": "^2.9.2", - "prettier": "^2.7.1" + "prettier": "^2.7.1", + "@vscode/vsce": "^2.15.0" } } From a28e9006ac3f51cd1e7a2b84a0d0218f5e00a7cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 09:19:17 +0000 Subject: [PATCH 054/152] deps: bump webpack from 5.74.0 to 5.76.0 Bumps [webpack](https://github.com/webpack/webpack) from 5.74.0 to 5.76.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.74.0...v5.76.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 067ff16a..413e9b77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "typescript": "^4.8.4", "vsce": "^2.9.2", "vscode-test": "^1.6.1", - "webpack": "^5.72.1", + "webpack": "^5.76.0", "webpack-cli": "^4.9.2" }, "engines": { @@ -6129,9 +6129,9 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -10915,9 +10915,9 @@ } }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index 51030f5d..53b379df 100644 --- a/package.json +++ b/package.json @@ -216,7 +216,7 @@ "ts-node": "^10.8.0", "typescript": "^4.8.4", "vscode-test": "^1.6.1", - "webpack": "^5.72.1", + "webpack": "^5.76.0", "webpack-cli": "^4.9.2", "vsce": "^2.9.2", "prettier": "^2.7.1", From a7aa62f4a8d46bc71842fd9e14be6103e6075ca7 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sat, 3 Jun 2023 11:28:40 +0200 Subject: [PATCH 055/152] Removes duplicate dependencie --- package-lock.json | 315 ++++++++++++---------------------------------- package.json | 3 +- 2 files changed, 79 insertions(+), 239 deletions(-) diff --git a/package-lock.json b/package-lock.json index 413e9b77..3661081b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@types/webpack": "^5.28.0", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", - "@vscode/vsce": "^2.15.0", + "@vscode/vsce": "^2.19.0", "copy-webpack-plugin": "^11.0.0", "eslint": "^8.33.0", "eslint-plugin-import": "^2.27.5", @@ -25,7 +25,6 @@ "ts-loader": "^9.3.0", "ts-node": "^10.8.0", "typescript": "^4.8.4", - "vsce": "^2.9.2", "vscode-test": "^1.6.1", "webpack": "^5.76.0", "webpack-cli": "^4.9.2" @@ -1247,6 +1246,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -1272,6 +1272,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1282,6 +1283,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1678,7 +1680,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "optional": true }, "node_modules/chrome-trace-event": { "version": "1.0.3", @@ -1972,6 +1975,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "optional": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -1987,6 +1991,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "optional": true, "engines": { "node": ">=4.0.0" } @@ -2035,6 +2040,7 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true, + "optional": true, "engines": { "node": ">=8" } @@ -2195,6 +2201,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "optional": true, "dependencies": { "once": "^1.4.0" } @@ -2765,6 +2772,7 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, + "optional": true, "engines": { "node": ">=6" } @@ -2955,7 +2963,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "optional": true }, "node_modules/fs-extra": { "version": "10.1.0", @@ -3070,7 +3079,8 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "optional": true }, "node_modules/glob": { "version": "7.1.6", @@ -3477,7 +3487,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "node_modules/internal-slot": { "version": "1.0.5", @@ -3932,6 +3943,7 @@ "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, "hasInstallScript": true, + "optional": true, "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -4157,6 +4169,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "optional": true, "engines": { "node": ">=10" }, @@ -4207,7 +4220,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "optional": true }, "node_modules/ms": { "version": "2.1.2", @@ -4224,7 +4238,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -4248,6 +4263,7 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", "dev": true, + "optional": true, "dependencies": { "semver": "^7.3.5" }, @@ -4265,7 +4281,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true + "dev": true, + "optional": true }, "node_modules/node-polyfill-webpack-plugin": { "version": "1.1.4", @@ -4727,6 +4744,7 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -4810,6 +4828,7 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -4902,6 +4921,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -4917,6 +4937,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -5298,7 +5319,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true }, "node_modules/simple-get": { "version": "4.0.1", @@ -5319,6 +5341,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -5507,6 +5530,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -5519,6 +5543,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -5535,6 +5560,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5789,6 +5815,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -5996,111 +6023,6 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "node_modules/vsce": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", - "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", - "dev": true, - "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/vsce/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/vsce/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/vsce/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/vscode-test": { "version": "1.6.1", "dev": true, @@ -6339,19 +6261,6 @@ "dev": true, "license": "ISC" }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", @@ -7354,6 +7263,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7365,6 +7275,7 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, + "optional": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -7375,6 +7286,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7665,7 +7577,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "optional": true }, "chrome-trace-event": { "version": "1.0.3", @@ -7899,6 +7812,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "optional": true, "requires": { "mimic-response": "^3.1.0" } @@ -7907,7 +7821,8 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "dev": true, + "optional": true }, "deep-is": { "version": "0.1.4", @@ -7941,7 +7856,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true + "dev": true, + "optional": true }, "diff": { "version": "4.0.2", @@ -8068,6 +7984,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "optional": true, "requires": { "once": "^1.4.0" } @@ -8490,7 +8407,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true + "dev": true, + "optional": true }, "fast-deep-equal": { "version": "3.1.3", @@ -8636,7 +8554,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "optional": true }, "fs-extra": { "version": "10.1.0", @@ -8719,7 +8638,8 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "optional": true }, "glob": { "version": "7.1.6", @@ -8983,7 +8903,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "internal-slot": { "version": "1.0.5", @@ -9289,6 +9210,7 @@ "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, + "optional": true, "requires": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -9468,7 +9390,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true + "dev": true, + "optional": true }, "minimalistic-assert": { "version": "1.0.1", @@ -9504,7 +9427,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "optional": true }, "ms": { "version": "2.1.2", @@ -9520,7 +9444,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "optional": true }, "natural-compare": { "version": "1.4.0", @@ -9543,6 +9468,7 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", "dev": true, + "optional": true, "requires": { "semver": "^7.3.5" } @@ -9557,7 +9483,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true + "dev": true, + "optional": true }, "node-polyfill-webpack-plugin": { "version": "1.1.4", @@ -9902,6 +9829,7 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "requires": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -9964,6 +9892,7 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -10026,6 +9955,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -10037,7 +9967,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true + "dev": true, + "optional": true } } }, @@ -10297,13 +10228,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "dev": true, + "optional": true }, "simple-get": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, + "optional": true, "requires": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -10450,6 +10383,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -10462,6 +10396,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -10475,6 +10410,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10647,6 +10583,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -10808,92 +10745,6 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "vsce": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", - "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", - "dev": true, - "requires": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "vscode-test": { "version": "1.6.1", "dev": true, @@ -11049,16 +10900,6 @@ "version": "1.0.2", "dev": true }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, "xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", diff --git a/package.json b/package.json index 53b379df..c55ccc21 100644 --- a/package.json +++ b/package.json @@ -218,8 +218,7 @@ "vscode-test": "^1.6.1", "webpack": "^5.76.0", "webpack-cli": "^4.9.2", - "vsce": "^2.9.2", "prettier": "^2.7.1", - "@vscode/vsce": "^2.15.0" + "@vscode/vsce": "^2.19.0" } } From 05a642efffebdfca66568231da2b1789e667fea2 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sat, 3 Jun 2023 11:50:02 +0200 Subject: [PATCH 056/152] Bump version to 2.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c55ccc21..0c436e53 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.7", + "version": "2.2.0", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From df53f0d9a798252e1a9080e5a45409ee94ec51f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 10:05:56 +0000 Subject: [PATCH 057/152] deps: bump eslint from 8.34.0 to 8.42.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.34.0 to 8.42.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.34.0...v8.42.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 230 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 150 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3661081b..cebe2ac0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "languague-renpy", - "version": "2.1.7", + "version": "2.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.1.7", + "version": "2.2.0", "license": "MIT", "devDependencies": { "@types/mocha": "^9.1.1", @@ -17,7 +17,7 @@ "@typescript-eslint/parser": "^5.52.0", "@vscode/vsce": "^2.19.0", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.33.0", + "eslint": "^8.42.0", "eslint-plugin-import": "^2.27.5", "fork-ts-checker-webpack-plugin": "^7.2.11", "node-polyfill-webpack-plugin": "^1.1.4", @@ -151,15 +151,39 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -174,10 +198,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/js": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2369,13 +2402,16 @@ } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -2384,24 +2420,22 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -2409,7 +2443,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -2567,12 +2600,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/escape-string-regexp": { @@ -2587,21 +2623,26 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2677,14 +2718,14 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2694,9 +2735,10 @@ } }, "node_modules/esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2706,8 +2748,9 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3191,6 +3234,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "dev": true, @@ -3862,16 +3911,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6428,15 +6467,30 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -6445,10 +6499,16 @@ "strip-json-comments": "^3.1.1" } }, + "@eslint/js": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -8115,13 +8175,16 @@ "dev": true }, "eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -8130,24 +8193,22 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -8155,7 +8216,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -8166,7 +8226,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.1", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -8175,6 +8237,8 @@ }, "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "find-up": { @@ -8335,24 +8399,26 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -8360,6 +8426,8 @@ "dependencies": { "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8717,6 +8785,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "has": { "version": "1.0.3", "dev": true, @@ -9143,12 +9217,6 @@ } } }, - "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/package.json b/package.json index 0c436e53..2d4b7439 100644 --- a/package.json +++ b/package.json @@ -208,7 +208,7 @@ "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.33.0", + "eslint": "^8.42.0", "eslint-plugin-import": "^2.27.5", "fork-ts-checker-webpack-plugin": "^7.2.11", "node-polyfill-webpack-plugin": "^1.1.4", From aa2872d0a736575f9cb4b71d60c8fe888c3d9347 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 10:10:33 +0000 Subject: [PATCH 058/152] deps: bump @typescript-eslint/parser from 5.53.0 to 5.59.8 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.53.0 to 5.59.8. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.8/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 143 +++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 131 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index cebe2ac0..f5b5be70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@types/vscode": "^1.67.2", "@types/webpack": "^5.28.0", "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/parser": "^5.59.8", "@vscode/vsce": "^2.19.0", "copy-webpack-plugin": "^11.0.0", "eslint": "^8.42.0", @@ -477,14 +477,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "engines": { @@ -503,6 +503,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.53.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", @@ -6725,15 +6799,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" + } + }, + "@typescript-eslint/types": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.8", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/scope-manager": { diff --git a/package.json b/package.json index 2d4b7439..12c749b0 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "@types/vscode": "^1.67.2", "@types/webpack": "^5.28.0", "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/parser": "^5.59.8", "copy-webpack-plugin": "^11.0.0", "eslint": "^8.42.0", "eslint-plugin-import": "^2.27.5", From 666965cc7338e975be3320c57bf2a3986a081346 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 10:12:26 +0000 Subject: [PATCH 059/152] deps: bump @typescript-eslint/eslint-plugin from 5.53.0 to 5.59.8 Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.53.0 to 5.59.8. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.8/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 320 +++++++++++----------------------------------- package.json | 2 +- 2 files changed, 76 insertions(+), 246 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5b5be70..07d54965 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@types/node": "^18.13.0", "@types/vscode": "^1.67.2", "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.59.8", "@typescript-eslint/parser": "^5.59.8", "@vscode/vsce": "^2.19.0", "copy-webpack-plugin": "^11.0.0", @@ -420,9 +420,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/vscode": { @@ -443,19 +443,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -503,7 +503,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "5.59.8", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", @@ -520,88 +520,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -622,9 +548,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -635,13 +561,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -662,18 +588,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -688,12 +614,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2648,31 +2574,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -5121,17 +5022,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6758,9 +6648,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/vscode": { @@ -6781,19 +6671,19 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } @@ -6808,87 +6698,44 @@ "@typescript-eslint/types": "5.59.8", "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - } - }, - "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - } - } } }, "@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" } }, "@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6897,28 +6744,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" } }, @@ -8502,19 +8349,6 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "dev": true - } - } - }, "eslint-visitor-keys": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -10206,10 +10040,6 @@ "functions-have-names": "^1.2.2" } }, - "regexpp": { - "version": "3.2.0", - "dev": true - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", diff --git a/package.json b/package.json index 12c749b0..809890ee 100644 --- a/package.json +++ b/package.json @@ -205,7 +205,7 @@ "@types/node": "^18.13.0", "@types/vscode": "^1.67.2", "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.59.8", "@typescript-eslint/parser": "^5.59.8", "copy-webpack-plugin": "^11.0.0", "eslint": "^8.42.0", From c1f348fc21f7cd23b93ae2625085f0c35f875a69 Mon Sep 17 00:00:00 2001 From: Daniel Luque Date: Sat, 3 Jun 2023 12:18:46 +0200 Subject: [PATCH 060/152] Bump version to 2.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 809890ee..6c4e63ad 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.2.0", + "version": "2.3.0", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 07151cd2db63f35fbfd95438ae21c939453e8829 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Sun, 4 Jun 2023 14:10:42 +0200 Subject: [PATCH 061/152] Display invalid.illegal in red in development env --- examples/.vscode/settings.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index c897acda..c885f64a 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -7,6 +7,12 @@ }, "editor.tokenColorCustomizations": { "textMateRules": [ + { + "scope": "debug.invalid.illegal.unmatched.renpy", + "settings": { + "foreground": "#f00" + } + }, { "scope": "renpy.meta.plain", "settings": { From d189d9e46d8154c9fdce0d30557389f685c394a3 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Sun, 4 Jun 2023 14:12:23 +0200 Subject: [PATCH 062/152] Split screen language into its own file --- package.json | 8 +- syntaxes/renpy.screen.tmLanguage.json | 291 ++++++++++++++++++++++++++ syntaxes/renpy.tmLanguage.json | 158 -------------- 3 files changed, 297 insertions(+), 160 deletions(-) create mode 100644 syntaxes/renpy.screen.tmLanguage.json diff --git a/package.json b/package.json index 51030f5d..b9a33ee0 100644 --- a/package.json +++ b/package.json @@ -69,12 +69,16 @@ "path": "./syntaxes/renpy.tmLanguage.json" }, { - "scopeName": "source.renpy.python", - "path": "./syntaxes/renpy.python.tmLanguage.json" + "scopeName": "source.renpy.screen", + "path": "./syntaxes/renpy.screen.tmLanguage.json" }, { "scopeName": "source.renpy.atl", "path": "./syntaxes/renpy.atl.tmLanguage.json" + }, + { + "scopeName": "source.renpy.python", + "path": "./syntaxes/renpy.python.tmLanguage.json" } ], "snippets": [ diff --git a/syntaxes/renpy.screen.tmLanguage.json b/syntaxes/renpy.screen.tmLanguage.json new file mode 100644 index 00000000..5bbdd332 --- /dev/null +++ b/syntaxes/renpy.screen.tmLanguage.json @@ -0,0 +1,291 @@ +{ + "information_for_contributors": ["Please remeber to regenerate the ts token patterns using the 'syntax-to-token-pattern.py' python script"], + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "Ren'Py Screen", + "scopeName": "source.renpy.screen", + "patterns": [{ "include": "#screen-language" }], + "repository": { + "builtin-screens": { + "name": "support.function.builtin.screen.renpy", + "match": "(? Date: Sun, 4 Jun 2023 14:15:27 +0200 Subject: [PATCH 063/152] Link some fallback patterns into ATL and screen blocks We'll need to take some time to set this up properly to prevent highlighting syntax in blocks that don't support them. For now this will do though --- syntaxes/renpy.atl.tmLanguage.json | 109 +++++++++++++++++++------- syntaxes/renpy.python.tmLanguage.json | 2 + syntaxes/renpy.tmLanguage.json | 60 +++++++------- 3 files changed, 117 insertions(+), 54 deletions(-) diff --git a/syntaxes/renpy.atl.tmLanguage.json b/syntaxes/renpy.atl.tmLanguage.json index c0e7ebd4..b1e40297 100644 --- a/syntaxes/renpy.atl.tmLanguage.json +++ b/syntaxes/renpy.atl.tmLanguage.json @@ -7,7 +7,17 @@ "repository": { "atl": { "comment": "https://www.renpy.org/doc/html/atl.html#atl-syntax-and-semantics", - "patterns": [{ "include": "#atl-keywords" }, { "include": "#atl-blocks" }, { "include": "#atl-simple-expression" }, { "include": "#atl-warper" }, { "include": "#atl-event" }, { "include": "#atl-on" }, { "include": "#atl-function" }] + "patterns": [ + { "include": "source.renpy#conditionals" }, + { "include": "#atl-keywords" }, + { "include": "#atl-warper" }, + { "include": "#atl-blocks" }, + { "include": "#atl-simple-expression" }, + { "include": "#atl-event" }, + { "include": "#atl-on" }, + { "include": "#atl-function" }, + { "include": "#atl-fallback" } + ] }, "atl-build-in-properties": { "comment": "https://www.renpy.org/doc/html/atl.html#list-of-transform-properties", @@ -24,67 +34,67 @@ }, { "comment": "position props (int, absolute, or a float)", - "name": "support.type.property-name.transform.renpy", + "name": "support.type.property-name.transform.renpy entity.name.tag.css.transform.renpy", "match": "\\b(? Date: Sun, 4 Jun 2023 14:24:32 +0200 Subject: [PATCH 064/152] Disable multi-line string tags --- syntaxes/renpy.tmLanguage.json | 213 +++++++++++++++++++++++---------- 1 file changed, 151 insertions(+), 62 deletions(-) diff --git a/syntaxes/renpy.tmLanguage.json b/syntaxes/renpy.tmLanguage.json index 12014d02..4a470c03 100644 --- a/syntaxes/renpy.tmLanguage.json +++ b/syntaxes/renpy.tmLanguage.json @@ -272,67 +272,8 @@ "strings-interior": { "patterns": [{ "include": "#new-line" }, { "include": "#escaped_char" }, { "include": "#string-tags" }, { "include": "#constant_placeholder" }] }, - "string-tags": { + "string-tags-broken": { "patterns": [ - { - "comment": "Valid tags without params (self-closing)", - "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", - "match": "({)\\s*(nw|done|fast|p|w|clear)\\s*(})", - "captures": { - "1": { "name": "punctuation.definition.tag.begin.renpy" }, - "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, - "3": { "name": "punctuation.definition.tag.end.renpy" } - } - }, - { - "comment": "Valid tags with numeric params (self-closing)", - "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", - "match": "({)\\s*(p|w)(=)(\\+?)(\\d*(?:.\\d+)?)\\s*(})", - "captures": { - "1": { "name": "punctuation.definition.tag.begin.renpy" }, - "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, - "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, - "4": { "name": "keyword.operator.arithmetic.plus.renpy" }, - "5": { "name": "support.constant.property-value.renpy constant.numeric.float.renpy" }, - "6": { "name": "punctuation.definition.tag.end.renpy" } - } - }, - { - "comment": "Valid tags with numeric params (self-closing)", - "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", - "match": "({)\\s*(v?space)(=)(\\+?)(\\d+)\\s*(})", - "captures": { - "1": { "name": "punctuation.definition.tag.begin.renpy" }, - "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, - "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, - "4": { "name": "keyword.operator.arithmetic.plus.renpy" }, - "5": { "name": "support.constant.property-value.renpy constant.numeric.integer.renpy" }, - "6": { "name": "punctuation.definition.tag.end.renpy" } - } - }, - { - "comment": "Comment tag (self-closing)", - "name": "meta.string.tag.comment.self-closing.renpy", - "match": "({)\\s*(#)\\s*(.*?)\\s*(})", - "captures": { - "1": { "name": "punctuation.definition.tag.begin.renpy" }, - "2": { "name": "comment.line.number-sign.renpy punctuation.definition.comment.renpy" }, - "3": { "name": "comment.line.number-sign.renpy" }, - "4": { "name": "punctuation.definition.tag.end.renpy" } - } - }, - { - "comment": "Valid tags with file param", - "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", - "match": "({)\\s*(image)(=)([\\w.]+)\\s*(})", - "captures": { - "1": { "name": "punctuation.definition.tag.begin.renpy" }, - "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, - "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, - "4": { "name": "support.constant.property-value.renpy string.unquoted.renpy" }, - "5": { "name": "punctuation.definition.tag.end.renpy" } - } - }, { "comment": "Valid tags without params (close required)", "contentName": "renpy.meta.${2:/downcase} meta.tagged.string.renpy", @@ -466,6 +407,154 @@ "3": { "name": "punctuation.definition.tag.end.renpy" } }, "patterns": [{ "include": "#strings-interior" }] + } + ] + }, + "string-tags": { + "patterns": [ + { + "comment": "Valid tags without params (self-closing)", + "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", + "match": "({)\\s*(nw|done|fast|p|w|clear)\\s*(})", + "captures": { + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Valid tags with numeric params (self-closing)", + "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", + "match": "({)\\s*(p|w)(=)(\\+?)(\\d*(?:.\\d+)?)\\s*(})", + "captures": { + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { "name": "keyword.operator.arithmetic.plus.renpy" }, + "5": { "name": "support.constant.property-value.renpy constant.numeric.float.renpy" }, + "6": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Valid tags with numeric params (self-closing)", + "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", + "match": "({)\\s*(v?space)(=)(\\+?)(\\d+)\\s*(})", + "captures": { + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { "name": "keyword.operator.arithmetic.plus.renpy" }, + "5": { "name": "support.constant.property-value.renpy constant.numeric.integer.renpy" }, + "6": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Comment tag (self-closing)", + "name": "meta.string.tag.comment.self-closing.renpy", + "match": "({)\\s*(#)\\s*(.*?)\\s*(})", + "captures": { + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "comment.line.number-sign.renpy punctuation.definition.comment.renpy" }, + "3": { "name": "comment.line.number-sign.renpy" }, + "4": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Valid tags with file param", + "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", + "match": "({)\\s*(image)(=)([\\w.]+)\\s*(})", + "captures": { + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { "name": "support.constant.property-value.renpy string.unquoted.renpy" }, + "5": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Valid tags without params (close required)", + "match": "({)\\s*(u|i|b|s|plain|alt|noalt|art|rb|rt)\\s*(})", + "captures": { + "0": { "name": "meta.string.tag.${2:/downcase}.start.renpy" }, + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Valid tags with numeric params (close required)", + "contentName": "renpy.meta.${2:/downcase} meta.tagged.string.renpy", + "match": "({)\\s*(alpha|cps|k)(=)(?:(\\*)|(\\-)|(\\+))?(\\d*(?:.\\d+)?)\\s*(})", + "captures": { + "0": { "name": "meta.string.tag.${2:/downcase}.start.renpy" }, + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { "name": "keyword.operator.arithmetic.Multiply.renpy" }, + "5": { "name": "keyword.operator.arithmetic.Minus.renpy" }, + "6": { "name": "keyword.operator.arithmetic.Plus.renpy" }, + "7": { "name": "support.constant.property-value.renpy constant.numeric.renpy" }, + "8": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Valid tags with numeric params (close required)", + "contentName": "renpy.meta.${2:/downcase} meta.tagged.string.renpy", + "match": "({)\\s*(size)(=)([\\-+]?)(\\d+)\\s*(})", + "captures": { + "0": { "name": "meta.string.tag.${2:/downcase}.start.renpy" }, + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { "name": "keyword.operator.arithmetic.renpy" }, + "5": { "name": "support.constant.property-value.renpy constant.numeric.integer.renpy" }, + "6": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Valid tags with file param (close required)", + "name": "meta.string.tag.${2:/downcase}.self-closing.renpy", + "match": "({)\\s*(font)(=)([\\w.]+)\\s*(})", + "captures": { + "0": { "name": "meta.string.tag.${2:/downcase}.start.renpy" }, + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { "name": "support.constant.property-value.renpy string.unquoted.renpy" }, + "5": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "Color tag", + "contentName": "renpy.meta.${2:/downcase}.${4:/downcase} meta.tagged.string.renpy", + "match": "({)\\s*(color|outlinecolor)(=)(#?[a-zA-Z0-9]+)\\s*(})", + "captures": { + "0": { "name": "meta.string.tag.${2:/downcase}.start.renpy" }, + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { + "name": "constant.color.renpy", + "patterns": [{ "include": "#hex_literal" }] + }, + "5": { "name": "punctuation.definition.tag.end.renpy" } + } + }, + { + "comment": "a tag", + "contentName": "renpy.meta.${2:/downcase} meta.tagged.string.renpy", + "match": "({)\\s*(a)(=)(.*?)\\s*(})", + "captures": { + "0": { "name": "meta.string.tag.${2:/downcase}.start.renpy" }, + "1": { "name": "punctuation.definition.tag.begin.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, + "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, + "4": { + "name": "support.constant.property-value.renpy string.unquoted.renpy", + "patterns": [] + }, + "5": { "name": "punctuation.definition.tag.end.renpy" } + } }, { "comment": "Unknown tag (Single line support only cus \\R does not work) (Since we don't know if a tag is self closing, we can't assume that an end pattern exists)", @@ -491,7 +580,7 @@ "captures": { "0": { "name": "meta.string.tag.${2:/downcase}.start.renpy" }, "1": { "name": "punctuation.definition.tag.begin.renpy" }, - "2": { "name": "renpy.meta.u entity.name.tag.${2:/downcase}.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, "3": { "name": "punctuation.separator.key-value.renpy keyword.operator.assignment.renpy" }, "4": { "name": "support.constant.property-value.renpy constant.other.placeholder.tags.renpy", @@ -506,7 +595,7 @@ "captures": { "0": { "name": "meta.string.tag.${2:/downcase}.end.renpy" }, "1": { "name": "punctuation.definition.tag.begin.renpy" }, - "2": { "name": "renpy.meta.u entity.name.tag.${2:/downcase}.renpy" }, + "2": { "name": "entity.name.tag.${2:/downcase}.renpy" }, "3": { "name": "punctuation.definition.tag.end.renpy" } } } From a39af6864b789d0397ed533864c0b720f4d61775 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Sun, 4 Jun 2023 14:29:18 +0200 Subject: [PATCH 065/152] Added hbox support --- syntaxes/renpy.screen.tmLanguage.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/syntaxes/renpy.screen.tmLanguage.json b/syntaxes/renpy.screen.tmLanguage.json index 5bbdd332..3cf99250 100644 --- a/syntaxes/renpy.screen.tmLanguage.json +++ b/syntaxes/renpy.screen.tmLanguage.json @@ -171,7 +171,7 @@ }, { "name": "keyword.other.renpy", - "match": "\\b(? Date: Sun, 4 Jun 2023 14:40:54 +0200 Subject: [PATCH 066/152] Fix call screen --- syntaxes/renpy.tmLanguage.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/syntaxes/renpy.tmLanguage.json b/syntaxes/renpy.tmLanguage.json index 4a470c03..e124e5cd 100644 --- a/syntaxes/renpy.tmLanguage.json +++ b/syntaxes/renpy.tmLanguage.json @@ -1073,7 +1073,7 @@ "1": { "name": "keyword.control.flow.return.renpy" } }, "end": "$", - "patterns": [{ "include": "#expressions" }, { "include": "source.renpy.python#expression" }] + "patterns": [{ "include": "#expressions-renpy-only" }, { "include": "source.renpy.python#expression" }] }, "call-jump-expression": { "begin": "\\b(? Date: Sun, 4 Jun 2023 16:32:08 +0100 Subject: [PATCH 067/152] Quick fix release (#331) * Display invalid.illegal in red in development env * Split screen language into its own file * Link some fallback patterns into ATL and screen blocks We'll need to take some time to set this up properly to prevent highlighting syntax in blocks that don't support them. For now this will do though * Disable multi-line string tags * Added hbox support * Fix call screen --- examples/.vscode/settings.json | 6 + package.json | 8 +- syntaxes/renpy.atl.tmLanguage.json | 109 +++++-- syntaxes/renpy.python.tmLanguage.json | 2 + syntaxes/renpy.screen.tmLanguage.json | 291 +++++++++++++++++ syntaxes/renpy.tmLanguage.json | 442 +++++++++++--------------- 6 files changed, 577 insertions(+), 281 deletions(-) create mode 100644 syntaxes/renpy.screen.tmLanguage.json diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index c897acda..c885f64a 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -7,6 +7,12 @@ }, "editor.tokenColorCustomizations": { "textMateRules": [ + { + "scope": "debug.invalid.illegal.unmatched.renpy", + "settings": { + "foreground": "#f00" + } + }, { "scope": "renpy.meta.plain", "settings": { diff --git a/package.json b/package.json index 6c4e63ad..b8d7f4e5 100644 --- a/package.json +++ b/package.json @@ -69,12 +69,16 @@ "path": "./syntaxes/renpy.tmLanguage.json" }, { - "scopeName": "source.renpy.python", - "path": "./syntaxes/renpy.python.tmLanguage.json" + "scopeName": "source.renpy.screen", + "path": "./syntaxes/renpy.screen.tmLanguage.json" }, { "scopeName": "source.renpy.atl", "path": "./syntaxes/renpy.atl.tmLanguage.json" + }, + { + "scopeName": "source.renpy.python", + "path": "./syntaxes/renpy.python.tmLanguage.json" } ], "snippets": [ diff --git a/syntaxes/renpy.atl.tmLanguage.json b/syntaxes/renpy.atl.tmLanguage.json index c0e7ebd4..b1e40297 100644 --- a/syntaxes/renpy.atl.tmLanguage.json +++ b/syntaxes/renpy.atl.tmLanguage.json @@ -7,7 +7,17 @@ "repository": { "atl": { "comment": "https://www.renpy.org/doc/html/atl.html#atl-syntax-and-semantics", - "patterns": [{ "include": "#atl-keywords" }, { "include": "#atl-blocks" }, { "include": "#atl-simple-expression" }, { "include": "#atl-warper" }, { "include": "#atl-event" }, { "include": "#atl-on" }, { "include": "#atl-function" }] + "patterns": [ + { "include": "source.renpy#conditionals" }, + { "include": "#atl-keywords" }, + { "include": "#atl-warper" }, + { "include": "#atl-blocks" }, + { "include": "#atl-simple-expression" }, + { "include": "#atl-event" }, + { "include": "#atl-on" }, + { "include": "#atl-function" }, + { "include": "#atl-fallback" } + ] }, "atl-build-in-properties": { "comment": "https://www.renpy.org/doc/html/atl.html#list-of-transform-properties", @@ -24,67 +34,67 @@ }, { "comment": "position props (int, absolute, or a float)", - "name": "support.type.property-name.transform.renpy", + "name": "support.type.property-name.transform.renpy entity.name.tag.css.transform.renpy", "match": "\\b(? Date: Sun, 4 Jun 2023 19:41:36 +0200 Subject: [PATCH 068/152] Bump version 2.3.1-pre-release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b8d7f4e5..6b402cad 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.3.0", + "version": "2.3.1", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 2f46bf1926293e5cc20bf7b99ccc1578e91bf5a3 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:12:16 +0100 Subject: [PATCH 069/152] Bump version to 2.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b9a33ee0..40a7354a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.7", + "version": "2.2.1", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 7021943ceb8ce67cb983d8702d0f99f6253dd3a3 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 7 Jun 2023 14:53:34 +0200 Subject: [PATCH 070/152] Added logger that can also output logs for the end user (#336) * Added logger that can also output logs for the end user * Bump version to 2.3.2 --- package.json | 15 ++- src/decorator.ts | 5 +- src/extension.ts | 54 +++++------ src/logger.ts | 89 ++++++++++++++++++ src/navigation-data.ts | 24 ++--- src/semantics.ts | 7 +- src/tokenizer/debug-decorator.ts | 31 ++++-- src/tokenizer/token-definitions.ts | 3 +- src/tokenizer/tokenizer.ts | 36 ++++--- syntaxes/renpy.log.tmLanguage.json | 145 +++++++++++++++++++++++++++++ 10 files changed, 341 insertions(+), 68 deletions(-) create mode 100644 src/logger.ts create mode 100644 syntaxes/renpy.log.tmLanguage.json diff --git a/package.json b/package.json index 6b402cad..97cf33e9 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.3.1", + "version": "2.3.2", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", @@ -60,6 +60,14 @@ "light": "./renpy.svg", "dark": "./renpy.svg" } + }, + { + "id": "renpy-log", + "aliases": [ + "Ren'Py Log" + ], + "configuration": "./language-configuration.json", + "scopeName": "text.renpy-log" } ], "grammars": [ @@ -79,6 +87,11 @@ { "scopeName": "source.renpy.python", "path": "./syntaxes/renpy.python.tmLanguage.json" + }, + { + "language": "renpy-log", + "scopeName": "text.renpy-log", + "path": "./syntaxes/renpy.log.tmLanguage.json" } ], "snippets": [ diff --git a/src/decorator.ts b/src/decorator.ts index dab29a9f..461da4e8 100644 --- a/src/decorator.ts +++ b/src/decorator.ts @@ -1,6 +1,7 @@ import { ConfigurationTarget, workspace } from "vscode"; import util = require("util"); import { IEquatable, ValueEqualsSet } from "./utilities/hashset"; +import { LogLevel, logMessage } from "./logger"; export class TextMateRule implements IEquatable { public scope: string | string[]; @@ -63,10 +64,10 @@ export function injectCustomTextmateTokens(rules: ValueEqualsSet) tokenColorCustomizations.textMateRules = newRules.toArray(); tokensConfig.update("tokenColorCustomizations", tokenColorCustomizations, ConfigurationTarget.Workspace).then( () => { - console.log("Successfully updated the tokenColorCustomizations config"); + logMessage(LogLevel.Info, "Successfully updated the tokenColorCustomizations config"); }, (reason) => { - console.error("Failed to update the tokenColorCustomizations config! : " + reason); + logMessage(LogLevel.Error, "Failed to update the tokenColorCustomizations config! : " + reason); } ); } diff --git a/src/extension.ts b/src/extension.ts index 43d5d9a9..2c6f7fb4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -54,17 +54,18 @@ import { findAllReferences } from "./references"; import { registerDebugDecorator, unregisterDebugDecorator } from "./tokenizer/debug-decorator"; import { clearTokenCache } from "./tokenizer/tokenizer"; import { getSignatureHelp } from "./signature"; +import { LogCategory, LogLevel, logCatMessage, logMessage, logToast } from "./logger"; const selector: DocumentSelector = { scheme: "file", language: "renpy" }; let myStatusBarItem: StatusBarItem; export async function activate(context: ExtensionContext): Promise { - console.log("Ren'Py extension activated"); + logMessage(LogLevel.Info, "Ren'Py extension activated"); const filepath = getNavigationJsonFilepath(); const jsonFileExists = fs.existsSync(filepath); if (!jsonFileExists) { - console.log("Navigation.json file is missing."); + logMessage(LogLevel.Warning, "Navigation.json file is missing."); } // hide rpyc files if the setting is enabled @@ -224,7 +225,7 @@ export async function activate(context: ExtensionContext): Promise { try { await NavigationData.refresh(true); } catch (error) { - console.log(error); + logMessage(LogLevel.Error, error as string); } finally { updateStatusBar(getStatusBarText()); } @@ -238,7 +239,7 @@ export async function activate(context: ExtensionContext): Promise { try { window.showTextDocument(uri, { selection: range }); } catch (error) { - window.showWarningMessage(`Could not jump to the location (error: ${error})`); + logToast(LogLevel.Warning, `Could not jump to the location (error: ${error})`); } }); context.subscriptions.push(gotoFileLocationCommand); @@ -291,7 +292,7 @@ export async function activate(context: ExtensionContext): Promise { const runCommand = commands.registerCommand("renpy.runCommand", () => { //EsLint recommends config be removed as it has already been declared in a previous scope if (!config || !isValidExecutable(config.renpyExecutableLocation)) { - window.showErrorMessage("Ren'Py executable location not configured or is invalid."); + logToast(LogLevel.Error, "Ren'Py executable location not configured or is invalid."); } else { //this is kinda a hob botched together attempt that I'm like 30% certain has a chance of working debug.startDebugging( @@ -308,7 +309,7 @@ export async function activate(context: ExtensionContext): Promise { //call renpy const result = RunWorkspaceFolder(); if (result) { - window.showInformationMessage("Ren'Py is running successfully"); + logToast(LogLevel.Info, "Ren'Py is running successfully"); } } }); @@ -320,16 +321,16 @@ export async function activate(context: ExtensionContext): Promise { // Call Ren'Py with the workspace folder and the json-dump argument const config = workspace.getConfiguration("renpy"); if (!config) { - window.showErrorMessage("Ren'Py executable location not configured or is invalid."); + logToast(LogLevel.Error, "Ren'Py executable location not configured or is invalid."); } else { if (isValidExecutable(config.renpyExecutableLocation)) { // call renpy const result = ExecuteRenpyCompile(); if (result) { - window.showInformationMessage("Ren'Py compilation has completed."); + logToast(LogLevel.Info, "Ren'Py compilation has completed."); } } else { - window.showErrorMessage("Ren'Py executable location not configured or is invalid."); + logToast(LogLevel.Error, "Ren'Py executable location not configured or is invalid."); } } }); @@ -349,50 +350,50 @@ export async function activate(context: ExtensionContext): Promise { try { fs.watch(getNavigationJsonFilepath(), async (event, filename) => { if (filename) { - console.log(`${filename} changed`); + logMessage(LogLevel.Debug, `${filename} changed`); updateStatusBar("$(sync~spin) Refreshing Ren'Py navigation data..."); try { await NavigationData.refresh(); } catch (error) { - console.log(`${Date()}: error refreshing NavigationData: ${error}`); + logMessage(LogLevel.Error, `${Date()}: error refreshing NavigationData: ${error}`); } finally { updateStatusBar(getStatusBarText()); } } }); } catch (error) { - console.log(`Watch navigation.json file error: ${error}`); + logMessage(LogLevel.Error, `Watch navigation.json file error: ${error}`); } if (config && config.watchFoldersForChanges) { - console.log("Starting Watcher for images folder."); + logMessage(LogLevel.Info, "Starting Watcher for images folder."); try { fs.watch(getImagesFolder(), { recursive: true }, async (event, filename) => { if (filename && event === "rename") { - console.log(`${filename} created/deleted`); + logMessage(LogLevel.Debug, `${filename} created/deleted`); await NavigationData.scanForImages(); } }); } catch (error) { - console.log(`Watch image folder error: ${error}`); + logMessage(LogLevel.Error, `Watch image folder error: ${error}`); } - console.log("Starting Watcher for audio folder."); + logMessage(LogLevel.Info, "Starting Watcher for audio folder."); try { fs.watch(getAudioFolder(), { recursive: true }, async (event, filename) => { if (filename && event === "rename") { - console.log(`${filename} created/deleted`); + logMessage(LogLevel.Debug, `${filename} created/deleted`); await NavigationData.scanForAudio(); } }); } catch (error) { - console.log(`Watch audio folder error: ${error}`); + logMessage(LogLevel.Error, `Watch audio folder error: ${error}`); } } } export function deactivate() { - console.log("Ren'Py extension deactivating"); + logMessage(LogLevel.Info, "Ren'Py extension deactivating"); fs.unwatchFile(getNavigationJsonFilepath()); } @@ -426,6 +427,7 @@ function updateStatusBar(text: string) { if (text === "") { myStatusBarItem.hide(); } else { + logCatMessage(LogLevel.Info, LogCategory.Status, text); myStatusBarItem.text = text; myStatusBarItem.show(); } @@ -468,15 +470,15 @@ function RunWorkspaceFolder(): boolean { env: { PATH: process.env.PATH }, }); if (result.error) { - console.log(`renpy spawn error: ${result.error}`); + logMessage(LogLevel.Error, `renpy spawn error: ${result.error}`); return false; } if (result.stderr && result.stderr.length > 0) { - console.log(`renpy spawn stderr: ${result.stderr}`); + logMessage(LogLevel.Error, `renpy spawn stderr: ${result.stderr}`); return false; } } catch (error) { - console.log(`renpy spawn error: ${error}`); + logMessage(LogLevel.Error, `renpy spawn error: ${error}`); return false; } finally { updateStatusBar(getStatusBarText()); @@ -485,7 +487,7 @@ function RunWorkspaceFolder(): boolean { } return false; } else { - console.log("config for rennpy does not exist"); + logMessage(LogLevel.Warning, "config for rennpy does not exist"); return false; } } @@ -514,15 +516,15 @@ function ExecuteRenpyCompile(): boolean { windowsHide: true, }); if (result.error) { - console.log(`renpy spawn error: ${result.error}`); + logMessage(LogLevel.Error, `renpy spawn error: ${result.error}`); return false; } if (result.stderr && result.stderr.length > 0) { - console.log(`renpy spawn stderr: ${result.stderr}`); + logMessage(LogLevel.Error, `renpy spawn stderr: ${result.stderr}`); return false; } } catch (error) { - console.log(`renpy spawn error: ${error}`); + logMessage(LogLevel.Error, `renpy spawn error: ${error}`); return false; } finally { NavigationData.isCompiling = false; diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 00000000..605db816 --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,89 @@ +import { window } from "vscode"; + +const outputChannel = window.createOutputChannel("Ren'Py Language Extension", "renpy-log"); + +// eslint-disable-next-line no-shadow +export const enum LogLevel { + Debug, + Info, + Warning, + Error, +} + +// eslint-disable-next-line no-shadow +export const enum LogCategory { + Default, + Status, + Parser, + Tokenizer, +} + +function getLogLevelPrefix(level: LogLevel): string { + switch (level) { + case LogLevel.Debug: + return "[Debug]"; + case LogLevel.Info: + return "[Info]"; + case LogLevel.Warning: + return "[Warning]"; + case LogLevel.Error: + return "[Error]"; + } +} + +function getLogCategoryPrefix(category: LogCategory): string { + switch (category) { + case LogCategory.Default: + return "[Default]"; + case LogCategory.Status: + return "[Status]"; + case LogCategory.Parser: + return "[Parser]"; + case LogCategory.Tokenizer: + return "[Tokenizer]"; + } +} + +export function logMessage(level: LogLevel, message: string, developersOnly = false): void { + logCatMessage(level, LogCategory.Default, message, developersOnly); +} + +export function logCatMessage(level: LogLevel, category: LogCategory, message: string, developersOnly = false): void { + const outputMsg = `${getLogLevelPrefix(level)} ${getLogCategoryPrefix(category)} > ${message}`; + + switch (level) { + case LogLevel.Debug: + console.debug(outputMsg); + break; + case LogLevel.Info: + console.log(outputMsg); + break; + case LogLevel.Warning: + console.warn(outputMsg); + break; + case LogLevel.Error: + console.error(outputMsg); + break; + } + + if (!developersOnly && level >= LogLevel.Info) { + outputChannel.appendLine(outputMsg); + } +} + +export function logToast(level: LogLevel, message: string): void { + logMessage(level, message); + + switch (level) { + case LogLevel.Debug: + case LogLevel.Info: + window.showInformationMessage(message); + break; + case LogLevel.Warning: + window.showWarningMessage(message); + break; + case LogLevel.Error: + window.showErrorMessage(message); + break; + } +} diff --git a/src/navigation-data.ts b/src/navigation-data.ts index 1355606d..d674c13c 100644 --- a/src/navigation-data.ts +++ b/src/navigation-data.ts @@ -1,5 +1,3 @@ -"use strict"; - import { commands, CompletionItem, CompletionItemKind, Position, TextDocument, window, workspace } from "vscode"; import { getDefinitionFromFile } from "./hover"; import { DataType, getBaseTypeFromDefine, getNamedParameter, getPyDocsFromTextDocumentAtLine, Navigation, splitParameters, stripQuotes } from "./navigation"; @@ -9,6 +7,8 @@ import { Displayable } from "./displayable"; import { Character } from "./character"; import data from "./renpy.json"; import kwData from "./renpyauto.json"; +import { LogLevel, logMessage, logToast } from "./logger"; + const filterCharacter = "\u2588"; export class NavigationData { @@ -26,7 +26,7 @@ export class NavigationData { static isCompiling = false; static async init(extensionPath: string) { - console.log(`NavigationData init`); + logMessage(LogLevel.Info, `NavigationData init`); NavigationData.renpyFunctions = data; NavigationData.autoCompleteKeywords = kwData; @@ -58,13 +58,13 @@ export class NavigationData { } static async refresh(interactive = false): Promise { - console.log(`${Date()}: NavigationData refresh`); + logMessage(LogLevel.Info, `${Date()}: NavigationData refresh`); NavigationData.isImporting = true; try { NavigationData.data = readNavigationJson(); if (NavigationData.data.error) { - window.showWarningMessage("Navigation data is empty. Ren'Py could not compile your project. Please check your project can start successfully."); + logToast(LogLevel.Warning, "Navigation data is empty. Ren'Py could not compile your project. Please check your project can start successfully."); } if (NavigationData.data.location === undefined) { NavigationData.data.location = {}; @@ -99,14 +99,14 @@ export class NavigationData { await NavigationData.scanForFonts(); await NavigationData.scanForAudio(); commands.executeCommand("renpy.refreshDiagnostics"); - console.log(`NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); + logMessage(LogLevel.Info, `NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); if (interactive) { - window.showInformationMessage(`NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); + logToast(LogLevel.Info, `NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); } } catch (error) { - console.log(`Error loading NavigationData.json: ${error}`); + logMessage(LogLevel.Error, `Error loading NavigationData.json: ${error}`); if (interactive) { - window.showErrorMessage(`NavigationData.json not loaded. Please check Ren'Py can start your project successfully.`); + logToast(LogLevel.Error, `NavigationData.json not loaded. Please check Ren'Py can start your project successfully.`); } } finally { NavigationData.isImporting = false; @@ -913,7 +913,7 @@ export class NavigationData { } static async getCharacterImageAttributes() { - //console.log("getCharacterImageAttributes"); + //logMessage(LogLevel.Info, "getCharacterImageAttributes"); const characters = NavigationData.gameObjects["characters"]; const displayables = NavigationData.data.location["displayable"]; for (const key in characters) { @@ -1034,7 +1034,7 @@ export class NavigationData { export function readNavigationJson() { try { const filepath = getNavigationJsonFilepath(); - console.log(`readNavigationJson: ${filepath}`); + logMessage(LogLevel.Info, `readNavigationJson: ${filepath}`); let flatData; try { flatData = fs.readFileSync(filepath, "utf-8"); @@ -1044,7 +1044,7 @@ export function readNavigationJson() { const json = JSON.parse(flatData); return json; } catch (error) { - window.showErrorMessage(`readNavigationJson error: ${error}`); + logToast(LogLevel.Error, `readNavigationJson error: ${error}`); } } diff --git a/src/semantics.ts b/src/semantics.ts index 7b42b0a9..60f9f598 100644 --- a/src/semantics.ts +++ b/src/semantics.ts @@ -5,6 +5,7 @@ import { Position, Range, SemanticTokens, SemanticTokensBuilder, SemanticTokensL import { Navigation, splitParameters, rangeAsString, getCurrentContext, DataType } from "./navigation"; import { NavigationData, updateNavigationData } from "./navigation-data"; import { stripWorkspaceFromFile } from "./workspace"; +import { LogLevel, logMessage } from "./logger"; export function getSemanticTokens(document: TextDocument, legend: SemanticTokensLegend): SemanticTokens { const tokensBuilder = new SemanticTokensBuilder(legend); @@ -178,7 +179,7 @@ export function getSemanticTokens(document: TextDocument, legend: SemanticTokens } } } catch (error) { - console.log(error); + logMessage(LogLevel.Error, error as string); } } } @@ -213,7 +214,7 @@ export function getSemanticTokens(document: TextDocument, legend: SemanticTokens } } } catch (error) { - console.log(`error at ${filename}:${i}: ${error}`); + logMessage(LogLevel.Error, `error at ${filename}:${i}: ${error}`); } } } @@ -297,7 +298,7 @@ export function getSemanticTokens(document: TextDocument, legend: SemanticTokens start += m.length + 1; } } catch (error) { - console.log(`error at ${filename}:${i}: ${error}`); + logMessage(LogLevel.Error, `error at ${filename}:${i}: ${error}`); } } } diff --git a/src/tokenizer/debug-decorator.ts b/src/tokenizer/debug-decorator.ts index 73e19cb2..d3d0fe43 100644 --- a/src/tokenizer/debug-decorator.ts +++ b/src/tokenizer/debug-decorator.ts @@ -3,6 +3,7 @@ import { DecorationOptions, Disposable, ExtensionContext, MarkdownString, Uri, w import { CharacterTokenType, LiteralTokenType, EntityTokenType, EscapedCharacterTokenType, KeywordTokenType, MetaTokenType, OperatorTokenType } from "./renpy-tokens"; import { TokenTree } from "./token-definitions"; import { tokenizeDocument } from "./tokenizer"; +import { LogLevel, logMessage, logToast } from "../logger"; let timeout: NodeJS.Timer | undefined = undefined; @@ -199,7 +200,7 @@ function updateDecorations() { tokenCache = tokenizeDocument(activeEditor.document); const t1 = performance.now(); - window.showInformationMessage(`DocumentTokenizer took ${(t1 - t0).toFixed(2)} milliseconds to complete.`); + logToast(LogLevel.Info, `DocumentTokenizer took ${(t1 - t0).toFixed(2)} milliseconds to complete.`); } const tokens = tokenCache; @@ -252,24 +253,36 @@ Content: {${content?.replaceAll("\n", "\\n")}}`, const start = activeEditor?.document.positionAt(token.startPos.charStartOffset); const end = activeEditor?.document.positionAt(token.endPos.charStartOffset); if (range.start.line !== start.line) { - console.error(`Start line number is incorrect!. Got: ${range.start.line + 1}, expected: ${start.line + 1}. On token: -${(decoration.hoverMessage as MarkdownString).value}`); + logMessage( + LogLevel.Error, + `Start line number is incorrect!. Got: ${range.start.line + 1}, expected: ${start.line + 1}. On token: +${(decoration.hoverMessage as MarkdownString).value}` + ); } if (range.end.line !== end.line) { - console.error(`End line number is incorrect!. Got: ${range.end.line + 1}, expected: ${end.line + 1}. On token: -${(decoration.hoverMessage as MarkdownString).value}`); + logMessage( + LogLevel.Error, + `End line number is incorrect!. Got: ${range.end.line + 1}, expected: ${end.line + 1}. On token: +${(decoration.hoverMessage as MarkdownString).value}` + ); } // Debug char numbers if (range.start.character !== start.character) { - console.error(`Start char number is incorrect!. Got: ${range.start.character + 1}, expected: ${start.character + 1}. On token: -${(decoration.hoverMessage as MarkdownString).value}`); + logMessage( + LogLevel.Error, + `Start char number is incorrect!. Got: ${range.start.character + 1}, expected: ${start.character + 1}. On token: +${(decoration.hoverMessage as MarkdownString).value}` + ); } if (range.end.character !== end.character) { - console.error(`End char number is incorrect!. Got: ${range.end.character + 1}, expected: ${end.character + 1}. On token: -${(decoration.hoverMessage as MarkdownString).value}`); + logMessage( + LogLevel.Error, + `End char number is incorrect!. Got: ${range.end.character + 1}, expected: ${end.character + 1}. On token: +${(decoration.hoverMessage as MarkdownString).value}` + ); } switch (token.tokenType) { diff --git a/src/tokenizer/token-definitions.ts b/src/tokenizer/token-definitions.ts index 7c8573c7..47585053 100644 --- a/src/tokenizer/token-definitions.ts +++ b/src/tokenizer/token-definitions.ts @@ -5,6 +5,7 @@ import { Position, Range as VSRange } from "vscode"; import { CharacterTokenType, MetaTokenType, TokenType, TokenTypeIndex } from "./renpy-tokens"; import { TokenPattern, TokenRangePattern, TokenMatchPattern, TokenRepoPattern } from "./token-pattern-types"; import { Vector } from "../utilities/vector"; +import { LogLevel, logMessage } from "../logger"; export class Range { start: number; @@ -86,7 +87,7 @@ export class Token { const end = new Position(this.endPos.line, this.endPos.character); if (start.isEqual(end)) { - console.warn(`Empty token detected at L: ${start.line + 1}, C: ${start.character + 1} !`); + logMessage(LogLevel.Warning, `Empty token detected at L: ${start.line + 1}, C: ${start.character + 1} !`); } return new VSRange(start, end); diff --git a/src/tokenizer/tokenizer.ts b/src/tokenizer/tokenizer.ts index 03614963..0c7b5212 100644 --- a/src/tokenizer/tokenizer.ts +++ b/src/tokenizer/tokenizer.ts @@ -7,6 +7,7 @@ import { RenpyPatterns } from "./token-patterns.g"; import { Stack } from "../utilities/stack"; import { Vector } from "../utilities/vector"; import { TokenPatternCapture, TokenCapturePattern, TokenRepoPattern, TokenRangePattern, TokenMatchPattern } from "./token-pattern-types"; +import { LogCategory, LogLevel, logCatMessage } from "../logger"; const cloneScanResult = (obj: ScanResult | undefined): ScanResult | undefined => { if (obj === undefined) return undefined; @@ -57,9 +58,9 @@ export function tokenizeDocument(document: TextDocument): TokenTree { return cachedTokens.tokens; } - console.log(`Running tokenizer on document: ${document.fileName}`); + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Running tokenizer on document: ${document.fileName}`); const tokenizer = new DocumentTokenizer(document); - console.log(`Tokenizer completed!`); + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Tokenizer completed!`); tokenCache.set(document.uri, { documentVersion: document.version, tokens: tokenizer.tokens }); return tokenizer.tokens; } @@ -78,7 +79,7 @@ function benchmark(document: TextDocument) { const onePercent = loops / 100; const everyX = onePercent * reportEveryXPercent; - console.log(`Running tokenizer benchmark for ${loops} loops...`); + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Running tokenizer benchmark for ${loops} loops...`); let avg = 0; for (let i = 0; i < loops; ++i) { @@ -90,7 +91,7 @@ function benchmark(document: TextDocument) { // This is really just here to prevent the unused variable error if (tokenizer.tokens.isEmpty()) { - console.error("No tokens were found."); + logCatMessage(LogLevel.Error, LogCategory.Tokenizer, "No tokens were found."); } // Show timer @@ -104,11 +105,13 @@ function benchmark(document: TextDocument) { .join(":") .replace(/\b(\d)(?=[hms])/g, "0$1"); - if (i % everyX === 0) console.log(`${i / onePercent}% complete... (avg.: ${msLoop.toFixed(2)}ms, approx. ${timeString} remaining)`); + if (i % everyX === 0) { + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `${i / onePercent}% complete... (avg.: ${msLoop.toFixed(2)}ms, approx. ${timeString} remaining)`); + } } avg /= loops; - console.log(`DocumentTokenizer took ${avg} avg. milliseconds to complete.`); + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `DocumentTokenizer took ${avg} avg. milliseconds to complete.`); } function setupAndValidatePatterns() { @@ -141,7 +144,7 @@ function setupAndValidatePatterns() { } if (gAnchorRe.test(reBeginSource)) { - console.warn("\\G anchor is not supported and will be ignored!"); + logCatMessage(LogLevel.Warning, LogCategory.Tokenizer, "\\G anchor is not supported and will be ignored!", true); reBeginSource = reBeginSource.replace(gAnchorRe, ""); } @@ -181,7 +184,7 @@ function setupAndValidatePatterns() { } if (gAnchorRe.test(reEndSource)) { - console.warn("\\G anchor is not supported and will be ignored!"); + logCatMessage(LogLevel.Warning, LogCategory.Tokenizer, "\\G anchor is not supported and will be ignored!", true); reEndSource = reEndSource.replace(gAnchorRe, ""); } @@ -290,7 +293,12 @@ class DocumentTokenizer { if (captures[i] === undefined) { const pos = this.positionAt(startPos); - console.warn(`There is no pattern defined for capture group '${i}', on a pattern that matched '${match[i]}' near L:${pos.line + 1} C:${pos.character + 1}.\nThis should probably be added or be a non-capturing group.`); + logCatMessage( + LogLevel.Warning, + LogCategory.Tokenizer, + `There is no pattern defined for capture group '${i}', on a pattern that matched '${match[i]}' near L:${pos.line + 1} C:${pos.character + 1}.\nThis should probably be added or be a non-capturing group.`, + true + ); continue; } @@ -592,12 +600,12 @@ class DocumentTokenizer { const coverageResult = this.checkTokenTreeCoverage(rangeNode, new Range(startPos, endPos)); if (!coverageResult.valid) { - console.warn(`The token tree is not covering the entire match range!`); + logCatMessage(LogLevel.Warning, LogCategory.Tokenizer, `The token tree is not covering the entire match range!`, true); for (const gap of coverageResult.gaps) { const gapStartPos = this.document.positionAt(gap.start); const gapEndPos = this.document.positionAt(gap.end); const text = this.document.getText(new VSRange(gapStartPos, gapEndPos)); - console.warn(`Gap from L${gapStartPos.line + 1}:${gapStartPos.character + 1} to L${gapEndPos.line + 1}:${gapEndPos.character + 1}, Text: '${text}'`); + logCatMessage(LogLevel.Warning, LogCategory.Tokenizer, `Gap from L:${gapStartPos.line + 1} C:${gapStartPos.character + 1} to L:${gapEndPos.line + 1} C:${gapEndPos.character + 1}, Text: '${text}'`, true); } } @@ -622,12 +630,12 @@ class DocumentTokenizer { const coverageResult = this.checkTokenTreeCoverage(contentNode, new Range(startPos, endPos)); if (!coverageResult.valid) { - console.warn(`The token tree is not covering the entire match range!`); + logCatMessage(LogLevel.Warning, LogCategory.Tokenizer, `The token tree is not covering the entire match range!`, true); for (const gap of coverageResult.gaps) { const gapStartPos = this.document.positionAt(gap.start); const gapEndPos = this.document.positionAt(gap.end); const text = this.document.getText(new VSRange(gapStartPos, gapEndPos)); - console.warn(`Gap from L${gapStartPos.line + 1}:${gapStartPos.character + 1} to L${gapEndPos.line + 1}:${gapEndPos.character + 1}, Text: '${text}'`); + logCatMessage(LogLevel.Warning, LogCategory.Tokenizer, `Gap from L${gapStartPos.line + 1}:${gapStartPos.character + 1} to L${gapEndPos.line + 1}:${gapEndPos.character + 1}, Text: '${text}'`, true); } } @@ -692,7 +700,7 @@ class DocumentTokenizer { this.applyScanResult(bestMatch, source, parentNode); if (failSafeIndex === lastMatchIndex) { - console.error("The loop has not advanced since the last cycle. This indicates a programming error. Breaking the loop!"); + logCatMessage(LogLevel.Error, LogCategory.Tokenizer, "The loop has not advanced since the last cycle. This indicates a programming error. Breaking the loop!", true); break; } } diff --git a/syntaxes/renpy.log.tmLanguage.json b/syntaxes/renpy.log.tmLanguage.json new file mode 100644 index 00000000..0e0d2f94 --- /dev/null +++ b/syntaxes/renpy.log.tmLanguage.json @@ -0,0 +1,145 @@ +{ + "name": "Ren'Py Log", + "scopeName": "text.renpy-log", + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + + "patterns": [{ "include": "#debug-msg" }, { "include": "#info-msg" }, { "include": "#warning-msg" }, { "include": "#error-msg" }], + + "repository": { + "debug-msg": { + "name": "markup.changed log.debug.renpy", + "begin": "^(\\[)Debug(\\])", + "beginCaptures": { + "1": { "name": "punctuation.definition.log.begin" }, + "2": { "name": "punctuation.definition.log.end" } + }, + "end": "(?=^\\[)", + "patterns": [{ "include": "#msg-content" }] + }, + "info-msg": { + "name": "log.info.renpy", + "begin": "^(\\[)(Info)(\\])", + "beginCaptures": { + "1": { "name": "punctuation.definition.log.begin" }, + "2": { "name": "markup.inserted" }, + "3": { "name": "punctuation.definition.log.end" } + }, + "end": "(?=^\\[)", + "patterns": [{ "include": "#msg-content" }] + }, + "warning-msg": { + "name": "entity.name.function.warning, strong log.warning.renpy", + "begin": "^(\\[)Warning(\\])", + "beginCaptures": { + "1": { "name": "punctuation.definition.tag.begin" }, + "2": { "name": "punctuation.definition.tag.end" } + }, + "end": "(?=^\\[)", + "patterns": [{ "include": "#msg-content" }] + }, + "error-msg": { + "name": "invalid.error, strong log.error.renpy", + "begin": "^(\\[)Error(\\])", + "beginCaptures": { + "1": { "name": "punctuation.definition.tag.begin" }, + "2": { "name": "punctuation.definition.tag.end" } + }, + "end": "(?=^\\[)", + "patterns": [{ "include": "#msg-content" }] + }, + "msg-content": { + "patterns": [ + { + "name": "log.category.renpy", + "match": "(?<=^\\[.+?\\] )(\\[)(.+?)(\\])", + "captures": { + "1": { "name": "punctuation.definition.tag.begin" }, + "2": { "name": "keyword.other" }, + "3": { "name": "punctuation.definition.tag.end" } + } + }, + { + "name": "keyword.operator", + "match": "(?<=\\[.+?\\]) > " + }, + + { "include": "#strings" }, + { "include": "#dates" }, + { "include": "#other" } + ] + }, + "strings": { + "name": "string.quoted", + "begin": "(\"\"\"|\"|'''|'|```|`)(?=.+?\\1)", + "beginCaptures": { + "1": { "name": "punctuation.definition.string.begin" } + }, + "end": "\\1", + "endCaptures": { + "0": { "name": "punctuation.definition.string.end" } + } + }, + "dates": { + "patterns": [ + { + "match": "\\b\\d{4}-\\d{2}-\\d{2}(T|\\b)", + "name": "comment log.date" + }, + { + "match": "(?<=(^|\\s))\\d{2}[^\\w\\s]\\d{2}[^\\w\\s]\\d{4}\\b", + "name": "comment log.date" + }, + { + "match": "\\b\\d{1,2}:\\d{2}(:\\d{2}([.,]\\d{1,})?)?(Z| ?[+-]\\d{1,2}:\\d{2})?\\b", + "name": "comment log.date" + } + ] + }, + "other": { + "patterns": [ + { + "name": "constant.language log.constant", + "comment": "Match line numbers in the format L:123 C:456", + "match": "\\b(L)(:)(\\d+) (C)(:)(\\d+)\\b", + "captures": { + "1": { "name": "constant.language" }, + "2": { "name": "keyword.operator" }, + "3": { "name": "constant.numeric" }, + "4": { "name": "constant.language" }, + "5": { "name": "keyword.operator" }, + "6": { "name": "constant.numeric" } + } + }, + + { + "match": "\\b([0-9a-fA-F]{40}|[0-9a-fA-F]{10}|[0-9a-fA-F]{7})\\b", + "name": "constant.language" + }, + { + "match": "\\b[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}\\b", + "name": "constant.language log.constant" + }, + { + "match": "\\b([0-9a-fA-F]{2,}[:-])+[0-9a-fA-F]{2,}+\\b", + "name": "constant.language log.constant" + }, + { + "match": "\\b([0-9]+|true|false|null)\\b", + "name": "constant.language log.constant" + }, + { + "match": "\\b(0x[a-fA-F0-9]+)\\b", + "name": "constant.language log.constant" + }, + { + "match": "\\b[a-z]+://\\S+\\b/?", + "name": "constant.language log.constant" + }, + { + "match": "(? Date: Thu, 8 Jun 2023 17:57:46 +0200 Subject: [PATCH 071/152] Added style statement + other fixes (#337) - Added low level patterns based on the official grammar specification - Added style statement support with all the currently known properties - Fixed python functions being parsed as variables - Improved parsing of the following statements: - pause - conditionals (if/elif/else) - at - as - with - behind - onlayer - zorder - Improved screen language support slightly (WIP!) --- examples/unit_test.rpy | 16 +- package.json | 2 +- syntaxes/renpy.python.tmLanguage.json | 9 +- syntaxes/renpy.screen.tmLanguage.json | 17 +- syntaxes/renpy.tmLanguage.json | 231 ++++++++++++++++++++++---- 5 files changed, 224 insertions(+), 51 deletions(-) diff --git a/examples/unit_test.rpy b/examples/unit_test.rpy index fe4a6637..96d4cef9 100644 --- a/examples/unit_test.rpy +++ b/examples/unit_test.rpy @@ -1199,6 +1199,14 @@ translate piglatin python: style.default.font = "stonecutter.ttf" + old "These two lines will be combined together to form a long line.\n\nThis line will be separate." + new _p(""" + These two lines will be combined together + to form a long line. Bork bork bork. + + This line will be separate. Bork bork bork. + """) + frame: style_prefix "pref" has vbox @@ -1214,13 +1222,7 @@ This line will be separate. """) - old "These two lines will be combined together to form a long line.\n\nThis line will be separate." - new _p(""" - These two lines will be combined together - to form a long line. Bork bork bork. - - This line will be separate. Bork bork bork. - """) + #endregion Translation diff --git a/package.json b/package.json index 97cf33e9..6de502a2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.3.2", + "version": "2.3.3", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", diff --git a/syntaxes/renpy.python.tmLanguage.json b/syntaxes/renpy.python.tmLanguage.json index 6821c4f2..205ccbd2 100644 --- a/syntaxes/renpy.python.tmLanguage.json +++ b/syntaxes/renpy.python.tmLanguage.json @@ -260,12 +260,11 @@ }, "member-access": { "name": "meta.member.access.python", - "contentName": "variable.name.python", "begin": "(\\.)\\s*(?!\\.)", - "end": "(?<=\\S)(?=\\W)|(^|(?<=\\s))(?=[^\\\\\\w\\s])|$", "beginCaptures": { "1": { "name": "punctuation.separator.period.python" } }, + "end": "(?<=\\S)(?=\\W)|(^|(?<=\\s))(?=[^\\\\\\w\\s])|$", "patterns": [{ "include": "#function-call" }, { "include": "#member-access-base" }, { "include": "#member-access-attribute" }] }, "member-access-base": { @@ -273,7 +272,7 @@ }, "member-access-attribute": { "comment": "Highlight attribute access in otherwise non-specialized cases.", - "name": "meta.attribute.python", + "name": "variable.name.python meta.attribute.python", "match": "\\b([[:alpha:]_]\\w*)\\b" }, "special-names": { @@ -868,7 +867,7 @@ "item-access": { "patterns": [ { - "name": "meta.item-access.python", + "name": "variable.name.python meta.item-access.python", "begin": "\\b(?=[[:alpha:]_]\\w*\\s*\\[)", "end": "(\\])", "endCaptures": { @@ -967,7 +966,7 @@ { "include": "#builtin-possible-callables" }, { "comment": "Some color schemas support meta.function-call.generic scope", - "name": "meta.function-call.generic.python", + "name": "entity.name.function.call.python meta.function-call.generic.python", "match": "\\b([[:alpha:]_]\\w*)\\b" } ] diff --git a/syntaxes/renpy.screen.tmLanguage.json b/syntaxes/renpy.screen.tmLanguage.json index 3cf99250..6467db56 100644 --- a/syntaxes/renpy.screen.tmLanguage.json +++ b/syntaxes/renpy.screen.tmLanguage.json @@ -25,7 +25,7 @@ ] }, "screen-build-in-properties": { - "comment": "https://www.renpy.org/doc/html/atl.html#list-of-transform-properties", + "comment": "These are the ATL keywords, will need to fix this later", "patterns": [ { "comment": "Special manipulation keywords", @@ -37,6 +37,18 @@ "4": { "name": "keyword.counterclockwise.renpy" } } }, + { + "comment": "Special manipulation keywords", + "match": "\\b(? Date: Sat, 10 Jun 2023 23:43:02 +0200 Subject: [PATCH 072/152] Syntax fixes and update typescript patterns (#339) Move token string converters --- src/tokenizer/atl-token-patterns.g.ts | 104 +++- src/tokenizer/debug-decorator.ts | 361 +---------- src/tokenizer/python-token-patterns.g.ts | 8 +- src/tokenizer/renpy-token-patterns.g.ts | 761 ++++++++++++++--------- src/tokenizer/renpy-tokens.ts | 20 + src/tokenizer/screen-token-patterns.g.ts | 366 +++++++++++ src/tokenizer/token-definitions.ts | 365 ++++++++++- src/tokenizer/token-patterns.g.ts | 62 +- src/utilities/utils.ts | 3 + syntax-to-token-pattern.py | 20 +- syntaxes/renpy.atl.tmLanguage.json | 2 +- syntaxes/renpy.python.tmLanguage.json | 1 - syntaxes/renpy.screen.tmLanguage.json | 13 +- syntaxes/renpy.tmLanguage.json | 105 ++-- 14 files changed, 1445 insertions(+), 746 deletions(-) create mode 100644 src/tokenizer/screen-token-patterns.g.ts create mode 100644 src/utilities/utils.ts diff --git a/src/tokenizer/atl-token-patterns.g.ts b/src/tokenizer/atl-token-patterns.g.ts index acbad446..65c3f9c4 100644 --- a/src/tokenizer/atl-token-patterns.g.ts +++ b/src/tokenizer/atl-token-patterns.g.ts @@ -5,7 +5,7 @@ // THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR // DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. // ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. -// Last generated: 01/06/2023 14:57:48 (UTC+0) +// Last generated: 10/06/2023 21:08:08 (UTC+0) import { KeywordTokenType, EntityTokenType, MetaTokenType, CharacterTokenType } from "./renpy-tokens"; import { TokenPattern } from "./token-pattern-types"; @@ -35,91 +35,91 @@ export const atlBuildInProperties: TokenPattern = { debugName: "atlBuildInProperties.patterns![1]", // position props (int, absolute, or a float) - token: EntityTokenType.PropertyName, /*support.type.property-name.transform.renpy*/ + token: EntityTokenType.TagName, /*support.type.property-name.transform.renpy entity.name.tag.css.transform.renpy*/ match: /\b(? = { - [P in keyof Type]: { name: P; value: Type[P] }; -}; - -const tokenTypeDefinitions: EnumToString = { - Init: { name: "Init", value: KeywordTokenType.Init }, - Offset: { name: "Offset", value: KeywordTokenType.Offset }, - Python: { name: "Python", value: KeywordTokenType.Python }, - Hide: { name: "Hide", value: KeywordTokenType.Hide }, - Early: { name: "Early", value: KeywordTokenType.Early }, - Define: { name: "Define", value: KeywordTokenType.Define }, - Default: { name: "Default", value: KeywordTokenType.Default }, - - Label: { name: "Label", value: KeywordTokenType.Label }, - Menu: { name: "Menu", value: KeywordTokenType.Menu }, - Pause: { name: "Pause", value: KeywordTokenType.Pause }, - Screen: { name: "Screen", value: KeywordTokenType.Screen }, - Scene: { name: "Scene", value: KeywordTokenType.Scene }, - Camera: { name: "Camera", value: KeywordTokenType.Camera }, - Show: { name: "Show", value: KeywordTokenType.Show }, - Image: { name: "Image", value: KeywordTokenType.Image }, - LayeredImage: { name: "LayeredImage", value: KeywordTokenType.LayeredImage }, - Window: { name: "Window", value: KeywordTokenType.Window }, - Frame: { name: "Frame", value: KeywordTokenType.Frame }, - Transform: { name: "Transform", value: KeywordTokenType.Transform }, - Translate: { name: "Translate", value: KeywordTokenType.Translate }, - Extend: { name: "Extend", value: KeywordTokenType.Extend }, - NVLClear: { name: "NVLClear", value: KeywordTokenType.NVLClear }, - - Voice: { name: "Voice", value: KeywordTokenType.Voice }, - Sound: { name: "Sound", value: KeywordTokenType.Sound }, - Play: { name: "Play", value: KeywordTokenType.Play }, - Queue: { name: "Queue", value: KeywordTokenType.Queue }, - Stop: { name: "Stop", value: KeywordTokenType.Stop }, - Fadeout: { name: "Fadeout", value: KeywordTokenType.Fadeout }, - - Set: { name: "Set", value: KeywordTokenType.Set }, - Expression: { name: "Expression", value: KeywordTokenType.Expression }, - At: { name: "At", value: KeywordTokenType.At }, - As: { name: "As", value: KeywordTokenType.As }, - With: { name: "With", value: KeywordTokenType.With }, - Onlayer: { name: "Onlayer", value: KeywordTokenType.Onlayer }, - Zorder: { name: "Zorder", value: KeywordTokenType.Zorder }, - Behind: { name: "Behind", value: KeywordTokenType.Behind }, - Animation: { name: "Animation", value: KeywordTokenType.Animation }, - From: { name: "From", value: KeywordTokenType.From }, - Time: { name: "Time", value: KeywordTokenType.Time }, - Repeat: { name: "Repeat", value: KeywordTokenType.Repeat }, - DollarSign: { name: "DollarSign", value: KeywordTokenType.DollarSign }, - Sensitive: { name: "Sensitive", value: KeywordTokenType.Sensitive }, - Text: { name: "Text", value: KeywordTokenType.Text }, - Other: { name: "Other", value: KeywordTokenType.Other }, - OtherPython: { name: "OtherPython", value: KeywordTokenType.OtherPython }, - OtherAudio: { name: "OtherAudio", value: KeywordTokenType.OtherAudio }, - - If: { name: "If", value: KeywordTokenType.If }, - Elif: { name: "Elif", value: KeywordTokenType.Elif }, - Else: { name: "Else", value: KeywordTokenType.Else }, - - In: { name: "In", value: KeywordTokenType.In }, - For: { name: "For", value: KeywordTokenType.For }, - While: { name: "While", value: KeywordTokenType.While }, - Pass: { name: "Pass", value: KeywordTokenType.Pass }, - Return: { name: "Return", value: KeywordTokenType.Return }, - Jump: { name: "Jump", value: KeywordTokenType.Jump }, - Call: { name: "Call", value: KeywordTokenType.Call }, - Contains: { name: "Contains", value: KeywordTokenType.Contains }, - Parallel: { name: "Parallel", value: KeywordTokenType.Parallel }, - Block: { name: "Block", value: KeywordTokenType.Block }, - Choice: { name: "Choice", value: KeywordTokenType.Choice }, - - Warp: { name: "Warp", value: KeywordTokenType.Warp }, - Circles: { name: "Circles", value: KeywordTokenType.Circles }, - Clockwise: { name: "Clockwise", value: KeywordTokenType.Clockwise }, - Counterclockwise: { name: "Counterclockwise", value: KeywordTokenType.Counterclockwise }, - Event: { name: "Event", value: KeywordTokenType.Event }, - On: { name: "On", value: KeywordTokenType.On }, - Function: { name: "Function", value: KeywordTokenType.Function }, - - Import: { name: "Import", value: KeywordTokenType.Import }, - Class: { name: "Class", value: KeywordTokenType.Class }, - Metaclass: { name: "Metaclass", value: KeywordTokenType.Metaclass }, - Lambda: { name: "Lambda", value: KeywordTokenType.Lambda }, - Async: { name: "Async", value: KeywordTokenType.Async }, - Def: { name: "Def", value: KeywordTokenType.Def }, - Global: { name: "Global", value: KeywordTokenType.Global }, - Nonlocal: { name: "Nonlocal", value: KeywordTokenType.Nonlocal }, - - ClassName: { name: "ClassName", value: EntityTokenType.ClassName }, - InheritedClassName: { name: "InheritedClassName", value: EntityTokenType.InheritedClassName }, - TypeName: { name: "TypeName", value: EntityTokenType.TypeName }, - NamespaceName: { name: "NamespaceName", value: EntityTokenType.NamespaceName }, - FunctionName: { name: "FunctionName", value: EntityTokenType.FunctionName }, - TagName: { name: "TagName", value: EntityTokenType.TagName }, - VariableName: { name: "VariableName", value: EntityTokenType.VariableName }, - - ImageName: { name: "ImageName", value: EntityTokenType.ImageName }, - TextName: { name: "TextName", value: EntityTokenType.TextName }, - AudioName: { name: "AudioName", value: EntityTokenType.AudioName }, - CharacterName: { name: "CharacterName", value: EntityTokenType.CharacterName }, - - EventName: { name: "EventName", value: EntityTokenType.EventName }, - PropertyName: { name: "PropertyName", value: EntityTokenType.PropertyName }, - - String: { name: "String", value: LiteralTokenType.String }, - UnquotedString: { name: "UnquotedString", value: LiteralTokenType.UnquotedString }, - - Color: { name: "Color", value: LiteralTokenType.Color }, - - Integer: { name: "Integer", value: LiteralTokenType.Integer }, - Float: { name: "Float", value: LiteralTokenType.Float }, - - Boolean: { name: "Boolean", value: LiteralTokenType.Boolean }, - - Plus: { name: "Plus", value: OperatorTokenType.Plus }, - Minus: { name: "Minus", value: OperatorTokenType.Minus }, - Multiply: { name: "Multiply", value: OperatorTokenType.Multiply }, - Divide: { name: "Divide", value: OperatorTokenType.Divide }, - Modulo: { name: "Modulo", value: OperatorTokenType.Modulo }, - Exponentiate: { name: "Exponentiate", value: OperatorTokenType.Exponentiate }, - FloorDivide: { name: "FloorDivide", value: OperatorTokenType.FloorDivide }, - - BitwiseAnd: { name: "BitwiseAnd", value: OperatorTokenType.BitwiseAnd }, - BitwiseOr: { name: "BitwiseOr", value: OperatorTokenType.BitwiseOr }, - BitwiseXOr: { name: "BitwiseXOr", value: OperatorTokenType.BitwiseXOr }, - BitwiseNot: { name: "BitwiseNot", value: OperatorTokenType.BitwiseNot }, - BitwiseLeftShift: { name: "BitwiseLeftShift", value: OperatorTokenType.BitwiseLeftShift }, - BitwiseRightShift: { name: "BitwiseRightShift", value: OperatorTokenType.BitwiseRightShift }, - - Assignment: { name: "Assignment", value: OperatorTokenType.Assignment }, - PlusAssign: { name: "PlusAssign", value: OperatorTokenType.PlusAssign }, - MinusAssign: { name: "MinusAssign", value: OperatorTokenType.MinusAssign }, - MultiplyAssign: { name: "MultiplyAssign", value: OperatorTokenType.MultiplyAssign }, - DivideAssign: { name: "DivideAssign", value: OperatorTokenType.DivideAssign }, - ModuloAssign: { name: "ModuloAssign", value: OperatorTokenType.ModuloAssign }, - ExponentiateAssign: { name: "ExponentiateAssign", value: OperatorTokenType.ExponentiateAssign }, - FloorDivideAssign: { name: "FloorDivideAssign", value: OperatorTokenType.FloorDivideAssign }, - BitwiseAndAssign: { name: "BitwiseAndAssign", value: OperatorTokenType.BitwiseAndAssign }, - BitwiseOrAssign: { name: "BitwiseOrAssign", value: OperatorTokenType.BitwiseOrAssign }, - BitwiseXOrAssign: { name: "BitwiseXOrAssign", value: OperatorTokenType.BitwiseXOrAssign }, - BitwiseLeftShiftAssign: { name: "BitwiseLeftShiftAssign", value: OperatorTokenType.BitwiseLeftShiftAssign }, - BitwiseRightShiftAssign: { name: "BitwiseRightShiftAssign", value: OperatorTokenType.BitwiseRightShiftAssign }, - - Equals: { name: "Equals", value: OperatorTokenType.Equals }, - NotEquals: { name: "NotEquals", value: OperatorTokenType.NotEquals }, - GreaterThan: { name: "GreaterThan", value: OperatorTokenType.GreaterThan }, - LessThan: { name: "LessThan", value: OperatorTokenType.LessThan }, - GreaterThanEquals: { name: "GreaterThanEquals", value: OperatorTokenType.GreaterThanEquals }, - LessThanEquals: { name: "LessThanEquals", value: OperatorTokenType.LessThanEquals }, - - And: { name: "And", value: OperatorTokenType.And }, - Or: { name: "Or", value: OperatorTokenType.Or }, - Not: { name: "Not", value: OperatorTokenType.Not }, - - Is: { name: "Is", value: OperatorTokenType.Is }, - IsNot: { name: "IsNot", value: OperatorTokenType.IsNot }, - - NotIn: { name: "NotIn", value: OperatorTokenType.NotIn }, - - Unpacking: { name: "Unpacking", value: OperatorTokenType.Unpacking }, - PositionalParameter: { name: "PositionalParameter", value: OperatorTokenType.PositionalParameter }, - - Quantifier: { name: "Quantifier", value: OperatorTokenType.Quantifier }, - Disjunction: { name: "Disjunction", value: OperatorTokenType.Disjunction }, - Negation: { name: "Negation", value: OperatorTokenType.Negation }, - Lookahead: { name: "Lookahead", value: OperatorTokenType.Lookahead }, - LookaheadNegative: { name: "LookaheadNegative", value: OperatorTokenType.LookaheadNegative }, - Lookbehind: { name: "Lookbehind", value: OperatorTokenType.Lookbehind }, - LookbehindNegative: { name: "LookbehindNegative", value: OperatorTokenType.LookbehindNegative }, - Conditional: { name: "Conditional", value: OperatorTokenType.Conditional }, - ConditionalNegative: { name: "ConditionalNegative", value: OperatorTokenType.ConditionalNegative }, - - Unknown: { name: "Unknown", value: CharacterTokenType.Unknown }, - - OpenParentheses: { name: "OpenParentheses", value: CharacterTokenType.OpenParentheses }, - CloseParentheses: { name: "CloseParentheses", value: CharacterTokenType.CloseParentheses }, - - OpenBracket: { name: "OpenBracket", value: CharacterTokenType.OpenBracket }, - CloseBracket: { name: "CloseBracket", value: CharacterTokenType.CloseBracket }, - - OpenSquareBracket: { name: "OpenSquareBracket", value: CharacterTokenType.OpenSquareBracket }, - CloseSquareBracket: { name: "CloseSquareBracket", value: CharacterTokenType.CloseSquareBracket }, - - Whitespace: { name: "Whitespace", value: CharacterTokenType.Whitespace }, - NewLine: { name: "NewLine", value: CharacterTokenType.NewLine }, - - Period: { name: "Period", value: CharacterTokenType.Period }, - Colon: { name: "Colon", value: CharacterTokenType.Colon }, - Semicolon: { name: "Semicolon", value: CharacterTokenType.Semicolon }, - Comma: { name: "Comma", value: CharacterTokenType.Comma }, - Hashtag: { name: "Hashtag", value: CharacterTokenType.Hashtag }, - Caret: { name: "Caret", value: CharacterTokenType.Caret }, - DollarSymbol: { name: "DollarSymbol", value: CharacterTokenType.DollarSymbol }, - AtSymbol: { name: "AtSymbol", value: CharacterTokenType.AtSymbol }, - EqualsSymbol: { name: "EqualsSymbol", value: CharacterTokenType.EqualsSymbol }, - - Quote: { name: "Quote", value: CharacterTokenType.Quote }, - DoubleQuote: { name: "DoubleQuote", value: CharacterTokenType.DoubleQuote }, - BackQuote: { name: "BackQuote", value: CharacterTokenType.BackQuote }, - - Backslash: { name: "Backslash", value: CharacterTokenType.Backslash }, - ForwardSlash: { name: "ForwardSlash", value: CharacterTokenType.ForwardSlash }, - - EscWhitespace: { name: "EscWhitespace", value: EscapedCharacterTokenType.EscWhitespace }, - EscNewline: { name: "EscNewline", value: EscapedCharacterTokenType.EscNewline }, - - EscQuote: { name: "EscQuote", value: EscapedCharacterTokenType.EscQuote }, - EscDoubleQuote: { name: "EscDoubleQuote", value: EscapedCharacterTokenType.EscDoubleQuote }, - EscBackslash: { name: "EscBackslash", value: EscapedCharacterTokenType.EscBackslash }, - EscOpenSquareBracket: { name: "EscOpenSquareBracket", value: EscapedCharacterTokenType.EscOpenSquareBracket }, - EscOpenBracket: { name: "EscOpenBracket", value: EscapedCharacterTokenType.EscOpenBracket }, - - Invalid: { name: "Invalid", value: MetaTokenType.Invalid }, - Deprecated: { name: "Deprecated", value: MetaTokenType.Deprecated }, - - Comment: { name: "Comment", value: MetaTokenType.Comment }, - CommentCodeTag: { name: "CommentCodeTag", value: MetaTokenType.CommentCodeTag }, - CommentRegionTag: { name: "CommentRegionTag", value: MetaTokenType.CommentRegionTag }, - TypehintComment: { name: "TypehintComment", value: MetaTokenType.TypehintComment }, - TypehintDirective: { name: "TypehintDirective", value: MetaTokenType.TypehintDirective }, - TypehintIgnore: { name: "TypehintIgnore", value: MetaTokenType.TypehintIgnore }, - TypehintType: { name: "TypehintType", value: MetaTokenType.TypehintType }, - TypehintPunctuation: { name: "TypehintPunctuation", value: MetaTokenType.TypehintPunctuation }, - TypehintVariable: { name: "TypehintVariable", value: MetaTokenType.TypehintVariable }, - Docstring: { name: "Docstring", value: MetaTokenType.Docstring }, - - StringBegin: { name: "StringBegin", value: MetaTokenType.StringBegin }, - StringEnd: { name: "StringEnd", value: MetaTokenType.StringEnd }, - - CodeBlock: { name: "CodeBlock", value: MetaTokenType.CodeBlock }, - PythonLine: { name: "PythonLine", value: MetaTokenType.PythonLine }, - PythonBlock: { name: "PythonBlock", value: MetaTokenType.PythonBlock }, - Arguments: { name: "Arguments", value: MetaTokenType.Arguments }, - - EmptyString: { name: "EmptyString", value: MetaTokenType.EmptyString }, - StringTag: { name: "StringTag", value: MetaTokenType.StringTag }, - TagBlock: { name: "TagBlock", value: MetaTokenType.TagBlock }, - TaggedString: { name: "TaggedString", value: MetaTokenType.TaggedString }, - Placeholder: { name: "Placeholder", value: MetaTokenType.Placeholder }, - - MenuStatement: { name: "MenuStatement", value: MetaTokenType.MenuStatement }, - MenuBlock: { name: "MenuBlock", value: MetaTokenType.MenuBlock }, - MenuOption: { name: "MenuOption", value: MetaTokenType.MenuOption }, - MenuOptionBlock: { name: "MenuOptionBlock", value: MetaTokenType.MenuOptionBlock }, - - LabelStatement: { name: "LabelStatement", value: MetaTokenType.LabelStatement }, - LabelCall: { name: "LabelCall", value: MetaTokenType.LabelCall }, - LabelAccess: { name: "LabelAccess", value: MetaTokenType.LabelAccess }, - - BehindStatement: { name: "BehindStatement", value: MetaTokenType.BehindStatement }, - OnlayerStatement: { name: "OnlayerStatement", value: MetaTokenType.OnlayerStatement }, - ZorderStatement: { name: "ZorderStatement", value: MetaTokenType.ZorderStatement }, - AtStatement: { name: "AtStatement", value: MetaTokenType.AtStatement }, - AsStatement: { name: "AsStatement", value: MetaTokenType.AsStatement }, - WithStatement: { name: "WithStatement", value: MetaTokenType.WithStatement }, - - ImageStatement: { name: "ImageStatement", value: MetaTokenType.ImageStatement }, - CameraStatement: { name: "CameraStatement", value: MetaTokenType.CameraStatement }, - SceneStatement: { name: "SceneStatement", value: MetaTokenType.SceneStatement }, - ShowStatement: { name: "ShowStatement", value: MetaTokenType.ShowStatement }, - - JumpStatement: { name: "JumpStatement", value: MetaTokenType.JumpStatement }, - CallStatement: { name: "CallStatement", value: MetaTokenType.CallStatement }, - - PlayAudioStatement: { name: "PlayAudioStatement", value: MetaTokenType.PlayAudioStatement }, - QueueAudioStatement: { name: "QueueAudioStatement", value: MetaTokenType.QueueAudioStatement }, - StopAudioStatement: { name: "StopAudioStatement", value: MetaTokenType.StopAudioStatement }, - - ScreenStatement: { name: "ScreenStatement", value: MetaTokenType.ScreenStatement }, - ScreenSensitive: { name: "ScreenSensitive", value: MetaTokenType.ScreenSensitive }, - ScreenFrame: { name: "ScreenFrame", value: MetaTokenType.ScreenFrame }, - ScreenWindow: { name: "ScreenWindow", value: MetaTokenType.ScreenWindow }, - ScreenText: { name: "ScreenText", value: MetaTokenType.ScreenText }, - ScreenBlock: { name: "ScreenBlock", value: MetaTokenType.ScreenBlock }, - - NarratorSayStatement: { name: "NarratorSayStatement", value: MetaTokenType.NarratorSayStatement }, - SayStatement: { name: "SayStatement", value: MetaTokenType.SayStatement }, - CharacterNameString: { name: "CharacterNameString", value: MetaTokenType.CharacterNameString }, - SayNarrator: { name: "SayNarrator", value: MetaTokenType.SayNarrator }, - SayCharacter: { name: "SayCharacter", value: MetaTokenType.SayCharacter }, - - AtParameters: { name: "AtParameters", value: MetaTokenType.AtParameters }, - AsParameters: { name: "AsParameters", value: MetaTokenType.AsParameters }, - BehindParameters: { name: "BehindParameters", value: MetaTokenType.BehindParameters }, - OnlayerParameters: { name: "OnlayerParameters", value: MetaTokenType.OnlayerParameters }, - WithParameters: { name: "WithParameters", value: MetaTokenType.WithParameters }, - ZorderParameters: { name: "ZorderParameters", value: MetaTokenType.ZorderParameters }, - - ATLBlock: { name: "ATLBlock", value: MetaTokenType.ATLBlock }, - ATLChoiceBlock: { name: "ATLChoiceBlock", value: MetaTokenType.ATLChoiceBlock }, - ATLContains: { name: "ATLContains", value: MetaTokenType.ATLContains }, - ATLWith: { name: "ATLWith", value: MetaTokenType.ATLWith }, - ATLEvent: { name: "ATLEvent", value: MetaTokenType.ATLEvent }, - ATLFunction: { name: "ATLFunction", value: MetaTokenType.ATLFunction }, - ATLWarper: { name: "ATLWarper", value: MetaTokenType.ATLWarper }, - ATLOn: { name: "ATLOn", value: MetaTokenType.ATLOn }, - - MemberAccess: { name: "MemberAccess", value: MetaTokenType.MemberAccess }, - ItemAccess: { name: "ItemAccess", value: MetaTokenType.ItemAccess }, - IndexedName: { name: "IndexedName", value: MetaTokenType.IndexedName }, - Attribute: { name: "Attribute", value: MetaTokenType.Attribute }, - ClassDefinition: { name: "ClassDefinition", value: MetaTokenType.ClassDefinition }, - ClassInheritance: { name: "ClassInheritance", value: MetaTokenType.ClassInheritance }, - FunctionDefinition: { name: "FunctionDefinition", value: MetaTokenType.FunctionDefinition }, - LambdaFunction: { name: "LambdaFunction", value: MetaTokenType.LambdaFunction }, - FunctionLambdaParameters: { name: "FunctionLambdaParameters", value: MetaTokenType.FunctionLambdaParameters }, - FunctionParameters: { name: "FunctionParameters", value: MetaTokenType.FunctionParameters }, - FunctionDecorator: { name: "FunctionDecorator", value: MetaTokenType.FunctionDecorator }, - FunctionCall: { name: "FunctionCall", value: MetaTokenType.FunctionCall }, - FunctionCallGeneric: { name: "FunctionCallGeneric", value: MetaTokenType.FunctionCallGeneric }, - Fstring: { name: "Fstring", value: MetaTokenType.Fstring }, - ControlFlowKeyword: { name: "ControlFlowKeyword", value: MetaTokenType.ControlFlowKeyword }, - LogicalOperatorKeyword: { name: "LogicalOperatorKeyword", value: MetaTokenType.LogicalOperatorKeyword }, - Operator: { name: "Operator", value: MetaTokenType.Operator }, - ArithmeticOperator: { name: "ArithmeticOperator", value: MetaTokenType.ArithmeticOperator }, - BitwiseOperatorKeyword: { name: "BitwiseOperatorKeyword", value: MetaTokenType.BitwiseOperatorKeyword }, - ComparisonOperatorKeyword: { name: "ComparisonOperatorKeyword", value: MetaTokenType.ComparisonOperatorKeyword }, - ConstantLiteral: { name: "ConstantLiteral", value: MetaTokenType.ConstantLiteral }, - ConstantNumeric: { name: "ConstantNumeric", value: MetaTokenType.ConstantNumeric }, - ConstantCaps: { name: "ConstantCaps", value: MetaTokenType.ConstantCaps }, - BuiltinExceptionType: { name: "BuiltinExceptionType", value: MetaTokenType.BuiltinExceptionType }, - BuiltinType: { name: "BuiltinType", value: MetaTokenType.BuiltinType }, - MagicVariable: { name: "MagicVariable", value: MetaTokenType.MagicVariable }, - EscapeSequence: { name: "EscapeSequence", value: MetaTokenType.EscapeSequence }, - FormatPercent: { name: "FormatPercent", value: MetaTokenType.FormatPercent }, - FormatBrace: { name: "FormatBrace", value: MetaTokenType.FormatBrace }, - StringStorageType: { name: "StringStorageType", value: MetaTokenType.StringStorageType }, - FormatStorageType: { name: "FormatStorageType", value: MetaTokenType.FormatStorageType }, - ImaginaryNumberStorageType: { name: "ImaginaryNumberStorageType", value: MetaTokenType.ImaginaryNumberStorageType }, - NumberStorageType: { name: "NumberStorageType", value: MetaTokenType.NumberStorageType }, - ClassStorageType: { name: "ClassStorageType", value: MetaTokenType.ClassStorageType }, - CommentBegin: { name: "CommentBegin", value: MetaTokenType.CommentBegin }, - CommentEnd: { name: "CommentEnd", value: MetaTokenType.CommentEnd }, - Backreference: { name: "Backreference", value: MetaTokenType.Backreference }, - BackreferenceNamed: { name: "BackreferenceNamed", value: MetaTokenType.BackreferenceNamed }, - CharacterSet: { name: "CharacterSet", value: MetaTokenType.CharacterSet }, - Named: { name: "Named", value: MetaTokenType.Named }, - ModifierFlagStorageType: { name: "ModifierFlagStorageType", value: MetaTokenType.ModifierFlagStorageType }, -}; - -export const tokenTypeToStringMap = Object.fromEntries(Object.entries(tokenTypeDefinitions).map(([, v]) => [v.value, v.name])); diff --git a/src/tokenizer/python-token-patterns.g.ts b/src/tokenizer/python-token-patterns.g.ts index 71dac1ee..715bed9e 100644 --- a/src/tokenizer/python-token-patterns.g.ts +++ b/src/tokenizer/python-token-patterns.g.ts @@ -5,7 +5,7 @@ // THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR // DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. // ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. -// Last generated: 01/06/2023 14:57:48 (UTC+0) +// Last generated: 10/06/2023 21:08:08 (UTC+0) import { MetaTokenType, KeywordTokenType, EntityTokenType, CharacterTokenType, OperatorTokenType, LiteralTokenType } from "./renpy-tokens"; import { TokenPattern } from "./token-pattern-types"; @@ -286,7 +286,7 @@ export const memberAccessAttribute: TokenPattern = { debugName: "memberAccessAttribute", // Highlight attribute access in otherwise non-specialized cases. - token: MetaTokenType.Attribute, /*meta.attribute.python*/ + token: MetaTokenType.Attribute, /*variable.name.python meta.attribute.python*/ match: /\b([a-zA-Z_]\w*)\b/g, }; @@ -1037,7 +1037,7 @@ export const itemAccess: TokenPattern = { { debugName: "itemAccess.patterns![0]", - token: MetaTokenType.ItemAccess, /*meta.item-access.python*/ + token: MetaTokenType.ItemAccess, /*variable.name.python meta.item-access.python*/ begin: /\b(?=[a-zA-Z_]\w*\s*\[)/g, end: /(\])/dg, endCaptures: { @@ -1163,7 +1163,7 @@ export const functionName: TokenPattern = { debugName: "functionName.patterns![1]", // Some color schemas support meta.function-call.generic scope - token: MetaTokenType.FunctionCall, /*meta.function-call.generic.python*/ + token: MetaTokenType.FunctionCall, /*entity.name.function.call.python meta.function-call.generic.python*/ match: /\b([a-zA-Z_]\w*)\b/g, }, ] diff --git a/src/tokenizer/renpy-token-patterns.g.ts b/src/tokenizer/renpy-token-patterns.g.ts index 18a72c76..9bac6260 100644 --- a/src/tokenizer/renpy-token-patterns.g.ts +++ b/src/tokenizer/renpy-token-patterns.g.ts @@ -5,21 +5,30 @@ // THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR // DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. // ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. -// Last generated: 01/06/2023 14:57:48 (UTC+0) +// Last generated: 10/06/2023 21:08:08 (UTC+0) -import { MetaTokenType, CharacterTokenType, LiteralTokenType, KeywordTokenType, EscapedCharacterTokenType, EntityTokenType, OperatorTokenType } from "./renpy-tokens"; +import { MetaTokenType, CharacterTokenType, LiteralTokenType, EntityTokenType, KeywordTokenType, EscapedCharacterTokenType, OperatorTokenType } from "./renpy-tokens"; import { TokenPattern } from "./token-pattern-types"; export const statements: TokenPattern = { + patterns: [] +}; + +export const expressions: TokenPattern = { patterns: [ ] }; -export const expressions: TokenPattern = { +export const renpyOnlyExpressions: TokenPattern = { patterns: [ ] }; +export const renpyPythonExpressions: TokenPattern = { + patterns: [ + renpyOnlyExpressions] +}; + export const invalidToken: TokenPattern = { debugName: "invalidToken", @@ -151,7 +160,7 @@ export const fallbackCharacters: TokenPattern = { { debugName: "fallbackCharacters.patterns![19]", - token: MetaTokenType.Invalid, /*invalid.illegal.word.renpy*/ + token: MetaTokenType.Invalid, /*debug.invalid.illegal.unmatched.renpy*/ match: /\b\w+\b/g, }, { @@ -163,6 +172,10 @@ export const fallbackCharacters: TokenPattern = { ] }; +export const fallbackPatterns: TokenPattern = { + patterns: [fallbackCharacters] +}; + export const literal: TokenPattern = { patterns: [ { @@ -178,20 +191,109 @@ export const literal: TokenPattern = { export const numFloat: TokenPattern = { debugName: "numFloat", - token: LiteralTokenType.Float, /*constant.numeric.float.renpy*/ - match: /(? = { + Init: { name: "Init", value: KeywordTokenType.Init }, + Offset: { name: "Offset", value: KeywordTokenType.Offset }, + Python: { name: "Python", value: KeywordTokenType.Python }, + Hide: { name: "Hide", value: KeywordTokenType.Hide }, + Early: { name: "Early", value: KeywordTokenType.Early }, + Define: { name: "Define", value: KeywordTokenType.Define }, + Default: { name: "Default", value: KeywordTokenType.Default }, + + Label: { name: "Label", value: KeywordTokenType.Label }, + Menu: { name: "Menu", value: KeywordTokenType.Menu }, + Pause: { name: "Pause", value: KeywordTokenType.Pause }, + Style: { name: "Style", value: KeywordTokenType.Style }, + Screen: { name: "Screen", value: KeywordTokenType.Screen }, + Scene: { name: "Scene", value: KeywordTokenType.Scene }, + Camera: { name: "Camera", value: KeywordTokenType.Camera }, + Show: { name: "Show", value: KeywordTokenType.Show }, + Image: { name: "Image", value: KeywordTokenType.Image }, + LayeredImage: { name: "LayeredImage", value: KeywordTokenType.LayeredImage }, + Window: { name: "Window", value: KeywordTokenType.Window }, + Frame: { name: "Frame", value: KeywordTokenType.Frame }, + Transform: { name: "Transform", value: KeywordTokenType.Transform }, + Translate: { name: "Translate", value: KeywordTokenType.Translate }, + Extend: { name: "Extend", value: KeywordTokenType.Extend }, + NVLClear: { name: "NVLClear", value: KeywordTokenType.NVLClear }, + + Voice: { name: "Voice", value: KeywordTokenType.Voice }, + Sound: { name: "Sound", value: KeywordTokenType.Sound }, + Play: { name: "Play", value: KeywordTokenType.Play }, + Queue: { name: "Queue", value: KeywordTokenType.Queue }, + Stop: { name: "Stop", value: KeywordTokenType.Stop }, + Fadeout: { name: "Fadeout", value: KeywordTokenType.Fadeout }, + + Set: { name: "Set", value: KeywordTokenType.Set }, + Expression: { name: "Expression", value: KeywordTokenType.Expression }, + At: { name: "At", value: KeywordTokenType.At }, + As: { name: "As", value: KeywordTokenType.As }, + With: { name: "With", value: KeywordTokenType.With }, + Onlayer: { name: "Onlayer", value: KeywordTokenType.Onlayer }, + Zorder: { name: "Zorder", value: KeywordTokenType.Zorder }, + Behind: { name: "Behind", value: KeywordTokenType.Behind }, + Animation: { name: "Animation", value: KeywordTokenType.Animation }, + From: { name: "From", value: KeywordTokenType.From }, + Time: { name: "Time", value: KeywordTokenType.Time }, + Repeat: { name: "Repeat", value: KeywordTokenType.Repeat }, + DollarSign: { name: "DollarSign", value: KeywordTokenType.DollarSign }, + Sensitive: { name: "Sensitive", value: KeywordTokenType.Sensitive }, + Text: { name: "Text", value: KeywordTokenType.Text }, + Other: { name: "Other", value: KeywordTokenType.Other }, + OtherPython: { name: "OtherPython", value: KeywordTokenType.OtherPython }, + OtherAudio: { name: "OtherAudio", value: KeywordTokenType.OtherAudio }, + + Take: { name: "Take", value: KeywordTokenType.Take }, + Del: { name: "Del", value: KeywordTokenType.Del }, + Clear: { name: "Clear", value: KeywordTokenType.Clear }, + Variant: { name: "Variant", value: KeywordTokenType.Variant }, + + Vbox: { name: "Vbox", value: KeywordTokenType.Vbox }, + Hbox: { name: "Hbox", value: KeywordTokenType.Hbox }, + + If: { name: "If", value: KeywordTokenType.If }, + Elif: { name: "Elif", value: KeywordTokenType.Elif }, + Else: { name: "Else", value: KeywordTokenType.Else }, + + In: { name: "In", value: KeywordTokenType.In }, + For: { name: "For", value: KeywordTokenType.For }, + While: { name: "While", value: KeywordTokenType.While }, + Pass: { name: "Pass", value: KeywordTokenType.Pass }, + Return: { name: "Return", value: KeywordTokenType.Return }, + Jump: { name: "Jump", value: KeywordTokenType.Jump }, + Call: { name: "Call", value: KeywordTokenType.Call }, + Contains: { name: "Contains", value: KeywordTokenType.Contains }, + Parallel: { name: "Parallel", value: KeywordTokenType.Parallel }, + Block: { name: "Block", value: KeywordTokenType.Block }, + Choice: { name: "Choice", value: KeywordTokenType.Choice }, + + Warp: { name: "Warp", value: KeywordTokenType.Warp }, + Circles: { name: "Circles", value: KeywordTokenType.Circles }, + Clockwise: { name: "Clockwise", value: KeywordTokenType.Clockwise }, + Counterclockwise: { name: "Counterclockwise", value: KeywordTokenType.Counterclockwise }, + Event: { name: "Event", value: KeywordTokenType.Event }, + On: { name: "On", value: KeywordTokenType.On }, + Function: { name: "Function", value: KeywordTokenType.Function }, + + Import: { name: "Import", value: KeywordTokenType.Import }, + Class: { name: "Class", value: KeywordTokenType.Class }, + Metaclass: { name: "Metaclass", value: KeywordTokenType.Metaclass }, + Lambda: { name: "Lambda", value: KeywordTokenType.Lambda }, + Async: { name: "Async", value: KeywordTokenType.Async }, + Def: { name: "Def", value: KeywordTokenType.Def }, + Global: { name: "Global", value: KeywordTokenType.Global }, + Nonlocal: { name: "Nonlocal", value: KeywordTokenType.Nonlocal }, + + ClassName: { name: "ClassName", value: EntityTokenType.ClassName }, + InheritedClassName: { name: "InheritedClassName", value: EntityTokenType.InheritedClassName }, + TypeName: { name: "TypeName", value: EntityTokenType.TypeName }, + NamespaceName: { name: "NamespaceName", value: EntityTokenType.NamespaceName }, + FunctionName: { name: "FunctionName", value: EntityTokenType.FunctionName }, + TagName: { name: "TagName", value: EntityTokenType.TagName }, + VariableName: { name: "VariableName", value: EntityTokenType.VariableName }, + StyleName: { name: "StyleName", value: EntityTokenType.StyleName }, + + ImageName: { name: "ImageName", value: EntityTokenType.ImageName }, + TextName: { name: "TextName", value: EntityTokenType.TextName }, + AudioName: { name: "AudioName", value: EntityTokenType.AudioName }, + CharacterName: { name: "CharacterName", value: EntityTokenType.CharacterName }, + + EventName: { name: "EventName", value: EntityTokenType.EventName }, + PropertyName: { name: "PropertyName", value: EntityTokenType.PropertyName }, + + String: { name: "String", value: LiteralTokenType.String }, + UnquotedString: { name: "UnquotedString", value: LiteralTokenType.UnquotedString }, + + Color: { name: "Color", value: LiteralTokenType.Color }, + + Integer: { name: "Integer", value: LiteralTokenType.Integer }, + Float: { name: "Float", value: LiteralTokenType.Float }, + + Boolean: { name: "Boolean", value: LiteralTokenType.Boolean }, + + Plus: { name: "Plus", value: OperatorTokenType.Plus }, + Minus: { name: "Minus", value: OperatorTokenType.Minus }, + Multiply: { name: "Multiply", value: OperatorTokenType.Multiply }, + Divide: { name: "Divide", value: OperatorTokenType.Divide }, + Modulo: { name: "Modulo", value: OperatorTokenType.Modulo }, + Exponentiate: { name: "Exponentiate", value: OperatorTokenType.Exponentiate }, + FloorDivide: { name: "FloorDivide", value: OperatorTokenType.FloorDivide }, + + BitwiseAnd: { name: "BitwiseAnd", value: OperatorTokenType.BitwiseAnd }, + BitwiseOr: { name: "BitwiseOr", value: OperatorTokenType.BitwiseOr }, + BitwiseXOr: { name: "BitwiseXOr", value: OperatorTokenType.BitwiseXOr }, + BitwiseNot: { name: "BitwiseNot", value: OperatorTokenType.BitwiseNot }, + BitwiseLeftShift: { name: "BitwiseLeftShift", value: OperatorTokenType.BitwiseLeftShift }, + BitwiseRightShift: { name: "BitwiseRightShift", value: OperatorTokenType.BitwiseRightShift }, + + Assignment: { name: "Assignment", value: OperatorTokenType.Assignment }, + PlusAssign: { name: "PlusAssign", value: OperatorTokenType.PlusAssign }, + MinusAssign: { name: "MinusAssign", value: OperatorTokenType.MinusAssign }, + MultiplyAssign: { name: "MultiplyAssign", value: OperatorTokenType.MultiplyAssign }, + DivideAssign: { name: "DivideAssign", value: OperatorTokenType.DivideAssign }, + ModuloAssign: { name: "ModuloAssign", value: OperatorTokenType.ModuloAssign }, + ExponentiateAssign: { name: "ExponentiateAssign", value: OperatorTokenType.ExponentiateAssign }, + FloorDivideAssign: { name: "FloorDivideAssign", value: OperatorTokenType.FloorDivideAssign }, + BitwiseAndAssign: { name: "BitwiseAndAssign", value: OperatorTokenType.BitwiseAndAssign }, + BitwiseOrAssign: { name: "BitwiseOrAssign", value: OperatorTokenType.BitwiseOrAssign }, + BitwiseXOrAssign: { name: "BitwiseXOrAssign", value: OperatorTokenType.BitwiseXOrAssign }, + BitwiseLeftShiftAssign: { name: "BitwiseLeftShiftAssign", value: OperatorTokenType.BitwiseLeftShiftAssign }, + BitwiseRightShiftAssign: { name: "BitwiseRightShiftAssign", value: OperatorTokenType.BitwiseRightShiftAssign }, + + Equals: { name: "Equals", value: OperatorTokenType.Equals }, + NotEquals: { name: "NotEquals", value: OperatorTokenType.NotEquals }, + GreaterThan: { name: "GreaterThan", value: OperatorTokenType.GreaterThan }, + LessThan: { name: "LessThan", value: OperatorTokenType.LessThan }, + GreaterThanEquals: { name: "GreaterThanEquals", value: OperatorTokenType.GreaterThanEquals }, + LessThanEquals: { name: "LessThanEquals", value: OperatorTokenType.LessThanEquals }, + + And: { name: "And", value: OperatorTokenType.And }, + Or: { name: "Or", value: OperatorTokenType.Or }, + Not: { name: "Not", value: OperatorTokenType.Not }, + + Is: { name: "Is", value: OperatorTokenType.Is }, + IsNot: { name: "IsNot", value: OperatorTokenType.IsNot }, + + NotIn: { name: "NotIn", value: OperatorTokenType.NotIn }, + + Unpacking: { name: "Unpacking", value: OperatorTokenType.Unpacking }, + PositionalParameter: { name: "PositionalParameter", value: OperatorTokenType.PositionalParameter }, + + Quantifier: { name: "Quantifier", value: OperatorTokenType.Quantifier }, + Disjunction: { name: "Disjunction", value: OperatorTokenType.Disjunction }, + Negation: { name: "Negation", value: OperatorTokenType.Negation }, + Lookahead: { name: "Lookahead", value: OperatorTokenType.Lookahead }, + LookaheadNegative: { name: "LookaheadNegative", value: OperatorTokenType.LookaheadNegative }, + Lookbehind: { name: "Lookbehind", value: OperatorTokenType.Lookbehind }, + LookbehindNegative: { name: "LookbehindNegative", value: OperatorTokenType.LookbehindNegative }, + Conditional: { name: "Conditional", value: OperatorTokenType.Conditional }, + ConditionalNegative: { name: "ConditionalNegative", value: OperatorTokenType.ConditionalNegative }, + + Unknown: { name: "Unknown", value: CharacterTokenType.Unknown }, + + OpenParentheses: { name: "OpenParentheses", value: CharacterTokenType.OpenParentheses }, + CloseParentheses: { name: "CloseParentheses", value: CharacterTokenType.CloseParentheses }, + + OpenBracket: { name: "OpenBracket", value: CharacterTokenType.OpenBracket }, + CloseBracket: { name: "CloseBracket", value: CharacterTokenType.CloseBracket }, + + OpenSquareBracket: { name: "OpenSquareBracket", value: CharacterTokenType.OpenSquareBracket }, + CloseSquareBracket: { name: "CloseSquareBracket", value: CharacterTokenType.CloseSquareBracket }, + + Whitespace: { name: "Whitespace", value: CharacterTokenType.Whitespace }, + NewLine: { name: "NewLine", value: CharacterTokenType.NewLine }, + + Period: { name: "Period", value: CharacterTokenType.Period }, + Colon: { name: "Colon", value: CharacterTokenType.Colon }, + Semicolon: { name: "Semicolon", value: CharacterTokenType.Semicolon }, + Comma: { name: "Comma", value: CharacterTokenType.Comma }, + Hashtag: { name: "Hashtag", value: CharacterTokenType.Hashtag }, + Caret: { name: "Caret", value: CharacterTokenType.Caret }, + DollarSymbol: { name: "DollarSymbol", value: CharacterTokenType.DollarSymbol }, + AtSymbol: { name: "AtSymbol", value: CharacterTokenType.AtSymbol }, + EqualsSymbol: { name: "EqualsSymbol", value: CharacterTokenType.EqualsSymbol }, + + Quote: { name: "Quote", value: CharacterTokenType.Quote }, + DoubleQuote: { name: "DoubleQuote", value: CharacterTokenType.DoubleQuote }, + BackQuote: { name: "BackQuote", value: CharacterTokenType.BackQuote }, + + Backslash: { name: "Backslash", value: CharacterTokenType.Backslash }, + ForwardSlash: { name: "ForwardSlash", value: CharacterTokenType.ForwardSlash }, + + EscWhitespace: { name: "EscWhitespace", value: EscapedCharacterTokenType.EscWhitespace }, + EscNewline: { name: "EscNewline", value: EscapedCharacterTokenType.EscNewline }, + + EscQuote: { name: "EscQuote", value: EscapedCharacterTokenType.EscQuote }, + EscDoubleQuote: { name: "EscDoubleQuote", value: EscapedCharacterTokenType.EscDoubleQuote }, + EscBackslash: { name: "EscBackslash", value: EscapedCharacterTokenType.EscBackslash }, + EscOpenSquareBracket: { name: "EscOpenSquareBracket", value: EscapedCharacterTokenType.EscOpenSquareBracket }, + EscOpenBracket: { name: "EscOpenBracket", value: EscapedCharacterTokenType.EscOpenBracket }, + + Invalid: { name: "Invalid", value: MetaTokenType.Invalid }, + Deprecated: { name: "Deprecated", value: MetaTokenType.Deprecated }, + + Comment: { name: "Comment", value: MetaTokenType.Comment }, + CommentCodeTag: { name: "CommentCodeTag", value: MetaTokenType.CommentCodeTag }, + CommentRegionTag: { name: "CommentRegionTag", value: MetaTokenType.CommentRegionTag }, + TypehintComment: { name: "TypehintComment", value: MetaTokenType.TypehintComment }, + TypehintDirective: { name: "TypehintDirective", value: MetaTokenType.TypehintDirective }, + TypehintIgnore: { name: "TypehintIgnore", value: MetaTokenType.TypehintIgnore }, + TypehintType: { name: "TypehintType", value: MetaTokenType.TypehintType }, + TypehintPunctuation: { name: "TypehintPunctuation", value: MetaTokenType.TypehintPunctuation }, + TypehintVariable: { name: "TypehintVariable", value: MetaTokenType.TypehintVariable }, + Docstring: { name: "Docstring", value: MetaTokenType.Docstring }, + + StringBegin: { name: "StringBegin", value: MetaTokenType.StringBegin }, + StringEnd: { name: "StringEnd", value: MetaTokenType.StringEnd }, + + SimpleExpression: { name: "SimpleExpression", value: MetaTokenType.SimpleExpression }, + + CodeBlock: { name: "CodeBlock", value: MetaTokenType.CodeBlock }, + PythonLine: { name: "PythonLine", value: MetaTokenType.PythonLine }, + PythonBlock: { name: "PythonBlock", value: MetaTokenType.PythonBlock }, + Arguments: { name: "Arguments", value: MetaTokenType.Arguments }, + + EmptyString: { name: "EmptyString", value: MetaTokenType.EmptyString }, + StringTag: { name: "StringTag", value: MetaTokenType.StringTag }, + TagBlock: { name: "TagBlock", value: MetaTokenType.TagBlock }, + TaggedString: { name: "TaggedString", value: MetaTokenType.TaggedString }, + Placeholder: { name: "Placeholder", value: MetaTokenType.Placeholder }, + + MenuStatement: { name: "MenuStatement", value: MetaTokenType.MenuStatement }, + MenuBlock: { name: "MenuBlock", value: MetaTokenType.MenuBlock }, + MenuOption: { name: "MenuOption", value: MetaTokenType.MenuOption }, + MenuOptionBlock: { name: "MenuOptionBlock", value: MetaTokenType.MenuOptionBlock }, + + LabelStatement: { name: "LabelStatement", value: MetaTokenType.LabelStatement }, + LabelCall: { name: "LabelCall", value: MetaTokenType.LabelCall }, + LabelAccess: { name: "LabelAccess", value: MetaTokenType.LabelAccess }, + + BehindStatement: { name: "BehindStatement", value: MetaTokenType.BehindStatement }, + OnlayerStatement: { name: "OnlayerStatement", value: MetaTokenType.OnlayerStatement }, + ZorderStatement: { name: "ZorderStatement", value: MetaTokenType.ZorderStatement }, + AtStatement: { name: "AtStatement", value: MetaTokenType.AtStatement }, + AsStatement: { name: "AsStatement", value: MetaTokenType.AsStatement }, + WithStatement: { name: "WithStatement", value: MetaTokenType.WithStatement }, + + ImageStatement: { name: "ImageStatement", value: MetaTokenType.ImageStatement }, + CameraStatement: { name: "CameraStatement", value: MetaTokenType.CameraStatement }, + SceneStatement: { name: "SceneStatement", value: MetaTokenType.SceneStatement }, + ShowStatement: { name: "ShowStatement", value: MetaTokenType.ShowStatement }, + + JumpStatement: { name: "JumpStatement", value: MetaTokenType.JumpStatement }, + CallStatement: { name: "CallStatement", value: MetaTokenType.CallStatement }, + + PlayAudioStatement: { name: "PlayAudioStatement", value: MetaTokenType.PlayAudioStatement }, + QueueAudioStatement: { name: "QueueAudioStatement", value: MetaTokenType.QueueAudioStatement }, + StopAudioStatement: { name: "StopAudioStatement", value: MetaTokenType.StopAudioStatement }, + + ScreenStatement: { name: "ScreenStatement", value: MetaTokenType.ScreenStatement }, + ScreenSensitive: { name: "ScreenSensitive", value: MetaTokenType.ScreenSensitive }, + ScreenFrame: { name: "ScreenFrame", value: MetaTokenType.ScreenFrame }, + ScreenWindow: { name: "ScreenWindow", value: MetaTokenType.ScreenWindow }, + ScreenText: { name: "ScreenText", value: MetaTokenType.ScreenText }, + ScreenBlock: { name: "ScreenBlock", value: MetaTokenType.ScreenBlock }, + + StyleStatement: { name: "StyleStatement", value: MetaTokenType.StyleStatement }, + StyleBlock: { name: "StyleBlock", value: MetaTokenType.StyleBlock }, + + NarratorSayStatement: { name: "NarratorSayStatement", value: MetaTokenType.NarratorSayStatement }, + SayStatement: { name: "SayStatement", value: MetaTokenType.SayStatement }, + CharacterNameString: { name: "CharacterNameString", value: MetaTokenType.CharacterNameString }, + SayNarrator: { name: "SayNarrator", value: MetaTokenType.SayNarrator }, + SayCharacter: { name: "SayCharacter", value: MetaTokenType.SayCharacter }, + + AtParameters: { name: "AtParameters", value: MetaTokenType.AtParameters }, + AsParameters: { name: "AsParameters", value: MetaTokenType.AsParameters }, + BehindParameters: { name: "BehindParameters", value: MetaTokenType.BehindParameters }, + OnlayerParameters: { name: "OnlayerParameters", value: MetaTokenType.OnlayerParameters }, + WithParameters: { name: "WithParameters", value: MetaTokenType.WithParameters }, + ZorderParameters: { name: "ZorderParameters", value: MetaTokenType.ZorderParameters }, + PauseParameters: { name: "PauseParameters", value: MetaTokenType.PauseParameters }, + + ATLBlock: { name: "ATLBlock", value: MetaTokenType.ATLBlock }, + ATLChoiceBlock: { name: "ATLChoiceBlock", value: MetaTokenType.ATLChoiceBlock }, + TransformBlock: { name: "TransformBlock", value: MetaTokenType.TransformBlock }, + ATLContains: { name: "ATLContains", value: MetaTokenType.ATLContains }, + ATLWith: { name: "ATLWith", value: MetaTokenType.ATLWith }, + ATLEvent: { name: "ATLEvent", value: MetaTokenType.ATLEvent }, + ATLFunction: { name: "ATLFunction", value: MetaTokenType.ATLFunction }, + ATLWarper: { name: "ATLWarper", value: MetaTokenType.ATLWarper }, + ATLOn: { name: "ATLOn", value: MetaTokenType.ATLOn }, + + MemberAccess: { name: "MemberAccess", value: MetaTokenType.MemberAccess }, + ItemAccess: { name: "ItemAccess", value: MetaTokenType.ItemAccess }, + IndexedName: { name: "IndexedName", value: MetaTokenType.IndexedName }, + Attribute: { name: "Attribute", value: MetaTokenType.Attribute }, + ClassDefinition: { name: "ClassDefinition", value: MetaTokenType.ClassDefinition }, + ClassInheritance: { name: "ClassInheritance", value: MetaTokenType.ClassInheritance }, + FunctionDefinition: { name: "FunctionDefinition", value: MetaTokenType.FunctionDefinition }, + LambdaFunction: { name: "LambdaFunction", value: MetaTokenType.LambdaFunction }, + FunctionLambdaParameters: { name: "FunctionLambdaParameters", value: MetaTokenType.FunctionLambdaParameters }, + FunctionParameters: { name: "FunctionParameters", value: MetaTokenType.FunctionParameters }, + FunctionDecorator: { name: "FunctionDecorator", value: MetaTokenType.FunctionDecorator }, + FunctionCall: { name: "FunctionCall", value: MetaTokenType.FunctionCall }, + FunctionCallGeneric: { name: "FunctionCallGeneric", value: MetaTokenType.FunctionCallGeneric }, + Fstring: { name: "Fstring", value: MetaTokenType.Fstring }, + ControlFlowKeyword: { name: "ControlFlowKeyword", value: MetaTokenType.ControlFlowKeyword }, + LogicalOperatorKeyword: { name: "LogicalOperatorKeyword", value: MetaTokenType.LogicalOperatorKeyword }, + Operator: { name: "Operator", value: MetaTokenType.Operator }, + ArithmeticOperator: { name: "ArithmeticOperator", value: MetaTokenType.ArithmeticOperator }, + BitwiseOperatorKeyword: { name: "BitwiseOperatorKeyword", value: MetaTokenType.BitwiseOperatorKeyword }, + ComparisonOperatorKeyword: { name: "ComparisonOperatorKeyword", value: MetaTokenType.ComparisonOperatorKeyword }, + ConstantLiteral: { name: "ConstantLiteral", value: MetaTokenType.ConstantLiteral }, + ConstantNumeric: { name: "ConstantNumeric", value: MetaTokenType.ConstantNumeric }, + ConstantCaps: { name: "ConstantCaps", value: MetaTokenType.ConstantCaps }, + BuiltinExceptionType: { name: "BuiltinExceptionType", value: MetaTokenType.BuiltinExceptionType }, + BuiltinType: { name: "BuiltinType", value: MetaTokenType.BuiltinType }, + MagicVariable: { name: "MagicVariable", value: MetaTokenType.MagicVariable }, + EscapeSequence: { name: "EscapeSequence", value: MetaTokenType.EscapeSequence }, + FormatPercent: { name: "FormatPercent", value: MetaTokenType.FormatPercent }, + FormatBrace: { name: "FormatBrace", value: MetaTokenType.FormatBrace }, + StringStorageType: { name: "StringStorageType", value: MetaTokenType.StringStorageType }, + FormatStorageType: { name: "FormatStorageType", value: MetaTokenType.FormatStorageType }, + ImaginaryNumberStorageType: { name: "ImaginaryNumberStorageType", value: MetaTokenType.ImaginaryNumberStorageType }, + NumberStorageType: { name: "NumberStorageType", value: MetaTokenType.NumberStorageType }, + ClassStorageType: { name: "ClassStorageType", value: MetaTokenType.ClassStorageType }, + CommentBegin: { name: "CommentBegin", value: MetaTokenType.CommentBegin }, + CommentEnd: { name: "CommentEnd", value: MetaTokenType.CommentEnd }, + Backreference: { name: "Backreference", value: MetaTokenType.Backreference }, + BackreferenceNamed: { name: "BackreferenceNamed", value: MetaTokenType.BackreferenceNamed }, + CharacterSet: { name: "CharacterSet", value: MetaTokenType.CharacterSet }, + Named: { name: "Named", value: MetaTokenType.Named }, + ModifierFlagStorageType: { name: "ModifierFlagStorageType", value: MetaTokenType.ModifierFlagStorageType }, +}; + +export const tokenTypeToStringMap = Object.fromEntries(Object.entries(tokenTypeDefinitions).map(([, v]) => [v.value, v.name])); + +export function tokenTypeToString(tokenType: TokenType) { + return tokenTypeToStringMap[tokenType] as string; +} diff --git a/src/tokenizer/token-patterns.g.ts b/src/tokenizer/token-patterns.g.ts index cd6791ab..eb210277 100644 --- a/src/tokenizer/token-patterns.g.ts +++ b/src/tokenizer/token-patterns.g.ts @@ -3,28 +3,33 @@ // THIS FILE HAS BEEN GENERATED BY THE `syntax-to-token-pattern.py` GENERATOR // DO NOT EDIT THIS FILE DIRECTLY! INSTEAD RUN THE PYTHON SCRIPT. // ANY MANUAL EDITS MADE TO THIS FILE WILL BE OVERWRITTEN. YOU HAVE BEEN WARNED. -// Last generated: 01/06/2023 14:57:48 (UTC+0) +// Last generated: 10/06/2023 21:08:08 (UTC+0) -import * as AtlPatterns from "./atl-token-patterns.g"; import * as RenpyPatterns from "./renpy-token-patterns.g"; +import * as ScreenPatterns from "./screen-token-patterns.g"; +import * as AtlPatterns from "./atl-token-patterns.g"; import * as PythonPatterns from "./python-token-patterns.g"; // Push all RenpyPatterns external includes +RenpyPatterns.literal.patterns!.push(PythonPatterns.literal); +RenpyPatterns.parenthesisedPython.patterns![0].patterns!.push(PythonPatterns.expression); +RenpyPatterns.parenthesisedPython.patterns![1].patterns!.push(PythonPatterns.expression); +RenpyPatterns.parenthesisedPython.patterns![2].patterns!.push(PythonPatterns.expression); +RenpyPatterns.simpleExpression.patterns!.splice(0, 0, PythonPatterns.string); +RenpyPatterns.simpleExpression.patterns!.splice(3, 0, PythonPatterns.memberAccess); +RenpyPatterns.simpleExpression.patterns!.splice(4, 0, PythonPatterns.functionCall); RenpyPatterns.keywords.patterns![1].patterns!.push(PythonPatterns.expression); RenpyPatterns.constantPlaceholder.captures![2].patterns!.push(PythonPatterns.expression); RenpyPatterns.pythonStatements.patterns![1].patterns!.push(PythonPatterns.python); -RenpyPatterns.pythonStatements.patterns![2].patterns!.splice(2, 0, PythonPatterns.expression); +RenpyPatterns.define.patterns!.splice(3, 0, PythonPatterns.expression); +RenpyPatterns.defaultStatement.patterns!.splice(2, 0, PythonPatterns.expression); +RenpyPatterns.oneLinePython.patterns!.splice(2, 0, PythonPatterns.expression); RenpyPatterns.sayStatements.patterns![0].endCaptures![3].patterns!.push(PythonPatterns.functionArguments); RenpyPatterns.sayStatements.patterns![1].endCaptures![3].patterns!.push(PythonPatterns.functionArguments); -RenpyPatterns.transform.patterns!.push(AtlPatterns.atl); RenpyPatterns.image.patterns![0].patterns!.push(AtlPatterns.atl); RenpyPatterns.show.patterns![0].patterns!.push(AtlPatterns.atl); RenpyPatterns.scene.patterns![0].patterns!.push(AtlPatterns.atl); RenpyPatterns.camera.patterns![0].patterns!.push(AtlPatterns.atl); -RenpyPatterns.screenDefName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); -RenpyPatterns.screenSimpleExpression.patterns!.push(PythonPatterns.literal, PythonPatterns.memberAccess, PythonPatterns.illegalOperator, PythonPatterns.operator, PythonPatterns.curlyBraces, PythonPatterns.itemAccess, PythonPatterns.list, PythonPatterns.oddFunctionCall, PythonPatterns.roundBraces, PythonPatterns.functionCall, PythonPatterns.builtinFunctions, PythonPatterns.builtinTypes, PythonPatterns.builtinExceptions, PythonPatterns.magicNames, PythonPatterns.specialNames, PythonPatterns.illegalNames, PythonPatterns.specialVariables, PythonPatterns.ellipsis, PythonPatterns.punctuation, PythonPatterns.lineContinuation); -RenpyPatterns.screenText.patterns![0].patterns!.push(AtlPatterns.atl); -RenpyPatterns.screen.patterns![0].beginCaptures![3].patterns!.splice(1, 0, PythonPatterns.parameters); RenpyPatterns.labelName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); RenpyPatterns.labelCall.patterns!.splice(0, 0, PythonPatterns.specialVariables); RenpyPatterns.labelCall.patterns!.push(PythonPatterns.functionArguments); @@ -41,19 +46,54 @@ RenpyPatterns.audioParams.patterns!.push(PythonPatterns.number); RenpyPatterns.play.patterns![0].patterns!.push(PythonPatterns.expression); RenpyPatterns.queue.patterns![0].patterns!.push(PythonPatterns.expression); RenpyPatterns.stop.patterns![0].patterns!.push(PythonPatterns.number); +RenpyPatterns.renpyStatements.patterns!.splice(6, 0, AtlPatterns.transform); +RenpyPatterns.renpyStatements.patterns!.splice(12, 0, ScreenPatterns.screen); // Push all AtlPatterns external includes -AtlPatterns.atlSimpleExpression.patterns!.splice(0, 0, RenpyPatterns.expressions); -AtlPatterns.atlSimpleExpression.patterns!.push(PythonPatterns.literal, PythonPatterns.memberAccess, PythonPatterns.illegalOperator, PythonPatterns.operator, PythonPatterns.curlyBraces, PythonPatterns.itemAccess, PythonPatterns.list, PythonPatterns.oddFunctionCall, PythonPatterns.roundBraces, PythonPatterns.functionCall, PythonPatterns.builtinFunctions, PythonPatterns.builtinTypes, PythonPatterns.builtinExceptions, PythonPatterns.magicNames, PythonPatterns.specialNames, PythonPatterns.illegalNames, PythonPatterns.specialVariables, PythonPatterns.ellipsis, PythonPatterns.punctuation, PythonPatterns.lineContinuation); +AtlPatterns.atl.patterns!.splice(0, 0, RenpyPatterns.conditionals); +AtlPatterns.atlSimpleExpression.patterns!.splice(0, 0, RenpyPatterns.renpyOnlyExpressions); +AtlPatterns.atlSimpleExpression.patterns!.splice(2, 0, PythonPatterns.memberAccess); +AtlPatterns.atlSimpleExpression.patterns!.splice(3, 0, PythonPatterns.illegalOperator); +AtlPatterns.atlSimpleExpression.patterns!.splice(4, 0, PythonPatterns.operator); +AtlPatterns.atlSimpleExpression.patterns!.splice(5, 0, PythonPatterns.curlyBraces); +AtlPatterns.atlSimpleExpression.patterns!.splice(6, 0, PythonPatterns.itemAccess); +AtlPatterns.atlSimpleExpression.patterns!.splice(7, 0, PythonPatterns.list); +AtlPatterns.atlSimpleExpression.patterns!.splice(8, 0, PythonPatterns.oddFunctionCall); +AtlPatterns.atlSimpleExpression.patterns!.splice(9, 0, PythonPatterns.roundBraces); +AtlPatterns.atlSimpleExpression.patterns!.splice(10, 0, PythonPatterns.functionCall); +AtlPatterns.atlSimpleExpression.patterns!.splice(11, 0, PythonPatterns.builtinFunctions); +AtlPatterns.atlSimpleExpression.patterns!.splice(12, 0, PythonPatterns.builtinTypes); +AtlPatterns.atlSimpleExpression.patterns!.splice(13, 0, PythonPatterns.builtinExceptions); +AtlPatterns.atlSimpleExpression.patterns!.splice(14, 0, PythonPatterns.magicNames); +AtlPatterns.atlSimpleExpression.patterns!.splice(15, 0, PythonPatterns.specialNames); +AtlPatterns.atlSimpleExpression.patterns!.splice(16, 0, PythonPatterns.illegalNames); +AtlPatterns.atlSimpleExpression.patterns!.splice(17, 0, PythonPatterns.specialVariables); +AtlPatterns.atlSimpleExpression.patterns!.splice(18, 0, PythonPatterns.ellipsis); +AtlPatterns.atlSimpleExpression.patterns!.splice(19, 0, PythonPatterns.punctuation); +AtlPatterns.atlSimpleExpression.patterns!.splice(20, 0, PythonPatterns.lineContinuation); +AtlPatterns.atlSimpleExpression.patterns!.push(RenpyPatterns.whitespace); AtlPatterns.atlExpression.patterns!.push(PythonPatterns.expression); +AtlPatterns.atlKeywords.patterns!.push(RenpyPatterns.keywords); AtlPatterns.atlEventName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); AtlPatterns.atlEventDefName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); AtlPatterns.atlOn.beginCaptures![3].patterns!.push(RenpyPatterns.comments); AtlPatterns.atlFunction.captures![2].patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); AtlPatterns.atlWarperName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +AtlPatterns.atlFallback.patterns!.push(RenpyPatterns.basePatterns); + +// Push all ScreenPatterns external includes +ScreenPatterns.screenDefName.patterns!.splice(0, 0, PythonPatterns.builtinPossibleCallables); +ScreenPatterns.screenSimpleExpression.patterns!.splice(0, 0, RenpyPatterns.renpyOnlyExpressions); +ScreenPatterns.screenSimpleExpression.patterns!.push(PythonPatterns.memberAccess, PythonPatterns.illegalOperator, PythonPatterns.operator, PythonPatterns.curlyBraces, PythonPatterns.itemAccess, PythonPatterns.list, PythonPatterns.oddFunctionCall, PythonPatterns.roundBraces, PythonPatterns.functionCall, PythonPatterns.builtinFunctions, PythonPatterns.builtinTypes, PythonPatterns.builtinExceptions, PythonPatterns.magicNames, PythonPatterns.specialNames, PythonPatterns.illegalNames, PythonPatterns.specialVariables, PythonPatterns.ellipsis, PythonPatterns.punctuation, PythonPatterns.lineContinuation); +ScreenPatterns.screenText.patterns!.push(RenpyPatterns.atStatement); +ScreenPatterns.screenText.patterns![0].patterns!.push(AtlPatterns.atl); +ScreenPatterns.screenText.patterns![1].patterns!.splice(0, 0, RenpyPatterns.strings); +ScreenPatterns.screen.patterns![0].beginCaptures![3].patterns!.push(PythonPatterns.parameters, RenpyPatterns.invalidToken); +ScreenPatterns.screenFallback.patterns!.push(RenpyPatterns.basePatterns); +ScreenPatterns.screenLanguage.patterns!.splice(0, 0, RenpyPatterns.conditionals); // Push all PythonPatterns external includes PythonPatterns.stringUnicodeGuts.patterns!.splice(0, 0, RenpyPatterns.stringsInterior); -export { AtlPatterns, RenpyPatterns, PythonPatterns }; \ No newline at end of file +export { RenpyPatterns, ScreenPatterns, AtlPatterns, PythonPatterns }; \ No newline at end of file diff --git a/src/utilities/utils.ts b/src/utilities/utils.ts new file mode 100644 index 00000000..1351c001 --- /dev/null +++ b/src/utilities/utils.ts @@ -0,0 +1,3 @@ +export type EnumToString = { + [P in keyof Type]: { name: P; value: Type[P] }; +}; diff --git a/syntax-to-token-pattern.py b/syntax-to-token-pattern.py index 7fd47f30..297405d1 100644 --- a/syntax-to-token-pattern.py +++ b/syntax-to-token-pattern.py @@ -55,6 +55,8 @@ def get_parts(range: slice) -> str: return "MetaTokenType.FormatStorageType" elif get_part(2) == "class": return "KeywordTokenType.Class" + elif get_part(2) == "style": + return "KeywordTokenType.Style" elif get_part(2) == "imaginary": return "MetaTokenType.ImaginaryNumberStorageType" elif get_part(2) == "number": @@ -122,6 +124,9 @@ def get_parts(range: slice) -> str: else: return "MetaTokenType.Invalid" + elif get_part(0) == "debug": + return "MetaTokenType.Invalid" + elif get_part(0) == "punctuation": if get_part(1) == "definition": if get_part(2) == "tag" or get_part(2) == "dict" or get_part(2) == "inheritance": @@ -174,12 +179,8 @@ def get_parts(range: slice) -> str: return "CharacterTokenType.CloseSquareBracket" elif get_part(1) == "section": - if (get_part(2) == "python" or get_part(2) =="block" or \ - get_part(2) == "class" or get_part(2) == "function" or \ - get_part(2) == "atl" or get_part(2) == "label" or \ - get_part(2) == "menu" or get_part(2) == "menu-option"): - if get_part(3) == "begin" or get_part(4) == "begin": - return "CharacterTokenType.Colon" + if get_part(3) == "begin" or get_part(4) == "begin": + return "CharacterTokenType.Colon" elif get_part(1) == "separator": if get_part(2) == "parameters" or get_part(2) == "arguments" or get_part(2) == "element" or get_part(2) == "inheritance": @@ -528,8 +529,6 @@ def process_includes(include_list: list[tuple[str, int]], entries_list: list[str return typescript_entry def generate_file(state: GeneratorState, source_file: str, output_file: str): - - # load the input data from the file with open(source_file, "r") as file: data = json.load(file) @@ -588,10 +587,12 @@ def generate_file(state: GeneratorState, source_file: str, output_file: str): def generate_token_patterns(): renpy_state = GeneratorState() atl_state = GeneratorState() + screen_state = GeneratorState() python_state = GeneratorState() generate_file(renpy_state, "./syntaxes/renpy.tmLanguage.json", "./src/tokenizer/renpy-token-patterns.g.ts") generate_file(atl_state, "./syntaxes/renpy.atl.tmLanguage.json", "./src/tokenizer/atl-token-patterns.g.ts") + generate_file(screen_state, "./syntaxes/renpy.screen.tmLanguage.json", "./src/tokenizer/screen-token-patterns.g.ts") generate_file(python_state, "./syntaxes/renpy.python.tmLanguage.json", "./src/tokenizer/python-token-patterns.g.ts") # Write the typescript entries to a file @@ -605,7 +606,7 @@ def generate_token_patterns(): contents += "\n" # Add all source import from all states, but only the unique ones - source_imports = set(renpy_state.source_imports + atl_state.source_imports + python_state.source_imports) + source_imports = set(renpy_state.source_imports + atl_state.source_imports + screen_state.source_imports + python_state.source_imports) for source_import in source_imports: contents += f"import * as {titleCase(source_import)}Patterns from \"./{source_import}-token-patterns.g\";\n" @@ -621,6 +622,7 @@ def add_entries(entries: list[str], prefix: str) -> str: contents += add_entries(renpy_state.external_pattern_include_entries, "RenpyPatterns") contents += add_entries(atl_state.external_pattern_include_entries, "AtlPatterns") + contents += add_entries(screen_state.external_pattern_include_entries, "ScreenPatterns") contents += add_entries(python_state.external_pattern_include_entries, "PythonPatterns") exports: list[str] = [] diff --git a/syntaxes/renpy.atl.tmLanguage.json b/syntaxes/renpy.atl.tmLanguage.json index b1e40297..c6fceb32 100644 --- a/syntaxes/renpy.atl.tmLanguage.json +++ b/syntaxes/renpy.atl.tmLanguage.json @@ -362,7 +362,7 @@ "atl-fallback": { "comment": "TODO: This is a temp fix for missing pattern references", - "patterns": [{ "include": "source.renpy" }] + "patterns": [{ "include": "source.renpy#base-patterns" }] }, "transform": { diff --git a/syntaxes/renpy.python.tmLanguage.json b/syntaxes/renpy.python.tmLanguage.json index 205ccbd2..308505b4 100644 --- a/syntaxes/renpy.python.tmLanguage.json +++ b/syntaxes/renpy.python.tmLanguage.json @@ -309,7 +309,6 @@ }, "odd-function-call": { "comment": "A bit obscured function call where there may have been anarbitrary number of other operations to get the function.E.g. \"arr[idx](args)\"", - "name": "meta.odd-function-call.python", "begin": "(?<=\\]|\\))\\s*(?=\\()", "end": "(\\))", "endCaptures": { diff --git a/syntaxes/renpy.screen.tmLanguage.json b/syntaxes/renpy.screen.tmLanguage.json index 6467db56..42dda6cd 100644 --- a/syntaxes/renpy.screen.tmLanguage.json +++ b/syntaxes/renpy.screen.tmLanguage.json @@ -41,7 +41,7 @@ "comment": "Special manipulation keywords", "match": "\\b(? Date: Tue, 13 Jun 2023 22:13:55 +0200 Subject: [PATCH 073/152] Fix infinite tokenizer loop (#341) * Major code cleanup * Fix infinite loop in tokenizer * Fix rgb color not accepting `.0` float format --- .eslintrc.json | 3 +- .vscode/launch.json | 9 +- TODO.md | 1 - package.json | 2 +- src/color.ts | 111 ++++++--- src/completion.ts | 22 +- src/configuration.ts | 56 +++++ src/definition.ts | 20 +- src/diagnostics.ts | 2 - src/displayable.ts | 1 - src/extension.ts | 322 ++++++------------------- src/hover.ts | 16 +- src/logger.ts | 22 +- src/outline.ts | 16 +- src/references.ts | 22 +- src/semantics.ts | 32 ++- src/signature.ts | 24 +- src/tokenizer/debug-decorator.ts | 26 +- src/tokenizer/tokenizer.ts | 391 +++++++++++++++++-------------- src/utilities/utils.ts | 17 ++ 20 files changed, 610 insertions(+), 505 deletions(-) create mode 100644 src/configuration.ts diff --git a/.eslintrc.json b/.eslintrc.json index 5df43ca7..02070a4c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -22,6 +22,7 @@ "require-await": "warn", "camelcase": "error", "@typescript-eslint/no-var-requires": "warn", - "no-param-reassign": "warn" // Disable reassign, since this basically means you override the reference from the caller function with a new local version. (It doesn't do what you expect) + "no-param-reassign": "warn", // Disable reassign, since this basically means you override the reference from the caller function with a new local version. (It doesn't do what you expect) + "@typescript-eslint/no-namespace": "off" } } diff --git a/.vscode/launch.json b/.vscode/launch.json index 24bea414..c6210f6a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,7 +15,8 @@ "${workspaceFolder}/examples" // open examples directory ], "outFiles": ["${workspaceFolder}/dist/**/*.js"], - "preLaunchTask": "npm: watch" + "preLaunchTask": "npm: watch", + "skipFiles": ["/**", "**/extensions/git*/**", "**/node_modules/prettier/**", "**/node/extensionHostProcess.js"] }, { "name": "Launch Extension (Release)", @@ -27,7 +28,8 @@ "${workspaceFolder}/examples" // open examples directory ], "outFiles": ["${workspaceFolder}/dist/**/*.js"], - "preLaunchTask": "npm: watch-release" + "preLaunchTask": "npm: watch-release", + "skipFiles": ["/**", "**/extensions/git*/**", "**/node_modules/prettier/**"] }, { "name": "Extension Tests", @@ -36,7 +38,8 @@ "runtimeExecutable": "${execPath}", "args": ["--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test"], "outFiles": ["${workspaceFolder}/out/test/**/*.js"], - "preLaunchTask": "npm: test-compile" + "preLaunchTask": "npm: test-compile", + "skipFiles": ["/**", "**/extensions/git*/**", "**/node_modules/prettier/**"] } ] } diff --git a/TODO.md b/TODO.md index 96ddf9b3..86afdf79 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,6 @@ Renpy Features List - Support launching the project through VSCode - Bugs to fix: - * Fix error on restart * Show color editor in tags (also check https://www.renpy.org/doc/html/color_class.html) * % can be escaped in strings * if line contains unclosed ( [ or { line is continued (see https://www.renpy.org/doc/html/language_basics.html#logical-lines) diff --git a/package.json b/package.json index 6de502a2..51ad98ec 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.3.3", + "version": "2.3.4", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", diff --git a/src/color.ts b/src/color.ts index 4f21263b..a8f34278 100644 --- a/src/color.ts +++ b/src/color.ts @@ -1,30 +1,44 @@ // Color conversion methods for Color provider -import { CancellationToken, Color, ColorInformation, ColorPresentation, DocumentColorProvider, Range, TextDocument, TextEdit } from "vscode"; +import { CancellationToken, Color, ColorInformation, ColorPresentation, ProviderResult, Range, TextDocument, TextEdit, languages } from "vscode"; import { ValueEqualsSet } from "./utilities/hashset"; -import { tokenizeDocument } from "./tokenizer/tokenizer"; +import { Tokenizer } from "./tokenizer/tokenizer"; import { LiteralTokenType } from "./tokenizer/renpy-tokens"; import { TextMateRule, injectCustomTextmateTokens } from "./decorator"; -/*import { tokenizeDocument } from "./tokenizer/tokenizer"; -import { injectCustomTextmateTokens, TextMateRule } from "./decorator"; -import { LiteralTokenType } from "./tokenizer/renpy-tokens"; -import { ValueEqualsSet } from "./utilities/hashset";*/ -export class RenpyColorProvider implements DocumentColorProvider { - public provideDocumentColors(document: TextDocument, token: CancellationToken): Thenable { - return getColorInformation(document); - } - public provideColorPresentations(color: Color, context: { document: TextDocument; range: Range }, token: CancellationToken): Thenable { - return getColorPresentations(color, context.document, context.range); - } -} +export type DocumentColorContext = { + document: TextDocument; + range: Range; +}; + +export const colorProvider = languages.registerColorProvider("renpy", { + provideDocumentColors(document: TextDocument, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getColorInformation(document)); + }); + }, + + provideColorPresentations(color: Color, context: DocumentColorContext, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getColorPresentations(color, context)); + }); + }, +}); /** * Finds all colors in the given document and returns their ranges and color * @param document - the TextDocument to search - * @returns - Thenable - an array that provides a range and color for each match + * @returns - ColorInformation[] - an array that provides a range and color for each match */ -export function getColorInformation(document: TextDocument): Thenable { - injectCustomColorStyles(document); +export async function getColorInformation(document: TextDocument) { + await injectCustomColorStyles(document); // find all colors in the document const colors: ColorInformation[] = []; @@ -67,7 +81,7 @@ export function getColorInformation(document: TextDocument): Thenable { +export function getColorPresentations(color: Color, context: DocumentColorContext): ColorPresentation[] { // user hovered/tapped the color block/return the color they picked const colors: ColorPresentation[] = []; - const line = document.lineAt(range.start.line).text; - const text = line.substring(range.start.character, range.end.character); - const oldRange = new Range(range.start.line, range.start.character, range.start.line, range.start.character + text.length); + const range = context.range; + const text = context.document.getText(range); + const oldRange = new Range(range.start, range.end); const colR = Math.round(color.red * 255); const colG = Math.round(color.green * 255); @@ -112,12 +126,12 @@ export function getColorPresentations(color: Color, document: TextDocument, rang colors.push(rgbColorPres); } - return Promise.resolve(colors); + return colors; } -export function injectCustomColorStyles(document: TextDocument) { +export async function injectCustomColorStyles(document: TextDocument) { // Disabled until filter is added to the tree class - const documentTokens = tokenizeDocument(document); + const documentTokens = await Tokenizer.tokenizeDocument(document); // TODO: Should probably make sure this constant is actually part of a tag, but for now this is fine. const colorTags = documentTokens.filter((x) => x.token?.tokenType === LiteralTokenType.Color); const colorRules = new ValueEqualsSet(); @@ -221,32 +235,55 @@ export function convertHtmlToColor(htmlHex: string): Color | null { */ export function convertRenpyColorToColor(renpy: string): Color | null { try { - const colorTuple = renpy.replace("Color(", "").replace("color", "").replace("=", "").replace(" ", "").replace("(", "[").replace(")", "]"); - const result = JSON.parse(colorTuple); - if (result.length === 3) { - return new Color(parseInt(result[0], 16) / 255, parseInt(result[1], 16) / 255, parseInt(result[2], 16) / 255, 1.0); - } else if (result.length === 4) { - return new Color(parseInt(result[0], 16) / 255, parseInt(result[1], 16) / 255, parseInt(result[2], 16) / 255, parseInt(result[3], 16) / 255); + const colorTuple = renpy + .replaceAll(" ", "") + .replace(/[Cc]olor=?\(/g, "") + .replace(")", ""); + + const result = colorTuple.split(","); + if (result.length < 3) { + return null; } - return null; + + const r = parseInt(result[0], 16) / 255; + const g = parseInt(result[1], 16) / 255; + const b = parseInt(result[2], 16) / 255; + const a = result.length === 4 ? parseInt(result[3], 16) / 255 : 1.0; + return new Color(r, g, b, a); } catch (error) { return null; } } +/** + * Returns a float value based on the given Ren'Py float string value + * @remarks Values starting with a dot (e.g., `.5`) are forced to be parsed as `0.5` due to javascript's `parseFloat` behavior. + * @param value The renpy float value to parse + * @returns The parsed float value + */ +function parseRenpyFloat(value: string): number { + if (value.startsWith(".")) { + return parseFloat("0" + value); + } + return parseFloat(value); +} + /** * Returns a Color provider object based on the given Ren'Py rgb tuple - * @remarks - * The rgb tuple values should be numeric values between 0.0 and 1.0 (e.g., `rgb=(1.0, 0.0, 0.0)`) + * @remarks The rgb tuple values should be numeric values between 0.0 and 1.0 (e.g., `rgb=(1.0, 0.0, 0.0)`). + * Values starting with a dot (e.g., `.5`) are forced to be parsed as `0.5` due to javascript's `parseFloat` behavior. * @param renpyColor - Renpy `rgb` color tuple (e.g., `rgb=(r, g, b)`) * @returns The `Color` provider object */ export function convertRgbColorToColor(renpyColor: string): Color | null { try { - const colorTuple = renpyColor.replace("rgb", "").replace("=", "").replace(" ", "").replace("(", "[").replace(")", "]"); - const result = JSON.parse(colorTuple); + const colorTuple = renpyColor + .replaceAll(" ", "") + .replace(/rgb=\(/g, "") + .replace(")", ""); + const result = colorTuple.split(","); if (result.length === 3) { - return new Color(parseFloat(result[0]), parseFloat(result[1]), parseFloat(result[2]), 1.0); + return new Color(parseRenpyFloat(result[0]), parseRenpyFloat(result[1]), parseRenpyFloat(result[2]), 1.0); } return null; } catch (error) { diff --git a/src/completion.ts b/src/completion.ts index 008bd26a..0f890470 100644 --- a/src/completion.ts +++ b/src/completion.ts @@ -1,10 +1,30 @@ // Completion Provider -import { TextDocument, Position, CompletionContext, CompletionItem, CompletionTriggerKind, CompletionItemKind, workspace } from "vscode"; +import { TextDocument, Position, CompletionContext, CompletionItem, CompletionTriggerKind, CompletionItemKind, workspace, languages, CancellationToken, ProviderResult } from "vscode"; import { Displayable } from "./displayable"; import { getDefinitionFromFile } from "./hover"; import { getCurrentContext } from "./navigation"; import { NavigationData } from "./navigation-data"; +export const completionProvider = languages.registerCompletionItemProvider( + "renpy", + { + provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getCompletionList(document, position, context)); + }); + }, + }, + ".", + " ", + "@", + "-", + "(" +); + /** * Returns an array of auto-complete items related to the keyword at the given document/position * @param document - The current TextDocument diff --git a/src/configuration.ts b/src/configuration.ts new file mode 100644 index 00000000..c053958b --- /dev/null +++ b/src/configuration.ts @@ -0,0 +1,56 @@ +import { ConfigurationTarget, ExtensionContext, WorkspaceConfiguration, workspace } from "vscode"; + +export class Configuration { + public static initialize(context: ExtensionContext) { + // hide rpyc files if the setting is enabled + const config = workspace.getConfiguration("renpy"); + if (config?.excludeCompiledFilesFromWorkspace) { + this.excludeCompiledFilesConfig(); + } + + // Listen to configuration changes + context.subscriptions.push( + workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("renpy.excludeCompiledFilesFromWorkspace")) { + if (workspace.getConfiguration("renpy").get("excludeCompiledFilesFromWorkspace")) { + this.excludeCompiledFilesConfig(); + } + } + }) + ); + } + + public static isAutoSaveDisabled(): boolean { + const config = workspace.getConfiguration("files"); + const autoSave = config.get("autoSave"); + return autoSave === "off"; + } + + public static compileOnDocumentSave(): boolean { + const config = workspace.getConfiguration("renpy"); + return config.get("compileOnDocumentSave") === true; + } + + public static shouldWatchFoldersForChanges(): boolean { + const config = workspace.getConfiguration("renpy"); + return config.get("watchFoldersForChanges") === true; + } + + public static getRenpyExecutablePath(): string { + const config = workspace.getConfiguration("renpy"); + return config.get("renpyExecutableLocation") || ""; + } + + private static excludeCompiledFilesConfig() { + const renpyExclude = ["**/*.rpyc", "**/*.rpa", "**/*.rpymc", "**/cache/"]; + const config = workspace.getConfiguration("files"); + const workspaceExclude = config.inspect("exclude"); + const exclude = { ...workspaceExclude?.workspaceValue }; + renpyExclude.forEach((element) => { + if (!(element in exclude)) { + Object.assign(exclude, { [element]: true }); + } + }); + config.update("exclude", exclude, ConfigurationTarget.Workspace); + } +} diff --git a/src/definition.ts b/src/definition.ts index cacf1277..d8648e8a 100644 --- a/src/definition.ts +++ b/src/definition.ts @@ -1,16 +1,26 @@ -// Definition Provider -"use strict"; - -import { Definition, Location, Position, TextDocument, Uri } from "vscode"; +// Provider for Go To Definition +import { CancellationToken, Definition, Location, Position, ProviderResult, TextDocument, Uri, languages } from "vscode"; import { getKeywordPrefix } from "./extension"; import { rangeAsString } from "./navigation"; import { NavigationData } from "./navigation-data"; import { getFileWithPath, stripWorkspaceFromFile } from "./workspace"; +export const definitionProvider = languages.registerDefinitionProvider("renpy", { + provideDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getDefinition(document, position)); + }); + }, +}); + export function getDefinition(document: TextDocument, position: Position): Definition | undefined { const range = document.getWordRangeAtPosition(position); if (!range) { - return; + return undefined; } // check if this range is a semantic token diff --git a/src/diagnostics.ts b/src/diagnostics.ts index 63888104..f8417aa6 100644 --- a/src/diagnostics.ts +++ b/src/diagnostics.ts @@ -1,6 +1,4 @@ // Diagnostics (warnings and errors) -"use strict"; - import { Diagnostic, DiagnosticCollection, DiagnosticSeverity, ExtensionContext, Range, TextDocument, window, workspace } from "vscode"; import { NavigationData } from "./navigation-data"; import { extractFilename } from "./workspace"; diff --git a/src/displayable.ts b/src/displayable.ts index 70b076e5..3766bd92 100644 --- a/src/displayable.ts +++ b/src/displayable.ts @@ -1,5 +1,4 @@ // Displayable Class -"use strict"; export class Displayable { name: string; diff --git a/src/extension.ts b/src/extension.ts index 2c6f7fb4..a0de1620 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,184 +4,43 @@ import * as cp from "child_process"; import * as fs from "fs"; -import { - ExtensionContext, - languages, - commands, - window, - TextDocument, - Position, - CancellationToken, - CompletionContext, - CompletionItem, - CompletionItemProvider, - ConfigurationTarget, - Definition, - DefinitionProvider, - DocumentSemanticTokensProvider, - DocumentSymbol, - debug, - DocumentSymbolProvider, - Hover, - HoverProvider, - Location, - ProviderResult, - Range, - ReferenceContext, - ReferenceProvider, - SemanticTokens, - SemanticTokensLegend, - DocumentSelector, - StatusBarItem, - workspace, - WorkspaceConfiguration, - SignatureHelpProvider, - SignatureHelp, - SignatureHelpContext, - StatusBarAlignment, - Uri, -} from "vscode"; -import { RenpyColorProvider } from "./color"; +import { ExtensionContext, languages, commands, window, TextDocument, Position, debug, Range, workspace, Uri } from "vscode"; +import { colorProvider } from "./color"; import { getStatusBarText, NavigationData } from "./navigation-data"; import { cleanUpPath, getAudioFolder, getImagesFolder, getNavigationJsonFilepath, getWorkspaceFolder, stripWorkspaceFromFile } from "./workspace"; import { refreshDiagnostics, subscribeToDocumentChanges } from "./diagnostics"; -import { getSemanticTokens } from "./semantics"; -import { getHover } from "./hover"; -import { getCompletionList } from "./completion"; -import { getDefinition } from "./definition"; -import { getDocumentSymbols } from "./outline"; -import { findAllReferences } from "./references"; +import { semanticTokensProvider } from "./semantics"; +import { hoverProvider } from "./hover"; +import { completionProvider } from "./completion"; +import { definitionProvider } from "./definition"; +import { symbolProvider } from "./outline"; +import { referencesProvider } from "./references"; import { registerDebugDecorator, unregisterDebugDecorator } from "./tokenizer/debug-decorator"; -import { clearTokenCache } from "./tokenizer/tokenizer"; -import { getSignatureHelp } from "./signature"; -import { LogCategory, LogLevel, logCatMessage, logMessage, logToast } from "./logger"; - -const selector: DocumentSelector = { scheme: "file", language: "renpy" }; -let myStatusBarItem: StatusBarItem; +import { Tokenizer } from "./tokenizer/tokenizer"; +import { signatureProvider } from "./signature"; +import { LogLevel, intializeLoggingSystems, logMessage, logToast, updateStatusBar } from "./logger"; +import { Configuration } from "./configuration"; export async function activate(context: ExtensionContext): Promise { - logMessage(LogLevel.Info, "Ren'Py extension activated"); - - const filepath = getNavigationJsonFilepath(); - const jsonFileExists = fs.existsSync(filepath); - if (!jsonFileExists) { - logMessage(LogLevel.Warning, "Navigation.json file is missing."); - } + intializeLoggingSystems(context); + updateStatusBar("$(sync~spin) Loading Ren'Py extension..."); - // hide rpyc files if the setting is enabled - const config = workspace.getConfiguration("renpy"); - if (config?.excludeCompiledFilesFromWorkspace) { - excludeCompiledFilesConfig(); - } + Configuration.initialize(context); - // Listen to configuration changes - context.subscriptions.push( - workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("renpy.excludeCompiledFilesFromWorkspace")) { - if (workspace.getConfiguration("renpy").get("excludeCompiledFilesFromWorkspace")) { - excludeCompiledFilesConfig(); - } - } - }) - ); - - // hover provider for code tooltip - const hoverProvider = languages.registerHoverProvider( - selector, - new (class implements HoverProvider { - async provideHover(document: TextDocument, position: Position, token: CancellationToken): Promise { - return getHover(document, position); - } - })() - ); + // Subscribe to supported language features context.subscriptions.push(hoverProvider); - - // provider for Go To Definition - const definitionProvider = languages.registerDefinitionProvider( - selector, - new (class implements DefinitionProvider { - provideDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { - return getDefinition(document, position); - } - })() - ); context.subscriptions.push(definitionProvider); - - // provider for Outline view - const symbolProvider = languages.registerDocumentSymbolProvider( - selector, - new (class implements DocumentSymbolProvider { - provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult { - return getDocumentSymbols(document); - } - })() - ); context.subscriptions.push(symbolProvider); - - // provider for Method Signature Help - const signatureProvider = languages.registerSignatureHelpProvider( - selector, - new (class implements SignatureHelpProvider { - provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken, context: SignatureHelpContext): ProviderResult { - return getSignatureHelp(document, position, context); - } - })(), - "(", - ",", - "=" - ); context.subscriptions.push(signatureProvider); - - // Completion provider - const completionProvider = languages.registerCompletionItemProvider( - selector, - new (class implements CompletionItemProvider { - provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult { - return getCompletionList(document, position, context); - } - })(), - ".", - " ", - "@", - "-", - "(" - ); context.subscriptions.push(completionProvider); - - // Color Provider - const colorProvider = languages.registerColorProvider("renpy", new RenpyColorProvider()); context.subscriptions.push(colorProvider); + context.subscriptions.push(referencesProvider); + context.subscriptions.push(semanticTokensProvider); - // Find All References provider - const references = languages.registerReferenceProvider( - selector, - new (class implements ReferenceProvider { - async provideReferences(document: TextDocument, position: Position, context: ReferenceContext, token: CancellationToken): Promise { - return await findAllReferences(document, position, context); - } - })() - ); - context.subscriptions.push(references); - - const tokenTypes = ["class", "parameter", "variable", "keyword"]; - const tokenModifiers = ["declaration", "defaultLibrary"]; - const legend = new SemanticTokensLegend(tokenTypes, tokenModifiers); - - // Semantic Token Provider - const semanticTokens = languages.registerDocumentSemanticTokensProvider( - selector, - new (class implements DocumentSemanticTokensProvider { - provideDocumentSemanticTokens(document: TextDocument, token: CancellationToken): ProviderResult { - if (document.languageId !== "renpy") { - return; - } else { - return getSemanticTokens(document, legend); - } - } - })(), - legend - ); - context.subscriptions.push(semanticTokens); + // diagnostics (errors and warnings) + const diagnostics = languages.createDiagnosticCollection("renpy"); + context.subscriptions.push(diagnostics); + subscribeToDocumentChanges(context, diagnostics); // A TextDocument was saved context.subscriptions.push( @@ -190,14 +49,12 @@ export async function activate(context: ExtensionContext): Promise { return; } - const filesConfig = workspace.getConfiguration("files"); - if (filesConfig.get("autoSave") === undefined || filesConfig.get("autoSave") !== "off") { + if (Configuration.isAutoSaveDisabled()) { // only trigger document refreshes if file autoSave is off return; } - const config = workspace.getConfiguration("renpy"); - if (config && config.compileOnDocumentSave) { + if (Configuration.compileOnDocumentSave()) { if (!NavigationData.isCompiling) { ExecuteRenpyCompile(); } @@ -214,11 +71,6 @@ export async function activate(context: ExtensionContext): Promise { }) ); - // diagnostics (errors and warnings) - const diagnostics = languages.createDiagnosticCollection("renpy"); - context.subscriptions.push(diagnostics); - subscribeToDocumentChanges(context, diagnostics); - // custom command - refresh data const refreshCommand = commands.registerCommand("renpy.refreshNavigationData", async () => { updateStatusBar("$(sync~spin) Refreshing Ren'Py navigation data..."); @@ -264,7 +116,6 @@ export async function activate(context: ExtensionContext): Promise { }); } }); - context.subscriptions.push(migrateOldFilesCommand); // custom command - refresh diagnostics @@ -277,11 +128,13 @@ export async function activate(context: ExtensionContext): Promise { // custom command - toggle token debug view let isShowingTokenDebugView = false; - const toggleTokenDebugViewCommand = commands.registerCommand("renpy.toggleTokenDebugView", () => { + const toggleTokenDebugViewCommand = commands.registerCommand("renpy.toggleTokenDebugView", async () => { if (!isShowingTokenDebugView) { - clearTokenCache(); - registerDebugDecorator(context); + logToast(LogLevel.Info, "Enabled token debug view"); + Tokenizer.clearTokenCache(); + await registerDebugDecorator(context); } else { + logToast(LogLevel.Info, "Disabled token debug view"); unregisterDebugDecorator(); } isShowingTokenDebugView = !isShowingTokenDebugView; @@ -291,26 +144,28 @@ export async function activate(context: ExtensionContext): Promise { // custom command - call renpy to run workspace const runCommand = commands.registerCommand("renpy.runCommand", () => { //EsLint recommends config be removed as it has already been declared in a previous scope - if (!config || !isValidExecutable(config.renpyExecutableLocation)) { + const rpyPath = Configuration.getRenpyExecutablePath(); + + if (!isValidExecutable(rpyPath)) { logToast(LogLevel.Error, "Ren'Py executable location not configured or is invalid."); - } else { - //this is kinda a hob botched together attempt that I'm like 30% certain has a chance of working - debug.startDebugging( - undefined, - { - type: "cmd", - name: "Run File", - request: "launch", - program: config.renpyExecutableLocation, - }, - { noDebug: true } - ); - - //call renpy - const result = RunWorkspaceFolder(); - if (result) { - logToast(LogLevel.Info, "Ren'Py is running successfully"); - } + return; + } + + debug.startDebugging( + undefined, + { + type: "cmd", + name: "Run File", + request: "launch", + program: rpyPath, + }, + { noDebug: true } + ); + + //call renpy + const result = RunWorkspaceFolder(); + if (result) { + logToast(LogLevel.Info, "Ren'Py is running successfully"); } }); context.subscriptions.push(runCommand); @@ -336,11 +191,11 @@ export async function activate(context: ExtensionContext): Promise { }); context.subscriptions.push(compileCommand); - // Custom status bar - myStatusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 100); - context.subscriptions.push(myStatusBarItem); - myStatusBarItem.text = "$(sync~spin) Initializing Ren'Py static data..."; - myStatusBarItem.show(); + const filepath = getNavigationJsonFilepath(); + const jsonFileExists = fs.existsSync(filepath); + if (!jsonFileExists) { + logMessage(LogLevel.Warning, "Navigation.json file is missing."); + } // Detect file system change to the navigation.json file and trigger a refresh updateStatusBar("$(sync~spin) Initializing Ren'Py static data..."); @@ -349,23 +204,25 @@ export async function activate(context: ExtensionContext): Promise { try { fs.watch(getNavigationJsonFilepath(), async (event, filename) => { - if (filename) { - logMessage(LogLevel.Debug, `${filename} changed`); - updateStatusBar("$(sync~spin) Refreshing Ren'Py navigation data..."); - try { - await NavigationData.refresh(); - } catch (error) { - logMessage(LogLevel.Error, `${Date()}: error refreshing NavigationData: ${error}`); - } finally { - updateStatusBar(getStatusBarText()); - } + if (!filename) { + return; + } + + logMessage(LogLevel.Debug, `${filename} changed`); + updateStatusBar("$(sync~spin) Refreshing Ren'Py navigation data..."); + try { + await NavigationData.refresh(); + } catch (error) { + logMessage(LogLevel.Error, `${Date()}: error refreshing NavigationData: ${error}`); + } finally { + updateStatusBar(getStatusBarText()); } }); } catch (error) { logMessage(LogLevel.Error, `Watch navigation.json file error: ${error}`); } - if (config && config.watchFoldersForChanges) { + if (Configuration.shouldWatchFoldersForChanges()) { logMessage(LogLevel.Info, "Starting Watcher for images folder."); try { fs.watch(getImagesFolder(), { recursive: true }, async (event, filename) => { @@ -390,6 +247,8 @@ export async function activate(context: ExtensionContext): Promise { logMessage(LogLevel.Error, `Watch audio folder error: ${error}`); } } + + logMessage(LogLevel.Info, "Ren'Py extension activated!"); } export function deactivate() { @@ -423,29 +282,6 @@ export function getKeywordPrefix(document: TextDocument, position: Position, ran return; } -function updateStatusBar(text: string) { - if (text === "") { - myStatusBarItem.hide(); - } else { - logCatMessage(LogLevel.Info, LogCategory.Status, text); - myStatusBarItem.text = text; - myStatusBarItem.show(); - } -} - -function excludeCompiledFilesConfig() { - const renpyExclude = ["**/*.rpyc", "**/*.rpa", "**/*.rpymc", "**/cache/"]; - const config = workspace.getConfiguration("files"); - const workspaceExclude = config.inspect("exclude"); - const exclude = { ...workspaceExclude?.workspaceValue }; - renpyExclude.forEach((element) => { - if (!(element in exclude)) { - Object.assign(exclude, { [element]: true }); - } - }); - config.update("exclude", exclude, ConfigurationTarget.Workspace); -} - function isValidExecutable(renpyExecutableLocation: string): boolean { if (!renpyExecutableLocation || renpyExecutableLocation === "") { return false; @@ -454,18 +290,17 @@ function isValidExecutable(renpyExecutableLocation: string): boolean { } // Attempts to run renpy executable through console commands. function RunWorkspaceFolder(): boolean { - const config = workspace.getConfiguration("renpy"); + const rpyPath = Configuration.getRenpyExecutablePath(); - if (config && isValidExecutable(config.renpyExecutableLocation)) { - const renpy = config.renpyExecutableLocation; - const renpyPath = cleanUpPath(Uri.file(renpy).path); + if (isValidExecutable(rpyPath)) { + const renpyPath = cleanUpPath(Uri.file(rpyPath).path); const cwd = renpyPath.substring(0, renpyPath.lastIndexOf("/")); const workfolder = getWorkspaceFolder(); const args: string[] = [`${workfolder}`, "run"]; if (workfolder.endsWith("/game")) { try { updateStatusBar("$(sync~spin) Running Ren'Py..."); - const result = cp.spawnSync(renpy, args, { + const result = cp.spawnSync(rpyPath, args, { cwd: `${cwd}`, env: { PATH: process.env.PATH }, }); @@ -493,10 +328,9 @@ function RunWorkspaceFolder(): boolean { } function ExecuteRenpyCompile(): boolean { - const config = workspace.getConfiguration("renpy"); - const renpy = config.renpyExecutableLocation; - if (isValidExecutable(renpy)) { - const renpyPath = cleanUpPath(Uri.file(renpy).path); + const rpyPath = Configuration.getRenpyExecutablePath(); + if (isValidExecutable(rpyPath)) { + const renpyPath = cleanUpPath(Uri.file(rpyPath).path); const cwd = renpyPath.substring(0, renpyPath.lastIndexOf("/")); let wf = getWorkspaceFolder(); @@ -509,7 +343,7 @@ function ExecuteRenpyCompile(): boolean { try { NavigationData.isCompiling = true; updateStatusBar("$(sync~spin) Compiling Ren'Py navigation data..."); - const result = cp.spawnSync(renpy, args, { + const result = cp.spawnSync(rpyPath, args, { cwd: `${cwd}`, env: { PATH: process.env.PATH }, encoding: "utf-8", diff --git a/src/hover.ts b/src/hover.ts index 8d2d1b8c..46e33b8b 100644 --- a/src/hover.ts +++ b/src/hover.ts @@ -1,14 +1,26 @@ // Hover Provider "use strict"; -import { Hover, MarkdownString, Position, Range, TextDocument, Uri } from "vscode"; +import { CancellationToken, Hover, MarkdownString, Position, ProviderResult, Range, TextDocument, Uri, languages } from "vscode"; import { getKeywordPrefix } from "./extension"; import { rangeAsString, Navigation, getPyDocsAtLine, formatDocumentationAsMarkdown } from "./navigation"; import { NavigationData } from "./navigation-data"; import { stripWorkspaceFromFile, extractFilename, getFileWithPath } from "./workspace"; import * as fs from "fs"; -export function getHover(document: TextDocument, position: Position): Hover | null | undefined { +export const hoverProvider = languages.registerHoverProvider("renpy", { + provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getHoverContent(document, position)); + }); + }, +}); + +export function getHoverContent(document: TextDocument, position: Position): Hover | null | undefined { let range = document.getWordRangeAtPosition(position); if (!range) { return undefined; diff --git a/src/logger.ts b/src/logger.ts index 605db816..dc69c1f5 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,6 +1,26 @@ -import { window } from "vscode"; +import { ExtensionContext, StatusBarAlignment, window } from "vscode"; const outputChannel = window.createOutputChannel("Ren'Py Language Extension", "renpy-log"); +const statusBar = window.createStatusBarItem(StatusBarAlignment.Right, 100); + +export function intializeLoggingSystems(context: ExtensionContext) { + context.subscriptions.push(outputChannel); + + statusBar.name = "Ren'Py Language Extension Status"; + statusBar.tooltip = "Ren'Py Language Extension Status"; + context.subscriptions.push(statusBar); +} + +export function updateStatusBar(text: string) { + if (text === "") { + statusBar.hide(); + return; + } + + logCatMessage(LogLevel.Info, LogCategory.Status, text); + statusBar.text = text; + statusBar.show(); +} // eslint-disable-next-line no-shadow export const enum LogLevel { diff --git a/src/outline.ts b/src/outline.ts index e87eca37..baefbd08 100644 --- a/src/outline.ts +++ b/src/outline.ts @@ -1,11 +1,21 @@ // Document Symbol (Outline) Provider -"use strict"; - -import { TextDocument, DocumentSymbol, Uri, Range, SymbolKind } from "vscode"; +import { TextDocument, DocumentSymbol, Uri, Range, SymbolKind, languages, CancellationToken, ProviderResult } from "vscode"; import { Navigation } from "./navigation"; import { NavigationData } from "./navigation-data"; import { stripWorkspaceFromFile } from "./workspace"; +export const symbolProvider = languages.registerDocumentSymbolProvider("renpy", { + provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getDocumentSymbols(document)); + }); + }, +}); + /** * Gets an array of Document Symbols for the given TextDocument used to populate the editor's Outline view * @param document - The current TextDocument diff --git a/src/references.ts b/src/references.ts index 7270ba3e..84d65343 100644 --- a/src/references.ts +++ b/src/references.ts @@ -1,10 +1,18 @@ -// References Provider -"use strict"; - -import { TextDocument, Position, ReferenceContext, Location, workspace } from "vscode"; +// Find all References Provider +import { TextDocument, Position, ReferenceContext, Location, workspace, languages, CancellationToken } from "vscode"; import { getKeywordPrefix } from "./extension"; import { NavigationData } from "./navigation-data"; +export const referencesProvider = languages.registerReferenceProvider("renpy", { + async provideReferences(document: TextDocument, position: Position, context: ReferenceContext, token: CancellationToken) { + if (token.isCancellationRequested) { + return; + } + + return await findAllReferences(document, position, context); + }, +}); + /** * Returns an array of Locations that describe all matches for the keyword at the current position * @param document - The current text document @@ -16,7 +24,7 @@ export async function findAllReferences(document: TextDocument, position: Positi const range = document.getWordRangeAtPosition(position); let keyword = document.getText(range); if (!keyword) { - return; + return undefined; } if (range) { @@ -30,8 +38,8 @@ export async function findAllReferences(document: TextDocument, position: Positi const files = await workspace.findFiles("**/*.rpy"); if (files && files.length > 0) { for (const file of files) { - document = await workspace.openTextDocument(file); - const locations = findReferenceMatches(keyword, document); + const textDocument = await workspace.openTextDocument(file); + const locations = findReferenceMatches(keyword, textDocument); if (locations) { for (const l of locations) { references.push(l); diff --git a/src/semantics.ts b/src/semantics.ts index 60f9f598..24bcce52 100644 --- a/src/semantics.ts +++ b/src/semantics.ts @@ -1,13 +1,35 @@ -// Semantic Tokens -"use strict"; - -import { Position, Range, SemanticTokens, SemanticTokensBuilder, SemanticTokensLegend, TextDocument } from "vscode"; +// Semantic Token Provider +import { CancellationToken, Position, ProviderResult, Range, SemanticTokens, SemanticTokensBuilder, SemanticTokensLegend, TextDocument, languages } from "vscode"; import { Navigation, splitParameters, rangeAsString, getCurrentContext, DataType } from "./navigation"; import { NavigationData, updateNavigationData } from "./navigation-data"; import { stripWorkspaceFromFile } from "./workspace"; import { LogLevel, logMessage } from "./logger"; -export function getSemanticTokens(document: TextDocument, legend: SemanticTokensLegend): SemanticTokens { +const tokenTypes = ["class", "parameter", "variable", "keyword"]; +const tokenModifiers = ["declaration", "defaultLibrary"]; +const legend = new SemanticTokensLegend(tokenTypes, tokenModifiers); + +export const semanticTokensProvider = languages.registerDocumentSemanticTokensProvider( + "renpy", + { + provideDocumentSemanticTokens(document: TextDocument, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + if (document.languageId !== "renpy") { + return; + } + + return new Promise((resolve) => { + resolve(getSemanticTokens(document)); + }); + }, + }, + legend +); + +export function getSemanticTokens(document: TextDocument): SemanticTokens { const tokensBuilder = new SemanticTokensBuilder(legend); const rxKeywordList = /\s*(screen|label|transform|def|class)\s+/; const rxParameterList = diff --git a/src/signature.ts b/src/signature.ts index 1c40a384..b903c7f2 100644 --- a/src/signature.ts +++ b/src/signature.ts @@ -1,11 +1,27 @@ -// Signature Provider -"use strict"; - -import { TextDocument, Position, SignatureHelp, SignatureHelpContext } from "vscode"; +// Signature Provider for Method Signature Help +import { TextDocument, Position, SignatureHelp, SignatureHelpContext, languages, CancellationToken, ProviderResult } from "vscode"; import { getKeywordPrefix } from "./extension"; import { getArgumentParameterInfo } from "./navigation"; import { NavigationData } from "./navigation-data"; +export const signatureProvider = languages.registerSignatureHelpProvider( + "renpy", + { + provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken, context: SignatureHelpContext): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getSignatureHelp(document, position, context)); + }); + }, + }, + "(", + ",", + "=" +); + /** * Gets method signature help for the keyword at the given position in the given document * @param document - The current TextDocument diff --git a/src/tokenizer/debug-decorator.ts b/src/tokenizer/debug-decorator.ts index 0421e8ce..f0ca4991 100644 --- a/src/tokenizer/debug-decorator.ts +++ b/src/tokenizer/debug-decorator.ts @@ -2,7 +2,7 @@ import { performance } from "perf_hooks"; import { DecorationOptions, Disposable, ExtensionContext, MarkdownString, Uri, window, workspace } from "vscode"; import { CharacterTokenType, LiteralTokenType, EntityTokenType, EscapedCharacterTokenType, KeywordTokenType, MetaTokenType, OperatorTokenType } from "./renpy-tokens"; import { TokenTree, tokenTypeToStringMap } from "./token-definitions"; -import { tokenizeDocument } from "./tokenizer"; +import { Tokenizer } from "./tokenizer"; import { LogLevel, logMessage, logToast } from "../logger"; let timeout: NodeJS.Timer | undefined = undefined; @@ -150,24 +150,24 @@ let documentUri: Uri | null = null; let textChangedEvent: Disposable | null = null; let activeEditorChangedEvent: Disposable | null = null; -export function registerDebugDecorator(context: ExtensionContext) { - triggerUpdateDecorations(); +export async function registerDebugDecorator(context: ExtensionContext) { + await triggerUpdateDecorations(); // A TextDocument was changed context.subscriptions.push( - (textChangedEvent = workspace.onDidChangeTextDocument((event) => { + (textChangedEvent = workspace.onDidChangeTextDocument(async (event) => { const activeEditor = window.activeTextEditor; if (activeEditor && event.document === activeEditor.document) { - triggerUpdateDecorations(true); + await triggerUpdateDecorations(true); } })) ); // The active text editor was changed context.subscriptions.push( - (activeEditorChangedEvent = window.onDidChangeActiveTextEditor(() => { - triggerUpdateDecorations(); + (activeEditorChangedEvent = window.onDidChangeActiveTextEditor(async () => { + await triggerUpdateDecorations(); })) ); } @@ -185,7 +185,7 @@ export function unregisterDebugDecorator() { allDecorationTypes.forEach((x) => activeEditor.setDecorations(x, [])); } -function updateDecorations() { +async function updateDecorations() { const activeEditor = window.activeTextEditor; if (!activeEditor) { return; @@ -197,7 +197,7 @@ function updateDecorations() { // Update tokens only if document has changed const t0 = performance.now(); - tokenCache = tokenizeDocument(activeEditor.document); + tokenCache = await Tokenizer.tokenizeDocument(activeEditor.document); const t1 = performance.now(); logToast(LogLevel.Info, `DocumentTokenizer took ${(t1 - t0).toFixed(2)} milliseconds to complete.`); @@ -669,14 +669,16 @@ ${(decoration.hoverMessage as MarkdownString).value}` activeEditor.setDecorations(deprecatedDecorationType, deprecated); } -function triggerUpdateDecorations(throttle = false) { +async function triggerUpdateDecorations(throttle = false) { if (timeout) { clearTimeout(timeout); timeout = undefined; } if (throttle) { - timeout = setTimeout(updateDecorations, 500); + timeout = setTimeout(async () => { + await updateDecorations(); + }, 500); } else { - updateDecorations(); + await updateDecorations(); } } diff --git a/src/tokenizer/tokenizer.ts b/src/tokenizer/tokenizer.ts index 0c7b5212..89733569 100644 --- a/src/tokenizer/tokenizer.ts +++ b/src/tokenizer/tokenizer.ts @@ -8,6 +8,7 @@ import { Stack } from "../utilities/stack"; import { Vector } from "../utilities/vector"; import { TokenPatternCapture, TokenCapturePattern, TokenRepoPattern, TokenRangePattern, TokenMatchPattern } from "./token-pattern-types"; import { LogCategory, LogLevel, logCatMessage } from "../logger"; +import { escapeRegExpCharacters } from "../utilities/utils"; const cloneScanResult = (obj: ScanResult | undefined): ScanResult | undefined => { if (obj === undefined) return undefined; @@ -42,186 +43,213 @@ interface RangeScanResult { type ScanResult = MatchScanResult | RangeScanResult | null; type TokenCache = { readonly documentVersion: number; readonly tokens: TokenTree }; -const tokenCache = new Map(); -const runBenchmark = false; -let uniquePatternCount = -1; +const RUN_BENCHMARKS = false; +//const TOKENIZER_TIMEOUT = 5_000; -export function tokenizeDocument(document: TextDocument): TokenTree { - setupAndValidatePatterns(); +export class Tokenizer { + private static _uniquePatternCount = -1; + private static _tokenCache = new Map(); - if (runBenchmark) { - benchmark(document); + public static get UNIQUE_PATTERN_COUNT() { + return this._uniquePatternCount; } - const cachedTokens = tokenCache.get(document.uri); - if (cachedTokens?.documentVersion === document.version) { - return cachedTokens.tokens; - } - - logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Running tokenizer on document: ${document.fileName}`); - const tokenizer = new DocumentTokenizer(document); - logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Tokenizer completed!`); - tokenCache.set(document.uri, { documentVersion: document.version, tokens: tokenizer.tokens }); - return tokenizer.tokens; -} + public static async tokenizeDocument(document: TextDocument) { + this.setupAndValidatePatterns(); -export function clearTokenCache() { - tokenCache.clear(); -} + if (RUN_BENCHMARKS) { + this.benchmark(document); + } -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function benchmark(document: TextDocument) { - // screens.rpy, 10000 loops; 19.69293530988693 avg. + const cachedTokens = this._tokenCache.get(document.uri); + if (cachedTokens?.documentVersion === document.version) { + return cachedTokens.tokens; + } - const loops = 10000; - const reportEveryXPercent = 1; + return await this.runTokenizer(document); + } - const onePercent = loops / 100; - const everyX = onePercent * reportEveryXPercent; + public static clearTokenCache() { + this._tokenCache.clear(); + } - logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Running tokenizer benchmark for ${loops} loops...`); + private static async runTokenizer(document: TextDocument) { + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Running tokenizer on document: ${document.fileName}`); + const tokenizer = new DocumentTokenizer(document); + await Promise.resolve(tokenizer.tokenize()); + + // TODO: Need to mark all these functions async for this to work properly + /*await withTimeout(, TOKENIZER_TIMEOUT, () => { + // If the tokenizer times out, we still want to cache the document so that we don't try to tokenize it again + this._tokenCache.set(document.uri, { documentVersion: document.version, tokens: new TokenTree() }); + logToast(LogLevel.Info, `Tokenizer timed out after ${TOKENIZER_TIMEOUT}ms, while attempting to tokenize the document at: ${document.uri}`); + });*/ + + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Tokenizer completed!`); + this._tokenCache.set(document.uri, { documentVersion: document.version, tokens: tokenizer.tokens }); + return tokenizer.tokens; + } - let avg = 0; - for (let i = 0; i < loops; ++i) { - const t0 = performance.now(); - const tokenizer: DocumentTokenizer = new DocumentTokenizer(document); - const t1 = performance.now(); + private static benchmark(document: TextDocument) { + // screens.rpy, 10000 loops; 19.69293530988693 avg. - avg += t1 - t0; + const loops = 10000; + const reportEveryXPercent = 1; - // This is really just here to prevent the unused variable error - if (tokenizer.tokens.isEmpty()) { - logCatMessage(LogLevel.Error, LogCategory.Tokenizer, "No tokens were found."); - } + const onePercent = loops / 100; + const everyX = onePercent * reportEveryXPercent; - // Show timer - const msLoop = avg / (i + 1); - const sRemaining = msLoop * (loops - i + 1) * 0.001; - const h = Math.floor(sRemaining / 3600); - const m = Math.floor((sRemaining / 60) % 60); - const s = Math.ceil(sRemaining % 60); - const timeString = [h ? h + "h" : false, m ? m + "m" : false, s ? s + "s" : false] - .filter(Boolean) - .join(":") - .replace(/\b(\d)(?=[hms])/g, "0$1"); + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `Running tokenizer benchmark for ${loops} loops...`); - if (i % everyX === 0) { - logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `${i / onePercent}% complete... (avg.: ${msLoop.toFixed(2)}ms, approx. ${timeString} remaining)`); - } - } - avg /= loops; + let avg = 0; + for (let i = 0; i < loops; ++i) { + const t0 = performance.now(); + const tokenizer: DocumentTokenizer = new DocumentTokenizer(document); + const t1 = performance.now(); - logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `DocumentTokenizer took ${avg} avg. milliseconds to complete.`); -} + avg += t1 - t0; -function setupAndValidatePatterns() { - if (uniquePatternCount !== -1) return; + // This is really just here to prevent the unused variable error + if (tokenizer.tokens.isEmpty()) { + logCatMessage(LogLevel.Error, LogCategory.Tokenizer, "No tokens were found."); + } - uniquePatternCount = 0; - const stack = new Stack(32); - stack.push(RenpyPatterns.basePatterns as ExTokenRepoPattern); + // Show timer + const msLoop = avg / (i + 1); + const sRemaining = msLoop * (loops - i + 1) * 0.001; + const h = Math.floor(sRemaining / 3600); + const m = Math.floor((sRemaining / 60) % 60); + const s = Math.ceil(sRemaining % 60); + const timeString = [h ? h + "h" : false, m ? m + "m" : false, s ? s + "s" : false] + .filter(Boolean) + .join(":") + .replace(/\b(\d)(?=[hms])/g, "0$1"); + + if (i % everyX === 0) { + logCatMessage(LogLevel.Info, LogCategory.Tokenizer, `${i / onePercent}% complete... (avg.: ${msLoop.toFixed(2)}ms, approx. ${timeString} remaining)`); + } + } + avg /= loops; - const mFlagRe = /(?(32); + stack.push(RenpyPatterns.basePatterns as ExTokenRepoPattern); - if (isRepoPattern(p)) { - p._patternType = TokenPatternType.RepoPattern; - for (let i = 0; i < p.patterns.length; ++i) stack.push(p.patterns[i]); - } else if (isRangePattern(p)) { - p._patternType = TokenPatternType.RangePattern; - let reBeginSource = p.begin.source; + const mFlagRe = /(? { - if (v.patterns) stack.push(v as ExTokenRepoPattern); - }); - } else { - assert(!p.begin.hasIndices, "This pattern should not have the 'd' flag set!"); - } - if (p.endCaptures) { - assert(p.end.hasIndices, "To match this end pattern the 'd' flag is required!"); + if (reBeginSource.match(mFlagRe)) { + assert(p.begin.multiline, "To match this pattern the 'm' flag is required on the begin RegExp!"); + } - Object.entries(p.endCaptures).forEach(([, v]) => { - if (v.patterns) stack.push(v as ExTokenRepoPattern); - }); - } else { - assert(!p.end.hasIndices, "This pattern should not have the 'd' flag set!"); - } + if (gAnchorRe.test(reBeginSource)) { + assert("Can't use the \\G anchor, please update the regex!"); + reBeginSource = reBeginSource.replace(gAnchorRe, ""); + } - if (p.patterns) { - p._patternsRepo = { - patterns: p.patterns as ExTokenPatternArray, - _patternId: -1, - _patternType: TokenPatternType.RepoPattern, - }; - stack.push(p._patternsRepo!); - } + assert(p.begin.global && p.end.global, "To match this pattern the 'g' flag is required on the begin and end RegExp!"); + if (p.beginCaptures) { + assert(p.begin.hasIndices, "To match this begin pattern the 'd' flag is required!"); - let reEndSource = p.end.source; + Object.entries(p.beginCaptures).forEach(([, v]) => { + if (v.patterns) stack.push(v as ExTokenRepoPattern); + }); + } else { + assert(!p.begin.hasIndices, "This pattern should not have the 'd' flag set!"); + } + if (p.endCaptures) { + assert(p.end.hasIndices, "To match this end pattern the 'd' flag is required!"); + + Object.entries(p.endCaptures).forEach(([, v]) => { + if (v.patterns) stack.push(v as ExTokenRepoPattern); + }); + } else { + assert(!p.end.hasIndices, "This pattern should not have the 'd' flag set!"); + } - if (mFlagRe.test(reEndSource)) { - assert(p.end.multiline, "To match this pattern the 'm' flag is required on the end RegExp!"); - } + if (p.patterns) { + p._patternsRepo = { + patterns: p.patterns as ExTokenPatternArray, + _patternId: -1, + _patternType: TokenPatternType.RepoPattern, + }; + stack.push(p._patternsRepo!); + } - if (gAnchorRe.test(reEndSource)) { - logCatMessage(LogLevel.Warning, LogCategory.Tokenizer, "\\G anchor is not supported and will be ignored!", true); - reEndSource = reEndSource.replace(gAnchorRe, ""); - } + let reEndSource = p.end.source; - p._hasBackref = /\\\d+/.test(reEndSource); - //reEndSource = reEndSource.replaceAll("\\A", "¨0"); - reEndSource = reEndSource.replaceAll("\\Z", "$(?!\r\n|\r|\n)"); - reEndSource = reEndSource.replaceAll("\\R", "(?!\r\n|\r|\n)"); + if (mFlagRe.test(reEndSource)) { + assert(p.end.multiline, "To match this pattern the 'm' flag is required on the end RegExp!"); + } - p.begin = new RegExp(reBeginSource, p.begin.flags); - p.end = new RegExp(reEndSource, p.end.flags); - } else if (isMatchPattern(p)) { - p._patternType = TokenPatternType.MatchPattern; + p._endNotG = false; + if (gAnchorRe.test(reEndSource)) { + if (reEndSource.startsWith("(?!\\G)")) { + p._endNotG = true; + } else { + assert("The end patterns only supports (?!\\G) at the start of the regex. Please update the regex!"); + reEndSource = reEndSource.replace(gAnchorRe, ""); + } + } - if (p.match.source.match(mFlagRe)) { - assert(p.match.multiline, "To match this pattern the 'm' flag is required!"); - } + p._hasBackref = /\\\d+/.test(reEndSource); + //reEndSource = reEndSource.replaceAll("\\A", "¨0"); + reEndSource = reEndSource.replaceAll("\\Z", "$(?!\r\n|\r|\n)"); + reEndSource = reEndSource.replaceAll("\\R", "(?!\r\n|\r|\n)"); - assert(p.match.global, "To match this pattern the 'g' flag is required!"); - if (p.captures) { - assert(p.match.hasIndices, "To match this pattern the 'd' flag is required!"); + p.begin = new RegExp(reBeginSource, p.begin.flags); + p.end = new RegExp(reEndSource, p.end.flags); + } else if (isMatchPattern(p)) { + p._patternType = TokenPatternType.MatchPattern; - Object.entries(p.captures).forEach(([, v]) => { - if (v.patterns) stack.push(v as ExTokenRepoPattern); - }); + if (p.match.source.match(mFlagRe)) { + assert(p.match.multiline, "To match this pattern the 'm' flag is required!"); + } + + assert(p.match.global, "To match this pattern the 'g' flag is required!"); + if (p.captures) { + assert(p.match.hasIndices, "To match this pattern the 'd' flag is required!"); + + Object.entries(p.captures).forEach(([, v]) => { + if (v.patterns) stack.push(v as ExTokenRepoPattern); + }); + } else { + assert(!p.match.hasIndices, "This pattern should not have the 'd' flag set!"); + } } else { - assert(!p.match.hasIndices, "This pattern should not have the 'd' flag set!"); + assert(false, "Should not get here!"); } - } else { - assert(false, "Should not get here!"); } } } -export function escapeRegExpCharacters(value: string): string { - return value.replace(/[-\\{}*+?|^$.,[\]()#\s]/g, "\\$&"); -} - class DocumentTokenizer { private readonly backrefReplaceRe = /\\(\d+)/g; public readonly tokens: TokenTree = new TokenTree(); @@ -229,7 +257,10 @@ class DocumentTokenizer { constructor(document: TextDocument) { this.document = document; - const text = document.getText(); + } + + public tokenize() { + const text = this.document.getText(); this.executePattern(RenpyPatterns.basePatterns as ExTokenRepoPattern, text, new Range(0, text.length), this.tokens.root); } @@ -341,12 +372,11 @@ class DocumentTokenizer { const re = pattern.match; re.lastIndex = sourceStartOffset; const match = re.exec(source); - if (match) { - const result = { pattern, matchBegin: match }; - return result; + if (!match) { + return null; } - return null; + return { pattern, matchBegin: match }; } private scanRangePattern(pattern: ExTokenRangePattern, source: string, sourceStartOffset: number): RangeScanResult | null { @@ -354,11 +384,11 @@ class DocumentTokenizer { reBegin.lastIndex = sourceStartOffset; const matchBegin = reBegin.exec(source); - if (matchBegin) { - return { pattern, matchBegin: matchBegin, matchEnd: null, expanded: false, contentMatches: null, source }; + if (!matchBegin) { + return null; } - return null; + return { pattern, matchBegin: matchBegin, matchEnd: null, expanded: false, contentMatches: null, source }; } private expandRangeScanResult(result: RangeScanResult, cache: Array) { @@ -385,42 +415,53 @@ class DocumentTokenizer { // Start end pattern after the last matched character in the begin pattern reEnd.lastIndex = matchBegin.index + matchBegin[0].length; + if (p._endNotG) { + ++reEnd.lastIndex; + } let matchEnd = reEnd.exec(result.source); const contentMatches = new Stack(); if (matchEnd) { // Check if any child pattern has content that would extend the currently determined end match if (p._patternsRepo) { - const contentStartIndex = matchBegin.index + matchBegin[0].length; - const contentEndIndex = matchEnd.index; + const sourceRange = new Range(matchBegin.index + matchBegin[0].length, matchEnd.index); const lastMatchedChar = matchEnd.index + matchEnd[0].length; // Scan the content for any matches that would extend beyond the current end match const tempCache = cloneCache(cache); //const tempCache = new Array(uniquePatternCount).fill(undefined); - for (let lastMatchIndex = contentStartIndex; lastMatchIndex < contentEndIndex; ) { - const bestChildMatch = this.scanPattern(p._patternsRepo, result.source, lastMatchIndex, tempCache); - if (!bestChildMatch) { - break; // No more matches + const lastCharIndex = sourceRange.end; + let lastMatchIndex = sourceRange.start; + while (lastMatchIndex < lastCharIndex) { + const bestMatch = this.scanPattern(p._patternsRepo, result.source, lastMatchIndex, tempCache); + + if (!bestMatch || bestMatch.matchBegin.index >= lastCharIndex) { + break; // No valid match was found in the remaining text. Break the loop } + const failSafeIndex = lastMatchIndex; // Debug index to break in case of an infinite loop + // Update the last match index to the end of the child match, so the next scan starts after it - const childMatchBegin = bestChildMatch.matchBegin; - if (bestChildMatch.pattern._patternType === TokenPatternType.RangePattern) { - const childMatchEnd = bestChildMatch.matchEnd!; + const childMatchBegin = bestMatch.matchBegin; + if (bestMatch.pattern._patternType === TokenPatternType.RangePattern) { + if (bestMatch?.pattern._patternType === TokenPatternType.RangePattern && !bestMatch.expanded) { + this.expandRangeScanResult(bestMatch as RangeScanResult, cache); + } + + const childMatchEnd = bestMatch.matchEnd!; lastMatchIndex = childMatchEnd.index + childMatchEnd[0].length; } else { lastMatchIndex = childMatchBegin.index + childMatchBegin[0].length; } - // Check if the match starts after the currently determined end match start, if so we ignore it - if (childMatchBegin.index >= contentEndIndex) { - continue; + if (failSafeIndex === lastMatchIndex) { + logCatMessage(LogLevel.Error, LogCategory.Tokenizer, "The range expand loop has not advanced since the last cycle. This indicates a programming error. Breaking the loop!", true); + break; } // To speed up the search, we can add any tokens that are within the content range - contentMatches.push(bestChildMatch); + contentMatches.push(bestMatch); // If the child match last char doesn't extend the current range, we can also ignore it if (lastMatchIndex <= lastMatchedChar) { @@ -518,7 +559,9 @@ class DocumentTokenizer { cache[next._patternId] = scanResult; } - if (!scanResult) continue; + if (!scanResult) { + continue; + } const matchRating = scanResult.matchBegin.index; if (matchRating >= bestMatchRating) { @@ -537,10 +580,6 @@ class DocumentTokenizer { cache[p._patternId] = bestResult; - if (bestResult?.pattern._patternType === TokenPatternType.RangePattern && !bestResult.expanded) { - this.expandRangeScanResult(bestResult as RangeScanResult, cache); - } - return bestResult; } @@ -579,12 +618,12 @@ class DocumentTokenizer { // Patterns are only applied on 'content' (see p.contentToken above) if (p._patternsRepo) { - /*while (!bestMatch.contentMatches!.isEmpty()) { + while (!bestMatch.contentMatches!.isEmpty()) { const contentScanResult = bestMatch.contentMatches!.pop()!; this.applyScanResult(contentScanResult, source, contentNode); - }*/ + } - this.executePattern(p._patternsRepo, source, new Range(contentStart, matchEnd!.index), contentNode); + //this.executePattern(p._patternsRepo, source, new Range(contentStart, matchEnd!.index), contentNode); } if (!contentNode.isEmpty()) { @@ -673,23 +712,24 @@ class DocumentTokenizer { return; } - const cache = new Array(uniquePatternCount).fill(undefined); + const cache = new Array(Tokenizer.UNIQUE_PATTERN_COUNT).fill(undefined); const lastCharIndex = sourceRange.end; let lastMatchIndex = sourceRange.start; while (lastMatchIndex < lastCharIndex) { const bestMatch = this.scanPattern(pattern, source, lastMatchIndex, cache); - if (bestMatch === null || bestMatch.matchBegin.index >= lastCharIndex) { - // No match was found in the remaining text. Break the loop - lastMatchIndex = lastCharIndex; - continue; + if (!bestMatch || bestMatch.matchBegin.index >= lastCharIndex) { + break; // No valid match was found in the remaining text. Break the loop } const failSafeIndex = lastMatchIndex; // Debug index to break in case of an infinite loop if (bestMatch.pattern._patternType === TokenPatternType.RangePattern) { - assert(bestMatch.expanded, "A RangePattern must be expanded!"); + if (bestMatch?.pattern._patternType === TokenPatternType.RangePattern && !bestMatch.expanded) { + this.expandRangeScanResult(bestMatch as RangeScanResult, cache); + } + const matchEnd = bestMatch.matchEnd!; lastMatchIndex = matchEnd.index + matchEnd[0].length; } else { @@ -697,12 +737,12 @@ class DocumentTokenizer { lastMatchIndex = matchBegin.index + matchBegin[0].length; } - this.applyScanResult(bestMatch, source, parentNode); - if (failSafeIndex === lastMatchIndex) { logCatMessage(LogLevel.Error, LogCategory.Tokenizer, "The loop has not advanced since the last cycle. This indicates a programming error. Breaking the loop!", true); break; } + + this.applyScanResult(bestMatch, source, parentNode); } } @@ -744,6 +784,7 @@ interface ExTokenRepoPattern extends TokenRepoPattern, PatternStateProperties { interface ExTokenRangePattern extends TokenRangePattern, PatternStateProperties { _patternType: TokenPatternType.RangePattern; _hasBackref: boolean; + _endNotG: boolean; _patternsRepo?: ExTokenRepoPattern; readonly beginCaptures?: ExTokenPatternCapture; diff --git a/src/utilities/utils.ts b/src/utilities/utils.ts index 1351c001..c3f84352 100644 --- a/src/utilities/utils.ts +++ b/src/utilities/utils.ts @@ -1,3 +1,20 @@ export type EnumToString = { [P in keyof Type]: { name: P; value: Type[P] }; }; + +export function escapeRegExpCharacters(value: string): string { + return value.replace(/[-\\{}*+?|^$.,[\]()#\s]/g, "\\$&"); +} + +export function withTimeout(promise: Promise, timeout: number, onTimeout?: () => void, timeoutMessage?: string): Promise { + const timer = new Promise((resolve, reject) => { + setTimeout(() => { + if (onTimeout) { + onTimeout(); + } + const message = timeoutMessage || `Promise timed out after ${timeout}ms.`; + reject(message); + }, timeout); + }); + return Promise.race([promise, timer]); +} From 163ea4cbce641620bcac31fcc3036b2efb8bedd3 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 10:23:41 +0200 Subject: [PATCH 074/152] Support syntax highlighting in _ren.py files Add injection grammar for renpy comments in _ren.py files For now this will only work in doc strings, python syntax highlighting isn't changed --- examples/test_ren.py | 17 +++++++++++++++++ package.json | 16 ++++++++++++++-- syntaxes/injection.json | 26 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 examples/test_ren.py create mode 100644 syntaxes/injection.json diff --git a/examples/test_ren.py b/examples/test_ren.py new file mode 100644 index 00000000..4e90b358 --- /dev/null +++ b/examples/test_ren.py @@ -0,0 +1,17 @@ +# This is not included in the game. It's here so that an editor knows +# the type of strength. +strength = 100 + +"""renpy +init python: +""" + +class BoostStrength(Action): + """ + Boosts the strength of the player by 10. + """ + + def __call__(self): + global strength + strength += 10 + renpy.restart_interaction() \ No newline at end of file diff --git a/package.json b/package.json index 51ad98ec..9d57d08f 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ }, "activationEvents": [ "onLanguage:renpy", - "workspaceContains:**/*.rpy" + "workspaceContains:**/*.rpy", + "workspaceContains:**/_ren.py" ], "main": "./dist/extension", "browser": "./dist/extension.js", @@ -46,7 +47,8 @@ "id": "renpy", "aliases": [ "Ren'Py", - "renpy" + "renpy", + "rpy" ], "extensions": [ ".rpy", @@ -88,6 +90,16 @@ "scopeName": "source.renpy.python", "path": "./syntaxes/renpy.python.tmLanguage.json" }, + { + "scopeName": "renpy.comment.injection", + "path": "./syntaxes/injection.json", + "injectTo": [ + "source.python" + ], + "embeddedLanguages": { + "meta.embedded.renpy": "renpy" + } + }, { "language": "renpy-log", "scopeName": "text.renpy-log", diff --git a/syntaxes/injection.json b/syntaxes/injection.json new file mode 100644 index 00000000..cdcb591d --- /dev/null +++ b/syntaxes/injection.json @@ -0,0 +1,26 @@ +{ + "scopeName": "renpy.comment.injection", + "injectionSelector": "L:string.quoted.docstring", + "patterns": [ + { + "include": "#renpy-source" + } + ], + "repository": { + "renpy-source": { + "contentName": "meta.embedded.renpy", + "begin": "(?<=^\\\"\\\"\\\")renpy", + "beginCaptures": { + "0": { + "name": "keyword.renpy" + } + }, + "end": "(?=^\\\"\\\"\\\")", + "patterns": [ + { + "include": "source.renpy" + } + ] + } + } +} From 87441dd5d8be5d6d26c1a0fa93549059e2ad4a7d Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 10:44:11 +0200 Subject: [PATCH 075/152] Also run check on base branch swap I accidentally selected master as base branch when creating the PR. When changing this to develop, the checks where not triggered. To fix this I added the `edited` type, which is used when changing the base ref. See https://github.com/actions/runner/issues/980 --- .github/workflows/pr-check.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 9b56c1f5..2cf99da4 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -2,6 +2,7 @@ name: PR Check on: pull_request: + types: [synchronize, opened, reopened, edited] branches: - master - develop From e37b0c464068f4208538e824d78a58d733b689fd Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 12:52:51 +0200 Subject: [PATCH 076/152] libraryTarget is depricated in favor of library.type --- webpack.config.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webpack.config.ts b/webpack.config.ts index 28ee49c9..88190c28 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -31,7 +31,9 @@ export const baseConfig: Configuration = { // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ filename: "extension.js", path: PATHS.dist, - libraryTarget: "commonjs2", + library: { + type: "commonjs2", + }, devtoolModuleFilenameTemplate: "../[resource-path]", // Removes the webpack:/// prefix from source maps }, module: { From 8e53c36475721b3929365ee91267584c0e2b3c2b Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 12:55:34 +0200 Subject: [PATCH 077/152] Allow absolute include paths This will make it possible to use 'src/path/to/file' imports instead of '../../' relative paths we were force to use --- tsconfig.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index be53b72b..90ace30b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,13 @@ { /* Visit https://aka.ms/tsconfig.json to read more about this file */ + "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { "module": "commonjs", "target": "ES2021", - "outDir": "out", "lib": ["ES2021"], - "sourceMap": true, + "baseUrl": ".", // Base directory to resolve non-absolute module names. "rootDir": "src", + "outDir": "out", /* Strict Type-Checking Option */ "strict": true /* enable all strict type-checking options */, @@ -30,10 +31,11 @@ /* Module Resolution Options */ "moduleResolution": "node", // Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). - "baseUrl": "./", // Base directory to resolve non-absolute module names. + "resolveJsonModule": true, // Allows importing modules with a .json extension. "paths": { // A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. // "app/*": ["src/app/*"] + "src/*": ["src/*"] }, // "rootDirs": [], // List of root folders whose combined content represents the structure of the project at runtime. "typeRoots": [ @@ -46,9 +48,9 @@ "esModuleInterop": true, // Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. // "preserveSymlinks": true, // Do not resolve the real path of symlinks. // "allowUmdGlobalAccess": true, // Allow accessing UMD globals from modules. - "resolveJsonModule": true, // Allows importing modules with a .json extension. /* Source Map Options */ + "sourceMap": true, // "sourceRoot": "", // Specify the location where debugger should locate TypeScript files instead of source locations. // "mapRoot": "", // Specify the location where debugger should locate map files instead of generated locations. // "inlineSourceMap": true, // Emit a single file with source maps instead of having a separate file. From 9ca9fe8dc889d18c62b429af586634f7eb7bb24a Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 12:50:55 +0200 Subject: [PATCH 078/152] Minor code quality improvements --- src/decorator.ts | 2 +- src/hover.ts | 42 +++++++++++++++++++++------------------- src/navigation-data.ts | 4 ++++ src/utilities/hashset.ts | 4 ++-- tsconfig.json | 4 +++- 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/decorator.ts b/src/decorator.ts index 461da4e8..460c3eb1 100644 --- a/src/decorator.ts +++ b/src/decorator.ts @@ -1,5 +1,5 @@ import { ConfigurationTarget, workspace } from "vscode"; -import util = require("util"); +import * as util from "util"; import { IEquatable, ValueEqualsSet } from "./utilities/hashset"; import { LogLevel, logMessage } from "./logger"; diff --git a/src/hover.ts b/src/hover.ts index 46e33b8b..e1937d02 100644 --- a/src/hover.ts +++ b/src/hover.ts @@ -192,30 +192,32 @@ export function getDefinitionFromFile(filename: string, line: number): Navigatio try { const data = fs.readFileSync(filepath, "utf-8"); const lines = data.split("\n"); - if (line <= lines.length) { - let text = lines[line - 1].trim(); - if (text.endsWith(":")) { - text = text.slice(0, -1); - } else if (text.endsWith("(")) { - text = text + ")"; - } else if (text.endsWith("[")) { - text = text + "]"; - } else if (text.endsWith("{")) { - text = text + "}"; - } + if (line >= lines.length) { + return undefined; + } - let docs = ""; - docs = getPyDocsAtLine(lines, line - 1); + let text = lines[line - 1].trim(); + if (text.endsWith(":")) { + text = text.slice(0, -1); + } else if (text.endsWith("(")) { + text = text + ")"; + } else if (text.endsWith("[")) { + text = text + "]"; + } else if (text.endsWith("{")) { + text = text + "}"; + } - let args = ""; - if (text.indexOf("(") > 0) { - args = text.substring(text.indexOf("(")); - args = args.replace("(self, ", "("); - args = args.replace("(self)", "()"); - } + let docs = ""; + docs = getPyDocsAtLine(lines, line - 1); - return new Navigation("workspace", text, filename, line, docs, args, "", 0); + let args = ""; + if (text.indexOf("(") > 0) { + args = text.substring(text.indexOf("(")); + args = args.replace("(self, ", "("); + args = args.replace("(self)", "()"); } + + return new Navigation("workspace", text, filename, line, docs, args, "", 0); } catch (error) { return undefined; } diff --git a/src/navigation-data.ts b/src/navigation-data.ts index d674c13c..87cac7a7 100644 --- a/src/navigation-data.ts +++ b/src/navigation-data.ts @@ -201,6 +201,8 @@ export class NavigationData { if (locations && locations.length > 0) { return locations; } + + return undefined; } static getNavigationDumpEntry(keyword: string): Navigation | undefined { @@ -208,6 +210,7 @@ export class NavigationData { if (data) { return data[0]; } + return undefined; } static getNavigationDumpEntries(keyword: string): Navigation[] | undefined { @@ -416,6 +419,7 @@ export class NavigationData { } } } + return; } static getClassData(location: Navigation): Navigation { diff --git a/src/utilities/hashset.ts b/src/utilities/hashset.ts index 06f03f14..fd583890 100644 --- a/src/utilities/hashset.ts +++ b/src/utilities/hashset.ts @@ -12,7 +12,7 @@ export interface IEquatable { * The current implementation is not very efficient, but it works. */ export class ValueEqualsSet> extends Set { - add(value: T) { + override add(value: T) { if (!this.has(value)) { super.add(value); } @@ -26,7 +26,7 @@ export class ValueEqualsSet> extends Set { return this; } - has(otherValue: T): boolean { + override has(otherValue: T): boolean { for (const value of this.values()) { if (value.equals(otherValue)) { return true; diff --git a/tsconfig.json b/tsconfig.json index 90ace30b..17322fc4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,10 +23,12 @@ /* Additional Checks */ "noUnusedLocals": true, // Report errors on unused locals. // "noUnusedParameters": true, // Report errors on unused parameters. - //"noImplicitReturns": true, // Report error when not all code paths in function return a value. // "noFallthroughCasesInSwitch": true, // Report errors for fallthrough cases in switch statement. // "noUncheckedIndexedAccess": true, // Include 'undefined' in index signature results // "noPropertyAccessFromIndexSignature": true, // Require undeclared properties from index signatures to use element accesses. + "noImplicitReturns": true, // Report error when not all code paths in function return a value. + "noImplicitOverride": true, // Ensure overriding members in derived classes are marked with an 'override' modifier. + "noImplicitThis": true, // Raise error on 'this' expressions with an implied 'any' type. "exactOptionalPropertyTypes": true, // Force exact optional types. (Aka. undefined needs to be added to optionals) /* Module Resolution Options */ From 4528038d961630086423093e1e61dfbcb2e1e045 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 13:07:19 +0200 Subject: [PATCH 079/152] Target ESNext / NodeNext --- tsconfig.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 17322fc4..3a326248 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,9 +2,8 @@ /* Visit https://aka.ms/tsconfig.json to read more about this file */ "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - "module": "commonjs", - "target": "ES2021", - "lib": ["ES2021"], + "target": "ESNext", + "lib": ["ESNext"], "baseUrl": ".", // Base directory to resolve non-absolute module names. "rootDir": "src", "outDir": "out", @@ -32,7 +31,8 @@ "exactOptionalPropertyTypes": true, // Force exact optional types. (Aka. undefined needs to be added to optionals) /* Module Resolution Options */ - "moduleResolution": "node", // Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). + "module": "NodeNext", + "moduleResolution": "nodenext", // Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). "resolveJsonModule": true, // Allows importing modules with a .json extension. "paths": { // A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. From 3c5e4de80aeb6adf3abd7716528fae39f70f4b76 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 13:14:48 +0200 Subject: [PATCH 080/152] Update deps to latest version --- package-lock.json | 1092 ++++++++++++++++++++++++--------------------- package.json | 28 +- 2 files changed, 590 insertions(+), 530 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07d54965..441a3afd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,33 +1,33 @@ { "name": "languague-renpy", - "version": "2.2.0", + "version": "2.3.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.2.0", + "version": "2.3.4", "license": "MIT", "devDependencies": { - "@types/mocha": "^9.1.1", - "@types/node": "^18.13.0", - "@types/vscode": "^1.67.2", - "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.59.8", - "@typescript-eslint/parser": "^5.59.8", + "@types/mocha": "^10.0.1", + "@types/node": "^20.3.1", + "@types/vscode": "^1.79.0", + "@types/webpack": "^5.28.1", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", "@vscode/vsce": "^2.19.0", "copy-webpack-plugin": "^11.0.0", "eslint": "^8.42.0", "eslint-plugin-import": "^2.27.5", - "fork-ts-checker-webpack-plugin": "^7.2.11", - "node-polyfill-webpack-plugin": "^1.1.4", - "prettier": "^2.7.1", - "ts-loader": "^9.3.0", - "ts-node": "^10.8.0", - "typescript": "^4.8.4", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "node-polyfill-webpack-plugin": "^2.0.1", + "prettier": "^2.8.8", + "ts-loader": "^9.4.3", + "ts-node": "^10.9.1", + "typescript": "^5.1.3", "vscode-test": "^1.6.1", - "webpack": "^5.76.0", - "webpack-cli": "^4.9.2" + "webpack": "^5.86.0", + "webpack-cli": "^5.1.4" }, "engines": { "vscode": "^1.67.2" @@ -241,9 +241,9 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -273,9 +273,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -386,9 +386,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/@types/json-schema": { @@ -403,14 +403,15 @@ "license": "MIT" }, "node_modules/@types/mocha": { - "version": "9.1.1", - "dev": true, - "license": "MIT" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true }, "node_modules/@types/node": { - "version": "18.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.1.tgz", - "integrity": "sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==", + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, "node_modules/@types/parse-json": { @@ -426,15 +427,15 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.70.0.tgz", - "integrity": "sha512-3/9Fz0F2eBgwciazc94Ien+9u1elnjFg9YAhvAb3qDy/WeFWD9VrOPU7CIytryOVUdbxus8uzL4VZYONA0gDtA==", + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.0.tgz", + "integrity": "sha512-Tfowu2rSW8hVGbqzQLSPlOEiIOYYryTkgJ+chMecpYiJcnw9n0essvSiclnK+Qh/TcSVJHgaK4EMrQDZjZJ/Sw==", "dev": true }, "node_modules/@types/webpack": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", - "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.1.tgz", + "integrity": "sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==", "dev": true, "dependencies": { "@types/node": "*", @@ -443,15 +444,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -477,14 +478,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" }, "engines": { @@ -504,13 +505,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -521,13 +522,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -548,9 +549,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -561,13 +562,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -588,17 +589,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -614,12 +615,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -752,180 +753,188 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -945,10 +954,22 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -958,9 +979,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -2240,9 +2261,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2333,9 +2354,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -2766,6 +2787,15 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -2926,9 +2956,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -2950,13 +2980,7 @@ }, "peerDependencies": { "typescript": ">3.6.0", - "vue-template-compiler": "*", "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { @@ -3529,12 +3553,12 @@ } }, "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/is-arguments": { @@ -4299,9 +4323,9 @@ "optional": true }, "node_modules/node-polyfill-webpack-plugin": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", - "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", "dev": true, "dependencies": { "assert": "^2.0.0", @@ -4310,7 +4334,7 @@ "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "domain-browser": "^4.22.0", "events": "^3.3.0", "filter-obj": "^2.0.2", "https-browserify": "^1.0.0", @@ -4319,35 +4343,37 @@ "process": "^0.11.10", "punycode": "^2.1.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^4.0.0", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", "url": "^0.11.0", "util": "^0.12.4", "vm-browserify": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">=12" }, "peerDependencies": { "webpack": ">=5" } }, "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", + "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/node-polyfill-webpack-plugin/node_modules/safe-buffer": { @@ -4379,6 +4405,18 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -4789,9 +4827,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -4995,15 +5033,15 @@ } }, "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/regexp.prototype.flags": { @@ -5234,9 +5272,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -5574,13 +5612,13 @@ } }, "node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.0.tgz", + "integrity": "sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -5592,16 +5630,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", - "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -5626,19 +5664,19 @@ } }, "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -5706,9 +5744,9 @@ "license": "MIT/X11" }, "node_modules/ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", + "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -5875,16 +5913,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uc.micro": { @@ -6054,22 +6092,22 @@ } }, "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -6078,9 +6116,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -6101,44 +6139,42 @@ } }, "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/migrate": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -6148,12 +6184,12 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=14" } }, "node_modules/webpack-merge": { @@ -6179,9 +6215,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -6493,9 +6529,9 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", @@ -6516,9 +6552,9 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", @@ -6616,9 +6652,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/json-schema": { @@ -6632,13 +6668,15 @@ "dev": true }, "@types/mocha": { - "version": "9.1.1", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", "dev": true }, "@types/node": { - "version": "18.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.1.tgz", - "integrity": "sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==", + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, "@types/parse-json": { @@ -6654,15 +6692,15 @@ "dev": true }, "@types/vscode": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.70.0.tgz", - "integrity": "sha512-3/9Fz0F2eBgwciazc94Ien+9u1elnjFg9YAhvAb3qDy/WeFWD9VrOPU7CIytryOVUdbxus8uzL4VZYONA0gDtA==", + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.0.tgz", + "integrity": "sha512-Tfowu2rSW8hVGbqzQLSPlOEiIOYYryTkgJ+chMecpYiJcnw9n0essvSiclnK+Qh/TcSVJHgaK4EMrQDZjZJ/Sw==", "dev": true }, "@types/webpack": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", - "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.1.tgz", + "integrity": "sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==", "dev": true, "requires": { "@types/node": "*", @@ -6671,15 +6709,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -6689,53 +6727,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" } }, "@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6744,28 +6782,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" } }, @@ -6867,171 +6905,169 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, "requires": {} }, "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "envinfo": "^7.7.3" - } + "requires": {} }, "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "requires": {} }, @@ -7047,16 +7083,25 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} }, @@ -8014,9 +8059,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -8086,9 +8131,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "es-set-tostringtag": { @@ -8406,6 +8451,12 @@ "version": "2.0.3", "dev": true }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -8537,9 +8588,9 @@ } }, "fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -8943,9 +8994,9 @@ } }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, "is-arguments": { @@ -9506,9 +9557,9 @@ "optional": true }, "node-polyfill-webpack-plugin": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", - "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", "dev": true, "requires": { "assert": "^2.0.0", @@ -9517,7 +9568,7 @@ "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "domain-browser": "^4.22.0", "events": "^3.3.0", "filter-obj": "^2.0.2", "https-browserify": "^1.0.0", @@ -9526,26 +9577,28 @@ "process": "^0.11.10", "punycode": "^2.1.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^4.0.0", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", "url": "^0.11.0", "util": "^0.12.4", "vm-browserify": "^1.1.2" }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", + "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" } }, "safe-buffer": { @@ -9562,6 +9615,12 @@ "requires": { "safe-buffer": "~5.2.0" } + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true } } }, @@ -9869,9 +9928,9 @@ "dev": true }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, "process": { @@ -10023,12 +10082,12 @@ } }, "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" } }, "regexp.prototype.flags": { @@ -10188,9 +10247,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -10435,13 +10494,13 @@ } }, "terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.0.tgz", + "integrity": "sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -10455,32 +10514,32 @@ } }, "terser-webpack-plugin": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", - "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "dependencies": { "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -10526,9 +10585,9 @@ "dev": true }, "ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", + "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -10639,9 +10698,9 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "dev": true }, "uc.micro": { @@ -10781,22 +10840,22 @@ } }, "webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -10805,17 +10864,17 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -10826,29 +10885,30 @@ } }, "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true } } diff --git a/package.json b/package.json index 9d57d08f..b46f56f4 100644 --- a/package.json +++ b/package.json @@ -230,24 +230,24 @@ "format-check": "prettier --check 'src/**/*.ts' '.github/**/*.yml'" }, "devDependencies": { - "@types/mocha": "^9.1.1", - "@types/node": "^18.13.0", - "@types/vscode": "^1.67.2", - "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.59.8", - "@typescript-eslint/parser": "^5.59.8", + "@types/mocha": "^10.0.1", + "@types/node": "^20.3.1", + "@types/vscode": "^1.79.0", + "@types/webpack": "^5.28.1", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", "copy-webpack-plugin": "^11.0.0", "eslint": "^8.42.0", "eslint-plugin-import": "^2.27.5", - "fork-ts-checker-webpack-plugin": "^7.2.11", - "node-polyfill-webpack-plugin": "^1.1.4", - "ts-loader": "^9.3.0", - "ts-node": "^10.8.0", - "typescript": "^4.8.4", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "node-polyfill-webpack-plugin": "^2.0.1", + "ts-loader": "^9.4.3", + "ts-node": "^10.9.1", + "typescript": "^5.1.3", "vscode-test": "^1.6.1", - "webpack": "^5.76.0", - "webpack-cli": "^4.9.2", - "prettier": "^2.7.1", + "webpack": "^5.86.0", + "webpack-cli": "^5.1.4", + "prettier": "^2.8.8", "@vscode/vsce": "^2.19.0" } } From 4647b80dc69fe03a86e9ea45dd22533fc96bc5e8 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 13:19:00 +0200 Subject: [PATCH 081/152] Upgrade vscode engine version to v1.79.0 --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index b46f56f4..3d478759 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "Snippets" ], "engines": { - "vscode": "^1.67.2" + "vscode": "^1.79.0" }, "capabilities": { "untrustedWorkspaces": { @@ -35,7 +35,6 @@ } }, "activationEvents": [ - "onLanguage:renpy", "workspaceContains:**/*.rpy", "workspaceContains:**/_ren.py" ], From 7c8594efd7a139c977b0a0e0e2b0176d76468f90 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 13:22:36 +0200 Subject: [PATCH 082/152] Bump version to 2.3.5 --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 441a3afd..eb28910d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "languague-renpy", - "version": "2.3.4", + "version": "2.3.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "languague-renpy", - "version": "2.3.4", + "version": "2.3.5", "license": "MIT", "devDependencies": { "@types/mocha": "^10.0.1", @@ -30,7 +30,7 @@ "webpack-cli": "^5.1.4" }, "engines": { - "vscode": "^1.67.2" + "vscode": "^1.79.0" } }, "node_modules/@babel/code-frame": { diff --git a/package.json b/package.json index 3d478759..d9787210 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "languague-renpy", "displayName": "Ren'Py Language", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.3.4", + "version": "2.3.5", "publisher": "LuqueDaniel", "license": "MIT", "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", From 1c67127d7ac37f1f182ec4c6bcacfd63f12ef8b6 Mon Sep 17 00:00:00 2001 From: duckdoom4 <60387522+duckdoom4@users.noreply.github.com> Date: Wed, 14 Jun 2023 13:39:19 +0200 Subject: [PATCH 083/152] Update documentation Thanks to @rdurfee --- src/renpy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renpy.json b/src/renpy.json index b7ea4496..6aa2e014 100644 --- a/src/renpy.json +++ b/src/renpy.json @@ -1 +1 @@ -{"renpy": {"renpy.count_seen_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks the user has seen in any play-through of the current game."], "renpy.timeout": ["internal", "function", "(seconds)", "", "", "Causes an event to be generated before `seconds` seconds have elapsed. This ensures that the event method of a user-defined displayable will be called."], "renpy.context": ["internal", "function", "()", "", "", "Returns an object that is unique to the current context. The object is copied when entering a new context, but changes to the copy do not change the original.\n\nThe object is saved and participates in rollback."], "renpy.sound.get_pos": ["internal", "function", "(channel=\"sound\")", "", "", "Returns the current position of the audio or video file on `channel`, in seconds. Returns None if no audio is playing on `channel`.\n\nAs this may return None before a channel starts playing, or if the audio channel involved has been muted, callers of this function should always handle a None value."], "renpy.clear_keymap_cache": ["internal", "function", "()", "", "", "Clears the keymap cache. This allows changes to :var:`config.keymap` to take effect without restarting Ren'Py."], "renpy.error": ["internal", "function", "(msg)", "", "", "Reports `msg`, a string, as as error for the user. This is logged as a parse or lint error when approprate, and otherwise it is raised as an exception."], "renpy.fnmatch": ["internal", "function", "()", "", "", "Filename matching with shell patterns.\n\nfnmatch(FILENAME, PATTERN) matches according to the local convention. fnmatchcase(FILENAME, PATTERN) always takes case in account.\n\nThe functions operate by translating the pattern into a regular expression. They cache the compiled regular expressions for speed.\n\nThe function translate(PATTERN) returns a regular expression corresponding to PATTERN. (It does not compile it.)"], "renpy.get_physical_size": ["internal", "function", "()", "", "", "Returns the size of the physical window."], "renpy.ios": ["other", "renpy.ios", "", "", "var", "Has a true value when running on iOS."], "renpy.language_tailor": ["other", "renpy.language_tailor", "(chars, cls)", "", "function", "This can be used to override the line breaking class of a character. For example, the linebreaking class of a character can be set to ID to treat it as an ideograph, which allows breaks before and after that character.\n\n`chars` A string containing each of the characters to tailor.\n\n`cls` A string giving a character class. This should be one of the classes defined in Table 1 of `UAX #14: Unicode Line Breaking Algorithm `_."], "renpy.music.queue": ["internal", "function", "(filenames, channel=\"music\", loop=None, clear_queue=True, fadein=0, tight=None, relative_volume=1.0)", "", "", "This queues the given filenames on the specified channel.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`clear_queue` If True, then the queue is cleared, making these files the files that are played when the currently playing file finishes. If it is False, then these files are placed at the back of the queue. In either case, if no music is playing these files begin playing immediately.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.shown_window": ["internal", "function", "()", "", "", "Call this to indicate that the window has been shown. This interacts with the \\window show\\ statement, which shows an empty window whenever this functions has not been called during an interaction."], "renpy.with_statement": ["internal", "function", "(trans, always=False)", "", "", "Causes a transition to occur. This is the Python equivalent of the with statement.\n\n`trans` The transition.\n\n`always` If True, the transition will always occur, even if the user has disabled transitions.\n\nThis function returns true if the user chose to interrupt the transition, and false otherwise."], "renpy.get_placement": ["internal", "function", "(d)", "", "", "This gets the placement of displayable d. There's very little warranty on this information, as it might change when the displayable is rendered, and might not exist until the displayable is first rendered.\n\nThis returns an object with the following fields, each corresponding to a style property:\n\n* pos * xpos * ypos * anchor * xanchor * yanchor * offset * xoffset * yoffset * subpixel"], "renpy.try_compile": ["internal", "function", "(where, expr, additional=None)", "", "", "Tries to compile an expression, and writes an error to lint.txt if it fails.\n\n`where` A string giving the location the expression is found. Used to generate an error message of the form \\Could not evaluate `expr` in `where`.\\\n\n`expr` The expression to try compiling.\n\n`additional` If given, an additional line of information that is addded to the error message."], "renpy.Render.add_uniform": ["cdd", "add_uniform", "(name, value)", "renpy.Render", "method", "Causes the uniform `name` to have `value` when this Render or its children are drawn."], "renpy.show_screen": ["internal", "function", "(_screen_name, *_args, **kwargs)", "", "", "The programmatic equivalent of the show screen statement.\n\nShows the named screen. This takes the following keyword arguments:\n\n`_screen_name` The name of the screen to show. `_layer` The layer to show the screen on. `_zorder` The zorder to show the screen on. If not specified, defaults to the zorder associated with the screen. It that's not specified, it is 0 by default. `_tag` The tag to show the screen with. If not specified, defaults to the tag associated with the screen. It that's not specified, defaults to the name of the screen. `_widget_properties` A map from the id of a widget to a property name -> property value map. When a widget with that id is shown by the screen, the specified properties are added to it. `_transient` If true, the screen will be automatically hidden at the end of the current interaction.\n\nNon-keyword arguments, and keyword arguments that do not begin with an underscore, are passed to the screen."], "renpy.threading": ["internal", "function", "()", "", "", "Thread module emulating a subset of Java's threading model."], "renpy.get_autoreload": ["internal", "function", "()", "", "", "Gets the autoreload flag."], "renpy.movie_cutscene": ["internal", "function", "(filename, delay=None, loops=0, stop_music=True)", "", "", "This displays a movie cutscene for the specified number of seconds. The user can click to interrupt the cutscene. Overlays and Underlays are disabled for the duration of the cutscene.\n\n`filename` The name of a file containing any movie playable by Ren'Py.\n\n`delay` The number of seconds to wait before ending the cutscene. Normally the length of the movie, in seconds. If None, then the delay is computed from the number of loops (that is, loops + 1) * the length of the movie. If -1, we wait until the user clicks.\n\n`loops` The number of extra loops to show, -1 to loop forever.\n\nReturns True if the movie was terminated by the user, or False if the given delay elapsed uninterrupted."], "renpy.force_autosave": ["internal", "function", "(take_screenshot=False, block=False)", "", "", "Forces a background autosave to occur.\n\n`take_screenshot` If True, a new screenshot will be taken. If False, the existing screenshot will be used.\n\n`block` If True, blocks until the autosave completes."], "renpy.register_statement": ["internal", "function", "(name, parse=None, lint=None, execute=None, predict=None, next=None, scry=None, block=False, init=False, translatable=False, execute_init=None, init_priority=0, label=None, warp=None, translation_strings=None, force_begin_rollback=False, post_execute=None, post_label=None, predict_all=True, predict_next=None)", "", "", "This registers a user-defined statement.\n\n`name` This is either a space-separated list of names that begin the statement, or the empty string to define a new default statement (the default statement will replace the say statement).\n\n`block` When this is False, the statement does not expect a block. When True, it expects a block, but leaves it up to the lexer to parse that block. If the string \\script\\, the block is interpreted as containing one or more Ren'Py script language statements. If the string \\possible\\, the block expect condition is determined by the parse function.\n\n`parse` This is a function that takes a Lexer object. This function should parse the statement, and return an object. This object is passed as an argument to all the other functions.\n\n`lint` This is called to check the statement. It is passed a single argument, the object returned from parse. It should call renpy.error to report errors.\n\n`execute` This is a function that is called when the statement executes. It is passed a single argument, the object returned from parse.\n\n`execute_init` This is a function that is called at init time, at priority 0.\n\n`predict` This is a function that is called to predict the images used by the statement. It is passed a single argument, the object returned from parse. It should return a list of displayables used by the statement.\n\n`next` This is a function that is called to determine the next statement.\n\nIf `block` is not \\script\\, this is passed a single argument, the object returned from the parse function. If `block` is \\script\\, an additional argument is passed, an object that names the first statement in the block.\n\nThe function should return either a string giving a label to jump to, the second argument to transfer control into the block, or None to continue to the statement after this one.\n\n`label` This is a function that is called to determine the label of this statement. If it returns a string, that string is used as the statement label, which can be called and jumped to like any other label.\n\n`warp` This is a function that is called to determine if this statement should execute during warping. If the function exists and returns true, it's run during warp, otherwise the statement is not run during warp.\n\n`scry` Used internally by Ren'Py.\n\n`init` True if this statement should be run at init-time. (If the statement is not already inside an init block, it's automatically placed inside an init block.) This calls the execute function, in addition to the execute_init function.\n\n`init_priority` An integer that determines the priority of initialization of the init block.\n\n`translation_strings` A function that is called with the parsed block. It's expected to return a list of strings, which are then reported as being available to be translated.\n\n`force_begin_rollback` This should be set to true on statements that are likely to cause the end of a fast skip, similar to ``menu`` or ``call screen``.\n\n`post_execute` A function that is executed as part the next statement after this one. (Adding a post_execute function changes the contents of the RPYC file, meaning a Force Compile is necessary.)\n\n`post_label` This is a function that is called to determine the label of this the post execute statement. If it returns a string, that string is used as the statement label, which can be called and jumped to like any other label. This can be used to create a unique return point.\n\n`predict_all` If True, then this predicts all sub-parses of this statement and the statement after this statement.\n\n`predict_next` This is called with a single argument, the label of the statement that would run after this statement.\n\nThis should be called to predict the statements that can run after this one. It's expected to return a list of of labels or SubParse objects. This is not called if `predict_all` is true."], "renpy.sound.register_channel": ["audio", "renpy.music.register_channel", "(name, mixer=None, loop=None, stop_on_mute=True, tight=False, file_prefix=\"\", file_suffix=\"\", buffer_queue=True, movie=False, framedrop=True)", "", "", "This registers a new audio channel named `name`. Audio can then be played on the channel by supplying the channel name to the play or queue statements.\n\n`mixer` The name of the mixer the channel uses. By default, Ren'Py knows about the \\music\\, \\sfx\\, and \\voice\\ mixers. Using other names is possible, but may require changing the preferences screens.\n\n`loop` If true, sounds on this channel loop by default.\n\n`stop_on_mute` If true, music on the channel is stopped when the channel is muted.\n\n`tight` If true, sounds will loop even when fadeout is occurring. This should be set to True for a sound effects or seamless music channel, and False if the music fades out on its own.\n\n`file_prefix` A prefix that is prepended to the filenames of the sound files being played on this channel.\n\n`file_suffix` A suffix that is appended to the filenames of the sound files being played on this channel.\n\n`buffer_queue` Should we buffer the first second or so of a queued file? This should be True for audio, and False for movie playback.\n\n`movie` If true, this channel will be set up to play back videos.\n\n`framedrop` This controls what a video does when lagging. If true, frames will be dropped to keep up with realtime and the soundtrack. If false, Ren'Py will display frames late rather than dropping them."], "renpy.save_persistent": ["internal", "function", "()", "", "", "Saves the persistent data to disk."], "renpy.list_saved_games": ["internal", "function", "(regexp=r'.', fast=False)", "", "", "Lists the save games. For each save game, returns a tuple containing:\n\n* The filename of the save. * The extra_info that was passed in. * A displayable that, when displayed, shows the screenshot that was used when saving the game. * The time the game was stayed at, in seconds since the UNIX epoch.\n\n`regexp` A regular expression that is matched against the start of the filename to filter the list.\n\n`fast` If fast is true, the filename is returned instead of the tuple."], "renpy.mark_label_unseen": ["internal", "function", "(label)", "", "", "Marks the named label as if it has not been executed on the current user's system yet."], "renpy.transition": ["internal", "function", "(trans, layer=None, always=False)", "", "", "Sets the transition that will be used during the next interaction.\n\n`layer` The layer the transition applies to. If None, the transition applies to the entire scene.\n\n`always` If false, this respects the transition preference. If true, the transition is always run."], "renpy.context_dynamic": ["internal", "function", "(*vars)", "", "", "This can be given one or more variable names as arguments. This makes the variables dynamically scoped to the current context. The variables will be reset to their original value when the call returns.\n\nAn example call is\n```\n$ renpy.context_dynamic(\\x\\, \\y\\, \\z\\)\n```"], "renpy.reset_physical_size": ["internal", "function", "()", "", "", "Attempts to set the size of the physical window to the specified values in renpy.config. (That is, screen_width and screen_height.) This has the side effect of taking the screen out of fullscreen mode."], "renpy.can_show": ["internal", "function", "(name, layer=None, tag=None)", "", "", "Determines if `name` can be used to show an image. This interprets `name` as a tag and attributes. This is combined with the attributes of the currently-showing image with `tag` on `layer` to try to determine a unique image to show. If a unique image can be show, returns the name of that image as a tuple. Otherwise, returns None.\n\n`tag` The image tag to get attributes from. If not given, defaults to the first component of `name`.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.has_image": ["internal", "function", "(name, exact=False)", "", "", "Return true if an image with `name` exists, and false if no such image exists.\n\n`name` Either a string giving an image name, or a tuple of strings giving the name components.\n\n`exact` Returns true if and only if an image with the exact name exists - parameterized matches are not included."], "renpy.get_mode": ["internal", "function", "()", "", "", "Returns the current mode, or None if it is not defined."], "renpy.image_size": ["internal", "function", "(im)", "", "", "Given an image manipulator, loads it and returns a (``width``, ``height``) tuple giving its size.\n\nThis reads the image in from disk and decompresses it, without using the image cache. This can be slow."], "renpy.sound.get_duration": ["internal", "function", "(channel=\"sound\")", "", "", "Returns the duration of the audio or video file on `channel`. Returns 0.0 if no file is playing on `channel`."], "renpy.force_full_redraw": ["internal", "function", "()", "", "", "Forces the screen to be redrawn in full. Call this after using pygame to redraw the screen directly."], "renpy.try_eval": ["internal", "function", "(where, expr, additional=None)", "", "", "Tries to evaluate an expression, and writes an error to lint.txt if it fails.\n\n`where` A string giving the location the expression is found. Used to generate an error message of the form \\Could not evaluate `expr` in `where`.\\\n\n`expr` The expression to try evaluating.\n\n`additional` If given, an additional line of information that is addded to the error message."], "renpy.sound.set_volume": ["internal", "function", "(volume, delay=0, channel=\"sound\")", "", "", "Sets the volume of this channel, as a fraction of the volume of the mixer controlling the channel.\n\n`volume` This is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for the channel.\n\n`delay` It takes delay seconds to change/fade the volume from the old to the new value. This value is persisted into saves, and participates in rollback.\n\n`channel` The channel to be set"], "renpy.version_string": ["other", "renpy.version_string", "", "", "var", "The version number of Ren'Py, as a string of the form \\Ren'Py 1.2.3.456\\."], "renpy.music.set_pan": ["internal", "function", "(pan, delay, channel=\"music\")", "", "", "Sets the pan of this channel.\n\n`pan` A number between -1 and 1 that control the placement of the audio. If this is -1, then all audio is sent to the left channel. If it's 0, then the two channels are equally balanced. If it's 1, then all audio is sent to the right ear.\n\n`delay` The amount of time it takes for the panning to occur.\n\n`channel` The channel the panning takes place on. This can be a sound or a music channel. Often, this is channel 7, the default music channel."], "renpy.load": ["internal", "function", "(filename)", "", "", "Loads the list of shaders from the file, and compiles all shaders for which the parts exist, and for which compilation can succeed."], "renpy.predict_show_display_say": ["internal", "function", "(who, what, who_args, what_args, window_args, image=False, two_window=False, side_image=None, screen=None, properties=None, **kwargs)", "", "", "This is the default function used by Character to predict images that will be used by show_display_say. It's called with more-or-less the same parameters as show_display_say, and it's expected to return a list of images used by show_display_say."], "renpy.MenuEntry": ["internal", "class", "()", "", "", "The object passed into the choice screen."], "renpy.get_skipping": ["internal", "function", "()", "", "", "Returns \\slow\\ if the Ren'Py is skipping, \\fast\\ if Ren'Py is fast skipping, and None if it is not skipping."], "renpy.seen_audio": ["internal", "function", "(filename)", "", "", "Returns True if the given filename has been played at least once on the current user's system."], "renpy.focus_coordinates": ["internal", "function", "()", "", "", "This attempts to find the coordinates of the currently-focused displayable. If it can, it will return them as a (x, y, w, h) tuple. If not, it will return a (None, None, None, None) tuple."], "renpy.list_images": ["internal", "function", "()", "", "", "Returns a list of images that have been added to Ren'Py, as a list of strings with spaces between the name components."], "renpy.Render.canvas": ["cdd", "canvas", "()", "renpy.Render", "method", "Returns a canvas object. A canvas object has methods corresponding to the `pygame.draw `_ functions, with the first parameter (the surface) omitted.\n\nCanvas objects also have a get_surface() method that returns the pygame Surface underlying the canvas."], "renpy.rename_save": ["internal", "function", "(old, new)", "", "", "Renames a save from `old` to `new`. (Does nothing if `old` does not exist.)"], "renpy.get_side_image": ["internal", "function", "(prefix_tag, image_tag=None, not_showing=None, layer=None)", "", "", "This attempts to find an image to show as the side image.\n\nIt begins by determining a set of image attributes. If `image_tag` is given, it gets the image attributes from the tag. Otherwise, it gets them from the currently showing character.\n\nIt then looks up an image with the tag `prefix_tag` and those attributes, and returns it if it exists.\n\nIf not_showing is True, this only returns a side image if the image the attributes are taken from is not on the screen. If Nome, the value is taken from :var:`config.side_image_only_not_showing`.\n\nIf `layer` is None, uses the default layer for the currently showing tag."], "renpy.predicting": ["internal", "function", "()", "", "", "Returns true if Ren'Py is currently predicting the screen."], "renpy.call": ["internal", "function", "(label, *args, **kwargs)", "", "", "Causes the current Ren'Py statement to terminate, and a jump to a `label` to occur. When the jump returns, control will be passed to the statement following the current statement.\n\n`from_current` If true, control will return to the current statement, rather than the statement following the current statement. (This will lead to the current statement being run twice. This must be passed as a keyword argument.)"], "renpy.get_registered_image": ["internal", "function", "(name)", "", "", "If an image with the same name has been registered with renpy.register_image, returns it. Otherwise, returns None."], "renpy.in_rollback": ["internal", "function", "()", "", "", "Returns true if the game has been rolled back."], "renpy.get_identifier_checkpoints": ["internal", "function", "(identifier)", "", "", "Given a rollback_identifier from a HistoryEntry object, returns the number of checkpoints that need to be passed to :func:`renpy.rollback` to reach that identifier. Returns None of the identifier is not in the rollback history."], "renpy.mark_image_unseen": ["internal", "function", "(name)", "", "", "Marks the named image as if it has not been displayed on the current user's system yet."], "renpy.has_label": ["internal", "function", "(name)", "", "", "Returns true if `name` is a valid label the program, or false otherwise.\n\n`name` Should be a string to check for the existence of a label. It can also be an opaque tuple giving the name of a non-label statement."], "renpy.slot_screenshot": ["internal", "function", "(slotname)", "", "", "Returns a display that can be used as the screenshot for `slotname`, or None if the slot is empty."], "renpy.get_filename_line": ["internal", "function", "()", "", "", "Returns a pair giving the filename and line number of the current statement."], "renpy.get_attributes": ["internal", "function", "(layer, tag, default=())", "", "", "Return a tuple giving the image attributes for the image `tag`. If the image tag has not had any attributes associated since the last time it was hidden, returns `if_hidden`.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.get_mouse_name": ["internal", "function", "(interaction=False)", "", "", "Returns the name of the mouse that should be shown.\n\n `interaction` If true, get a mouse name that is based on the type of interaction occuring. (This is rarely useful.)"], "renpy.mark_audio_seen": ["internal", "function", "(filename)", "", "", "Marks the given filename as if it has been already played on the current user's system."], "renpy.license": ["other", "renpy.license", "", "", "var", "A string giving license text that should be included in a game's about screen."], "renpy.is_selected": ["internal", "function", "(action)", "", "", "Returns true if `action` indicates it is selected, or false otherwise."], "renpy.list_slots": ["internal", "function", "(regexp=None)", "", "", "Returns a list of non-empty save slots. If `regexp` exists, only slots that begin with `regexp` are returned. The slots are sorted in string-order."], "renpy.maximum_framerate": ["internal", "function", "(t)", "", "", "Forces Ren'Py to draw the screen at the maximum framerate for `t` seconds. If `t` is None, cancels the maximum framerate request."], "renpy.render": ["udd_utility", "renpy.render", "(d, width, height, st, at)", "", "function", "Causes a displayable to be rendered, and a renpy.Render object to be returned.\n\n`d` The displayable to render.\n\n`width`, `height` The width and height available for the displayable to render into.\n\n`st`, `at` The shown and animation timebases.\n\nRenders returned by this object may be cached, and should not be modified once they have been retrieved."], "renpy.map_event": ["internal", "function", "(ev, keysym)", "", "", "Returns true if the pygame event `ev` matches `keysym`\n\n`keysym` One of:\n\n* The name of a keybinding in :var:`config.keymap`. * A keysym, as documented in the :ref:`keymap` section. * A list containing one or more keysyms."], "renpy.start_predict_screen": ["internal", "function", "(_screen_name, *args, **kwargs)", "", "", "Causes Ren'Py to start predicting the screen named `_screen_name` with the given arguments. This replaces any previous prediction of `_screen_name`. To stop predicting a screen, call :func:`renpy.stop_predict_screen`."], "renpy.call_screen": ["internal", "function", "(_screen_name, *args, **kwargs)", "", "", "The programmatic equivalent of the call screen statement.\n\nThis shows `_screen_name` as a screen, then causes an interaction to occur. The screen is hidden at the end of the interaction, and the result of the interaction is returned.\n\nPositional arguments, and keyword arguments that do not begin with _ are passed to the screen.\n\nIf the keyword argument `_with_none` is false, \\with None\\ is not run at the end of end of the interaction.\n\nIf the keyword argument `_mode` in kwargs, it will be mode of this interaction, otherwise it will be \\screen\\ mode."], "renpy.has_screen": ["internal", "function", "(name)", "", "", "Returns true if a screen with the given name exists."], "renpy.Render.add_property": ["cdd", "add_property", "(name, value)", "renpy.Render", "method", "Causes the GL property `name` to have `value` when this Render or one of its children are drawn."], "renpy.eval_who": ["internal", "function", "(who, fast=None)", "", "", "Evaluates the `who` parameter to a say statement."], "renpy.set_tag_attributes": ["internal", "function", "(name, layer=None)", "", "", "This sets the attributes associated with an image tag when that image tag is not showing. The main use of this would be to directly set the attributes used by a side image.\n\nFor example::\n\n$ renpy.set_tag_attributes(\\lucy mad\\) $ renpy.say(l, \\I'm rather cross.\\)\n\nand::\n\nl mad \\I'm rather cross.\\\n\nare equivalent."], "renpy.mobile": ["other", "renpy.mobile", "", "", "var", "Has a true value when running on Android or iOS or in the browser."], "renpy.get_refresh_rate": ["internal", "function", "(precision=5)", "", "", "Returns the refresh rate of the current screen, as a floating-point number of frames per second.\n\n`precision` The raw data Ren'Py gets is number of frames per second, rounded down. This means that a monitor that runs at 59.95 frames per second will be reported at 59 fps. The precision argument reduces the precision of this reading, such that the only valid readings are multiples of the precision.\n\nSince all monitor framerates tend to be multiples of 5 (25, 30, 60, 75, and 120), this likely will improve accuracy. Setting precision to 1 disables this."], "renpy.flush_cache_file": ["internal", "function", "(fn)", "", "", "This flushes all image cache entries that refer to the file `fn`. This may be called when an image file changes on disk to force Ren'Py to use the new version."], "renpy.scry": ["internal", "function", "(self)", "", "", "Returns the scry object for the current statement.\n\nThe scry object tells Ren'Py about things that must be true in the future of the current statement. Right now, the scry object has one field:\n\n``nvl_clear`` Is true if an ``nvl clear`` statement will execute before the next interaction."], "renpy.Render.get_size": ["cdd", "get_size", "()", "renpy.Render", "method", "Returns a (width, height) tuple giving the size of this render."], "renpy.stop_predict": ["internal", "function", "(*args)", "", "", "This function takes one or more displayables as arguments. It causes Ren'Py to stop predicting those displayables during every interaction.\n\nWildcard patterns can be used as described in :func:`renpy.start_predict`."], "renpy.free_memory": ["internal", "function", "()", "", "", "Attempts to free some memory. Useful before running a renpygame-based minigame."], "renpy.restart_interaction": ["internal", "function", "()", "", "", "Restarts the current interaction. Among other things, this displays images added to the scene, re-evaluates screens, and starts any queued transitions.\n\nThis only does anything when called from within an interaction (for example, from an action). Outside an interaction, this function has no effect."], "renpy.log": ["internal", "function", "(msg)", "", "", "If :var:`config.log` is not set, this does nothing. Otherwise, it opens the logfile (if not already open), formats the message to :var:`config.log_width` columns, and prints it to the logfile."], "renpy.music.is_playing": ["internal", "function", "(channel=\"music\")", "", "", "Returns True if the channel is currently playing a sound, False if it is not, or if the sound system isn't working."], "renpy.get_return_stack": ["internal", "function", "()", "", "", "Returns a list giving the current return stack. The return stack is a list of statement names.\n\nThe statement names will be strings (for labels), or opaque tuples (for non-label statements)."], "renpy.set_autoreload": ["internal", "function", "(autoreload)", "", "", "Sets the autoreload flag, which determines if the game will be automatically reloaded after file changes. Autoreload will not be fully enabled until the game is reloaded with :func:`renpy.utter_restart`."], "renpy.context_nesting_level": ["internal", "function", "()", "", "", "Returns the nesting level of the current context. This is 0 for the outermost context (the context that is saved, loaded, and rolled-back), and is non-zero in other contexts, such as menu and replay contexts."], "renpy.quit": ["internal", "function", "(relaunch=False, status=0, save=False)", "", "", "This causes Ren'Py to exit entirely.\n\n`relaunch` If true, Ren'Py will run a second copy of itself before quitting.\n\n`status` The status code Ren'Py will return to the operating system. Generally, 0 is success, and positive integers are failure.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py terminates."], "renpy.register_style_preference": ["internal", "function", "(preference, alternative, style, property, value)", "", "", "Registers information about an alternative for a style preference.\n\n`preference` A string, the name of the style preference.\n\n`alternative` A string, the name of the alternative.\n\n`style` The style that will be updated. This may be a style object or a string giving the style name.\n\n`property` A string giving the name of the style property that will be update.\n\n`value` The value that will be assigned to the style property."], "renpy.unlink_save": ["internal", "function", "(filename)", "", "", "Deletes the save slot with the given name."], "renpy.movie_stop": ["internal", "function", "(clear=True, only_fullscreen=False)", "", "", "Stops the currently playing movie."], "renpy.set_mouse_pos": ["internal", "function", "(x, y, duration=0)", "", "", "Jump the mouse pointer to the location given by arguments x and y. If the device does not have a mouse pointer, this does nothing.\n\n`duration` The time it will take to perform the move, in seconds. During this time, the mouse may be unresponsive."], "renpy.image_exists": ["internal", "function", "(name, expression, tag, precise=True)", "", "", "Checks a scene or show statement for image existence."], "renpy.loadable": ["internal", "function", "(filename)", "", "", "Returns True if the given filename is loadable, meaning that it can be loaded from the disk or from inside an archive. Returns False if this is not the case."], "renpy.block_rollback": ["internal", "function", "()", "", "", "Prevents the game from rolling back to before the current statement."], "renpy.version_tuple": ["other", "renpy.version_tuple", "", "", "var", "The version number of Ren'Py, as a tuple of the form (1, 2, 3, 456)."], "renpy.scene": ["internal", "function", "(layer='master')", "", "", "Removes all displayables from `layer`. This is equivalent to the scene statement, when the scene statement is not given an image to show.\n\nA full scene statement is equivalent to a call to renpy.scene followed by a call to :func:`renpy.show`. For example::\n\nscene bg beach\n\nis equivalent to::\n\n$ renpy.scene() $ renpy.show(\\bg beach\\)"], "renpy.Displayable.visit": ["cdd", "visit", "(self)", "renpy.Displayable", "method", "If the displayable has child displayables, this method should be overridden to return a list of those displayables. This ensures that the per_interact methods of those displayables are called, and also allows images used by those displayables to be predicted."], "renpy.sound.play": ["internal", "function", "(filenames, channel=\"sound\", loop=None, fadeout=None, synchro_start=False, fadein=0, tight=None, if_changed=False, relative_volume=1.0)", "", "", "This stops the music currently playing on the numbered channel, dequeues any queued music, and begins playing the specified file or files.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music.\n\n`synchro_start` Ren'Py will ensure that all channels of with synchro_start set to true will start playing at exactly the same time. Synchro_start should be true when playing two audio files that are meant to be synchronized with each other.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`if_changed` If this is True, and the music file is currently playing, then it will not be stopped/faded out and faded back in again, but instead will be kept playing. (This will always queue up an additional loop of the music.)\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.get_available_image_tags": ["internal", "function", "()", "", "", "Returns a list of image tags that have been defined."], "renpy.get_displayable_properties": ["internal", "function", "(id, screen=None, layer=None)", "", "", "Returns the properties for the displayable with `id` in the `screen` on `layer`. If `screen` is None, returns the properties for the current screen. This can be used from Python or property code inside a screen.\n\nNote that this returns a dictionary containing the widget properties, and so to get an individual property, the dictionary must be accessed."], "renpy.request_permission": ["internal", "function", "(permission)", "", "", "Asks Android to grant a permission to this application. The user may be prompted to grant the permission.\n\n`permission` A string giving the name of the permission, for example, \\android.permission.WRITE_EXTERNAL_STORAGE\\.\n\nReturns true if the permission has been granted, false if not or if called on a non-Android platform."], "renpy.fsencode": ["internal", "function", "(s)", "", "", "Converts s from unicode to the filesystem encoding."], "renpy.music.get_pos": ["internal", "function", "(channel=\"music\")", "", "", "Returns the current position of the audio or video file on `channel`, in seconds. Returns None if no audio is playing on `channel`.\n\nAs this may return None before a channel starts playing, or if the audio channel involved has been muted, callers of this function should always handle a None value."], "renpy.mark_image_seen": ["internal", "function", "(name)", "", "", "Marks the named image as if it has been already displayed on the current user's system."], "renpy.return_statement": ["internal", "function", "(value=None)", "", "", "Causes Ren'Py to return from the current Ren'Py-level call."], "renpy.android": ["other", "renpy.android", "", "", "var", "Has a true value when running on Android."], "renpy.call_stack_depth": ["internal", "function", "()", "", "", "Returns the depth of the call stack of the current context - the number of calls that have run without being returned from or popped from the call stack."], "renpy.rollback": ["internal", "function", "(force=False, checkpoints=1, defer=False, greedy=True, label=None, abnormal=True)", "", "", "Rolls the state of the game back to the last checkpoint.\n\n`force` If true, the rollback will occur in all circumstances. Otherwise, the rollback will only occur if rollback is enabled in the store, context, and config.\n\n`checkpoints` Ren'Py will roll back through this many calls to renpy.checkpoint. It will roll back as far as it can, subject to this condition.\n\n`defer` If true, the call will be deferred until control returns to the main context.\n\n`greedy` If true, rollback will finish just after the previous checkpoint. If false, rollback finish just before the current checkpoint.\n\n`label` If not None, a label that is called when rollback completes.\n\n`abnormal` If true, the default, script executed after the transition is run in an abnormal mode that skips transitions that would have otherwise occured. Abnormal mode ends when an interaction begins."], "renpy.version_only": ["other", "renpy.version_only", "", "", "var", "The version number of Ren'Py, without the Ren'Py prefix. A string of the form \\1.2.3.456\\."], "renpy.get_image_bounds": ["internal", "function", "(tag, width=None, height=None, layer=None)", "", "", "If an image with `tag` exists on `layer`, returns the bounding box of that image. Returns None if the image is not found.\n\nThe bounding box is an (x, y, width, height) tuple. The components of the tuples are expressed in pixels, and may be floating point numbers.\n\n`width`, `height` The width and height of the area that contains the image. If None, defaults the width and height of the screen, respectively.\n\n`layer` If None, uses the default layer for `tag`."], "renpy.sound": ["basefile", "", "", "", "", "Most renpy.sound functions have aliases in renpy.music. These functions are similar, except they default to the music channel rather than the sound channel, and default to looping."], "renpy.quit_event": ["internal", "function", "()", "", "", "Triggers a quit event, as if the player clicked the quit button in the window chrome."], "renpy.screenshot_to_bytes": ["internal", "function", "(size)", "", "", "Returns a screenshot as a bytes object, that can be passed to im.Data(). The bytes will be a png-format image, such that\n```\n$ data = renpy.screenshot_to_bytes((640, 360))\nshow expression im.Data(data, \\screenshot.png\\):\nalign (0, 0)\n\nWill show the image. The bytes objects returned can be stored in save\nfiles and persistent data. However, these may be large, and care should\nbe taken to not include too many.\n\n`size`\nThe size the screenshot will be resized to. If None, the screenshot\nwill be resized, and hence will be the size of the player's window,\nwithout any letterbars.\n\nThis function may be slow, and so it's intended for save-like screenshots,\nand not realtime effects.\n```"], "renpy.check_permission": ["internal", "function", "(permission)", "", "", "Checks to see if an Android permission has been granted to this application.\n\n`permission` A string giving the name of the permission, for example, \\android.permission.WRITE_EXTERNAL_STORAGE\\.\n\nReturns true if the permission has been granted, false if it has not or if called on a non-Android platform."], "renpy.showing": ["internal", "function", "(layer, name, exact=False)", "", "", "Returns true if an image with the same tag as `name` is showing on `layer`.\n\n`image` May be a string giving the image name or a tuple giving each component of the image name. It may also be a string giving only the image tag.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.sound.set_pause": ["internal", "function", "(value, channel=\"sound\")", "", "", "Sets the pause flag for `channel` to `value`. If True, the channel will pause, otherwise it will play normally."], "renpy.macintosh": ["other", "renpy.macintosh", "", "", "var", "Has a true value when running on macOS."], "renpy.show_layer_at": ["internal", "function", "(at_list, layer='master', reset=True, camera=False)", "", "", "The Python equivalent of the ``show layer`` `layer` ``at`` `at_list` statement. If `camera` is True, the equivalent of the ``camera`` statement.\n\n`reset` If true, the transform state is reset to the start when it is shown. If false, the transform state is persisted, allowing the new transform to update that state."], "renpy.copy_images": ["internal", "function", "(old, new)", "", "", "Copies images beginning with one prefix to images beginning with another. For example\n```\nrenpy.copy_images(\\eileen\\, \\eileen2\\)\n\nwill create an image beginning with \\eileen2\\ for every image beginning\nwith \\eileen\\. If \\eileen happy\\ exists, \\eileen2 happy\\ will be\ncreated.\n\n`old`\nA space-separated string giving the components of the old image\nname.\n\n`new`\nA space-separated string giving the components of the new image\nname.\n\n```"], "renpy.dynamic": ["internal", "function", "(*vars, **kwargs)", "", "", "This can be given one or more variable names as arguments. This makes the variables dynamically scoped to the current call. The variables will be reset to their original value when the call returns.\n\nIf the variables are given as keyword arguments, the value of the argument is assigned to the variable name.\n\nExample calls are\n```\n$ renpy.dynamic(\\x\\, \\y\\, \\z\\)\n$ renpy.dynamic(players=2, score=0)\n```"], "renpy.get_adjustment": ["internal", "function", "(bar_value)", "", "", "Given `bar_value`, a :class:`BarValue`, returns the :func:`ui.adjustment` if uses. The adjustment has the following to attributes defined:\n\n.. attribute:: value\n\nThe current value of the bar.\n\n.. attribute:: range\n\nThe current range of the bar."], "renpy.set_return_stack": ["internal", "function", "(stack)", "", "", "Sets the current return stack. The return stack is a list of statement names.\n\nStatement names may be strings (for labels) or opaque tuples (for non-label statements)."], "renpy.set_physical_size": ["internal", "function", "(size)", "", "", "Attempts to set the size of the physical window to `size`. This has the side effect of taking the screen out of fullscreen mode."], "renpy.music.set_volume": ["internal", "function", "(volume, delay=0, channel=\"music\")", "", "", "Sets the volume of this channel, as a fraction of the volume of the mixer controlling the channel.\n\n`volume` This is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for the channel.\n\n`delay` It takes delay seconds to change/fade the volume from the old to the new value. This value is persisted into saves, and participates in rollback.\n\n`channel` The channel to be set"], "renpy.queue_event": ["internal", "function", "(name, up=False, **kwargs)", "", "", "Queues an event with the given name. `Name` should be one of the event names in :var:`config.keymap`, or a list of such names.\n\n`up` This should be false when the event begins (for example, when a keyboard button is pressed.) It should be true when the event ends (when the button is released.)\n\nThe event is queued at the time this function is called. This function will not work to replace an event with another - doing so will change event order. (Use :var:`config.keymap` instead.)\n\nThis method is threadsafe."], "renpy.load_module": ["internal", "function", "(name, **kwargs)", "", "", "This loads the Ren'Py module named name. A Ren'Py module consists of Ren'Py script that is loaded into the usual (store) namespace, contained in a file named name.rpym or name.rpymc. If a .rpym file exists, and is newer than the corresponding .rpymc file, it is loaded and a new .rpymc file is created.\n\nAll of the init blocks (and other init-phase code) in the module are run before this function returns. An error is raised if the module name cannot be found, or is ambiguous.\n\nModule loading may only occur from inside an init block."], "renpy.mode": ["internal", "function", "(mode)", "", "", "Causes Ren'Py to enter the named mode, or stay in that mode if it's already in it."], "renpy.suspend_rollback": ["internal", "function", "(flag)", "", "", "Rollback will skip sections of the game where rollback has been suspended.\n\n`flag`: When `flag` is true, rollback is suspended. When false, rollback is resumed."], "renpy.get_mouse_pos": ["internal", "function", "()", "", "", "Returns an (x, y) tuple giving the location of the mouse pointer or the current touch location. If the device does not support a mouse and is not currently being touched, x and y are numbers, but not meaningful."], "renpy.run": ["internal", "function", "(action)", "", "", "Run an action or list of actions. A single action is called with no arguments, a list of actions is run in order using this function, and None is ignored.\n\nReturns the result of the last action to return a value."], "renpy.version_name": ["other", "renpy.version_name", "", "", "var", "A human readable version name, of the form \\Example Version.\\"], "renpy.pause": ["internal", "function", "(delay=None, hard=False)", "", "", "Causes Ren'Py to pause. Returns true if the user clicked to end the pause, or false if the pause timed out or was skipped.\n\n`delay` If given, the number of seconds Ren'Py should pause for.\n\n`hard` This must be given as a keyword argument. When True, Ren'Py may prevent the user from clicking to interrupt the pause. If the player enables skipping, the hard pause will be skipped. There may be other circumstances where the hard pause ends early or prevents Ren'Py from operating properly, these will not be treated as bugs.\n\nIn general, using hard pauses is rude. When the user clicks to advance the game, it's an explicit request - the user wishes the game to advance. To override that request is to assume you understand what the player wants more than the player does.\n\nCalling renpy.pause guarantees that whatever is on the screen will be displayed for at least one frame, and hence has been shown to the player.\n\ntl;dr - Don't use renpy.pause with hard=True."], "renpy.add_layer": ["internal", "function", "(layer, above=None, below=None, menu_clear=True)", "", "", "Adds a new layer to the screen. If the layer already exists, this function does nothing.\n\nOne of `behind` or `above` must be given.\n\n`layer` A string giving the name of the new layer to add.\n\n`above` If not None, a string giving the name of a layer the new layer will be placed above.\n\n`below` If not None, a string giving the name of a layer the new layer will be placed below.\n\n`menu_clear` If true, this layer will be cleared when entering the game menu context, and restored when leaving the"], "renpy.variant": ["internal", "function", "(name)", "", "", "Returns true if a `name` is a screen variant that can be chosen by Ren'Py. See :ref:`screen-variants` for more details. This function can be used as the condition in a Python if statement to set up the appropriate styles for the selected screen variant.\n\n`name` can also be a list of variants, in which case this function returns True if any of the variants is selected."], "renpy.invoke_in_thread": ["internal", "function", "(fn, *args, **kwargs)", "", "", "Invokes the function `fn` in a background thread, passing it the provided arguments and keyword arguments. Restarts the interaction once the thread returns.\n\nThis function creates a daemon thread, which will be automatically stopped when Ren'Py is shutting down.\n\nThis thread is very limited in what it can do with the Ren'Py API. Changing store variables is allowed, as is calling the :func:`renpy.queue_event` function. Most other portions of the Ren'Py API are expected to be called from the main thread.\n\nThe primary use of this function is to place accesss to a web API in a second thread, and then update variables with the results of that call, by storing the result in variables and then relying on the interaction restart to cause screens to display those variables."], "renpy.predict_screen": ["internal", "function", "(_screen_name, *_args, **kwargs)", "", "", "Predicts the displayables that make up the given screen.\n\n`_screen_name` The name of the screen to show. `_widget_properties` A map from the id of a widget to a property name -> property value map. When a widget with that id is shown by the screen, the specified properties are added to it.\n\nKeyword arguments not beginning with underscore (_) are used to initialize the screen's scope."], "renpy.sound.stop": ["internal", "function", "(channel=\"sound\", fadeout=None)", "", "", "This stops the music that is currently playing, and dequeues all queued music. If fadeout is None, the music is faded out for the time given in config.fade_music, otherwise it is faded for fadeout seconds.\n\nThis sets the last queued file to None.\n\n`channel` The channel to stop the sound on.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music."], "renpy.choice_for_skipping": ["internal", "function", "()", "", "", "Tells Ren'Py that a choice is coming up soon. This currently has two effects:\n\n* If Ren'Py is skipping, and the Skip After Choices preferences is set to stop skipping, skipping is terminated.\n\n* An auto-save is triggered."], "renpy.in_fixed_rollback": ["internal", "function", "()", "", "", "Returns true if rollback is currently occurring and the current context is before an executed renpy.fix_rollback() statement."], "renpy.sound.queue": ["internal", "function", "(filenames, channel=\"sound\", loop=None, clear_queue=True, fadein=0, tight=None, relative_volume=1.0)", "", "", "This queues the given filenames on the specified channel.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`clear_queue` If True, then the queue is cleared, making these files the files that are played when the currently playing file finishes. If it is False, then these files are placed at the back of the queue. In either case, if no music is playing these files begin playing immediately.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.hide_screen": ["internal", "function", "(tag, layer=None)", "", "", "The programmatic equivalent of the hide screen statement.\n\nHides the screen with `tag` on `layer`."], "renpy.Render.place": ["cdd", "place", "(d, x=0, y=0, width=None, height=None, st=None, at=None, render=None, main=True)", "renpy.Render", "method", "Renders `d` and places it into the rectangle defined by the `x`, `y`, `width`, and `height`, using Ren'Py's standard placement algorithm.\n\n`x`, `y`, `width`, `height` The rectangle to place in. If `width` or `height`, when None, are the width and height of this render, respectively.\n\n`st`, `at` The times passed to Render. If None, defaults to the times passed to the render method calling this method.\n\n`render` If not None, this is used instead of rendering `d`.\n\n`main` As for .blit()."], "renpy.music.stop": ["internal", "function", "(channel=\"music\", fadeout=None)", "", "", "This stops the music that is currently playing, and dequeues all queued music. If fadeout is None, the music is faded out for the time given in config.fade_music, otherwise it is faded for fadeout seconds.\n\nThis sets the last queued file to None.\n\n`channel` The channel to stop the sound on.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music."], "renpy.copy_save": ["internal", "function", "(old, new)", "", "", "Copies the save at `old` to `new`. (Does nothing if `old` does not exist.)"], "renpy.get_renderer_info": ["internal", "function", "()", "", "", "Returns a dictionary, giving information about the renderer Ren'Py is currently using. Defined keys are:\n\n``\\renderer\\`` A string giving the name of the renderer that is in use.\n\n``\\resizable\\`` True if and only if the window is resizable.\n\n``\\additive\\`` True if and only if the renderer supports additive blending.\n\n``\\model\\`` Present and true if model-based rendering is supported.\n\nOther, renderer-specific, keys may also exist. The dictionary should be treated as immutable. This should only be called once the display has been started (that is, after the init phase has finished)."], "renpy.sound.set_pan": ["internal", "function", "(pan, delay, channel=\"sound\")", "", "", "Sets the pan of this channel.\n\n`pan` A number between -1 and 1 that control the placement of the audio. If this is -1, then all audio is sent to the left channel. If it's 0, then the two channels are equally balanced. If it's 1, then all audio is sent to the right ear.\n\n`delay` The amount of time it takes for the panning to occur.\n\n`channel` The channel the panning takes place on. This can be a sound or a music channel. Often, this is channel 7, the default music channel."], "renpy.end_replay": ["internal", "function", "()", "", "", "If we're in a replay, ends the replay immediately. Otherwise, does nothing."], "renpy.exists": ["internal", "function", "(filename)", "", "", "Returns true if the given filename can be found in the searchpath. This only works if a physical file exists on disk. It won't find the file if it's inside of an archive.\n\nYou almost certainly want to use :func:`renpy.loadable` in preference to this function."], "renpy.play": ["internal", "function", "(filename, channel=None, **kwargs)", "", "", "Plays a sound effect. If `channel` is None, it defaults to :var:`config.play_channel`. This is used to play sounds defined in styles, :propref:`hover_sound` and :propref:`activate_sound`."], "renpy.end_interaction": ["internal", "function", "(value)", "", "", "If `value` is not None, immediately ends the current interaction, causing the interaction to return `value`. If `value` is None, does nothing.\n\nThis can be called from inside the render and event methods of a creator-defined displayable."], "renpy.get_hidden_tags": ["internal", "function", "(layer)", "", "", "Returns the set of image tags on `layer` that are currently hidden, but still have attribute information associated with them."], "renpy.get_all_labels": ["internal", "function", "()", "", "", "Returns the set of all labels defined in the program, including labels defined for internal use in the libraries."], "renpy.mark_audio_unseen": ["internal", "function", "(filename)", "", "", "Marks the given filename as if it has not been played on the current user's system yet."], "renpy.cancel_gesture": ["internal", "function", "()", "", "", "Cancels the current gesture, preventing the gesture from being recognized. This should be called by displayables that have gesture-like behavior."], "renpy.has_live2d": ["internal", "function", "()", "", "", "Returns True if Live2d is supported on the current platform, and False otherwise."], "renpy.stop_predict_screen": ["internal", "function", "(name)", "", "", "Causes Ren'Py to stop predicting the screen named `name`."], "renpy.music.get_loop": ["internal", "function", "(channel=\"music\")", "", "", "Return a list of filenames that are being looped on `channel`, or None if no files are being looped. In the case where a loop is queued, but is not yet playing, the loop is returned, not the currently playing music."], "renpy.get_showing_tags": ["internal", "function", "(layer)", "", "", "Returns the set of image tags that are currently being shown on `layer`. If sort is true, returns a list of the tags from back to front."], "renpy.newest_slot": ["internal", "function", "(regexp=None)", "", "", "Returns the name of the newest save slot (the save slot with the most recent modification time), or None if there are no (matching) saves.\n\nIf `regexp` exists, only slots that begin with `regexp` are returned."], "renpy.get_sdl_window_pointer": ["internal", "function", "()", "", "", "Returns a pointer (of type ctypes.c_void_p) to the main window, or None if the main window is not displayed, or some other problem occurs."], "renpy.music": ["basefile", "", "", "", "", "Most renpy.music functions have aliases in renpy.sound. These functions are similar, except they default to the sound channel rather than the music channel, and default to not looping."], "renpy.is_seen": ["internal", "function", "(ever=True)", "", "", "Returns true if the current line has been seen by the player.\n\nIf `ever` is true, we check to see if the line has ever been seen by the player. If false, we check if the line has been seen in the current play-through."], "renpy.get_say_image_tag": ["internal", "function", "()", "", "", "Returns the tag corresponding to the currently speaking character (the `image` argument given to that character). Returns None if no character is speaking or the current speaking character does not have a corresponding image tag."], "renpy.substitute": ["internal", "function", "(s, scope=None, translate=True)", "", "", "Applies translation and new-style formatting to the string `s`.\n\n`scope` If not None, a scope which is used in formatting, in addition to the default store.\n\n`translate` Determines if translation occurs.\n\nReturns the translated and formatted string."], "renpy.get_screen": ["internal", "function", "(name, layer=None)", "", "", "Returns the ScreenDisplayable with the given `name` on layer. `name` is first interpreted as a tag name, and then a screen name. If the screen is not showing, returns None.\n\nThis can also take a list of names, in which case the first screen that is showing is returned.\n\nThis function can be used to check if a screen is showing\n```\nif renpy.get_screen(\\say\\):\ntext \\The say screen is showing.\\\nelse:\ntext \\The say screen is hidden.\\\n\n```"], "renpy.is_skipping": ["internal", "function", "()", "", "", "Returns True if Ren'Py is currently skipping (in fast or slow skip mode), or False otherwise."], "renpy.check_image_attributes": ["internal", "function", "(tag, attributes)", "", "", "Checks to see if there is a unique image with the given tag and attributes. If there is, returns the attributes in order. Otherwise, returns None."], "renpy.fsdecode": ["internal", "function", "(s)", "", "", "Converts s from filesystem encoding to unicode."], "renpy.load_image": ["internal", "function", "(im)", "", "", "Loads the image manipulator `im` using the image cache, and returns a render."], "renpy.take_screenshot": ["internal", "function", "(scale=None, background=False)", "", "", "Causes a screenshot to be taken. This screenshot will be saved as part of a save game."], "renpy.register_sl_statement": ["internal", "class", "(name, children=u'many', screen=None)", "", "", "Registers a custom screen language statement with Ren'Py.\n\n`name` This must be a word. It's the name of the custom screen language statement.\n\n`children` The number of children this custom statement takes. This should be 0, 1, or \\many\\, which means zero or more.\n\n`screen` The screen to use. If not given, defaults to `name`.\n\nReturns an object that can have positional arguments and properties added to it. This object has the same .add_ methods as the objects returned by :class:`renpy.register_sl_displayable`."], "renpy.input": ["internal", "function", "(prompt, default='', allow=None, exclude='{}', length=None, with_none=None, pixel_width=None, screen=\"input\", mask=None, **kwargs)", "", "", "Calling this function pops up a window asking the player to enter some text. It returns the entered text.\n\n`prompt` A string giving a prompt to display to the player.\n\n`default` A string giving the initial text that will be edited by the player.\n\n`allow` If not None, a string giving a list of characters that will be allowed in the text.\n\n`exclude` If not None, if a character is present in this string, it is not allowed in the text.\n\n`length` If not None, this must be an integer giving the maximum length of the input string.\n\n`pixel_width` If not None, the input is limited to being this many pixels wide, in the font used by the input to display text.\n\n`screen` The name of the screen that takes input. If not given, the ``input`` screen is used.\n\n`mask` If not None, a single-character string that replaces the input text that is shown to the player, such as to conceal a password.\n\nIf :var:`config.disable_input` is True, this function only returns `default`.\n\nKeywords prefixed with ``show_`` have the prefix stripped and are passed to the screen."], "renpy.get_say_attributes": ["internal", "function", "()", "", "", "Gets the attributes associated with the current say statement, or None if no attributes are associated with this statement.\n\nThis is only valid when executing or predicting a say statement."], "renpy.define_screen": ["internal", "function", "(name, function, modal=\"False\", zorder=\"0\", tag=None, variant=None)", "", "", "Defines a screen with `name`, which should be a string.\n\n`function` The function that is called to display the screen. The function is called with the screen scope as keyword arguments. It should ignore additional keyword arguments.\n\nThe function should call the ui functions to add things to the screen.\n\n`modal` A string that, when evaluated, determines of the created screen should be modal. A modal screen prevents screens underneath it from receiving input events.\n\n`zorder` A string that, when evaluated, should be an integer. The integer controls the order in which screens are displayed. A screen with a greater zorder number is displayed above screens with a lesser zorder number.\n\n`tag` The tag associated with this screen. When the screen is shown, it replaces any other screen with the same tag. The tag defaults to the name of the screen.\n\n`predict` If true, this screen can be loaded for image prediction. If false, it can't. Defaults to true.\n\n`variant` String. Gives the variant of the screen to use."], "renpy.music_stop": ["internal", "function", "(fadeout=None)", "", "", "Deprecated music start function, retained for compatibility. Use renpy.music.play() or .queue() instead."], "renpy.clear_game_runtime": ["internal", "function", "()", "", "", "Resets the game runtime counter."], "renpy.jump": ["internal", "function", "(label)", "", "", "Causes the current statement to end, and control to jump to the given label."], "renpy.Displayable.event": ["cdd", "event", "(ev, x, y, st)", "renpy.Displayable", "method", "The event method is called to pass a pygame event to the creator-defined displayable. If the event method returns a value other than None, that value is returned as the result of the interaction. If the event method returns None, the event is passed on to other displayables.\n\nTo ignore the event without returning None, raise :class:`renpy.IgnoreEvent`.\n\nThe event method exists on other displayables, allowing the creator-defined displayable to pass on the event.\n\n`ev` An `event object `_\n\n`x`, `y` The x and y coordinates of the event, relative to the upper-left corner of the displayable. These should be used in preference to position information found in the pygame event objects.\n\n`st` A float, the shown timebase, in seconds.\n\nAn event is generated at the start of each interaction, and :func:`renpy.timeout` can be used to cause another event to occur."], "renpy.start_predict": ["internal", "function", "(*args)", "", "", "This function takes one or more displayables as arguments. It causes Ren'Py to predict those displayables during every interaction until the displayables are removed by :func:`renpy.stop_predict`.\n\nIf a displayable name is a string containing one or more \\\\* characters, the asterisks are used as a wildcard pattern. If there is at least one . in the string, the pattern is matched against filenames, otherwise it is matched against image names.\n\nFor example::\n\n$ renpy.start_predict(\\eileen *\\)\n\nstarts predicting all images with the name eileen, while::\n\n$ renpy.start_predict(\\images/concert*.*\\)\n\nmatches all files starting with concert in the images directory."], "renpy.reload_script": ["internal", "function", "()", "", "", "Causes Ren'Py to save the game, reload the script, and then load the save."], "renpy.types": ["internal", "function", "()", "", "", "Define names for all type symbols known in the standard interpreter.\n\nTypes that are part of optional modules (e.g. array) are not listed."], "renpy.Displayable.per_interact": ["cdd", "per_interact", "(self)", "renpy.Displayable", "method", "This method is called at the start of each interaction. It can be used to trigger a redraw, and probably should be used to trigger a redraw if the object participates in rollback."], "renpy.load_surface": ["internal", "function", "(im)", "", "", "Loads the image manipulator `im` using the image cache, and returns a pygame Surface."], "renpy.music.get_duration": ["internal", "function", "(channel=\"music\")", "", "", "Returns the duration of the audio or video file on `channel`. Returns 0.0 if no file is playing on `channel`."], "renpy.can_load": ["internal", "function", "(filename, test=False)", "", "", "Returns true if `filename` exists as a save slot, and False otherwise."], "renpy.pop_call": ["internal", "function", "()", "", "", "Pops the current call from the call stack, without returning to the location.\n\nThis can be used if a label that is called decides not to return to its caller."], "renpy.run_unhovered": ["internal", "function", "(var)", "", "", "Calls the unhovered method on the variable, if it exists."], "renpy.redraw": ["cdd", "renpy.redraw", "(d, when)", "", "function", "Causes the displayable `d` to be redrawn after `when` seconds have elapsed."], "renpy.Render.zoom": ["cdd", "zoom", "(xzoom, yzoom)", "renpy.Render", "method", "Sets the zoom level of the children of this displayable in the horitzontal and vertical axes. Only the children of the displayable are zoomed \u2013 the width, height, and blit coordinates are not zoomed.\n\nThe following attributes and methods are only used when model-based rendering is enabled:"], "renpy.count_newly_seen_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks the user has seen for the first time during this session."], "renpy.register_shader": ["internal", "function", "(name, **kwargs)", "", "", "This registers a shader part. This takes `name`, and then keyword arguments.\n\n`name` A string giving the name of the shader part. Names starting with an underscore or \\renpy.\\ are reserved for Ren'Py.\n\n`variables` The variables used by the shader part. These should be listed one per line, a storage (uniform, attribute, or varying) followed by a type, name, and semicolon. For example\n```\nvariables='''\nuniform sampler2D tex0;\nattribute vec2 a_tex_coord;\nvarying vec2 v_tex_coord;\n'''\n\n`vertex_functions`\nIf given, a string containing functions that will be included in the\nvertex shader.\n\n`fragment_functions`\nIf given, a string containing functions that will be included in the\nfragment shader.\n\nOther keyword arguments should start with ``vertex_`` or ``fragment_``,\nand end with an integer priority. So \\fragment_200\\ or \\vertex_300\\. These\ngive text that's placed in the appropriate shader at the given priority,\nwith lower priority numbers inserted before higher priority numbers.\n```"], "renpy.iconify": ["internal", "function", "()", "", "", "Iconifies the game."], "renpy.is_sensitive": ["internal", "function", "(action)", "", "", "Returns true if `action` indicates it is sensitive, or False otherwise."], "renpy.is_mouse_visible": ["internal", "function", "()", "", "", "Returns True if the mouse cursor is visible, False otherwise."], "renpy.sound.get_pause": ["internal", "function", "(channel=\"sound\")", "", "", "Returns the pause flag for `channel`."], "renpy.get_displayable": ["internal", "function", "(screen, id, layer=None, base=False)", "", "", "From the `screen` on `layer`, returns the displayable with `id`. Returns None if the screen doesn't exist, or there is no widget with that id on the screen."], "renpy.file": ["internal", "function", "(fn)", "", "", "Returns a read-only file-like object that accesses the file named `fn`. The file is accessed using Ren'Py's standard search method, and may reside in an RPA archive. or as an Android asset.\n\nThe object supports a wide subset of the fields and methods found on Python's standard file object, opened in binary mode. (Basically, all of the methods that are sensible for a read-only file.)"], "renpy.slot_json": ["internal", "function", "(slotname)", "", "", "Returns the json information for `slotname`, or None if the slot is empty."], "renpy.sound.set_queue_empty_callback": ["internal", "function", "(callback, channel=\"sound\")", "", "", "This sets a callback that is called when the queue is empty. This callback is called when the queue first becomes empty, and at least once per interaction while the queue is empty.\n\nThe callback is called with no parameters. It can queue sounds by calling renpy.music.queue with the appropriate arguments. Please note that the callback may be called while a sound is playing, as long as a queue slot is empty."], "renpy.sound.get_playing": ["internal", "function", "(channel=\"sound\")", "", "", "If the given channel is playing, returns the playing file name. Otherwise, returns None."], "renpy.predict": ["internal", "function", "(self)", "", "", "This is called to predictively load images from this node. It should cause renpy.display.predict.displayable and renpy.display.predict.screen to be called as necessary."], "renpy.checkpoint": ["internal", "function", "(data=None)", "", "", "Makes the current statement a checkpoint that the user can rollback to. Once this function has been called, there should be no more interaction with the user in the current statement.\n\nThis will also clear the current screenshot used by saved games.\n\n`data` This data is returned by :func:`renpy.roll_forward_info` when the game is being rolled back.\n\n`hard` If true, this is a hard checkpoint that rollback will stop at. If false, this is a soft checkpoint that will not stop rollback."], "renpy.music.set_pause": ["internal", "function", "(value, channel=\"music\")", "", "", "Sets the pause flag for `channel` to `value`. If True, the channel will pause, otherwise it will play normally."], "renpy.vibrate": ["internal", "function", "(duration)", "", "", "Causes the device to vibrate for `duration` seconds. Currently, this is only supported on Android."], "renpy.change_zorder": ["internal", "function", "(layer, tag, zorder)", "", "", "Changes the zorder of `tag` on `layer` to `zorder`."], "renpy.can_rollback": ["internal", "function", "()", "", "", "Returns true if we can rollback."], "renpy.Displayable.__init__": ["cdd", "__init__", "(**properties)", "renpy.Displayable", "method", "A subclass may override the constructor, perhaps adding new parameters. If it does, it should pass all unknown keyword arguments to the renpy.Displayable constructor, with the call\n```\nsuper(MyDisplayable, self).__init__(**properties)\n\n```"], "renpy.Render.add_shader": ["cdd", "add_shader", "(shader)", "renpy.Render", "method", "This causes the shader part `shader` to be used when this Render or its children are drawn. The part should be a string, or can be a string beginning with \\-\\ to prevent a shader from being drawn."], "renpy.fix_rollback": ["internal", "function", "()", "", "", "Prevents the user from changing decisions made before the current statement."], "renpy.Keymap": ["internal", "class", "(replaces=None, activate_sound=None, **keymap)", "", "", "This is a behavior that maps keys to actions that are called when the key is pressed. The keys are specified by giving the appropriate k_constant from pygame.constants, or the unicode for the key."], "renpy.save": ["internal", "function", "(filename, extra_info='')", "", "", "Saves the list of shaders to the file."], "renpy.Render.blit": ["cdd", "blit", "(source, pos, main=True)", "renpy.Render", "method", "Draws another render object into this render object.\n\n`source` The render object to draw.\n\n`pos` The location to draw into. This is an (x, y) tuple with the coordinates being pixels relative to the upper-left corner of the target render.\n\n`main` A keyword-only parameter. If true, `source` will be displayed in the style inspector."], "renpy.notify": ["internal", "function", "(message)", "", "", "Causes Ren'Py to display the `message` using the notify screen. By default, this will cause the message to be dissolved in, displayed for two seconds, and dissolved out again.\n\nThis is useful for actions that otherwise wouldn't produce feedback, like screenshots or quicksaves.\n\nOnly one notification is displayed at a time. If a second notification is displayed, the first notification is replaced.\n\nThis function just calls :var:`config.notify`, allowing its implementation to be replaced by assigning a new function to that variable."], "renpy.get_zorder_list": ["internal", "function", "(layer)", "", "", "Returns a list of (tag, zorder) pairs for `layer`."], "renpy.windows": ["other", "renpy.windows", "", "", "var", "Has a true value when running on Windows."], "renpy.music.set_queue_empty_callback": ["internal", "function", "(callback, channel=\"music\")", "", "", "This sets a callback that is called when the queue is empty. This callback is called when the queue first becomes empty, and at least once per interaction while the queue is empty.\n\nThe callback is called with no parameters. It can queue sounds by calling renpy.music.queue with the appropriate arguments. Please note that the callback may be called while a sound is playing, as long as a queue slot is empty."], "renpy.Displayable.render": ["cdd", "render", "(width, height, st, at)", "renpy.Displayable", "method", "Subclasses must override this, to return a :class:`renpy.Render` object. The render object determines what, if anything, is shown on the screen.\n\n`width`, `height` The amount of space available to this displayable, in pixels.\n\n`st` A float, the shown timebase, in seconds. The shown timebase begins when this displayable is first shown on the screen.\n\n`at` A float, the animation timebase, in seconds. The animation timebase begins when an image with the same tag was shown, without being hidden. (When the displayable is shown without a tag, this is the same as the shown timebase.)\n\nThe render method is called when the displayable is first shown. It can be called again if :func:`renpy.redraw` is called on this object."], "renpy.lint": ["internal", "function", "()", "", "", "The master lint function, that's responsible for staging all of the other checks."], "renpy.get_game_runtime": ["internal", "function", "()", "", "", "Returns the game runtime counter.\n\nThe game runtime counter counts the number of seconds that have elapsed while waiting for user input in the top-level context. (It does not count time spent in the main or game menus.)"], "renpy.get_on_battery": ["internal", "function", "()", "", "", ":other:\n\nReturns True if Ren'Py is running on a device that is powered by an internal battery, or False if the device is being charged by some external source."], "renpy.linux": ["other", "renpy.linux", "", "", "var", "Has a true value when running on Linux or other POSIX-like operating systems."], "renpy.emscripten": ["other", "renpy.emscripten", "", "", "var", "Has a true value when running in the browser."], "renpy.get_at_list": ["internal", "function", "(name, layer=None, camera=False)", "", "", "Returns the list of transforms being applied to the image with tag `name` on `layer`. Returns an empty list if no transforms are being applied, or None if the image is not shown.\n\nIf `layer` is None, uses the default layer for the given tag."], "renpy.music.get_pause": ["internal", "function", "(channel=\"music\")", "", "", "Returns the pause flag for `channel`."], "renpy.is_init_phase": ["internal", "function", "()", "", "", "Returns True if Ren'Py is currently executing init code, or False otherwise."], "renpy.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "renpy.display_notify": ["internal", "function", "(message)", "", "", "The default implementation of :func:`renpy.notify`."], "renpy.Displayable": ["cdd", "renpy.Displayable", "", "", "class", "Base class for creator-defined displayables."], "renpy.set_style_preference": ["internal", "function", "(preference, alternative)", "", "", "Sets the selected alternative for the style preference.\n\n`preference` A string giving the name of the style preference.\n\n`alternative` A string giving the name of the alternative."], "renpy.roll_forward_info": ["internal", "function", "()", "", "", "When in rollback, returns the data that was supplied to :func:`renpy.checkpoint` the last time this statement executed. Outside of rollback, returns None."], "renpy.music_start": ["internal", "function", "(filename, loops=True, fadeout=None, fadein=0)", "", "", "Deprecated music start function, retained for compatibility. Use renpy.music.play() or .queue() instead."], "renpy.retain_after_load": ["internal", "function", "()", "", "", "Causes data modified between the current statement and the statement containing the next checkpoint to be retained when a load occurs."], "renpy.get_menu_args": ["internal", "function", "()", "", "", ":other:\n\nReturns a tuple giving the arguments (as a tuple) and the keyword arguments (as a dict) passed to the current menu statement."], "renpy.IgnoreEvent": ["cdd", "renpy.IgnoreEvent", "", "", "class", "This is an exception that, if raised, causes Ren'Py to ignore the event. To raise this inside the event method, write\n```\nraise renpy.IgnoreEvent()\n\n```"], "renpy.load_string": ["internal", "function", "(s, filename=\"\")", "", "", "Loads `s` as Ren'Py script that can be called.\n\nReturns the name of the first statement in s.\n\n`filename` is the name of the filename that statements in the string will appear to be from."], "renpy.get_transition": ["internal", "function", "(layer=None)", "", "", "Gets the transition for `layer`, or the entire scene if `layer` is None. This returns the transition that is queued up to run during the next interaction, or None if no such transition exists."], "renpy.seen_image": ["internal", "function", "(name)", "", "", "Returns True if the named image has been seen at least once on the user's system. An image has been seen if it's been displayed using the show statement, scene statement, or :func:`renpy.show` function. (Note that there are cases where the user won't actually see the image, like a show immediately followed by a hide.)"], "renpy.register_sl_displayable": ["internal", "function", "(name, displayable, style, nchildren=0, scope=False, replaces=False, default_keywords={}, default_properties=True)", "", "", "Registers a screen language statement that creates a displayable.\n\n`name` The name of the screen language statement, a string containing a Ren'Py keyword. This keyword is used to introduce the new statement.\n\n`displayable` This is a function that, when called, returns a displayable object. All position arguments, properties, and style properties are passed as arguments to this function. Other keyword arguments are also given to this function, a described below.\n\nThis must return a Displayable. If it returns multiple displayables, the _main attribute of the outermost displayable should be set to the \\main\\ displayable - the one that children should be added to.\n\n`style` The base name of the style of this displayable. If the style property is not given, this will have the style prefix added to it. The computed style is passed to the `displayable` function as the ``style`` keyword argument.\n\n`nchildren` The number of children of this displayable. One of:\n\n0 The displayable takes no children. 1 The displayable takes 1 child. If more than one child is given, the children are placed in a Fixed. \\many\\ The displayable takes more than one child.\n\n The following arguments should be passed in using keyword arguments:\n\n`replaces` If true, and the displayable replaces a prior displayable, that displayable is passed as a parameter to the new displayable.\n\n`default_keywords` The default set of keyword arguments to supply to the displayable.\n\n`default_properties` If true, the ui and position properties are added by default.\n\nReturns an object that can have positional arguments and properties added to it by calling the following methods. Each of these methods returns the object it is called on, allowing methods to be chained together.\n\n.. method:: add_positional(name)\n\nAdds a positional argument with `name`\n\n.. method:: add_property(name)\n\nAdds a property with `name`. Properties are passed as keyword arguments.\n\n.. method:: add_style_property(name)\n\nAdds a family of properties, ending with `name` and prefixed with the various style property prefixes. For example, if called with (\\size\\), this will define size, idle_size, hover_size, etc.\n\n.. method:: add_prefix_style_property(prefix, name)\n\nAdds a family of properties with names consisting of `prefix`, a style property prefix, and `name`. For example, if called with a prefix of `text_` and a name of `size`, this will create text_size, text_idle_size, text_hover_size, etc.\n\n.. method:: add_property_group(group, prefix='')\n\nAdds a group of properties, prefixed with `prefix`. `Group` may be one of the strings:\n\n* \\bar\\ * \\box\\ * \\button\\ * \\position\\ * \\text\\ * \\window\\\n\nThese correspond to groups of :ref:`style-properties`. Group can also be \\ui\\, in which case it adds the :ref:`common ui properties `."], "renpy.sound.is_playing": ["internal", "function", "(channel=\"sound\")", "", "", "Returns True if the channel is currently playing a sound, False if it is not, or if the sound system isn't working."], "renpy.is_start_interact": ["internal", "function", "()", "", "", "Returns true if restart_interaction has not been called during the current interaction. This can be used to determine if the interaction is just being started, or has been restarted."], "renpy.add_to_all_stores": ["internal", "function", "(name, value)", "", "", "Adds the `value` by the `name` to all creator defined namespaces. If the name already exist in that namespace - do nothing for it.\n\nThis function may only be run from inside an init block. It is an error to run this function once the game has started."], "renpy.full_restart": ["internal", "function", "(transition=False, label=\"_invoke_main_menu\", target=\"_main_menu\", save=False)", "", "", "Causes Ren'Py to restart, returning the user to the main menu.\n\n`transition` If given, the transition to run, or None to not run a transition. False uses :var:`config.end_game_transition`.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py restarts and returns the user to the main menu."], "renpy.count_displayables_in_layer": ["internal", "function", "(layer)", "", "", "Returns how many displayables are in the supplied layer."], "renpy.get_style_preference": ["internal", "function", "(preference)", "", "", "Returns a string giving the name of the selected alternative for the named style preference.\n\n`preference` A string giving the name of the style preference."], "renpy.slot_mtime": ["internal", "function", "(slotname)", "", "", "Returns the modification time for `slot`, or None if the slot is empty."], "renpy.seen_label": ["internal", "function", "(label)", "", "", "Returns true if the named label has executed at least once on the current user's system, and false otherwise. This can be used to unlock scene galleries, for example."], "renpy.set_focus": ["internal", "function", "(screen, id, layer=\"screens\")", "", "", "This attempts to focus the displayable with `id` in the screen `screen`. Focusing will fail if the displayable isn't found, the window isn't focused, or something else is grabbing focus.\n\nThe focus may change if the mouse moves, even slightly, after this call is processed."], "renpy.get_ordered_image_attributes": ["internal", "function", "(tag, attributes=(), sort=None)", "", "", "Returns a list of image tags, ordered in a way that makes sense to present to the user.\n\n`attributes` If present, only attributes that are compatible with the given attributes are considered. (Compatible means that the attributes can be in a single image at the same time.)\n\n`sort` If not None, the returned list of attributes is sorted. This is a function that should be used as a tiebreaker."], "renpy.image": ["internal", "function", "(name, d)", "", "", "Defines an image. This function is the Python equivalent of the image statement.\n\n`name` The name of the image to display, a string.\n\n`d` The displayable to associate with that image name.\n\nThis function may only be run from inside an init block. It is an error to run this function once the game has started."], "renpy.get_sdl_dll": ["internal", "function", "()", "", "", "This returns a ctypes.cdll object that refers to the library that contains the instance of SDL2 that Ren'Py is using.\n\nIf this can not be done, None is returned."], "renpy.hide": ["internal", "function", "(name, layer=None)", "", "", "Hides an image from a layer. The Python equivalent of the hide statement.\n\n`name` The name of the image to hide. Only the image tag is used, and any image with the tag is hidden (the precise name does not matter).\n\n`layer` The layer on which this function operates. If None, uses the default layer associated with the tag."], "renpy.music.get_playing": ["internal", "function", "(channel=\"music\")", "", "", "If the given channel is playing, returns the playing file name. Otherwise, returns None."], "renpy.sound.get_loop": ["internal", "function", "(channel=\"sound\")", "", "", "Return a list of filenames that are being looped on `channel`, or None if no files are being looped. In the case where a loop is queued, but is not yet playing, the loop is returned, not the currently playing music."], "renpy.get_image_load_log": ["internal", "function", "(age=None)", "", "", "A generator that yields a log of image loading activity. For the last 100 image loads, this returns:\n\n* The time the image was loaded (in seconds since the epoch). * The filename of the image that was loaded. * A boolean that is true if the image was preloaded, and false if the game stalled to load it.\n\nThe entries are ordered from newest to oldest.\n\n`age` If not None, only images that have been loaded in the past `age` seconds are included.\n\nThe image load log is only kept if config.developer = True."], "renpy.Render": ["cdd", "renpy.Render", "(width, height)", "", "class", "Creates a new Render object.\n\n`width`, `height` The width and height of the render object, in pixels."], "renpy.music.play": ["internal", "function", "(filenames, channel=\"music\", loop=None, fadeout=None, synchro_start=False, fadein=0, tight=None, if_changed=False, relative_volume=1.0)", "", "", "This stops the music currently playing on the numbered channel, dequeues any queued music, and begins playing the specified file or files.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music.\n\n`synchro_start` Ren'Py will ensure that all channels of with synchro_start set to true will start playing at exactly the same time. Synchro_start should be true when playing two audio files that are meant to be synchronized with each other.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`if_changed` If this is True, and the music file is currently playing, then it will not be stopped/faded out and faded back in again, but instead will be kept playing. (This will always queue up an additional loop of the music.)\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.version": ["internal", "function", "(tuple=False)", "", "", "If `tuple` is false, returns a string containing \\Ren'Py \\, followed by the current version of Ren'Py.\n\nIf `tuple` is true, returns a tuple giving each component of the version as an integer."], "renpy.jump_out_of_context": ["internal", "function", "(label)", "", "", "Causes control to leave the current context, and then to be transferred in the parent context to the given label."], "renpy.Render.subsurface": ["cdd", "subsurface", "(rect)", "renpy.Render", "method", "Returns a render consisting of a rectangle cut out of this render.\n\n`rect` A (x, y, width, height) tuple."], "renpy.Render.mesh": ["cdd", "mesh", "", "renpy.Render", "attribute", "This field enables model-based rendering for this Render. If true:\n\nIf set to True:\n\n* All of the children of this displayable are rendered to textures. * A mesh the size of the first child is assocated with this displayable. * A model is created with the mesh, shaders, uniforms, and properties associated with this Render.\n\nThe model will then be drawn in a single operation."], "renpy.display_menu": ["internal", "function", "(items, interact=True, screen=\"choice\")", "", "", "This displays a menu to the user. `items` should be a list of 2-item tuples. In each tuple, the first item is a textual label, and the second item is the value to be returned if that item is selected. If the value is None, the first item is used as a menu caption.\n\nThis function takes many arguments, of which only a few are documented. Except for `items`, all arguments should be given as keyword arguments.\n\n`interact` If false, the menu is displayed, but no interaction is performed.\n\n`screen` The name of the screen used to display the menu.\n\nNote that most Ren'Py games do not use menu captions, but use narration instead. To display a menu using narration, write\n```\n$ narrator(\\Which direction would you like to go?\\, interact=False)\n$ result = renpy.display_menu([ (\\East\\, \\east\\), (\\West\\, \\west\\) ])\n\n```"], "renpy.screenshot": ["internal", "function", "(filename)", "", "", "Saves a screenshot in `filename`.\n\nReturns True if the screenshot was saved successfully, False if saving failed for some reason.\n\nThe :var:`config.screenshot_pattern` and :var:`_screenshot_pattern` variables control the file the screenshot is saved in."], "renpy.show": ["internal", "function", "(name, at_list=[], layer='master', what=None, zorder=0, tag=None, behind=[])", "", "", "Shows an image on a layer. This is the programmatic equivalent of the show statement.\n\n`name` The name of the image to show, a string.\n\n`at_list` A list of transforms that are applied to the image. The equivalent of the ``at`` property.\n\n`layer` A string, giving the name of the layer on which the image will be shown. The equivalent of the ``onlayer`` property. If None, uses the default layer associated with the tag.\n\n`what` If not None, this is a displayable that will be shown in lieu of looking on the image. (This is the equivalent of the show expression statement.) When a `what` parameter is given, `name` can be used to associate a tag with the image.\n\n`zorder` An integer, the equivalent of the ``zorder`` property. If None, the zorder is preserved if it exists, and is otherwise set to 0.\n\n`tag` A string, used to specify the image tag of the shown image. The equivalent of the ``as`` property.\n\n`behind` A list of strings, giving image tags that this image is shown behind. The equivalent of the ``behind`` property."], "renpy.mark_label_seen": ["internal", "function", "(label)", "", "", "Marks the named label as if it has been already executed on the current user's system."], "renpy.count_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks in the game's original language."], "renpy.music.register_channel": ["audio", "renpy.music.register_channel", "(name, mixer=None, loop=None, stop_on_mute=True, tight=False, file_prefix=\"\", file_suffix=\"\", buffer_queue=True, movie=False, framedrop=True)", "", "", "This registers a new audio channel named `name`. Audio can then be played on the channel by supplying the channel name to the play or queue statements.\n\n`mixer` The name of the mixer the channel uses. By default, Ren'Py knows about the \\music\\, \\sfx\\, and \\voice\\ mixers. Using other names is possible, but may require changing the preferences screens.\n\n`loop` If true, sounds on this channel loop by default.\n\n`stop_on_mute` If true, music on the channel is stopped when the channel is muted.\n\n`tight` If true, sounds will loop even when fadeout is occurring. This should be set to True for a sound effects or seamless music channel, and False if the music fades out on its own.\n\n`file_prefix` A prefix that is prepended to the filenames of the sound files being played on this channel.\n\n`file_suffix` A suffix that is appended to the filenames of the sound files being played on this channel.\n\n`buffer_queue` Should we buffer the first second or so of a queued file? This should be True for audio, and False for movie playback.\n\n`movie` If true, this channel will be set up to play back videos.\n\n`framedrop` This controls what a video does when lagging. If true, frames will be dropped to keep up with realtime and the soundtrack. If false, Ren'Py will display frames late rather than dropping them."], "renpy.list_files": ["internal", "function", "(common=False)", "", "", "Lists the files in the game directory and archive files. Returns a list of files, with / as the directory separator.\n\n`common` If true, files in the common directory are included in the listing."]}, "config": {"config.menu_arguments_callback": ["config", "config.menu_arguments_callback", " = None", "", "var", "If not None, this should be a function that takes positional and/or keyword arguments. It's called whenever a menu statement runs, with the arguments to that menu statement.\n\nThis should return a pair, containing a tuple of positional arguments (almost always empty), and a dictionary of keyword arguments."], "config.new_substitutions": ["config", "config.new_substitutions", " = True", "", "var", "If True, Ren'Py will apply new-style (square-bracket) substitutions to all text displayed."], "config.tag_zorder": ["config", "config.tag_zorder", " = { }", "", "var", "A dictionary mapping image tag strings to zorders. When an image is newly-shown without a zorder clause, the image's tag is looked up in this dictionary to find a zorder to use. If no zorder is found, 0 is used."], "config.show": ["config", "config.show", " = renpy.show", "", "var", "A function that is used in place of renpy.show by the :ref:`show ` and :ref:`scene ` statements. This should have the same signature as renpy.show."], "config.enter_transition": ["config", "config.enter_transition", " = None", "", "var", "If not None, this variable should give a transition that will be used when entering the game menu."], "config.script_version": ["config", "config.script_version", " = None", "", "var", "If not None, this is interpreted as a script version. The library will use this script version to enable some compatibility features, if necessary. If None, we assume this is a latest-version script.\n\nThis is normally set in a file added by the Ren'Py launcher when distributions are built."], "config.exception_handler": ["config", "config.exception_handler", " = None", "", "var", "If not None, this should be a function that takes three arguments:\n\n* A string giving the text of a traceback, abbreviated so that it only includes creator-written files. * The full text of the traceback, including both creator-written and Ren'Py files. * The path to a file containing a traceback method.\n\nThis function can present the error to a user in any way fit. If it returns True, the exception is ignored and control is transferred to the next statement. If it returns False, the built-in exception handler is use. This function may also call :func:`renpy.jump` to transfer control to some other label."], "config.displayable_prefix": ["config", "config.displayable_prefix", " = { }", "", "var", "See :ref:`Displayable prefixes `."], "config.history_length": ["gui", "config.history_length", " = 250", "", "var", "The number of blocks of dialogue Ren'Py will keep at history."], "config.fade_music": ["config", "config.fade_music", " = 0.0", "", "var", "This is the amount of time in seconds to spend fading the old track out before a new music track starts. This should probably be fairly short, so the wrong music doesn't play for too long."], "config.voice_filename_format": ["config", "config.voice_filename_format", " = \"{filename}\"", "", "var", "A string that is formatted with the string argument to the voice statement to produce the filename that is played to the user. For example, if this is \\{filename}.ogg\\, the ``voice \\test\\`` statement will play test.ogg."], "config.after_load_transition": ["config", "config.after_load_transition", " = None", "", "var", "A transition that is used after loading, when entering the loaded game."], "config.mipmap_text": ["config", "config.mipmap_text", " = False", "", "var", "The default value of the mipmap argument to :func:`Text`, including text used in screen statements."], "config.scene": ["config", "config.scene", " = renpy.scene", "", "var", "A function that's used in place of renpy.scene by the :ref:`scene statement `. Note that this is used to clear the screen, and config.show is used to show a new image. This should have the same signature as renpy.scene."], "config.gl_resize": ["config", "config.gl_resize", " = True", "", "var", "Determines if the user is allowed to resize an OpenGL-drawn window."], "config.missing_background": ["config", "config.missing_background", " = \"black\"", "", "var", "This is the background that is used when :var:`config.developer` is True and an undefined image is used in a :ref:`scene statement `. This should be an image name (a string), not a displayable."], "config.log_gl_shaders": ["model", "config.log_gl_shaders", " = False", "", "var", "If true, source code for the GLSL shader programs will be written to log.txt on start."], "config.end_splash_transition": ["config", "config.end_splash_transition", " = None", "", "var", "The transition that is used to display the main menu after the end of the splashscreen."], "config.with_callback": ["config", "config.with_callback", " = None", "", "var", "If not None, this should be a function that is called when a :ref:`with statement ` occurs. This function can be responsible for putting up transient things on the screen during the transition. The function is called with a single argument, which is the transition that is occurring. It is expected to return a transition, which may or may not be the transition supplied as its argument."], "config.context_clear_layers": ["config", "config.context_clear_layers", " = [ 'screens' ]", "", "var", "A list of layers that are cleared when entering a new context."], "config.nvl_adv_transition": ["config", "config.nvl_adv_transition", " = None", "", "var", "A transition that is used when showing ADV-mode text directly after NVL-mode text."], "config.clear_layers": ["config", "config.clear_layers", " = []", "", "var", "A list of names of layers to clear when entering the main and game menus."], "config.enter_replay_transition": ["config", "config.enter_replay_transition", " = None", "", "var", "If not None, a transition that is used when entering a replay."], "config.history_callbacks": ["config", "config.history_callbacks", " = [ ... ]", "", "var", "This contains a list of callbacks that are called before Ren'Py adds a new object to _history_list. The callbacks are called with the new HistoryEntry object as the first argument, and can add new fields to that object.\n\nRen'Py uses history callbacks internally, so creators should append their own callbacks to this list, rather than replacing it entirely."], "config.enable_language_autodetect": ["config", "config.enable_language_autodetect", " = False", "", "var", "If true, Ren'Py will attempt to determine the name of the language to use based on the locale of the player's system. If successful, this language will be used as the default language."], "config.say_menu_text_filter": ["config", "config.say_menu_text_filter", " = None", "", "var", "If not None, then this is a function that is given the text found in strings in the :ref:`say ` and :ref:`menu ` statements. It is expected to return new (or the same) strings to replace them."], "config.archives": ["config", "config.archives", " = [ ]", "", "var", "A list of archive files that will be searched for images and other data. The entries in this should consist of strings giving the base names of archive files, without the .rpa extension.\n\nThe archives are searched in the order they are found in this list. A file is taken from the first archive it is found in.\n\nAt startup, Ren'Py will automatically populate this variable with the names of all archives found in the game directory, sorted in reverse ascii order. For example, if Ren'Py finds the files data.rpa, patch01.rpa, and patch02.rpa, this variable will be populated with ``['patch02', 'patch01', 'data']``."], "config.imagemap_auto_function": ["config", "config.imagemap_auto_function", " = ...", "", "var", "A function that expands the `auto` property of a screen language :ref:`imagebutton ` or :ref:`imagemap ` statement into a displayable. It takes the value of the auto property, and the desired image, one of: \\insensitive\\, \\idle\\, \\hover\\, \\selected_idle\\, \\selected_hover\\, or \\ground\\. It should return a displayable or None.\n\nThe default implementation formats the `auto` property with the desired image, and then checks if the computed filename exists."], "config.layer_clipping": ["config", "config.layer_clipping", " = { }", "", "var", "Controls layer clipping. This is a map from layer names to (x, y, height, width) tuples, where x and y are the coordinates of the upper-left corner of the layer, with height and width giving the layer size.\n\nIf a layer is not mentioned in config.layer_clipping, then it is assumed to take up the full screen."], "config.skip_sounds": ["config", "config.skip_sounds", " = False", "", "var", "If False, non-looping audio will not be played when Ren'Py is skipping."], "config.version": ["config", "config.version", " = \"\"", "", "var", "This should be a string giving the version of the game. This is included as part of tracebacks and other log files, helping to identify the version of the game being used."], "config.nearest_neighbor": ["config", "config.nearest_neighbor", " = False", "", "var", "Uses nearest-neighbor filtering by default, to support pixel art or melting players' eyes."], "config.idle_gc_count": ["config", "config.idle_gc_count", " = 2500", "", "var", "The net number of objects that triggers a collection when Ren'Py has reached a steady state. (The fourth frame or later after the screen has been updated.)"], "config.allow_screensaver": ["config", "config.allow_screensaver", " = True", "", "var", "If True, the screensaver may activite while the game is running. If False, the screensaver is disabled."], "config.gc_print_unreachable": ["config", "config.gc_print_unreachable", " = False", "", "var", "If True, Ren'Py will print to its console and logs information about the objects that are triggering collections."], "config.longpress_vibrate": ["config", "config.longpress_vibrate", " = .1", "", "var", "The amount of time the device will vibrate for after a longpress."], "config.say_arguments_callback": ["config", "config.say_arguments_callback", " = None", "", "var", "If not None, this should be a function that takes the speaking character, followed by positional and keyword arguments. It's called whenever a say statement occurs with the arguments to that say statement. This always includes an interact argument, and can include others provided in the say statement.\n\nThis should return a pair, containing a tuple of positional arguments (almost always empty), and a dictionary of keyword arguments (almost always with at least interact in it).\n\nFor example\n```\ndef say_arguments_callback(who, interact=True, color=\\#fff\\):\nreturn (), { \\interact\\ : interact, \\what_color\\ : color }\n\nconfig.say_arguments_callback = say_arguments_callback\n\n```"], "config.adjust_view_size": ["config", "config.adjust_view_size", " = None", "", "var", "If not None, this should be a function taking two arguments, the width and height of the physical window. It is expected to return a tuple giving the width and height of the OpenGL viewport, the portion of the screen that Ren'Py will draw pictures to.\n\nThis can be used to configure Ren'Py to only allow certain sizes of screen. For example, the following allows only integer multiples of the original screen size\n```\ninit python:\n\ndef force_integer_multiplier(width, height):\nmultiplier = min(width / config.screen_width, height / config.screen_height)\nmultiplier = max(int(multiplier), 1)\nreturn (multiplier * config.screen_width, multiplier * config.screen_height)\n\nconfig.adjust_view_size = force_integer_multiplier\n\n```"], "config.language": ["config", "config.language", " = None", "", "var", "If not None, this should be a string giving the default language that the game is translated into by the translation framework."], "config.profile": ["config", "config.profile", " = False", "", "var", "If set to True, some profiling information will be output to stdout."], "config.game_menu_music": ["config", "config.game_menu_music", " = None", "", "var", "If not None, a music file to play when at the game menu."], "config.enter_sound": ["config", "config.enter_sound", " = None", "", "var", "If not None, this is a sound file that is played when entering the game menu."], "config.side_image_change_transform": ["side_image", "config.side_image_change_transform", " = None", "", "var", "If not None, a transform that is used when the new side image does not share the name image tag (or one of the new or old side images does not exist)."], "config.window_icon": ["config", "config.window_icon", " = None", "", "var", "If not None, this is expected to be the filename of an image giving an icon that is used for the game's main window. This does not set the icon used by windows executables and mac apps, as those are controlled by :ref:`special-files`."], "config.side_image_prefix_tag": ["side_image", "config.side_image_prefix_tag", " = 'side'", "", "var", "The prefix that is used when searching for a side image."], "config.menu_window_subtitle": ["config", "config.menu_window_subtitle", " = \"\"", "", "var", "The :var:`_window_subtitle` variable is set to this value when entering the main or game menus."], "config.loadable_callback": ["config", "config.loadable_callback", " = None", "", "var", "When not None, a function that's called with a filename. It should return True if the file is loadable, and False if not. This can be used with :var:`config.file_open_callback` or :var:`config.missing_image_callback`."], "config.mouse_hide_time": ["config", "config.mouse_hide_time", " = 30", "", "var", "The mouse is hidden after this number of seconds has elapsed without any mouse input. This should be set to longer than the expected time it will take to read a single screen, so mouse users will not experience the mouse appearing then disappearing between clicks.\n\nIf None, the mouse will never be hidden."], "config.gestures": ["gesture", "config.gestures", " = { \"n_s_w_e_w_e\" : \"progress_screen\" }", "", "var", "A map from gesture to the event activated by the gesture."], "config.replace_text": ["config", "config.replace_text", " = None", "", "var", "If not None, a function that is called with a single argument, a text to be displayed to the user. The function can return the same text it was passed, or a replacement text that will be displayed instead.\n\nThe function is called after substitutions have been performed and after the text has been split on tags, so its argument contains nothing but actual text. All displayed text passes through the function: not only dialogue text, but also user interface text.\n\nThis can be used to replace specific ASCII sequences with corresponding Unicode characters, as demonstrated by the following\n```\ndef replace_text(s):\ns = s.replace(\\'\\, u'\\u2019') # apostrophe\ns = s.replace('--', u'\\u2014') # em dash\ns = s.replace('...', u'\\u2026') # ellipsis\nreturn s\nconfig.replace_text = replace_text\n\n```"], "config.screen_width": ["config", "config.screen_width", " = 800", "", "var", "The width of the screen. Usually set by :func:`gui.init`."], "config.cache_surfaces": ["config", "config.cache_surfaces", " = False", "", "var", "If True, the underlying data of an image is stored in RAM, allowing image manipulators to be applied to that image without reloading it from disk. If False, the data is dropped from the cache, but kept as a texture in video memory, reducing RAM usage."], "config.custom_text_tags": ["custom_text_tags", "config.custom_text_tags", "", "", "var", "Maps text tag names to text tag functions, when the text tag can wrap other text."], "config.predict_statements": ["config", "config.predict_statements", " = 32", "", "var", "This is the number of statements, including the current one, to consider when doing predictive image loading. A breadth-first search from the current statement is performed until this number of statements is considered, and any image referenced in those statements is potentially predictively loaded. Setting this to 0 will disable predictive loading of images."], "config.play_channel": ["config", "config.play_channel", " = \"audio\"", "", "var", "The name of the audio channel used by :func:`renpy.play`, :propref:`hover_sound`, and :propref:`activate_sound`."], "config.transform_uses_child_position": ["config", "config.transform_uses_child_position", " = True", "", "var", "If True, transforms will inherit :ref:`position properties ` from their child. If not, they won't."], "config.after_load_callbacks": ["config", "config.after_load_callbacks", " = [ ... ]", "", "var", "A list of functions that are called (with no arguments) when a load occurs."], "config.save_physical_size": ["config", "config.save_physical_size", " = True", "", "var", "If True, the physical size of the window will be saved in the preferences, and restored when the game resumes."], "config.say_attribute_transition": ["config", "config.say_attribute_transition", " = None", "", "var", "If not None, a transition to use when the image is changed by a say statement with image attributes."], "config.lint_hooks": ["config", "config.lint_hooks", " = ...", "", "var", "This is a list of functions that are called, with no arguments, when lint is run. The functions are expected to check the script data for errors, and print any they find to standard output (using the Python ``print`` statement is fine in this case)."], "config.side_image_same_transform": ["side_image", "config.side_image_same_transform", " = None", "", "var", "If not None, a transform that is used when the new side image shares the same image tag as the previous side image."], "config.context_copy_remove_screens": ["config", "config.context_copy_remove_screens", " = [ 'notify' ]", "", "var", "Contains a list of screens that are removed when a context is copied for rollback or saving."], "config.sound": ["config", "config.sound", " = True", "", "var", "If True, sound works. If False, the sound/mixer subsystem is completely disabled."], "config.searchpath": ["config", "config.searchpath", " = [ 'common', 'game' ]", "", "var", "A list of directories that are searched for images, music, archives, and other media, but not scripts. This is initialized to a list containing \\common\\ and the name of the game directory."], "config.window": ["config", "config.window", " = None", "", "var", "This controls the default method of dialogue window management. If not None, this should be one of \\show\\, \\hide\\, or \\auto\\.\n\nWhen set to \\show\\, the dialogue window is shown at all times. When set to \\hide\\, the dialogue window is hidden when not in a say statement or other statement that displays dialogue. When set to \\auto\\, the dialogue window is hidden before scene statements, and shown again when dialogue is shown.\n\nThis sets the default. Once set, the default can be changed using the ``window show``, ``window hide`` and ``window auto`` statements. See :ref:`dialogue-window-management` for more information."], "config.window_auto_hide": ["config", "config.window_auto_hide", " = [ 'scene', 'call screen', 'menu', \"say-centered\" ]", "", "var", "A list of statements that cause ``window auto`` to hide the empty dialogue window."], "config.say_layer": ["config", "config.say_layer", " = \"screens\"", "", "var", "The layer the say screen is shown on."], "config.exit_replay_transition": ["config", "config.exit_replay_transition", " = None", "", "var", "If not None, a transition that is used when exiting a replay."], "config.autosave_on_input": ["config", "config.autosave_on_input", " = True", "", "var", "If True, Ren'Py will autosave when the user inputs text. (When :func:`renpy.input` is called.)"], "config.default_sfx_volume": ["preferences", "config.default_sfx_volume", " = 1.0", "", "var", "The default volume of the sfx mixer, which is used for the sound audio channel. This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.developer": ["config", "config.developer", " = \"auto\"", "", "var", "If set to True, developer mode is enabled. Developer mode gives access to the shift+D developer menu, shift+R reloading, and various other features that are not intended for end users.\n\nThis can be True, False, or \\auto\\. If \\auto\\, Ren'Py will detect if the game has been packaged into a distribution, and set config.developer as appropriate."], "config.intra_transition": ["config", "config.intra_transition", " = None", "", "var", "The transition that is used between screens of the game menu."], "config.end_game_transition": ["config", "config.end_game_transition", " = None", "", "var", "The transition that is used to display the main menu after the game ends normally, either by invoking return with no place to return to, or by calling :func:`renpy.full_restart`."], "config.narrator_menu": ["config", "config.narrator_menu", " = False", "", "var", "(This is set to True by the default screens.rpy file.) If true, then narration inside a menu is displayed using the narrator character. Otherwise, narration is displayed as captions within the menu itself."], "config.nvl_paged_rollback": ["nvl_mode", "config.nvl_paged_rollback", " = False", "", "var", "If true, NVL-mode rollback will occur a full page at a time."], "config.after_replay_callback": ["config", "config.after_replay_callback", " = None", "", "var", "If not None, a function that is called with no arguments after a replay completes."], "config.movie_mixer": ["config", "config.movie_mixer", " = \"music\"", "", "var", "The mixer that is used when a :func:`Movie` automatically defines a channel for video playback."], "config.keep_running_transform": ["config", "config.keep_running_transform", " = True", "", "var", "If True, showing an image without supplying a transform or ATL block will cause the image to continue the previous transform an image with that tag was using, if any. If False, the transform is stopped."], "config.mouse": ["config", "config.mouse", " = None", "", "var", "This variable controls the use of user-defined mouse cursors. If None, the system mouse is used, which is usually a black-and-white mouse cursor.\n\nOtherwise, this should be a dictionary giving the mouse animations for various mouse types. Keys used by the default library include \\default\\, \\say\\, \\with\\, \\menu\\, \\prompt\\, \\imagemap\\, \\pause\\, \\mainmenu\\, and \\gamemenu\\. The \\default\\ key should always be present, as it is used when a more specific key is absent.\n\nEach value in the dictionary should be a list of (`image`, `xoffset`, `yoffset`) tuples, representing frames.\n\n`image` The mouse cursor image. The maximum size for this image varies based on the player's hardware. 32x32 is guaranteed to work everywhere, while 64x64 works on most hardware. Larger images may not work.\n\n`xoffset` The offset of the hotspot pixel from the left side of the cursor.\n\n`yoffset` The offset of the hotspot pixel from the top of the cursor.\n\nThe frames are played back at 20Hz, and the animation loops after all frames have been shown."], "config.game_main_transition": ["config", "config.game_main_transition", " = None", "", "var", "The transition that is used to display the main menu after leaving the game menu. This is used when the load and preferences screens are invoked from the main menu, and it's also used when the user picks \\Main Menu\\ from the game menu."], "config.file_open_callback": ["config", "config.file_open_callback", " = None", "", "var", "If not None, this is a function that is called with the file name when a file needs to be opened. It should return a file-like object, or None to load the file using the usual Ren'Py mechanisms. Your file-like object must implement at least the read, seek, tell, and close methods.\n\nOne may want to also define a :var:`config.loadable_callback` that matches this."], "config.per_frame_screens": ["config", "config.per_frame_screens", " = [ ... ]", "", "var", "This is a list of strings giving the name of screens that are updated once per frame, rather than once per interaction. Ren'Py uses this internally, so if you add a screen, append the name rather than replacing the list in its entirety."], "config.mouse_displayable": ["config", "config.mouse_displayable", " = None", "", "var", "If not None, this should either be a displayable, or a callable that returns a displayable. The callable may return None, in which case Ren'Py proceeds if the displayable is None.\n\nIf a displayable is given, the mouse cursor is hidden, and the displayable is shown above anything else. This displayable is responsible for positioning and drawing a sythetic mouse cursor, and so should probably be a :func:`MouseDisplayable` or something very similar."], "config.skip_delay": ["config", "config.skip_delay", " = 75", "", "var", "The amount of time that dialogue will be shown for, when skipping statements using ctrl, in milliseconds. (Although it's nowhere near that precise in practice.)"], "config.nvl_page_ctc": ["nvl_mode", "config.nvl_page_ctc", " = None", "", "var", "If not None, this is the click-to-continue indicator that is used for NVL mode characters that are at the end of a page. (That is, immediately followed by an nvl clear statement.) This replaces the ctc parameter of :func:`Character`."], "config.screenshot_pattern": ["config", "config.screenshot_pattern", " = \"screenshot%04d.png\"", "", "var", "The pattern used to create screenshot files. This pattern is applied (using Python's %-formatting rules) to the natural numbers to generate a sequence of filenames. The filenames may be absolute, or relative to config.renpy_base. The first filename that does not exist is used as the name of the screenshot.\n\nDirectories are created if they do not exist.\n\nSee also :var:`_screenshot_pattern`, which is used in preference to this variable if not None."], "config.controller_blocklist": ["config", "config.controller_blocklist", " = [ ... ]", "", "var", "A list of strings, where each string is matched against the GUID of a game controller. These strings are mached as a prefix to the controller GUID (which cand be found in log.txt), and if matched, prevent the controller from being initialized."], "config.locale_to_language_function": ["config", "config.locale_to_language_function", " = ...", "", "var", "A function that determines the language the game should use, based on the the user's locale. It takes 2 string arguments that give the ISO code of the locale and the ISO code of the region.\n\nIt should return a string giving the name of a translation to use, or None to use the default translation."], "config.overlay_screens": ["config", "config.overlay_screens", " = [ ... ]", "", "var", "A list of screens that are displayed when the overlay is enabled, and hidden when the overlay is suppressed. (The screens are shown on the screens layer, not the overlay layer.)"], "config.afm_characters": ["config", "config.afm_characters", " = 250", "", "var", "The number of characters in a string it takes to cause the amount of time specified in the auto forward mode preference to be delayed before auto-forward mode takes effect."], "config.adv_nvl_transition": ["config", "config.adv_nvl_transition", " = None", "", "var", "A transition that is used when showing NVL-mode text directly after ADV-mode text."], "config.window_hide_transition": ["config", "config.window_hide_transition", " = None", "", "var", "The transition used by the window hide statement when no transition has been explicitly specified."], "config.keep_side_render_order": ["config", "config.keep_side_render_order", " = True", "", "var", "If True, the order of substrings in the Side positions will be determine the order of children render."], "config.gl2": ["model", "config.gl2", " = False", "", "var", "If true, Ren'Py will default to using a model-based renderer."], "config.imagemap_cache": ["config", "config.imagemap_cache", " = True", "", "var", "If True, imagemap hotspots will be cached to PNG files, reducing time and memory usage, but increasing the size of the game on disk. Set this to False to disable this behavior."], "config.longpress_duration": ["config", "config.longpress_duration", " = 0.5", "", "var", "The amount of time the player must press the screen for a longpress to be recognized on a touch device."], "config.rollback_enabled": ["config", "config.rollback_enabled", " = True", "", "var", "Should the user be allowed to rollback the game? If set to False, the user cannot interactively rollback."], "config.longpress_radius": ["config", "config.longpress_radius", " = 15", "", "var", "The number of pixels the touch must remain within for a press to be recognized as a longpress."], "config.defer_styles": ["config", "config.defer_styles", " = False", "", "var", "When true, the execution of style statements is deferred until after all ``translate python`` blocks have executed. This lets a ``translate python`` block update variables that are then used in style (not translate style) statements.\n\nWhile this defaults to False, it's set to True when :func:`gui.init` is called."], "config.descriptive_text_character": ["self_voicing", "config.descriptive_text_character", " = None", "", "var", "If not None, this should be a character object that is used to display the descriptive text."], "config.side_image_only_not_showing": ["side_image", "config.side_image_only_not_showing", " = False", "", "var", "When set to true, the side image will only show if an image with that tag is not already being shown on the screen."], "config.say_allow_dismiss": ["config", "config.say_allow_dismiss", " = None", "", "var", "If not None, this should be a function. The function is called with no arguments when the user attempts to dismiss a :ref:`say statement `. If this function returns True, the dismissal is allowed, otherwise it is ignored."], "config.missing_label_callback": ["config", "config.missing_label_callback", " = None", "", "var", "If not None, this function is called when Ren'Py attempts to access a label that does not exist in the game. The callback should take a single parameter, the name of the missing label. It should return the name of a label to use as a replacement for the missing label, or None to cause Ren'Py to raise an exception."], "config.game_menu": ["config", "config.game_menu", " = [ ... ]", "", "var", "This is used to customize the choices on the game menu. Please read Main and Game Menus for more details on the contents of this variable.\n\nThis is not used when the game menu is defined using screens."], "config.all_character_callbacks": ["config", "config.all_character_callbacks", " = [ ]", "", "var", "A list of callbacks that are called by all characters. This list is prepended to the list of character-specific callbacks."], "config.autosave_frequency": ["config", "config.autosave_frequency", " = 200", "", "var", "Roughly, the number of interactions that will occur before an autosave occurs. To disable autosaving, set :var:`config.has_autosave` to False, don't change this variable."], "config.nvl_page_ctc_position": ["nvl_mode", "config.nvl_page_ctc_position", " = \"nestled\"", "", "var", "If not None, this is the click-to-continue indicator position that is used for NVL mode characters that are at the end of a page. (That is, immediately followed by an nvl clear statement.) This replaces the ctc_position parameter of :func:`Character`."], "config.default_music_volume": ["preferences", "config.default_music_volume", " = 1.0", "", "var", "The default volume of the music mixer, which is used for the music and movie audio channels. This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.minimum_presplash_time": ["config", "config.minimum_presplash_time", " = 0.0", "", "var", "The minimum amount of time, in seconds, a presplash, Android presplash, or iOS LaunchImage is displayed for. If Ren'Py initializes before this amount of time has been reached, it will sleep to ensure the image is shown for at least this amount of time. The image may be shown longer if Ren'Py takes longer to start up."], "config.overlay_functions": ["config", "config.overlay_functions", " = [ ]", "", "var", "A list of functions. When called, each function is expected to use ui functions to add displayables to the overlay layer."], "config.reload_modules": ["config", "config.reload_modules", " = [ ]", "", "var", "A list of strings giving the names of python modules that should be reloaded along with the game. Any submodules of these modules will also be reloaded."], "config.quit_callbacks": ["config", "config.quit_callbacks", " = ...", "", "var", "A list of functions that are called (without any arguments) when Ren'Py terminates. This is intended to free resources, such as opened files or started threads."], "config.context_callback": ["config", "config.context_callback", " = None", "", "var", "This is a callback that is called when Ren'Py enters a new context, such as a menu context."], "config.pause_after_rollback": ["config", "config.pause_after_rollback", " = False", "", "var", "If False, the default, rolling back will skip any pauses (timed or not) and stop only at other interactions such as dialogues, menus... If True, renpy will include timeless pauses to the valid places a rollback can take the user."], "config.image_cache_size_mb": ["config", "config.image_cache_size_mb", " = 300", "", "var", "This is used to set the size of the :ref:`image cache `, in megabytes. If :var:`config.cache_surfaces` is False, an image takes 4 bytes per pixel, otherwise it takes 8 bytes per pixel.\n\nIf set too large, this can waste memory. If set too small, images can be repeatedly loaded, hurting performance. If not none, :var:`config.image_cache_size` is used instead of this variable."], "config.name": ["config", "config.name", " = \"\"", "", "var", "This should be a string giving the name of the game. This is included as part of tracebacks and other log files, helping to identify the version of the game being used."], "config.nvl_list_length": ["nvl_mode", "config.nvl_list_length", " = None", "", "var", "If not None, the maximum length of the the list of NVL dialogue. This can be set (often in conjuction with forcing the dialogue to have a fixed height) in order to emulate an infinite scrolling NVL window."], "config.emphasize_audio_volume": ["config", "config.emphasize_audio_volume", " = 0.5", "", "var", "See above."], "config.mipmap_dissolves": ["config", "config.mipmap_dissolves", " = False", "", "var", "The default value of the mipmap argument to :func:`Dissolve`, :func:`ImageDissolve`, :func:`AlphaDissolve`, and :func:`AlphaMask`."], "config.missing_image_callback": ["config", "config.missing_image_callback", " = None", "", "var", "If not None, this function is called when an attempt to load an image fails. It may return None, or it may return an image manipulator. If an image manipulator is returned, that image manipulator is loaded in the place of the missing image.\n\nOne may want to also define a :var:`config.loadable_callback`, especially if this is used with a :func:`DynamicImage`."], "config.implicit_with_none": ["config", "config.implicit_with_none", " = True", "", "var", "If True, then by default the equivalent of a :ref:`with None ` statement will be performed after interactions caused by dialogue, menus input, and imagemaps. This ensures that old screens will not show up in transitions."], "config.disable_input": ["config", "config.disable_input", " = False", "", "var", "When true, :func:`renpy.input` terminates immediately and returns its `default` argument."], "config.afm_voice_delay": ["config", "config.afm_voice_delay", " = .5", "", "var", "The number of seconds after a voice file finishes playing before AFM can advance text."], "config.keymap": ["config", "config.keymap", " = dict(...)", "", "var", "This variable contains a keymap giving the keys and mouse buttons assigned to each possible operation. Please see the section on Keymaps for more information."], "config.auto_choice_delay": ["config", "config.auto_choice_delay", " = None", "", "var", "If not None, this variable gives a number of seconds that Ren'Py will pause at an in-game menu before picking a random choice from that menu. We'd expect this variable to always be set to None in released games, but setting it to a number will allow for automated demonstrations of games without much human interaction."], "config.profile_init": ["config", "config.profile_init", " = 0.25", "", "var", "``init`` and ``init python`` blocks taking longer than this amount of time to run are reported to log file."], "config.load_before_transition": ["config", "config.load_before_transition", " = True", "", "var", "If True, the start of an interaction will be delayed until all images used by that interaction have loaded. (Yeah, it's a lousy name.)"], "config.save_on_mobile_background": ["config", "config.save_on_mobile_background", " = True", "", "var", "If True, the mobile app will save its state when it loses focus. The state is saved in a way that allows it to be automatically loaded (and the game to resume its place) when the app starts again."], "config.hide": ["config", "config.hide", " = renpy.hide", "", "var", "A function that is called when the :ref:`hide statement ` is executed. This should take the same arguments as renpy.hide."], "config.auto_channels": ["config", "config.auto_channels", " = { \"audio\" : ( \"sfx\", \"\", \"\" ) }", "", "var", "This is used to define automatic audio channels. It's a map the channel name to a tuple containing 3 components:\n\n* The mixer the channel uses. * A prefix that is given to files played on the channel. * A suffix that is given to files played on the channel."], "config.exit_yesno_transition": ["config", "config.exit_yesno_transition", " = None", "", "var", "If not None, a transition that is used when exiting the yes/no prompt screen."], "config.audio_filename_callback": ["config", "config.audio_filename_callback", " = None", "", "var", "If not None, this is a function that is called with an audio filename, and is expected to return a second audio filename, the latter of which will be played.\n\nThis is intended for use when an a games has audio file formats changed, but it's not destired to update the game script."], "config.conditionswitch_predict_all": ["config", "config.conditionswitch_predict_all", " = False", "", "var", "The default value of the predict_all argument for :func:`ConditionSwitch` and :func:`ShowingSwitch`, which determines if all possible displayables are shown."], "config.tag_layer": ["config", "config.tag_layer", " = { }", "", "var", "A dictionary mapping image tag strings to layer name strings. When an image is shown without a specific layer name, the image's tag is looked up in this dictionary to get the layer to show it on. If the tag is not found here, :var:`config.default_tag_name` is used."], "config.save_directory": ["config", "config.save_directory", " = \"...\"", "", "var", "This is used to generate the directory in which games and persistent information are saved. The name generated depends on the platform:\n\nWindows %APPDATA%/RenPy/`save_directory`\n\nMac OS X ~/Library/RenPy/`save_directory`\n\nLinux/Other ~/.renpy/`save_directory`\n\nSetting this to None creates a \\saves\\ directory underneath the game directory. This is not recommended, as it prevents the game from being shared between multiple users on a system. It can also lead to problems when a game is installed as Administrator, but run as a user.\n\nThis must be set with either the define statement, or in a ``python early`` block. In either case, this will be run before any other statement, and so it should be set to a string, not an expression.\n\nTo locate the save directory, read :var:`config.savedir` instead of this variable."], "config.label_callback": ["config", "config.label_callback", " = None", "", "var", "If not None, this is a function that is called whenever a label is reached. It is called with two parameters. The first is the name of the label. The second is True if the label was reached through jumping, calling, or creating a new context, and False otherwise."], "config.allow_underfull_grids": ["config", "config.allow_underfull_grids", " = False", "", "var", "If True, Ren'Py will not require grids to be full in order to display."], "config.thumbnail_width": ["config", "config.thumbnail_width", " = 100", "", "var", "The width of the thumbnails that are taken when the game is saved. These thumbnails are shown when the game is loaded. Please note that the thumbnail is shown at the size it was taken at, rather than the value of this setting when the thumbnail is shown to the user.\n\nThis is changed by the default GUI."], "config.steam_appid": ["achievement", "config.steam_appid", " = None", "", "var", "If not None, this should be the Steam appid. Ren'Py will automatically set this appid when it starts. This needs to be set using the define statement\n\ndefine config.steam_appid = 12345"], "config.input_caret_blink": ["config", "config.input_caret_blink", " = 1.0", "", "var", "If not False, sets the blinking period of the default caret, in seconds."], "config.main_menu_music_fadein": ["config", "config.main_menu_music_fadein", " = 0.0", "", "var", "The number of seconds to take to fade in :var:`config.main_menu_music`."], "config.exit_sound": ["config", "config.exit_sound", " = None", "", "var", "If not None, this is a sound file that is played when exiting the game menu."], "config.overlay_layers": ["config", "config.overlay_layers", " = [ 'overlay' ]", "", "var", "This is a list of all of the overlay layers. Overlay layers are cleared before the overlay functions are called. \\overlay\\ should always be in this list."], "config.character_callback": ["config", "config.character_callback", " = None", "", "var", "The default value of the callback parameter of Character."], "config.has_autosave": ["config", "config.has_autosave", " = True", "", "var", "If true, the game will autosave. If false, no autosaving will occur."], "config.context_fadein_music": ["config", "config.context_fadein_music", " = 0", "", "var", "The amount of time in seconds Ren'Py spends fading in music when the music is played due to a context change. (Usually, when the game is loaded.)"], "config.python_callbacks": ["config", "config.python_callbacks", " = [ ]", "", "var", "A list of functions. The functions in this list are called, without any arguments, whenever a Python block is run outside of the init phase.\n\nOne possible use of this would be to have a function limit a variable to within a range each time it is adjusted.\n\nThe functions may be called while Ren'Py is starting up, before the start of the game proper, and potentially before the variables the function depends on are initialized. The functions are required to deal with this, perhaps by using ``hasattr(store, 'varname')`` to check if a variable is defined."], "config.skip_indicator": ["config", "config.skip_indicator", " = True", "", "var", "If True, the library will display a skip indicator when skipping through the script."], "config.side_image_null": ["side_image", "config.side_image_null", " = Null()", "", "var", "The Null displayable to use when not displaying a side image. This be changed, but only to other Null objects. One reason for doing so would be to set the side of the Null (eg. ``Null(width=200, height=150)``) to prevent dissolves from being cut off."], "config.exit_transition": ["config", "config.exit_transition", " = None", "", "var", "If not None, this variable should give a transition that will be performed when exiting the game menu."], "config.adjust_attributes": ["config", "config.adjust_attributes", " = { }", "", "var", "If not None, this is a dictionary. When a statement or function that contains image attributes executes or is predicted, the tag is looked up in this dictionary. If it is not found, the None key is looked up in this dictionary.\n\nIf either is found, they're expected to be a function. The function is given an image name, a tuple consisting of the tag and any attributes. It should return an adjusted tuple, which contains and a potential new set of attributes.\n\nAs this function may be called during prediction, it should not rely on the image's state."], "config.label_overrides": ["config", "config.label_overrides", " = { }", "", "var", "This variable gives a way of causing jumps and calls of labels in Ren'Py script to be redirected to other labels. For example, if you add a mapping from \\start\\ to \\mystart\\, all jumps and calls to \\start\\ will go to \\mystart\\ instead."], "config.variants": ["config", "config.variants", " = [ ... ]", "", "var", "A list of screen variants that are searched when choosing a screen to display to the user. This should always end with None, to ensure that the default screens are chosen. See :ref:`screen-variants`."], "config.log_live2d_loading": ["live2d", "config.log_live2d_loading", " = False", "", "var", "If True, loaded path and used motions and expressions will be written to log.txt on start."], "config.log_width": ["config", "config.log_width", " = 78", "", "var", "The width of lines logged when :var:`config.log` is used."], "config.window_overlay_functions": ["config", "config.window_overlay_functions", " = []", "", "var", "A list of overlay functions that are only called when the window is shown."], "config.rollback_length": ["config", "config.rollback_length", " = 128", "", "var", "When there are more than this many statements in the rollback log, Ren'Py will consider trimming the log. This also covers how many steps Ren'Py will rollback when trying to load a save when the script has changed.\n\nDecreasing this below the default value may cause Ren'Py to become unstable."], "config.sound_sample_rate": ["config", "config.sound_sample_rate", " = 48000", "", "var", "The sample rate that the sound card will be run at. If all of your wav files are of a lower rate, changing this to that rate may make things more efficient."], "config.return_not_found_label": ["config", "config.return_not_found_label", " = None", "", "var", "If not None, a label that is jumped to when a return site is not found. The call stack is cleared before this jump occurs."], "config.debug_image_cache": ["config", "config.debug_image_cache", " = False", "", "var", "If True, Ren'Py will write information about the :ref:`image cache ` to image_cache.txt."], "config.search_prefixes": ["config", "config.search_prefixes", " = [ \"\", \"images/\" ]", "", "var", "A list of prefixes that are prepended to filenames that are searched for."], "config.default_voice_volume": ["preferences", "config.default_voice_volume", " = 1.0", "", "var", "The default volume of the voice mixer, which is used for the voice audio channel (And hence the voice statement, auto-voice, etc.). This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.choice_layer": ["config", "config.choice_layer", " = \"screens\"", "", "var", "The layer the choice screen (used by the menu statement) is shown on."], "config.default_transform": ["config", "config.default_transform", " = ...", "", "var", "When a displayable is shown using the show or scene statements, the transform properties are taken from this transform and used to initialize the values of the displayable's transform.\n\nThe default transform is :var:`center`."], "config.tts_voice": ["config", "config.tts_voice", " = None", "", "var", "If not None, a string giving a non-default voice that is used to play back text-to-speech for self voicing. The possible choices are platform specific, and so this should be set in a platform-specific manner. (It may make sense to change this in translations, as well.)"], "config.say_sustain_callbacks": ["config", "config.say_sustain_callbacks", " = ...", "", "var", "A list of functions that are called, without arguments, before the second and later interactions caused by a line of dialogue with pauses in it. Used to sustain voice through pauses."], "config.say_attribute_transition_layer": ["config", "config.say_attribute_transition_layer", " = None", "", "var", "If not None, this must be a string giving the name of a layer. (Almost always \\master\\.) The say attribute is applied to the named layer, and Ren'Py will not pause to wait for the transition to occur. This will have the effect of transitioning in the attribute as dialogue is shown."], "config.character_id_prefixes": ["config", "config.character_id_prefixes", " = [ ]", "", "var", "This specifies a list of style property prefixes that can be given to a :func:`Character`. When a style prefixed with one of the given prefix is given, it is applied to the displayable with that prefix as its ID.\n\nFor example, the default GUI adds \\namebox\\ to this. When a Character is given the `namebox_background` property, it sets :propref:`background` on the displayable in the say screen with the id \\namebox\\."], "config.interact_callbacks": ["config", "config.interact_callbacks", " = ...", "", "var", "A list of functions that are called (without any arguments) when an interaction is started or restarted."], "config.replay_scope": ["config", "config.replay_scope", " = { \"_game_menu_screen\" : \"preferences\" }", "", "var", "A dictionary mapping variables in the default store to the values the variables will be given when entering a replay."], "config.window_show_transition": ["config", "config.window_show_transition", " = None", "", "var", "The transition used by the window show statement when no transition has been explicitly specified."], "config.dispatch_gesture": ["gesture", "config.dispatch_gesture", " = None", "", "var", "The function that is used to dispatch gestures. This function is passed the raw gesture string. If it returns non-None, the interaction ends. If this variable is None, a default dispatch function is used."], "config.load_failed_label": ["config", "config.load_failed_label", " = None", "", "var", "If a string, this is a label that is jumped to when a load fails because the script has changed so much that Ren'Py can't recover. Before performing the load, Ren'Py will revert to the start of the last statement, then it will clear the call stack.\n\nThis may also be a function. If it is, the function is called with no arguments, and is expected to return a string giving the label."], "config.savedir": ["config", "config.savedir", " = ...", "", "var", "The complete path to the directory in which the game is saved. This should only be set in a ``python early`` block. See also config.save_directory, which generates the default value for this if it is not set during a ``python early`` block."], "config.side_image_tag": ["side_image", "config.side_image_tag", " = None", "", "var", "If this is given, then the side image will track the given image tag, rather than the image associated with currently speaking character. For example,\n```\ndefine e = Character(\\Eileen\\, image=\\eileen\\)\n\ninit python:\n config.side_image_tag = \\eileen\\\n\nWill make the side image track the \\eileen\\ image tag, which is associated\nwith the ``e`` character.\n\n```"], "config.autosave_slots": ["config", "config.autosave_slots", " = 10", "", "var", "The number of slots used by autosaves."], "config.manage_gc": ["config", "config.manage_gc", " = True", "", "var", "If True, Ren'Py will manage the GC itself. This means that it will apply the settings below."], "config.hyperlink_protocol": ["config", "config.hyperlink_protocol", " = \"call_in_new_context\"", "", "var", "The protocol that is used for hyperlinks that do not have a protocol assigned to them. See :ref:`the a text tag ` for a description as to what the possible protocols mean."], "config.hyperlink_handlers": ["config", "config.hyperlink_handlers", " = { ... }", "", "var", "A dictionary mapping a hyperlink protocol to the handler for that protocol. A handler is a function that takes the value (everything after the :) and performs some action. If a value is returned, the interaction ends. Otherwise, the click is ignored and the interaction continues."], "config.focus_crossrange_penalty": ["config", "config.focus_crossrange_penalty", " = 1024", "", "var", "This is the amount of penalty to apply to moves perpendicular to the selected direction of motion, when moving focus with the keyboard."], "config.overlay_during_with": ["config", "config.overlay_during_with", " = True", "", "var", "True if we want overlays to be shown during :ref:`with statements `, or False if we'd prefer that they be hidden during the with statements."], "config.tag_transform": ["config", "config.tag_transform", " = { }", "", "var", "A dictionary mapping image tag strings to transforms or lists of transforms. When an image is newly-shown without an at clause, the image's tag is looked up in this dictionary to find a transform or list of transforms to use."], "config.save_dump": ["config", "config.save_dump", " = False", "", "var", "If set to True, Ren'Py will create the file save_dump.txt whenever it saves a game. This file contains information about the objects contained in the save file. Each line consists of a relative size estimate, the path to the object, information about if the object is an alias, and a representation of the object."], "config.gl_test_image": ["config", "config.gl_test_image", " = \"black\"", "", "var", "The name of the image that is used when running the OpenGL performance test. This image will be shown for 5 frames or .25 seconds, on startup. It will then be automatically hidden."], "config.periodic_callback": ["config", "config.periodic_callback", " = None", "", "var", "If not None, this should be a function. The function is called, with no arguments, at around 20Hz."], "config.quicksave_slots": ["config", "config.quicksave_slots", " = 10", "", "var", "The number of slots used by quicksaves."], "config.empty_window": ["config", "config.empty_window", " = ...", "", "var", "This is called when _window is True, and no window has been shown on the screen. (That is, no call to :func:`renpy.shown_window` has occurred.) It's expected to show an empty window on the screen, and return without causing an interaction.\n\nThe default implementation of this uses the narrator character to display a blank line without interacting."], "config.fast_skipping": ["config", "config.fast_skipping", " = False", "", "var", "Set this to True to allow fast skipping outside of developer mode."], "config.old_substitutions": ["config", "config.old_substitutions", " = False", "", "var", "If True, Ren'Py will apply old-style (percent) substitutions to text displayed by the :ref:`say ` and :ref:`menu ` statements."], "config.auto_voice": ["config", "config.auto_voice", " = None", "", "var", "This may be a string, a function, or None. If None, auto-voice is disabled.\n\nIf a string, this is formatted with the ``id`` variable bound to the identifier of the current line of dialogue. If this gives an existing file, that file is played as voice audio.\n\nIf a function, the function is called with a single argument, the identifier of the current line of dialogue. The function is expected to return a string. If this gives an existing file, that file is played as voice audio.\n\nSee :ref:`Automatic Voice ` for more details."], "config.auto_movie_channel": ["config", "config.auto_movie_channel", " = True", "", "var", "If True, and the `play` argument is give to :func:`Movie`, an audio channel name is automatically generated for each movie.\n\n:var:`config.single_movie_channel` takes precendece over this variable."], "config.gl_clear_color": ["config", "config.gl_clear_color", " = \"#000\"", "", "var", "The color that the window is cleared to before images are drawn. This is mainly seen as the color of the letterbox or pillarbox edges drawn when aspect ratio of the window or monitor in fullscreen mode) does not match the aspect ratio of the game."], "config.quit_on_mobile_background": ["config", "config.quit_on_mobile_background", " = False", "", "var", "If True, the mobile app will quit when it loses focus."], "config.pause_with_transition": ["config", "config.pause_with_transition", " = False", "", "var", "If false, :func:`renpy.pause` is always, used by the ``pause`` statement. If true, when given a delay, ``pause`` is equivalent to ``with Pause(...)``."], "config.menu_include_disabled": ["config", "config.menu_include_disabled", " = False", "", "var", "When this variable is set, choices disables with the if statement are included as disabled buttons."], "config.autosave_on_choice": ["config", "config.autosave_on_choice", " = True", "", "var", "If True, Ren'Py will autosave upon encountering an in-game choice. (When :func:`renpy.choice_for_skipping` is called.)"], "config.window_title": ["config", "config.window_title", " = None", "", "var", "The static portion of the title of the window containing the Ren'Py game. :var:`_window_subtitle` is appended to this to get the full title of the window.\n\nIf None, the default, this defaults to the value of :var:`config.name`."], "config.hard_rollback_limit": ["config", "config.hard_rollback_limit", " = 100", "", "var", "This is the number of steps that Ren'Py will let the user interactively rollback. Set this to 0 to disable rollback entirely, although we don't recommend that, as rollback is useful to let the user see text he skipped by mistake."], "config.screenshot_callback": ["config", "config.screenshot_callback", " = ...", "", "var", "A function that is called when a screenshot is taken. The function is called with a single parameter, the full filename the screenshot was saved as."], "config.help": ["config", "config.help", " = None", "", "var", "This controls the functionality of the help system invoked by the help button on the main and game menus, or by pressing F1 or Command-?.\n\nIf None, the help system is disabled and does not show up on menus. If a string corresponding to a label found in the script, that label is invoked in a new context. This allows you to define an in-game help-screen. Otherwise, this is interpreted as a filename relative to the base directory, that is opened in a web browser. If the file is not exist, the action is ignored."], "config.start_interact_callbacks": ["config", "config.start_interact_callbacks", " = ...", "", "var", "A list of functions that are called (without any arguments) when an interaction is started. These callbacks are not called when an interaction is restarted."], "config.new_translate_order": ["config", "config.new_translate_order", " = True", "", "var", "Enables the new order of style and translate statements introduced in :ref:`Ren'Py 6.99.11 `."], "config.automatic_images_strip": ["config", "config.automatic_images_strip", " = [ ]", "", "var", "A list of strings giving prefixes that are stripped out when defining automatic images. This can be used to remove directory names, when directories contain images."], "config.main_game_transition": ["config", "config.main_game_transition", " = None", "", "var", "The transition used when entering the game menu from the main menu, as is done when clicking \\Load Game\\ or \\Preferences\\."], "config.enter_yesno_transition": ["config", "config.enter_yesno_transition", " = None", "", "var", "If not None, a transition that is used when entering the yes/no prompt screen."], "config.font_replacement_map": ["config", "config.font_replacement_map", " = { }", "", "var", "This is a map from (font, bold, italics) to (font, bold, italics), used to replace a font with one that's specialized as having bold and/or italics. For example, if you wanted to have everything using an italic version of \\Vera.ttf\\ use \\VeraIt.ttf\\ instead, you could write\n```\ninit python:\nconfig.font_replacement_map[\\Vera.ttf\\, False, True] = (\\VeraIt.ttf\\, False, False)\n\nPlease note that these mappings only apply to specific variants of\na font. In this case, requests for a bold italic version of vera\nwill get a bold italic version of vera, rather than a bold version\nof the italic vera.\n\n```"], "config.image_cache_size": ["config", "config.image_cache_size", " = None", "", "var", "If not None, this is used to set the size of the :ref:`image cache `, as a multiple of the screen size. This number is multiplied by the size of the screen, in pixels, to get the size of the image cache in pixels.\n\nIf set too large, this can waste memory. If set too small, images can be repeatedly loaded, hurting performance."], "config.debug_text_overflow": ["config", "config.debug_text_overflow", " = False", "", "var", "When true, Ren'Py will log text overflows to text_overflow.txt. A text overflow occurs when a :class:`Text` displayable renders to a size larger than that allocated to it. By setting this to True and setting the :propref:`xmaximum` and :propref:`ymaximum` style properties of the dialogue window to the window size, this can be used to report cases where the dialogue is too large for its window."], "config.autoreload": ["config", "config.autoreload", " = True", "", "var", "If True, Shift+R will toggle automatic reloading. When automatic reloading is enabled, Ren'Py will reload the game whenever a used file is modified.\n\nIf False, Ren'Py will reload the game once per press of Shift+R."], "config.notify": ["config", "config.notify", " = ...", "", "var", "This is called by :func:`renpy.notify` or :func:`Notify` with a single `message` argument, to display the notification. The default implementation is :func:`renpy.display_notify`. This is intended to allow creators to intercept notifications."], "config.afm_callback": ["config", "config.afm_callback", " = None", "", "var", "If not None, a Python function that is called to determine if it is safe to auto-forward. The intent is that this can be used by a voice system to disable auto-forwarding when a voice is playing."], "config.optimize_texture_bounds": ["config", "config.optimize_texture_bounds", " = False", "", "var", "When True, Ren'Py will scan images to find the bounding box of the non-transparent pixels, and only load those pixels into a texture."], "config.nvl_layer": ["nvl_mode", "config.nvl_layer", " = \"screens\"", "", "var", "The layer the nvl screens are shown on."], "config.say_attribute_transition_callback": ["config", "config.say_attribute_transition_callback", " = ...", "", "var", "This is a function that return a transition to apply and a layer to apply it on\n\nThis should be a function that takes four arguments, the image tag being shown, a `mode` parameter, a `set` containing pre-transition tags and a `set` containing post-transition tags. Where the value of the `mode` parameter is one of:\n\n* \\permanent\\, for permanent attribute change (one that lasts longer than the current say statement). * \\temporary\\, for a temporary attribute change (one that is restored at the end of the current say statement). * \\both\\, for a simultaneous permanent and temporary attribute change (one that in part lasts longer than the current say statement, and in part is restored at the end of the current say statement). * \\restore\\, for when a temporary (or both) change is being restored.\n\nThis should return a 2-component tuple, consisting of:\n\n* The transition to use, or None if no transition should occur. * The layer the transition should be on, either a string or None. This is almost always None.\n\nThe default implementation of this returns (config.say_attribute_transition, config.say_attribute_transition_layer)."], "config.emphasize_audio_time": ["config", "config.emphasize_audio_time", " = 0.5", "", "var", "See above."], "config.gl_blend_func": ["model", "config.gl_blend_func", " = { ... }", "", "var", "A dictionaryt used to map a blend mode name to a blend function. The blend modes are suppled to the blend func property, given below."], "config.debug": ["config", "config.debug", " = False", "", "var", "Enables debugging functionality (mostly by turning some missing files into errors.) This should always be turned off in a release."], "config.hw_video": ["config", "config.hw_video", " = False", "", "var", "If true, hardware video playback will be used on mobile platforms. This may be faster, but only some formats are supported and only fullscreen video is available. If false, software playback will be used."], "config.gl_lod_bias": ["config", "config.gl_lod_bias", " = -0.5", "", "var", "The default value of the :ref:`u_lod_bias ` uniform, which controls the mipmap level Ren'Py uses."], "config.layers": ["config", "config.layers", " = [ 'master', 'transient', 'screens', 'overlay' ]", "", "var", "This variable gives a list of all of the layers that Ren'Py knows about, in the order that they will be displayed to the screen. (The lowest layer is the first entry in the list.) Ren'Py uses the layers \\master\\, \\transient\\, \\screens\\, and \\overlay\\ internally, so they should always be in this list."], "config.log": ["config", "config.log", " = None", "", "var", "If not None, this is expected to be a filename. Much of the text shown to the user by :ref:`say ` or :ref:`menu ` statements will be logged to this file."], "config.rollback_side_size": ["config", "config.rollback_side_size", " = .2", "", "var", "If the rollback side is enabled, the fraction of the screen on the rollback side that, when clicked or touched, causes a rollback to occur."], "config.window_auto_show": ["config", "config.window_auto_show", " = [ 'say', 'menu-with-caption' ]", "", "var", "A list of statements that cause ``window auto`` to show the empty dialogue window."], "config.start_callbacks": ["config", "config.start_callbacks", " = [ ... ]", "", "var", "A list of callbacks functions that are called with no arguments after the init phase, but before the game (including the splashscreen) starts. This is intended to be used by frameworks to initialize variables that will be saved.\n\nThe default value of this variable includes callbacks that Ren'Py uses internally to implement features such as nvl-mode. New callbacks can be appended to this list, but the existing callbacks should not be removed."], "config.transition_screens": ["config", "config.transition_screens", " = True", "", "var", "If True, screens will participate in transitions, dissolving from the old state of the screen to the new state of the screen. If False, only the latest state of the screen will be shown."], "config.main_menu": ["config", "config.main_menu", " = [ ... ]", "", "var", "The default main menu, when not using screens. For more details, see Main and Game Menus."], "config.emphasize_audio_channels": ["config", "config.emphasize_audio_channels", " = [ 'voice' ]", "", "var", "A list of strings giving audio channel names.\n\nIf the \\emphasize audio\\ preference is enabled, when one of the audio channels listed starts playing a sound, all channels that are not listed in this variable have their secondary audio volume reduced to :var:`config.emphasize_audio_volume` over :var:`config.emphasize_audio_time` seconds.\n\nWhen no channels listed in this variable are playing audio, all channels that are not listed have their secondary audio volume raised to 1.0 over :var:`config.emphasize_audio_time` seconds.\n\nFor example, setting this to ``[ 'voice' ]]`` will lower the volume of all non-voice channels when a voice is played."], "config.speaking_attribute": ["config", "config.speaking_attribute", " = None", "", "var", "If not None, this should be a string giving the name of an image attribute. The image attribute is added to the image when the character's image tag when the character is speaking, and removed when the character stops.\n\nThis is applied to the image on the default layer for the tag, which can be set using :var:`config.tag_layer`."], "config.translate_clean_stores": ["config", "config.translate_clean_stores", " = [ \"gui\" ]", "", "var", "A list of named stores that are cleaned to their state at the end of the init phase when the translation language changes."], "config.automatic_images": ["config", "config.automatic_images", " = None", "", "var", "If not None, this causes Ren'Py to automatically define images.\n\nWhen not set to None, this should be set to a list of separators. (For example, ``[ ' ', '_', '/' ]``.)\n\nRen'Py will scan through the list of files on disk and in archives. When it finds a file ending with .png or .jpg, it will strip the extension, then break the name at separators, to create an image name. If the name consists of at least two components, and no image with that name already is defined, Ren'Py will define that image to refer to a filename.\n\nWith the example list of separators, if your game directory contains:\n\n* eileen_happy.png, Ren'Py will define the image \\eileen happy\\. * lucy/mad.png, Ren'Py will define the image \\lucy mad\\. * mary.png, Ren'Py will do nothing. (As the image does not have two components.)"], "config.afm_bonus": ["config", "config.afm_bonus", " = 25", "", "var", "The number of bonus characters added to every string when auto-forward mode is in effect."], "config.mode_callbacks": ["config", "config.mode_callbacks", " = [ ... ]", "", "var", "A list of callbacks called when entering a mode. For more documentation, see the section on :ref:`Modes`.\n\nThe default value includes a callback that implements :var:`config.adv_nvl_transition` and :var:`config.nvl_adv_transition`."], "config.transient_layers": ["config", "config.transient_layers", " = [ 'transient' ]", "", "var", "This variable gives a list of all of the transient layers. Transient layers are layers that are cleared after each interaction. \\transient\\ should always be in this list."], "config.gc_thresholds": ["config", "config.gc_thresholds", " = (25000, 10, 10)", "", "var", "The GC thresholds that Ren'Py uses when not idle. These are set to try to ensure that garbage collection doesn't happen. The three numbers are:\n\n* The net number of objects that need to be allocated before a level-0 collection. * The number of level-0 collections that trigger a level-1 collection. * The number of level-1 collections that trigger a level-2 collection.\n\n(Level-0 collections should be fast enough to not cause a frame drop, level-1 collections might, level-2 will.)"], "config.fix_rollback_without_choice": ["config", "config.fix_rollback_without_choice", " = False", "", "var", "This option determines how the built in menus or imagemaps behave during fixed rollback. The default value is False, which means that menu only the previously selected option remains clickable. If set to True, the selected option is marked but no options are clickable. The user can progress forward through the rollback buffer by clicking."], "config.mipmap_movies": ["config", "config.mipmap_movies", " = False", "", "var", "The default value of the mipmap argument to :func:`Movie`."], "config.screenshot_crop": ["config", "config.screenshot_crop", " = None", "", "var", "If not None, this should be a (`x`, `y`, `height`, `width`) tuple. Screenshots are cropped to this rectangle before being saved."], "config.quit_action": ["config", "config.quit_action", " = ...", "", "var", "The action that is called when the user clicks the quit button on a window. The default action prompts the user to see if he wants to quit the game."], "config.thumbnail_height": ["gui", "config.thumbnail_height", " = 216", "", "var", "The width and height of the save thumbnails. Note that these live in the config namespace, not the gui namespace. These do not take effect until the file is saved and loaded."], "config.context_fadeout_music": ["config", "config.context_fadeout_music", " = 0", "", "var", "The amount of time in seconds Ren'Py spends fading out music when the music is played due to a context change. (Usually, when the game is loaded.)"], "config.top_layers": ["config", "config.top_layers", " = [ ]", "", "var", "This is a list of names of layers that are displayed above all other layers, and do not participate in a transition that is applied to all layers. If a layer name is listed here, it should not be listed in config.layers."], "config.default_tag_layer": ["config", "config.default_tag_layer", " = \"master\"", "", "var", "The layer an image is shown on if its tag is not found in config.tag_layer."], "config.screen_height": ["config", "config.screen_height", " = 600", "", "var", "The height of the screen. Usually set by :func:`gui.init`."], "config.preload_fonts": ["config", "config.preload_fonts", " = [ ]", "", "var", "A list of the names of TrueType and OpenType fonts that Ren'Py should load when starting up. Including the name of a font here can prevent Ren'Py from pausing when introducing a new typeface."], "config.allow_skipping": ["config", "config.allow_skipping", " = True", "", "var", "If set to False, the user is not able to skip over the text of the game. See :var:`_skipping`."], "config.save_json_callbacks": ["config", "config.save_json_callbacks", " = [ ]", "", "var", "A list of callback functions that are used to create the json object that is stored with each save and marked accessible through :func:`FileJson` and :func:`renpy.slot_json`.\n\nEach callback is called with a Python dictionary that will eventually be saved. Callbacks should modify that dictionary by adding JSON-compatible Python types, such as numbers, strings, lists, and dicts. The dictionary at the end of the last callback is then saved as part of the save slot.\n\nThe dictionary passed to the callbacks may have already have keys beginning with an underscore ``_``. These keys are used by Ren'Py, and should not be changed."], "config.auto_load": ["config", "config.auto_load", " = None", "", "var", "If not None, the name of a save file to automatically load when Ren'Py starts up. This is intended for developer use, rather than for end users. Setting this to \\1\\ will automatically load the game in save slot 1."], "config.main_menu_music": ["config", "config.main_menu_music", " = None", "", "var", "If not None, a music file to play when at the main menu."], "config.debug_sound": ["config", "config.debug_sound", " = False", "", "var", "Enables debugging of sound functionality. This disables the suppression of errors when generating sound. However, if a sound card is missing or flawed, then such errors are normal, and enabling this may prevent Ren'Py from functioning normally. This should always be False in a released game."], "config.menu_clear_layers": ["config", "config.menu_clear_layers", " = []", "", "var", "A list of layer names (as strings) that are cleared when entering the game menu."], "config.single_movie_channel": ["config", "config.single_movie_channel", " = None", "", "var", "If not None, and the `play` argument is give to :func:`Movie`, this is the name used for the channel the movie is played on. This should not be \\movie\\, as that name is reserved for Ren'Py's internal use."], "config.autosave_on_quit": ["config", "config.autosave_on_quit", " = True", "", "var", "If True, Ren'Py will attempt to autosave when the user attempts to quit, return to the main menu, or load a game over the existing game. (To save time, the autosave occurs while the user is being prompted to confirm his or her decision.)"], "config.self_closing_custom_text_tags": ["custom_text_tags", "config.self_closing_custom_text_tags", "", "", "var", "Maps text tag names to a self-closing text tag functions, when the text tag does not wrap other text."]}, "internal": {"InputValue.enter": ["screen_python", "enter", "(self)", "InputValue", "method", "Called when the user presses enter. If this returns a non-None value, that value is returned from the interacton. This may also raise renpy.IgnoreEvent() to ignore the press. Otherwise, the enter-press is propagated to other displayables.\n\nThe following actions are available as methods on InputValue:"], "director.director_spacing": ["director", "director.director_spacing", " = 0", "", "var", "The spacing between two consecutive director lines."], "gui.TogglePreference": ["internal", "class", "(name, a, b, rebuild=True)", "", "Action", "This Action toggles the gui preference with `name` between value `a` and value `b`. It is selected if the value is equal to `a`.\n\n`rebuild` If true, the default, :func:`gui.rebuild` is called to make the changes take effect. This should generally be true, except in the case of multiple gui.SetPreference actions, in which case it should be False in all but the last one.\n\nThis is a very slow action, and probably not suitable for use when a button is hovered."], "gui.slider_tile": ["gui", "gui.slider_tile", " = True", "", "var", "If true, the frame containing the bar of a slider is tiled. If False, if it scaled."], "ui.Action": ["obsolete", "class", "()", "", "", "This can be passed to the clicked method of a button or hotspot. It is called when the action is selected. The other methods determine if the action should be displayed insensitive or disabled."], "AnimatedValue": ["internal", "class", "(value=0.0, range=1.0, delay=1.0, old_value=None)", "", "Action", "This animates a value, taking `delay` seconds to vary the value from `old_value` to `value`.\n\n `value` The value itself, a number.\n\n `range` The range of the value, a number.\n\n `delay` The time it takes to animate the value, in seconds. Defaults to 1.0.\n\n `old_value` The old value. If this is None, then the value is taken from the AnimatedValue we replaced, if any. Otherwise, it is initialized to `value`."], "Live2D": ["internal", "class", "(filename, zoom=None, top=0.0, base=1.0, height=1.0, loop=False, aliases={}, fade=None, motions=None, expression=None, nonexclusive=None, used_nonexclusive=None, seamless=None, sustain=False, attribute_function=None, attribute_filter=None, update_function=None, default_fade=1.0, **properties)", "", "", "This displayable displays a Live2D animation.\n\nOnly filename should be given positionally, and all other arguments should be given as keyword arguments."], "Matrix.identity": ["matrix", "Matrix.identity", "()", "", "function", "Returns an identity matrix."], "moveouttop": ["transitions", "moveouttop", "", "", "var", "Also: **moveoutleft, moveoutright, moveoutbottom**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "alt": ["internal", "function", "(what, interact=True)", "", "", ""], "FactorZoom": ["internal", "function", "()", "", "", ""], "preferences.set_volume": ["preferences", "preferences.set_volume", "(mixer, volume)", "", "function", "Sets `mixer` to `volume`.\n\n`mixer` A string giving the name of the mixer. By default, the mixers are \\music\\, \\sfx\\, and \\voice\\.\n\n`volume` A number between 0.0 and 1.0."], "RoundRect": ["internal", "function", "(color, small=False)", "", "", ""], "iap.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "im.Rotozoom": ["obsolete", "class", "(im, angle, zoom, **properties)", "", "", "This is an image manipulator that is a smooth rotation and zoom of another image manipulator."], "nvl_show": ["internal", "function", "(with_)", "", "", "The Python equivalent of the ``nvl show`` statement.\n\n`with_` The transition to use to show the NVL-mode window."], "easeinbottom": ["transitions", "easeinbottom", "", "", "var", "Also: **easeinright, easeinleft, easeintop, ease, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "build.classify_renpy": ["internal", "function", "(pattern, groups)", "", "", "Classifies files in the Ren'Py base directory according to pattern."], "BarValue.get_tooltip": ["screen_python", "get_tooltip", "(self)", "BarValue", "method", "This gets a default tooltip for this button, if a specific tooltip is not assigned. It should return the tooltip value, or None if a tooltip is not known.\n\nThis defaults to returning None."], "SetDict": ["internal", "class", "(dict, key, value)", "", "Action", "Causes the value of `key` in `dict` to be set to `value`."], "gui.slot_button_borders": ["gui", "gui.slot_button_borders", " = Borders(15, 15, 15, 15)", "", "var", "The borders applied to each save slot."], "DisableAllInputValues": ["internal", "class", "()", "", "Action", "Disables all active InputValue. This will re-focus the default InputValue, if there is one. Otherwise, no InputValue will be focused."], "_quit_slot": ["store_variables", "_quit_slot", " = None", "store", "var", "If not None, this should be a string giving the name of a file slot. When Ren'Py quits, the game will be saved in this slot."], "division": ["internal", "function", "()", "", "", ""], "pushright": ["transitions", "pushright", "", "", "var", "Also: **pushleft, pushup, pushdown**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "ui.child_or_fixed": ["obsolete", "function", "()", "", "", "Causes the current widget to be given child-fixed semantics. This means that we will queue up children added to it. If there is one child, that child will be added to the widget directly. Otherwise, a fixed will be created, and the children will be added to that."], "SpriteManager": ["internal", "class", "(update=None, event=None, predict=None, ignore_time=False, **properties)", "", "", "This displayable manages a collection of sprites, and displays them at the fastest speed possible."], "im.ImageBase": ["obsolete", "class", "(*args, **properties)", "", "", "This is the base class for all of the various kinds of images that we can possibly have."], "gui.dialogue_text_xalign": ["gui", "gui.dialogue_text_xalign", " = 0.0", "", "var", "The horizontal alignment of dialogue text. 0.0 is left aligned, 0.5 is centered, and 1.0 is right-aligned."], "LiveCrop": ["obsolete", "function", "(rect, child, **properties)", "", "", "LiveCrop is now :func:`Crop`."], "preferences.voice_sustain": ["preferences", "preferences.voice_sustain", " = False", "", "var", "If True, voice keeps playing until finished, or another voice line replaces it. If False, the voice line ends when the line of dialogue advances. The equivalent of the \\voice sustain\\ preference."], "SetMixer": ["internal", "class", "(mixer, volume)", "", "Action", "Sets the volume of `mixer` to `value`.\n\n`mixer` The mixer to set the volume of. A string, usually one of \\music\\, \\sfx\\, or \\voice\\. `value` The value to set the volume to. A number between 0.0 and 1.0, inclusive."], "updater": ["internal", "function", "()", "", "", ""], "Fixed": ["internal", "function", "(*args, **properties)", "", "", "A box that fills the screen. Its members are laid out from back to front, with their position properties controlling their position."], "FileNewest": ["internal", "function", "(name, page=None, slot=False)", "", "Action", "Returns True if this is the newest file slot, or False otherwise."], "truecenter": ["transforms", "truecenter", "", "", "var", "Centers both horizontally and vertically."], "AlphaBlend": ["internal", "function", "(control, old, new, alpha=False)", "", "", "This transition uses a `control` displayable (almost always some sort of animated transform) to transition from one displayable to another. The transform is evaluated. The `new` displayable is used where the transform is opaque, and the `old` displayable is used when it is transparent.\n\n`alpha` If true, the image is composited with what's behind it. If false, the default, the image is opaque and overwrites what's behind it."], "gui": ["internal", "function", "()", "", "", ""], "list": ["internal", "class", "(*args)", "", "", ""], "TintMatrix": ["internal", "class", "(color)", "", "", "A ColorMatrix can be used with :tpref:`matrixcolor` to tint an image, while leaving the alpha channel alone.\n\n`color` The color that the matrix will tint things to. This is passed to :func:`Color`, and so may be anything that Color supports as its first argument."], "Matrix.is_unit_aligned": ["internal", "function", "()", "", "", "Returns true if exactly one of abs(xdx) or abs(xdy) is 1.0, and the same for xdy and ydy. This is intended to report if a matrix is aligned to the axes."], "build.documentation": ["internal", "function", "(pattern)", "", "", "Declares a pattern that matches documentation. In a mac app build, files matching the documentation pattern are stored twice - once inside the app package, and again outside of it."], "Lexer.match": ["cds", "match", "(re)", "Lexer", "method", "Matches an arbitrary regexp string.\n\nAll of the statements in the lexer that match things are implemented in terms of this function. They first skip whitespace, then attempt to match against the line. If the match succeeds, the matched text is returned. Otherwise, None is returned, and the state of the lexer is unchanged."], "VariableInputValue": ["internal", "class", "(variable, default=True, returnable=False)", "", "Action", "An input value that updates `variable`.\n\n`variable` A string giving the name of the variable to update.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "ScreenVariableInputValue": ["internal", "class", "(variable, default=True, returnable=False)", "", "Action", "An input value that updates variable.\n\n`variable` A string giving the name of the variable to update.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "MusicRoom": ["internal", "class", "(channel=u'music', fadeout=0.0, fadein=0.0, loop=True, single_track=False, shuffle=False, stop_action=None)", "", "", "A music room that contains a series of songs that can be unlocked by the user, and actions that can play entries from the list in order."], "build.allow_integrated_gpu": ["build", "build.allow_integrated_gpu", " = True", "", "var", "Allows Ren'Py to run on the integrated GPU on platforms that have both integrated and discrete GPUs. Right now, this is only supported on Mac OS X."], "ComposeTransition": ["transitions", "function", "(trans, before, after)", "", "", "Returns a transition that composes up to three transitions. If not None, the `before` and `after` transitions are applied to the old and new scenes, respectively. These updated old and new scenes are then supplied to the `trans` transition.\n```\n# Move the images in and out while dissolving. (This is a fairly expensive transition.)\ndefine moveinoutdissolve = ComposeTransition(dissolve, before=moveoutleft, after=moveinright)\n```"], "build.classify": ["internal", "function", "(pattern, file_list)", "", "", "Classifies files that match `pattern` into `file_list`."], "InputValue.set_text": ["screen_python", "set_text", "(s)", "InputValue", "method", "Called when the text of the input is changed, with the new text. This must be implemented."], "SnowBlossom": ["internal", "function", "(d, count=10, border=50, xspeed=(20, 50), yspeed=(100, 200), start=0, fast=False, horizontal=False)", "", "", ""], "wipedown": ["transitions", "wipedown", "", "", "var", "Also: **wiperight, wipeup, wipeleft**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "iap.with_background": ["internal", "function", "(f, *args, **kwargs)", "", "", "Displays the background, then invokes `f`."], "wiperight": ["transitions", "wiperight", "", "", "var", "Also: **wipeleft, wipeup, wipedown**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "director.transforms": ["director", "director.transforms", " = [ \"left\", \"center\", \"right\" ]", "", "var", "A list of transforms that will be presented as part of the editor. In addition to these, any transform defined using the transform statement outside of Ren'Py itself will be added to the list of transforms, which is then sorted."], "FileTakeScreenshot": ["internal", "class", "(*args, **kwargs)", "", "Action", "Take a screenshot to be used when the game is saved. This can be used to ensure that the screenshot is accurate, by taking a picture of the screen before a file save screen is shown."], "ui.frame": ["obsolete", "ui.frame", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "preferences": ["internal", "function", "()", "", "", ""], "Lexer.catch_error": ["cds", "catch_error", "()", "Lexer", "method", "This is a context decorator, used in conjunction with the with statement, that catches and reports lexer errors inside its context block, then continues after the block.\n\nHere's an example of how it can be used to report multiple errors in a single subblock.\n```\ndef mystatement_parse(l):\n\nl.require(':')\nl.expect_eol()\nl.expect_block(\\mystatement\\)\n\nstrings = [ ]\nll = l.subblock_lexer()\n\nwhile ll.advance():\nwith ll.catch_errors():\nstrings.append(ll.require(ll.string))\nll.expect_noblock(\\string inside mystatement\\)\nll.expect_eol()\n\nreturn { \\strings\\ : strings }\n\n\n\n\n\n\n```"], "build.archive": ["internal", "function", "(name, file_list=\"all\")", "", "", "Declares the existence of an archive. If one or more files are classified with `name`, `name`.rpa is build as an archive. The archive is included in the named file lists."], "DragGroup": ["internal", "class", "(*children, **properties)", "", "", "Represents a group of Drags. A Drag is limited to the boundary of its DragGroup. Dropping only works between Drags that are in the same DragGroup. Drags may only be raised when they are inside a DragGroup.\n\nA DragGroup is laid out like a :func:`Fixed`.\n\nAll positional parameters to the DragGroup constructor should be Drags, that are added to the DragGroup.\n\n `min_overlap` An integer which means the minimum number of pixels at the overlap so that drop will be allow."], "default_mouse": ["store_variables", "default_mouse", "", "store", "var", "This is undefined by default. If defined, and if :var:`config.mouse` is set at game startup, this is a key that is used to look up a mouse cursor in config.mouse when the current cursor does not exist, or is the default."], "Grid": ["internal", "function", "(cols, rows, *args, **properties)", "", "", "Lays out displayables in a grid. The first two positional arguments are the number of columns and rows in the grid. This must be followed by `columns * rows` positional arguments giving the displayables that fill the grid."], "preferences.show_empty_window": ["preferences", "preferences.show_empty_window", " = True", "", "var", "If True, the window show and window auto statements will function. If False, those statements are disabled. The equivalent of the \\show empty window\\ preference."], "BarValue": ["internal", "class", "()", "", "", "This can be passed to the value method of bar and hotbar."], "Lexer.arguments": ["cds", "arguments", "()", "Lexer", "method", "This must be called before the parentheses with the arguments list, if they are not specified returns None, otherwise returns an object representing the arguments to a function call. This object has an ``evaluate`` method on it that takes an optional `scope` dictionary, and returns a tuple in which the first component is a tuple of positional arguments, and the second component is a dictionary of keyword arguments."], "SetField": ["internal", "class", "(object, field, value)", "", "Action", "Causes the a field on an object to be set to a given value. `object` is the object, `field` is a string giving the name of the field to set, and `value` is the value to set it to."], "Viewport": ["internal", "class", "(child=None, child_size=(None, None), offsets=(None, None), xadjustment=None, yadjustment=None, set_adjustments=True, mousewheel=False, draggable=False, edgescroll=None, style=u'viewport', xinitial=None, yinitial=None, replaces=None, arrowkeys=False, pagekeys=False, **properties)", "", "", ""], "layeredimage.parse_property": ["internal", "function", "(l, o, names)", "", "", "Parses a property, returns True if one is found."], "Zoom": ["internal", "function", "()", "", "", ""], "layeredimage.python_object": ["internal", "class", "()", "", "", "The most base type"], "gui.skip_frame_borders": ["gui", "gui.skip_frame_borders", " = Borders(24, 8, 75, 8)", "", "var", "The borders of the frame that is used by the skip screen."], "nvl_window": ["internal", "function", "()", "", "", ""], "gui.title_text_size": ["gui", "gui.title_text_size", " = 75", "", "var", "The size of the game's title."], "layout": ["internal", "function", "()", "", "", ""], "director.viewport_height": ["director", "director.viewport_height", " = 280", "", "var", "The maximum height of scrolling viewports used by the director."], "im.ramp": ["obsolete", "function", "(start, end)", "", "", "Returns a 256 character linear ramp, where the first character has the value start and the last character has the value end. Such a ramp can be used as a map argument of im.Map."], "pushleft": ["transitions", "pushleft", "", "", "var", "Also: **pushright, pushup, pushdown**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "layeredimage.ConditionGroup": ["internal", "class", "(conditions)", "", "", "Combines a list of conditions into a single ConditionSwitch."], "voice": ["internal", "function", "(filename, tag=None)", "", "", "Plays `filename` on the voice channel. The equivalent of the voice statement.\n\n`filename` The filename to play. This is used with :var:`config.voice_filename_format` to produce the filename that will be played.\n\n`tag` If this is not None, it should be a string giving a voice tag to be played. If None, this takes its default value from the voice_tag of the Character that causes the next interaction.\n\nThe voice tag is used to specify which character is speaking, to allow a user to mute or unmute the voices of particular characters."], "hpunch": ["transitions", "hpunch", "", "", "var", "When invoked, this transition shakes the screen horizontally for a quarter second."], "ui.key": ["obsolete", "ui.key", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "preferences.get_mute": ["preferences", "preferences.get_mute", "(mute):", "", "function", "Gets the mute setting for `mixer`."], "ToggleScreenVariable": ["internal", "class", "(name, true_value=None, false_value=None)", "", "Action", "Toggles the value of the variable `name` in the current screen.\n\n `true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "_version": ["store_variables", "_version", " = ...", "store", "var", "This is set to :var:`config.version` when a new game is started. It can be used by the ``after_load`` label or :var:`config.after_load_callbacks` to determine which upgrades need to be done.\n\nThis is only set once, upon the initial start. After that, the game is responsible for updating _version as necessary."], "FilePageNameInputValue": ["internal", "class", "(pattern=u'Page {}', auto=u'Automatic saves', quick=u'Quick saves', page=None, default=False)", "", "Action", "An input value that updates the name of a file page.\n\n`pattern` This is used for the default name of a page. Python-style substition is performed, such that {} is replaced with the number of the page.\n\n`auto` The name of the autosave page.\n\n`quick` The name of the quicksave page.\n\n`page` If given, the number of the page to display. This should usually be left as None, to give the current page.\n\n`default` If true, this input can be editable by default."], "FilePagePrevious": ["internal", "class", "(max=None, wrap=False, auto=True, quick=True)", "", "Action", "Goes to the previous file page, if possible.\n\n`max` If set, this should be an integer that gives the number of the maximum file page we can go to. This is required to enable wrap.\n\n`wrap` If true, we can go to the last page when on the first file page if max is set.\n\n`auto` If true, this can bring the player to the page of automatic saves.\n\n`quick` If true, this can bring the player to the page of automatic saves."], "director.audio_patterns": ["director", "director.audio_patterns", " = [ \"*.opus\", \"*.ogg\", \"*.mp3\" ]", "", "var", "The default list of audio patterns that are used to match the files available in an audio channel."], "gui.selected_color": ["gui", "gui.selected_color", " = '#555555'", "", "var", "The color used by the text of selected buttons. (This takes priority over the hover and idle colors.)"], "Matrix.texture_projection": ["internal", "function", "()", "", "", "This generates a matrix that project the Ren'Py space, where (0, 0) is the top left and (`w`, `h`) is the bottom right, into the OpenGL render-to-texture space, where (-1.0, -1.0) is the top left and (1.0, 1.0) is the bottom.\n\nGenerates the matrix that projects the Ren'Py screen to the OpenGL screen."], "ShowTransient": ["internal", "function", "(screen, transition=None, *args, **kwargs)", "", "Action", "Shows a transient screen. A transient screen will be hidden when the current interaction completes. The arguments are passed to the screen being shown.\n\n If not None, `transition` is use to show the new screen."], "Null": ["internal", "class", "(width=0, height=0, **properties)", "", "", "A displayable that creates an empty box on the screen. The size of the box is controlled by `width` and `height`. This can be used when a displayable requires a child, but no child is suitable, or as a spacer inside a box.\n```\nimage logo spaced = HBox(\\logo.png\\, Null(width=100), \\logo.png\\)\n\n```"], "define.move_transitions": ["internal", "function", "(prefix, delay, time_warp=None, in_time_warp=None, out_time_warp=None, old=False, layers=[ 'master' ], **kwargs)", "", "", "This defines a family of move transitions, similar to the move and ease transitions. For a given `prefix`, this defines the transitions:\n\n* *prefix*- A transition that takes `delay` seconds to move images that changed positions to their new locations.\n\n* *prefix*\\ inleft, *prefix*\\ inright, *prefix*\\ intop, *prefix*\\ inbottom - Transitions that take `delay` seconds to move images that changed positions to their new locations, with newly shown images coming in from the appropriate side.\n\n* *prefix*\\ outleft, *prefix*\\ outright, *prefix*\\ outtop, *prefix*\\ outbottom - Transitions that take `delay` seconds to move images that changed positions to their new locations, with newly hidden images leaving via the appropriate side.\n\n`time_warp`, `in_time_warp`, `out_time_warp` Time warp functions that are given a time from 0.0 to 1.0 representing the fraction of the move that is complete, and return a value in the same range giving the fraction of a linear move that is complete.\n\nThis can be used to define functions that ease the images around, rather than moving them at a constant speed.\n\nThe three arguments are used for images remaining on the screen, newly shown images, and newly hidden images, respectively.\n\n`old` If true, the transitions to move the old displayables, rather than the new ones.\n\n`layers` The layers the transition will apply to.\n```\n# This defines all of the pre-defined transitions beginning\n# with \\move\\.\ninit python:\ndefine.move_transitions(\\move\\, 0.5)\n\n```"], "achievement.progress": ["internal", "function", "(name, complete)", "", "", "Reports progress towards the achievement with `name`, if that achievement has not been granted. The achievement must be defined with a completion amount.\n\n`name` The name of the achievement. This should be the name of the achievement, and not the stat.\n\n`complete` An integer giving the number of units completed towards the achievement."], "Style": ["internal", "class", "()", "", "", "`parent` The parent of this style. One of:\n\n * A Style object. * A string giving the name of a style. * A tuple giving the name of an indexed style. * None, to indicate there is no parent.\n\n`properties` A map from style property to its value.\n\n`name` If given, a tuple that will be the name of this style.\n\n`help` Help information for this style.\n\n`heavy` Ignored, but retained for compatibility."], "Matrix": ["internal", "class", "(l)", "", "", "This represents a 4x4 matrix, that is used in various places in Ren'Py.\n\nWhen used to transform coordinates, the 16 elements of this matrix are::\n\n xdx, xdy, xdz, xdw, ydx, ydy, ydz, ydw, zdx, zdy, zdz, zdw, wdx, wdy, wdz, wdw\n\nwhere x' = xdx * x + xdy * y + xdz * z + xdw * w, where x is the original value of x and x' is the transformed value, and similarly for x, y, z, and w. This is usually applied to a position where w is 1, allowing any combination of translation, rotation, and scaling to be expressed in a single matrix.\n\nWhen used to transform colors, the 16 elements of this matrix are::\n\n rdr, rdg, rdb, rda, gdr, gdg, gdg, gda, bdr, bdg, bdb, bda, adr, adg, adb, ada,\n\nFor the red, green, blue, and alpha channels.\n\nMatrix objects can be multiplied using the Python multiplication operator, to generate a matrix that performs both operations. The order in which the matrixes appear can matter. Assuming `v` is a position or color being transformed::\n\n (step2 * step1) * v\n\nis equivalent to::\n\n step2 * (step1 * v)\n\n`l` This can be a list of 4, 9, or 16 numbers that is used to introduce this matrix. If not the full 16, the top-left corner of the matrix is initialized, with zdz and wdw set to 1.0 if not given. For example::\n\n Matrix([ 1, 2, 3, 4 ])\n\n would result in the Matrix::\n\n 1.0, 2.0, 0.0, 0.0, 3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0,"], "style.rebuild": ["style", "style.rebuild", "()", "", "function", "This causes named styles to be rebuilt, allowing styles to be changed after the init phase has finished.\n\n.. warning\n```\nNamed styles are not saved as part of the per-game data. This\n means that changes to them will not be persisted through a save\n and load cycle.\n```"], "gui.skip_ypos": ["gui", "gui.skip_ypos", " = 15", "", "var", "The vertical position of the skip indicator, in pixels from the top of the window."], "ColorizeMatrix": ["internal", "class", "(black_color, white_color)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to colorize black and white displayables. It uses the color of each pixel in the black and white to interpolate between the black color and the white color.\n\nThe alpha channel is not touched.\n\nThis is inteded for use with a black and white image (or one that has been desaturated with :func:`SaturationMatrix`), and will yield strange results when used with images that are not black and white.\n\n`black_color`, `white_color` The colors used in the interpolation."], "MainMenu": ["internal", "class", "(confirm=True, save=True)", "", "Action", "Causes Ren'Py to return to the main menu.\n\n`confirm` If true, causes Ren'Py to ask the user if he wishes to return to the main menu, rather than returning directly.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py restarts and returns the user to the main menu. The game is not saved if :var:`_quit_slot` is None."], "director.scene_tags": ["director", "director.scene_tags", " = { \"bg\" }", "", "var", "The set of tags that will be presented for the scene statement, and hidden from the show statement."], "OffsetMatrix": ["internal", "class", "(x, y, z)", "", "", "A TransformMatrix that returns a matrix that offsets the vertex by a fixed amount."], "offscreenleft": ["transforms", "offscreenleft", "", "", "var", "Places the displayable off the left side of the screen, aligned to the bottom of the screen."], "FileJson": ["internal", "function", "(name, key=None, empty=None, missing=None, page=None, slot=False)", "", "Action", "Accesses the Json information associated with `name`.\n\nIf `key` is None, returns the entire Json other object, or `empty` if the slot is empty.\n\nOtherwise, this returns json[key] if `key` is defined on the json object of the save, `missing` if there is a save with the given name, but it does not contain `key`, or `empty` if the save slot is empty.\n\nJson is added to a save slot by callbacks registered using :var:`config.save_json_callbacks`."], "ui.label": ["obsolete", "ui.label", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "Transform.hide_response": ["trans_trans_python", "hide_response", "", "Transform", "attribute", "If hide request is true, this can be set to false to prevent the transform from being hidden."], "SetVoiceMute": ["internal", "class", "(voice_tag, mute)", "", "Action", "If `mute` is true, mutes voices that are played with the given `voice_tag`. If `mute` is false, unmutes voices that are played with `voice_tag`."], "LiveTile": ["internal", "class", "(child, style=u'tile', **properties)", "", "", ""], "slideup": ["transitions", "slideup", "", "", "var", "Also: **slideright, slideleft, slidedown**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "VBox": ["internal", "function", "(*args, **properties)", "", "", "A layout that lays out its members from top to bottom."], "ui.combine_style": ["obsolete", "function", "(style_prefix, style_suffix)", "", "", "Combines a style prefix and style suffix to create a style name, then returns the style object corresoinding to that name."], "Drag": ["internal", "class", "(d=None, drag_name=None, draggable=True, droppable=True, drag_raise=True, dragged=None, dropped=None, drag_handle=(0.0, 0.0, 1.0, 1.0), drag_joined=..., clicked=None, hovered=None, unhovered=None, mouse_drop=False, **properties)", "", "", "A displayable that represents an object that can be dragged around its enclosing area. A Drag can also represent an area that other Drags can be dropped on.\n\nA Drag can be moved around inside is parent. Generally, its parent should be either a :func:`Fixed` or :class:`DragGroup`.\n\nA Drag has one child. The child's state reflects the status of the drag and drop operation:\n\n* ``selected_hover`` - when it is being dragged. * ``selected_idle`` - when it can be dropped on. * ``hover`` - when the draggable will be dragged when the mouse is clicked. * ``idle`` - otherwise.\n\nThe drag handle is a rectangle inside the child. The mouse must be over a non-transparent pixel inside the drag handle for dragging or clicking to occur.\n\nA newly-created draggable is added to the default DragGroup. A draggable can only be in a single DragGroup - if it's added to a second group, it's removed from the first.\n\nWhen a Drag is first rendered, if it's position cannot be determined from the DragGroup it is in, the position of its upper-left corner is computed using the standard layout algorithm. Once that position has been computed, the layout properties are ignored in favor of the position stored inside the Drag.\n\n`d` If present, the child of this Drag. Drags use the child style in preference to this, if it's not None.\n\n`drag_name` If not None, the name of this draggable. This is available as the `name` property of draggable objects. If a Drag with the same name is or was in the DragGroup, the starting position of this Drag is taken from that Draggable.\n\n`draggable` If true, the Drag can be dragged around the screen with the mouse.\n\n`droppable` If true, other Drags can be dropped on this Drag.\n\n`drag_raise` If true, this Drag is raised to the top when it is dragged. If it is joined to other Drags, all joined drags are raised.\n\n`activated` A callback (or list of callbacks) that is called when the mouse is pressed down on the drag. It is called with one argument, a a list of Drags that are being dragged. The return value of this callback is ignored.\n\n`dragged` A callback (or list of callbacks) that is called when the Drag has been dragged. It is called with two arguments. The first is a list of Drags that are being dragged. The second is either a Drag that is being dropped onto, or None of a drop did not occur. If the callback returns a value other than None, that value is returned as the result of the interaction.\n\n`dropped` A callback (or list of callbacks) that is called when this Drag is dropped onto. It is called with two arguments. The first is the Drag being dropped onto. The second is a list of Drags that are being dragged. If the callback returns a value other than None, that value is returned as the result of the interaction.\n\nWhen a dragged and dropped callback are triggered for the same event, the dropped callback is only called if dragged returns None.\n\n`clicked` A callback this is called, with no arguments, when the Drag is clicked without being moved. A droppable can also be focused and clicked. If the callback returns a value other than None, that value is returned as the result of the interaction.\n\n`alternate` An action that is run when the Drag is right-clicked (on the desktop) or long-pressed without moving (on mobile). It may be necessary to increase :var:`config.longpress_duration` if this triggers to early on mobile platforms.\n\n`drag_handle` A (x, y, width, height) tuple, giving the position of the drag handle within the child. In this tuple, integers are considered to be a literal number of pixels, while floats are relative to the size of the child.\n\n`drag_joined` This is called with the current Drag as an argument. It's expected to return a list of [ (drag, x, y) ] tuples, giving the draggables to drag as a unit. `x` and `y` are the offsets of the drags relative to each other, they are not relative to the corner of this drag.\n\n`drag_offscreen` If true, this draggable can be moved offscreen. This can be dangerous to use with drag_joined or drags that can change size, as the drags can leave the screen entirely, with no way to get them back on the screen.\n\n`mouse_drop` If true, the drag is dropped on the first droppable under the cursor. If false, the default, the drag is dropped onto the droppable with the largest degree of overlap.\n\n`drop_allowable` A callback that is called to determine whether this drop allow the current drags dropped onto. It is called with two arguments. The first is the Drag which determines its sensitivity. The second is a list of Drags that are being dragged.\n\nExcept for `d`, all of the parameters are available as fields (with the same name) on the Drag object. In addition, after the drag has been rendered, the following fields become available:\n\n`x`, `y` The position of the Drag relative to its parent, in pixels.\n\n`w`, `h` The width and height of the Drag's child, in pixels."], "nvl_list": ["internal", "function", "()", "", "", ""], "gui.file_slot_rows": ["gui", "gui.file_slot_rows", " = 2", "", "var", "The number of columns and rows in the grid of save slots."], "dict": ["internal", "class", "(*args, **kwargs)", "", "", ""], "gui.button_text_insensitive_color": ["gui", "gui.button_text_insensitive_color", " = gui.insensitive_color", "", "var", "The color of the button text in various states."], "ui.at": ["obsolete", "function", "(transform)", "", "", "Specifies a transform that is applied to the next displayable to be created. This is largely obsolete, as all UI functions now take an `at` argument."], "gui.scrollbar_size": ["gui", "gui.scrollbar_size", " = 24", "", "var", "The height of horizontal scrollbars, and width of vertical scrollbars."], "_screenshot_pattern": ["store_variables", "_screenshot_pattern", " = None", "store", "var", "If not None, this string is used in preference to :var:`config.screenshot_pattern` to determine the filename of a screenshot. Please see the documentation for that variable for the format of the string."], "preferences.gl_framerate": ["preferences", "preferences.gl_framerate", " = None", "", "var", "This is either an integer, or None. If not None, it's a target framerate that Ren'Py will attempt to achieve. If this is set low (for example, to 30), on a monitor with a high framerate (say, 60 frames per second), Ren'Py will only draw on every other frame.\n\nIf None, Ren'Py will attempt to draw at the monitor's full framerate."], "Lexer.has_block": ["cds", "has_block", "()", "Lexer", "method", "True if the current line has a non-empty block."], "gui.bar_tile": ["gui", "gui.bar_tile", " = False", "", "var", "If true, the bar images are tiled. If false, the images are linearly scaled."], "im.Map": ["obsolete", "class", "(im, rmap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', gmap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', bmap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', amap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', force_alpha=False, **properties)", "", "", "This adjusts the colors of the image that is its child. It takes as arguments 4 256 character strings. If a pixel channel has a value of 192, then the value of the 192nd character in the string is used for the mapped pixel component."], "ui.imagebutton": ["obsolete", "ui.imagebutton", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "nvl_narrator": ["internal", "function", "()", "", "", ""], "FileUsedSlots": ["internal", "function", "(page=None, highest_first=True)", "", "Action", "Returns a list of used numeric file slots on the page.\n\n`page` The name of the page that will be scanned. If None, the current page is used.\n\n`highest_first` If true, the highest-numbered file slot is listed first. Otherwise, the lowest-numbered slot is listed first."], "nvl_show_core": ["internal", "function", "(who=None, what=None, multiple=None)", "", "", ""], "Matrix.offset": ["matrix", "Matrix.offset", "(x, y, z)", "", "function", "Returns a matrix that offsets the vertex by a fixed amount."], "ui.ChildOrFixed": ["obsolete", "class", "(style_prefix)", "", "", "If one widget is added, then it is added directly to our parent. Otherwise, a fixed is added to our parent, and all the widgets are added to that."], "Text": ["internal", "class", "(text, slow=None, scope=None, substitute=None, slow_done=None, mipmap=None, **properties)", "", "", "A displayable that displays text on the screen.\n\n`text` The text to display on the screen. This may be a string, or a list of strings and displayables.\n\n`slow` Determines if the text is displayed slowly, being typed out one character at the time. If None, slow text mode is determined by the :propref:`slow_cps` style property. Otherwise, the truth value of this parameter determines if slow text mode is used.\n\n`scope` If not None, this should be a dictionary that provides an additional scope for text interpolation to occur in.\n\n`substitute` If true, text interpolation occurs. If false, it will not occur. If None, they are controlled by :var:`config.new_substitutions`."], "Frame": ["internal", "class", "(image, left=0, top=0, right=None, bottom=None, tile=False, **properties)", "", "", "A displayable that resizes an image to fill the available area, while preserving the width and height of its borders. It is often used as the background of a window or button.\n\n Using a frame to resize an image to double its size.\n\n`image` An image manipulator that will be resized by this frame.\n\n`left` The size of the border on the left side. This can also be a :func:`Borders` object, in which case that object is used in place of the other parameters.\n\n`top` The size of the border on the top.\n\n`right` The size of the border on the right side. If None, defaults to `left`.\n\n`bottom` The side of the border on the bottom. If None, defaults to `top`.\n\n`tile` If set to True, tiling is used to resize sections of the image, rather than scaling. If set to the string \\integer\\, the nearest integer number of tiles will be used in each direction. That set of full tiles will then be scaled up or down to fit the required area.\n```\n# Resize the background of the text window if it's too small.\n init python:\n style.window.background = Frame(\\frame.png\\, 10, 10)\n```"], "VoiceReplay": ["internal", "class", "(*args, **kwargs)", "", "Action", "Replays the most recently played voice."], "FieldEquality": ["internal", "class", "(*args, **kwargs)", "", "", "Declares two objects equal if their types are the same, and the listed fields are equal."], "updater.update": ["internal", "function", "(url, base=None, force=False, public_key=None, simulate=None, add=[], restart=True, confirm=True, patch=True)", "", "", "Updates this Ren'Py game to the latest version.\n\n`url` The URL to the updates.json file.\n\n`base` The base directory that will be updated. Defaults to the base of the current game. (This can usually be ignored.)\n\n`force` Force the update to occur even if the version numbers are the same. (Used for testing.)\n\n`public_key` The path to a PEM file containing a public key that the update signature is checked against. (This can usually be ignored.)\n\n`simulate` This is used to test update guis without actually performing an update. This can be:\n\n* None to perform an update. * \\available\\ to test the case where an update is available. * \\not_available\\ to test the case where no update is available. * \\error\\ to test an update error.\n\n`add` A list of packages to add during this update. This is only necessary for dlc.\n\n`restart` Restart the game after the update.\n\n`confirm` Should Ren'Py prompt the user to confirm the update? If False, the update will proceed without confirmation.\n\n`patch` If true, Ren'Py will attempt to patch the game, downloading only changed data. If false, Ren'Py will download a complete copy of the game, and update from that. This is set to false automatically when the url does not begin with \\http:\\."], "ui.Imagemap": ["obsolete", "class", "(insensitive, idle, selected_idle, hover, selected_hover, selected_insensitive, alpha, cache)", "", "", "Stores information about the images used by an imagemap."], "Flatten": ["internal", "class", "(child, **properties)", "", "", "This flattens `child`, which may be made up of multiple textures, into a single texture.\n\nCertain operations, like the alpha transform property, apply to every texture making up a displayable, which can yield incorrect results when the textures overlap on screen. Flatten creates a single texture from multiple textures, which can prevent this problem.\n\nFlatten is a relatively expensive operation, and so should only be used when absolutely required."], "dissolve": ["transitions", "dissolve", "", "", "var", "Takes 0.5 seconds to dissolve from the old to the new screen. An instance of the :func:`Dissolve` transition class."], "Lexer.float": ["cds", "float", "()", "Lexer", "method", "Matches a floating point number, returns a string containing the floating point number."], "renpy": ["internal", "function", "()", "", "", "To allow Ren'Py to be scripted in Python, each Ren'Py statement has a Python equivalent. This usually consists of a Python function, but may also consist of a pattern of Python calls that perform an action equivalent to the statement."], "SetMute": ["internal", "class", "(mixer, mute)", "", "Action", "Sets the mute status of one or more mixers. When a mixer is muted, audio channels associated with that mixer will stop playing audio.\n\n`mixer` Either a single string giving a mixer name, or a list of strings giving a list of mixers. The strings should be mixer names, usually \\music\\, \\sfx\\, or \\voice\\.\n\n`mute` True to mute the mixer, False to ummute it."], "Lexer.word": ["cds", "word", "()", "Lexer", "method", "Matches any word, including keywords. Returns the text of the matched word."], "Tooltip": ["internal", "class", "(default)", "", "Action", "A tooltip object can be used to define a portion of a screen that is updated when the mouse hovers an area.\n\nA tooltip object has a ``value`` field, which is set to the `default` value passed to the constructor when the tooltip is created. When a button using an action created by the tooltip is hovered, the value field changes to the value associated with the action."], "Lexer.integer": ["cds", "integer", "()", "Lexer", "method", "Matches an integer, returns a string containing the integer."], "_confirm_quit": ["store_variables", "_confirm_quit", " = True", "store", "var", "This determines if quitting the game asks for confirmation. It is set to False during the splashscreen, and is ignored when in the main menu."], "layeredimage.format_function": ["internal", "function", "(what, name, group, variant, attribute, image, image_format, **kwargs)", "", "", "This is called to format the information about an attribute or condition into a displayable. This can be replaced by a creator, but the new function should ignore unknown kwargs.\n\n`what` A string giving a description of the thing being formatted, which is used to create better error messages.\n\n`name` The name of the layeredimage.\n\n`group` The group of an attribute, None if not supplied or if it's part of a condition.\n\n`variant` The variant argument to the group, or None if it is not supplied.\n\n`attribute` The attribute itself.\n\n`image` Either a displayable or string.\n\n`image_format` The image_format argument of the LayeredImage.\n\nIf `image` is None, then `name`, `group` (if not None), `variant` (if not None), and `attribute` are combined with underscores to create `image`, which will then be a string.\n\nIf `images` is a string, and `image_format` is not None, `image` is formatted into the string to get the final displayable.\n\nSo if `name` is \\eileen\\, `group` is \\expression\\, and `attribute` is \\happy\\, `image` would be set to \\eileen_expression_happy\\. If `image_format` is \\images/{image}.png\\, the final image Ren'Py finds is \\images/eileen_expression_happy.png\\. But note that it would have found the same image without the format argument."], "Speaker": ["internal", "function", "(name=NotSet, kind=None, **properties)", "", "", ""], "GamepadCalibrate": ["internal", "function", "()", "", "Action", "An action that invokes the gamepad calibration routine."], "build.change_icon_i686": ["build", "build.change_icon_i686", " = True", "", "var", "If True, and icon.ico exists, the icon of the 32-bit Windows executable will be changed. If False, the icon will not be changed. Setting this to False may prevent some antivirus programs from producing a false positive for your game."], "RotateMatrix": ["internal", "class", "(x, y, z)", "", "", "A TransformMatrix that returns a matrix that rotates the displayable around the origin.\n\n`x`, `y`, `z` The amount to rotate around the origin, in degrees.\n\n The rotations are applied in order:\n\n* A clockwise rotation by `x` degrees in the Y/Z plane. * A clockwise rotation by `y` degrees in the Z/X plane. * A clockwise rotation by `z` degrees in the X/Y plane."], "PauseAudio": ["internal", "class", "(channel, value=True)", "", "Action", "Sets the pause flag for `channel`.\n\nIf `value` is True, the channel is paused. If False, the channel is unpaused. If \\toggle\\, the pause flag will be toggled."], "moveinright": ["transitions", "moveinright", "", "", "var", "Also: **moveinleft, moveintop, moveinbottom**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "LayeredImage": ["internal", "class", "(attributes, at=[], name=None, image_format=None, format_function=None, attribute_function=None, **kwargs)", "", "", "This is an image-like object that, when shown with the proper set of attributes, shows a displayable created by compositing together the displayables associated with those attribute.\n\n`attributes` This must be a list of Attribute objects. Each Attribute object reflects a displayable that may or may not be displayed as part of the image. The items in this list are in back-to-front order, with the first item further from the viewer and the last closest.\n\n`at` A transform or list of transforms that are applied to the displayable after it is parameterized.\n\n`name` The name of the layeredimage. This is used as part of the names of image components.\n\n`image_format` When a given image is a string, and this is supplied, the image name is interpolated into `image_format` to make an image file. For example, \\sprites/eileen/{image}.png\\ will look for the image in a subdirectory of sprites. (This is not used by auto groups, which look for images and not image files.)\n\n`format_function` A function that is used instead of `layeredimage.format_function` to format the image information into a displayable.\n\n`attribute_function` If not None, a function that's called with a set of attributes supplied to the image, and returns the set of attributes used to select layers. This is called when determining the layers to display, after the attribute themselves have been chosen. It can be used to express complex dependencies between attributes or select attributes at random.\n\nAdditional keyword arguments may contain transform properties. If any are present, a transform is created that wraps the result image. Remaining keyword arguments are passed to a Fixed that is created to hold the layer. Unless explicitly overridden, xfit and yfit are set to true on the Fixed, which means it will shrink to the smallest size that fits all of the layer images it is showing.\n\nA LayeredImage is not a displayable, and can't be used in all the places a displayable can be used. This is because it requires an image name (generally including image attributes) to be provided. As such, it should either be displayed through a scene or show statement, or by an image name string used as a displayable."], "MultipleTransition": ["transitions", "function", "(args)", "", "", "Returns a transition that allows multiple transitions to be displayed, one after the other.\n\n`args` A *list* containing an odd number of items. The first, third, and other odd-numbered items must be scenes, and the even items must be transitions. A scene can be one of:\n\n* A displayable. * False, to use the old scene. * True, to use the new scene.\n\nAlmost always, the first argument will be False and the last True.\n\nThe transitions in `args` are applied in order. For each transition, the old scene is the screen preceding it, and the new scene is the scene following it. For example\n```\ndefine logodissolve = MultipleTransition([\nFalse, Dissolve(0.5),\n\\logo.jpg\\, Pause(1.0),\n\\logo.jpg\\, dissolve,\nTrue])\n\nThis example will dissolve to logo.jpg, wait 1 second, and then\ndissolve to the new scene.\n```"], "updater.get_installed_packages": ["internal", "function", "(base=None)", "", "", "Returns a list of installed DLC package names.\n\n`base` The base directory to update. Defaults to the current project's base directory."], "Play": ["internal", "class", "(channel, file, selected=None, **kwargs)", "", "Action", "Causes an audio file to be played on a given channel.\n\n `channel` The channel to play the sound on. `file` The file to play. `selected` If True, buttons using this action will be marked as selected if the file is playing on the channel. If False, this action will not cause the button to start playing. If None, the button is marked selected if the channel is a music channel, and not otherwise.\n\n Any other keyword arguments are passed to :func:`renpy.music.play`."], "vpunch": ["transitions", "vpunch", "", "", "var", "When invoked, this transition shakes the screen vertically for a quarter second."], "MoveTransition": ["internal", "function", "()", "", "", ""], "NVLCharacter": ["internal", "class", "(who=NotSet, kind=None, **properties)", "", "", ""], "im.Flip": ["obsolete", "class", "(im, horizontal=False, vertical=False, **properties)", "", "", "An image manipulator that flips `im` (an image manipulator) vertically or horizontally. `vertical` and `horizontal` control the directions in which the image is flipped.\n```\nimage eileen flip = im.Flip(\\eileen_happy.png\\, vertical=True)\n\nThe same effect can now be achieved by setting\n:tpref:`xzoom` (for horizontal flip)\nor :tpref:`yzoom` (for vertical flip) to a negative value.\n```"], "ui.ChoiceJump": ["obsolete", "class", "(label, value, location=None, block_all=None, sensitive=True, args=None, kwargs=None)", "", "", "A menu choice action that returns `value`, while managing the button state in a manner consistent with fixed rollback. (See block_all for a description of the behavior.)\n\n `label` The label text of the button. For imagebuttons and hotspots this can be anything. This label is used as a unique identifier of the options within the current screen. Together with `location` it is used to store whether this option has been chosen.\n\n`value` The location to jump to.\n\n`location` A unique location identifier for the current choices screen.\n\n`block_all` If false, the button is given the selected role if it was the chosen choice, and insensitive if it was not selected.\n\nIf true, the button is always insensitive during fixed rollback.\n\nIf None, the value is taken from the :var:`config.fix_rollback_without_choice` variable.\n\nWhen true is given to all items in a screen, it will become unclickable (rolling forward will still work). This can be changed by calling :func:`ui.saybehavior` before the call to :func:`ui.interact`."], "Preference": ["internal", "function", "(name, value=None, range=None)", "", "Action", "This constructs the appropriate action or value from a preference. The preference name should be the name given in the standard menus, while the value should be either the name of a choice, \\toggle\\ to cycle through choices, a specific value, or left off in the case of buttons.\n\n Actions that can be used with buttons and hotspots are:\n\n * Preference(\\display\\, \\fullscreen\\) - displays in fullscreen mode. * Preference(\\display\\, \\window\\) - displays in windowed mode at 1x normal size. * Preference(\\display\\, 2.0) - displays in windowed mode at 2.0x normal size. * Preference(\\display\\, \\any window\\) - displays in windowed mode at the previous size. * Preference(\\display\\, \\toggle\\) - toggle display mode.\n\n * Preference(\\transitions\\, \\all\\) - show all transitions. * Preference(\\transitions\\, \\none\\) - do not show transitions. * Preference(\\transitions\\, \\toggle\\) - toggle transitions.\n\n * Preference(\\video sprites\\, \\show\\) - show all video sprites. * Preference(\\video sprites\\, \\hide\\) - fall back to images where possible. * Preference(\\video sprites\\, \\toggle\\) - toggle image fallback behavior.\n\n * Preference(\\show empty window\\, \\show\\) - Allow the \\window show\\ and \\window auto\\ statement to show an empty window outside of the say statement. * Preference(\\show empty window\\, \\hide\\) - Prevent the above. * Preference(\\show empty window\\, \\toggle\\) - Toggle the above.\n\n * Preference(\\text speed\\, 0) - make text appear instantaneously. * Preference(\\text speed\\, 142) - set text speed to 142 characters per second.\n\n * Preference(\\joystick\\) - Show the joystick preferences.\n\n * Preference(\\skip\\, \\seen\\) - Only skip seen messages. * Preference(\\skip\\, \\all\\) - Skip unseen messages. * Preference(\\skip\\, \\toggle\\) - Toggle between skip seen and skip all.\n\n * Preference(\\begin skipping\\) - Starts skipping.\n\n * Preference(\\after choices\\, \\skip\\) - Skip after choices. * Preference(\\after choices\\, \\stop\\) - Stop skipping after choices. * Preference(\\after choices\\, \\toggle\\) - Toggle skipping after choices.\n\n * Preference(\\auto-forward time\\, 0) - Set the auto-forward time to infinite. * Preference(\\auto-forward time\\, 10) - Set the auto-forward time (unit is seconds per 250 characters).\n\n * Preference(\\auto-forward\\, \\enable\\) - Enable auto-forward mode. * Preference(\\auto-forward\\, \\disable\\) - Disable auto-forward mode. * Preference(\\auto-forward\\, \\toggle\\) - Toggle auto-forward mode.\n\n * Preference(\\auto-forward after click\\, \\enable\\) - Remain in auto-forward mode after a click. * Preference(\\auto-forward after click\\, \\disable\\) - Disable auto-forward mode after a click. * Preference(\\auto-forward after click\\, \\toggle\\) - Toggle auto-forward after click.\n\n * Preference(\\automatic move\\, \\enable\\) - Enable automatic mouse mode. * Preference(\\automatic move\\, \\disable\\) - Disable automatic mouse mode. * Preference(\\automatic move\\, \\toggle\\) - Toggle automatic mouse mode.\n\n * Preference(\\wait for voice\\, \\enable\\) - Wait for the currently playing voice to complete before auto-forwarding. * Preference(\\wait for voice\\, \\disable\\) - Do not wait for the currently playing voice to complete before auto-forwarding. * Preference(\\wait for voice\\, \\toggle\\) - Toggle wait voice.\n\n * Preference(\\voice sustain\\, \\enable\\) - Sustain voice past the current interaction. * Preference(\\voice sustain\\, \\disable\\) - Don't sustain voice past the current interaction. * Preference(\\voice sustain\\, \\toggle\\) - Toggle voice sustain.\n\n * Preference(\\music mute\\, \\enable\\) - Mute the music mixer. * Preference(\\music mute\\, \\disable\\) - Un-mute the music mixer. * Preference(\\music mute\\, \\toggle\\) - Toggle music mute.\n\n * Preference(\\sound mute\\, \\enable\\) - Mute the sound mixer. * Preference(\\sound mute\\, \\disable\\) - Un-mute the sound mixer. * Preference(\\sound mute\\, \\toggle\\) - Toggle sound mute.\n\n * Preference(\\voice mute\\, \\enable\\) - Mute the voice mixer. * Preference(\\voice mute\\, \\disable\\) - Un-mute the voice mixer. * Preference(\\voice mute\\, \\toggle\\) - Toggle voice mute.\n\n * Preference(\\mixer mute\\, \\enable\\) - Mute the specified mixer. * Preference(\\mixer mute\\, \\disable\\) - Unmute the specified mixer. * Preference(\\mixer mute\\, \\toggle\\) - Toggle mute of specified mixer.\n\n * Preference(\\all mute\\, \\enable\\) - Mute all mixers. * Preference(\\all mute\\, \\disable\\) - Unmute all mixers. * Preference(\\all mute\\, \\toggle\\) - Toggle mute of all mixers.\n\n * Preference(\\music volume\\, 0.5) - Set the music volume. * Preference(\\sound volume\\, 0.5) - Set the sound volume. * Preference(\\voice volume\\, 0.5) - Set the voice volume. * Preference(\\mixer volume\\, 0.5) - Set the specified mixer volume.\n\n * Preference(\\emphasize audio\\, \\enable\\) - Emphasize the audio channels found in :var:`config.emphasize_audio_channels`. * Preference(\\emphasize audio\\, \\disable\\) - Do not emphasize audio channels. * Preference(\\emphasize audio\\, \\toggle\\) - Toggle emphasize audio.\n\n * Preference(\\self voicing\\, \\enable\\) - Enables self-voicing. * Preference(\\self voicing\\, \\disable\\) - Disable self-voicing. * Preference(\\self voicing\\, \\toggle\\) - Toggles self-voicing.\n\n * Preference(\\self voicing volume drop\\, 0.5) - Drops the volume of non-voice mixers when self voicing is active.\n\n * Preference(\\clipboard voicing\\, \\enable\\) - Enables clipboard-voicing. * Preference(\\clipboard voicing\\, \\disable\\) - Disable clipboard-voicing. * Preference(\\clipboard voicing\\, \\toggle\\) - Toggles clipboard-voicing.\n\n * Preference(\\debug voicing\\, \\enable\\) - Enables self-voicing debug * Preference(\\debug voicing\\, \\disable\\) - Disable self-voicing debug. * Preference(\\debug voicing\\, \\toggle\\) - Toggles self-voicing debug.\n\n * Preference(\\rollback side\\, \\left\\) - Touching the left side of the screen causes rollback. * Preference(\\rollback side\\, \\right\\) - Touching the right side of the screen causes rollback. * Preference(\\rollback side\\, \\disable\\) - Touching the screen will not cause rollback.\n\n * Preference(\\gl powersave\\, True) - Drop framerate to allow for power savings. * Preference(\\gl powersave\\, False) - Do not drop framerate to allow for power savings. * Preference(\\gl powersave\\, \\auto\\) - Enable powersave when running on battery.\n\n * Preference(\\gl framerate\\, None) - Runs at the display framerate. * Preference(\\gl framerate\\, 60) - Runs at the given framerate.\n\n * Preference(\\gl tearing\\, True) - Tears rather than skipping frames. * Preference(\\gl tearing\\, False) - Skips frames rather than tearing.\n\n * Preference(\\font transform\\, \\opendyslexic\\) - Sets the accessibility font transform to opendyslexic. * Preference(\\font transform\\, \\dejavusans\\) - Sets the accessibility font transform to deja vu sans. * Preference(\\font transform\\, None) - Disables the accessibility font transform.\n\n * Preference(\\font size\\, 1.0) - Sets the accessibility font size scaling factor. * Preference(\\font line spacing\\, 1.0) - Sets the accessibility font vertical spacing scaling factor.\n\n * Preference(\\system cursor\\, \\enable\\) - Use system cursor ignoring config.mouse. * Preference(\\system cursor\\, \\disable\\) - Use cursor defined in config.mouse. * Preference(\\system cursor\\, \\toggle\\) - Toggle system cursor.\n\n * Preference(\\high contrast text\\, \\enable\\) - Enables white text on a black background. * Preference(\\high contrast text\\, \\disable\\) - Disables high contrast text. * Preference(\\high contrast text\\, \\toggle\\) - Toggles high contrast text.\n\n\n\n Values that can be used with bars are:\n\n * Preference(\\text speed\\) * Preference(\\auto-forward time\\) * Preference(\\music volume\\) * Preference(\\sound volume\\) * Preference(\\voice volume\\) * Preference(\\mixer volume\\) * Preference(\\self voicing volume drop\\) * Preference(\\font size\\) * Preference(\\font line spacing\\)\n\n The `range` parameter can be given to give the range of certain bars. For \\text speed\\, it defaults to 200 cps. For \\auto-forward time\\, it defaults to 30.0 seconds per chunk of text. (These are maximums, not defaults.)\n\n Actions that can be used with buttons are:\n\n * Preference(\\renderer menu\\) - Show the renderer menu. * Preference(\\accessibility menu\\) - Show the accessibility menu.\n\n These screens are intended for internal use, and are not customizable."], "absolute": ["internal", "class", "()", "", "", ""], "FilePageNext": ["internal", "class", "(max=None, wrap=False, auto=True, quick=True)", "", "Action", "Goes to the next file page.\n\n`max` If set, this should be an integer that gives the number of the maximum file page we can go to.\n\n`wrap` If true, we can go to the first page when on the last file page if `max` is set.\n\n`auto` If true and wrap is set, this can bring the player to the page of automatic saves.\n\n`quick` If true and wrap is set, this can bring the player to the page of automatic saves."], "iap.is_deferred": ["internal", "function", "(product)", "", "", "Returns True if the user has asked to purchase `product`, but that request has to be approved by a third party, such as a parent or guardian."], "DynamicImage": ["internal", "class", "(name)", "", "", "A DynamicImage is a displayable that has text interpolation performed on it to yield a string giving a new displayable. Such interpolation is performed at the start of each interaction."], "NVLSpeaker": ["internal", "class", "(who=NotSet, kind=None, **properties)", "", "", ""], "Matrix.rotate": ["matrix", "Matrix.rotate", "(x, y, z)", "", "function", "Returns a matrix that rotates the displayable around the origin.\n\n`x`, `y`, `z` The amount to rotate around the origin, in degrees.\n\n The rotations are applied in order:\n\n* A clockwise rotation by `x` degrees in the Y/Z plane. * A clockwise rotation by `y` degrees in the Z/X plane. * A clockwise rotation by `z` degrees in the X/Y plane."], "Lexer.name": ["cds", "name", "()", "Lexer", "method", "Matches a name. This does not match built-in keywords."], "im.math": ["obsolete", "function", "()", "", "", "This module is always available. It provides access to the mathematical functions defined by the C standard."], "_history_list": ["store_variables", "_history_list", " = [ ]", "store", "var", "This is a list of history objects, corresponding to each line of history from oldest to newest. See the :ref:`History ` section for more information."], "preferences.text_cps": ["preferences", "preferences.text_cps", " = 0", "", "var", "The speed of text display. 0 is infinite, otherwise this is the number of characters per second to show. The equivalent of the \\text speed\\ preference."], "director": ["internal", "function", "()", "", "", ""], "gui.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "ui.hotbar": ["obsolete", "ui.hotbar", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "Model": ["internal", "class", "(size=None, **properties)", "", "", "This is a displayable that causes Ren'Py to create a 2D or 3D model for use with the model-based renderer, that will be drawn in a single operation with the shaders given here, or selected by an enclosing Transform or Displayable.\n\n`size` If not None, this should be a width, height tuple, that's used to give the size of the Model. If not given, the model is the size of the area provided to it. The fit parameter to a texture takes precedence.\n\nIf no mesh method is called, a mesh that sets a_position and a_tex_coord to match the way Ren'Py loads textures is created if at least one texture is supplied. Otherwise, a mesh that only sets a_position is used.\n\nAll methods on this calls return the displayable the method is called on, making it possible to chain calls."], "gui.interface_text_font": ["gui", "gui.interface_text_font", " = \"ArchitectsDaughter.ttf\"", "", "var", "The font used for text for user interface elements, like the main and game menus, buttons, and so on."], "im.expands_bounds": ["obsolete", "function", "(bounds, size, amount)", "", "", "This expands the rectangle bounds by amount, while ensure it fits inside size."], "TextButton": ["internal", "function", "(text, style=u'button', text_style=u'button_text', clicked=None, **properties)", "", "", ""], "AddToSet": ["internal", "class", "(set, value)", "", "Action", "Adds `value` to `set`.\n\n`set` The set to add to. This may be a Python set or list, in which case the value is appended to the list. `value` The value to add or append."], "sv": ["internal", "function", "(what, interact=True)", "", "", ""], "gui.confirm_frame_borders": ["gui", "gui.confirm_frame_borders", " = Borders(60, 60, 60, 60)", "", "var", "The borders applied to the fame used in the confirm screen."], "gui.slider_size": ["gui", "gui.slider_size", " = 64", "", "var", "The height of horizontal sliders, and width of vertical sliders."], "gui.math": ["internal", "function", "()", "", "", "This module is always available. It provides access to the mathematical functions defined by the C standard."], "director.audio_channels": ["director", "director.audio_channels", " = [ \"music\", \"sound\", \"audio\" ]", "", "var", "The name of the audio channels that can be used with the play, show and stop statements."], "iap.restore": ["internal", "function", "(interact=True)", "", "", "Contacts the app store and restores any missing purchases.\n\n`interact` If True, renpy.pause will be called while waiting for the app store to respond."], "RollForward": ["internal", "class", "(*args, **kwargs)", "", "Action", "This action causes a rollforward to occur, if a roll forward is possible. Otherwise, it is insensitive."], "QuickLoad": ["internal", "function", "(confirm=True)", "", "Action", "Performs a quick load.\n\n`confirm` If true and not at the main menu, prompt for confirmation before loading the file."], "Hide": ["internal", "class", "(screen, transition=None, _layer=None)", "", "Action", "This causes the screen named `screen` to be hidden, if it is shown.\n\n`transition` If not None, a transition that occurs when hiding the screen.\n\n`_layer` This is passed as the layer argument to :func:`renpy.hide_screen`."], "gui.notify_ypos": ["gui", "gui.notify_ypos", " = 68", "", "var", "The vertical position of the notify message, in pixels from the top of the window."], "layeredimage.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "Action.unhovered": ["screen_python", "unhovered", "(self)", "Action", "method", "When the action is used as the `hovered` parameter to a button (or similar object), this method is called when the object loses focus."], "move": ["transitions", "move", "", "", "var", "Takes 0.5 seconds to the move images that have changed location to their new locations. An instance of the :func:`MoveTransition` transition class."], "gui.nvl_thought_xpos": ["gui", "gui.nvl_thought_xpos", " = 0.5", "", "var", "The positioning of character names, dialogue text, and thought/narration text, relative to the left side of the entry. This can be a number of pixels, or 0.5 to represent the center of the entry."], "ui.layer": ["obsolete", "function", "(name)", "", "", "Adds displayables to the layer named `name`. The later must be closed with :func:`ui.close`."], "SetScreenVariable": ["internal", "class", "(name, value)", "", "Action", "Causes the variable `name` associated with the current screen to be set to `value`."], "build.android_permissions": ["android", "build.android_permissions", " = [ ]", "", "var", "This is a list of strings, with each string giving the full name of an Android permission. For example, \\android.permission.WRITE_EXTERNAL_STORAGE\\. This simply declares that the application might request these permissions, it's necessary to use renpy.check_permission and renpy.request_permission as necessary to request the permission."], "Style.clear": ["style", "clear", "()", "Style", "method", "This removes all style properties from this object. Values will be inherited from this object's parent."], "achievement.Sync": ["internal", "class", "()", "", "Action", "An action that calls achievement.sync(). This is only sensitive if achievements are out of sync."], "gui.idle_color": ["gui", "gui.idle_color", " = '#606060'", "", "var", "The color used for most buttons when not focused or selected."], "style": ["internal", "function", "()", "", "", "The object exported as style in the store."], "FieldInputValue": ["internal", "class", "(object, field, default=True, returnable=False)", "", "Action", "An input value that updates `field` on `object`.\n\n`field` A string giving the name of the field.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "im.threading": ["obsolete", "function", "()", "", "", "Thread module emulating a subset of Java's threading model."], "Matrix.inverse": ["internal", "function", "()", "", "", "Returns the inverse of this matrix."], "FileLoadable": ["internal", "function", "(name, page=None, slot=False)", "", "Action", "This is a function that returns true if the file is loadable, and false otherwise."], "fade": ["transitions", "fade", "", "", "var", "Takes 0.5 seconds to fade to black, and then 0.5 seconds to fade to the new screen. An instance of the :func:`Fade` transition class."], "ToggleField": ["internal", "class", "(object, field, true_value=None, false_value=None)", "", "Action", "Toggles `field` on `object`. Toggling means to invert the boolean value of that field when the action is performed.\n\n `true_value` If not None, then this is the true value we use. `false_value` If not None, then this is the false value we use."], "Lexer.require": ["cds", "require", "(thing, name=None)", "Lexer", "method", "Tries to parse `thing`, and reports an error if it cannot be done.\n\nIf `thing` is a string, tries to parse it using :func:`match`. Otherwise, thing must be a other method on this lexer object, which is called without arguments. If `name` is not specified, the name of the method will be used in the message (or `thing` if it's a string), otherwise the `name` will be used."], "wipeleft": ["transitions", "wipeleft", "", "", "var", "Also: **wiperight, wipeup, wipedown**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "achievement.clear": ["internal", "function", "(name)", "", "", "Clears the achievement with `name`."], "anim": ["internal", "function", "()", "", "", ""], "ToggleScreen": ["internal", "class", "(screen, transition=None, *args, **kwargs)", "", "Action", "This toggles the visibility of `screen`. If it is not currently shown, the screen is shown with the provided arguments. Otherwise, the screen is hidden.\n\nIf not None, `transition` is use to show and hide the screen."], "HistoryEntry.window_args": ["history", "window_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the dialogue window when the dialogue was originally shown."], "Solid": ["internal", "class", "(color, **properties)", "", "", "A displayable that fills the area its assigned with `color`.\n```\nimage white = Solid(\\#fff\\)\n\n```"], "BarValue.get_adjustment": ["screen_python", "get_adjustment", "(self)", "BarValue", "method", "This method is called to get an adjustment object for the bar. It should create the adjustment with :func:`ui.adjustment`, and then return the object created this way.\n\nThis method must be overridden, as the default method will raise NotImplemented (and hence cause Ren'Py to report an error)."], "im.zipfile": ["obsolete", "function", "()", "", "", "Read and write ZIP files."], "Motion": ["internal", "function", "()", "", "", "This is used to move a child displayable around the screen. It works by supplying a time value to a user-supplied function, which is in turn expected to return a pair giving the x and y location of the upper-left-hand corner of the child, or a 4-tuple giving that and the xanchor and yanchor of the child.\n\nThe time value is a floating point number that ranges from 0 to 1. If repeat is True, then the motion repeats every period sections. (Otherwise, it stops.) If bounce is true, the time value varies from 0 to 1 to 0 again.\n\nThe function supplied needs to be pickleable, which means it needs to be defined as a name in an init block. It cannot be a lambda or anonymous inner function. If you can get away with using Pan or Move, use them instead.\n\nPlease note that floats and ints are interpreted as for xpos and ypos, with floats being considered fractions of the screen."], "updater.UpdateCancelled": ["internal", "class", "()", "", "", "Used to report the update being cancelled."], "Action.periodic": ["screen_python", "periodic", "(st)", "Action", "method", "This method is called once at the start of each interaction, and then is called periodically thereafter. If it returns a number, it will be called before that many seconds elapse, but it might be called sooner.\n\nThe main use of this is to call :func:`renpy.restart_interaction` if the value of get_selected or get_sensitive should change.\n\nIt takes one argument:\n\n`st` The number of seconds since the screen or displayable this action is associated with was first shown."], "sorted": ["internal", "function", "(*args, **kwargs)", "", "", ""], "gui.dialogue_ypos": ["gui", "gui.dialogue_ypos", " = 75", "", "var", "The horizontal and vertical positions of the actual dialogue. These are usually a number of pixels from the left or top side of the textbox. Setting a variable to 0.5 centers the dialogue in the textbox (see below)."], "ui.transform": ["obsolete", "ui.transform", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ui.Many": ["obsolete", "class", "(displayable, imagemap, style_prefix)", "", "", "A widget that takes many children."], "Help": ["internal", "class", "(help=None)", "", "Action", "Displays help.\n\nIf a screen named ``help`` is defined, that screen is displayed using :func:`ShowMenu` and `help` is ignored.\n\n`help` A string that is used to find help. This is used in the following way:\n\n* If a label with this name exists, the label is called in a new context. * Otherwise, this is interpreted as giving the name of a file that should be opened in a web browser.\n\nIf `help` is None, :var:`config.help` is used as the default value."], "build.exclude_empty_directories": ["build", "build.exclude_empty_directories", " = True", "", "var", "If true, empty directories (including directories left empty by file archiving) will be removed from generated packages. If false, empty directories will be included."], "Skip": ["internal", "class", "(fast=False, confirm=False)", "", "Action", "Causes the game to begin skipping. If the game is in a menu context, then this returns to the game. Otherwise, it just enables skipping.\n\n `fast` If true, skips directly to the next menu choice.\n\n `confirm` If true, asks for confirmation before beginning skipping."], "preferences.skip_after_choices": ["preferences", "preferences.skip_after_choices", " = False", "", "var", "If True, skipping will resume after a choice. If False, a choice will prevent Ren'Py from skipping. The equivalent of the \\after choices\\ preference."], "InputValue.Enable": ["screen_python", "Enable", "()", "InputValue", "method", "Returns an action that enables text editing on the input."], "MultiPersistent.save": ["persistent", "save", "()", "MultiPersistent", "method", "Saves the multipersistent data to disk. This must be called after the data is modified."], "MoveFactory": ["internal", "function", "()", "", "", ""], "gui.history_text_xpos": ["gui", "gui.history_text_xpos", " = 0.5", "", "var", "The horizontal positions of the name label and dialogue text. These can be a number of pixels from the left side of the history entry, or 0.5 to center."], "ui.textbutton": ["obsolete", "ui.textbutton", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "SetCharacterVolume": ["internal", "function", "(voice_tag, volume=None)", "", "", "This allows the volume of each characters to be adjusted. If `volume` is None, this returns a BarValue that controls the value of `voice_tag`. Otherwise, this set it to `volume`.\n\n`volume` is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for `voice` channel."], "gui.vbar_borders": ["gui", "gui.vbar_borders", " = Borders(10, 10, 10, 10)", "", "var", "The borders that are used with the Frames containing the bar images."], "with_statement": ["internal", "function", "()", "", "", ""], "topright": ["transforms", "topright", "", "", "var", "Aligns to the top-right corner of the screen."], "gui.button_image_extension": ["gui", "gui.button_image_extension", " = \".png\"", "", "var", "The extension for button images. This could be changed to .webp to use WEBP button images instead of png ones."], "ADVSpeaker": ["internal", "class", "(name=NotSet, kind=None, **properties)", "", "", ""], "build.display_name": ["internal", "function", "()", "", "", "The name that will be displayed in the title bar."], "Lexer.label_name": ["cds", "label_name", "(declare=False)", "Lexer", "method", "Matches a label name, either absolute or relative. If `declare` is true, then the global label name is set. (Note that this does not actually declare the label - the statement is required to do that by returning it from the `label` function.)"], "MouseDisplayable": ["internal", "class", "(cursor, x, y)", "", "", "A displayable that wraps a mouse cursor displayable, and causes it to move across the screen when the player moves their mouse.\n\n`cursor` A displayable that is used to draw the mouse.\n\n`x`, `y` The coordinates of the hotspot, relative to the upper left corner of the mouse, in virtual pixels.\n\n.. method MouseDisplayable.add(name, cursor, x, y)\n\nThis adds a second cursor, that is used when the `name` mouse is displayed. This returns the MouseDisplayable, so that calls to this method can be chained."], "toggle_skipping": ["internal", "function", "()", "", "", ""], "StaticValue": ["internal", "class", "(value=0.0, range=1.0)", "", "Action", "This allows a value to be specified statically.\n\n `value` The value itself, a number.\n\n `range` The range of the value."], "gui.button_text_size": ["gui", "gui.button_text_size", " = gui.interface_text_size", "", "var", "The font and size of the button text."], "slideleft": ["transitions", "slideleft", "", "", "var", "Also: **slideright, slideup, slidedown**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "DictValue": ["internal", "class", "(dict, key, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A value that allows the user to adjust the value of a key in a dict.\n\n `dict` The dict. `key` The key. `range` The range to adjust over. `max_is_zero` If True, then when the value of a key is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the value of a key is set to 0.\n\n `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "pixellate": ["transitions", "pixellate", "", "", "var", "Pixellates the old scene for .5 seconds, and the new scene for another .5 seconds. An instance of the :func:`Pixellate` transition class."], "print": ["internal", "function", "(*args, **kwargs)", "", "", ""], "Revolve": ["internal", "function", "()", "", "", ""], "squares": ["transitions", "squares", "", "", "var", "Transitions the screen in a squares effect lasting 1 second."], "DictInputValue": ["internal", "class", "(dict, key, default=True, returnable=False)", "", "Action", "An input value that updates `key` in `dict`.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "OpacityMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to change the opacity of an image, while leaving color channels alone.\n\n`value` The amount the alpha channel should be multiplied by, a number between 0.0 and 1.0."], "moveoutright": ["transitions", "moveoutright", "", "", "var", "Also: **moveoutleft, moveouttop, moveoutbottom**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "ScaleMatrix": ["internal", "class", "(x, y, z)", "", "", "A TransformMatrix that returns a matrix that scales the displayable.\n\n`x`, `y`, `z` The factor to scale each axis by."], "VoiceInfo": ["internal", "class", "(self)", "", "", "An object returned by VoiceInfo and get_voice_info()."], "nvl_menu": ["internal", "function", "(items)", "", "", "A Python function that displays a menu in NVL style. This is rarely used directly. Instead, it's assigned to the :var:`menu` variable, using something like\n```\ndefine menu = nvl_menu\n```"], "tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "main_menu": ["store_variables", "main_menu", " = False", "store", "var", "Ren'Py sets this variable to True while in the main menu. This can be used to have screens display differently while in the main menu."], "SetVariable": ["internal", "function", "(name, value)", "", "Action", "Causes the variable with `name` to be set to `value`.\n\nThe `name` argument must be a string, and can be a simple name like \\strength\\, or one with dots separating the variable from fields, like \\hero.strength\\ or \\persistent.show_cutscenes\\."], "topleft": ["transforms", "topleft", "", "", "var", "Aligns to the top-left corner of the screen."], "ui.text": ["obsolete", "ui.text", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.history_text_ypos": ["gui", "gui.history_text_ypos", " = 60", "", "var", "The vertical positions of the name label and dialogue text, relative to the top of a history entry, in pixels."], "Action.__call__": ["screen_python", "__call__", "(self)", "Action", "method", "This is the method that is called when the action is activated. In many cases, returning a non-None value from the action will cause the current interaction to end.\n\nThis method must be overridden, as the default method will raise NotImplemented (and hence cause Ren'Py to report an error)."], "Jump": ["internal", "class", "(label)", "", "Action", "Causes control to transfer to `label`."], "swing": ["internal", "function", "()", "", "", ""], "SideImage": ["internal", "function", "()", "", "", "Returns the side image associated with the currently speaking character, or a Null displayable if no such side image exists."], "MultiPersistent": ["internal", "function", "(name, save_on_quit=False)", "", "", ""], "InvertSelected": ["internal", "class", "(action)", "", "Action", "This inverts the selection state of the provided action, while proxying over all of the other methods."], "gui.python_object": ["internal", "class", "()", "", "", "The most base type"], "Pause": ["transitions", "function", "(delay)", "", "", "Returns a transition that only displays the new screen for `delay` seconds. It can be useful as part of a MultipleTransition."], "build.executable_name": ["build", "build.executable_name", " = \"...\"", "", "var", "This variable controls the name of the executables that the user clicks on to start the game.\n\nThis variable should not contain special characters like spaces, colons, and semicolons. If not set, it defaults to :var:`build.name`.\n\nFor example, if this is set to \\mygame\\, the user will be able to run mygame.exe on Windows, mygame.app on Macintosh, and mygame.sh on Linux."], "gui.nvl_thought_ypos": ["gui", "gui.nvl_thought_ypos", " = 0", "", "var", "The position of character names, dialogue text, and thought/narration text, relative to the top of the entry. This should be a number of pixels from the top."], "gui.namebox_tile": ["gui", "gui.namebox_tile", " = False", "", "var", "These variables control the display of the frame containing the namebox."], "Start": ["internal", "class", "(label=u'start')", "", "Action", "Causes Ren'Py to jump out of the menu context to the named label. The main use of this is to start a new game from the main menu. Common uses are:\n\n * Start() - Start at the start label. * Start(\\foo\\) - Start at the \\foo\\ label."], "gui.interface_text_color": ["gui", "gui.interface_text_color", " = '#404040'", "", "var", "The color used by static text in the game interface, such as text on the help and about screens."], "Tile": ["internal", "class", "(child, style=u'tile', **properties)", "", "", "Tiles `child` until it fills the area allocated to this displayable.\n```\nimage bg tile = Tile(\\bg.png\\)\n\n```"], "preferences.mobile_rollback_side": ["preferences", "preferences.mobile_rollback_side", " = \"disable\"", "", "var", "When on a mobile platform, touches or clicks to this side of the window cause rollback to occur. One of \\left\\, \\right\\, or \\disable\\. This is the equivalend of the \\rollback side\\ preference when on a mobile platform."], "open": ["internal", "function", "(*args, **kwargs)", "", "", ""], "easeintop": ["transitions", "easeintop", "", "", "var", "Also: **easeinright, easeinleft, ease, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "_rollback": ["store_variables", "_rollback", " = True", "store", "var", "Controls if rollback is allowed."], "Lexer.expect_noblock": ["cds", "expect_noblock", "(stmt)", "Lexer", "method", "Called to indicate this statement does not expect a block. If a block is found, raises an error. `stmt` should be a string, it will be added to the message with an error."], "FileSaveName": ["internal", "function", "(name, empty=u'', page=None, slot=False)", "", "Action", "Return the save_name that was in effect when the file was saved, or `empty` if the file does not exist."], "Screenshot": ["internal", "class", "(*args, **kwargs)", "", "Action", "Takes a screenshot."], "preferences.mouse_move": ["preferences", "preferences.mouse_move", " = False", "", "var", "If True, the mouse will automatically move to a selected button. If False, it will not. The equivalent of the \\automatic mouse move\\ preference."], "top": ["transforms", "top", "", "", "var", "Centers horizontally, and aligns to the top of the screen."], "Lexer.renpy_block": ["cds", "renpy_block", "(empty=False)", "Lexer", "method", "This parses all of the remaining lines in the current block as Ren'Py script, and returns a SubParse corresponding to the first statement in the block. The block is chained together such that all statements in the block are run, and then control is transferred to the statement after this creator-defined statement.\n\nNote that this parses the current block. In the more likely case that you'd like to parse the subblock of the current statement, the correct way to do that is\n```\ndef mystatement_parse(l):\n\nl.require(':')\nl.expect_eol()\nl.expect_block(\\mystatement\\)\n\nchild = l.subblock_lexer().renpy_block()\n\nreturn { \\child\\ : child }\n\n`empty`\nIf True, allows an empty block to be parsed. (An empty block\nis equivalent to a block with a single ``pass`` statement.)\n\nIf False, an empty block triggers an error.\n\n\n```"], "layeredimage": ["internal", "function", "()", "", "", ""], "build.python_object": ["internal", "class", "()", "", "", "The most base type"], "im.Recolor": ["obsolete", "class", "(im, rmul=255, gmul=255, bmul=255, amul=255, force_alpha=False, **properties)", "", "", "This adjusts the colors of the image that is its child. It takes as an argument 4 numbers between 0 and 255, and maps each channel of the image linearly between 0 and the supplied color."], "HueMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to rotate the hue by `value` degrees. While `value` can be any number, positive or negative, 360 degrees makes a complete rotation. The alpha channel is left alone."], "iap": ["internal", "function", "()", "", "", "Ren'Py includes a high-level in-app purchasing framework. This framework currently only supports unlock-style purchases from the Apple App Store, Google Play, and the Amazon Appstore."], "slidedown": ["transitions", "slidedown", "", "", "var", "Also: **slideright, slideup, slideleft**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "ui.ChoiceReturn": ["obsolete", "class", "(label, value, location=None, block_all=None, sensitive=True, args=None, kwargs=None)", "", "", "A menu choice action that returns `value`, while managing the button state in a manner consistent with fixed rollback. (See block_all for a description of the behavior.)\n\n `label` The label text of the button. For imagebuttons and hotspots this can be anything. This label is used as a unique identifier of the options within the current screen. Together with `location` it is used to store whether this option has been chosen.\n\n`value` The value this is returned when the choice is chosen.\n\n`location` A unique location identifier for the current choices screen.\n\n`block_all` If false, the button is given the selected role if it was the chosen choice, and insensitive if it was not selected.\n\nIf true, the button is always insensitive during fixed rollback.\n\nIf None, the value is taken from the :var:`config.fix_rollback_without_choice` variable.\n\nWhen true is given to all items in a screen, it will become unclickable (rolling forward will still work). This can be changed by calling :func:`ui.saybehavior` before the call to :func:`ui.interact`."], "im.Color": ["obsolete", "function", "(im, color)", "", "", "This recolors the supplied image, mapping colors such that black is black and white is the supplied color."], "gui.nvl_thought_width": ["gui", "gui.nvl_thought_width", " = 740", "", "var", "The width of each kind of text, in pixels."], "Language": ["internal", "class", "(language)", "", "Action", "Changes the language of the game to `language`.\n\n`language` A string giving the language to translate to, or None to use the default language of the game script."], "centered": ["internal", "function", "()", "", "", ""], "gui.text_size": ["gui", "gui.text_size", " = 33", "", "var", "Sets the size of the dialogue text. This may need to be increased or decreased to fit the selected font in the space allotted."], "ImageDissolve": ["transitions", "function", "(image, time, ramplen=8, reverse=False, alpha=True, time_warp=None)", "", "", "Returns a transition that dissolves the old scene into the new scene, using an image to control the dissolve process. This means that white pixels will dissolve in first, and black pixels will dissolve in last.\n\n`image` A control image to use. If `config.gl2` is True, then this can be any displayable, else it needs to be either an image file or an image manipulator. The control image should be the size of the scenes being dissolved, and if `reverse=True`, it should be fully opaque.\n\n`time` The time the dissolve will take.\n\n`ramplen` The length of the ramp to use. This must be an integer power of 2. When this is the default value of 8, when a white pixel is fully dissolved, a pixel 8 shades of gray darker will have completed one step of dissolving in.\n\n`reverse` If True, black pixels will dissolve in before white pixels.\n\n`alpha` Ignored.\n\n`time_warp` A function that adjusts the timeline. If not None, this should be a function that takes a fractional time between 0.0 and 1.0, and returns a number in the same range.\n```\ndefine circirisout = ImageDissolve(\\circiris.png\\, 1.0)\ndefine circirisin = ImageDissolve(\\circiris.png\\, 1.0, reverse=True)\ndefine circiristbigramp = ImageDissolve(\\circiris.png\\, 1.0, ramplen=256)\n```"], "preferences.afm_after_click": ["preferences", "preferences.afm_after_click", " = False", "", "var", "If True, auto-forward move will be continue after a click. If False, a click will end auto-forward mode. The equivalent of the \\auto-forward after click\\ preference."], "DictEquality": ["internal", "class", "(*args, **kwargs)", "", "", "Declares two objects equal if their types are the same, and their internal dictionaries are equal."], "InputValue.Toggle": ["screen_python", "Toggle", "()", "InputValue", "method", "Returns an action that toggles text editing on the input."], "LayeredImageProxy": ["internal", "class", "(name, transform=None)", "", "", "This is an image-like object that proxies attributes passed to it to another layered image.\n\n`name` A string giving the name of the layered image to proxy to.\n\n`transform` If given, a transform or list of transforms that are applied to the image after it has been proxied."], "director.voice_channel": ["director", "director.voice_channel", " = \"voice\"", "", "var", "The name of the audio channel used by voice."], "Stop": ["internal", "class", "(channel, **kwargs)", "", "Action", "Causes an audio channel to be stopped.\n\n `channel` The channel to stop the sound on.\n\n Any keyword arguments are passed to :func:`renpy.music.stop`"], "nvl_clear_next": ["internal", "function", "()", "", "", ""], "ToggleMute": ["internal", "class", "(mixer)", "", "Action", "Toggles the mute status of one or more mixers.\n\n`mixer` Either a single string giving a mixer name, or a list of strings giving a list of mixers. The strings should be mixer names, usually \\music\\, \\sfx\\, or \\voice\\."], "translate_define": ["translating_renpy", "translate_define", "(language, define, value, help=None)", "", "function", "This is used to set a define when generating a game. For example, it can be used to change the size of a font.\n\n`language` The language involved.\n\n`define` The name of the define.\n\n`value` A string giving the value the define should be set to. (ie. \\10\\, \\False\\, or \\'Font.ttf'\\).\n\n`comment` If not None, a comment that will be generated before the define. The comment will only be generated if the define does not exist in gui.rpy. There is no need to use \\## \\, as the comment will be added and wrapped automatically.\n\nFor example, the following changes the size of dialogue text\n```\ntranslate_define(\\martian\\, \\gui.text_size\\, 12)\n\n```"], "voice_can_replay": ["internal", "function", "()", "", "", "Returns true if it's possible to replay the current voice."], "Set": ["internal", "class", "(*args)", "", "", ""], "gui.dialogue_width": ["gui", "gui.dialogue_width", " = 1116", "", "var", "This variable gives the maximum width of a line of dialogue, in pixels. When dialogue reaches this width, it will be wrapped by Ren'Py."], "ui.interact": ["obsolete", "function", "(roll_forward=None, mouse='default')", "", "", "Causes an interaction with the user, and returns the result of that interaction. This causes Ren'Py to redraw the screen and begin processing input events. When a displayable returns a value in response to an event, that value is returned from ui.interact, and the interaction ends.\n\nThis function is rarely called directly. It is usually called by other parts of Ren'Py, including the say statement, menu statement, with statement, pause statement, call screen, :func:`renpy.input`, among many other functions. However, it can be called directly if necessary.\n\nWhen an interaction ends, the transient layer and all screens shown with transient=True are cleared from the scene lists.\n\nThe following arguments are documented. As other, undocumented arguments exist for Ren'Py's internal use, please pass all arguments as keyword arguments.\n\n`roll_forward` The information that will be returned by this function when a roll forward occurs. (If None, the roll forward is ignored.) This should usually be passed the result of the :func:`renpy.roll_forward_info` function.\n\n`mouse` The style of mouse cursor to use during this function."], "zoomout": ["transitions", "zoomout", "", "", "var", "This zooms out leaving images, taking 0.5 seconds to do so."], "voice_sustain": ["internal", "function", "(ignored=u'', **kwargs)", "", "", "The equivalent of the voice sustain statement."], "RestartStatement": ["internal", "class", "(*args, **kwargs)", "", "Action", "This action causes Ren'Py to rollback to before the current statement, and then re-run the current statement. This may be used when changing a persistent variable that affects how the statement is displayed.\n\nIf run in a menu context, this waits until the player exits to a top-level context before performing the rollback."], "iap.init_android": ["internal", "function", "()", "", "", "Initialize IAP on Android."], "ImageReference": ["internal", "class", "(name, **properties)", "", "", "ImageReference objects are used to reference images by their name, which is a tuple of strings corresponding to the name used to define the image in an image statment."], "ContrastMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to change the brightness of an image, while leaving the Alpha channel alone.\n\n`value` The contrast value. Values between 0.0 and 1.0 decrease the contrast, while values above 1.0 increase the contrast."], "RevolveInOut": ["internal", "function", "()", "", "", ""], "iap.get_store_name": ["internal", "function", "()", "", "", "Returns the name of the enabled store for in-app purchase. This currently returns one of \\amazon\\, \\play\\ (for Google Play), \\ios\\ or None if no store is available."], "build.pattern_list": ["internal", "function", "(l)", "", "", "Apply file_lists to the second argument of each tuple in a list."], "ui.fixed": ["obsolete", "ui.fixed", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "preferences.get_volume": ["preferences", "preferences.get_volume", "(mixer):", "", "function", "Gets the volume for `mixer`. If the mixer is muted, this returns 0.0."], "Movie": ["internal", "class", "(fps=24, size=None, channel=u'movie', play=None, mask=None, mask_channel=None, image=None, play_callback=None, side_mask=False, loop=True, start_image=None, **properties)", "", "", "This is a displayable that shows the current movie.\n\n`fps` The framerate that the movie should be shown at. (This is currently ignored, but the parameter is kept for backwards compatibility. The framerate is auto-detected.)\n\n`size` This should be specified as either a tuple giving the width and height of the movie, or None to automatically adjust to the size of the playing movie. (If None, the displayable will be (0, 0) when the movie is not playing.)\n\n`channel` The audio channel associated with this movie. When a movie file is played on that channel, it will be displayed in this Movie displayable. If this is left at the default of \\movie\\, and `play` is provided, a channel name is automatically selected, using :var:`config.single_movie_channel` and :var:`config.auto_movie_channel`.\n\n`play` If given, this should be the path to a movie file. The movie file will be automatically played on `channel` when the Movie is shown, and automatically stopped when the movie is hidden.\n\n`side_mask` If true, this tells Ren'Py to use the side-by-side mask mode for the Movie. In this case, the movie is divided in half. The left half is used for color information, while the right half is used for alpha information. The width of the displayable is half the width of the movie file.\n\nWhere possible, `side_mask` should be used over `mask` as it has no chance of frames going out of sync.\n\n`mask` If given, this should be the path to a movie file that is used as the alpha channel of this displayable. The movie file will be automatically played on `movie_channel` when the Movie is shown, and automatically stopped when the movie is hidden.\n\n`mask_channel` The channel the alpha mask video is played on. If not given, defaults to `channel`\\ _mask. (For example, if `channel` is \\sprite\\, `mask_channel` defaults to \\sprite_mask\\.)\n\n`start_image` An image that is displayed when playback has started, but the first frame has not yet been decoded.\n\n`image` An image that is displayed when `play` has been given, but the file it refers to does not exist. (For example, this can be used to create a slimmed-down mobile version that does not use movie sprites.) Users can also choose to fall back to this image as a preference if video is too taxing for their system. The image will also be used if the video plays, and then the movie ends.\n\n`play_callback` If not None, a function that's used to start the movies playing. (This may do things like queue a transition between sprites, if desired.) It's called with the following arguments:\n\n`old` The old Movie object, or None if the movie is not playing. `new` The new Movie object.\n\nA movie object has the `play` parameter available as ``_play``, while the ``channel``, ``loop``, ``mask``, and ``mask_channel`` fields correspond to the given parameters.\n\nGenerally, this will want to use :func:`renpy.music.play` to start the movie playing on the given channel, with synchro_start=True. A minimal implementation is\n```\ndef play_callback(old, new):\n\nrenpy.music.play(new._play, channel=new.channel, loop=new.loop, synchro_start=True)\n\nif new.mask:\nrenpy.music.play(new.mask, channel=new.mask_channel, loop=new.loop, synchro_start=True)\n\n`loop`\nIf False, the movie will not loop. If `image` is defined, the image\nwill be displayed when the movie ends. Otherwise, the displayable will\nbecome transparent.\n```"], "gui.button_borders": ["gui", "gui.button_borders", " = Borders(10, 10, 10, 10)", "", "var", "The borders surrounding a button, in left, top, right, bottom order."], "Particles": ["internal", "class", "(factory, **properties)", "", "", "Supports particle motion, using the old API."], "DynamicDisplayable": ["internal", "class", "(function, *args, **kwargs)", "", "", "A displayable that can change its child based on a Python function, over the course of an interaction.\n\n`function` A function that is called with the arguments:\n\n* The amount of time the displayable has been shown for. * The amount of time any displayable with the same tag has been shown for. * Any positional or keyword arguments supplied to DynamicDisplayable.\n\nand should return a (d, redraw) tuple, where:\n\n* `d` is a displayable to show. * `redraw` is the maximum amount of time to wait before calling the function again, or None to not require the function be called again before the start of the next interaction.\n\n`function` is called at the start of every interaction.\n\nAs a special case, `function` may also be a python string that evaluates to a displayable. In that case, function is run once per interaction.\n```\n# Shows a countdown from 5 to 0, updating it every tenth of\n# a second until the time expires.\ninit python:\n\ndef show_countdown(st, at):\nif st > 5.0:\nreturn Text(\\0.0\\), None\nelse:\nd = Text(\\{:.1f}\\.format(5.0 - st))\nreturn d, 0.1\n\nimage countdown = DynamicDisplayable(show_countdown)\n```"], "Window": ["internal", "class", "(child=None, style=u'window', **properties)", "", "", "A window that has padding and margins, and can place a background behind its child. `child` is the child added to this displayable. All other properties are as for the :ref:`Window` screen language statement."], "Animation": ["internal", "function", "(*args, **kwargs)", "", "", ""], "Call": ["internal", "class", "(label, *args, **kwargs)", "", "Action", "Ends the current statement, and calls `label`. Arguments and keyword arguments are passed to :func:`renpy.call`."], "VariableValue": ["internal", "function", "(variable, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A bar value that allows the user to adjust the value of a variable in the default store.\n\n `variable` A string giving the name of the variable to adjust. `range` The range to adjust over. `max_is_zero` If True, then when the field is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the field is set to 0.\n\n This is used internally, for some preferences. `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "Pan": ["internal", "function", "()", "", "", ""], "gui.kind_text_size": ["gui", "gui.kind_text_size", "", "", "var", "If present, the size of the text."], "moveoutleft": ["transitions", "moveoutleft", "", "", "var", "Also: **moveoutright, moveouttop, moveoutbottom**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "Rollback": ["internal", "class", "(*args, **kwargs)", "", "Action", "This action causes a rollback to occur, when a rollback is possible. Otherwise, nothing happens.\n\nThe arguments are given to :func:`renpy.rollback`, except that the `force` argument defaults to \\menu\\."], "Sprite": ["internal", "class", "()", "", "", "This represents a sprite that is managed by the SpriteManager. It contains fields that control the placement of the sprite on the screen. Sprites should not be created directly. Instead, they should be created by calling :meth:`SpriteManager.create`.\n\nThe fields of a sprite object are:\n\n`x`, `y` The x and y coordinates of the upper-left corner of the sprite, relative to the SpriteManager.\n\n`zorder` An integer that's used to control the order of this sprite in the relative to the other sprites in the SpriteManager. The larger the number is, the closer to the viewer the sprite is.\n\n`events` If True, then events are passed to child. If False, the default, the children ignore events (and hence don't spend time processing them).\n\nThe methods of a Sprite object are:"], "iap.register": ["internal", "function", "(product, identifier=None, amazon=None, google=None, ios=None, consumable=False)", "", "", "Registers a product with the in-app purchase system.\n\n`product` A string giving the high-level name of the product. This is the string that will be passed to :func:`iap.purchase`, :func:`iap.Purchase`, and :func:`iap.has_purchased` to represent this product.\n\n`identifier` A string that's used to identify the product internally. Once used to represent a product, this must never change. These strings are generally of the form \\com.domain.game.product\\.\n\nIf None, defaults to `product`.\n\n`amazon` A string that identifies the product in the Amazon app store. If not given, defaults to `identifier`.\n\n`google` A string that identifies the product in the Google Play store. If not given, defaults to `identifier`.\n\n`ios` A string that identifies the product in the Apple App store for iOS. If not given, defaults to `identifier`.\n\n`consumable` True if this is a consumable purchase. Right now, consumable purchases are only supported on iOS."], "im.io": ["obsolete", "function", "()", "", "", "The io module provides the Python interfaces to stream handling. The builtin open function is defined in this module.\n\nAt the top of the I/O hierarchy is the abstract base class IOBase. It defines the basic interface to a stream. Note, however, that there is no separation between reading and writing to streams; implementations are allowed to raise an IOError if they do not support a given operation.\n\nExtending IOBase is RawIOBase which deals simply with the reading and writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide an interface to OS files.\n\nBufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer streams that are readable, writable, and both respectively. BufferedRandom provides a buffered interface to random access streams. BytesIO is a simple stream of in-memory bytes.\n\nAnother IOBase subclass, TextIOBase, deals with the encoding and decoding of streams into text. TextIOWrapper, which extends it, is a buffered text interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO is an in-memory stream for text.\n\nArgument names are not part of the specification, and only the arguments of open() are intended to be used as keyword arguments.\n\ndata:\n\nDEFAULT_BUFFER_SIZE\n\n An int containing the default buffer size used by the module's buffered I/O classes. open() uses the file's blksize (as obtained by os.stat) if possible."], "HistoryEntry.who": ["history", "who", "", "HistoryEntry", "attribute", "A string giving the name of the character that is speaking, or None if no such string exists."], "RotoZoom": ["internal", "function", "()", "", "", ""], "Editor.open": ["editor", "open", "( filename, line=None, **kwargs)", "Editor", "method", "Opens a `filename` in the editor.\n\nIf `line` is not None, attempts to position the editing cursor at `line`."], "build": ["internal", "function", "()", "", "", ""], "BarValue.replaces": ["screen_python", "replaces", "(other)", "BarValue", "method", "This is called when a BarValue replaces another BarValue, such as when a screen is updated. It can be used to update this BarValue from the other. It is called before get_adjustment.\n\nNote that `other` is not necessarily the same type as `self`."], "gui.label_text_size": ["gui", "gui.label_text_size", " = 45", "", "var", "The size of section labels in the game's user interface."], "Alpha": ["internal", "function", "()", "", "", ""], "With": ["internal", "class", "(transition)", "", "Action", "Causes `transition` to occur."], "Gallery": ["internal", "class", "(self)", "", "", "This class supports the creation of an image gallery by handling the locking of images, providing an action that can show one or more images, and a providing method that creates buttons that use that action.\n\n.. attribute:: transition\n\nThe transition that is used when changing images.\n\n.. attribute:: locked_button\n\nThe default displayable used by make_button for a locked button.\n\n.. attribute:: hover_border\n\nThe default hover border used by make_button.\n\n.. attribute:: idle_border\n\nThe default idle border used by make_button.\n\n.. attribute:: unlocked_advance\n\nIf true, the gallery will only advance through unlocked images.\n\n.. attribute:: navigation\n\nIf true, the gallery will display navigation and slideshow buttons on top of the images.\n\nTo customize the look of the navigation, you may override the gallery_navigation screen. The default screen is defined in common/00gallery.rpy\n\n.. attribute:: span_buttons\n\nIf true, the gallery will advance between buttons.\n\n.. attribute:: slideshow_delay\n\nThe time it will take for the gallery to advance between images in slideshow mode."], "HistoryEntry.kind": ["history", "kind", "", "HistoryEntry", "attribute", "The kind of character that created this history. Ren'Py sets this to either \\adv\\ or \\nvl\\."], "_live2d_fade": ["live2d", "_live2d_fade", " = True", "", "var", "If true, Live2D animations use motion fading. If False, animations are transitioned abruptly."], "Button": ["internal", "class", "(child=None, style=u'button', clicked=None, hovered=None, unhovered=None, action=None, role=None, time_policy=None, keymap={}, alternate=None, selected=None, sensitive=None, keysym=None, alternate_keysym=None, **properties)", "", "", ""], "object": ["internal", "class", "(*args, **kwargs)", "", "", ""], "FileCurrentScreenshot": ["internal", "class", "(empty=None, **properties)", "", "", "A displayable that shows the screenshot that will be saved with the current file, if a screenshot has been taken when entering a menu or with :func:`FileTakeScreenshot`.\n\nIf there is no current screenshot, `empty` is shown in its place. (If `empty` is None, it defaults to :func:`Null`.)"], "director.spacing": ["director", "director.spacing", " = 1", "", "var", "The spacing between a director (scene, show, hide, with, play, queue, and voice) line and a non-director line, or vice versa. These spacings should be 0 or 1 lines, a higher spacing may not work."], "build.directory_name": ["build", "build.directory_name", " = \"...\"", "", "var", "This is used to create the names of directories in the archive files. For example, if this is set to \\mygame-1.0\\, the Linux version of the project will unpack to \\mygame-1.0-linux\\.\n\nThis is also used to determine the name of the directory in which the package files are placed. For example, if you set build.directory_name to mygame-1.0, the archive files will be placed in mygame-1.0-dists in the directory above the base directory.\n\nThis variable should not contain special characters like spaces, colons, and semicolons. If not set, it defaults to :var:`build.name` a dash, and :var:`config.version`."], "GetCharacterVolume": ["internal", "function", "(voice_tag)", "", "Action", "This returns the volume associated with voice tag, a number between 0.0 and 1.0, which is interpreted as a fraction of the mixer volume for the `voice` channel."], "achievement": ["internal", "function", "()", "", "", "The Achievement module allows the developer to grant achievements to the player, to clear achievements, and to determine if an achievement has been granted. It also allows the recording of progress towards an achievement.\n\nBy default, the achievement stores information in the persistent file. If Steam support is available and enabled, achievement information is automatically synchronized with Steam."], "icon": ["internal", "function", "()", "", "", ""], "ui.close": ["obsolete", "function", "()", "", "", "Closes a displayable created with by a UI function. When a displayable is closed, we add new displayables to its parent, or to the layer if no displayable is open."], "audio": ["internal", "function", "()", "", "", ""], "gui.REGULAR_BOLD": ["translating_renpy", "gui.REGULAR_BOLD", " = False", "", "var", "If True, heavy-weight text is bolded."], "doc": ["internal", "function", "()", "", "", ""], "shaderdoc": ["internal", "function", "()", "", "", ""], "easeinright": ["transitions", "easeinright", "", "", "var", "Also: **ease, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "Crop": ["internal", "function", "(rect, child, **properties)", "", "", "This creates a displayable by cropping `child` to `rect`, where `rect` is an (x, y, width, height) tuple.\n```\nimage eileen cropped = Crop((0, 0, 300, 300), \\eileen happy\\)\n```"], "Sample": ["language_basics", "Sample", "(name, delay, position=(0, 0), **properties)", "", "function", "A sample function that doesn't actually exist in Ren'Py, but is used only in documentation."], "Lexer.rest": ["cds", "rest", "()", "Lexer", "method", "Skips whitespace, then returns the rest of the line."], "YScrollValue": ["internal", "class", "(viewport)", "", "Action", "The value of an adjustment that vertically scrolls the viewport with the given id, on the current screen. The viewport must be defined before a bar with this value is."], "ADVCharacter": ["internal", "class", "(name=NotSet, kind=None, **properties)", "", "", "The character object contains information about a character. When passed as the first argument to a say statement, it can control the name that is displayed to the user, and the style of the label showing the name, the text of the dialogue, and the window containing both the label and the dialogue."], "iap.Product": ["internal", "class", "(product, identifier, google, amazon, ios, consumable)", "", "", "A data object representing a product."], "left": ["transforms", "left", "", "", "var", "Aligns to the bottom-left corner of the screen."], "ui.timer": ["obsolete", "ui.timer", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.accent_color": ["gui", "gui.accent_color", " = '#000060'", "", "var", "The accent color is used in many places in the GUI, including titles and labels."], "layeredimage.OrderedDict": ["internal", "class", "(*args, **kwds)", "", "", "Dictionary that remembers insertion order\n\nInitialize an ordered dictionary. The signature is the same as regular dictionaries, but keyword arguments are not recommended because their insertion order is arbitrary."], "Character": ["internal", "function", "(name=..., kind=adv, **args)", "", "", "Creates and returns a Character object, which controls the look and feel of dialogue and narration.\n\n`name` If a string, the name of the character for dialogue. When `name` is None, display of the name is omitted, as for narration. If no name is given, the name is taken from `kind`, and otherwise defaults to None.\n\n`kind` The Character to base this Character off of. When used, the default value of any argument not supplied to this Character is the value of that argument supplied to ``kind``. This can be used to define a template character, and then copy that character with changes.\n\n**Linked Image.** An image tag may be associated with a Character. This allows a say statement involving this character to display an image with the tag, and also allows Ren'Py to automatically select a side image to show when this character speaks.\n\n`image` A string giving the image tag that is linked with this character.\n\n**Voice Tag.** If a voice tag is assign to a Character, the voice files that are associated with it, can be muted or played in the preference screen.\n\n`voice_tag` A String that enables the voice file associated with the Character to be muted or played in the 'voice' channel.\n\n**Prefixes and Suffixes.** These allow a prefix and suffix to be applied to the name of the character, and to the text being shown. This can be used, for example, to add quotes before and after each line of dialogue.\n\n`what_prefix` A string that is prepended to the dialogue being spoken before it is shown.\n\n`what_suffix` A string that is appended to the dialogue being spoken before it is shown.\n\n`who_prefix` A string that is prepended to the name of the character before it is shown.\n\n`who_suffix` A string that is appended to the name of the character before it is shown.\n\n**Changing Name Display.** These options help to control the display of the name.\n\n`dynamic` If true, then `name` should either be a string containing a Python expression, a function, or a callable object. If it's a string, That string will be evaluated before each line of dialogue, and the result used as the name of the character. Otherwise, the function or callable object will be called with no arguments before each line of dialogue, and the return value of the call will be used as the name of the character.\n\n**Controlling Interactions.** These options control if the dialogue is displayed, if an interaction occurs, and the mode that is entered upon display.\n\n`condition` If given, this should be a string containing a Python expression. If the expression is false, the dialogue does not occur, as if the say statement did not happen.\n\n`interact` If true, the default, an interaction occurs whenever the dialogue is shown. If false, an interaction will not occur, and additional elements can be added to the screen.\n\n`advance` If true, the default, the player can click to advance through the statement, and other means of advancing (such as skip and auto-forward mode) will also work. If false, the player will be unable to move past the say statement unless an alternate means (such as a jump hyperlink or screen) is provided.\n\n`mode` A string giving the mode to enter when this character speaks. See the section on :ref:`modes ` for more details.\n\n`callback` A function that is called when events occur while the character is speaking. See the section on :ref:`character-callbacks` fore more information.\n\n**Click-to-continue.** A click-to-continue indicator is displayed once all the text has finished displaying, to prompt the user to advance.\n\n`ctc` A displayable to use as the click-to-continue indicator, unless a more specific indicator is used.\n\n`ctc_pause` A displayable to use a the click-to-continue indicator when the display of text is paused by the {p} or {w} text tags.\n\n`ctc_timedpause` A displayable to use a the click-to-continue indicator when the display of text is paused by the {p=} or {w=} text tags. When None, this takes its default from `ctc_pause`, use ``Null()`` when you want a `ctc_pause` but no `ctc_timedpause`.\n\n`ctc_position` Controls the location of the click-to-continue indicator. If ``\\nestled\\``, the indicator is displayed as part of the text being shown, immediately after the last character. ``\\nestled-close\\`` is similar, except a break is not allowed between the text and the CTC indicator. If ``\\fixed\\``, the indicator is added to the screen, and its position is controlled by the position style properties.\n\n **Screens.** The display of dialogue uses a :ref:`screen `. These arguments allow you to select that screen, and to provide arguments to it.\n\n`screen` The name of the screen that is used to display the dialogue.\n\nKeyword arguments beginning with ``show_`` have the prefix stripped off, and are passed to the screen as arguments. For example, the value of ``show_myflag`` will become the value of the ``myflag`` variable in the screen. (The ``myflag`` variable isn't used by default, but can be used by a custom say screen.)\n\nOne show variable is, for historical reasons, handled by Ren'Py itself:\n\n`show_layer` If given, this should be a string giving the name of the layer to show the say screen on.\n\n**Styling Text and Windows.** Keyword arguments beginning with ``who_``, ``what_``, and ``window_`` have their prefix stripped, and are used to :ref:`style ` the character name, the spoken text, and the window containing both, respectively.\n\nFor example, if a character is given the keyword argument ``who_color=\\#c8ffc8\\``, the color of the character's name is changed, in this case to green. ``window_background=\\frame.png\\`` sets the background of the window containing this character's dialogue.\n\nThe style applied to the character name, spoken text, and window can also be set this way, using the ``who_style``, ``what_style``, and ``window_style`` arguments, respectively.\n\nSetting :var:`config.character_id_prefixes` makes it possible to style other displayables as well. For example, when the default GUI is used, styles prefixed with ``namebox_`` are used to style the name of the speaking character."], "build.include_old_themes": ["build", "build.include_old_themes", " = True", "", "var", "When true, files required to support themes that existed before Ren'Py 6.99.9 will be included in the build. When false, such files are excluded.\n\nThis is set to False when :func:`gui.init` is called."], "FilePage": ["internal", "class", "(page)", "", "Action", "Sets the file page to `page`, which should be one of \\auto\\, \\quick\\, or an integer."], "_ignore_action": ["store_variables", "_ignore_action", " = None", "store", "var", "When this is not None, it's an action that is run after clicking Ignore on the error handling screen. The action is usually :func:`Jump`, to jump the game to a place that can recover from an error. If None, control continues with the next Ren'Py statement."], "iap.missing_products": ["internal", "function", "()", "", "", "Determines if any products are missing from persistent._iap_purchases"], "ui.add": ["obsolete", "ui.add", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ui.screen_id": ["obsolete", "function", "(id_, d)", "", "", "Assigns the displayable `d` the screen widget id `id_`, as if it had been created by a screen statement with that id."], "mouse_visible": ["store_variables", "mouse_visible", " = True", "store", "var", "Controls if the mouse is visible. This is automatically set to true when entering the standard game menus."], "gui.interface_text_size": ["gui", "gui.interface_text_size", " = 36", "", "var", "The size of static text in the game's user interface, and the default size of button text in the game's interface."], "preferences.afm_time": ["preferences", "preferences.afm_time", " = 15", "", "var", "The amount of time to wait for auto-forward mode. Bigger numbers are slower, though the conversion to wall time is complicated, as the speed takes into account line length. The equivalent of the \\auto-forward\\ preference."], "theme": ["internal", "function", "()", "", "", ""], "black": ["internal", "image", " = Solid(\"#000\")", "", "image", ""], "gui.SetPreference": ["internal", "class", "(name, value, rebuild=True)", "", "Action", "This Action sets the gui preference with `name` to `value`.\n\n`rebuild` If true, the default, :func:`gui.rebuild` is called to make the changes take effect. This should generally be true, except in the case of multiple gui.SetPreference actions, in which case it should be False in all but the last one.\n\nThis is a very slow action, and probably not suitable for use when a button is hovered."], "blinds": ["transitions", "blinds", "", "", "var", "Transitions the screen in a vertical blinds effect lasting 1 second. An instance of the :func:`ImageDissolve` transition class."], "director.audio_channel_patterns": ["director", "director.audio_channel_patterns", " = { }", "", "var", "A map from a channel name to the list of audio patterns that are available in that audio channel. For example, if this is set to ``{ 'sound' : [ 'sound/*.opus' ], 'music' : [ 'music/*.opus' ] }`` the music and sound channels get their own lists of patterns."], "ToggleDict": ["internal", "class", "(dict, key, true_value=None, false_value=None)", "", "Action", "Toggles the value of `key` in `dict`. Toggling means to invert the value when the action is performed.\n\n `true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "im.Alpha": ["obsolete", "function", "(image, alpha, **properties)", "", "", "Returns an alpha-mapped version of the image. Alpha is the maximum alpha that this image can have, a number between 0.0 (fully transparent) and 1.0 (opaque).\n\nIf an image already has an alpha channel, values in that alpha channel are reduced as appropriate."], "iap.has_purchased": ["internal", "function", "(product)", "", "", "Returns True if the user has purchased `product` in the past, and False otherwise."], "gui.insensitive_color": ["gui", "gui.insensitive_color", " = '#8888887f'", "", "var", "The color used by the text of buttons that are insensitive to user input. (For example, the rollback button when no rollback is possible.)"], "AudioPositionValue": ["internal", "class", "(channel=u'music', update_interval=0.1)", "", "Action", "A value that shows the playback position of the audio file playing in `channel`.\n\n`update_interval` How often the value updates, in seconds."], "Lexer.checkpoint": ["cds", "checkpoint", "()", "Lexer", "method", "Returns an opaque object representing the current state of the lexer."], "HistoryEntry.rollback_identifier": ["history", "rollback_identifier", "", "HistoryEntry", "attribute", "This is an identifier that can be passed to the :func:`RollbackToIdentifier` action, to cause a rollback to the line of script that generated this history entry. The rollback only occurs if the location is still in the script log, otherwise the action is insensitive."], "iap.AndroidBackend": ["internal", "class", "(store, store_name)", "", "", "The IAP backend that is used when IAP is supported."], "im.Data": ["obsolete", "class", "(data, filename, **properties)", "", "", "This image manipulator loads an image from binary data.\n\n`data` A string of bytes, giving the compressed image data in a standard file format.\n\n`filename` A \\filename\\ associated with the image. This is used to provide a hint to Ren'Py about the format of `data`. (It's not actually loaded from disk.)"], "build.remove": ["internal", "function", "(l, pattern)", "", "", "Removes the pattern from the list."], "default_transition": ["internal", "function", "()", "", "", ""], "ToggleVariable": ["internal", "function", "(variable, true_value=None, false_value=None)", "", "Action", "Toggles `variable`.\n\nThe `variable` argument must be a string, and can be a simple name like \\strength\\, or one with dots separating the variable from fields, like \\hero.strength\\ or \\persistent.show_cutscenes\\.\n\n `true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "im.Image": ["obsolete", "class", "(filename, **properties)", "", "", "This image manipulator loads an image from a file."], "Matrix.perspective": ["matrix", "Matrix.perspective", "(w, h, n, p, f)", "", "function", "Returns a matrix suitable for the perspective projection of an image in the Ren'Py coordinate system. This is a view into the a coordinate system where, where when z=0, (0, 0) corresponds to the top-left corner of the screen, and (w, h) corresponds to the bottom-right corner of the screen.\n\n`w`, `h` The width and height of the input plane, in pixels.\n\n`n` The distance of the near plane from the camera.\n\n`p` How far the z=0 plane is from the camera. This is also where one virtual pixel is one coordinate unit in x and y.\n\n`f` The distance of the far plane from the camera."], "voice_replay": ["internal", "function", "()", "", "", "Replays the current voice, if possible."], "Move": ["internal", "function", "()", "", "", ""], "irisout": ["transitions", "irisout", "", "", "var", "Also: **irisin**\n\nUse a rectangular iris to display the new screen, or hide the old screen. Instances of the :func:`CropMove` transition class."], "Editor": ["editor", "Editor", "", "", "class", ""], "build.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "BrightnessMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to change the brightness of an image, while leaving the Alpha channel alone.\n\n`value` The amount of change in image brightness. This should be a number between -1 and 1, with -1 the darkest possible image and 1 the brightest."], "gui.preference": ["internal", "function", "(name, default=not_set)", "", "", "This function returns the value of the gui preference with `name`.\n\n`default` If given, this value becomes the default value of the gui preference. The default value should be given the first time the preference is used."], "irisin": ["transitions", "irisin", "", "", "var", "Also: **irisout**\n\nUse a rectangular iris to display the new screen, or hide the old screen. Instances of the :func:`CropMove` transition class."], "Lexer.expect_eol": ["cds", "expect_eol", "()", "Lexer", "method", "If we are not at the end of the line, raise an error."], "build.name": ["build", "build.name", " = \"...\"", "", "var", "This is used to automatically generate build.directory_name and build.executable_name, if neither is set. This should not contain spaces, colons, or semicolons."], "set": ["internal", "class", "(*args)", "", "", ""], "director.other_spacing": ["director", "director.other_spacing", " = 0", "", "var", "The spacing between two consecutive non-director lines."], "ui.hbox": ["obsolete", "ui.hbox", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "slideawayleft": ["transitions", "slideawayleft", "", "", "var", "Also: **slideawayright, slideawayup, slideawaydown**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "MixerValue": ["internal", "class", "(mixer)", "", "Action", "The value of an audio mixer.\n\n `mixer` The name of the mixer to adjust. This is usually one of \\music\\, \\sfx\\, or \\voice\\, but creators can create new mixers."], "Action.get_sensitive": ["screen_python", "get_sensitive", "(self)", "Action", "method", "This is called to determine if the button with this action should be sensitive. It should return true if the button is sensitive.\n\nNote that __call__ can be called, even if this returns False.\n\nThe default implementation returns True."], "AlphaDissolve": ["transitions", "function", "(control, delay=0.0, alpha=False, reverse=False)", "", "", "Returns a transition that uses a control displayable (almost always some sort of animated transform) to transition from one screen to another. The transform is evaluated. The new screen is used where the transform is opaque, and the old image is used when it is transparent.\n\n`control` The control transform.\n\n`delay` The time the transition takes, before ending.\n\n`alpha` Ignored.\n\n`reverse` If true, the alpha channel is reversed. Opaque areas are taken from the old image, while transparent areas are taken from the new image."], "_game_menu_screen": ["store_variables", "_game_menu_screen", " = \"save\"", "store", "var", "This is the screen that is displayed when entering the game menu with no more specific screen selected. (For example, when right-clicking, pressing escape, or when :func:`ShowMenu` is not given an argument.) If None, entry to the game menu is disallowed.\n\nThis is set to None at the start of the splashscreen, and restored to its original value when the splashscreen ends."], "easeouttop": ["transitions", "easeouttop", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, ease, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "InputValue.default": ["screen_python", "default", "", "InputValue", "attribute", "If true, the input is eligible to be editable by default. (That is, it may be given the caret when the screen is shown.)"], "slideawaydown": ["transitions", "slideawaydown", "", "", "var", "Also: **slideawayright, slideawayup, slideawayleft**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "nvl_hide": ["internal", "function", "(with_)", "", "", "The Python equivalent of the ``nvl hide`` statement.\n\n`with_` The transition to use to hide the NVL-mode window."], "nvl_clear": ["internal", "function", "()", "", "", "The Python equivalent of the ``nvl clear`` statement."], "achievement.clear_all": ["internal", "function", "()", "", "", "Clears all achievements."], "Input": ["internal", "class", "(default=u'', length=None, style=u'input', allow=None, exclude=None, prefix=u'', suffix=u'', changed=None, button=None, replaces=None, editable=True, pixel_width=None, value=None, copypaste=False, caret_blink=None, **properties)", "", "", "This is a Displayable that takes text as input."], "slideright": ["transitions", "slideright", "", "", "var", "Also: **slideleft, slideup, slidedown**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "FileCurrentPage": ["internal", "function", "()", "", "Action", "Returns the current file page as a string."], "EndReplay": ["internal", "class", "(confirm=True)", "", "Action", "Ends the current replay.\n\n`confirm` If true, prompts the user for confirmation before ending the replay."], "extend": ["internal", "function", "(what, interact=True, *args, **kwargs)", "", "", ""], "Matrix.scale": ["matrix", "Matrix.scale", "(x, y, z)", "", "function", "Returns a matrix that scales the displayable.\n\n`x`, `y`, `z` The factor to scale each axis by."], "Style.take": ["style", "take", "(other)", "Style", "method", "This takes all style properties from `other`. `other` must be a style object."], "FileTime": ["internal", "function", "(name, format=u'%b %d, %H:%M', empty=u'', page=None, slot=False)", "", "Action", "Returns the time the file was saved, formatted according to the supplied `format`. If the file is not found, `empty` is returned.\n\n The return value is a string."], "Queue": ["internal", "class", "(channel, file, **kwargs)", "", "Action", "Causes an audio file to be queued on a given channel.\n\n `channel` The channel to play the sound on. `file` The file to play.\n\n Any keyword arguments are passed to :func:`renpy.music.queue`"], "RemoveFromSet": ["internal", "class", "(set, value)", "", "Action", "Removes `value` from `set`.\n\n`set` The set to remove from. This may be a set or list. `value` The value to remove."], "gui.navigation_button_width": ["gui", "gui.navigation_button_width", " = 290", "", "var", "Increases the width of navigation buttons."], "InputValue.get_text": ["screen_python", "get_text", "(self)", "InputValue", "method", "Returns the default text of the input. This must be implemented."], "blend_parameter": ["live2d", "blend_parameter", "(name, blend, value, weight=1.0)", "", "method", "This method blends the current value of the parameter with passed. This have no effect outside of `update_function`.\n\n`name` Name of parameter to change defined for this model.\n\n`blend` One of \\Add\\, \\Multiply\\ or \\Overwrite\\. The blend kind that will be used.\n\n`value` The value to be used.\n\n`weight` Float from 0.0 to 1.0, the weight by which the new value will change the current value."], "HBox": ["internal", "function", "(*args, **properties)", "", "", "A box that lays out its members from left to right."], "Lexer.image_name_component": ["cds", "image_name_component", "()", "Lexer", "method", "Matches an image name component. Unlike a word, a image name component can begin with a number."], "ui.vbar": ["obsolete", "ui.vbar", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "store": ["internal", "function", "()", "", "", ""], "preferences.set_mute": ["preferences", "preferences.set_mute", "(mixer, mute):", "", "function", "Sets the mute setting for `mixer`. If `mute` is true, the mixer is muted."], "moveoutbottom": ["transitions", "moveoutbottom", "", "", "var", "Also: **moveoutleft, moveouttop, moveoutright**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "gui.bar_size": ["gui", "gui.bar_size", " = 64", "", "var", "The height of horizontal bars, and width of vertical bars."], "gui.slot_button_height": ["gui", "gui.slot_button_height", " = 309", "", "var", "The width and height of the save slot button."], "gui.notify_text_size": ["gui", "gui.notify_text_size", " = 24", "", "var", "The size of notification text."], "iap.init": ["internal", "function", "()", "", "", "Called to initialize the IAP system."], "Scroll": ["internal", "class", "(id, direction, amount=u'step')", "", "Action", "Causes a Bar, Viewport, or Vpgrid to scroll.\n\n`id` The id of a bar, viewport, or vpgrid in the current screen.\n\n`direction` For a vbar, one of \\increase\\ or \\decrease\\. For a viewport or vpgrid, one of \\horizontal increase\\, \\vertical increase\\, \\horizontal decrease\\, or \\vertical decrease\\.\n\n`amount` The amount to scroll by. This can be a number of pixels, or else \\step\\ or \\page\\."], "gui.text_font": ["gui", "gui.text_font", " = \"ArchitectsDaughter.ttf\"", "", "var", "This sets the font that is used for dialogue text, menus, inputs, and other in-game text. The font file should exist in the game directory."], "name_only": ["internal", "function", "()", "", "", "This is a template character that is used when a string is given as the character name in a say statement."], "color": ["internal", "class", "()", "", "", ""], "Transform": ["internal", "class", "(child=None, function=None, style=u'default', focus=None, default=False, _args=None, **kwargs)", "", "", "A transform applies operations such as cropping, rotation, scaling, and alpha-blending to its child. A transform object has fields corresponding to the transform properties, which it applies to its child."], "gui.hover_color": ["gui", "gui.hover_color", " = '#3284d6'", "", "var", "The color used by focused items in the GUI, including the text of of buttons and the thumbs (movable areas) of sliders and scrollbars."], "updater.UpdateError": ["internal", "class", "()", "", "", "Used to report known errors."], "FileSave": ["internal", "class", "(name, confirm=True, newest=True, page=None, cycle=False, slot=False)", "", "Action", "Saves the file.\n\n The button with this slot is selected if it's marked as the newest save file.\n\n `name` The name of the slot to save to. If None, an unused slot (a large number based on the current time) will be used.\n\n `confirm` If true, then we will prompt before overwriting a file.\n\n `newest` Ignored.\n\n `page` The name of the page that the slot is on. If None, the current page is used.\n\n `cycle` If true, then saves on the supplied page will be cycled before being shown to the user. :var:`config.quicksave_slots` slots are used in the cycle.\n\n `slot` If True, `name` is taken to be a slot name, and `page` is ignored."], "Borders": ["internal", "class", "(left, top, right, bottom, pad_left=0, pad_top=0, pad_right=0, pad_bottom=0)", "", "", "This object provides border size and tiling information to a :func:`Frame`. It can also provide padding information that can be supplied to the :propref:`padding` style property of a window or frame.\n\n`left`, `top`, `right`, `bottom` These provide the size of the insets used by a frame, and are added to the padding on each side. They should zero or a positive integer.\n\n`pad_left`, `pad_top`, `pad_right`, `pad_bottom` These are added to the padding on each side, and may be positive or negative. (For example, if `left` is 5 and `pad_left` is -3, the final padding is 2.)\n\nThe padding information is supplied via a field:\n\n.. attribute\n```\npadding\n\nThis is a four-element tuple containing the padding on each of the\nfour sides.\n```"], "im.Twocolor": ["obsolete", "class", "(im, white, black, force_alpha=False, **properties)", "", "", "This takes as arguments two colors, white and black. The image is mapped such that pixels in white have the white color, pixels in black have the black color, and shades of gray are linearly interpolated inbetween. The alpha channel is mapped linearly between 0 and the alpha found in the white color, the black color's alpha is ignored."], "ShowMenu": ["internal", "class", "(screen=None, *args, **kwargs)", "", "Action", "Causes us to enter the game menu, if we're not there already. If we are in the game menu, then this shows a screen or jumps to a label.\n\n `screen` is usually the name of a screen, which is shown using the screen mechanism. If the screen doesn't exist, then \\_screen\\ is appended to it, and that label is jumped to.\n\n If the optional keyword argument `_transition` is given, the menu will change screens using the provided transition. If not manually specified, the default transition is `config.intra_transition`.\n\n * ShowMenu(\\load\\) * ShowMenu(\\save\\) * ShowMenu(\\preferences\\)\n\n This can also be used to show user-defined menu screens. For example, if one has a \\stats\\ screen defined, one can show it as part of the game menu using:\n\n * ShowMenu(\\stats\\)\n\n ShowMenu without an argument will enter the game menu at the default screen, taken from _game_menu_screen.\n\n Extra arguments and keyword arguments are passed on to the screen"], "ConditionSwitch": ["internal", "function", "(*args, predict_all=None, **properties)", "", "", "This is a displayable that changes what it is showing based on Python conditions. The positional arguments should be given in groups of two, where each group consists of:\n\n* A string containing a Python condition. * A displayable to use if the condition is true.\n\nThe first true condition has its displayable shown, at least one condition should always be true.\n\nThe conditions uses here should not have externally-visible side-effects.\n\n`predict_all` If True, all of the possible displayables will be predicted when the displayable is shown. If False, only the current condition is predicted. If None, :var:`config.conditionswitch_predict_all` is used.\n```\nimage jill = ConditionSwitch(\n\\jill_beers > 4\\, \\jill_drunk.png\\,\n\\True\\, \\jill_sober.png\\)\n```"], "BarValue.periodic": ["screen_python", "periodic", "(st)", "BarValue", "method", "This method is called once at the start of each interaction. If it returns a number of seconds, it will be called before that many seconds elapse, but it might be called sooner. It is called after get_adjustment.\n\nIt can be used to update the value of the bar over time, like :func:`AnimatedValue` does. To do this, get_adjustment should store the adjustment, and periodic should call the adjustment's changed method."], "Style.set_parent": ["style", "set_parent", "(parent)", "Style", "method", "Sets the parent of this style object to `parent`."], "gui.button_text_xalign": ["gui", "gui.button_text_xalign", " = 0.0", "", "var", "The horizontal alignment of the button text. 0.0 is left-aligned, 0.5 is centered, and 1.0 is right-aligned."], "FileLoad": ["internal", "class", "(name, confirm=True, page=None, newest=True, cycle=False, slot=False)", "", "Action", "Loads the file.\n\n `name` The name of the slot to load from. If None, an unused slot will be used, and hence the file will not be loadable.\n\n `confirm` If true and not at the main menu, prompt for confirmation before loading the file.\n\n `page` The page that the file will be loaded from. If None, the current page is used.\n\n `newest` If true, the button is selected if this is the newest file.\n\n `cycle` Ignored.\n\n `slot` If True, `name` is taken to be a slot name, and `page` is ignored."], "im.MatrixColor": ["obsolete", "class", "(im, matrix, **properties)", "", "", "An image operator that uses `matrix` to linearly transform the image manipulator `im`.\n\n`Matrix` should be a list, tuple, or :func:`im.matrix` that is 20 or 25 elements long. If the object has 25 elements, then elements past the 20th are ignored.\n\nWhen the four components of the source color are R, G, B, and A, which range from 0.0 to 1.0; the four components of the transformed color are R', G', B', and A', with the same range; and the elements of the matrix are named::\n\n[ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]\n\nthe transformed colors can be computed with the formula::\n\nR' = (a * R) + (b * G) + (c * B) + (d * A) + e G' = (f * R) + (g * G) + (h * B) + (i * A) + j B' = (k * R) + (l * G) + (m * B) + (n * A) + o A' = (p * R) + (q * G) + (r * B) + (s * A) + t\n\nThe components of the transformed color are clamped to the range [0.0, 1.0]."], "gui.name_text_size": ["gui", "gui.name_text_size", " = 45", "", "var", "Sets the size of character names."], "slideawayup": ["transitions", "slideawayup", "", "", "var", "Also: **slideawayright, slideawayleft, slideawaydown**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "gui.nvl_spacing": ["gui", "gui.nvl_spacing", " = 15", "", "var", "The spacing between entries when gui.nvl_height is None, and the spacing between NVL-mode menu buttons."], "gui.init": ["internal", "function", "(width, height, fov=75)", "", "", "Initializes the gui.\n\n`width` The width of the default window.\n\n`height` The height of the default window.\n\n`fov` The field of view of the 3d stage."], "_dismiss_pause": ["store_variables", "_dismiss_pause", " = True", "store", "var", "If True, the player can dismiss pauses and transitions."], "build.clear": ["internal", "function", "()", "", "", "Clears the list of patterns used to classify files."], "gui.hover_muted_color": ["gui", "gui.hover_muted_color", " = '#8080f0'", "", "var", "Muted colors, used for the sections of bars, scrollbars, and sliders that do not represent the value or visible area. (These are only used when generating images, and will not take effect until images are regenerated in the launcher.)"], "makeJson": ["internal", "function", "()", "", "", ""], "gui.unscrollable": ["gui", "gui.unscrollable", " = \"hide\"", "", "var", "This controls what to do if the bar is unscrollable. \\hide\\ hides the bar, while None keeps it shown."], "im.free_memory": ["obsolete", "function", "()", "", "", "Frees some memory."], "im.Tile": ["obsolete", "class", "(im, size=None, **properties)", "", "", "An image manipulator that tiles the image manipulator `im`, until it is `size`.\n\n`size` If not None, a (width, height) tuple. If None, this defaults to (:var:`config.screen_width`, :var:`config.screen_height`).\n\nThe same effect can now be achieved with Tile(im, size=size)"], "Action": ["internal", "class", "()", "", "", "Returns an action that is generally used as the hovered property of a button. When the button is hovered, the value field of this tooltip is set to `value`. When the button loses focus, the value field of this tooltip reverts to the default."], "im.FactorScale": ["obsolete", "class", "(im, width, height=None, bilinear=True, **properties)", "", "", "An image manipulator that scales `im` (a second image manipulator) to `width` times its original `width`, and `height` times its original height. If `height` is omitted, it defaults to `width`.\n\nIf `bilinear` is true, then bilinear interpolation is used for the scaling. Otherwise, nearest neighbor interpolation is used.\n```\nimage logo doubled = im.FactorScale(\\logo.png\\, 1.5)\n\nThe same effect can now be achieved with the :tpref:`zoom` or the\n:tpref:`xzoom` and :tpref:`yzoom` transform properties.\n```"], "preferences.system_cursor": ["preferences", "preferences.system_cursor", " = False", "", "var", "If True, the system cursor is forced to be used, ignoring the :var:`config.mouse` value. If False, it will not. The equivalent of the \\system cursor\\ preference."], "MoveOut": ["internal", "function", "()", "", "", ""], "preferences.emphasize_audio": ["preferences", "preferences.emphasize_audio", " = False", "", "var", "If True, Ren'Py will emphasize the audio channels found in :var:`config.emphasize_audio_channels` by reducing the volume of other channels. (For example, reducing the music volume when voice is playing.) If False, this doesn't happen."], "iap.purchase": ["internal", "function", "(product, interact=True)", "", "", "This function requests the purchase of `product`.\n\nIt returns true if the purchase succeeds, or false if the purchase fails. If the product has been registered as consumable, the purchase is consumed before this call returns."], "im.Sepia": ["obsolete", "function", "(im, **properties)", "", "", "An image manipulator that creates a sepia-toned version of the image manipulator `im`.\n\nThe same effect can now be achieved by supplying SepiaMatrix() to the :tpref:`matrixcolor` transform property."], "StylePreference": ["internal", "class", "(preference, alternative)", "", "Action", "An action that causes `alternative` to become the selected alternative for the given style preference.\n\n`preference` A string giving the name of the style preference.\n\n`alternative` A string giving the name of the alternative."], "ui.null": ["obsolete", "ui.null", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "Action.get_tooltip": ["screen_python", "get_tooltip", "(self)", "Action", "method", "This gets a default tooltip for this button, if a specific tooltip is not assigned. It should return the tooltip value, or None if a tooltip is not known.\n\nThis defaults to returning None."], "_window_subtitle": ["store_variables", "_window_subtitle", " = ''", "store", "var", "This is appended to :var:`config.window_title` to produce the caption for the game window. This is automatically set to :var:`config.menu_window_subtitle` while in the game menu."], "gui.idle_small_color": ["gui", "gui.idle_small_color", " = '#404040'", "", "var", "The color used for small text (like the date and name of a save slot, and quick menu buttons) when not hovered. This color often needs to be a bit lighter or darker than idle_color to compensate for the smaller size of the font."], "gui.textbox_height": ["gui", "gui.textbox_height", " = 278", "", "var", "The height of the textbox. This should be the same height as the height of gui/textbox.png."], "save_name": ["internal", "function", "()", "", "", "A save name that is included with saves."], "im.Crop": ["obsolete", "class", "(im, rect)", "", "", "An image manipulator that crops `rect`, a (x, y, width, height) tuple, out of `im`, an image manipulator.\n```\nimage logo crop = im.Crop(\\logo.png\\, (0, 0, 100, 307))\n\nThe same effect can now be achieved by setting the :tpref:`crop` transform property.\n```"], "gui.FONT_SCALE": ["translating_renpy", "gui.FONT_SCALE", " = 1.0", "", "var", "A scaling factor that is applied to all text in the launcher."], "achievement.sync": ["internal", "function", "()", "", "", "Synchronizes registered achievements between local storage and other backends. (For example, Steam.)"], "SetLocalVariable": ["internal", "function", "(name, value)", "", "Action", "Causes the variable `name` to be set to `value` in the current local context.\n\nThis function is only useful in a screen that has been use by another scene, as it provides a way of setting the value of a variable inside the used screen. In all other cases, :func:`SetScreenVariable` should be preferred, as it allows more of the screen to be cached.\n\nThis must be created in the context that the variable is set in - it can't be passed in from somewhere else."], "director.tag_blacklist": ["director", "director.tag_blacklist", " = { \"black\", \"text\", \"vtext\" }", "", "var", "A blacklist of tags that will not be shown for the show, scene, or hide statements."], "PlayCharacterVoice": ["internal", "class", "(voice_tag, sample, selected=False)", "", "Action", "This plays `sample` on the voice channel, as if said by a character with `voice_tag`.\n\n`sample` The full path to a sound file. No voice-related handling of this file is done.\n\n`selected` If True, buttons using this action will be marked as selected while the sample is playing."], "ui.prefixed_style": ["obsolete", "function", "(style_suffix)", "", "", "Combines the default style prefix with a style suffix."], "Fade": ["transitions", "function", "(out_time, hold_time, in_time, color=\"#000\")", "", "", "Returns a transition that takes `out_time` seconds to fade to a screen filled with `color`, holds at that screen for `hold_time` seconds, and then takes `in_time` to fade to then new screen.\n```\n# Fade to black and back.\ndefine fade = Fade(0.5, 0.0, 0.5)\n\n# Hold at black for a bit.\ndefine fadehold = Fade(0.5, 1.0, 0.5)\n\n# Camera flash - quickly fades to white, then back to the scene.\ndefine flash = Fade(0.1, 0.0, 0.5, color=\\#fff\\)\n```"], "ui.vbox": ["obsolete", "ui.vbox", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "GetTooltip": ["internal", "function", "(screen=None)", "", "Action", "Returns the tooltip of the currently focused displayable, or None if no displatable is focused.\n\n`screen` If not None, this should be the name or tag of a screen. If given, this function only returns the tooltip if the focused displayable is part of the screen."], "unicode_literals": ["internal", "function", "()", "", "", ""], "build.mac_info_plist": ["build", "build.mac_info_plist", " = { }", "", "var", "This is a dictionary mapping strings to strings, that can be used to add or override keys in the mac's Info.plist file."], "ShowingSwitch": ["internal", "function", "(*args, predict_all=None, **properties)", "", "", "This is a displayable that changes what it is showing based on the images are showing on the screen. The positional argument should be given in groups of two, where each group consists of:\n\n* A string giving an image name, or None to indicate the default. * A displayable to use if the condition is true.\n\nA default image should be specified.\n\n`predict_all` If True, all of the possible displayables will be predicted when the displayable is shown. If False, only the current condition is predicted. If None, :var:`config.conditionswitch_predict_all` is used.\n\nOne use of ShowingSwitch is to have images change depending on the current emotion of a character. For example\n```\nimage emotion_indicator = ShowingSwitch(\n\\eileen concerned\\, \\emotion_indicator concerned\\,\n\\eileen vhappy\\, \\emotion_indicator vhappy\\,\nNone, \\emotion_indicator happy\\)\n\n```"], "gui.button_tile": ["gui", "gui.button_tile", " = True", "", "var", "If true, the sides and center of the button background are tiled to increase or decrease their size. If false, the sides and center are scaled."], "im": ["obsolete", "function", "()", "", "", "An image manipulator is a displayable that takes an image or image manipulator, and either loads it or performs an operation on it. Image manipulators can only take images or other image manipulators as input.\n\nWith the few exceptions listed below, the use of image manipulators is historic. A number of image manipulators that had been documented in the past should no longer be used, as they suffer from inherent problems. In any case except for im.Data, the Transform() displayable provides similar functionality in a more general manner, while fixing the problems, although it sometimes requires gl2 to be enabled."], "achievement.register": ["internal", "function", "(name, **kwargs)", "", "", "Registers an achievement. Achievements are not required to be registered, but doing so allows one to pass information to the backends.\n\n`name` The name of the achievement to register.\n\nThe following keyword parameters are optional.\n\n`steam` The name to use on steam. If not given, defaults to `name`.\n\n`stat_max` The integer value of the stat at which the achievement unlocks.\n\n`stat_modulo` If the progress modulo `stat_max` is 0, progress is displayed to the user. For example, if stat_modulo is 10, progress will be displayed to the user when it reaches 10, 20, 30, etc. If not given, this defaults to 0."], "pushdown": ["transitions", "pushdown", "", "", "var", "Also: **pushleft, pushup, pushright**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "Bar": ["internal", "class", "(range=None, value=None, width=None, height=None, changed=None, adjustment=None, step=None, page=None, bar=None, style=None, vertical=False, replaces=None, hovered=None, unhovered=None, released=None, **properties)", "", "", "Implements a bar that can display an integer value, and respond to clicks on that value."], "ConditionGroup": ["internal", "class", "(conditions)", "", "", "Combines a list of conditions into a single ConditionSwitch."], "FieldValue": ["internal", "class", "(object, field, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A bar value that allows the user to adjust the value of a field on an object.\n\n `object` The object. `field` The field, a string. `range` The range to adjust over. `max_is_zero` If True, then when the field is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the field is set to 0.\n\n This is used internally, for some preferences. `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "gui.button_properties": ["internal", "function", "(kind)", "", "", "Given a `kind` of button, returns a dictionary giving standard style properties for that button. This sets:\n\n:propref:`background` As described below.\n\n:propref:`padding` To gui.kind_borders.padding (if it exists).\n\n:propref:`xsize` To gui.kind_width (if it exists).\n\n:propref:`ysize` To gui.kind_height (if it exists).\n\n(Note that if `kind` is the string \\nvl_button\\, this will look for the gui.nvl_button_background variable.)\n\nThe background is a frame that takes its background picture from the first existing one of:\n\n* gui/button/kind_[prefix\\_].background.png * gui/button/[prefix\\_].background.png\n\nIf a gui variables named gui.kind_borders exists, it's used. Otherwise, :var:`gui.button_borders` is used. If gui.kind_tile exists, it determines if the borders are tiled, else :var:`gui.button_tile` controls tiling.\n\nFor what [prefix\\_] means, check out the :ref:`style prefix search ` documentation."], "Return": ["internal", "class", "(value=None)", "", "Action", "Causes the current interaction to return the supplied value, which must not be None. This is often used with menus and imagemaps, to select what the return value of the interaction is. If the screen was called using the ``call screen`` statement, the return value is placed in the `_return` variable.\n\n When in a menu, this returns from the menu. (The value should be None in this case.)"], "_history": ["store_variables", "_history", " = True", "store", "var", "If true, Ren'Py will record dialogue history when a line is shown. (Note that :var:`config.history_list_length` must be set as well.)"], "gui.choice_text_hover_color": ["gui", "gui.choice_text_hover_color", " = '#0066cc'", "", "var", "The color used for the text of focused choice buttons."], "NullAction": ["internal", "class", "(*args, **kwargs)", "", "Action", "Does nothing.\n\nThis can be used to make a button responsive to hover/unhover events, without actually doing anything."], "ui.grid": ["obsolete", "ui.grid", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "achievement.has": ["internal", "function", "(name)", "", "", "Returns true if the player has been granted the achievement with `name`."], "build.executable": ["internal", "function", "(pattern)", "", "", "Adds a pattern marking files as executable on platforms that support it. (Linux and Macintosh)"], "define.old_move_transitions": ["internal", "function", "(delay=1.0, vertical=False, reverse=False, background=\"#000\", flatten=True)", "", "", "A transitions that rotates the old scene 90 degrees around an axis, so that it is edge on with the viewer, switches to the new scene, and then rotates that scene another 90 degrees to show the new scene to the viewer.\n\n`delay` How long the transition should take.\n\n`vertical` If true, the scene is rotate around the x-axis (pixels move vertically). If false, the scene is roated around the y axis, pixels moving horizontally.\n\n`reverse` When true, the rotation occurs in the reverse direction.\n\n`background` A displayable that is placed behind the scene as it rotates.\n\n`flatten` If true, the scenes are flattened into images the size of the screen before being rotated. Use this if images being not entirely on the screen causes undesired effects."], "HistoryEntry": ["history", "HistoryEntry", "", "", "class", "The _history_list variable stores the actual history, as a list of HistoryEntry objects."], "_in_replay": ["rooms", "_in_replay", "", "", "var", "When in replay mode, this is sent to the label at which replay mode was started. Outside of replay mode, this is None."], "RollbackToIdentifier": ["internal", "class", "(identifier)", "", "Action", "This causes a rollback to an identifier to occur. Rollback identifiers are returned as part of HistoryEntry objects."], "SaturationMatrix": ["internal", "class", "(value, desat=(0.2126, 0.7152, 0.0722))", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` that alters the saturation of an image, while leaving the alpha channel alone.\n\n`value` The amount of saturation in the resulting image. 1.0 is the unaltered image, while 0.0 is grayscale.\n\n`desat` This is a 3-element tuple that controls how much of the red, green, and blue channels will be placed into all three channels of a fully desaturated image. The default is based on the constants used for the luminance channel of an NTSC television signal. Since the human eye is mostly sensitive to green, more of the green channel is kept then the other two channels."], "MouseMove": ["internal", "class", "(x, y, duration=0)", "", "Action", "Move the mouse pointer to `x`, `y`. If the device does not have a mouse pointer or _preferences.mouse_move is False, this does nothing.\n\n`duration` The time it will take to perform the move, in seconds. During this time, the mouse may be unresponsive."], "Lexer.simple_expression": ["cds", "simple_expression", "()", "Lexer", "method", "Matches a simple Python expression, returns it as a string. This is often used when you expect a variable name. It is not recommended to change the result. The correct action is to evaluate the result in the future."], "PushMove": ["transitions", "function", "(time, mode=\"pushright\")", "", "", "Returns a transition that works by taking the new scene and using it to \\push\\ the old scene off the screen.\n\n`time` The time the transition takes.\n\n`mode` There are four possible modes: \\pushright\\, \\pushleft\\, \\pushup\\, and \\pushdown\\, which push the old scene off the screen in the direction indicated.\n```\ndefine pushright = PushMove(1.0, \\pushright\\)\ndefine pushleft = PushMove(1.0, \\pushleft\\)\ndefine pushup = PushMove(1.0, \\pushup\\)\ndefine pushdown = PushMove(1.0, \\pushdown\\)\n```"], "ui.imagemap": ["obsolete", "ui.imagemap", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "FileScreenshot": ["internal", "function", "(name, empty=None, page=None, slot=False)", "", "Action", "Returns the screenshot associated with the given file. If the file is not loadable, then `empty` is returned, unless it's None, in which case, a Null displayable is created.\n\n The return value is a displayable."], "iap.NoneBackend": ["internal", "class", "(*args, **kwargs)", "", "", "The IAP backend that is used when IAP is not supported."], "IdentityMatrix": ["internal", "class", "()", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` that does not change the color or alpha of what is supplied to it.\n\n`value` Is ignored."], "im.AlphaMask": ["obsolete", "class", "(base, mask, **properties)", "", "", "An image manipulator that takes two image manipulators, `base` and `mask`, as arguments. It replaces the alpha channel of `base` with the red channel of `mask`.\n\nThis is used to provide an image's alpha channel in a second image, like having one jpeg for color data, and a second one for alpha. In some cases, two jpegs can be smaller than a single png file.\n\nNote that this takes different arguments from :func:`AlphaMask`, which uses the mask's alpha channel."], "zoomin": ["transitions", "zoomin", "", "", "var", "This zooms in entering images, taking 0.5 seconds to do so."], "_skipping": ["store_variables", "_skipping", " = True", "store", "var", "Controls if skipping is allowed."], "ui.input": ["obsolete", "ui.input", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "center": ["transforms", "center", "", "", "var", "Centers horizontally, and aligns to the bottom of the screen."], "director.transitions": ["director", "director.transitions", " = [ \"dissolve\", \"pixellate\" ]", "", "var", "A list of transitions that are available to the with statement. Since transitions can't be auto-detected, these must be added manually."], "SelectedIf": ["internal", "class", "(expression)", "", "Action", "This indicates that one action in a list of actions should be used to determine if a button is selected. This only makes sense when the button has a list of actions. For example\n```\n# The button is selected only if mars_flag is True\ntextbutton \\Marsopolis\\:\naction [ SelectedIf(SetVariable(\\mars_flag\\, True)), SetVariable(\\on_mars\\, True) ]\n\nThe action inside SelectedIf is run normally when the button is clicked.\n```"], "pygame_sdl2": ["internal", "function", "()", "", "", ""], "SensitiveIf": ["internal", "class", "(expression)", "", "Action", "This indicates that one action in a list of actions should be used to determine if a button is sensitive. This only makes sense when the button has a list of actions. For example\n```\n# The button is sensitive only if mars_flag is True\ntextbutton \\Marsopolis\\:\naction [ SensitiveIf(SetVariable(\\mars_flag\\, True)), SetVariable(\\on_mars\\, True) ]\n\nThe action inside SensitiveIf is run normally when the button is clicked.\n```"], "hyperlink_function": ["internal", "function", "(target)", "", "", ""], "gui.button_height": ["gui", "gui.button_height", " = 64", "", "var", "The width and height of a button, in pixels. If None, the size is automatically determined based on the size of the text inside a button, and the borders given below."], "ui.button": ["obsolete", "ui.button", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.check_button_borders": ["gui", "gui.check_button_borders", " = Borders(40, 10, 10, 10)", "", "var", "Increases the width of radio and check button borders, leaving extra space on the left for the check mark."], "build.destination": ["build", "build.destination", " = \"{directory_name}-dists\"", "", "var", "Gives the path to the directory the archive files will be placed in. This may be an absolute or a relative path. A relative path is considered to be relative to the projects directory.\n\nThe following values are substituted in using Python's ``str.format`` function.\n\n``{directory_name}`` The value of build.directory_name.\n\n``{executable_name}`` The value of build.executable_name.\n\n``{version}`` The value of build.version."], "offscreenright": ["transforms", "offscreenright", "", "", "var", "Places the displayable off the left side of the screen, aligned to the bottom of the screen."], "If": ["internal", "function", "(expression, true=None, false=None)", "", "Action", "This returns `true` if `expression` is true, and `false` otherwise. Use this to select an action based on an expression. Note that the default, None, can be used as an action that causes a button to be disabled."], "iap.Purchase": ["internal", "class", "(product, success=None)", "", "Action", "An action that attempts the purchase of `product`. This action is sensitive if and only if the product is purchasable (a store is enabled, and the product has not already been purchased.)\n\n`success` If not None, this is an action or list of actions that are run when the purchase succeeds."], "ui.side": ["obsolete", "ui.side", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ToggleSetMembership": ["internal", "class", "(set, value)", "", "Action", "Toggles the membership of `value` in `set`. If the value is not in the set, it's added. Otherwise, it is removed.\n\nButtons with this action are marked as selected if and only if the value is in the set.\n\n`set` The set to add to or remove from. This may be a set or list. In the case of a list, new items are appended. `value` The value to add or append."], "nvl_variant": ["internal", "function", "()", "", "", ""], "absolute_import": ["internal", "function", "()", "", "", ""], "iap.get_price": ["internal", "function", "(product)", "", "", "Returns a string giving the price of the `product` in the user's local currency. Returns None if the price of the product is unknown - which indicates the product cannot be purchased."], "InputValue": ["internal", "class", "()", "", "", ""], "iap.Restore": ["internal", "class", "()", "", "Action", "An Action that contacts the app store and restores any missing purchases."], "config": ["internal", "function", "()", "", "", "Configuration variables control the behavior of Ren'Py's implementation, allowing Ren'Py itself to be customized in a myriad of ways. These range from the common (such as changing the screen size) to the obscure (adding new kinds of archive files).\n\nRen'Py's implementation makes the assumption that, once the GUI system has initialized, configuration variables will not change. Changing configuration variables outside of init blocks can lead to undefined behavior. Configuration variables are not part of the save data."], "ZoomInOut": ["internal", "function", "()", "", "", ""], "XScrollValue": ["internal", "class", "(viewport)", "", "Action", "The value of an adjustment that horizontally scrolls the viewport with the given id, on the current screen. The viewport must be defined before a bar with this value is."], "adv": ["internal", "function", "()", "", "", "This is a template ADV-mode character, and the default character kind that is used when `Character()` is called."], "nvl": ["internal", "function", "()", "", "", ""], "AlphaMask": ["internal", "class", "(child, mask, **properties)", "", "", "This displayable takes its colors from `child`, and its alpha channel from the multiplication of the alpha channels of `child` and `mask`. The result is a displayable that has the same colors as `child`, is transparent where either `child` or `mask` is transparent, and is opaque where `child` and `mask` are both opaque.\n\nThe `child` and `mask` parameters may be arbitrary displayables. The size of the AlphaMask is the size of `child`.\n\nNote that this takes different arguments from :func:`im.AlphaMask`, which uses the mask's red channel."], "SubTransition": ["internal", "function", "()", "", "", "Applies a transition to a subset of the screen. Not documented."], "ease": ["transitions", "ease", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "gui.nvl_button_xalign": ["gui", "gui.nvl_button_xalign", " = 0.5", "", "var", "The position and alignment of NVL-mode menu buttons."], "build.include_update": ["build", "build.include_update", " = False", "", "var", "When true, Ren'Py will produce the files required for the :ref:`updater ` to work."], "gui.frame_borders": ["gui", "gui.frame_borders", " = Borders(15, 15, 15, 15)", "", "var", "The borders applied to frame windows."], "FileAction": ["internal", "function", "(name, page=None, **kwargs)", "", "Action", "\\Does the right thing\\ with the file. This means loading it if the load screen is showing (current screen is named \\load\\), and saving otherwise.\n\n `name` The name of the slot to save to or load from. If None, an unused slot (a large number based on the current time) will be used.\n\n `page` The page that the file will be saved to or loaded from. If None, the current page is used.\n\n Other keyword arguments are passed to FileLoad or FileSave."], "SizeZoom": ["internal", "function", "()", "", "", ""], "easeoutleft": ["transitions", "easeoutleft", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, ease, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "SplineMotion": ["internal", "function", "(points, time, child=None, anchors=(0.5, 0.5), repeat=False, bounce=False, anim_timebase=False, style=u'default', time_warp=None, **properties)", "", "", ""], "_window_auto": ["store_variables", "_window_auto", " = False", "store", "var", "This is set to true by ``window auto`` and to false by ``window show`` and ``window hide``. If true, the window auto behavior occurs."], "vcentered": ["internal", "function", "()", "", "", ""], "HistoryEntry.what_args": ["history", "what_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the what text widget when the dialogue was originally shown."], "NoRollback": ["internal", "class", "()", "", "", "Instances of classes inheriting from this class do not participate in rollback. Objects reachable through an instance of a NoRollback class only participate in rollback if they are reachable through other paths."], "OpenURL": ["internal", "class", "(url)", "", "Action", "Causes `url` to be opened in a web browser."], "preferences.language": ["preferences", "preferences.language", " = None", "", "var", "The language that the player has selected to use when running the game. This is None for the default language or a string containing a language the game is translated to.\n\nThis can be used to set the default language, and can be read to determine the current language. The :func:`Language` action can be used to change the language."], "Show": ["internal", "class", "(screen, transition=None, *args, **kwargs)", "", "Action", "This causes another screen to be shown. `screen` is a string giving the name of the screen. The arguments are passed to the screen being shown.\n\n If not None, `transition` is use to show the new screen."], "ImageButton": ["internal", "class", "(idle_image, hover_image=None, insensitive_image=None, activate_image=None, selected_idle_image=None, selected_hover_image=None, selected_insensitive_image=None, selected_activate_image=None, style=u'image_button', clicked=None, hovered=None, **properties)", "", "", "Used to implement the guts of an image button."], "HistoryEntry.who_args": ["history", "who_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the who text widget when the dialogue was originally shown."], "updater.can_update": ["internal", "function", "(base=None)", "", "", "Returns true if it's possible that an update can succeed. Returns false if updating is totally impossible. (For example, if the update directory was deleted.)\n\n Note that this does not determine if an update is actually available. To do that, use :func:`updater.UpdateVersion`."], "ui.window": ["obsolete", "ui.window", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ToggleVoiceMute": ["internal", "class", "(voice_tag, invert=False)", "", "Action", "Toggles the muting of `voice_tag`. This is selected if the given voice tag is muted, unless `invert` is true, in which case it's selected if the voice is unmuted."], "gui.name_xalign": ["gui", "gui.name_xalign", " = 0.0", "", "var", "The horizontal alignment of the character's name. This can be 0.0 for left- aligned, 0.5 for centered, and 1.0 for right-aligned. (It's almost always 0.0 or 0.5.) This is used for both the position of the namebox relative to gui.name_xpos, and to select the side of of the namebox that is aligned with xpos."], "Transform.set_child": ["trans_trans_python", "set_child", "(child)", "Transform", "method", "Call this method with a new `child` to change the child of this transform."], "moveinleft": ["transitions", "moveinleft", "", "", "var", "Also: **moveinright, moveintop, moveinbottom**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "QuickSave": ["internal", "function", "(message=u'Quick save complete.', newest=False)", "", "Action", "Performs a quick save.\n\n`message` A message to display to the user when the quick save finishes.\n\n`newest` Set to true to mark the quicksave as the newest save."], "Quit": ["internal", "class", "(confirm=None)", "", "Action", "Quits the game.\n\n `confirm` If true, prompts the user if he wants to quit, rather than quitting directly. If None, asks if and only if the user is not at the main menu."], "right": ["transforms", "right", "", "", "var", "Aligns to the bottom-right corner of the screen."], "build.itch_project": ["build", "build.itch_project", " = None", "", "var", "Setting this allows the Ren'Py launcher to upload your project to itch.io. This should be set to the name of a project registered with itch. (For example, \\renpytom/the-question\\).\n\nOnce this is set, after the distributions have been built, you can click \\Build distributions\\, \\Upload to itch.io\\ to cause an upload to occur."], "ui.drag": ["obsolete", "ui.drag", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "FilePageName": ["internal", "function", "(auto=u'a', quick=u'q')", "", "Action", "Returns the name of the current file page, as a string. If a normal page, this returns the page number. Otherwise, it returns `auto` or `quick`."], "Confirm": ["internal", "class", "(prompt, yes, no=None, confirm_selected=False)", "", "Action", "Prompts the user for confirmation of an action. If the user clicks yes, the yes action is performed. Otherwise, the `no` action is performed.\n\n`prompt` The prompt to display to the user.\n\n`confirm_selected` If true, the prompt will be displayed even if the `yes` action is already selected. If false (the default), the prompt will not be displayed if the `yes` action is selected.\n\nThe sensitivity and selectedness of this action match those of the `yes` action."], "python_object": ["internal", "class", "()", "", "", "The most base type"], "library": ["internal", "function", "()", "", "", ""], "preferences.gl_powersave": ["preferences", "preferences.gl_powersave", " = \"auto\"", "", "var", "This determines how often Ren'Py will redraw an unchanging screen. If True, Ren'Py will only draw the screen 5 times a second. If False, it will always draw at the full framerate possible. If \\auto\\, it will draw at full speed when the device is powered, and 5hz when it is running on battery."], "Pixellate": ["transitions", "function", "(time, steps)", "", "", "Returns a transition that pixellates out the old screen, and then pixellates in the new screen.\n\n`time` The total time the transition will take, in seconds.\n\n`steps` The number of steps that will occur, in each direction. Each step creates pixels about twice the size of those in the previous step, so a 5-step pixellation will create 32x32 pixels."], "SepiaMatrix": ["internal", "function", "(tint=u'#ffeec2', desat=(0.2126, 0.7152, 0.0722))", "", "", "A function that returns a ColorMatrix that can be used with :tpref:`matrixcolor` to sepia-tone a displayable. This is the equivalent of\n```\nTintMatrix(tint) * SaturationMatrix(0.0, desat)\n```"], "director.show_tags": ["director", "director.show_tags", " = set()", "", "var", "If not empty, only the tags present in this set will be presented for the show statement."], "im.Blur": ["obsolete", "class", "(im, xrad, yrad=None, **properties)", "", "", "An image manipulator that blurs the image manipulator `im` using an elliptical kernel described by `xrad` and optionally `yrad`.\n\nIf `yrad` is None, it will take the value of `xrad` resulting in a circular kernel being used.\n```\nimage logo blurred = im.Blur(\\logo.png\\, 1.5)\n\nThe same effect can now be achieved with the :tpref:`blur` transform property.\n```"], "ToggleLocalVariable": ["internal", "function", "(name, true_value=None, false_value=None)", "", "Action", "Toggles the value of `name` in the current local context.\n\nThis function is only useful in a screen that has been use by another scene, as it provides a way of setting the value of a variable inside the used screen. In all other cases, :func:`ToggleScreenVariable` should be preferred, as it allows more of the screen to be cached.\n\nThis must be created in the context that the variable is set in - it can't be passed in from somewhere else.\n\n`true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "bord": ["internal", "function", "(s)", "", "", ""], "Lexer.keyword": ["cds", "keyword", "(s)", "Lexer", "method", "Matches `s` as a keyword."], "gui.history_text_width": ["gui", "gui.history_text_width", " = 1110", "", "var", "The width of the name label and dialogue text, in pixels."], "iap.python_object": ["internal", "class", "()", "", "", "The most base type"], "DynamicCharacter": ["internal", "function", "(name_expr, **properties)", "", "", "Creates and returns a `Character` object that has the `dynamic` property set to `True`.\n\n`name_expr` should either be a string containing a Python expression, a function, or a callable object. If it's a string, that string will be evaluated before each line of dialogue, and the result used as the name of the character. Otherwise, the function or callable object will be called with no arguments before each line of dialogue, and the return value of the call will be used as the name of the character."], "ParameterizedText": ["internal", "class", "(style=u'default', **properties)", "", "", "This is a displayable that can be shown with an additional string parameter, which then shows that string as if it was an image. This is usually used as part of the pre-defined ``text`` image.\n\nFor example, one can do::\n\nshow text \\Hello, World\\ at truecenter with dissolve pause 1 hide text with dissolve\n\nYou can use ParameterizedText directly to define similar images with different style properties. For example, one can write::\n\nimage top_text = ParameterizedText(xalign=0.5, yalign=0.0)"], "easeoutright": ["transitions", "easeoutright", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, ease, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "Notify": ["internal", "class", "(message)", "", "Action", "Displays `message` using :func:`renpy.notify`."], "Transform.hide_request": ["trans_trans_python", "hide_request", "", "Transform", "attribute", "This is set to true when the function is called, to indicate that the transform is being hidden."], "FileSlotName": ["internal", "function", "(slot, slots_per_page, auto=u'a', quick=u'q', format=u'%s%d')", "", "Action", "Returns the name of the numbered slot. This assumes that slots on normal pages are numbered in a linear order starting with 1, and that page numbers start with 1. When slot is 2, and slots_per_page is 10, and the other variables are the defaults:\n\n * When the first page is showing, this returns \\2\\. * When the second page is showing, this returns \\12\\. * When the auto page is showing, this returns \\a2\\. * When the quicksave page is showing, this returns \\q2\\.\n\n `slot` The number of the slot to access.\n\n `slots_per_page` The number of slots per page.\n\n `auto` A prefix to use for the auto page.\n\n `quick` A prefix to use for the quick page.\n\n `format` The formatting code to use. This is given two arguments: A string giving the page prefix, and an integer giving the slot number."], "im.tobytes": ["obsolete", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "OldMoveTransition": ["internal", "function", "()", "", "", ""], "Lexer.error": ["cds", "error", "(msg)", "Lexer", "method", "Adds a `msg` (with the current position) in the list of detected parsing errors. This interrupts the parsing of the current statement, but does not prevent further parsing."], "ui.hotspot": ["obsolete", "ui.hotspot", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "easeoutbottom": ["transitions", "easeoutbottom", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, ease**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "Lexer": ["cds", "Lexer", "", "", "class", "The parse method of renpy.register_statement takes a Lexer object"], "ui.detached": ["obsolete", "function", "()", "", "", "Do not add the next displayable to any later or container. Use this if you want to assign the result of a ui function to a variable."], "gui.kind_text_font": ["gui", "gui.kind_text_font", "", "", "var", "If present, the font used for the text."], "BarValue.get_style": ["screen_python", "get_style", "(self)", "BarValue", "method", "This is used to determine the style of bars that use this value. It should return a tuple of two style names or style objects. The first is used for a bar, and the second for vbar.\n\nThis defaults to (\\bar\\, \\vbar\\)."], "CropMove": ["transitions", "function", "(time, mode=\"slideright\", startcrop=(0.0, 0.0, 0.0, 1.0), startpos=(0.0, 0.0), endcrop=(0.0, 0.0, 1.0, 1.0), endpos=(0.0, 0.0), topnew=True)", "", "", "Returns a transition that works by cropping a scene and positioning it on the screen. This can be used to implement a variety of effects, all of which involve changing rectangular slices of scenes.\n\n`time` The time the transition takes.\n\n`mode` The name of the mode of the transition. There are three groups of modes: wipes, slides, and other. This can also be \\custom\\, to allow a custom mode to be defined.\n\nIn a wipe, the image stays fixed, and more of it is revealed as the transition progresses. For example, in \\wiperight\\, a wipe from left to right, first the left edge of the image is revealed at the left edge of the screen, then the center of the image, and finally the right side of the image at the right of the screen. Other supported wipes are \\wipeleft\\, \\wipedown\\, and \\wipeup\\.\n\nIn a slide, the image moves. So in a \\slideright\\, the right edge of the image starts at the left edge of the screen, and moves to the right as the transition progresses. Other slides are \\slideleft\\, \\slidedown\\, and \\slideup\\.\n\nThere are also slideaways, in which the old image moves on top of the new image. Slideaways include \\slideawayright\\, \\slideawayleft\\, \\slideawayup\\, and \\slideawaydown\\.\n\nWe also support a rectangular iris in with \\irisin\\ and a rectangular iris out with \\irisout\\.\n\nThe following parameters are only respected if the mode is \\custom\\. Positions are relative to the size of the screen, while the crops are relative to the size of the image. So a crop of (0.25, 0.0, 0.5, 1.0) takes the middle half of an image.\n\n`startcrop` The starting rectangle that is cropped out of the top image. A 4-element tuple containing x, y, width, and height.\n\n`startpos` The starting place that the top image is drawn to the screen at, a 2-element tuple containing x and y.\n\n`endcrop` The ending rectangle that is cropped out of the top image. A 4-element tuple containing x, y, width, and height.\n\n`endpos` The ending place that the top image is drawn to the screen at, a 2-element tuple containing x and y.\n\n`topnew` If true, the scene that is cropped and moved (and is on top of the other scene) is the new scene. If false, it is the old scene.\n```\ndefine wiperight = CropMove(1.0, \\wiperight\\)\ndefine wipeleft = CropMove(1.0, \\wipeleft\\)\ndefine wipeup = CropMove(1.0, \\wipeup\\)\ndefine wipedown = CropMove(1.0, \\wipedown\\)\n\ndefine slideright = CropMove(1.0, \\slideright\\)\ndefine slideleft = CropMove(1.0, \\slideleft\\)\ndefine slideup = CropMove(1.0, \\slideup\\)\ndefine slidedown = CropMove(1.0, \\slidedown\\)\n\ndefine slideawayright = CropMove(1.0, \\slideawayright\\)\ndefine slideawayleft = CropMove(1.0, \\slideawayleft\\)\ndefine slideawayup = CropMove(1.0, \\slideawayup\\)\ndefine slideawaydown = CropMove(1.0, \\slideawaydown\\)\n\ndefine irisout = CropMove(1.0, \\irisout\\)\ndefine irisin = CropMove(1.0, \\irisin\\)\n```"], "gui.nvl_borders": ["gui", "gui.nvl_borders", " = Borders(0, 15, 0, 30)", "", "var", "The borders around the background of the NVL-mode. Since the background is not a frame, this is only used to pad out the NVL-mode to prevent it from pressing up against the sides of the screen."], "Lexer.subblock_lexer": ["cds", "subblock_lexer", "()", "Lexer", "method", "Return a Lexer for the block associated with the current line."], "Swing": ["transitions", "function", "(delay=1.0, vertical=False, reverse=False, background=\"#000\", flatten=True)", "", "", "A transitions that rotates the old scene 90 degrees around an axis, so that it is edge on with the viewer, switches to the new scene, and then rotates that scene another 90 degrees to show the new scene to the viewer.\n\n`delay` How long the transition should take.\n\n`vertical` If true, the scene is rotate around the x-axis (pixels move vertically). If false, the scene is roated around the y axis, pixels moving horizontally.\n\n`reverse` When true, the rotation occurs in the reverse direction.\n\n`background` A displayable that is placed behind the scene as it rotates.\n\n`flatten` If true, the scenes are flattened into images the size of the screen before being rotated. Use this if images being not entirely on the screen causes undesired effects."], "print_function": ["internal", "function", "()", "", "", ""], "ui.draggroup": ["obsolete", "ui.draggroup", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.history_height": ["gui", "gui.history_height", " = 210", "", "var", "The height of a history entry, in pixels. This can be None to allow the height of a history entry to vary at the cost of performance \u2013 config.history_length may need to be lowered significantly when this is None."], "preferences.skip_unseen": ["preferences", "preferences.skip_unseen", " = False", "", "var", "When True, Ren'Py will skip all text. When False, Ren'Py will only skip text that has been read by the player in any session. The equivalent of the \\skip\\ preference."], "updater.Updater": ["internal", "class", "(url, base=None, force=False, public_key=None, simulate=None, add=[], restart=True, check_only=False, confirm=True, patch=True)", "", "", "Applies an update.\n\nFields on this object are used to communicate the state of the update process.\n\nself.state The state that the updater is in.\n\nself.message In an error state, the error message that occured.\n\nself.progress If not None, a number between 0.0 and 1.0 giving some sort of progress indication.\n\nself.can_cancel A boolean that indicates if cancelling the update is allowed."], "Image": ["internal", "function", "(arg, loose=False, **properties)", "", "", "Loads an image from a file. filename is a string giving the name of the file.\n\nfilename should be a JPEG or PNG file with an appropriate extension.\n\nIf optimize_bounds is True, only the portion of the image inside the bounding box of non-transparent pixels is loaded into GPU memory. (The only reason to set this to False is when using an image as input to a shader.)"], "achievement.get_progress": ["internal", "function", "(name)", "", "", "Returns the current progress towards the achievement identified with `name`, or 0 if no progress has been registered for it or if the achievement is not known."], "ui.bar": ["obsolete", "ui.bar", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "_window": ["store_variables", "_window", " = False", "store", "var", "This set by the ``window show`` and ``window hide`` statements, and indirectly by ``window auto``. If true, the dialogue window is shown during non-dialogue statements."], "range": ["internal", "function", "(*args)", "", "", ""], "Replay": ["internal", "class", "(label, scope={}, locked=None)", "", "Action", "An action that starts `label` as a replay.\n\n`scope` A dictionary mapping variable name to value. These variables are set when entering the replay.\n\n`locked` If true, this replay is locked. If false, it is unlocked. If None, the replay is locked if the label has not been seen in any playthrough."], "FontGroup": ["internal", "class", "()", "", "", "A group of fonts that can be used as a single font."], "ui.spritemanager": ["obsolete", "ui.spritemanager", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "updater.UpdateVersion": ["internal", "function", "(url, check_interval=3600*6, simulate=None, **kwargs)", "", "", "This function contacts the server at `url`, and determines if there is a newer version of software available at that url. If there is, this function returns the new version. Otherwise, it returns None.\n\nSince contacting the server can take some time, this function launches a thread in the background, and immediately returns the version from the last time the server was contacted, or None if the server has never been contacted. The background thread will restart the current interaction once the server has been contacted, which will cause screens that call this function to update.\n\nEach url will be contacted at most once per Ren'Py session, and not more than once every `check_interval` seconds. When the server is not contacted, cached data will be returned.\n\nAdditional keyword arguments (including `simulate`) are passed to the update mechanism as if they were given to :func:`updater.update`."], "build.version": ["internal", "function", "()", "", "", "The version used by the build system."], "gui.kind_text_color": ["gui", "gui.kind_text_color", "", "", "var", "If present, the color of the text."], "FileDelete": ["internal", "class", "(name, confirm=True, page=None, slot=False)", "", "Action", "Deletes the file.\n\n `name` The name of the slot to delete.\n\n `confirm` If true and not at the main menu, prompt for confirmation before loading the file.\n\n `page` The page that the file will be loaded from. If None, the current page is used.\n\n `slot` If True, `name` is taken to be a slot name, and `page` is ignored."], "bchr": ["internal", "function", "(s)", "", "", ""], "im.matrix": ["obsolete", "class", "()", "", "", "Constructs an im.matrix object from `matrix`. im.matrix objects support The operations supported are matrix multiplication, scalar multiplication, element-wise addition, and element-wise subtraction. These operations are invoked using the standard mathematical operators (\\\\*, \\\\*, +, and -, respectively). If two im.matrix objects are multiplied, matrix multiplication is performed, otherwise scalar multiplication is used.\n\n`matrix` is a 20 or 25 element list or tuple. If it is 20 elements long, it is padded with (0, 0, 0, 0, 1) to make a 5x5 matrix, suitable for multiplication."], "gui.frame_tile": ["gui", "gui.frame_tile", " = True", "", "var", "If true, the sides and center of the confirm screen are tiled. If false, they are scaled."], "HistoryEntry.show_args": ["history", "show_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the say screen when the dialogue was originally shown."], "Editor.end": ["editor", "end", "(**kwargs)", "Editor", "method", "Ends a transaction."], "build.make_file_lists": ["internal", "function", "(s)", "", "", "Turns `s` into a (perhaps empty) list of file_lists.\n\nIf `s` is a list or None, then returns it. If it's a string, splits it on whitespace. Otherwise, errors out."], "preferences.transitions": ["preferences", "preferences.transitions", " = 2", "", "var", "Determines which transitions should be shown. 2 shows all transitions, 0 shows no transitions. (1 is reserved.) The equivalent of the \\transitions\\ preference."], "Transform.update": ["trans_trans_python", "update", "()", "Transform", "method", "This should be called when a transform property field is updated outside of the callback method, to ensure that the change takes effect."], "zoominout": ["transitions", "zoominout", "", "", "var", "This zooms in entering images and zooms out leaving images, taking 0.5 seconds to do so."], "Lexer.eol": ["cds", "eol", "()", "Lexer", "method", "True if the lexer is at the end of the line."], "iap.IOSBackend": ["internal", "class", "(self)", "", "", "Returns the identifier for a store purchase."], "gui.REGULAR_FONT": ["translating_renpy", "gui.REGULAR_FONT", " = \"Roboto-Regular.ttf\"", "", "var", "The path to the font used for heavy-weight text in the launcher."], "Lexer.revert": ["cds", "revert", "(o)", "Lexer", "method", "When `o` is the object returned from checkpoint(), reverts the state of the lexer to what it was when checkpoint() was called. (This is used for backtracking.)"], "Editor.begin": ["editor", "begin", "(new_window=False, **kwargs)", "Editor", "method", "Starts an editor transaction.\n\nIf `new_window` is true, the editor should attempt to open a new window. Otherwise, it should attempt to perform the transaction in an existing editor window."], "gui.rebuild": ["internal", "function", "()", "", "", "Rebuilds the GUI.\n\nNote: This is a very slow function."], "Composite": ["internal", "function", "(size, *args, **properties)", "", "", "This creates a new displayable of `size`, by compositing other displayables. `size` is a (width, height) tuple.\n\nThe remaining positional arguments are used to place images inside the Composite. The remaining positional arguments should come in groups of two, with the first member of each group an (x, y) tuple, and the second member of a group is a displayable that is composited at that position.\n\nDisplayables are composited from back to front.\n```\nimage eileen composite = Composite(\n(300, 600),\n(0, 0), \\body.png\\,\n(0, 0), \\clothes.png\\,\n(50, 50), \\expression.png\\)\n```"], "ui.One": ["obsolete", "class", "(displayable, style_prefix)", "", "", "A widget that expects exactly one child."], "preferences.fullscreen": ["preferences", "preferences.fullscreen", " = False", "", "var", "This is True when Ren'Py is in fullscreen mode, and False when it is running in a window. The equivalent of the \\display\\ preference."], "build.include_i686": ["build", "build.include_i686", " = True", "", "var", "If true, files necessary to run on 32-bit x86 processors will be included in the Linux and Mac builds. If False, these files will not be included."], "Action.get_selected": ["screen_python", "get_selected", "(self)", "Action", "method", "This should return true if the button should be rendered as a selected button, and false otherwise.\n\nThe default implemention returns False."], "HideInterface": ["internal", "class", "(*args, **kwargs)", "", "Action", "Causes the interface to be hidden until the user clicks."], "Condition": ["internal", "class", "(condition, image, **kwargs)", "", "", "This is used to represent a layer of an LayeredImage that is controlled by a condition. When the condition is true, the layer is displayed. Otherwise, nothing is displayed.\n\n`condition` This should be a string giving a Python condition that determines if the layer is displayed.\n\n`image` If not None, this should be a displayable that is displayed when the condition is true.\n\n`if_all` An attribute or list of attributes. The condition is only evaluated if all of these are showing.\n\n`if_any` An attribute or list of attributes. If not empty, the condition is only evaluated if any of these are showing.\n\n`if_not` An attribute or list of attributes. The condition is only evaluated if none of these are showing.\n\n`at` A transform or list of transforms that are applied to the image.\n\nOther keyword arguments are interpreted as transform properties. If any are present, a transform is created that wraps the image. (For example, pos=(100, 200) can be used to offset the image by 100 pixels horizontally and 200 vertically.)"], "persistent._clear": ["persistent", "persistent._clear", "(progress=False)", "", "function", "Resets the persistent data.\n\n`progress` If true, also resets progress data that Ren'Py keeps.\n\nNote that this will delete all persistent data, and will not re-apply defaults until Ren'Py restarts."], "director.button": ["director", "director.button", " = True", "", "var", "If True, the director displays a screen with a button to access the director window. If False, the game can provide it's own access, by making available the director.Start action."], "Lexer.expect_block": ["cds", "expect_block", "(stmt)", "Lexer", "method", "Called to indicate that the statement requires that a non-empty block is present. `stmt` should be a string, it will be added to the message with an error."], "QueueEvent": ["internal", "class", "(event, up=False)", "", "Action", "Queues the given event using :func:`renpy.queue_event`."], "translate_font": ["translating_renpy", "translate_font", "(language, font)", "", "function", "This is used to set a font for `language`. The font is used in the launcher, and also used to in games generated in that language. The font file should be placed in game/fonts.\n\n`font` A string giving the name of the font file."], "wipeup": ["transitions", "wipeup", "", "", "var", "Also: **wiperight, wipeleft, wipedown**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "preferences.gl_tearing": ["preferences", "preferences.gl_tearing", " = False", "", "var", "This determines if tearing (True) or frameskip (False) is the preferred behavior when the game can't keep up with its intended framerate."], "gui.nvl_height": ["gui", "gui.nvl_height", " = 173", "", "var", "The height of a single NVL-mode entry. Setting this to a fixed height makes it possible to have NVL-mode without paging, showing a fixed number of entries at once. Setting this to None allows entries to be of a variable size."], "gui.vscrollbar_borders": ["gui", "gui.vscrollbar_borders", " = Borders(6, 10, 6, 10)", "", "var", "The borders that are used with the Frame containing the bar image."], "reset": ["transforms", "reset", "", "", "var", "Resets the transform. Places the displayable in the top-left corner of the screen, and also eliminates any zoom, rotation, or other effects."], "gui.scrollbar_tile": ["gui", "gui.scrollbar_tile", " = True", "", "var", "If true, the frame containing the bar of a scrollbar is tiled. If False, if it scaled."], "Attribute": ["internal", "class", "(group, attribute, image=None, default=False, group_args={}, **kwargs)", "", "", "This is used to represent a layer of an LayeredImage that is controlled by an attribute. A single attribute can control multiple layers, in which case all layers corresponding to that attribute will be displayed.\n\n`group` A string giving the group the attribute is part of. This may be None, in which case a group with the same name as the attribute is created.\n\n`attribute` A string giving the name of the attribute.\n\n`image` If not None, this should be a displayable that is displayed when this attribute is shown.\n\n`default` If True, and no other attribute for the group is selected, this attribute is.\n\nThe following keyword arguments are also known:\n\n`at` A transform or list of transforms that are applied to the image.\n\n`if_all` An attribute or list of attributes. The displayable is only shown if all of these are showing.\n\n`if_any` An attribute or list of attributes. if not empty, the displayable is only shown if any of these are showing.\n\n`if_not` An attribute or list of attributes. The displayable is only shown if none of these are showing.\n\nOther keyword arguments are interpreted as transform properties. If any are present, a transform is created that wraps the image. (For example, pos=(100, 200) can be used to offset the image by 100 pixels horizontally and 200 vertically.)\n\nIf the `image` parameter is omitted or None, and the LayeredImage has been given the `image_format` parameter, the image_format is used to generate an image filename."], "preferences.video_image_fallback": ["preferences", "preferences.video_image_fallback", " = False", "", "var", "If True, images are displayed instead of videosprites. If False, video sprites are displayed normally. The equivalent (inverted) of the \\video sprites\\ preference."], "ui.Detached": ["obsolete", "class", "(style_prefix)", "", "", "Used to indicate a widget is detached from the stack."], "preferences.wait_voice": ["preferences", "preferences.wait_voice", " = True", "", "var", "If True, auto-forward mode will wait for voice files and self-voicing to finish before advancing. If False, it will not. The equivalent of the \\wait for voice\\ preference."], "ui": ["obsolete", "function", "()", "", "", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "HistoryEntry.what": ["history", "what", "", "HistoryEntry", "attribute", "A string giving the dialogue text."], "gui.text_color": ["gui", "gui.text_color", " = \"#402000\"", "", "var", "This sets the color of the dialogue text."], "gui.LIGHT_FONT": ["translating_renpy", "gui.LIGHT_FONT", " = \"Roboto-Light.ttf\"", "", "var", "The path to the font used for normal text in the launcher."], "achievement.grant": ["internal", "function", "(name)", "", "", "Grants the achievement with `name`, if it has not already been granted."], "gui.choice_button_text_idle_color": ["gui", "gui.choice_button_text_idle_color", " = '#888888'", "", "var", "The color used for the text of unfocused choice buttons."], "HistoryEntry.image_tag": ["history", "image_tag", "", "HistoryEntry", "attribute", "The image tag given to the :func:`Character`, or None if no such tag was given."], "ui.ChoiceActionBase": ["obsolete", "class", "(label, value, location=None, block_all=None, sensitive=True, args=None, kwargs=None)", "", "Action", "Base class for choice actions. The choice is identified by a label and value. The class will automatically determine the rollback state and supply correct \\sensitive\\ and \\selected\\ information to the widget. If a location is supplied, it will check whether the choice was previously visited and mark it so if it is chosen."], "persistent": ["internal", "function", "()", "", "", "The persistent variable allows access to the Persistent object's fields, which contains saved data that is not associated with a particular point in a game."], "ScreenVariableValue": ["internal", "class", "(variable, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A bar value that adjusts the value of a variable in a screen.\n\n`variable` A string giving the name of the variable to adjust. `range` The range to adjust over. `max_is_zero` If True, then when the field is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the field is set to 0.\n\nThis is used internally, for some preferences. `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "file": ["internal", "function", "(*args, **kwargs)", "", "", "Returns a read-only file-like object that accesses the file named `fn`. The file is accessed using Ren'Py's standard search method, and may reside in an RPA archive. or as an Android asset.\n\nThe object supports a wide subset of the fields and methods found on Python's standard file object, opened in binary mode. (Basically, all of the methods that are sensible for a read-only file.)"], "gui.text_properties": ["internal", "function", "(kind=None, accent=False)", "", "", "Given a `kind` of button, returns a dictionary giving standard style properties for that button. This sets:\n\n:propref:`font` To gui.kind_text_font, if it exists.\n\n:propref:`size` To gui.kind_text_size, if it exists.\n\n:propref:`xalign` To gui.kind_text_xalign, if it exists.\n\n:propref:`text_align` To gui.kind_text_xalign, if it exists.\n\n:propref:`layout` To \\subtitle\\ if gui.kind_text_xalign is greater than zero and less than one.\n\nThere are also a number of variables that set the text :propref:`color` style property:\n\ncolor To gui.kind_text_color, if it exists. If the variable is not set, and `accent` is True, sets the text color to the default accent color.\n\ninsensitive_color To gui.kind_text_insensitive_color, if it exists.\n\nidle_color To gui.kind_text_idle_color, if it exists.\n\nhover_color To gui.kind_text_hover_color, if it exists.\n\nselected_color To gui.kind_text_selected_color, if it exists.\n\nAll other :ref:`text style properties ` are also available. For example, gui.kind_text_outlines sets the outlines style property, gui.kind_text_kerning sets kerning, and so on."], "Lexer.delimited_python": ["cds", "delimited_python", "(delim)", "Lexer", "method", "Matches a Python expression that ends in a `delim`, for example ':'. This is often used when you expect a condition until the delimiter. It is not recommended to change the result. The correct action is to evaluate the result in the future. This raises an error if end of line is reached before the delimiter."], "narrator": ["internal", "function", "()", "", "", "This is the character that speaks narration (say statements that do not give a character or character name)."], "Lexer.advance": ["cds", "advance", "()", "Lexer", "method", "In a subblock lexer, advances to the next line. This must be called before the first line, so the first line can be parsed. Returns True if we've successfully advanced to a line in the block, or False if we have advanced beyond all lines in the block."], "GamepadExists": ["internal", "function", "(developer=True)", "", "Action", "A function that returns true if a gamepad is present, and false otherwise.\n\n`developer` Forces this function to always return true while :var:`config.developer` is true."], "im.Grayscale": ["obsolete", "function", "(im, **properties)", "", "", "An image manipulator that creates a desaturated version of the image manipulator `im`.\n\nThe same effect can now be achieved by supplying SaturationMatrix(0) to the :tpref:`matrixcolor` transform property."], "preferences.afm_enable": ["preferences", "preferences.afm_enable", " = False", "", "var", "If True, auto-forward move is enabled, otherwise False. The equivalent of the \\auto-forward\\ preference."], "Function": ["internal", "class", "(callable, *args, **kwargs)", "", "Action", "This Action calls `callable` with `args` and `kwargs`.\n\n`callable` Callable object. `args` position arguments to be passed to `callable`. `kwargs` keyword arguments to be passed to `callable`.\n\nThis Action takes an optional _update_screens keyword argument, which defaults to true. When it is true, the interaction restarts and the screens are updated after the function returns.\n\nIf the function returns a non-None value, the interaction stops and returns that value. (When called using the call screen statement, the result is placed in the `_return` variable.)"], "Lexer.string": ["cds", "string", "()", "Lexer", "method", "Matches a Ren'Py string."], "pushup": ["transitions", "pushup", "", "", "var", "Also: **pushleft, pushright, pushdown**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "slideawayright": ["transitions", "slideawayright", "", "", "var", "Also: **slideawayleft, slideawayup, slideawaydown**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "moveinbottom": ["transitions", "moveinbottom", "", "", "var", "Also: **moveinleft, moveintop, moveinright**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "Lexer.renpy_statement": ["cds", "renpy_statement", "()", "Lexer", "method", "When called, this parses the current line as a Ren'Py script statement, generating an error if this is not possible. This method returns an opaque object that can be returned from get_next() or passed to :func:`renpy.jump` or :func:`renpy.call`. This object should not be stored except as part of the parse result of the statement.\n\nWhen the statement returned from this completes, control is transfered to the statement after the creator-defined statement. (Which might be the statement created using post_execute)."], "HistoryEntry.voice": ["history", "voice", "", "HistoryEntry", "attribute", "This is the object returned from :func:`_get_voice_info`, storing information about the voice that is being played."], "Placeholder": ["internal", "class", "(base=None, full=False, flip=None, **properties)", "", "", "This displayable can be used to display a placeholder character or background."], "gui.nvl_thought_xalign": ["gui", "gui.nvl_thought_xalign", " = 0.5", "", "var", "The alignment of the text. This controls both the alignment of the text, and the side of the text that is placed at xpos. This can be 0.0 for left, 0.5 for center, and 1.0 for right."], "InvertMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to invert each of the color channels. The alpha channel is left alone.\n\n`value` The amount to inverty by. 0.0 is not inverted, 1.0 is fully inverted. Used to animate inversion."], "easeinleft": ["transitions", "easeinleft", "", "", "var", "Also: **easeinright, ease, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "gui.vslider_borders": ["gui", "gui.vslider_borders", " = Borders(6, 6, 6, 6)", "", "var", "The borders that are used with the Frame containing the bar image."], "gui.notify_frame_borders": ["gui", "gui.notify_frame_borders", " = Borders(24, 8, 60, 8)", "", "var", "The borders of the frame that is used by the notify screen."], "ui.BarValue": ["obsolete", "class", "()", "", "", "This can be passed to the value method of bar and hotbar."], "updater.Update": ["internal", "class", "(*args, **kwargs)", "", "Action", "An action that calls :func:`updater.update`. All arguments are stored and passed to that function."], "gui.name_ypos": ["gui", "gui.name_ypos", " = 0", "", "var", "The horizontal and vertical positions of the name and namebox. These are usually a number of pixels from the left or top side of the textbox. Setting a variable to 0.5 centers the name in the textbox (see below). These numbers can also be negative \u2013 for example, setting gui.name_ypos to -22 causes it to be places 22 pixels above the top of the textbox."], "eval": ["internal", "function", "(code, globals=None, locals=None)", "", "", ""], "MoveIn": ["internal", "function", "()", "", "", ""], "hyperlink_sensitive": ["internal", "function", "(target)", "", "", "Returns true of the hyperlink is sensitive, False otherwise."], "Dissolve": ["transitions", "function", "(time, alpha=False, time_warp=None)", "", "", "Returns a transition that dissolves from the old scene to the new scene.\n\n`time` The time the dissolve will take.\n\n`alpha` Ignored.\n\n`time_warp` A function that adjusts the timeline. If not None, this should be a function that takes a fractional time between 0.0 and 1.0, and returns a number in the same range."], "LiveComposite": ["obsolete", "function", "(size, *args, **properties)", "", "", "LiveComposite is now :func:`Composite`."], "_autosave": ["store_variables", "_autosave", " = True", "store", "var", "This variable can be set to False to disable autosave."], "hyperlink_styler": ["internal", "function", "(target)", "", "", ""], "_menu": ["store_variables", "_menu", " = False", "store", "var", "Ren'Py sets this variable to True when entering a main menu or game menu context."], "AudioData": ["internal", "class", "(data, filename)", "", "", "This class wraps a bytes object containing audio data, so it can be passed to the audio playback system. The audio data should be contained in some format Ren'Py supports. (For examples RIFF WAV format headers, not unadorned samples.)\n\n`data` A bytes object containing the audio file data.\n\n`filename` A synthetic filename associated with this data. It can be used to suggest the format `data` is in, and is reported as part of error messages.\n\nOnce created, this can be used wherever an audio filename is allowed. For example\n```\ndefine audio.easteregg = AudioData(b'...', 'sample.wav')\nplay sound easteregg\n```"], "Color": ["internal", "class", "(color=None, hls=None, hsv=None, rgb=None, alpha=1.0)", "", "", "The Color class is used to represent and manipulate colors and convert between various color spaces. It also represents opacity in the form of an alpha.\n\nWhen creating a Color, at one of the `color`, `hls`, `hsv`, or `rgb` arguments should be supplied. (If all are None, None is returned.)\n\n`color` The color, in one of the standard formats Ren'Py understands. These are:\n\n* A Color object. * An (r, g, b) or (r, g, b, a) tuple, in which all the numbers are between 0 and 255. * A string giving a hexadecimal color, in the form \\#rgb\\, \\#rgba\\, \\#rrggbb\\, or \\#rrggbbaa\\.\n\n`hls` A color in the hue-lightness-saturation color space. This should be supplied a three-component tuple, where each component is between 0.0 and 1.0.\n\n`hsv` A color in the hue-saturation-value color space. This should be supplied a three-component tuple, where each component is between 0.0 and 1.0.\n\n`rgb` A color in the red-green-blue color space. This should be supplied a three-component tuple, where each component is between 0.0 and 1.0.\n\nIf the supplied color does not contain an alpha value, `alpha` is used. `alpha` must be between 0.0 and 1.0.\n\nColor objects can be used as 4-component tuples, where the components are (red, green, blue, and alpha). When used as a tuple, the value of each component is between 0 and 255.\n\nColor objects support the +, -, and * operators, representing component-wise addition, subtraction, and multiplication. Some uses of these operators can cause the creation of colors with components that are not in the supported range. Such colors should not be passed to other parts of Ren'Py. (The normalize method can be called to return a new color with the components limited to the proper range.)\n\nA Color object has the following properties:\n\n.. attribute:: hls\n\nReturns the color as a tuple of three floating point numbers giving hue, lightness, and saturation. Each component ranges between 0.0 and 1.0.\n\n.. attribute:: hsv\n\nReturns the color as a tuple of three floating point numbers giving hue, saturation, and value. Each component ranges between 0.0 and 1.0.\n\n.. attribute:: rgb\n\nReturns the color as a tuple of three floating point numbers giving the red, green, and blue components. Each component ranges between 0.0 and 1.0.\n\n.. attribute:: rgba\n\nReturns the color as a tuple of four floating point numbers giving the red, green, blue and alpha components as 0.0 to 1.0 values.\n\n.. attribute:: alpha\n\nReturns the alpha (opacity) of this Color as a number between 0.0 and 1.0, where 0.0 is transparent and 1.0 is opaque.\n\n.. attribute:: hexcode\n\nReturns a string containing a hex color code of the form #rrggbbaa or #rrggbb.\n\nColor objects have the following methods. Since Colors are immutable, these methods always return a new Color object."], "preferences.desktop_rollback_side": ["preferences", "preferences.desktop_rollback_side", " = \"disable\"", "", "var", "When on a desktop platform, touches or clicks to this side of the window cause rollback to occur. One of \\left\\, \\right\\, or \\disable\\. This is the equivalend of the \\rollback side\\ preference when on a desktop platform."], "Matrix.screen_projection": ["internal", "function", "()", "", "", "This generates a matrix that projects the Ren'Py space, where (0, 0) is the top left and (`w`, `h`) is the bottom right, into the OpenGL viewport, where (-1.0, 1.0) is the top left and (1.0, -1.0) is the bottom.\n\nGenerates the matrix that projects the Ren'Py screen to the OpenGL screen."], "InputValue.Disable": ["screen_python", "Disable", "()", "InputValue", "method", "Returns an action that disables text editing on the input."], "moveintop": ["transitions", "moveintop", "", "", "var", "Also: **moveinleft, moveinright, moveinbottom**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "gui.history_text_xalign": ["gui", "gui.history_text_xalign", " = 0.5", "", "var", "This controls the alignment of text and the side of the text that is aligned with xpos. 0.0 is left-aligned, 0.5 is center-aligned, 1.0 is right-aligned."], "At": ["internal", "function", "(d, *args)", "", "", "Given a displayable `d`, applies each of the transforms in `args` to it. The transforms are applied in left-to-right order, so that the outermost transform is the rightmost argument.\n```\ntransform birds_transform:\n xpos -200\n linear 10 xpos 800\n pause 20\n repeat\n\nimage birds = At(\\birds.png\\, birds_transform)\n```"], "build.package": ["internal", "function", "(name, format, file_lists, description=None, update=True, dlc=False, hidden=False)", "", "", "Declares a package that can be built by the packaging tool.\n\n`name` The name of the package.\n\n`format` The format of the package. A string containing a space separated list of:\n\nzip A zip file. tar.bz2 A tar.bz2 file. directory A directory containing the files. dmg A Macintosh DMG containing the files. app-zip A zip file containing a macintosh application. app-directory A directory containing the mac app. app-dmg A macintosh drive image containing a dmg. (Mac only.)\n\nThe empty string will not build any package formats (this makes dlc possible).\n\n`file_lists` A list containing the file lists that will be contained within the package.\n\n`description` An optional description of the package to be built.\n\n`update` If true and updates are being built, an update will be built for this package.\n\n`dlc` If true, any zip or tar.bz2 file will be built in standalone DLC mode, without an update directory.\n\n`hidden` If true, this will be hidden from the list of packages in the launcher."], "gui.glyph_font": ["gui", "gui.glyph_font", " = \"DejaVuSans.ttf\"", "", "var", "A font used for certain glyphs, such as the arrow glyphs used by the skip indicator. DejaVuSans is a reasonable default for these glyphs, and is automatically included with every Ren'Py game."]}} \ No newline at end of file +{"config": {"config.adjust_attributes": ["config", "config.adjust_attributes", " = { }", "", "var", "If not None, this is a dictionary. When a statement or function that contains image attributes executes or is predicted, the tag is looked up in this dictionary. If it is not found, the None key is looked up in this dictionary.\n\nIf either is found, they're expected to be a function. The function is given an image name, a tuple consisting of the tag and any attributes. It should return an adjusted tuple, which contains and a potential new set of attributes.\n\nAs this function may be called during prediction, it must not rely on any state."], "config.adjust_view_size": ["config", "config.adjust_view_size", " = None", "", "var", "If not None, this should be a function taking two arguments, the width and height of the physical window. It is expected to return a tuple giving the width and height of the OpenGL viewport, the portion of the screen that Ren'Py will draw pictures to.\n\nThis can be used to configure Ren'Py to only allow certain sizes of screen. For example, the following allows only integer multiples of the original screen size\n```\ninit python:\n\ndef force_integer_multiplier(width, height):\nmultiplier = min(width / config.screen_width, height / config.screen_height)\nmultiplier = max(int(multiplier), 1)\nreturn (multiplier * config.screen_width, multiplier * config.screen_height)\n\nconfig.adjust_view_size = force_integer_multiplier\n\n```"], "config.adv_nvl_transition": ["config", "config.adv_nvl_transition", " = None", "", "var", "A transition that is used when showing NVL-mode text directly after ADV-mode text."], "config.afm_bonus": ["config", "config.afm_bonus", " = 25", "", "var", "The number of bonus characters added to every string when auto-forward mode is in effect."], "config.afm_callback": ["config", "config.afm_callback", " = None", "", "var", "If not None, a Python function that is called to determine if it is safe to auto-forward. The intent is that this can be used by a voice system to disable auto-forwarding when a voice is playing."], "config.afm_characters": ["config", "config.afm_characters", " = 250", "", "var", "The number of characters in a string it takes to cause the amount of time specified in the auto forward mode preference to be delayed before auto-forward mode takes effect."], "config.afm_voice_delay": ["config", "config.afm_voice_delay", " = .5", "", "var", "The number of seconds after a voice file finishes playing before AFM can advance text."], "config.after_default_callbacks": ["config", "config.after_default_callbacks", " = [ ... ]", "", "var", "A list of functions that are called (with no arguments) whenever default statements are processed. The default statements are run after the init phase, but before the game starts; when the a save is loaded; after rollback; before lint; and potentially at other times.\n\nSimilar to the default statement, these callbacks are a good place to add data to the game that does not exist, but needs to."], "config.after_load_callbacks": ["config", "config.after_load_callbacks", " = [ ... ]", "", "var", "A list of functions that are called (with no arguments) when a load occurs.\n\nIf these callbacks change data (for example, migrating data from an old version of the game), :func:`renpy.block_rollback` should be called to prevent the player from rolling back and reverting the changes."], "config.after_load_transition": ["config", "config.after_load_transition", " = None", "", "var", "A transition that is used after loading, when entering the loaded game."], "config.after_replay_callback": ["config", "config.after_replay_callback", " = None", "", "var", "If not None, a function that is called with no arguments after a replay completes."], "config.all_character_callbacks": ["config", "config.all_character_callbacks", " = [ ... ]", "", "var", "A list of callbacks that are called by all characters. This list is prepended to the list of character-specific callbacks. Ren'Py includes its own callbacks at the start of this list."], "config.allow_screensaver": ["config", "config.allow_screensaver", " = True", "", "var", "If True, the screensaver may activite while the game is running. If False, the screensaver is disabled."], "config.allow_skipping": ["config", "config.allow_skipping", " = True", "", "var", "If set to False, the user is not able to skip over the text of the game. See :var:`_skipping`."], "config.always_shown_screens": ["config", "config.always_shown_screens", " = [ ... ]", "", "var", "A list of names of screens that Ren'Py will always show, even in menus, and when the interface is hidden. If a screen in this list is ever not shown, that screen will be re-shown. This is used by Ren'Py, which may modify the list.\n\nSetting :var:`config.overlay_screens` is usually more appropriate."], "config.archives": ["config", "config.archives", " = [ ... ]", "", "var", "A list of archive files that will be searched for images and other data. The entries in this should consist of strings giving the base names of archive files, without the .rpa extension.\n\nThe archives are searched in the order they are found in this list. A file is taken from the first archive it is found in.\n\nAt startup, Ren'Py will automatically populate this variable with the names of all archives found in the game directory, sorted in reverse ascii order. For example, if Ren'Py finds the files data.rpa, patch01.rpa, and patch02.rpa, this variable will be populated with ``['patch02', 'patch01', 'data']``."], "config.at_exit_callbacks": ["config", "config.at_exit_callbacks", " = [ ]", "", "var", "A list of callbacks that are called when Ren'Py quits or restarts the game. These callbacks should not interact with the user."], "config.audio_filename_callback": ["config", "config.audio_filename_callback", " = None", "", "var", "If not None, this is a function that is called with an audio filename, and is expected to return a second audio filename, the latter of which will be played.\n\nThis is intended for use when an a games has audio file formats changed, but it's not destired to update the game script."], "config.auto_channels": ["config", "config.auto_channels", " = { \"audio\" : ( \"sfx\", \"\", \"\" ), ... }", "", "var", "This is used to define automatic audio channels. It's a map the channel name to a tuple containing 3 components:\n\n* The mixer the channel uses. * A prefix that is given to files played on the channel. * A suffix that is given to files played on the channel."], "config.auto_choice_delay": ["config", "config.auto_choice_delay", " = None", "", "var", "If not None, this variable gives a number of seconds that Ren'Py will pause at an in-game menu before picking a random choice from that menu. We'd expect this variable to always be set to None in released games, but setting it to a number will allow for automated demonstrations of games without much human interaction."], "config.auto_load": ["config", "config.auto_load", " = None", "", "var", "If not None, the name of a save file to automatically load when Ren'Py starts up. This is intended for developer use, rather than for end users. Setting this to \\1\\ will automatically load the game in save slot 1."], "config.auto_movie_channel": ["config", "config.auto_movie_channel", " = True", "", "var", "If True, and the `play` argument is given to :func:`Movie`, an audio channel name is automatically generated for each movie.\n\n:var:`config.single_movie_channel` takes precendece over this variable."], "config.auto_voice": ["config", "config.auto_voice", " = None", "", "var", "This may be a string, a function, or None. If None, auto-voice is disabled.\n\nIf a string, this is formatted with the ``id`` variable bound to the identifier of the current line of dialogue. If this gives an existing file, that file is played as voice audio.\n\nIf a function, the function is called with a single argument, the identifier of the current line of dialogue. The function is expected to return a string. If this gives an existing file, that file is played as voice audio.\n\nSee :ref:`Automatic Voice ` for more details."], "config.autoreload": ["config", "config.autoreload", " = True", "", "var", "If True, Shift+R will toggle automatic reloading. When automatic reloading is enabled, Ren'Py will reload the game whenever a used file is modified.\n\nIf False, Ren'Py will reload the game once per press of Shift+R."], "config.autosave_callback": ["config", "config.autosave_callback", " = None", "", "var", "A callback or list of callbacks or Actions that will be called after each time a background autosave happens. Although actions may be used, the Return action will not function.\n\nIf a non-Action callback shows a displayable or screen, :func:`renpy.restart_interaction` should be called.\n```\ndefine config.autosave_callback = Notify(\\Autosaved.\\)\n\n```"], "config.autosave_frequency": ["config", "config.autosave_frequency", " = 200", "", "var", "Roughly, the number of interactions that will occur before an autosave occurs. To disable autosaving, set :var:`config.has_autosave` to False, don't change this variable."], "config.autosave_on_choice": ["config", "config.autosave_on_choice", " = True", "", "var", "If True, Ren'Py will autosave upon encountering an in-game choice. (When :func:`renpy.choice_for_skipping` is called.)"], "config.autosave_on_input": ["config", "config.autosave_on_input", " = True", "", "var", "If True, Ren'Py will autosave when the user inputs text. (When :func:`renpy.input` is called.)"], "config.autosave_on_quit": ["config", "config.autosave_on_quit", " = True", "", "var", "If True, Ren'Py will attempt to autosave when the user attempts to quit, return to the main menu, or load a game over the existing game. (To save time, the autosave occurs while the user is being prompted to confirm his or her decision.)"], "config.autosave_prefix_callback": ["config", "config.autosave_prefix_callback", " = None", "", "var", "If not None, this is a function that is called with no arguments, and return the prefix of autosave files. The default prefix used is \\auto-\\, which means the autosave slots will be \\auto-1\\, \\auto-2\\, etc."], "config.autosave_slots": ["config", "config.autosave_slots", " = 10", "", "var", "The number of slots used by autosaves."], "config.bottom_layers": ["config", "config.bottom_layers", " = [ \"bottom\", ... ]", "", "var", "This is a list of names of layers that are displayed above all other layers, and do not participate in a transition that is applied to all layers. If a layer name is listed here, it should not be listed in :var:`config.layers`` or :var:`config.top_layers`."], "config.cache_surfaces": ["config", "config.cache_surfaces", " = False", "", "var", "If True, the underlying data of an image is stored in RAM, allowing image manipulators to be applied to that image without reloading it from disk. If False, the data is dropped from the cache, but kept as a texture in video memory, reducing RAM usage."], "config.call_screen_roll_forward": ["config", "config.call_screen_roll_forward", " = False", "", "var", "The value is used when the `roll_forward` property of a screen is None."], "config.character_callback": ["config", "config.character_callback", " = None", "", "var", "The default value of the `callback` parameter of :class:`Character`."], "config.character_id_prefixes": ["config", "config.character_id_prefixes", " = [ ... ]", "", "var", "This specifies a list of style property prefixes that can be given to a :func:`Character`. When a style prefixed with one of the given prefix is given, it is applied to the displayable with that prefix as its ID.\n\nFor example, the default GUI adds \\namebox\\ to this. When a Character is given the `namebox_background` property, it sets :propref:`background` on the displayable in the say screen with the id \\namebox\\."], "config.choice_empty_window": ["config", "config.choice_empty_window", " = None", "", "var", "If not None, and a choice menu (usually invoked with the ``menu`` statement) does not have a caption, this function is called with the arguments (\\\\, interact=False).\n\nThe expected use of this is\n```\ndefine config.choice_empty_window = extend\n\nDoing this displays repeats the last line of dialogue as the\ncaption of the menu, if no other caption is given.\n\nOther implementations are possible, but it's assumed that this will\nalways display a dialogue window.\n\n```"], "config.choice_layer": ["config", "config.choice_layer", " = \"screens\"", "", "var", "The layer the choice screen (used by the menu statement) is shown on."], "config.clear_layers": ["config", "config.clear_layers", " = [ ... ]", "", "var", "A list of names of layers to clear when entering the main and game menus."], "config.conditionswitch_predict_all": ["config", "config.conditionswitch_predict_all", " = False", "", "var", "The default value of the predict_all argument for :func:`ConditionSwitch` and :func:`ShowingSwitch`, which determines if all possible displayables are shown."], "config.console": ["config", "config.console", " = False", "", "var", "This enables the console in the case :var:`config.developer` is not true."], "config.context_callback": ["config", "config.context_callback", " = None", "", "var", "This is a callback that is called with no arguments when Ren'Py enters a new context, such as a menu context."], "config.context_clear_layers": ["config", "config.context_clear_layers", " = [ 'screens', 'top', 'bottom', ... ]", "", "var", "A list of layers that are cleared when entering a new context."], "config.context_copy_remove_screens": ["config", "config.context_copy_remove_screens", " = [ 'notify', ... ]", "", "var", "Contains a list of screens that are removed when a context is copied for rollback or saving."], "config.context_fadein_music": ["config", "config.context_fadein_music", " = 0", "", "var", "The amount of time in seconds Ren'Py spends fading in music when the music is played due to a context change. (Usually, when the game is loaded.)"], "config.context_fadeout_music": ["config", "config.context_fadeout_music", " = 0", "", "var", "The amount of time in seconds Ren'Py spends fading out music when the music is played due to a context change. (Usually, when the game is loaded.)"], "config.controller_blocklist": ["config", "config.controller_blocklist", " = [ ... ]", "", "var", "A list of strings, where each string is matched against the GUID of a game controller. These strings are mached as a prefix to the controller GUID (which cand be found in log.txt), and if matched, prevent the controller from being initialized."], "config.custom_text_tags": ["custom_text_tags", "config.custom_text_tags", " = { }", "", "var", "Maps text tag names to text tag functions, when the text tag can wrap other text."], "config.debug_image_cache": ["config", "config.debug_image_cache", " = False", "", "var", "If True, Ren'Py will write information about the :ref:`image cache ` to image_cache.txt."], "config.debug_prediction": ["config", "config.debug_prediction", " = False", "", "var", "If True, Ren'Py will will write information about and errors that occur during prediction (of execution flow, images, and screens) to log.txt and the console."], "config.debug_sound": ["config", "config.debug_sound", " = False", "", "var", "Enables debugging of sound functionality. This disables the suppression of errors when generating sound. However, if a sound card is missing or flawed, then such errors are normal, and enabling this may prevent Ren'Py from functioning normally. This should always be False in a released game."], "config.debug_text_overflow": ["config", "config.debug_text_overflow", " = False", "", "var", "When true, Ren'Py will log text overflows to text_overflow.txt. A text overflow occurs when a :class:`Text` displayable renders to a size larger than that allocated to it. By setting this to True and setting the :propref:`xmaximum` and :propref:`ymaximum` style properties of the dialogue window to the window size, this can be used to report cases where the dialogue is too large for its window."], "config.default_attribute_callbacks": ["config", "config.default_attribute_callbacks", " = { }", "", "var", "When a statement or function that contains image attributes executes or is predicted, and the tag is not currently being shown, it's looked up in this dictionary. If it is not found, the None key is looked up instead.\n\nIf either is found, they're expected to be a function. The function is given an image name, a tuple consisting of the tag and any attributes. It should return an iterable which contains any additional attributes to be applied when an image is first shown.\n\nThe results of the function are treated as additive-only, and any explicit conflicting or negative attributes will still take precedence.\n\nAs this function may be called during prediction, it must not rely on any state."], "config.default_language": ["config", "config.default_language", " = None", "", "var", "If not None, this should be a string giving the default language that the game is translated into by the translation framework.\n\nSee :doc:`translation` for more details."], "config.default_music_volume": ["preferences", "config.default_music_volume", " = 1.0", "", "var", "The default volume of the music mixer, which is used for the music and movie channels. This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.default_sfx_volume": ["preferences", "config.default_sfx_volume", " = 1.0", "", "var", "The default volume of the sfx mixer, which is used for the sound and audio channels. This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.default_tag_layer": ["config", "config.default_tag_layer", " = \"master\"", "", "var", "The layer an image is shown on if its tag is not found in :var:`config.tag_layer`."], "config.default_transform": ["config", "config.default_transform", " = ...", "", "var", "When a displayable is shown using the show or scene statements, the transform properties are taken from this transform and used to initialize the values of the displayable's transform.\n\nThe default transform is :var:`center`."], "config.default_voice_volume": ["preferences", "config.default_voice_volume", " = 1.0", "", "var", "The default volume of the voice mixer, which is used for the voice channel (and hence the voice statement, auto-voice, etc.). This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.defer_styles": ["config", "config.defer_styles", " = False", "", "var", "When true, the execution of style statements is deferred until after all ``translate python`` blocks have executed. This lets a ``translate python`` block update variables that are then used in style (not translate style) statements.\n\nWhile this defaults to False, it's set to True when :func:`gui.init` is called."], "config.descriptive_text_character": ["self_voicing", "config.descriptive_text_character", " = None", "", "var", "If not None, this should be a character object that is used to display the descriptive text, instead of the narrator."], "config.detached_layers": ["config", "config.detached_layers", " = [ ]", "", "var", "These are layers which do not get automatically added to scenes. They are always treated as :var:`sticky ` and intended for use with the :class:`Layer` displayable for embedding."], "config.developer": ["config", "config.developer", " = \"auto\"", "", "var", "If set to True, developer mode is enabled. Developer mode gives access to the shift+D developer menu, shift+R reloading, and various other features that are not intended for end users.\n\nThis can be True, False, or \\auto\\. If \\auto\\, Ren'Py will detect if the game has been packaged into a distribution, and set config.developer as appropriate."], "config.disable_input": ["config", "config.disable_input", " = False", "", "var", "When true, :func:`renpy.input` terminates immediately and returns its `default` argument."], "config.dispatch_gesture": ["gesture", "config.dispatch_gesture", " : Callable", "", "var", "The function that is used to dispatch gestures. This function is passed the raw gesture string. If it returns non-None, the interaction ends."], "config.display_start_callbacks": ["config", "config.display_start_callbacks", " = [ ]", "", "var", "This contains a list of functions that are called after Ren'Py displays a window, but before the first frame is rendered. The main use of this is to allow libraries to gain access to resources that need an initializd gui, like OpenGL functions."], "config.displayable_prefix": ["config", "config.displayable_prefix", " = { }", "", "var", "See :ref:`Displayable prefixes `."], "config.emphasize_audio_channels": ["config", "config.emphasize_audio_channels", " = [ 'voice' ]", "", "var", "A list of strings giving audio channel names.\n\nIf the \\emphasize audio\\ preference is enabled, when one of the audio channels listed starts playing a sound, all channels that are not listed in this variable have their secondary audio volume reduced to :var:`config.emphasize_audio_volume` over :var:`config.emphasize_audio_time` seconds.\n\nWhen no channels listed in this variable are playing audio, all channels that are not listed have their secondary audio volume raised to 1.0 over :var:`config.emphasize_audio_time` seconds.\n\nFor example, setting this to ``[ 'voice' ]`` will lower the volume of all non-voice channels when a voice is played."], "config.emphasize_audio_time": ["config", "config.emphasize_audio_time", " = 0.5", "", "var", "See above."], "config.emphasize_audio_volume": ["config", "config.emphasize_audio_volume", " = 0.5", "", "var", "See above."], "config.empty_window": ["config", "config.empty_window", " : Callable", "", "var", "This is called with no arguments when _window is True, and no window has been shown on the screen. (That is, no call to :func:`renpy.shown_window` has occurred.) It's expected to show an empty window on the screen, and return without causing an interaction.\n\nThe default implementation of this uses the narrator character to display a blank line without interacting."], "config.enable_language_autodetect": ["config", "config.enable_language_autodetect", " = False", "", "var", "If true, Ren'Py will attempt to determine the name of the language to use based on the locale of the player's system. If successful, this language will be used as the default language."], "config.end_game_transition": ["config", "config.end_game_transition", " = None", "", "var", "The transition that is used to display the main menu after the game ends normally, either by invoking return with no place to return to, or by calling :func:`renpy.full_restart`."], "config.end_splash_transition": ["config", "config.end_splash_transition", " = None", "", "var", "The transition that is used to display the main menu after the end of the splashscreen."], "config.enter_replay_transition": ["config", "config.enter_replay_transition", " = None", "", "var", "If not None, a transition that is used when entering a replay."], "config.enter_sound": ["config", "config.enter_sound", " = None", "", "var", "If not None, this is a sound file that is played when entering the game menu."], "config.enter_transition": ["config", "config.enter_transition", " = None", "", "var", "If not None, this variable should give a transition that will be used when entering the game menu."], "config.enter_yesno_transition": ["config", "config.enter_yesno_transition", " = None", "", "var", "If not None, a transition that is used when entering the yes/no prompt screen."], "config.ex_rollback_classes": ["config", "config.ex_rollback_classes", " = [ ]", "", "var", "A list of class objects that should not generate a warning that the object supported rollback in the past, but do not now. If you have intentionally removed rollack support from a class, place the class object in this list and the warning will be suppressed.\n\nChances are, you don't want to use this - you want to add ``object`` to the list of base types for your class."], "config.exception_handler": ["config", "config.exception_handler", " = None", "", "var", "If not None, this should be a function that takes three arguments:\n\n* A string giving the text of a traceback, abbreviated so that it only includes creator-written files. * The full text of the traceback, including both creator-written and Ren'Py files. * The path to a file containing a traceback method.\n\nThis function can present the error to a user in any way fit. If it returns True, the exception is ignored and control is transferred to the next statement. If it returns False, the built-in exception handler is use. This function may also call :func:`renpy.jump` to transfer control to some other label."], "config.exit_replay_transition": ["config", "config.exit_replay_transition", " = None", "", "var", "If not None, a transition that is used when exiting a replay."], "config.exit_sound": ["config", "config.exit_sound", " = None", "", "var", "If not None, this is a sound file that is played when exiting the game menu."], "config.exit_transition": ["config", "config.exit_transition", " = None", "", "var", "If not None, this variable should give a transition that will be performed when exiting the game menu."], "config.exit_yesno_transition": ["config", "config.exit_yesno_transition", " = None", "", "var", "If not None, a transition that is used when exiting the yes/no prompt screen."], "config.fadeout_audio": ["config", "config.fadeout_audio", " = 0.016", "", "var", "The default audio fadeout time that's used to fade out audio, when audio is stopped with the ``stop`` statement or :func:`renpy.music.stop`, or when a new audio track is started with the ``play`` statement or :func:`renpy.music.play`. This is not used when queued audio beings.\n\nA short fadeout is the default to prevent clicks and pops when audio is stopped or changed."], "config.fast_skipping": ["config", "config.fast_skipping", " = False", "", "var", "Set this to True to allow fast skipping outside of developer mode."], "config.file_open_callback": ["config", "config.file_open_callback", " = None", "", "var", "If not None, this is a function that is called with the file name when a file needs to be opened. It should return a file-like object, or None to load the file using the usual Ren'Py mechanisms. Your file-like object must implement at least the read, seek, tell, and close methods.\n\nOne may want to also define a :var:`config.loadable_callback` that matches this."], "config.file_slotname_callback": ["config", "config.file_slotname_callback", " = None", "", "var", "If not None, this is a function that is used by the :ref:`file actions ` to convert a page and name into a slot name that can be passed to the :ref:`save functions `.\n\n`page` This is a string containing the name of the page that is being accessed. This is a string, usually containing a number, but it also may contain special values like \\quick\\ or \\auto\\.\n\n`name` The is a string that contains the name of the slot on the page. It may also contain a regular expression pattern (like r'\\d+'), in which case the same pattern should be included in the result.\n\nThe default behavior is equivalent to\n```\ndef file_slotname_callback(page, name):\nreturn page + \\-\\ + name\n\nconfig.file_slotname_callback = file_slotname_callback\n\nOne use of this is to allow the the game to apply a prefix to\nsave files.\n\nSee also :var:`config.autosave_prefix_callback`.\n\n```"], "config.fix_rollback_without_choice": ["config", "config.fix_rollback_without_choice", " = False", "", "var", "This option determines how the built-in menus or imagemaps behave during fixed rollback. The default value is False, which means that only the previously selected menu option remains clickable. If set to True, the selected option is marked but no options are clickable. The user can progress forward through the rollback buffer by clicking."], "config.focus_crossrange_penalty": ["config", "config.focus_crossrange_penalty", " = 1024", "", "var", "This is the amount of penalty to apply to moves perpendicular to the selected direction of motion, when moving focus with the keyboard."], "config.font_name_map": ["config", "config.font_name_map", " = { }", "", "var", "This is a map from (font name) to (font filepath/fontgroup). Font names simplify and shorten ``{font}`` tags, and gives them access to the :ref:`fontgroup` feature."], "config.font_replacement_map": ["config", "config.font_replacement_map", " = { }", "", "var", "This is a map from (font, bold, italics) to (font, bold, italics), used to replace a font with one that's specialized as having bold and/or italics. For example, if you wanted to have everything using an italic version of \\Vera.ttf\\ use \\VeraIt.ttf\\ instead, you could write\n```\ninit python:\nconfig.font_replacement_map[\\Vera.ttf\\, False, True] = (\\VeraIt.ttf\\, False, False)\n\nPlease note that these mappings only apply to specific variants of\na font. In this case, requests for a bold italic version of vera\nwill get a bold italic version of vera, rather than a bold version\nof the italic vera.\n\n```"], "config.game_main_transition": ["config", "config.game_main_transition", " = None", "", "var", "If not None, a transition that is used when returning to the main menu from the game menu, using the :func:`MainMenu` action."], "config.game_menu_music": ["config", "config.game_menu_music", " = None", "", "var", "If not None, a music file to play when at the game menu."], "config.gamedir": ["config", "config.gamedir", " = ...", "", "var", "The full path leading to the game's ``game/`` directory. This is a read-only variable. There is no guarantee that any file will be there, typically on platforms such as android."], "config.gc_print_unreachable": ["config", "config.gc_print_unreachable", " = False", "", "var", "If True, Ren'Py will print to its console and logs information about the objects that are triggering collections."], "config.gc_thresholds": ["config", "config.gc_thresholds", " = (25000, 10, 10)", "", "var", "The GC thresholds that Ren'Py uses when not idle. These are set to try to ensure that garbage collection doesn't happen. The three numbers are:\n\n* The net number of objects that need to be allocated before a level-0 collection. * The number of level-0 collections that trigger a level-1 collection. * The number of level-1 collections that trigger a level-2 collection.\n\n(Level-0 collections should be fast enough to not cause a frame drop, level-1 collections might, level-2 will.)"], "config.gestures": ["gesture", "config.gestures", " = { \"n_s_w_e_w_e\" : \"progress_screen\" }", "", "var", "A map from gesture to the event activated by the gesture."], "config.gl_blend_func": ["model", "config.gl_blend_func", " = { ... }", "", "var", "A dictionary used to map a blend mode name to a blend function. The blend modes are supplied to the blend func property, given below."], "config.gl_clear_color": ["config", "config.gl_clear_color", " = \"#000\"", "", "var", "The color that the window is cleared to before images are drawn. This is mainly seen as the color of the letterbox or pillarbox edges drawn when aspect ratio of the window or monitor in fullscreen mode) does not match the aspect ratio of the game."], "config.gl_lod_bias": ["config", "config.gl_lod_bias", " = -0.5", "", "var", "The default value of the :ref:`u_lod_bias ` uniform, which controls the mipmap level Ren'Py uses."], "config.gl_resize": ["config", "config.gl_resize", " = True", "", "var", "Determines if the user is allowed to resize an OpenGL-drawn window."], "config.gl_test_image": ["config", "config.gl_test_image", " = \"black\"", "", "var", "The name of the image that is used when running the OpenGL performance test. This image will be shown for 5 frames or .25 seconds, on startup. It will then be automatically hidden."], "config.hard_rollback_limit": ["config", "config.hard_rollback_limit", " = 100", "", "var", "This is the number of steps that Ren'Py will let the user interactively rollback. Set this to 0 to disable rollback entirely, although we don't recommend that, as rollback is useful to let the user see text he skipped by mistake."], "config.has_autosave": ["config", "config.has_autosave", " = True", "", "var", "If true, the game will autosave. If false, no autosaving will occur."], "config.help": ["config", "config.help", " = None", "", "var", "The default value for the :func:`Help` action."], "config.help_screen": ["config", "config.help_screen", " = \"help\"", "", "var", "The name of the screen shown by pressing f1 on the keyboard, or by the :func:`Help` action under certain circumstances."], "config.hide": ["config", "config.hide", " = renpy.hide", "", "var", "A function that is called when the :ref:`hide statement ` is executed. This should take the same arguments as renpy.hide."], "config.history_callbacks": ["config", "config.history_callbacks", " = [ ... ]", "", "var", "This contains a list of callbacks that are called before Ren'Py adds a new object to _history_list. The callbacks are called with the new HistoryEntry object as the first argument, and can add new fields to that object.\n\nRen'Py uses history callbacks internally, so creators should append their own callbacks to this list, rather than replacing it entirely."], "config.history_current_dialogue": ["config", "config.history_current_dialogue", " = True", "", "var", "If true, the current dialogue will appear in the history screen."], "config.history_length": ["config", "config.history_length", " = None", "", "var", "The number of entries of dialogue history Ren'Py keeps. This is set to 250 by the default gui."], "config.hw_video": ["config", "config.hw_video", " = False", "", "var", "If true, hardware video playback will be used on mobile platforms. This may be faster, but only some formats are supported and only fullscreen video is available. If false, software playback will be used."], "config.hyperlink_handlers": ["config", "config.hyperlink_handlers", " = { ... }", "", "var", "A dictionary mapping a hyperlink protocol to the handler for that protocol. A handler is a function that takes the value (everything after the :) and performs some action. If a value is returned, the interaction ends. Otherwise, the click is ignored and the interaction continues."], "config.hyperlink_protocol": ["config", "config.hyperlink_protocol", " = \"call_in_new_context\"", "", "var", "The protocol that is used for hyperlinks that do not have a protocol assigned to them. See :ref:`the a text tag ` for a description as to what the possible protocols mean."], "config.idle_gc_count": ["config", "config.idle_gc_count", " = 2500", "", "var", "The net number of objects that triggers a collection when Ren'Py has reached a steady state. (The fourth frame or later after the screen has been updated.)"], "config.image_cache_size": ["config", "config.image_cache_size", " = None", "", "var", "If not None, this is used to set the size of the :ref:`image cache `, as a multiple of the screen size. This number is multiplied by the size of the screen, in pixels, to get the size of the image cache in pixels.\n\nIf set too large, this can waste memory. If set too small, images can be repeatedly loaded, hurting performance."], "config.image_cache_size_mb": ["config", "config.image_cache_size_mb", " = 300", "", "var", "This is used to set the size of the :ref:`image cache `, in megabytes. If :var:`config.cache_surfaces` is False, an image takes 4 bytes per pixel, otherwise it takes 8 bytes per pixel.\n\nIf set too large, this can waste memory. If set too small, images can be repeatedly loaded, hurting performance. If not none, :var:`config.image_cache_size` is used instead of this variable."], "config.imagemap_auto_function": ["config", "config.imagemap_auto_function", " : Callable", "", "var", "A function that expands the `auto` property of a screen language :ref:`imagebutton ` or :ref:`imagemap ` statement into a displayable. It takes the value of the auto property, and the desired image, one of: \\insensitive\\, \\idle\\, \\hover\\, \\selected_idle\\, \\selected_hover\\, or \\ground\\. It should return a displayable or None.\n\nThe default implementation formats the `auto` property with the desired image, and then checks if the computed filename exists."], "config.implicit_with_none": ["config", "config.implicit_with_none", " = True", "", "var", "If True, then by default the equivalent of a :ref:`with None ` statement will be performed after interactions caused by dialogue, menus input, and imagemaps. This ensures that old screens will not show up in transitions."], "config.input_caret_blink": ["config", "config.input_caret_blink", " = 1.0", "", "var", "If not False, sets the blinking period of the default caret, in seconds."], "config.interact_callbacks": ["config", "config.interact_callbacks", " = [ ... ]", "", "var", "A list of functions that are called (without any arguments) when an interaction is started or restarted."], "config.intra_transition": ["config", "config.intra_transition", " = None", "", "var", "The transition that is used between screens of the game and main menu. (That is, when the screen is changed with :func:`ShowMenu`.)"], "config.keep_running_transform": ["config", "config.keep_running_transform", " = True", "", "var", "If True, showing an image without supplying a transform or ATL block will cause the image to continue the previous transform an image with that tag was using, if any. If False, the transform is stopped."], "config.keep_side_render_order": ["config", "config.keep_side_render_order", " = True", "", "var", "If True, the order of substrings in the Side positions will be determine the order of children render."], "config.keymap": ["config", "config.keymap", " = { ... }", "", "var", "This variable contains a keymap giving the keys and mouse buttons assigned to each possible operation. Please see the section on :doc:`Keymaps ` for more information."], "config.label_callbacks": ["config", "config.label_callbacks", " = [ ]", "", "var", "This is a list of callbacks that are called whenever a labels is reached. The callbacks are called with two arguments. The first is the name of the label. The second is True if the label was reached through jumping, calling, or creating a new context, and False otherwise."], "config.label_overrides": ["config", "config.label_overrides", " = { }", "", "var", "This variable gives a way of causing jumps and calls of labels in Ren'Py script to be redirected to other labels. For example, if you add a mapping from \\start\\ to \\mystart\\, all jumps and calls to \\start\\ will go to \\mystart\\ instead."], "config.language": ["translation", "config.language", " = None", "", "var", "If not None, sets the language to use at game launch, overriding any memorized choice made by the user."], "config.layer_clipping": ["config", "config.layer_clipping", " = { ... }", "", "var", "Controls layer clipping. This is a map from layer names to (x, y, height, width) tuples, where x and y are the coordinates of the upper-left corner of the layer, with height and width giving the layer size.\n\nIf a layer is not mentioned in config.layer_clipping, then it is assumed to take up the full screen."], "config.layeredimage_offer_screen": ["config", "config.layeredimage_offer_screen", " = True", "", "var", "This variable sets the default value for the ``offer_screen`` property of layeredimages. See :ref:`the related section ` for more information."], "config.layers": ["config", "config.layers", " = [ 'master', 'transient', 'screens', 'overlay', ... ]", "", "var", "This variable gives a list of all of the layers that Ren'Py knows about, in the order that they will be displayed to the screen. (The lowest layer is the first entry in the list.) Ren'Py uses the layers \\master\\, \\transient\\, \\screens\\, and \\overlay\\ internally (and possibly others in future versions), so they should always be in this list.\n\nThe :func:`renpy.add_layer` can add layers to this variable without needing to know the original contents."], "config.lint_character_statistics": ["config", "config.lint_character_statistics", " = True", "", "var", "If true, and :var:`config.developer` is true, the lint report will include statistics about the number of dialogue blocks spoken for each character. The chanracter statistics are disabled when the game is packaged, to prevent spoilers."], "config.lint_hooks": ["config", "config.lint_hooks", " = [ ... ]", "", "var", "This is a list of functions that are called, with no arguments, when lint is run. The functions are expected to check the script data for errors, and print any they find to standard output (using the Python ``print`` statement is fine in this case)."], "config.load_before_transition": ["config", "config.load_before_transition", " = True", "", "var", "If True, the start of an interaction will be delayed until all images used by that interaction have loaded. (Yeah, it's a lousy name.)"], "config.load_failed_label": ["config", "config.load_failed_label", " = None", "", "var", "If a string, this is a label that is jumped to when a load fails because the script has changed so much that Ren'Py can't recover. Before performing the load, Ren'Py will revert to the start of the last statement, then it will clear the call stack.\n\nThis may also be a function. If it is, the function is called with no arguments, and is expected to return a string giving the label."], "config.loadable_callback": ["config", "config.loadable_callback", " = None", "", "var", "When not None, a function that's called with a filename. It should return True if the file is loadable, and False if not. This can be used with :var:`config.file_open_callback` or :var:`config.missing_image_callback`."], "config.locale_to_language_function": ["config", "config.locale_to_language_function", " : Callable", "", "var", "A function that determines the language the game should use, based on the the user's locale. It takes 2 string arguments that give the ISO code of the locale and the ISO code of the region.\n\nIt should return a string giving the name of a translation to use, or None to use the default translation."], "config.log": ["config", "config.log", " = None", "", "var", "If not None, this is expected to be a filename. Much of the text shown to the user by :ref:`say ` or :doc:`menu ` statements will be logged to this file."], "config.log_gl_shaders": ["model", "config.log_gl_shaders", " = False", "", "var", "If true, source code for the GLSL shader programs will be written to log.txt on start."], "config.log_live2d_loading": ["live2d", "config.log_live2d_loading", " = False", "", "var", "If True, loaded path and used motions and expressions will be written to log.txt on start."], "config.log_width": ["config", "config.log_width", " = 78", "", "var", "The width of lines logged when :var:`config.log` is used."], "config.longpress_duration": ["config", "config.longpress_duration", " = 0.5", "", "var", "The amount of time the player must press the screen for a longpress to be recognized on a touch device."], "config.longpress_radius": ["config", "config.longpress_radius", " = 15", "", "var", "The number of pixels the touch must remain within for a press to be recognized as a longpress."], "config.longpress_vibrate": ["config", "config.longpress_vibrate", " = .1", "", "var", "The amount of time the device will vibrate for after a longpress."], "config.main_menu_music": ["config", "config.main_menu_music", " = None", "", "var", "If not None, a music file to play when at the main menu."], "config.main_menu_music_fadein": ["config", "config.main_menu_music_fadein", " = 0.0", "", "var", "The number of seconds to take to fade in :var:`config.main_menu_music`."], "config.main_menu_stop_channels": ["config", "config.main_menu_stop_channels", " = [ \"movie\", \"sound\", \"voice\", ... ]", "", "var", "A list of channels that are stopped when entering or returning to the main menu."], "config.manage_gc": ["config", "config.manage_gc", " = True", "", "var", "If True, Ren'Py will manage the GC itself. This means that it will apply the settings below."], "config.menu_arguments_callback": ["config", "config.menu_arguments_callback", " = None", "", "var", "If not None, this should be a function that takes positional and/or keyword arguments. It's called whenever a menu statement runs, with the arguments to that menu statement.\n\nThis should return a pair, containing a tuple of positional arguments (almost always empty), and a dictionary of keyword arguments."], "config.menu_clear_layers": ["config", "config.menu_clear_layers", " = [ ... ]", "", "var", "A list of layer names (as strings) that are cleared when entering the game menu."], "config.menu_include_disabled": ["config", "config.menu_include_disabled", " = False", "", "var", "When this variable is set, choices disables with the if statement are included as disabled buttons."], "config.menu_window_subtitle": ["config", "config.menu_window_subtitle", " = \"\"", "", "var", "The :var:`_window_subtitle` variable is set to this value when entering the main or game menus."], "config.minimum_presplash_time": ["config", "config.minimum_presplash_time", " = 0.0", "", "var", "The minimum amount of time, in seconds, a presplash, Android presplash, or iOS LaunchImage is displayed for. If Ren'Py initializes before this amount of time has been reached, it will sleep to ensure the image is shown for at least this amount of time. The image may be shown longer if Ren'Py takes longer to start up."], "config.mipmap_dissolves": ["config", "config.mipmap_dissolves", " = False", "", "var", "The default value of the mipmap argument to :func:`Dissolve`, :func:`ImageDissolve`, :func:`AlphaDissolve`, and :func:`AlphaMask`."], "config.mipmap_movies": ["config", "config.mipmap_movies", " = False", "", "var", "The default value of the mipmap argument to :func:`Movie`."], "config.mipmap_text": ["config", "config.mipmap_text", " = False", "", "var", "The default value of the mipmap argument to :func:`Text`, including text used in screen statements."], "config.missing_background": ["config", "config.missing_background", " = \"black\"", "", "var", "This is the background that is used when :var:`config.developer` is True and an undefined image is used in a :ref:`scene statement `. This should be an image name (a string), not a displayable."], "config.missing_image_callback": ["config", "config.missing_image_callback", " = None", "", "var", "If not None, this function is called when an attempt to load an image fails. The callback is passed the filename of the missing image. It may return None, or it may return an :doc:`image manipulator `. If an image manipulator is returned, that image manipulator is loaded in the place of the missing image.\n\nOne may want to also define a :var:`config.loadable_callback`, especially if this is used with a :func:`DynamicImage`."], "config.missing_label_callback": ["config", "config.missing_label_callback", " = None", "", "var", "If not None, this function is called when Ren'Py attempts to access a label that does not exist in the game. The callback should take a single parameter, the name of the missing label. It should return the name of a label to use as a replacement for the missing label, or None to cause Ren'Py to raise an exception."], "config.mode_callbacks": ["config", "config.mode_callbacks", " = [ ... ]", "", "var", "A list of callbacks called when entering a mode. For more documentation, see the section on :doc:`modes`.\n\nThe default value includes a callback that implements :var:`config.adv_nvl_transition` and :var:`config.nvl_adv_transition`."], "config.mouse": ["config", "config.mouse", " = None", "", "var", "This variable controls the use of user-defined mouse cursors. If None, the system mouse is used, which is usually a black-and-white mouse cursor.\n\nOtherwise, this should be a dictionary giving the mouse animations for various mouse types. Keys used by the default library include ``default``, ``say``, ``with``, ``menu``, ``prompt``, ``imagemap``, ``button``, ``pause``, ``mainmenu``, and ``gamemenu``. The ``default`` key should always be present, as it is used when a more specific key is absent. Keys can have an optional prefix ``pressed_`` to indicate that the cursor will be used when the mouse is pressed.\n\nEach value in the dictionary should be a list of (`image`, `xoffset`, `yoffset`) tuples, representing frames.\n\n`image` The mouse cursor image. The maximum size for this image varies based on the player's hardware. 32x32 is guaranteed to work everywhere, while 64x64 works on most hardware. Larger images may not work.\n\n`xoffset` The offset of the hotspot pixel from the left side of the cursor.\n\n`yoffset` The offset of the hotspot pixel from the top of the cursor.\n\nThe frames are played back at 20Hz, and the animation loops after all frames have been shown.\n\nSee :doc:`mouse` for more information and examples."], "config.mouse_displayable": ["config", "config.mouse_displayable", " = None", "", "var", "If not None, this should either be a displayable, or a callable that returns a displayable. The callable may return None, in which case Ren'Py proceeds if the displayable is None.\n\nIf a displayable is given, the mouse cursor is hidden, and the displayable is shown above anything else. This displayable is responsible for positioning and drawing a sythetic mouse cursor, and so should probably be a :func:`MouseDisplayable` or something very similar.\n\nSee :doc:`mouse` for more information."], "config.mouse_focus_clickthrough": ["config", "config.mouse_focus_clickthrough", " = False", "", "var", "If true, clicks that cause a window to be focused will be processed normally. If false, such clicks will be ignored."], "config.mouse_hide_time": ["config", "config.mouse_hide_time", " = 30", "", "var", "The mouse is hidden after this number of seconds has elapsed without any mouse input. This should be set to longer than the expected time it will take to read a single screen, so mouse users will not experience the mouse appearing then disappearing between clicks.\n\nIf None, the mouse will never be hidden."], "config.movie_mixer": ["config", "config.movie_mixer", " = \"music\"", "", "var", "The mixer that is used when a :func:`Movie` automatically defines a channel for video playback."], "config.name": ["config", "config.name", " = \"\"", "", "var", "This should be a string giving the name of the game. This is included as part of tracebacks and other log files, helping to identify the version of the game being used."], "config.narrator_menu": ["config", "config.narrator_menu", " = True", "", "var", "If true, narration inside a menu is displayed using the narrator character. Otherwise, narration is displayed as captions within the menu itself."], "config.nearest_neighbor": ["config", "config.nearest_neighbor", " = False", "", "var", "Uses nearest-neighbor filtering by default, to support pixel art or melting players' eyes."], "config.new_substitutions": ["config", "config.new_substitutions", " = True", "", "var", "If True, Ren'Py will apply new-style (square-bracket) substitutions to all text displayed."], "config.new_translate_order": ["config", "config.new_translate_order", " = True", "", "var", "Enables the new order of style and translate statements introduced in :ref:`Ren'Py 6.99.11 `."], "config.notify": ["config", "config.notify", " : Callable", "", "var", "This is called by :func:`renpy.notify` or :func:`Notify` with a single `message` argument, to display the notification. The default implementation is :func:`renpy.display_notify`. This is intended to allow creators to intercept notifications."], "config.nvl_adv_transition": ["config", "config.nvl_adv_transition", " = None", "", "var", "A transition that is used when showing ADV-mode text directly after NVL-mode text."], "config.nvl_layer": ["nvl_mode", "config.nvl_layer", " = \"screens\"", "", "var", "The layer the nvl screens are shown on."], "config.nvl_list_length": ["nvl_mode", "config.nvl_list_length", " = None", "", "var", "If not None, the maximum length of the the list of NVL dialogue. This can be set (often in conjuction with forcing the dialogue to have a fixed height) in order to emulate an infinite scrolling NVL window."], "config.nvl_page_ctc": ["nvl_mode", "config.nvl_page_ctc", " = None", "", "var", "If not None, this is the click-to-continue indicator that is used for NVL mode characters that are at the end of a page. (That is, immediately followed by an nvl clear statement.) This replaces the ctc parameter of :func:`Character`."], "config.nvl_page_ctc_position": ["nvl_mode", "config.nvl_page_ctc_position", " = \"nestled\"", "", "var", "If not None, this is the click-to-continue indicator position that is used for NVL mode characters that are at the end of a page. (That is, immediately followed by an nvl clear statement.) This replaces the ctc_position parameter of :func:`Character`."], "config.nvl_paged_rollback": ["nvl_mode", "config.nvl_paged_rollback", " = False", "", "var", "If true, NVL-mode rollback will occur a full page at a time."], "config.old_substitutions": ["config", "config.old_substitutions", " = True", "", "var", "If True, Ren'Py will apply old-style (percent) substitutions to text displayed by the :ref:`say ` and :doc:`menu ` statements."], "config.open_file_encoding": ["config", "config.open_file_encoding", " = False", "", "var", "If not False, this is the encoding that :func:`renpy.open_file` uses when its `encoding` parameter is none. This is mostly used when porting Python 2 games that used :func:`renpy.file` extensively to Python 3, to have those files open as text by default.\n\nThis gets its default value from the RENPY_OPEN_FILE_ENCODING environment variable."], "config.optimize_texture_bounds": ["config", "config.optimize_texture_bounds", " = True", "", "var", "When True, Ren'Py will scan images to find the bounding box of the non-transparent pixels, and only load those pixels into a texture."], "config.overlay_during_with": ["config", "config.overlay_during_with", " = True", "", "var", "True if we want overlays to be shown during :ref:`with statements `, or False if we'd prefer that they be hidden during the with statements."], "config.overlay_layers": ["config", "config.overlay_layers", " = [ 'overlay', ... ]", "", "var", "This is a list of all of the overlay layers. Overlay layers are cleared before the overlay functions are called. \\overlay\\ should always be in this list."], "config.overlay_screens": ["config", "config.overlay_screens", " = [ ... ]", "", "var", "A list of screens that are displayed when the overlay is enabled, and hidden when the overlay is suppressed. (The screens are shown on the screens layer, not the overlay layer.)"], "config.pad_bindings": ["config", "config.pad_bindings", " = { ... }", "", "var", "An equivalent of :var:`config.keymap` for gamepads. Please see :doc:`keymap`'s section about pad bindings for more information."], "config.pause_after_rollback": ["config", "config.pause_after_rollback", " = False", "", "var", "If False, the default, rolling back will skip any pauses (timed or not) and stop only at other interactions such as dialogues, menus... If True, renpy will include timeless pauses to the valid places a rollback can take the user."], "config.pause_with_transition": ["config", "config.pause_with_transition", " = False", "", "var", "If false, :func:`renpy.pause` is always, used by the ``pause`` statement. If true, when given a delay, ``pause`` is equivalent to ``with Pause(...)``."], "config.per_frame_screens": ["config", "config.per_frame_screens", " = [ ... ]", "", "var", "This is a list of strings giving the name of screens that are updated once per frame, rather than once per interaction. Ren'Py uses this internally, so if you add a screen, append the name rather than replacing the list in its entirety."], "config.periodic_callback": ["config", "config.periodic_callback", " = None", "", "var", "If not None, this should be a function. The function is called, with no arguments, at around 20Hz."], "config.perspective": ["3dstage", "config.perspective", " = (100, z, 100000)", "", "var", "The default value used when :tpref:`perspective` is not set to a 3-tuple. ``z`` depends on the size of the game, as defined above."], "config.physical_height": ["config", "config.physical_height", " = None", "", "var", "If set, this is the default height of the window containing the Ren'Py game, in pixels. If not set, the height of the window defaults to :var:`config.screen_height`."], "config.physical_width": ["config", "config.physical_width", " = None", "", "var", "If set, this is the default height of the window containing the Ren'Py game, in pixels. If not set, the height of the window defaults to :var:`config.screen_width`."], "config.play_channel": ["config", "config.play_channel", " = \"audio\"", "", "var", "The name of the audio channel used by :func:`renpy.play`, :propref:`hover_sound`, and :propref:`activate_sound`."], "config.predict_statements": ["config", "config.predict_statements", " = 32", "", "var", "This is the number of statements, including the current one, to consider when doing predictive image loading. A breadth-first search from the current statement is performed until this number of statements is considered, and any image referenced in those statements is potentially predictively loaded. Setting this to 0 will disable predictive loading of images."], "config.preload_fonts": ["config", "config.preload_fonts", " = [ ... ]", "", "var", "A list of the names of TrueType and OpenType fonts that Ren'Py should load when starting up. Including the name of a font here can prevent Ren'Py from pausing when introducing a new typeface."], "config.preserve_volume_when_muted": ["config", "config.preserve_volume_when_muted", " = False", "", "var", "If False, the default, the volume of channels are shown as 0 and changing it disables mute when the channel is mute. Otherwise, It is shown and adjustable while keeping mute."], "config.profile": ["config", "config.profile", " = False", "", "var", "If set to True, some profiling information will be output to stdout."], "config.profile_init": ["config", "config.profile_init", " = 0.25", "", "var", "``init`` and ``init python`` blocks taking longer than this amount of time to run are reported to log file."], "config.python_callbacks": ["config", "config.python_callbacks", " = [ ... ]", "", "var", "A list of functions. The functions in this list are called, without any arguments, whenever a Python block is run outside of the init phase.\n\nOne possible use of this would be to have a function limit a variable to within a range each time it is adjusted.\n\nThe functions may be called while Ren'Py is starting up, before the start of the game proper, and potentially before the variables the function depends on are initialized. The functions are required to deal with this, perhaps by using ``hasattr(store, 'varname')`` to check if a variable is defined."], "config.quicksave_slots": ["config", "config.quicksave_slots", " = 10", "", "var", "The number of slots used by quicksaves."], "config.quit_action": ["config", "config.quit_action", " : Action", "", "var", "The action that is called when the user clicks the quit button on a window. The default action prompts the user to see if they want to quit the game."], "config.quit_callbacks": ["config", "config.quit_callbacks", " = [ ... ]", "", "var", "A list of functions that are called (without any arguments) when Ren'Py terminates. This is intended to free resources, such as opened files or started threads."], "config.quit_on_mobile_background": ["config", "config.quit_on_mobile_background", " = False", "", "var", "If True, the mobile app will quit when it loses focus, rather than saving and restoring its state. (See also :var:`config.save_on_mobile_background`, which controls this behavior.)"], "config.reload_modules": ["config", "config.reload_modules", " = [ ... ]", "", "var", "A list of strings giving the names of python modules that should be reloaded along with the game. Any submodules of these modules will also be reloaded."], "config.replace_text": ["config", "config.replace_text", " = None", "", "var", "If not None, a function that is called with a single argument, a text to be displayed to the user. The function can return the same text it was passed, or a replacement text that will be displayed instead.\n\nThe function is called after substitutions have been performed and after the text has been split on tags, so its argument contains nothing but actual text. All displayed text passes through the function: not only dialogue text, but also user interface text.\n\nThis can be used to replace specific ASCII sequences with corresponding Unicode characters, as demonstrated by the following\n```\ndef replace_text(s):\ns = s.replace(\\'\\, u'\\u2019') # apostrophe\ns = s.replace('--', u'\\u2014') # em dash\ns = s.replace('...', u'\\u2026') # ellipsis\nreturn s\nconfig.replace_text = replace_text\n\n```"], "config.replay_scope": ["config", "config.replay_scope", " = { \"_game_menu_screen\" : \"preferences\", ... }", "", "var", "A dictionary mapping variables in the default store to the values the variables will be given when entering a replay."], "config.return_not_found_label": ["config", "config.return_not_found_label", " = None", "", "var", "If not None, a label that is jumped to when a return site is not found. The call stack is cleared before this jump occurs."], "config.rollback_enabled": ["config", "config.rollback_enabled", " = True", "", "var", "Should the user be allowed to rollback the game? If set to False, the user cannot interactively rollback."], "config.rollback_length": ["config", "config.rollback_length", " = 128", "", "var", "When there are more than this many statements in the rollback log, Ren'Py will consider trimming the log. This also covers how many steps Ren'Py will rollback when trying to load a save when the script has changed.\n\nDecreasing this below the default value may cause Ren'Py to become unstable."], "config.rollback_side_size": ["config", "config.rollback_side_size", " = .2", "", "var", "If the rollback side is enabled, the fraction of the screen on the rollback side that, when clicked or touched, causes a rollback to occur."], "config.save_directory": ["config", "config.save_directory", " = \"...\"", "", "var", "This is used to generate the directory in which games and persistent information are saved. The name generated depends on the platform:\n\nWindows %APPDATA%/RenPy/`save_directory`\n\nMac OS X ~/Library/RenPy/`save_directory`\n\nLinux/Other ~/.renpy/`save_directory`\n\nSetting this to None creates a \\saves\\ directory underneath the game directory. This is not recommended, as it prevents the game from being shared between multiple users on a system. It can also lead to problems when a game is installed as Administrator, but run as a user.\n\nThis must be set with either the define statement, or in a ``python early`` block. In either case, this will be run before any other statement, and so it should be set to a string, not an expression.\n\nTo locate the save directory, read :var:`config.savedir` instead of this variable."], "config.save_dump": ["config", "config.save_dump", " = False", "", "var", "If set to True, Ren'Py will create the file save_dump.txt whenever it saves a game. This file contains information about the objects contained in the save file. Each line consists of a relative size estimate, the path to the object, information about if the object is an alias, and a representation of the object."], "config.save_json_callbacks": ["config", "config.save_json_callbacks", " = [ ... ]", "", "var", "A list of callback functions that are used to create the json object that is stored with each save and marked accessible through :func:`FileJson` and :func:`renpy.slot_json`.\n\nEach callback is called with a Python dictionary that will eventually be saved. Callbacks should modify that dictionary by adding JSON-compatible Python types, such as numbers, strings, lists, and dicts. The dictionary at the end of the last callback is then saved as part of the save slot.\n\nThe dictionary passed to the callbacks may have already have keys beginning with an underscore ``_``. These keys are used by Ren'Py, and should not be changed.\n\nFor example\n```\ninit python:\ndef jsoncallback(d):\nd[\\playername\\] = player_name\n\nconfig.save_json_callbacks.append(jsoncallback)\n\n``FileJson(slot)`` and ``renpy.slot_json(slot)`` will recover the state\nof the ``d`` dict-like object as it was at the moment the game was saved.\nThe value of the ``player_name`` variable at the moment the game was saved\nis also accessible by ``FileJson(slot, \\playername\\)``.\n\n```"], "config.save_on_mobile_background": ["config", "config.save_on_mobile_background", " = True", "", "var", "If True, the mobile app will save its state when it loses focus. The state is saved in a way that allows it to be automatically loaded (and the game to resume its place) when the app starts again."], "config.save_physical_size": ["config", "config.save_physical_size", " = True", "", "var", "If True, the physical size of the window will be saved in the preferences, and restored when the game resumes."], "config.save_token_keys": ["config", "config.save_token_keys", " = [ ]", "", "var", "A list of keys that the game will trust when loading a save file. This can be used to allow the game's creator to distribute save files that will be loaded without displaying a warning.\n\nTo allow the save token for the current computer to be trusted in this way, open the :ref:`console ` and run\n```\nprint(renpy.get_save_token_keys())\n\nThis will print the keys out in log.txt. The value can then be used to\ndefine this config.save_token_keys. This variable must be set with a define\nstatement, or in a python early block.\n\n```"], "config.savedir": ["config", "config.savedir", " = ...", "", "var", "The complete path to the directory in which the game is saved. This should only be set in a ``python early`` block. See also :var:`config.save_directory`, which generates the default value for this if it is not set during a ``python early`` block."], "config.say_allow_dismiss": ["config", "config.say_allow_dismiss", " = None", "", "var", "If not None, this should be a function. The function is called with no arguments when the user attempts to dismiss a :ref:`say statement `. If this function returns True, the dismissal is allowed, otherwise it is ignored."], "config.say_arguments_callback": ["config", "config.say_arguments_callback", " = None", "", "var", "If not None, this should be a function that takes the speaking character, followed by positional and keyword arguments. It's called whenever a say statement occurs, even when the statement doesn't explicitly pass arguments. The arguments passed to the callback always include an `interact` argument, and include the others provided in the say statement (if any).\n\nThis should return a pair, containing a tuple of positional arguments (almost always empty), and a dictionary of keyword arguments (almost always with at least `interact` in it). Those will replace the arguments passed to the callback.\n\nFor example\n```\ndef say_arguments_callback(who, interact=True, color=\\#fff\\):\nreturn (), { \\interact\\ : interact, \\what_color\\ : color }\n\nconfig.say_arguments_callback = say_arguments_callback\n\n```"], "config.say_attribute_transition": ["config", "config.say_attribute_transition", " = None", "", "var", "If not None, a transition to use when the image is changed by a say statement with image attributes."], "config.say_attribute_transition_callback": ["config", "config.say_attribute_transition_callback", " : Callable", "", "var", "This is a function that return a transition to apply and a layer to apply it on\n\nThis should be a function that takes four arguments, the image tag being shown, a `mode` parameter, a `set` containing pre-transition tags and a `set` containing post-transition tags. Where the value of the `mode` parameter is one of:\n\n* \\permanent\\, for permanent attribute change (one that lasts longer than the current say statement). * \\temporary\\, for a temporary attribute change (one that is restored at the end of the current say statement). * \\both\\, for a simultaneous permanent and temporary attribute change (one that in part lasts longer than the current say statement, and in part is restored at the end of the current say statement). * \\restore\\, for when a temporary (or both) change is being restored.\n\nThis should return a 2-component tuple, consisting of:\n\n* The transition to use, or None if no transition should occur. * The layer the transition should be on, either a string or None. This is almost always None.\n\nThe default implementation of this returns (config.say_attribute_transition, config.say_attribute_transition_layer)."], "config.say_attribute_transition_layer": ["config", "config.say_attribute_transition_layer", " = None", "", "var", "If not None, this must be a string giving the name of a layer. (Almost always \\master\\.) The say attribute is applied to the named layer, and Ren'Py will not pause to wait for the transition to occur. This will have the effect of transitioning in the attribute as dialogue is shown."], "config.say_layer": ["config", "config.say_layer", " = \"screens\"", "", "var", "The layer the say screen is shown on."], "config.say_menu_text_filter": ["config", "config.say_menu_text_filter", " = None", "", "var", "If not None, then this is a function that is given the text found in strings in the :ref:`say ` and :doc:`menu ` statements. It is expected to return new (or the same) strings to replace them."], "config.say_sustain_callbacks": ["config", "config.say_sustain_callbacks", " = [ ... ]", "", "var", "A list of functions that are called, without arguments, before the second and later interactions caused by a line of dialogue with pauses in it. Used to sustain voice through pauses."], "config.scene": ["config", "config.scene", " = renpy.scene", "", "var", "A function that's used in place of :func:`renpy.scene` by the :ref:`scene statement `. Note that this is used to clear the screen, and :var:`config.show` is used to show a new image. This should have the same signature as :func:`renpy.scene`."], "config.scene_callbacks": ["config", "config.scene_callbacks", " = [ ... ]", "", "var", "A list of functions that are called when the scene statement runs, or :func:`renpy.scene` is called. The functions are called with a single argument, the layer that the scene statement is called on. These functions are called after the layer is cleared, but before the optional image is added, if present.\n\nRen'Py may call renpy.scene for its own purposes, so it's recommended to check the layer name before acting on these callbacks."], "config.screen_height": ["config", "config.screen_height", " = 600", "", "var", "The virtual height of the the game, in pixels. If :var:`config.physical_height` is not set, this is also the default size of the window containing the game. Usually set by :func:`gui.init` to a much larger size."], "config.screen_width": ["config", "config.screen_width", " = 800", "", "var", "The virtual width of the the game, in pixels. If :var:`config.physical_width` is not set, this is also the default size of the window containing the game. Usually set by :func:`gui.init` to a much larger size."], "config.screenshot_callback": ["config", "config.screenshot_callback", " : Callable", "", "var", "A function that is called when a screenshot is taken. The function is called with a single parameter, the full filename the screenshot was saved as."], "config.screenshot_crop": ["config", "config.screenshot_crop", " = None", "", "var", "If not None, this should be a (`x`, `y`, `height`, `width`) tuple. Screenshots are cropped to this rectangle before being saved."], "config.screenshot_pattern": ["config", "config.screenshot_pattern", " = \"screenshot%04d.png\"", "", "var", "The pattern used to create screenshot files. This pattern is applied (using Python's %-formatting rules) to the natural numbers to generate a sequence of filenames. The filenames may be absolute, or relative to config.renpy_base. The first filename that does not exist is used as the name of the screenshot.\n\nDirectories are created if they do not exist.\n\nSee also :var:`_screenshot_pattern`, which is used in preference to this variable if not None."], "config.script_version": ["config", "config.script_version", " = None", "", "var", "If not None, this is interpreted as a script version. The library will use this script version to enable some compatibility features, if necessary. If None, we assume this is a latest-version script.\n\nThis is normally set in a file added by the Ren'Py launcher when distributions are built."], "config.search_prefixes": ["config", "config.search_prefixes", " = [ \"\", \"images/\", ... ]", "", "var", "A list of prefixes that are prepended to filenames that are searched for."], "config.searchpath": ["config", "config.searchpath", " = [ 'common', 'game', ... ]", "", "var", "A list of directories that are searched for images, music, archives, and other media, but not scripts. This is initialized to a list containing \\common\\ and the name of the game directory."], "config.self_closing_custom_text_tags": ["custom_text_tags", "config.self_closing_custom_text_tags", " = { }", "", "var", "Maps text tag names to a self-closing text tag functions, when the text tag does not wrap other text."], "config.show": ["config", "config.show", " = renpy.show", "", "var", "A function that is used in place of :func:`renpy.show` by the :ref:`show ` and :ref:`scene ` statements. This should have the same signature as :func:`renpy.show`, and pass unknown keyword arguments unchanged."], "config.side_image_change_transform": ["side_image", "config.side_image_change_transform", " = None", "", "var", "If not None, a transform that is used when the new side image does not share the name image tag (or one of the new or old side images does not exist)."], "config.side_image_null": ["side_image", "config.side_image_null", " = Null()", "", "var", "The Null displayable to use when not displaying a side image. This can be changed, but only to other Null objects. One reason for doing so would be to set the side of the Null (eg. ``Null(width=200, height=150)``) to prevent dissolves from being cut off."], "config.side_image_only_not_showing": ["side_image", "config.side_image_only_not_showing", " = False", "", "var", "When set to true, the side image will only show if an image with that tag is not already being shown on the screen."], "config.side_image_prefix_tag": ["side_image", "config.side_image_prefix_tag", " = 'side'", "", "var", "If _side_image_prefix_tag is not None, it takes preference over config.side_image_prefix_tag.\n\nThe prefix that is used when searching for a side image."], "config.side_image_same_transform": ["side_image", "config.side_image_same_transform", " = None", "", "var", "If not None, a transform that is used when the new side image shares the same image tag as the previous side image."], "config.side_image_tag": ["side_image", "config.side_image_tag", " = None", "", "var", "If _side_image_tag is not None, it takes precedence over config.side_image_tag.\n\nIf this is given, then the side image will track the given image tag, rather than the image associated with the currently speaking character. For example,\n```\ndefine e = Character(\\Eileen\\, image=\\eileen\\)\ndefine config.side_image_tag = \\eileen\\\n\nWill make the side image track the \\eileen\\ image tag, which is associated\nwith the ``e`` character.\n\n```"], "config.single_movie_channel": ["config", "config.single_movie_channel", " = None", "", "var", "If not None, and the `play` argument is give to :func:`Movie`, this is the name used for the channel the movie is played on. This should not be \\movie\\, as that name is reserved for Ren'Py's internal use."], "config.skip_delay": ["config", "config.skip_delay", " = 75", "", "var", "The amount of time that dialogue will be shown for, when skipping statements using ctrl, in milliseconds. (Although it's nowhere near that precise in practice.)"], "config.skip_indicator": ["config", "config.skip_indicator", " = True", "", "var", "If True, the library will display a skip indicator when skipping through the script."], "config.skip_sounds": ["config", "config.skip_sounds", " = False", "", "var", "If False, non-looping audio will not be played when Ren'Py is skipping."], "config.sound": ["config", "config.sound", " = True", "", "var", "If True, sound works. If False, the sound/mixer subsystem is completely disabled."], "config.sound_sample_rate": ["config", "config.sound_sample_rate", " = 48000", "", "var", "The sample rate that the sound card will be run at. If all of your wav files are of a lower rate, changing this to that rate may make things more efficient."], "config.speaking_attribute": ["config", "config.speaking_attribute", " = None", "", "var", "If not None, this should be a string giving an image attribute, which is added to the character's image tag when the character is speaking, and removed when the character stops.\n\nThis is applied to the image on the default layer for the tag, which can be set using :var:`config.tag_layer`.\n\nThis is very similar to temporary attributes shown using @ in dialogue lines. The attribute is not removed when the text apparition animation ends, but when the dialogue window gets dismissed."], "config.start_callbacks": ["config", "config.start_callbacks", " = [ ... ]", "", "var", "A list of callbacks functions that are called with no arguments after the init phase, but before the game (including the splashscreen) starts. This is intended to be used by frameworks to initialize variables that will be saved.\n\nThe default value of this variable includes callbacks that Ren'Py uses internally to implement features such as nvl-mode. New callbacks can be appended to this list, but the existing callbacks should not be removed."], "config.start_interact_callbacks": ["config", "config.start_interact_callbacks", " = [ ... ]", "", "var", "A list of functions that are called (without any arguments) when an interaction is started. These callbacks are not called when an interaction is restarted."], "config.steam_appid": ["achievement", "config.steam_appid", " = None", "", "var", "If not None, this should be the Steam appid. Ren'Py will automatically set this appid when it starts. This needs to be set using the define statement\n```\ndefine config.steam_appid = 12345\n\n```"], "config.sticky_layers": ["config", "config.sticky_layers", " = [ \"master\", ... ]", "", "var", "A list of layer names that will, when a tag is shown on them, take precedence over that tag's entry in :var:`config.tag_layer` for the duration of it being shown."], "config.tag_layer": ["config", "config.tag_layer", " = { }", "", "var", "A dictionary mapping image tag strings to layer name strings. When an image is shown without a specific layer name, the image's tag is looked up in this dictionary to get the layer to show it on. If the tag is not found here, :var:`config.default_tag_layer` is used."], "config.tag_transform": ["config", "config.tag_transform", " = { ... }", "", "var", "A dictionary mapping image tag strings to transforms or lists of transforms. When an image is newly-shown without an at clause, the image's tag is looked up in this dictionary to find a transform or list of transforms to use."], "config.tag_zorder": ["config", "config.tag_zorder", " = { }", "", "var", "A dictionary mapping image tag strings to zorders. When an image is newly-shown without a zorder clause, the image's tag is looked up in this dictionary to find a zorder to use. If no zorder is found, 0 is used."], "config.thumbnail_height": ["config", "config.thumbnail_height", " = 75", "", "var", "The height of the thumbnails that are taken when the game is saved. These thumbnails are shown when the game is loaded. Please note that the thumbnail is shown at the size it was taken at, rather than the value of this setting when the thumbnail is shown to the user.\n\nThis is changed by the default GUI."], "config.thumbnail_width": ["config", "config.thumbnail_width", " = 100", "", "var", "The width of the thumbnails that are taken when the game is saved. These thumbnails are shown when the game is loaded. Please note that the thumbnail is shown at the size it was taken at, rather than the value of this setting when the thumbnail is shown to the user.\n\nThis is changed by the default GUI."], "config.top_layers": ["config", "config.top_layers", " = [ \"top\", ... ]", "", "var", "This is a list of names of layers that are displayed above all other layers, and do not participate in a transition that is applied to all layers. If a layer name is listed here, it should not be listed in :var:`config.layers`` or :var:`config.bottom_layers`."], "config.transform_uses_child_position": ["config", "config.transform_uses_child_position", " = True", "", "var", "If True, transforms will inherit :ref:`position properties ` from their child. If not, they won't."], "config.transient_layers": ["config", "config.transient_layers", " = [ 'transient', ... ]", "", "var", "This variable gives a list of all of the transient layers. Transient layers are layers that are cleared after each interaction. \\transient\\ should always be in this list."], "config.transition_screens": ["config", "config.transition_screens", " = True", "", "var", "If True, screens will participate in transitions, dissolving from the old state of the screen to the new state of the screen. If False, only the latest state of the screen will be shown."], "config.translate_clean_stores": ["config", "config.translate_clean_stores", " = [ \"gui\", ... ]", "", "var", "A list of named stores that are cleaned to their state at the end of the init phase when the translation language changes."], "config.tts_substitutions": ["config", "config.tts_substitutions", " = [ ]", "", "var", "This is a list of (pattern, replacement) pairs that are used to perform substitutions on text before it is passed to the text-to-speech engine, so that the text-to-speech engine can pronounce it correctly.\n\nPatterns may be either strings or regular expressions, and replacements must be strings.\n\nIf the pattern is a string, it is escaped, then prefixed and suffixed with r'\\\\b' (to indicate it must begin and end at a word boundary), and then compiled into a regular expression. When the pattern is a string, the replacement is also escaped.\n\nIf the pattern is a regular expression, it is used as-is, and the replacement is not escaped.\n\nThe substitutions are performed in the order they are given. If a substitution matches the string, the match is checked to see if it is in title case, upper case, or lower case ; and if so the corresponding casing is performed on the replacement. Once this is done, the replacement is applied.\n\nFor example\n```\ndefine config.tts_substitutions = [\n(\\Ren'Py\\, \\Ren Pie\\),\n]\n\nWill cause the string \\Ren'Py is pronounced ren'py.\\ to be voiced as if\nit were \\Ren Pie is pronounced ren pie.\\\n\n```"], "config.tts_voice": ["config", "config.tts_voice", " = None", "", "var", "If not None, a string giving a non-default voice that is used to play back text-to-speech for self voicing. The possible choices are platform specific, and so this should be set in a platform-specific manner. (It may make sense to change this in translations, as well.)"], "config.variants": ["config", "config.variants", " = [ ... ]", "", "var", "A list of screen variants that are searched when choosing a screen to display to the user. This should always end with None, to ensure that the default screens are chosen. See :ref:`screen-variants`."], "config.version": ["config", "config.version", " = \"\"", "", "var", "This should be a string giving the version of the game. This is included as part of tracebacks and other log files, helping to identify the version of the game being used."], "config.voice_filename_format": ["config", "config.voice_filename_format", " = \"{filename}\"", "", "var", "A string that is formatted with the string argument to the voice statement to produce the filename that is played to the user. For example, if this is \\{filename}.ogg\\, the ``voice \\test\\`` statement will play test.ogg."], "config.web_input": ["config", "config.web_input", " = True", "", "var", "If True, the web platform will use the browser's input system to handle :func:`renpy.input`. If False, Ren'Py's own input system will be used. The browser's input system supports more languages, virtual keyboards, and other conveniences, but is not as customizable.\n\nThis may be changed at init time, and also in translate python blocks.\n\nTo only use the browser's input system on touchscreen devices, use\n```\ndefine config.web_input = renpy.variant(\\touch\\)\n\n```"], "config.web_video_base": ["config", "config.web_video_base", " = \"./game\"", "", "var", "When playing a movie in the web browser, this is a URL that is appended to to the movie filename to get the full URL to play the movie from. It can include directories in it, so \\https://share.renpy.org/movies-for-mygame\\ would also be fine.\n\nThis allows large movie files to be hosted on a different server than the rest of the game."], "config.web_video_prompt": ["config", "config.web_video_prompt", " = _(\"Touch to play the video.\")", "", "var", "On Mobile Safari on iOS, by default, the player will need to click to play a movie with sound. This variable gives the message that's used to prompt players to click."], "config.webaudio_required_types": ["config", "config.webaudio_required_types", " = [ \"audio/ogg\", \"audio/mpeg\", ... ]", "", "var", "When running on the web platform, Ren'Py will check the browser to see if it can play audio files of these mime types. If the browser can, it is used to play the files. If not, a slower and potentially skip prone wasm decoder is used.\n\nBy default, the browser's web audio system is used on Chrome and Firefox, and wasm is used on safari. If your game only uses mp3 audio, this can be changed using\n```\ndefine config.webaudio_required_types = [ \\audio/mpeg\\ ]\n\nTo used the faster web audio system on Safari as well.\n\n```"], "config.window": ["config", "config.window", " = None", "", "var", "This controls the default method of dialogue window management. If not None, this should be one of \\show\\, \\hide\\, or \\auto\\.\n\nWhen set to \\show\\, the dialogue window is shown at all times. When set to \\hide\\, the dialogue window is hidden when not in a say statement or other statement that displays dialogue. When set to \\auto\\, the dialogue window is hidden before scene statements, and shown again when dialogue is shown.\n\nThis sets the default. Once set, the default can be changed using the ``window show``, ``window hide`` and ``window auto`` statements. See :ref:`dialogue-window-management` for more information."], "config.window_auto_hide": ["config", "config.window_auto_hide", " = [ \"scene\", \"call screen\", \"menu\", \"say-centered\", \"say-bubble\", ... ]", "", "var", "A list of statements that cause ``window auto`` to hide the empty dialogue window."], "config.window_auto_show": ["config", "config.window_auto_show", " = [ 'say', 'menu-with-caption', ... ]", "", "var", "A list of statements that cause ``window auto`` to show the empty dialogue window."], "config.window_hide_transition": ["config", "config.window_hide_transition", " = None", "", "var", "The transition used by the window hide statement when no transition has been explicitly specified."], "config.window_icon": ["config", "config.window_icon", " = None", "", "var", "If not None, this is expected to be the filename of an image giving an icon that is used for the game's main window. This does not set the icon used by windows executables and mac apps, as those are controlled by :ref:`special-files`."], "config.window_show_transition": ["config", "config.window_show_transition", " = None", "", "var", "The transition used by the window show statement when no transition has been explicitly specified."], "config.window_title": ["config", "config.window_title", " = None", "", "var", "The static portion of the title of the window containing the Ren'Py game. :var:`_window_subtitle` is appended to this to get the full title of the window.\n\nIf None, the default, this defaults to the value of :var:`config.name`."], "config.with_callback": ["config", "config.with_callback", " = None", "", "var", "If not None, this should be a function that is called when a :ref:`with statement ` occurs. This function can be responsible for putting up transient things on the screen during the transition. The function is called with two arguments: the transition that is occurring, and the transition it is paired with. The latter is None except in the case of the implicit None transition produced by an inline with statement, in which case it is the inline transition that produced the with None. It is expected to return a transition, which may or may not be the transition supplied as its argument."]}, "renpy": {"renpy.Any": ["internal", "function", "()", "", "", "Special type indicating an unconstrained type.\n\n- Any is compatible with every type. - Any assumed to have all methods. - All values assumed to be instances of Any.\n\nNote that all the above statements are true from the point of view of static type checkers. At runtime, Any should not be used with instance or class checks."], "renpy.Backup": ["internal", "class", "(self)", "", "", "This represents a backup of all of the fields in the python modules comprising Ren'Py, shortly after they were imported.\n\nThis attempts to preserve object aliasing, but not object identity. If renpy.mod.a is renpy.mod.b before the restore, the same will be true after the restore - even though renpy.mod.a will have changed identity.\n\nInitialize self. See help(type(self)) for accurate signature."], "renpy.Container": ["internal", "class", "(*args, **properties)", "", "", "This is the base class for containers that can have one or more children.\n\n@ivar children: A list giving the children that have been added to this container, in the order that they were added in.\n\n@ivar child: The last child added to this container. This is also used to access the sole child in containers that can only hold one child.\n\n@ivar offsets: A list giving offsets for each of our children. It's expected that render will set this up each time it is called.\n\n@ivar sizes: A list giving sizes for each of our children. It's also expected that render will set this each time it is called.\n\nInitialize self. See help(type(self)) for accurate signature."], "renpy.Displayable": ["cdd", "renpy.Displayable", "", "", "class", "Base class for creator-defined displayables."], "renpy.IgnoreEvent": ["cdd", "renpy.IgnoreEvent", "", "", "exception", "This is an exception that, if raised, causes Ren'Py to ignore the event. To raise this inside the event method, write\n```\nraise renpy.IgnoreEvent()\n```"], "renpy.Keymap": ["internal", "class", "(replaces=None, activate_sound=None, capture=True, **keymap)", "", "", "This is a behavior that maps keys to actions that are called when the key is pressed. The keys are specified by giving the appropriate k_constant from pygame.constants, or the unicode for the key.\n\nInitialize self. See help(type(self)) for accurate signature."], "renpy.MenuEntry": ["internal", "class", "(*args, **kwargs)", "", "", "The object passed into the choice screen.\n\nInitialize self. See help(type(self)) for accurate signature."], "renpy.Render": ["cdd", "renpy.Render", "(width, height)", "", "class", "Creates a new Render object.\n\n`width`, `height` The width and height of the render object, in pixels."], "renpy.TagQuotingDict": ["internal", "class", "(*args, **kwargs)", "", "", "Initialize self. See help(type(self)) for accurate signature."], "renpy.VersionTuple": ["internal", "class", "(*args, **kwargs)", "", "", "VersionTuple(major, minor, patch, commit)\n\nInitialize self. See help(type(self)) for accurate signature."], "renpy.add_layer": ["internal", "function", "(layer, above=None, below=None, menu_clear=True, sticky=None)", "", "", "Adds a new layer to the screen. If the layer already exists, this function does nothing.\n\nOne of `behind` or `above` must be given.\n\n`layer` A string giving the name of the new layer to add.\n\n`above` If not None, a string giving the name of a layer the new layer will be placed above.\n\n`below` If not None, a string giving the name of a layer the new layer will be placed below.\n\n`menu_clear` If true, this layer will be cleared when entering the game menu context, and restored when leaving it.\n\n`sticky` If true, any tags added to this layer will have it become their default layer until they are hidden. If None, this layer will be sticky only if other sticky layers already exist."], "renpy.add_python_directory": ["internal", "function", "(path)", "", "", "Adds `path` to the list of paths searched for Python modules and packages. The path should be a string relative to the game directory. This must be called before an import statement."], "renpy.add_to_all_stores": ["internal", "function", "(name, value)", "", "", "Adds the `value` by the `name` to all creator defined namespaces. If the name already exist in that namespace - do nothing for it.\n\nThis function may only be run from inside an init block. It is an error to run this function once the game has started."], "renpy.backup": ["internal", "function", "()", "", "", "This represents a backup of all of the fields in the python modules comprising Ren'Py, shortly after they were imported.\n\nThis attempts to preserve object aliasing, but not object identity. If renpy.mod.a is renpy.mod.b before the restore, the same will be true after the restore - even though renpy.mod.a will have changed identity."], "renpy.basestring": ["internal", "function", "()", "", "", "Built-in immutable sequence.\n\nIf no argument is given, the constructor returns an empty tuple. If iterable is specified the tuple is initialized from iterable's items.\n\nIf the argument is a tuple, the return value is the same object."], "renpy.block_rollback": ["internal", "function", "()", "", "", "Prevents the game from rolling back to before the current statement."], "renpy.call": ["internal", "function", "(label, *args, from_current=False, **kwargs)", "", "", "Causes the current Ren'Py statement to terminate, and a jump to a `label` to occur. When the jump returns, control will be passed to the statement following the current statement.\n\n`from_current` If true, control will return to the current statement, rather than the statement following the current statement. (This will lead to the current statement being run twice. This must be passed as a keyword argument.)"], "renpy.call_in_new_context": ["internal", "function", "(label, *args, **kwargs)", "", "", "This creates a new context, and then starts executing Ren'Py script from the given label in that context. Rollback is disabled in the new context, and saving/loading will occur in the top level context.\n\nUse this to begin a second interaction with the user while inside an interaction."], "renpy.call_replay": ["internal", "function", "(label, scope={})", "", "", "Calls a label as a memory.\n\nKeyword arguments are used to set the initial values of variables in the memory context."], "renpy.call_screen": ["internal", "function", "(_screen_name, *args, _with_none=True, _mode=\"screen\", **kwargs)", "", "", "The programmatic equivalent of the call screen statement.\n\nThis shows `_screen_name` as a screen, then causes an interaction to occur. The screen is hidden at the end of the interaction, and the result of the interaction is returned.\n\nPositional arguments, and keyword arguments that do not begin with _ are passed to the screen.\n\nIf `_with_none` is false, \\with None\\ is not run at the end of end of the interaction.\n\nIf `_mode` is passed, it will be the mode of this interaction, otherwise the mode will be \\screen\\."], "renpy.call_stack_depth": ["internal", "function", "()", "", "", "Returns the depth of the call stack of the current context - the number of calls that have run without being returned from or popped from the call stack."], "renpy.can_load": ["internal", "function", "(filename, test=False)", "", "", "Returns true if `filename` exists as a save slot, and False otherwise."], "renpy.can_rollback": ["internal", "function", "()", "", "", "Returns true if we can rollback."], "renpy.can_show": ["internal", "function", "(name, layer=None, tag=None)", "", "", "Determines if `name` can be used to show an image. This interprets `name` as a tag and attributes. This is combined with the attributes of the currently-showing image with `tag` on `layer` to try to determine a unique image to show. If a unique image can be show, returns the name of that image as a tuple. Otherwise, returns None.\n\n`tag` The image tag to get attributes from. If not given, defaults to the first component of `name`.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.cancel_gesture": ["internal", "function", "()", "", "", "Cancels the current gesture, preventing the gesture from being recognized. This should be called by displayables that have gesture-like behavior."], "renpy.capture_focus": ["internal", "function", "(name='default')", "", "", "If a displayable is currently focused, captured the rectangular bounding box of that displayable, and stores it with `name`. If not, removes any focus stored with `name`.\n\nCaptured focuses are not saved when the game is saveed.\n\n`name` Should be a string. The name \\tooltip\\ is special, as it's automatically captured when a displayable with a tooltip gains focus."], "renpy.change_language": ["internal", "function", "(language, force=False)", "", "", "Changes the current language to `language`, which can be a string or None to use the default language."], "renpy.change_zorder": ["internal", "function", "(layer, tag, zorder)", "", "", "Changes the zorder of `tag` on `layer` to `zorder`."], "renpy.check_image_attributes": ["internal", "function", "(tag, attributes)", "", "", "Checks to see if there is a unique image with the given tag and attributes. If there is, returns the attributes in order. Otherwise, returns None."], "renpy.check_permission": ["internal", "function", "(permission)", "", "", "Checks to see if an Android permission has been granted to this application.\n\n`permission` A string giving the name of the permission, for example, \\android.permission.WRITE_EXTERNAL_STORAGE\\.\n\nReturns true if the permission has been granted, false if it has not or if called on a non-Android platform."], "renpy.check_text_tags": ["internal", "function", "(s)", "", "", "Checks the text tags in s for correctness. Returns an error string if there is an error, or None if there is no error."], "renpy.checkpoint": ["internal", "function", "(data=None, *, hard=True)", "", "", "Makes the current statement a checkpoint that the user can rollback to. Once this function has been called, there should be no more interaction with the user in the current statement.\n\nThis will also clear the current screenshot used by saved games.\n\n`data` This data is returned by :func:`renpy.roll_forward_info` when the game is being rolled back.\n\n`hard` If true, this is a hard checkpoint that rollback will stop at. If false, this is a soft checkpoint that will not stop rollback."], "renpy.choice_for_skipping": ["internal", "function", "()", "", "", "Tells Ren'Py that a choice is coming up soon. This currently has two effects:\n\n* If Ren'Py is skipping, and the Skip After Choices preferences is set to stop skipping, skipping is terminated.\n\n* An auto-save is triggered."], "renpy.chr": ["internal", "function", "()", "", "", "Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."], "renpy.clear_attributes": ["internal", "function", "(tag, layer=None)", "", "", "Clears all image attributes for the `tag` image. If the tag had no attached image attributes, this does nothing.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.clear_capture_focus": ["internal", "function", "(name='default')", "", "", "Clear the captured focus with `name`. If `name` is None, clear all captured focuses."], "renpy.clear_game_runtime": ["internal", "function", "()", "", "", "Resets the game runtime counter."], "renpy.clear_keymap_cache": ["internal", "function", "()", "", "", "Clears the keymap cache. This allows changes to :var:`config.keymap` to take effect without restarting Ren'Py."], "renpy.compat": ["internal", "function", "()", "", "", "This module is defined to allow us to program in Python 2 with a high degree of compatibility with Python 3, and vice versa. It's intended to be invoked with the following preamble\n```\nfrom __future__ import division, absolute_import, with_statement, print_function, unicode_literals\n from renpy.compat import *\n\nRight now, it does the following things:\n\n* Sets up aliases for Python 3 module moves, allowing the Python 3 names\n to be used in Python 2.\n\n* Defines PY2 in the current context, to make Python 2 conditional.\n\n* Aliases pickle to cPickle on Python 3, to support Python 2 code\n choosing between the implementations, where the choice is meaningful\n\n* Replaces open with a function that mimics the Python 3 behavior, of\n opening files in a unicode-friendly mode by default.\n\n* Redefines the text types, so that str is always the unicode type, and\n basestring is the list of string types available on the system.\n\n* Exposes bchr, bord, and tobytes from future.utils.\n\n* Changes the meaning of the .items(), .keys(), and .values() methods of\n dict to return views, rather than lists. (This is a fairly major change,\n and so is only available when with_statement and division are both\n imported.\n\n* Aliases xrange to range on Python 2.\n\n* Changes the behavior of TextIOWrapper.write so that bytes strings are promoted\n to unicode strings before being written.\n```"], "renpy.const": ["internal", "function", "(name)", "", "", "Declares a variable in the store to be constant.\n\nA variable is constant if nothing can change its value, or any value reached by indexing it or accessing its attributes. Variables must remain constant out of define, init, and translate python blocks.\n\n`name` A string giving the name of the variable to declare constant."], "renpy.context": ["internal", "function", "()", "", "", "Returns an object that is unique to the current context. The object is copied when entering a new context, but changes to the copy do not change the original.\n\nThe object is saved and participates in rollback."], "renpy.context_dynamic": ["internal", "function", "(*variables)", "", "", "This can be given one or more variable names as arguments. This makes the variables dynamically scoped to the current context. The variables will be reset to their original value when the call returns.\n\nAn example call is\n```\n$ renpy.context_dynamic(\\x\\, \\y\\, \\z\\)\n```"], "renpy.context_nesting_level": ["internal", "function", "()", "", "", "Returns the nesting level of the current context. This is 0 for the outermost context (the context that is saved, loaded, and rolled-back), and is non-zero in other contexts, such as menu and replay contexts."], "renpy.copy_images": ["internal", "function", "(old, new)", "", "", "Copies images beginning with one prefix to images beginning with another. For example\n```\nrenpy.copy_images(\\eileen\\, \\eileen2\\)\n\nwill create an image beginning with \\eileen2\\ for every image beginning\nwith \\eileen\\. If \\eileen happy\\ exists, \\eileen2 happy\\ will be\ncreated.\n\n`old`\n A space-separated string giving the components of the old image\n name.\n\n`new`\n A space-separated string giving the components of the new image\n name.\n```"], "renpy.copy_save": ["internal", "function", "(old, new)", "", "", "Copies the save at `old` to `new`. (Does nothing if `old` does not exist.)"], "renpy.count_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks in the game's original language."], "renpy.count_displayables_in_layer": ["internal", "function", "(layer)", "", "", "Returns how many displayables are in the supplied layer."], "renpy.count_newly_seen_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks the user has seen for the first time during this session."], "renpy.count_seen_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks the user has seen in any play-through of the current game."], "renpy.current_screen": ["internal", "function", "()", "", "", "Returns information about the screen currently being updated, rendered, or processed.\n\nSee :func:`get_screen` for documented fields on the returned object."], "renpy.curried_call_in_new_context": ["internal", "function", "()", "", "", "This creates a new context, and then starts executing Ren'Py script from the given label in that context. Rollback is disabled in the new context, and saving/loading will occur in the top level context.\n\nUse this to begin a second interaction with the user while inside an interaction."], "renpy.curried_invoke_in_new_context": ["internal", "function", "()", "", "", "This function creates a new context, and invokes the given Python callable (function) in that context. When the function returns or raises an exception, control returns to the the original context. It's generally used to call a Python function that needs to display information to the player (like a confirmation prompt) from inside an event handler.\n\nA context maintains the state of the display (including what screens and images are being shown) and the audio system. Both are restored when the context returns.\n\nAdditional arguments and keyword arguments are passed to the callable.\n\nA context created with this function cannot execute Ren'Py script. Functions that would change the flow of Ren'Py script, like :func:`renpy.jump`, are handled by the outer context. If you want to call Ren'Py script rather than a Python function, use :func:`renpy.call_in_new_context` instead."], "renpy.curry": ["internal", "function", "(fn)", "", "", "Takes a callable, and returns something that, when called, returns something that when called again, calls the function. So basically, the thing returned from here when called twice does the same thing as the function called once."], "renpy.diff_memory": ["internal", "function", "(update=True, skip_constants=False)", "", "", "Profiles objects, surface, and texture memory use by Ren'Py and the game. Writes (to memory.txt and stdout) the difference in memory usage from the last time this function was called with `update` true.\n\nThe accounting is by names in the store and in the Ren'Py implementation that the memory is reachable from. If an object is reachable from more than one name, it's assigned to the name it's most directly reachable from.\n\n`skip_constants` If True, the profiler will skip scanning of large Ren'Py's containers, that are intended to be immutable after startup.\n\nAs it has to scan all memory used by Ren'Py, this function may take a long time to complete."], "renpy.display_menu": ["internal", "function", "(items, *, interact=True, screen=\"choice\", **kwargs)", "", "", "This displays a menu to the user. `items` should be a list of 2-item tuples. In each tuple, the first item is a textual label, and the second item is the value to be returned if that item is selected. If the value is None, the first item is used as a menu caption.\n\nThis function takes many arguments, of which only a few are documented. Except for `items`, all arguments should be given as keyword arguments.\n\n`interact` If false, the menu is displayed, but no interaction is performed.\n\n`screen` The name of the screen used to display the menu.\n\nNote that most Ren'Py games do not use menu captions, but use narration instead. To display a menu using narration, write\n```\n$ narrator(\\Which direction would you like to go?\\, interact=False)\n $ result = renpy.display_menu([ (\\East\\, \\east\\), (\\West\\, \\west\\) ])\n```"], "renpy.display_notify": ["internal", "function", "(message)", "", "", "The default implementation of :func:`renpy.notify`."], "renpy.displayable": ["internal", "function", "(d, scope=None)", "", "", "This takes `d`, which may be a displayable object or a string. If it's a string, it converts that string into a displayable using the usual rules."], "renpy.dynamic": ["internal", "function", "(*variables, **kwargs)", "", "", "This can be given one or more variable names as arguments. This makes the variables dynamically scoped to the current call. When the call returns, the variables will be reset to the value they had when this function was called.\n\nIf the variables are given as keyword arguments, the value of the argument is assigned to the variable name.\n\nExample calls are\n```\n$ renpy.dynamic(\\x\\, \\y\\, \\z\\)\n $ renpy.dynamic(players=2, score=0)\n```"], "renpy.easy": ["internal", "function", "()", "", "", "Functions that make the user's life easier."], "renpy.end_interaction": ["internal", "function", "(value)", "", "", "If `value` is not None, immediately ends the current interaction, causing the interaction to return `value`. If `value` is None, does nothing.\n\nThis can be called from inside the render and event methods of a creator-defined displayable."], "renpy.end_replay": ["internal", "function", "()", "", "", "If we're in a replay, ends the replay immediately. Otherwise, does nothing."], "renpy.error": ["internal", "function", "(msg)", "", "", "Reports `msg`, a string, as as error for the user. This is logged as a parse or lint error when approprate, and otherwise it is raised as an exception."], "renpy.eval_who": ["internal", "function", "(who, fast=None)", "", "", "Evaluates the `who` parameter to a say statement."], "renpy.exists": ["internal", "function", "(filename)", "", "", "Returns true if the given filename can be found in the searchpath. This only works if a physical file exists on disk. It won't find the file if it's inside of an archive.\n\nYou almost certainly want to use :func:`renpy.loadable` in preference to this function."], "renpy.file": ["internal", "function", "(fn, encoding=None)", "", "", "An alias for :func:`renpy.open_file`, for compatibility with older versions of Ren'Py."], "renpy.filter_text_tags": ["internal", "function", "(s, allow=None, deny=None)", "", "", "Returns a copy of `s` with the text tags filtered. Exactly one of the `allow` and `deny` keyword arguments must be given.\n\n`allow` A set of tags that are allowed. If a tag is not in this list, it is removed.\n\n`deny` A set of tags that are denied. If a tag is not in this list, it is kept in the string."], "renpy.fix_rollback": ["internal", "function", "()", "", "", "Prevents the user from changing decisions made before the current statement."], "renpy.flush_cache_file": ["internal", "function", "(fn)", "", "", "This flushes all image cache entries that refer to the file `fn`. This may be called when an image file changes on disk to force Ren'Py to use the new version."], "renpy.fnmatch": ["internal", "function", "()", "", "", "Filename matching with shell patterns.\n\nfnmatch(FILENAME, PATTERN) matches according to the local convention. fnmatchcase(FILENAME, PATTERN) always takes case in account.\n\nThe functions operate by translating the pattern into a regular expression. They cache the compiled regular expressions for speed.\n\nThe function translate(PATTERN) returns a regular expression corresponding to PATTERN. (It does not compile it.)"], "renpy.focus_coordinates": ["internal", "function", "()", "", "", "This attempts to find the coordinates of the currently-focused displayable. If it can, it will return them as a (x, y, w, h) tuple. If not, it will return a (None, None, None, None) tuple."], "renpy.force_autosave": ["internal", "function", "(take_screenshot=False, block=False)", "", "", "Forces a background autosave to occur.\n\n`take_screenshot` If True, a new screenshot will be taken. If False, the existing screenshot will be used.\n\n`block` If True, blocks until the autosave completes."], "renpy.free_memory": ["internal", "function", "()", "", "", "Attempts to free some memory. Useful before running a renpygame-based minigame."], "renpy.fsdecode": ["internal", "function", "(s)", "", "", "Converts s from filesystem encoding to unicode."], "renpy.fsencode": ["internal", "function", "(s, force=False)", "", "", "Converts s from unicode to the filesystem encoding."], "renpy.full_restart": ["internal", "function", "(transition=False, *, save=False)", "", "", "Causes Ren'Py to restart, returning the user to the main menu.\n\n`transition` If given, the transition to run, or None to not run a transition. False uses :var:`config.end_game_transition`.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py restarts and returns the user to the main menu."], "renpy.get_adjustment": ["internal", "function", "(bar_value)", "", "", "Given `bar_value`, a :class:`BarValue`, returns the :func:`ui.adjustment` if uses. The adjustment has the following to attributes defined:\n\n.. attribute:: value\n\n The current value of the bar.\n\n.. attribute:: range\n\n The current range of the bar."], "renpy.get_all_labels": ["internal", "function", "()", "", "", "Returns the set of all labels defined in the program, including labels defined for internal use in the libraries."], "renpy.get_at_list": ["internal", "function", "(name, layer=None)", "", "", "Returns the list of transforms being applied to the image with tag `name` on `layer`. Returns an empty list if no transforms are being applied, or None if the image is not shown.\n\nIf `layer` is None, uses the default layer for the given tag."], "renpy.get_attributes": ["internal", "function", "(tag, layer=None, if_hidden=None)", "", "", "Return a tuple giving the image attributes for the image `tag`. If the image tag has not had any attributes associated since the last time it was hidden, returns `if_hidden`.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.get_autoreload": ["internal", "function", "()", "", "", "Gets the autoreload flag."], "renpy.get_available_image_tags": ["internal", "function", "()", "", "", "Returns a list of image tags that have been defined."], "renpy.get_displayable": ["internal", "function", "(screen, id, layer=None, base=False)", "", "", "From the `screen` on `layer`, returns the displayable with `id`. Returns None if the screen doesn't exist, or there is no widget with that id on the screen."], "renpy.get_displayable_properties": ["internal", "function", "(id, screen=None, layer=None)", "", "", "Returns the properties for the displayable with `id` in the `screen` on `layer`. If `screen` is None, returns the properties for the current screen. This can be used from Python or property code inside a screen.\n\nNote that this returns a dictionary containing the widget properties, and so to get an individual property, the dictionary must be accessed."], "renpy.get_filename_line": ["internal", "function", "()", "", "", "Returns a pair giving the filename and line number of the current statement."], "renpy.get_game_runtime": ["internal", "function", "()", "", "", "Returns the game runtime counter.\n\nThe game runtime counter counts the number of seconds that have elapsed while waiting for user input in the top-level context. (It does not count time spent in the main or game menus.)"], "renpy.get_hidden_tags": ["internal", "function", "(layer='master')", "", "", "Returns the set of image tags on `layer` that are currently hidden, but still have attribute information associated with them."], "renpy.get_identifier_checkpoints": ["internal", "function", "(identifier)", "", "", "Given a rollback_identifier from a HistoryEntry object, returns the number of checkpoints that need to be passed to :func:`renpy.rollback` to reach that identifier. Returns None of the identifier is not in the rollback history."], "renpy.get_image_bounds": ["internal", "function", "(tag, width=None, height=None, layer=None)", "", "", "If an image with `tag` exists on `layer`, returns the bounding box of that image. Returns None if the image is not found.\n\nThe bounding box is an (x, y, width, height) tuple. The components of the tuples are expressed in pixels, and may be floating point numbers.\n\n`width`, `height` The width and height of the area that contains the image. If None, defaults the width and height of the screen, respectively.\n\n`layer` If None, uses the default layer for `tag`."], "renpy.get_image_load_log": ["internal", "function", "(age=None)", "", "", "A generator that yields a log of image loading activity. For the last 100 image loads, this returns:\n\n* The time the image was loaded (in seconds since the epoch). * The filename of the image that was loaded. * A boolean that is true if the image was preloaded, and false if the game stalled to load it.\n\nThe entries are ordered from newest to oldest.\n\n`age` If not None, only images that have been loaded in the past `age` seconds are included.\n\nThe image load log is only kept if config.developer = True."], "renpy.get_menu_args": ["internal", "function", "()", "", "", "Returns a tuple giving the arguments (as a tuple) and the keyword arguments (as a dict) passed to the current menu statement."], "renpy.get_mode": ["internal", "function", "()", "", "", "Returns the current mode, or None if it is not defined."], "renpy.get_mouse_name": ["internal", "function", "(interaction=False)", "", "", "Returns the name of the mouse that should be shown.\n\n `interaction` If true, get a mouse name that is based on the type of interaction occuring. (This is rarely useful.)"], "renpy.get_mouse_pos": ["internal", "function", "()", "", "", "Returns an (x, y) tuple giving the location of the mouse pointer or the current touch location. If the device does not support a mouse and is not currently being touched, x and y are numbers, but not meaningful."], "renpy.get_on_battery": ["internal", "function", "()", "", "", "Returns True if Ren'Py is running on a device that is powered by an internal battery, or False if the device is being charged by some external source."], "renpy.get_ordered_image_attributes": ["internal", "function", "(tag, attributes=(), sort=None)", "", "", "Returns a list of image attributes, ordered in a way that makes sense to present to the user.\n\n`attributes` If present, only attributes that are compatible with the given attributes are considered. (Compatible means that the attributes can be in a single image at the same time.)\n\n`sort` If not None, the returned list of attributes is sorted. This is a one-argument function that should be used as a tiebreaker - see `this tutorial `_ for more information."], "renpy.get_physical_size": ["internal", "function", "()", "", "", "Returns the size of the physical window."], "renpy.get_placement": ["internal", "function", "(d)", "", "", "This gets the placement of displayable d. There's very little warranty on this information, as it might change when the displayable is rendered, and might not exist until the displayable is first rendered.\n\nThis returns an object with the following fields, each corresponding to a style property:\n\n* pos * xpos * ypos * anchor * xanchor * yanchor * offset * xoffset * yoffset * subpixel"], "renpy.get_refresh_rate": ["internal", "function", "(precision=5)", "", "", "Returns the refresh rate of the current screen, as a floating-point number of frames per second.\n\n`precision` The raw data Ren'Py gets is number of frames per second, rounded down. This means that a monitor that runs at 59.95 frames per second will be reported at 59 fps. The precision argument reduces the precision of this reading, such that the only valid readings are multiples of the precision.\n\n Since all monitor framerates tend to be multiples of 5 (25, 30, 60, 75, and 120), this likely will improve accuracy. Setting precision to 1 disables this."], "renpy.get_registered_image": ["internal", "function", "(name)", "", "", "If an image with the same name has been :ref:`registered `, returns it. Otherwise, returns None."], "renpy.get_renderer_info": ["internal", "function", "()", "", "", "Returns a dictionary, giving information about the renderer Ren'Py is currently using. Defined keys are:\n\n``\\renderer\\`` A string giving the name of the renderer that is in use.\n\n``\\resizable\\`` True if and only if the window is resizable.\n\n``\\additive\\`` True if and only if the renderer supports additive blending.\n\n``\\model\\`` Present and true if model-based rendering is supported.\n\nOther, renderer-specific, keys may also exist. The dictionary should be treated as immutable. This should only be called once the display has been started (that is, after the init phase has finished)."], "renpy.get_return_stack": ["internal", "function", "()", "", "", "Returns a list giving the current return stack. The return stack is a list of statement names.\n\nThe statement names will be strings (for labels), or opaque tuples (for non-label statements)."], "renpy.get_save_token_keys": ["internal", "function", "()", "", "", ":undocumented:\n\nReturns the list of save token keys."], "renpy.get_say_attributes": ["internal", "function", "()", "", "", "Gets the attributes associated with the current say statement, or None if no attributes are associated with this statement.\n\nThis is only valid when executing or predicting a say statement."], "renpy.get_say_image_tag": ["internal", "function", "()", "", "", "Returns the tag corresponding to the currently speaking character (the `image` argument given to that character). Returns None if no character is speaking or the current speaking character does not have a corresponding image tag."], "renpy.get_screen": ["internal", "function", "(name, layer=None)", "", "", "Returns information about the screen with the given `name` on `layer`. `name` is first interpreted as a tag name, and then as a screen name. If the screen is not showing, returns None.\n\nThis can also take a list of names, in which case the first screen that is showing is returned.\n\nThis function can be used to check whether a screen is showing::\n\n if renpy.get_screen(\\say\\): text \\The say screen is showing.\\ else: text \\The say screen is hidden.\\\n\nThe objects returned by this function have the following documented fields:\n\n.. attribute:: layer\n\n The layer the screen is being displayed on.\n\n.. attribute:: name\n\n The name of the screen.\n\n.. attribute:: zorder\n\n The zorder the screen is being displayed at."], "renpy.get_sdl_dll": ["internal", "function", "()", "", "", "This returns a ctypes.cdll object that refers to the library that contains the instance of SDL2 that Ren'Py is using.\n\nIf this can not be done, None is returned."], "renpy.get_sdl_window_pointer": ["internal", "function", "()", "", "", "Returns a pointer (of type ctypes.c_void_p) to the main window, or None if the main window is not displayed, or some other problem occurs."], "renpy.get_showing_tags": ["internal", "function", "(layer='master', sort=False)", "", "", "Returns the set of image tags that are currently being shown on `layer`. If sort is true, returns a list of the tags from back to front."], "renpy.get_side_image": ["internal", "function", "(prefix_tag, image_tag=None, not_showing=None, layer=None)", "", "", "This attempts to find an image to show as the side image.\n\nIt begins by determining a set of image attributes. If `image_tag` is given, it gets the image attributes from the tag. Otherwise, it gets them from the currently showing character. If no attributes are available for the tag, this returns None.\n\nIt then looks up an image with the tag `prefix_tag`, and the image tage (either from `image_tag` or the currently showing character) and the set of image attributes as attributes. If such an image exists, it's returned.\n\nIf not_showing is True, this only returns a side image if the image the attributes are taken from is not on the screen. If Nome, the value is taken from :var:`config.side_image_only_not_showing`.\n\nIf `layer` is None, uses the default layer for the currently showing tag."], "renpy.get_skipping": ["internal", "function", "()", "", "", "Returns \\slow\\ if the Ren'Py is skipping, \\fast\\ if Ren'Py is fast skipping, and None if it is not skipping."], "renpy.get_style_preference": ["internal", "function", "(preference)", "", "", "Returns a string giving the name of the selected alternative for the named style preference.\n\n`preference` A string giving the name of the style preference."], "renpy.get_transition": ["internal", "function", "(layer=None)", "", "", "Gets the transition for `layer`, or the entire scene if `layer` is None. This returns the transition that is queued up to run during the next interaction, or None if no such transition exists."], "renpy.get_translation_identifier": ["internal", "function", "()", "", "", "Returns the translation identifier for the current statement."], "renpy.get_windows_version": ["internal", "function", "()", "", "", "When called on windows, returns the windows version."], "renpy.get_zorder_list": ["internal", "function", "(layer)", "", "", "Returns a list of (tag, zorder) pairs for `layer`."], "renpy.has_image": ["internal", "function", "(name, exact=False)", "", "", "Return true if an image with `name` exists, and false if no such image exists.\n\n`name` Either a string giving an image name, or a tuple of strings giving the name components.\n\n`exact` Returns true if and only if an image with the exact name exists - parameterized matches are not included."], "renpy.has_label": ["internal", "function", "(name)", "", "", "Returns true if `name` is a valid label in the program, or false otherwise.\n\n`name` Should be a string to check for the existence of a label. It can also be an opaque tuple giving the name of a non-label statement."], "renpy.has_live2d": ["internal", "function", "()", "", "", "Returns True if Live2d is supported on the current platform, and False otherwise."], "renpy.has_screen": ["internal", "function", "(name)", "", "", "Returns true if a screen with the given name exists."], "renpy.hide": ["internal", "function", "(name, layer=None)", "", "", "Hides an image from a layer. The Python equivalent of the hide statement.\n\n`name` The name of the image to hide. Only the image tag is used, and any image with the tag is hidden (the precise name does not matter).\n\n`layer` The layer on which this function operates. If None, uses the default layer associated with the tag."], "renpy.hide_screen": ["internal", "function", "(tag, layer=None)", "", "", "The programmatic equivalent of the hide screen statement.\n\nHides the screen with `tag` on `layer`."], "renpy.iconify": ["internal", "function", "()", "", "", "Iconifies the game."], "renpy.image": ["internal", "function", "(name, d)", "", "", "Defines an image. This function is the Python equivalent of the image statement.\n\n`name` The name of the image to display, a string.\n\n`d` The displayable to associate with that image name.\n\nThis function may only be run from inside an init block. It is an error to run this function once the game has started."], "renpy.image_size": ["internal", "function", "(im)", "", "", "Given an image manipulator, loads it and returns a (``width``, ``height``) tuple giving its size.\n\nThis reads the image in from disk and decompresses it, without using the image cache. This can be slow."], "renpy.in_fixed_rollback": ["internal", "function", "()", "", "", "Returns true if rollback is currently occurring and the current context is before an executed renpy.fix_rollback() statement."], "renpy.in_rollback": ["internal", "function", "()", "", "", "Returns true if the game has been rolled back."], "renpy.include_module": ["internal", "function", "(name)", "", "", "Similar to :func:`renpy.load_module`, but instead of loading the module right away, inserts it into the init queue somewhere after the current AST node.\n\nThe module may not contain init blocks lower than the block that includes the module. For example, if your module contains an init 10 block, the latest you can load it is init 10.\n\nModule loading may only occur from inside an init block."], "renpy.input": ["internal", "function", "(prompt, default='', allow=None, exclude='{}', length=None, with_none=None, pixel_width=None, screen='input', mask=None, copypaste=True, multiline=False, **kwargs)", "", "", "Calling this function pops up a window asking the player to enter some text. It returns the entered text.\n\n`prompt` A string giving a prompt to display to the player.\n\n`default` A string giving the initial text that will be edited by the player.\n\n`allow` If not None, a string giving a list of characters that will be allowed in the text.\n\n`exclude` If not None, if a character is present in this string, it is not allowed in the text.\n\n`length` If not None, this must be an integer giving the maximum length of the input string.\n\n`pixel_width` If not None, the input is limited to being this many pixels wide, in the font used by the input to display text.\n\n`screen` The name of the screen that takes input. If not given, the ``input`` screen is used.\n\n`mask` If not None, a single-character string that replaces the input text that is shown to the player, such as to conceal a password.\n\n`copypaste` When true, copying from and pasting to this input is allowed.\n\n`multiline` When true, move caret to next line is allowed.\n\nIf :var:`config.disable_input` is True, this function only returns `default`.\n\nKeywords prefixed with ``show_`` have the prefix stripped and are passed to the screen.\n\nDue to limitations in supporting libraries, on Android and the web platform this function is limited to alphabetic characters."], "renpy.invoke_in_new_context": ["internal", "function", "(callable, *args, **kwargs)", "", "", "This function creates a new context, and invokes the given Python callable (function) in that context. When the function returns or raises an exception, control returns to the the original context. It's generally used to call a Python function that needs to display information to the player (like a confirmation prompt) from inside an event handler.\n\nA context maintains the state of the display (including what screens and images are being shown) and the audio system. Both are restored when the context returns.\n\nAdditional arguments and keyword arguments are passed to the callable.\n\nA context created with this function cannot execute Ren'Py script. Functions that would change the flow of Ren'Py script, like :func:`renpy.jump`, are handled by the outer context. If you want to call Ren'Py script rather than a Python function, use :func:`renpy.call_in_new_context` instead."], "renpy.invoke_in_thread": ["internal", "function", "(fn, *args, **kwargs)", "", "", "Invokes the function `fn` in a background thread, passing it the provided arguments and keyword arguments. Restarts the interaction once the thread returns.\n\nThis function creates a daemon thread, which will be automatically stopped when Ren'Py is shutting down.\n\nThis thread is very limited in what it can do with the Ren'Py API. Changing store variables is allowed, as is calling the :func:`renpy.queue_event` function. Most other portions of the Ren'Py API are expected to be called from the main thread.\n\nThe primary use of this function is to place accesss to a web API in a second thread, and then update variables with the results of that call, by storing the result in variables and then relying on the interaction restart to cause screens to display those variables.\n\nThis does not work on the web platform, except for immediately returning without an error."], "renpy.io": ["internal", "function", "()", "", "", "The io module provides the Python interfaces to stream handling. The builtin open function is defined in this module.\n\nAt the top of the I/O hierarchy is the abstract base class IOBase. It defines the basic interface to a stream. Note, however, that there is no separation between reading and writing to streams; implementations are allowed to raise an OSError if they do not support a given operation.\n\nExtending IOBase is RawIOBase which deals simply with the reading and writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide an interface to OS files.\n\nBufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer streams that are readable, writable, and both respectively. BufferedRandom provides a buffered interface to random access streams. BytesIO is a simple stream of in-memory bytes.\n\nAnother IOBase subclass, TextIOBase, deals with the encoding and decoding of streams into text. TextIOWrapper, which extends it, is a buffered text interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO is an in-memory stream for text.\n\nArgument names are not part of the specification, and only the arguments of open() are intended to be used as keyword arguments.\n\ndata:\n\nDEFAULT_BUFFER_SIZE\n\n An int containing the default buffer size used by the module's buffered I/O classes. open() uses the file's blksize (as obtained by os.stat) if possible."], "renpy.is_init_phase": ["internal", "function", "()", "", "", "Returns True if Ren'Py is currently executing init code, or False otherwise."], "renpy.is_mouse_visible": ["internal", "function", "()", "", "", "Returns True if the mouse cursor is visible, False otherwise."], "renpy.is_pixel_opaque": ["internal", "function", "(d, width, height, st, at, x, y)", "", "", "Returns whether the pixel at (x, y) is opaque when this displayable is rendered by ``renpy.render(d, width, height, st, at)``."], "renpy.is_seen": ["internal", "function", "(ever=True)", "", "", "Returns true if the current line has been seen by the player.\n\nIf `ever` is true, we check to see if the line has ever been seen by the player. If false, we check if the line has been seen in the current play-through."], "renpy.is_selected": ["internal", "function", "(action)", "", "", "Returns a true value if the provided action or list of actions indicates it is selected, and false otherwise."], "renpy.is_sensitive": ["internal", "function", "(action)", "", "", "Returns a true value if the provided action or list of actions indicates it is sensitive, and false otherwise."], "renpy.is_skipping": ["internal", "function", "()", "", "", "Returns True if Ren'Py is currently skipping (in fast or slow skip mode), or False otherwise."], "renpy.is_start_interact": ["internal", "function", "()", "", "", "Returns true if restart_interaction has not been called during the current interaction. This can be used to determine if the interaction is just being started, or has been restarted."], "renpy.jump": ["internal", "function", "(label)", "", "", "Causes the current statement to end, and control to jump to the given label."], "renpy.jump_out_of_context": ["internal", "function", "(label)", "", "", "Causes control to leave the current context, and then to be transferred in the parent context to the given label."], "renpy.known_languages": ["internal", "function", "()", "", "", "Returns the set of known languages. This does not include the default language, None."], "renpy.language_tailor": ["internal", "function", "()", "", "", "language_tailor(chars, cls)\n\n This can be used to override the line breaking class of a unicode character. For example, the linebreaking class of a character can be set to ID to treat it as an ideograph, which allows breaks before and after that character.\n\n`chars` A string containing each of the characters to tailor.\n\n`cls` A string giving a character class. This should be one of the classes defined in Table 1 of `UAX #14: Unicode Line Breaking Algorithm `_."], "renpy.launch_editor": ["internal", "function", "(filenames, line=1, transient=False)", "", "", "Causes the editor to be launched."], "renpy.lint": ["internal", "function", "()", "", "", "The master lint function, that's responsible for staging all of the other checks."], "renpy.list_files": ["internal", "function", "(common=False)", "", "", "Lists the files in the game directory and archive files. Returns a list of files, with / as the directory separator.\n\n`common` If true, files in the common directory are included in the listing."], "renpy.list_images": ["internal", "function", "()", "", "", "Returns a list of images that have been added to Ren'Py, as a list of strings with spaces between the name components."], "renpy.list_saved_games": ["internal", "function", "(regexp='.', fast=False)", "", "", "Lists the save games. For each save game, returns a tuple containing:\n\n* The filename of the save. * The extra_info that was passed in. * A displayable that, when displayed, shows the screenshot that was used when saving the game. * The time the game was stayed at, in seconds since the UNIX epoch.\n\n`regexp` A regular expression that is matched against the start of the filename to filter the list.\n\n`fast` If fast is true, the filename is returned instead of the tuple."], "renpy.list_slots": ["internal", "function", "(regexp=None)", "", "", "Returns a list of non-empty save slots. If `regexp` exists, only slots that begin with `regexp` are returned. The slots are sorted in string-order."], "renpy.load": ["internal", "function", "(filename)", "", "", "Loads the game state from the save slot `filename`. If the file is loaded successfully, this function never returns."], "renpy.load_image": ["internal", "function", "(im)", "", "", "Loads the image manipulator `im` using the image cache, and returns a render."], "renpy.load_module": ["internal", "function", "(name)", "", "", "This loads the Ren'Py module named name. A Ren'Py module consists of Ren'Py script that is loaded into the usual (store) namespace, contained in a file named name.rpym or name.rpymc. If a .rpym file exists, and is newer than the corresponding .rpymc file, it is loaded and a new .rpymc file is created.\n\nAll of the init blocks (and other init-phase code) in the module are run before this function returns. An error is raised if the module name cannot be found, or is ambiguous.\n\nModule loading may only occur from inside an init block."], "renpy.load_rgba": ["internal", "function", "(data, size)", "", "", "Loads the image data `bytes` into a texture of size `size`, and return it.\n\n`data` Should be a bytes object containing the image data in RGBA8888 order."], "renpy.load_string": ["internal", "function", "(s, filename='NotSet')", "", "", "Loads `s` as Ren'Py script that can be called.\n\nReturns the name of the first statement in s.\n\n`filename` is the name of the filename that statements in the string will appear to be from."], "renpy.load_surface": ["internal", "function", "(im)", "", "", "Loads the image manipulator `im` using the image cache, and returns a pygame Surface."], "renpy.loadable": ["internal", "function", "(filename, directory=None)", "", "", "Returns True if the given filename is loadable, meaning that it can be loaded from the disk or from inside an archive. Returns False if this is not the case.\n\n`directory` If not None, a directory to search in if the file is not found in the game directory. This will be prepended to filename, and the search tried again."], "renpy.log": ["internal", "function", "(msg)", "", "", "If :var:`config.log` is not set, this does nothing. Otherwise, it opens the logfile (if not already open), formats the message to :var:`config.log_width` columns, and prints it to the logfile."], "renpy.map_event": ["internal", "function", "(ev, keysym)", "", "", "Returns true if the pygame event `ev` matches `keysym`\n\n`keysym` One of:\n\n * The name of a keybinding in :var:`config.keymap`. * A keysym, as documented in the :ref:`keymap` section. * A list containing one or more keysyms."], "renpy.mark_audio_seen": ["internal", "function", "(filename)", "", "", "Marks the given filename as if it has been already played on the current user's system."], "renpy.mark_audio_unseen": ["internal", "function", "(filename)", "", "", "Marks the given filename as if it has not been played on the current user's system yet."], "renpy.mark_image_seen": ["internal", "function", "(name)", "", "", "Marks the named image as if it has been already displayed on the current user's system."], "renpy.mark_image_unseen": ["internal", "function", "(name)", "", "", "Marks the named image as if it has not been displayed on the current user's system yet."], "renpy.mark_label_seen": ["internal", "function", "(label)", "", "", "Marks the named label as if it has been already executed on the current user's system."], "renpy.mark_label_unseen": ["internal", "function", "(label)", "", "", "Marks the named label as if it has not been executed on the current user's system yet."], "renpy.maximum_framerate": ["internal", "function", "(t)", "", "", "Forces Ren'Py to draw the screen at the maximum framerate for `t` seconds. If `t` is None, cancels the maximum framerate request."], "renpy.mode": ["internal", "function", "(mode)", "", "", "Causes Ren'Py to enter the named mode, or stay in that mode if it's already in it."], "renpy.movie_cutscene": ["internal", "function", "(filename, delay=None, loops=0, stop_music=True)", "", "", "This displays a movie cutscene for the specified number of seconds. The user can click to interrupt the cutscene. Overlays and Underlays are disabled for the duration of the cutscene.\n\n`filename` The name of a file containing any movie playable by Ren'Py.\n\n`delay` The number of seconds to wait before ending the cutscene. Normally the length of the movie, in seconds. If None, then the delay is computed from the number of loops (that is, loops + 1) * the length of the movie. If -1, we wait until the user clicks.\n\n`loops` The number of extra loops to show, -1 to loop forever.\n\nReturns True if the movie was terminated by the user, or False if the given delay elapsed uninterrupted."], "renpy.movie_start_displayable": ["internal", "function", "(filename, size=None, loops=0)", "", "", "This starts a movie playing."], "renpy.movie_start_fullscreen": ["internal", "function", "(filename, size=None, loops=0)", "", "", "This starts a movie playing."], "renpy.movie_stop": ["internal", "function", "(clear=True, only_fullscreen=False)", "", "", "Stops the currently playing movie."], "renpy.music": ["basefile", "", "", "", "", "Most renpy.music functions have aliases in renpy.sound. These functions are similar, except they default to the sound channel rather than the music channel, and default to not looping."], "renpy.music_start": ["internal", "function", "(filename, loops=True, fadeout=None, fadein=0)", "", "", "Deprecated music start function, retained for compatibility. Use renpy.music.play() or .queue() instead."], "renpy.music_stop": ["internal", "function", "(fadeout=None)", "", "", "Deprecated music stop function, retained for compatibility. Use renpy.music.stop() instead."], "renpy.namedtuple": ["internal", "function", "(typename, field_names, *, rename=False, defaults=None, module=None)", "", "", "Returns a new subclass of tuple with named fields.\n\n>>> Point = namedtuple('Point', ['x', 'y']) >>> Point.__doc__ # docstring for the new class 'Point(x, y)' >>> p = Point(11, y=22) # instantiate with positional args or keywords >>> p[0] + p[1] # indexable like a plain tuple 33 >>> x, y = p # unpack like a regular tuple >>> x, y (11, 22) >>> p.x + p.y # fields also accessible by name 33 >>> d = p._asdict() # convert to a dictionary >>> d['x'] 11 >>> Point(**d) # convert from a dictionary Point(x=11, y=22) >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields Point(x=100, y=22)"], "renpy.newest_slot": ["internal", "function", "(regexp=None)", "", "", "Returns the name of the newest save slot (the save slot with the most recent modification time), or None if there are no (matching) saves.\n\nIf `regexp` exists, only slots that begin with `regexp` are returned."], "renpy.not_const": ["internal", "function", "(name)", "", "", "Declares a name in the store to be not constant.\n\nThis undoes the effect of calls to :func:`renpy.const` and :func:`renpy.pure`.\n\n`name` The name to declare not constant."], "renpy.not_infinite_loop": ["internal", "function", "(delay)", "", "", "Resets the infinite loop detection timer to `delay` seconds."], "renpy.notify": ["internal", "function", "(message)", "", "", "Causes Ren'Py to display the `message` using the notify screen. By default, this will cause the message to be dissolved in, displayed for two seconds, and dissolved out again.\n\nThis is useful for actions that otherwise wouldn't produce feedback, like screenshots or quicksaves.\n\nOnly one notification is displayed at a time. If a second notification is displayed, the first notification is replaced.\n\nThis function just calls :var:`config.notify`, allowing its implementation to be replaced by assigning a new function to that variable."], "renpy.open_file": ["internal", "function", "(fn, encoding=None, directory=None)", "", "", "Returns a read-only file-like object that accesses the file named `fn`. The file is accessed using Ren'Py's standard search method, and may reside in the game directory, in an RPA archive, or as an Android asset.\n\nThe object supports a wide subset of the fields and methods found on Python's standard file object, opened in binary mode. (Basically, all of the methods that are sensible for a read-only file.)\n\n`encoding` If given, the file is open in text mode with the given encoding. If None, the default, the encoding is taken from :var:`config.open_file_encoding`. If False, the file is opened in binary mode.\n\n`directory` If not None, a directory to search in if the file is not found in the game directory. This will be prepended to filename, and the search tried again."], "renpy.partial": ["internal", "function", "(function, *args, **kwargs)", "", "", "Stores the arguments and keyword arguments of function, and returns something that, when called, calls the function with a combination of the supplied arguments and the arguments of the second call."], "renpy.pause": ["internal", "function", "(delay=None, *, hard=False, predict=False, modal=None)", "", "", "Causes Ren'Py to pause. Returns true if the user clicked to end the pause, or false if the pause timed out or was skipped.\n\n`delay` If given, the number of seconds Ren'Py should pause for.\n\nThe following should be given as keyword arguments:\n\n`hard` This must be given as a keyword argument. When True, Ren'Py may prevent the user from clicking to interrupt the pause. If the player enables skipping, the hard pause will be skipped. There may be other circumstances where the hard pause ends early or prevents Ren'Py from operating properly, these will not be treated as bugs.\n\n In general, using hard pauses is rude. When the user clicks to advance the game, it's an explicit request - the user wishes the game to advance. To override that request is to assume you understand what the player wants more than the player does.\n\n Calling renpy.pause guarantees that whatever is on the screen will be displayed for at least one frame, and hence has been shown to the player.\n\n tl;dr - Don't use renpy.pause with hard=True.\n\n`predict` If True, Ren'Py will end the pause when all prediction, including prediction scheduled with :func:`renpy.start_predict` and :func:`renpy.start_predict_screen`, has been finished.\n\n This also causes Ren'Py to prioritize prediction over display smoothness for the duration of the pause. Because of that, it's recommended to not display animations during prediction.\n\n`modal` If True or None, the pause will not end when a modal screen is being displayed. If False, the pause will end while a modal screen is being displayed."], "renpy.placement": ["internal", "class", "(p)", "", "", "Initialize self. See help(type(self)) for accurate signature."], "renpy.play": ["internal", "function", "(filename, channel=None, **kwargs)", "", "", "Plays a sound effect. If `channel` is None, it defaults to :var:`config.play_channel`. This is used to play sounds defined in styles, :propref:`hover_sound` and :propref:`activate_sound`."], "renpy.pop_call": ["internal", "function", "()", "", "", "Pops the current call from the call stack, without returning to the location.\n\nThis can be used if a label that is called decides not to return to its caller."], "renpy.post_import": ["internal", "function", "()", "", "", "This is called after import or reload, to do further initialization of various modules."], "renpy.predict": ["internal", "function", "(self)", "", "", "This is called to predictively load images from this node. It should cause renpy.display.predict.displayable and renpy.display.predict.screen to be called as necessary."], "renpy.predict_screen": ["internal", "function", "(_screen_name, *args, **kwargs)", "", "", "Called to predict that the named screen is about to be shown with the given arguments."], "renpy.predict_show_display_say": ["internal", "function", "(who, what, who_args, what_args, window_args, image=False, two_window=False, side_image=None, screen=None, properties=None, **kwargs)", "", "", "This is the default function used by Character to predict images that will be used by show_display_say. It's called with more-or-less the same parameters as show_display_say, and it's expected to return a list of images used by show_display_say."], "renpy.predicting": ["internal", "function", "()", "", "", "Returns true if Ren'Py is currently in a predicting phase."], "renpy.profile_memory": ["internal", "function", "(fraction=1.0, minimum=0, skip_constants=False)", "", "", "Profiles object, surface, and texture memory use by Ren'Py and the game. Writes an accounting of memory use by to the memory.txt file and stdout.\n\nThe accounting is by names in the store and in the Ren'Py implementation that the memory is reachable from. If an object is reachable from more than one name, it's assigned to the name it's most directly reachable from.\n\n`fraction` The fraction of the total memory usage to show. 1.0 will show all memory usage, .9 will show the top 90%.\n\n`minimum` If a name is accounted less than `minimum` bytes of memory, it will not be printed.\n\n`skip_constants` If True, the profiler will skip scanning of large Ren'Py's containers, that are intended to be immutable after startup.\n\nAs it has to scan all memory used by Ren'Py, this function may take a long time to complete."], "renpy.profile_rollback": ["internal", "function", "()", "", "", "Profiles memory used by the rollback system. Writes (to memory.txt and stdout) the memory used by the rollback system. This tries to account for rollback memory used by various store variables, as well as by internal aspects of the rollback system."], "renpy.profile_screen": ["internal", "class", "(name, predict=False, show=False, update=False, request=False, time=False, debug=False, const=False)", "", "", "Requests screen profiling for the screen named `name`, which must be a string.\n\nApart from `name`, all arguments must be supplied as keyword arguments. This function takes three groups of arguments.\n\n The first group of arguments determines when profiling occurs.\n\n`predict` If true, profiling occurs when the screen is being predicted.\n\n`show` If true, profiling occurs when the screen is first shown.\n\n`update` If true, profiling occurs when the screen is updated.\n\n`request` If true, profiling occurs when requested by pressing F8.\n\nThe second group of arguments controls what profiling output is produced when profiling occurs.\n\n`time` If true, Ren'Py will log the amount of time it takes to evaluate the screen.\n\n`debug` If true, Ren'Py will log information as to how screens are evaluated, including:\n\n * Which displayables Ren'Py considers constant. * Which arguments, if any, needed to be evaluated. * Which displayables were reused.\n\n Producing and saving this debug information takes a noticeable amount of time, and so the `time` output should not be considered reliable if `debug` is set.\n\nThe last group of arguments controls what output is produced once per Ren'Py run.\n\n`const` Displays the variables in the screen that are marked as const and not-const.\n\nAll profiling output will be logged to profile_screen.txt in the game directory."], "renpy.pure": ["internal", "function", "(fn)", "", "", "Declares a function as pure. A pure function must always return the same value when it is called with the same arguments, outside of define, init, and translate python blocks.\n\n`fn` The name of the function to declare pure. This may either be a string containing the name of the function, or the function itself. If a string is passed and the function is inside a module, this string should contain the module name with the dot.\n\nReturns `fn`, allowing this function to be used as a decorator."], "renpy.queue_event": ["internal", "function", "(name, up=False, **kwargs)", "", "", "Queues an event with the given name. `Name` should be one of the event names in :var:`config.keymap`, or a list of such names.\n\n`up` This should be false when the event begins (for example, when a keyboard button is pressed.) It should be true when the event ends (when the button is released.)\n\nThe event is queued at the time this function is called. This function will not work to replace an event with another - doing so will change event order. (Use :var:`config.keymap` instead.)\n\nThis method is threadsafe."], "renpy.quit": ["internal", "function", "(relaunch=False, status=0, save=False)", "", "", "This causes Ren'Py to exit entirely.\n\n`relaunch` If true, Ren'Py will run a second copy of itself before quitting.\n\n`status` The status code Ren'Py will return to the operating system. Generally, 0 is success, and positive integers are failure.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py terminates."], "renpy.quit_event": ["internal", "function", "()", "", "", "Triggers a quit event, as if the player clicked the quit button in the window chrome."], "renpy.random": ["internal", "function", "()", "", "", "This is renpy.random."], "renpy.redraw": ["cdd", "renpy.redraw", "(d, when)", "", "function", "Causes the displayable `d` to be redrawn (the render method called) when `when` seconds have elapsed. The displayable may be redrawn before that time (for example, when a child is redrawn), in which case a pending redraw is forgotten."], "renpy.register_bmfont": ["internal", "function", "(name=None, size=None, bold=False, italics=False, underline=False, filename=None)", "", "", "This registers a BMFont with the given details. Please note that size, bold, italic, and underline are all advisory (used for matching), and do not change the appearance of the font.\n\nPlease see the `BMFont home page `_ for the tool that creates BMFonts. Ren'Py expects that the filename parameter will be to a file in the BMFont text format, that describes a 32-bit font. The Alpha channel should contain the font information, while the Red, Green, and Blue channels should be set to one. The image files, kerning, and other control information is read out of the BMFont file.\n\nWe recommend including Latin and General Punctuation as part of your BMFont, to ensure all of the Ren'Py interface can render.\n\n`name` The name of the font being registered, a string.\n\n`size` The size of the font being registered, an integer.\n\n`bold` The boldness of the font being registered, a boolean.\n\n`italics` The italicness of the font being registered, a boolean.\n\n`underline` An ignored parameter.\n\n`filename` The file containing BMFont control information."], "renpy.register_mudgefont": ["internal", "function", "(name=None, size=None, bold=False, italics=False, underline=False, filename=None, xml=None, spacewidth=10, default_kern=0, kerns={})", "", "", "This registers a MudgeFont with the given details. Please note that size, bold, italic, and underline are all advisory (used for matching), and do not change the appearance of the font.\n\nPlease see the `MudgeFont home page `_ for the tool that creates MudgeFonts. Ren'Py assumes that character codes found in the MudgeFont xml file are unicode character numbers, and ignores negative character codes.\n\n`name` The name of the font being registered, a string.\n\n`size` The size of the font being registered, an integer.\n\n`bold` The boldness of the font being registered, a boolean.\n\n`italics` The italicness of the font being registered, a boolean.\n\n`underline` An ignored parameter.\n\n`filename` The file containing the MudgeFont image, a string. The image is usually a TGA file, but could be a PNG or other format that Ren'Py supports.\n\n`xml` The xml file containing information generated by the MudgeFont tool.\n\n`spacewidth` The width of a space character, an integer in pixels.\n\n`default_kern` The default kern spacing between characters, in pixels.\n\n`kerns` A map from two-character strings to the kern that should be used between those characters."], "renpy.register_persistent": ["internal", "function", "(field, func)", "", "", "Registers a function that is used to merge values of a persistent field loaded from disk with values of current persistent object.\n\n`field` The name of a field on the persistent object.\n\n`function` A function that is called with three parameters, `old`, `new`, and `current`:\n\n `old` The value of the field in the older object.\n\n `new` The value of the field in the newer object.\n\n `current` The value of the field in the current persistent object. This is provided for cases where the identity of the object referred to by the field can't change.\n\n The function is expected to return the new value of the field in the persistent object."], "renpy.register_sfont": ["internal", "function", "(name=None, size=None, bold=False, italics=False, underline=False, filename=None, spacewidth=10, baseline=None, default_kern=0, kerns={}, charset='!\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~')", "", "", "This registers an SFont with the given details. Please note that size, bold, italic, and underline are all advisory (used for matching), and do not change the appearance of the font.\n\n`More information about SFont. `_\n\n`name` The name of the font being registered, a string.\n\n`size` The size of the font being registered, an integer.\n\n`bold` The boldness of the font being registered, a boolean.\n\n`italics` The italicness of the font being registered, a boolean.\n\n`underline` An ignored parameter.\n\n`filename` The file containing the sfont image, a string.\n\n`spacewidth` The width of a space character, an integer in pixels.\n\n`baseline` The distance from the top of the font to the baseline (the invisible line letters sit on), an integer in pixels. If this font is mixed with other fonts, their baselines will be aligned. Negative values indicate distance from the bottom of the font instead, and ``None`` means the baseline equals the height (i.e., is at the very bottom of the font).\n\n`default_kern` The default kern spacing between characters, in pixels.\n\n`kerns` A map from two-character strings to the kern that should be used between those characters.\n\n`charset` The character set of the font. A string containing characters in the order in which they are found in the image. The default character set for a SFont is\n\n.. code-block\n```\nnone\n\n ! \\ # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?\n @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _\n ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~\n```"], "renpy.register_shader": ["internal", "function", "(name, **kwargs)", "", "", "This registers a shader part. This takes `name`, and then keyword arguments.\n\n`name` A string giving the name of the shader part. Names starting with an underscore or \\renpy.\\ are reserved for Ren'Py.\n\n`variables` The variables used by the shader part. These should be listed one per line, a storage (uniform, attribute, or varying) followed by a type, name, and semicolon. For example\n```\nvariables='''\n uniform sampler2D tex0;\n attribute vec2 a_tex_coord;\n varying vec2 v_tex_coord;\n '''\n\n`vertex_functions`\n If given, a string containing functions that will be included in the\n vertex shader.\n\n`fragment_functions`\n If given, a string containing functions that will be included in the\n fragment shader.\n\nOther keyword arguments should start with ``vertex_`` or ``fragment_``,\nand end with an integer priority. So \\fragment_200\\ or \\vertex_300\\. These\ngive text that's placed in the appropriate shader at the given priority,\nwith lower priority numbers inserted before higher priority numbers.\n```"], "renpy.register_sl_displayable": ["internal", "class", "(name, displayable, style, nchildren=0, scope=False, *, replaces=False, default_keywords={}, default_properties=True, unique=False)", "", "", "Registers a screen language statement that creates a displayable.\n\n`name` The name of the screen language statement, a string containing a Ren'Py keyword. This keyword is used to introduce the new statement.\n\n`displayable` This is a function that, when called, returns a displayable object. All position arguments, properties, and style properties are passed as arguments to this function. Other keyword arguments are also given to this function, a described below.\n\n This must return a Displayable. If it returns multiple displayables, the _main attribute of the outermost displayable should be set to the \\main\\ displayable - the one that children should be added to.\n\n`style` The base name of the style of this displayable. If the style property is not given, this will have the style prefix added to it. The computed style is passed to the `displayable` function as the ``style`` keyword argument.\n\n`nchildren` The number of children of this displayable. One of:\n\n 0 The displayable takes no children. 1 The displayable takes 1 child. If more than one child is given, the children are placed in a Fixed. \\many\\ The displayable takes more than one child.\n\n `unique` This should be set to true if the function returns a displayable with no other references to it.\n\nThe following arguments should be passed in using keyword arguments:\n\n`replaces` If true, and the displayable replaces a prior displayable, that displayable is passed as a parameter to the new displayable.\n\n`default_keywords` The default set of keyword arguments to supply to the displayable.\n\n`default_properties` If true, the ui and position properties are added by default.\n\nReturns an object that can have positional arguments and properties added to it by calling the following methods. Each of these methods returns the object it is called on, allowing methods to be chained together.\n\n.. method:: add_positional(name)\n\n Adds a positional argument with `name`\n\n.. method:: add_property(name)\n\n Adds a property with `name`. Properties are passed as keyword arguments.\n\n.. method:: add_style_property(name)\n\n Adds a family of properties, ending with `name` and prefixed with the various style property prefixes. For example, if called with (\\size\\), this will define size, idle_size, hover_size, etc.\n\n.. method:: add_prefix_style_property(prefix, name)\n\n Adds a family of properties with names consisting of `prefix`, a style property prefix, and `name`. For example, if called with a prefix of `text_` and a name of `size`, this will create text_size, text_idle_size, text_hover_size, etc.\n\n.. method:: add_property_group(group, prefix='')\n\n Adds a group of properties, prefixed with `prefix`. `Group` may be one of the strings:\n\n * \\bar\\ * \\box\\ * \\button\\ * \\position\\ * \\text\\ * \\window\\\n\n These correspond to groups of :doc:`style_properties`. Group can also be \\ui\\, in which case it adds the :ref:`common ui properties `."], "renpy.register_sl_statement": ["internal", "class", "(name, children='many', screen=None)", "", "", "Registers a custom screen language statement with Ren'Py.\n\n`name` This must be a word. It's the name of the custom screen language statement.\n\n`children` The number of children this custom statement takes. This should be 0, 1, or \\many\\, which means zero or more.\n\n`screen` The screen to use. If not given, defaults to `name`.\n\nReturns an object that can have positional arguments and properties added to it. This object has the same .add_ methods as the objects returned by :class:`renpy.register_sl_displayable`.\n\nInitialize self. See help(type(self)) for accurate signature."], "renpy.register_statement": ["internal", "function", "(name, parse=None, lint=None, execute=None, predict=None, next=None, scry=None, block=False, init=False, translatable=False, execute_init=None, init_priority=0, label=None, warp=None, translation_strings=None, force_begin_rollback=False, post_execute=None, post_label=None, predict_all=True, predict_next=None, execute_default=None, reachable=None)", "", "", "This registers a user-defined statement.\n\n`name` This is either a space-separated list of names that begin the statement, or the empty string to define a new default statement (the default statement will replace the say statement).\n\n`block` When this is False, the statement does not expect a block. When True, it expects a block, but leaves it up to the lexer to parse that block. If the string \\script\\, the block is interpreted as containing one or more Ren'Py script language statements. If the string \\possible\\, the block expect condition is determined by the parse function.\n\n`parse` This is a function that takes a Lexer object. This function should parse the statement, and return an object. This object is passed as an argument to all the other functions.\n\n`lint` This is called to check the statement. It is passed a single argument, the object returned from parse. It should call renpy.error to report errors.\n\n`execute` This is a function that is called when the statement executes. It is passed a single argument, the object returned from parse.\n\n`execute_init` This is a function that is called at init time, at priority 0. It is passed a single argument, the object returned from parse.\n\n`predict` This is a function that is called to predict the images used by the statement. It is passed a single argument, the object returned from parse. It should return a list of displayables used by the statement.\n\n`next` This is a function that is called to determine the next statement.\n\n If `block` is not \\script\\, this is passed a single argument, the object returned from the parse function. If `block` is \\script\\, an additional argument is passed, an object that names the first statement in the block.\n\n The function should return either a string giving a label to jump to, the second argument to transfer control into the block, or None to continue to the statement after this one. It can also return the result of :meth:`Lexer.renpy_statement` or :meth:`Lexer.renpy_block` when called in the `parse` function.\n\n`label` This is a function that is called to determine the label of this statement. If it returns a string, that string is used as the statement label, which can be called and jumped to like any other label.\n\n`warp` This is a function that is called to determine if this statement should execute during warping. If the function exists and returns true, it's run during warp, otherwise the statement is not run during warp.\n\n`scry` Used internally by Ren'Py.\n\n`init` True if this statement should be run at init-time. (If the statement is not already inside an init block, it's automatically placed inside an init block.)\n\n You probably don't want this if you have an `execute_init` function, as wrapping the statement in an init block will cause the `execute_init` and `execute` functions to be called at the same time.\n\n`init_priority` An integer that determines the priority of initialization of the init block created by `init` and `execute_init` function.\n\n`translation_strings` A function that is called with the parsed block. It's expected to return a list of strings, which are then reported as being available to be translated.\n\n`force_begin_rollback` This should be set to true on statements that are likely to cause the end of a fast skip, similar to ``menu`` or ``call screen``.\n\n`post_execute` A function that is executed as part the next statement after this one. (Adding a post_execute function changes the contents of the RPYC file, meaning a Force Compile is necessary.)\n\n`post_label` This is a function that is called to determine the label of this the post execute statement. If it returns a string, that string is used as the statement label, which can be called and jumped to like any other label. This can be used to create a unique return point.\n\n`predict_all` If True, then this predicts all sub-parses of this statement and the statement after this statement.\n\n`predict_next` This is called with a single argument, the label of the statement that would run after this statement.\n\n This should be called to predict the statements that can run after this one. It's expected to return a list of of labels or SubParse objects. This is not called if `predict_all` is true.\n\n`execute_default` This is a function that is called at the same time the default statements are run - after the init phase, but before the game starts; when the a save is loaded; after rollback; before lint; and potentially at other times.\n\n This is called with a single argument, the object returned from parse.\n\n`reachable` This is a function that is called to allow this statement to customize how it participates in lint's reachability analysis.\n\n By default, a statement's custom block, sub-parse blocks created with Lexer.renpy_block(), and the statement after the statement are reachable if the statement itself is reachable. The statement is also reachable if it has a label function.\n\n This can be customized by providing a reachable function. This is a function that takes five arguments (in the following, a \\label\\ may be a string or an opaque object):\n\n * The object returned by the parse function. * A boolean that is true if the statement is reachable. * The label of the statement. * The label of the next statement, or None if there is no next statement. * If `block` is set to \\script\\, the label of the first statement in the block, or None if there is no block.\n\n It's expected to return a set that may contain:\n\n * A label or subparse object of a statement that is reachable. * True, to indicate that this statement should not be reported by lint, but is not intrinsically reachable. (It will become reachable if it is reported reachable by another statement.) * None, which is ignored.\n\n This function may be called multiple times with both value of is_reachable, to allow the statement to customize its behavior based on whether it's reachable or not. (For example, the next statement may only be reachable if this statement is.)\n\n.. warning\n```\nUsing the empty string as the name to redefine the say statement is\n usually a bad idea. That is because when replacing a Ren'Py native\n statement, its behavior depends on the :doc:`statement_equivalents`. In\n the case of the say statement, these equivalents do not support the `id`\n and translation systems. As a result, a game redefining the default\n statement will not be able to use these features (short of\n reimplementing them entirely).\n```"], "renpy.register_style_preference": ["internal", "function", "(preference, alternative, style, property, value)", "", "", "Registers information about an alternative for a style preference.\n\n`preference` A string, the name of the style preference.\n\n`alternative` A string, the name of the alternative.\n\n`style` The style that will be updated. This may be a style object or a string giving the style name.\n\n`property` A string giving the name of the style property that will be update.\n\n`value` The value that will be assigned to the style property."], "renpy.reload_all": ["internal", "function", "()", "", "", "Resets all modules to the state they were in right after import_all returned."], "renpy.reload_script": ["internal", "function", "()", "", "", "Causes Ren'Py to save the game, reload the script, and then load the save.\n\nThis should only be called during development. It works on Windows, macOS, and Linux, but may not work on other platforms."], "renpy.rename_save": ["internal", "function", "(old, new)", "", "", "Renames a save from `old` to `new`. (Does nothing if `old` does not exist.)"], "renpy.render": ["internal", "function", "(d, width, height, /, st, at)", "", "", "render(d, widtho, heighto, double st, double at)\n\n Causes a displayable to be rendered, and a renpy.Render object to be returned.\n\n`d` The displayable to render.\n\n`width`, `height` The width and height available for the displayable to render into.\n\n`st`, `at` The shown and animation timebases.\n\nRenders returned by this object may be cached, and should not be modified once they have been retrieved."], "renpy.request_permission": ["internal", "function", "(permission)", "", "", "Asks Android to grant a permission to this application. The user may be prompted to grant the permission.\n\n`permission` A string giving the name of the permission, for example, \\android.permission.WRITE_EXTERNAL_STORAGE\\.\n\nReturns true if the permission has been granted, false if not or if called on a non-Android platform."], "renpy.reset_physical_size": ["internal", "function", "()", "", "", "Attempts to set the size of the physical window to the size specified using :var:`renpy.config.physical_height` and :var:`renpy.config.physical_width`, or the size set using :var:`renpy.config.screen_width` and :var:`renpy.config.screen_height` if not set."], "renpy.restart_interaction": ["internal", "function", "()", "", "", "Restarts the current interaction. Among other things, this displays images added to the scene, re-evaluates screens, and starts any queued transitions.\n\nThis only does anything when called from within an interaction (for example, from an action). Outside an interaction, this function has no effect."], "renpy.retain_after_load": ["internal", "function", "()", "", "", "Causes data modified between the current statement and the statement containing the next checkpoint to be retained when a load occurs."], "renpy.return_statement": ["internal", "function", "(value=None)", "", "", "Causes Ren'Py to return from the current Ren'Py-level call."], "renpy.roll_forward_info": ["internal", "function", "()", "", "", "When in rollback, returns the data that was supplied to :func:`renpy.checkpoint` the last time this statement executed. Outside of rollback, returns None."], "renpy.rollback": ["internal", "function", "(force=False, checkpoints=1, defer=False, greedy=True, label=None, abnormal=True)", "", "", "Rolls the state of the game back to the last checkpoint.\n\n`force` If true, the rollback will occur in all circumstances. Otherwise, the rollback will only occur if rollback is enabled in the store, context, and config.\n\n`checkpoints` Ren'Py will roll back through this many calls to renpy.checkpoint. It will roll back as far as it can, subject to this condition.\n\n`defer` If true, the call will be deferred until control returns to the main context.\n\n`greedy` If true, rollback will finish just after the previous checkpoint. If false, rollback finish just before the current checkpoint.\n\n`label` If not None, a label that is called when rollback completes.\n\n`abnormal` If true, the default, script executed after the transition is run in an abnormal mode that skips transitions that would have otherwise occured. Abnormal mode ends when an interaction begins."], "renpy.round": ["internal", "function", "()", "", "", "Round a number to a given precision in decimal digits.\n\nThe return value is an integer if ndigits is omitted or None. Otherwise the return value has the same type as the number. ndigits may be negative."], "renpy.run": ["internal", "function", "(action)", "", "", "Run an action or list of actions. A single action is called with no arguments, a list of actions is run in order using this function, and None is ignored.\n\nReturns the result of the last action to return a value."], "renpy.run_unhovered": ["internal", "function", "(var)", "", "", "Calls the unhovered method on the variable, if it exists."], "renpy.save": ["internal", "function", "(filename, extra_info='')", "", "", "Saves the game state to a save slot.\n\n`filename` A string giving the name of a save slot. Despite the variable name, this corresponds only loosely to filenames.\n\n`extra_info` An additional string that should be saved to the save file. Usually, this is the value of :var:`save_name`.\n\n:func:`renpy.take_screenshot` should be called before this function."], "renpy.save_persistent": ["internal", "function", "()", "", "", "Saves the persistent data to disk."], "renpy.say": "", "renpy.scene": ["internal", "function", "(layer='master')", "", "", "Removes all displayables from `layer`. This is equivalent to the scene statement, when the scene statement is not given an image to show.\n\nA full scene statement is equivalent to a call to renpy.scene followed by a call to :func:`renpy.show`. For example::\n\n scene bg beach\n\nis equivalent to::\n\n $ renpy.scene() $ renpy.show(\\bg beach\\)"], "renpy.scene_lists": ["internal", "function", "(index=-1)", "", "", "Returns either the current scenelists object, or the one for the context at the given index."], "renpy.screenshot": ["internal", "function", "(filename)", "", "", "Saves a screenshot in `filename`.\n\nReturns True if the screenshot was saved successfully, False if saving failed for some reason.\n\nThe :var:`config.screenshot_pattern` and :var:`_screenshot_pattern` variables control the file the screenshot is saved in."], "renpy.screenshot_to_bytes": ["internal", "function", "(size)", "", "", "Returns a screenshot as a bytes object, that can be passed to im.Data(). The bytes will be a png-format image, such that\n```\n$ data = renpy.screenshot_to_bytes((640, 360))\n show expression im.Data(data, \\screenshot.png\\):\n align (0, 0)\n\nWill show the image. The bytes objects returned can be stored in save\nfiles and persistent data. However, these may be large, and care should\nbe taken to not include too many.\n\n`size`\n The size the screenshot will be resized to. If None, the screenshot\n will be resized, and hence will be the size of the player's window,\n without any letterbars.\n\nThis function may be slow, and so it's intended for save-like screenshots,\nand not realtime effects.\n```"], "renpy.scry": ["internal", "function", "()", "", "", "Returns the scry object for the current statement. Returns None if there are no statements executing.\n\nThe scry object tells Ren'Py about things that must be true in the future of the current statement. Right now, the scry object has the following fields:\n\n``nvl_clear`` Is true if an ``nvl clear`` statement will execute before the next interaction.\n\n``say`` Is true if an ``say`` statement will execute before the next interaction.\n\n``menu_with_caption`` Is true if a ``menu`` statement with a caption will execute before the next interaction.\n\n``who`` If a ``say`` or ``menu-with-caption`` statement will execute before the next interaction, this is the character object it will use.\n\nThe scry object has a next() method, which returns the scry object of the statement after the current one, if only one statement will execute after the this one. Otherwise, it returns None."], "renpy.seen_audio": ["internal", "function", "(filename)", "", "", "Returns True if the given filename has been played at least once on the current user's system."], "renpy.seen_image": ["internal", "function", "(name)", "", "", "Returns True if the named image has been seen at least once on the user's system. An image has been seen if it's been displayed using the show statement, scene statement, or :func:`renpy.show` function. (Note that there are cases where the user won't actually see the image, like a show immediately followed by a hide.)"], "renpy.seen_label": ["internal", "function", "(label)", "", "", "Returns true if the named label has executed at least once on the current user's system, and false otherwise. This can be used to unlock scene galleries, for example."], "renpy.set_autoreload": ["internal", "function", "(autoreload)", "", "", "Sets the autoreload flag, which determines if the game will be automatically reloaded after file changes. Autoreload will not be fully enabled until the game is reloaded with :func:`renpy.reload_script`."], "renpy.set_focus": ["internal", "function", "(screen, id, layer='screens')", "", "", "This attempts to focus the displayable with `id` in the screen `screen`. Focusing will fail if the displayable isn't found, the window isn't focused, or something else is grabbing focus.\n\nThe focus may change if the mouse moves, even slightly, after this call is processed."], "renpy.set_mouse_pos": ["internal", "function", "(x, y, duration=0)", "", "", "Jump the mouse pointer to the location given by arguments x and y. If the device does not have a mouse pointer, this does nothing.\n\n`duration` The time it will take to perform the move, in seconds. During this time, the mouse may be unresponsive."], "renpy.set_physical_size": ["internal", "function", "(size)", "", "", "Attempts to set the size of the physical window to `size`. This has the side effect of taking the screen out of fullscreen mode."], "renpy.set_return_stack": ["internal", "function", "(stack)", "", "", "Sets the current return stack. The return stack is a list of statement names.\n\nStatement names may be strings (for labels) or opaque tuples (for non-label statements)."], "renpy.set_style_preference": ["internal", "function", "(preference, alternative)", "", "", "Sets the selected alternative for the style preference.\n\n`preference` A string giving the name of the style preference.\n\n`alternative` A string giving the name of the alternative."], "renpy.set_tag_attributes": ["internal", "function", "(name, layer=None)", "", "", "This sets the attributes associated with an image tag when that image tag is not showing. The main use of this would be to directly set the attributes used by a side image.\n\nFor example::\n\n $ renpy.set_tag_attributes(\\lucy mad\\) $ renpy.say(l, \\I'm rather cross.\\)\n\nand::\n\n l mad \\I'm rather cross.\\\n\nare equivalent."], "renpy.show": ["internal", "function", "(name, at_list=[], layer=None, what=None, zorder=0, tag=None, behind=[], **kwargs)", "", "", "Shows an image on a layer. This is the programmatic equivalent of the show statement.\n\n`name` The name of the image to show, a string.\n\n`at_list` A list of transforms that are applied to the image. The equivalent of the ``at`` property.\n\n`layer` A string, giving the name of the layer on which the image will be shown. The equivalent of the ``onlayer`` property. If None, uses the default layer associated with the tag.\n\n`what` If not None, this is a displayable that will be shown in lieu of looking on the image. (This is the equivalent of the show expression statement.) When a `what` parameter is given, `name` can be used to associate a tag with the image.\n\n`zorder` An integer, the equivalent of the ``zorder`` property. If None, the zorder is preserved if it exists, and is otherwise set to 0.\n\n`tag` A string, used to specify the image tag of the shown image. The equivalent of the ``as`` property.\n\n`behind` A list of strings, giving image tags that this image is shown behind. The equivalent of the ``behind`` property.\n```\nshow a\n $ renpy.show(\\a\\)\n\n show expression w\n # anonymous show expression : no equivalent\n\n show expression w as a\n $ renpy.show(\\a\\, what=w)\n $ renpy.show(\\y\\, what=w, tag=\\a\\) # in this case, name is ignored\n\n show a at T, T2\n $ renpy.show(\\a\\, at_list=(T, T2))\n\n show a onlayer b behind c zorder d as e\n $ renpy.show(\\a\\, layer=\\b\\, behind=[\\c\\], zorder=\\d\\, tag=\\e\\)\n```"], "renpy.show_display_say": ["internal", "function", "(who, what, who_args={}, what_args={}, window_args={}, image=False, side_image=None, two_window=False, two_window_vbox_properties={}, who_window_properties={}, say_vbox_properties={}, transform=None, variant=None, screen=None, layer=None, properties={}, multiple=None, **kwargs)", "", "", "This is called (by default) by renpy.display_say to add the widgets corresponding to a screen of dialogue to the user. It is not expected to be called by the user, but instead to be called by display_say, or by a function passed as the show_function argument to Character or display_say.\n\n@param who: The name of the character that is speaking, or None to not show this name to the user.\n\n@param what: What that character is saying. Please not that this may not be a string, as it can also be a list containing both text and displayables, suitable for use as the first argument of ui.text().\n\n@param who_args: Additional keyword arguments intended to be supplied to the ui.text that creates the who widget of this dialogue.\n\n@param what_args: Additional keyword arguments intended to be supplied to the ui.text that creates the what widget of this dialogue.\n\n@param window_args: Additional keyword arguments intended to be supplied to the ui.window that creates the who widget of this dialogue.\n\n@param image: If True, then who should be interpreted as an image or displayable rather than a text string.\n\n@param kwargs: Additional keyword arguments should be ignored.\n\nThis function is required to return the ui.text() widget displaying the what text."], "renpy.show_layer_at": ["internal", "function", "(at_list, layer='master', reset=True, camera=False)", "", "", "The Python equivalent of the ``show layer`` `layer` ``at`` `at_list` statement. If `camera` is True, the equivalent of the ``camera`` statement.\n\n`reset` If true, the transform state is reset to the start when it is shown. If false, the transform state is persisted, allowing the new transform to update that state."], "renpy.show_screen": ["internal", "function", "(_screen_name, *args, _layer=None, _zorder=None, _tag=None, _widget_properties={}, _transient=False, **kwargs)", "", "", "The programmatic equivalent of the show screen statement.\n\nShows the named screen. This takes the following keyword arguments:\n\n`_screen_name` The name of the screen to show. `_layer` The layer to show the screen on. This is equivalent to the ``onlayer`` clause of the :ref:`show-screen-statement` statement. `_zorder` The zorder to show the screen on. If not specified, defaults to the zorder associated with the screen. If that's not specified, it is 0 by default. `_tag` The tag to show the screen with. If not specified, defaults to the tag associated with the screen. If that's not specified, defaults to the name of the screen.\n\nThis is equivalent to the ``as`` clause of the :ref:`show-screen-statement` statement. `_widget_properties` A map from the id of a widget to a property name -> property value dictionary. When a widget with that id is shown by the screen, the specified properties are added to it. `_transient` If true, the screen will be automatically hidden at the end of the current interaction.\n\nNon-keyword arguments, and keyword arguments that do not begin with an underscore, are passed to the screen."], "renpy.showing": ["internal", "function", "(name, layer=None)", "", "", "Returns true if an image with the same tag as `name` is showing on `layer`.\n\n`image` May be a string giving the image name or a tuple giving each component of the image name. It may also be a string giving only the image tag.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.shown_window": ["internal", "function", "()", "", "", "Call this to indicate that the window has been shown. This interacts with the \\window show\\ statement, which shows an empty window whenever this functions has not been called during an interaction."], "renpy.site": ["internal", "function", "()", "", "", "Append module search paths for third-party packages to sys.path.\n\n**************************************************************** * This module is automatically imported during initialization. * ****************************************************************\n\nThis will append site-specific paths to the module search path. On Unix (including Mac OSX), it starts with sys.prefix and sys.exec_prefix (if different) and appends lib/python/site-packages. On other platforms (such as Windows), it tries each of the prefixes directly, as well as with lib/site-packages appended. The resulting directories, if they exist, are appended to sys.path, and also inspected for path configuration files.\n\nIf a file named \\pyvenv.cfg\\ exists one directory above sys.executable, sys.prefix and sys.exec_prefix are set to that directory and it is also checked for site-packages (sys.base_prefix and sys.base_exec_prefix will always be the \\real\\ prefixes of the Python installation). If \\pyvenv.cfg\\ (a bootstrap configuration file) contains the key \\include-system-site-packages\\ set to anything other than \\false\\ (case-insensitive), the system-level prefixes will still also be searched for site-packages; otherwise they won't.\n\nAll of the resulting site-specific directories, if they exist, are appended to sys.path, and also inspected for path configuration files.\n\nA path configuration file is a file whose name has the form .pth; its contents are additional directories (one per line) to be added to sys.path. Non-existing directories (or non-directories) are never added to sys.path; no directory is added to sys.path more than once. Blank lines and lines beginning with '#' are skipped. Lines starting with 'import' are executed.\n\nFor example, suppose sys.prefix and sys.exec_prefix are set to /usr/local and there is a directory /usr/local/lib/python2.5/site-packages with three subdirectories, foo, bar and spam, and two path configuration files, foo.pth and bar.pth. Assume foo.pth contains the following:\n\n # foo package configuration foo bar bletch\n\nand bar.pth contains:\n\n # bar package configuration bar\n\nThen the following directories are added to sys.path, in this order:\n\n /usr/local/lib/python2.5/site-packages/bar /usr/local/lib/python2.5/site-packages/foo\n\nNote that bletch is omitted because it doesn't exist; bar precedes foo because bar.pth comes alphabetically before foo.pth; and spam is omitted because it is not mentioned in either path configuration file.\n\nThe readline module is also automatically configured to enable completion for systems that support it. This can be overridden in sitecustomize, usercustomize or PYTHONSTARTUP. Starting Python in isolated mode (-I) disables automatic readline configuration.\n\nAfter these operations, an attempt is made to import a module named sitecustomize, which can perform arbitrary additional site-specific customizations. If this import fails with an ImportError exception, it is silently ignored."], "renpy.six": ["internal", "function", "()", "", "", "Utilities for writing code that runs on Python 2 and 3"], "renpy.slot_json": ["internal", "function", "(slotname)", "", "", "Returns the json information for `slotname`, or None if the slot is empty.\n\nMuch like the ``d`` argument to the :var:`config.save_json_callbacks` function, it will be returned as a dictionary. More precisely, the dictionary will contain the same data as it did when the game was saved."], "renpy.slot_mtime": ["internal", "function", "(slotname)", "", "", "Returns the modification time for `slot`, or None if the slot is empty."], "renpy.slot_screenshot": ["internal", "function", "(slotname)", "", "", "Returns a display that can be used as the screenshot for `slotname`, or None if the slot is empty."], "renpy.sound": ["basefile", "", "", "", "", "Most renpy.sound functions have aliases in renpy.music. These functions are similar, except they default to the music channel rather than the sound channel, and default to looping."], "renpy.split_properties": ["internal", "function", "(properties, *prefixes)", "", "", "Splits up `properties` into multiple dictionaries, one per `prefix`. This function checks each key in properties against each prefix, in turn. When a prefix matches, the prefix is stripped from the key, and the resulting key is mapped to the value in the corresponding dictionary.\n\nIf no prefix matches, an exception is thrown. (The empty string, \\\\, can be used as the last prefix to create a catch-all dictionary.)\n\nFor example, this splits properties beginning with text from those that do not\n```\ntext_properties, button_properties = renpy.split_properties(properties, \\text_\\, \\\\)\n```"], "renpy.start_predict": ["internal", "function", "(*args)", "", "", "This function takes one or more displayables as arguments. It causes Ren'Py to predict those displayables during every interaction until the displayables are removed by :func:`renpy.stop_predict`.\n\nIf a displayable name is a string containing one or more \\* characters, the asterisks are used as a wildcard pattern. If there is at least one . in the string, the pattern is matched against filenames, otherwise it is matched against image names.\n\nFor example::\n\n $ renpy.start_predict(\\eileen *\\)\n\nstarts predicting all images with the name eileen, while::\n\n $ renpy.start_predict(\\images/concert*.*\\)\n\nmatches all files starting with concert in the images directory.\n\nPrediction will occur during normal gameplay. To wait for prediction to complete, use the `predict` argument to :func:`renpy.pause`."], "renpy.start_predict_screen": ["internal", "function", "(_screen_name, *args, **kwargs)", "", "", "Causes Ren'Py to start predicting the screen named `_screen_name` with the given arguments. This replaces any previous prediction of `_screen_name`. To stop predicting a screen, call :func:`renpy.stop_predict_screen`.\n\nPrediction will occur during normal gameplay. To wait for prediction to complete, use the `predict` argument to :func:`renpy.pause`."], "renpy.stop_predict": ["internal", "function", "(*args)", "", "", "This function takes one or more displayables as arguments. It causes Ren'Py to stop predicting those displayables during every interaction.\n\nWildcard patterns can be used as described in :func:`renpy.start_predict`."], "renpy.stop_predict_screen": ["internal", "function", "(name)", "", "", "Causes Ren'Py to stop predicting the screen named `name`."], "renpy.substitute": ["internal", "function", "(s, scope=None, translate=True)", "", "", "Applies translation and new-style formatting to the string `s`.\n\n`scope` If not None, a scope which is used in formatting, in addition to the default store.\n\n`translate` Determines if translation occurs.\n\nReturns the translated and formatted string."], "renpy.suspend_rollback": ["internal", "function", "(flag)", "", "", "Rollback will skip sections of the game where rollback has been suspended.\n\n`flag`: When `flag` is true, rollback is suspended. When false, rollback is resumed."], "renpy.take_screenshot": ["internal", "function", "()", "", "", "Causes a screenshot to be taken. This screenshot will be saved as part of a saved game."], "renpy.threading": ["internal", "function", "()", "", "", "Thread module emulating a subset of Java's threading model."], "renpy.timeout": ["internal", "function", "(seconds)", "", "", "Causes an event to be generated before `seconds` seconds have elapsed. This ensures that the event method of a user-defined displayable will be called."], "renpy.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "renpy.transform_text": ["internal", "function", "(s, function)", "", "", "Transforms `s`, while leaving text tags and interpolation the same.\n\n`function` A function that is called with strings corresponding to runs of text, and should return a second string that replaces that run of text.\n```\ninit python:\n def upper(s):\n return s.upper()\n\n $ upper_string = renpy.transform_text(\\{b}Not Upper{/b}\\, upper)\n```"], "renpy.transition": ["internal", "function", "(trans, layer=None, always=False)", "", "", "Sets the transition that will be used during the next interaction.\n\n`layer` The layer the transition applies to. If None, the transition applies to the entire scene.\n\n`always` If false, this respects the transition preference. If true, the transition is always run."], "renpy.translate_string": ["internal", "function", "(s, language=NotSet)", "", "", "Returns `s` immediately translated into `language`. If `language` is Default, uses the language set in the preferences. Strings enclosed in this function will **not** be added to the list of translatable strings. Note that the string may be double-translated, if it matches a string translation when it is displayed."], "renpy.try_compile": ["internal", "function", "(where, expr, additional=None)", "", "", "Tries to compile an expression, and writes an error to lint.txt if it fails.\n\n`where` A string giving the location the expression is found. Used to generate an error message of the form \\Could not evaluate `expr` in `where`.\\\n\n`expr` The expression to try compiling.\n\n`additional` If given, an additional line of information that is addded to the error message."], "renpy.try_eval": ["internal", "function", "(where, expr, additional=None)", "", "", "Tries to evaluate an expression, and writes an error to lint.txt if it fails.\n\n`where` A string giving the location the expression is found. Used to generate an error message of the form \\Could not evaluate `expr` in `where`.\\\n\n`expr` The expression to try evaluating.\n\n`additional` If given, an additional line of information that is addded to the error message."], "renpy.type_blacklist": ["internal", "function", "()", "", "", "Built-in immutable sequence.\n\nIf no argument is given, the constructor returns an empty tuple. If iterable is specified the tuple is initialized from iterable's items.\n\nIf the argument is a tuple, the return value is the same object."], "renpy.types": ["internal", "function", "()", "", "", "Define names for built-in types that aren't directly accessible as a builtin."], "renpy.unlink_save": ["internal", "function", "(filename)", "", "", "Deletes the save slot with the given name."], "renpy.unwatch": ["internal", "function", "(expr)", "", "", "Stops watching the given Python expression."], "renpy.update_path": ["internal", "function", "()", "", "", "Update the __path__ of package, to import binary modules from a libexec directory."], "renpy.variant": ["internal", "function", "(name)", "", "", "Returns true if `name` is a screen variant that corresponds to the context in which Ren'Py is currently executing. See :ref:`screen-variants` for more details. This function can be used as the condition in an if statement to switch behavior based on the selected screen variant.\n\n`name` can also be a list of variants, in which case this function returns True if any of the variants would."], "renpy.version": ["internal", "function", "(tuple=False)", "", "", "If `tuple` is false, returns a string containing \\Ren'Py \\, followed by the current version of Ren'Py.\n\nIf `tuple` is true, returns a tuple giving each component of the version as an integer."], "renpy.version_tuple": ["other", "renpy.version_tuple", "", "", "var", "The version number of Ren'Py, as a tuple of the form (1, 2, 3, 456).\n\nThis is a namedtuple with four fields: ``major``, ``minor``, ``patch``, and ``commit``."], "renpy.vibrate": ["internal", "function", "(duration)", "", "", "Causes the device to vibrate for `duration` seconds. Currently, this is only supported on Android."], "renpy.warp_to_line": ["internal", "function", "(warp_spec)", "", "", "This takes as an argument a filename:linenumber pair, and tries to warp to the statement before that line number.\n\nThis works samely as the `--warp` command."], "renpy.watch": ["internal", "function", "(expr)", "", "", "This watches the given Python expression, by displaying it in the upper-right corner of the screen."], "renpy.with_statement": ["internal", "function", "(trans, always=False)", "", "", "Causes a transition to occur. This is the Python equivalent of the with statement.\n\n`trans` The transition.\n\n`always` If True, the transition will always occur, even if the user has disabled transitions.\n\nThis function returns true if the user chose to interrupt the transition, and false otherwise."], "renpy.music.get_duration": ["internal", "function", "(channel='music')", "", "", "Returns the duration of the audio or video file on `channel`. Returns 0.0 if no file is playing on `channel`, or the duration is unknown. Some formats - notably MP3 - do not include duration information in a format Ren'Py can access."], "renpy.music.get_loop": ["internal", "function", "(channel='music')", "", "", "Return a list of filenames that are being looped on `channel`, or None if no files are being looped. In the case where a loop is queued, but is not yet playing, the loop is returned, not the currently playing music."], "renpy.music.get_pause": ["internal", "function", "(channel='music')", "", "", "Returns the pause flag for `channel`."], "renpy.music.get_playing": ["internal", "function", "(channel='music')", "", "", "If the given channel is playing, returns the playing file name. Otherwise, returns None."], "renpy.music.get_pos": ["internal", "function", "(channel='music')", "", "", "Returns the current position of the audio or video file on `channel`, in seconds. Returns None if no audio is playing on `channel`.\n\nAs this may return None before a channel starts playing, or if the audio channel involved has been muted, callers of this function should always handle a None value."], "renpy.music.is_playing": ["internal", "function", "(channel='music')", "", "", "Returns True if the channel is currently playing a sound, False if it is not, or if the sound system isn't working."], "renpy.music.play": ["internal", "function", "(filenames, channel='music', loop=None, fadeout=None, synchro_start=False, fadein=0, tight=None, if_changed=False, relative_volume=1.0)", "", "", "This stops the music currently playing on the numbered channel, dequeues any queued music, and begins playing the specified file or files.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fadeout_audio. This is ignored if the channel is paused when the music is played.\n\n`synchro_start` Ren'Py will ensure that all channels of with synchro_start set to true will start playing at exactly the same time. Synchro_start should be true when playing two audio files that are meant to be synchronized with each other.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`if_changed` If this is True, and the music file is currently playing, then it will not be stopped/faded out and faded back in again, but instead will be kept playing. (This will always queue up an additional loop of the music.)\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.music.pump": ["internal", "function", "()", "", "", "This 'pumps' the audio system. Normally, the effects of the ``play``, ``queue``, and ``stop`` statements and the function equivalents take place at the start of the next interaction. In some cases, the effects of multiple statements can cancel each other out - for example, a play followed by a stop causes the track to never be played.\n\nIf this function is called between the play and stop, the track will begin playing before this function returns, which then allows the track to be faded out.\n```\nplay music \\mytrack.opus\\\n $ renpy.music.pump()\n stop music fadeout 4\n```"], "renpy.music.queue": ["internal", "function", "(filenames, channel='music', loop=None, clear_queue=True, fadein=0, tight=None, relative_volume=1.0)", "", "", "This queues the given filenames on the specified channel.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`clear_queue` If True, then the queue is cleared, making these files the files that are played when the currently playing file finishes. If it is False, then these files are placed at the back of the queue. In either case, if no music is playing these files begin playing immediately.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.music.register_channel": ["audio", "renpy.music.register_channel", "(name, mixer, loop=None, stop_on_mute=True, tight=False, file_prefix=\"\", file_suffix=\"\", buffer_queue=True, movie=False, framedrop=True)", "", "", "This registers a new audio channel named `name`. Audio can then be played on the channel by supplying the channel name to the play or queue statements.\n\n`name` The name of the channel. It should not contain spaces, as this is reserved for Ren'Py's internal use, and should be a `valid identifier `__ for the syntax of the :ref:`play-statement` to be usable.\n\n`mixer` The name of the mixer the channel uses. By default, Ren'Py knows about the \\music\\, \\sfx\\, and \\voice\\ mixers. Using other names is possible, and will create the mixer if it doesn't already exist, but making new mixers reachable by the player requires changing the preferences screens.\n\n`loop` If true, sounds on this channel loop by default.\n\n`stop_on_mute` If true, music on the channel is stopped when the channel is muted.\n\n`tight` If true, sounds will loop even when fadeout is occurring. This should be set to True for a sound effects or seamless music channel, and False if the music fades out on its own.\n\n`file_prefix` A prefix that is prepended to the filenames of the sound files being played on this channel.\n\n`file_suffix` A suffix that is appended to the filenames of the sound files being played on this channel.\n\n`buffer_queue` Should we buffer the first second or so of a queued file? This should be True for audio, and False for movie playback.\n\n`movie` If true, this channel will be set up to play back videos.\n\n`framedrop` This controls what a video does when lagging. If true, frames will be dropped to keep up with realtime and the soundtrack. If false, Ren'Py will display frames late rather than dropping them."], "renpy.music.set_pan": ["internal", "function", "(pan, delay, channel='music')", "", "", "Sets the pan of this channel.\n\n`pan` A number between -1 and 1 that control the placement of the audio. If this is -1, then all audio is sent to the left channel. If it's 0, then the two channels are equally balanced. If it's 1, then all audio is sent to the right ear.\n\n`delay` The amount of time it takes for the panning to occur.\n\n`channel` The channel the panning takes place on, defaulting to the music channel."], "renpy.music.set_pause": ["internal", "function", "(value, channel='music')", "", "", "Sets the pause flag for `channel` to `value`. If True, the channel will pause, otherwise it will play normally."], "renpy.music.set_queue_empty_callback": ["internal", "function", "(callback, channel='music')", "", "", "This sets a callback that is called when the queue is empty. This callback is called when the queue first becomes empty, and at least once per interaction while the queue is empty.\n\nThe callback is called with no parameters. It can queue sounds by calling renpy.music.queue with the appropriate arguments. Please note that the callback may be called while a sound is playing, as long as a queue slot is empty."], "renpy.music.set_volume": ["internal", "function", "(volume, delay=0, channel='music')", "", "", "Sets the volume of this channel, as a fraction of the volume of the mixer controlling the channel.\n\n`volume` This is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for the channel.\n\n`delay` It takes delay seconds to change/fade the volume from the old to the new value. This value is persisted into saves, and participates in rollback.\n\n`channel` The channel to be set"], "renpy.music.stop": ["internal", "function", "(channel='music', fadeout=None)", "", "", "This stops the music that is currently playing, and dequeues all queued music. If fadeout is None, the music is faded out for the time given in config.fadeout_audio, otherwise it is faded for fadeout seconds.\n\nThis sets the last queued file to None.\n\n`channel` The channel to stop the sound on.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fadeout_audio. This is ignored if the channel is paused."], "renpy.sound.register_channel": ["audio", "renpy.music.register_channel", "(name, mixer, loop=None, stop_on_mute=True, tight=False, file_prefix=\"\", file_suffix=\"\", buffer_queue=True, movie=False, framedrop=True)", "", "", "This registers a new audio channel named `name`. Audio can then be played on the channel by supplying the channel name to the play or queue statements.\n\n`name` The name of the channel. It should not contain spaces, as this is reserved for Ren'Py's internal use, and should be a `valid identifier `__ for the syntax of the :ref:`play-statement` to be usable.\n\n`mixer` The name of the mixer the channel uses. By default, Ren'Py knows about the \\music\\, \\sfx\\, and \\voice\\ mixers. Using other names is possible, and will create the mixer if it doesn't already exist, but making new mixers reachable by the player requires changing the preferences screens.\n\n`loop` If true, sounds on this channel loop by default.\n\n`stop_on_mute` If true, music on the channel is stopped when the channel is muted.\n\n`tight` If true, sounds will loop even when fadeout is occurring. This should be set to True for a sound effects or seamless music channel, and False if the music fades out on its own.\n\n`file_prefix` A prefix that is prepended to the filenames of the sound files being played on this channel.\n\n`file_suffix` A suffix that is appended to the filenames of the sound files being played on this channel.\n\n`buffer_queue` Should we buffer the first second or so of a queued file? This should be True for audio, and False for movie playback.\n\n`movie` If true, this channel will be set up to play back videos.\n\n`framedrop` This controls what a video does when lagging. If true, frames will be dropped to keep up with realtime and the soundtrack. If false, Ren'Py will display frames late rather than dropping them."], "renpy.Displayable.__init__": ["cdd", "__init__", "(**properties)", "renpy.Displayable", "method", "A subclass may override the constructor, perhaps adding new parameters. If it does, it should pass all unknown keyword arguments to the renpy.Displayable constructor, with the call\n```\nsuper(MyDisplayable, self).__init__(**properties)\n\n```"], "renpy.Displayable.render": ["cdd", "render", "(width, height, st, at)", "renpy.Displayable", "method", "Subclasses must override this, to return a :class:`renpy.Render` object. The render object determines what, if anything, is shown on the screen.\n\n`width`, `height` The amount of space available to this displayable, in pixels.\n\n`st` A float, the shown timebase, in seconds. The shown timebase begins when this displayable is first shown on the screen.\n\n`at` A float, the animation timebase, in seconds. The animation timebase begins when an image with the same tag was shown, without being hidden. (When the displayable is shown without a tag, this is the same as the shown timebase.)\n\nThe render method is called when the displayable is first shown. It can be called again if :func:`renpy.redraw` is called on this object."], "renpy.Displayable.event": ["cdd", "event", "(ev, x, y, st)", "renpy.Displayable", "method", "The event method is called to pass a pygame event to the creator-defined displayable. If the event method returns a value other than None, that value is returned as the result of the interaction. If the event method returns None, the event is passed on to other displayables.\n\nTo ignore the event without returning None, raise :class:`renpy.IgnoreEvent`.\n\nThe event method exists on other displayables, allowing the creator-defined displayable to pass on the event.\n\n`ev` An `event object `_\n\n`x`, `y` The x and y coordinates of the event, relative to the upper-left corner of the displayable. These should be used in preference to position information found in the pygame event objects.\n\n`st` A float, the shown timebase, in seconds.\n\nAn event is generated at the start of each interaction, and :func:`renpy.timeout` can be used to cause another event to occur."], "renpy.Displayable.per_interact": ["cdd", "per_interact", "(self)", "renpy.Displayable", "method", "This method is called at the start of each interaction. It can be used to trigger a redraw, and probably should be used to trigger a redraw if the object participates in rollback."], "renpy.Displayable.visit": ["cdd", "visit", "(self)", "renpy.Displayable", "method", "If the displayable has child displayables, this method should be overridden to return a list of those displayables. This ensures that the per_interact methods of those displayables are called, and also allows images used by those displayables to be predicted."], "renpy.Displayable.place": ["cdd", "place", "(dest, x, y, width, height, surf, main=True)", "renpy.Displayable", "method", "This places a render (which must be of this displayable) within a bounding area. Returns an (x, y) tuple giving the location the displayable was placed at.\n\n`dest` If not None, the `surf` will be blitted to `dest` at the computed coordinates.\n\n`x`, `y`, `width`, `height` The bounding area.\n\n`surf` The render to place.\n\n`main` This is passed to Render.blit()."], "renpy.Render.blit": ["cdd", "blit", "(source, pos, main=True)", "renpy.Render", "method", "Draws another render object into this render object.\n\n`source` The render object to draw.\n\n`pos` The location to draw into. This is an (x, y) tuple with the coordinates being pixels relative to the upper-left corner of the target render.\n\n`main` A keyword-only parameter. If true, `source` will be displayed in the style inspector."], "renpy.Render.place": ["cdd", "place", "(d, x=0, y=0, width=None, height=None, st=None, at=None, render=None, main=True)", "renpy.Render", "method", "Renders `d`, a displayable, and places it into the rectangle defined by the `x`, `y`, `width`, and `height`, using Ren'Py's standard placement algorithm. Returns an (x, y) tuple giving the location the displayable was placed at. Location is computed by calling Displayable.place() method.\n\n`x`, `y`, `width`, `height` The rectangle to place in. If `width` or `height`, when None, are the width and height of this render, respectively.\n\n`st`, `at` The times passed to Render. If None, defaults to the times passed to the render method calling this method.\n\n`render` If not None, this is used instead of rendering `d`.\n\n`main` As for .blit()."], "renpy.Render.canvas": ["cdd", "canvas", "()", "renpy.Render", "method", "Returns a canvas object. A canvas object has methods corresponding to the `pygame.draw `_ functions, with the first parameter (the surface) omitted.\n\nCanvas objects also have a get_surface() method that returns the pygame Surface underlying the canvas."], "renpy.Render.get_size": ["cdd", "get_size", "()", "renpy.Render", "method", "Returns a (width, height) tuple giving the size of this render."], "renpy.Render.subsurface": ["cdd", "subsurface", "(rect)", "renpy.Render", "method", "Returns a render consisting of a rectangle cut out of this render.\n\n`rect` A (x, y, width, height) tuple."], "renpy.Render.zoom": ["cdd", "zoom", "(xzoom, yzoom)", "renpy.Render", "method", "Sets the zoom level of the children of this displayable in the horizontal and vertical axes. Only the children of the displayable are zoomed \u2013 the width, height, and blit coordinates are not zoomed.\n\nThe following attributes and methods are only used when model-based rendering is enabled:"], "renpy.Render.mesh": ["cdd", "mesh", "", "renpy.Render", "attribute", "This field enables model-based rendering for this Render. If true:\n\nIf set to True:\n\n* All of the children of this displayable are rendered to textures. * A mesh the size of the first child is assocated with this displayable. * A model is created with the mesh, shaders, uniforms, and properties associated with this Render.\n\nThe model will then be drawn in a single operation."], "renpy.Render.add_shader": ["cdd", "add_shader", "(shader)", "renpy.Render", "method", "This causes the shader part `shader` to be used when this Render or its children are drawn. The part should be a string, or can be a string beginning with \\-\\ to prevent a shader from being drawn."], "renpy.Render.add_uniform": ["cdd", "add_uniform", "(name, value)", "renpy.Render", "method", "Causes the uniform `name` to have `value` when this Render or its children are drawn."], "renpy.Render.add_property": ["cdd", "add_property", "(name, value)", "renpy.Render", "method", "Causes the GL property `name` to have `value` when this Render or one of its children are drawn."], "renpy.version_string": ["other", "renpy.version_string", "", "", "var", "The version number of Ren'Py, as a string of the form \\Ren'Py 1.2.3.456\\."], "renpy.version_only": ["other", "renpy.version_only", "", "", "var", "The version number of Ren'Py, without the Ren'Py prefix. A string of the form \\1.2.3.456\\."], "renpy.version_name": ["other", "renpy.version_name", "", "", "var", "A human readable version name, of the form \\Example Version.\\"], "renpy.license": ["other", "renpy.license", "", "", "var", "A string giving license text that should be included in a game's about screen."], "renpy.windows": ["other", "renpy.windows", "", "", "var", "Has a true value when running on Windows."], "renpy.macintosh": ["other", "renpy.macintosh", "", "", "var", "Has a true value when running on macOS."], "renpy.linux": ["other", "renpy.linux", "", "", "var", "Has a true value when running on Linux or other POSIX-like operating systems."], "renpy.android": ["other", "renpy.android", "", "", "var", "Has a true value when running on Android."], "renpy.ios": ["other", "renpy.ios", "", "", "var", "Has a true value when running on iOS."], "renpy.emscripten": ["other", "renpy.emscripten", "", "", "var", "Has a true value when running in the browser."], "renpy.mobile": ["other", "renpy.mobile", "", "", "var", "Has a true value when running on Android or iOS or in the browser."], "renpy.sound.get_duration": ["internal", "function", "(channel='music')", "", "", "Returns the duration of the audio or video file on `channel`. Returns 0.0 if no file is playing on `channel`, or the duration is unknown. Some formats - notably MP3 - do not include duration information in a format Ren'Py can access."], "renpy.sound.get_loop": ["internal", "function", "(channel='music')", "", "", "Return a list of filenames that are being looped on `channel`, or None if no files are being looped. In the case where a loop is queued, but is not yet playing, the loop is returned, not the currently playing music."], "renpy.sound.get_pause": ["internal", "function", "(channel='music')", "", "", "Returns the pause flag for `channel`."], "renpy.sound.get_playing": ["internal", "function", "(channel='music')", "", "", "If the given channel is playing, returns the playing file name. Otherwise, returns None."], "renpy.sound.get_pos": ["internal", "function", "(channel='music')", "", "", "Returns the current position of the audio or video file on `channel`, in seconds. Returns None if no audio is playing on `channel`.\n\nAs this may return None before a channel starts playing, or if the audio channel involved has been muted, callers of this function should always handle a None value."], "renpy.sound.is_playing": ["internal", "function", "(channel='music')", "", "", "Returns True if the channel is currently playing a sound, False if it is not, or if the sound system isn't working."], "renpy.sound.play": ["internal", "function", "(filenames, channel='music', loop=None, fadeout=None, synchro_start=False, fadein=0, tight=None, if_changed=False, relative_volume=1.0)", "", "", "This stops the music currently playing on the numbered channel, dequeues any queued music, and begins playing the specified file or files.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fadeout_audio. This is ignored if the channel is paused when the music is played.\n\n`synchro_start` Ren'Py will ensure that all channels of with synchro_start set to true will start playing at exactly the same time. Synchro_start should be true when playing two audio files that are meant to be synchronized with each other.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`if_changed` If this is True, and the music file is currently playing, then it will not be stopped/faded out and faded back in again, but instead will be kept playing. (This will always queue up an additional loop of the music.)\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.sound.pump": ["internal", "function", "()", "", "", "This 'pumps' the audio system. Normally, the effects of the ``play``, ``queue``, and ``stop`` statements and the function equivalents take place at the start of the next interaction. In some cases, the effects of multiple statements can cancel each other out - for example, a play followed by a stop causes the track to never be played.\n\nIf this function is called between the play and stop, the track will begin playing before this function returns, which then allows the track to be faded out.\n```\nplay music \\mytrack.opus\\\n $ renpy.music.pump()\n stop music fadeout 4\n```"], "renpy.sound.queue": ["internal", "function", "(filenames, channel='music', loop=None, clear_queue=True, fadein=0, tight=None, relative_volume=1.0)", "", "", "This queues the given filenames on the specified channel.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`clear_queue` If True, then the queue is cleared, making these files the files that are played when the currently playing file finishes. If it is False, then these files are placed at the back of the queue. In either case, if no music is playing these files begin playing immediately.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.sound.set_pan": ["internal", "function", "(pan, delay, channel='music')", "", "", "Sets the pan of this channel.\n\n`pan` A number between -1 and 1 that control the placement of the audio. If this is -1, then all audio is sent to the left channel. If it's 0, then the two channels are equally balanced. If it's 1, then all audio is sent to the right ear.\n\n`delay` The amount of time it takes for the panning to occur.\n\n`channel` The channel the panning takes place on, defaulting to the music channel."], "renpy.sound.set_pause": ["internal", "function", "(value, channel='music')", "", "", "Sets the pause flag for `channel` to `value`. If True, the channel will pause, otherwise it will play normally."], "renpy.sound.set_queue_empty_callback": ["internal", "function", "(callback, channel='music')", "", "", "This sets a callback that is called when the queue is empty. This callback is called when the queue first becomes empty, and at least once per interaction while the queue is empty.\n\nThe callback is called with no parameters. It can queue sounds by calling renpy.music.queue with the appropriate arguments. Please note that the callback may be called while a sound is playing, as long as a queue slot is empty."], "renpy.sound.set_volume": ["internal", "function", "(volume, delay=0, channel='music')", "", "", "Sets the volume of this channel, as a fraction of the volume of the mixer controlling the channel.\n\n`volume` This is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for the channel.\n\n`delay` It takes delay seconds to change/fade the volume from the old to the new value. This value is persisted into saves, and participates in rollback.\n\n`channel` The channel to be set"], "renpy.sound.stop": ["internal", "function", "(channel='music', fadeout=None)", "", "", "This stops the music that is currently playing, and dequeues all queued music. If fadeout is None, the music is faded out for the time given in config.fadeout_audio, otherwise it is faded for fadeout seconds.\n\nThis sets the last queued file to None.\n\n`channel` The channel to stop the sound on.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fadeout_audio. This is ignored if the channel is paused."]}, "internal": {"ADVCharacter": ["internal", "class", "(name=NotSet, kind=None, **properties)", "", "", "The character object contains information about a character. When passed as the first argument to a say statement, it can control the name that is displayed to the user, and the style of the label showing the name, the text of the dialogue, and the window containing both the label and the dialogue.\n\nInitialize self. See help(type(self)) for accurate signature."], "ADVSpeaker": ["internal", "class", "(name=NotSet, kind=None, **properties)", "", "", "The character object contains information about a character. When passed as the first argument to a say statement, it can control the name that is displayed to the user, and the style of the label showing the name, the text of the dialogue, and the window containing both the label and the dialogue.\n\nInitialize self. See help(type(self)) for accurate signature."], "Action": ["internal", "class", "(*args, **kwargs)", "", "", "This can be passed to the clicked method of a button or hotspot. It is called when the action is selected. The other methods determine if the action should be displayed insensitive or disabled.\n\nInitialize self. See help(type(self)) for accurate signature."], "AddToSet": ["internal", "class", "(set, value)", "", "Action", "Adds `value` to `set`.\n\n`set` The set to add to. This may be a Python set or list, in which case the value is appended to the list. `value` The value to add or append.\n\nInitialize self. See help(type(self)) for accurate signature."], "Alpha": ["internal", "function", "()", "", "", ""], "AlphaBlend": ["internal", "function", "(control, old, new, alpha=False)", "", "", "This transition uses a `control` displayable (almost always some sort of animated transform) to transition from one displayable to another. The transform is evaluated. The `new` displayable is used where the transform is opaque, and the `old` displayable is used when it is transparent.\n\n`alpha` If true, the image is composited with what's behind it. If false, the default, the image is opaque and overwrites what's behind it."], "AlphaDissolve": ["transitions", "function", "(control, delay=0.0, *, reverse=False, mipmap=None)", "", "", "Returns a transition that uses a control displayable (almost always some sort of animated transform) to transition from one screen to another. The transform is evaluated. The new screen is used where the transform is opaque, and the old image is used when it is transparent.\n\n`control` The control transform.\n\n`delay` The time the transition takes, before ending.\n\n`reverse` If true, the alpha channel is reversed. Opaque areas are taken from the old image, while transparent areas are taken from the new image.\n\n`mipmap` When the dissolve will be scaled to less than half its natural size, this can be set to True. This will cause mipmaps to be generated, which will make the dissolve consume more GPU resources, but will reduce artifacts. See :propref:`mipmap` for more information."], "AlphaMask": ["internal", "class", "(child, mask, **properties)", "", "", "This displayable takes its colors from `child`, and its alpha channel from the multiplication of the alpha channels of `child` and `mask`. The result is a displayable that has the same colors as `child`, is transparent where either `child` or `mask` is transparent, and is opaque where `child` and `mask` are both opaque.\n\nThe `child` and `mask` parameters may be arbitrary displayables. The size of the AlphaMask is the size of `child`.\n\nNote that this takes different arguments from :func:`im.AlphaMask`, which uses the mask's red channel.\n\nInitialize self. See help(type(self)) for accurate signature."], "AnimatedValue": ["internal", "class", "(value=0.0, range=1.0, delay=1.0, old_value=None)", "", "Action", "This animates a value, taking `delay` seconds to vary the value from `old_value` to `value`.\n\n`value` The value itself, a number.\n\n`range` The range of the value, a number.\n\n`delay` The time it takes to animate the value, in seconds. Defaults to 1.0.\n\n`old_value` The old value. If this is None, then the value is taken from the AnimatedValue we replaced, if any. Otherwise, it is initialized to `value`.\n\nInitialize self. See help(type(self)) for accurate signature."], "Animation": ["internal", "function", "(*args, **kwargs)", "", "", ""], "At": ["internal", "function", "(d, *args)", "", "", "Given a displayable `d`, applies each of the transforms in `args` to it. The transforms are applied in left-to-right order, so that the outermost transform is the rightmost argument.\n```\ntransform birds_transform:\n xpos -200\n linear 10 xpos 800\n pause 20\n repeat\n\n image birds = At(\\birds.png\\, birds_transform)\n \n```"], "Attribute": ["internal", "class", "(group, attribute, image=None, default=False, group_args={}, **kwargs)", "", "", "This is used to represent a layer of an LayeredImage that is controlled by an attribute. A single attribute can control multiple layers, in which case all layers corresponding to that attribute will be displayed.\n\n`group` A string giving the group the attribute is part of. This may be None, in which case a group with the same name as the attribute is created.\n\n`attribute` A string giving the name of the attribute.\n\n`image` If not None, this should be a displayable that is displayed when this attribute is shown.\n\n`default` If True, and no other attribute for the group is selected, this attribute is.\n\nThe following keyword arguments are also known:\n\n`at` A transform or list of transforms that are applied to the image.\n\n`if_all` An attribute or list of attributes. The displayable is only shown if all of these are showing.\n\n`if_any` An attribute or list of attributes. if not empty, the displayable is only shown if any of these are showing.\n\n`if_not` An attribute or list of attributes. The displayable is only shown if none of these are showing.\n\nOther keyword arguments are interpreted as transform properties. If any are present, a transform is created that wraps the image. (For example, pos=(100, 200) can be used to offset the image by 100 pixels horizontally and 200 vertically.)\n\nIf the `image` parameter is omitted or None, and the LayeredImage has been given the `image_format` parameter, the image_format is used to generate an image filename.\n\nInitialize self. See help(type(self)) for accurate signature."], "AudioData": ["internal", "class", "(data, filename)", "", "", "This class wraps a bytes object containing audio data, so it can be passed to the audio playback system. The audio data should be contained in some format Ren'Py supports. (For examples RIFF WAV format headers, not unadorned samples.)\n\n`data` A bytes object containing the audio file data.\n\n`filename` A synthetic filename associated with this data. It can be used to suggest the format `data` is in, and is reported as part of error messages.\n\nOnce created, this can be used wherever an audio filename is allowed. For example\n```\ndefine audio.easteregg = AudioData(b'...', 'sample.wav')\n play sound easteregg\n\nInitialize self. See help(type(self)) for accurate signature.\n```"], "AudioPositionValue": ["internal", "class", "(channel='music', update_interval=0.1)", "", "Action", "A value that shows the playback position of the audio file playing in `channel`.\n\n`update_interval` How often the value updates, in seconds.\n\nInitialize self. See help(type(self)) for accurate signature."], "Bar": ["internal", "class", "(range=None, value=None, width=None, height=None, changed=None, adjustment=None, step=None, page=None, bar=None, style=None, vertical=False, replaces=None, hovered=None, unhovered=None, released=None, **properties)", "", "", "Implements a bar that can display an integer value, and respond to clicks on that value.\n\nInitialize self. See help(type(self)) for accurate signature."], "BarValue": ["internal", "class", "(*args, **kwargs)", "", "", "This can be passed to the value method of bar and hotbar.\n\nInitialize self. See help(type(self)) for accurate signature."], "Borders": ["internal", "class", "(left, top, right, bottom, pad_left=0, pad_top=0, pad_right=0, pad_bottom=0)", "", "", "This object provides border size and tiling information to a :func:`Frame`. It can also provide padding information that can be supplied to the :propref:`padding` style property of a window or frame.\n\n`left`, `top`, `right`, `bottom` These provide the size of the insets used by a frame, and are added to the padding on each side. They should be zero or a positive integer.\n\n`pad_left`, `pad_top`, `pad_right`, `pad_bottom` These are added to the padding on each side, and may be positive or negative. (For example, if `left` is 5 and `pad_left` is -3, the final padding is 2.)\n\nThe padding information is supplied via a field:\n\n.. attribute\n```\npadding\n\n This is a four-element tuple containing the padding on each of the\n four sides.\n\nInitialize self. See help(type(self)) for accurate signature.\n```"], "BrightnessMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to change the brightness of an image, while leaving the Alpha channel alone.\n\n`value` The amount of change in image brightness. This should be a number between -1 and 1, with -1 the darkest possible image and 1 the brightest.\n\nInitialize self. See help(type(self)) for accurate signature."], "Button": ["internal", "class", "(child=None, style='button', clicked=None, hovered=None, unhovered=None, action=None, role=None, time_policy=None, keymap={}, alternate=None, selected=None, sensitive=None, keysym=None, alternate_keysym=None, **properties)", "", "", "A window that has padding and margins, and can place a background behind its child. `child` is the child added to this displayable. All other properties are as for the :ref:`Window` screen language statement.\n\nInitialize self. See help(type(self)) for accurate signature."], "Call": ["internal", "class", "(label, *args, **kwargs)", "", "Action", "Ends the current statement, and calls `label`, given as a string. Arguments and keyword arguments are passed to :func:`renpy.call`.\n\nInitialize self. See help(type(self)) for accurate signature."], "Camera": ["internal", "class", "(layer='master')", "", "", "Instances of this class can be used with point_to to point at the location of the camera for a particular layer.\n\n`layer` The name of the layer.\n\nInitialize self. See help(type(self)) for accurate signature."], "CaptureFocus": ["internal", "class", "(name='default')", "", "Action", "If a displayable is focused when this action is run, the rectangle containing that displayable is stored with the name `name`. This rectangle can then be retrieved with the :func:`GetFocusRect` action, or the `focus` property of the :ref:`sl-nearrect` displayable.\n\nIf no displayable is focused, the previous capture with that name is removed.\n\n`name` The name of the focus rectangle to store. This should be a string. The name \\tooltip\\ is special, as it is automatically captured when the tooltip is changed.\n\nInitialize self. See help(type(self)) for accurate signature."], "Character": ["internal", "function", "(name=..., kind=adv, **args)", "", "", "Creates and returns a Character object, which controls the look and feel of dialogue and narration.\n\n`name` If a string, the name of the character for dialogue. When `name` is None, display of the name is omitted, as for narration. If no name is given, the name is taken from `kind`, and otherwise defaults to None.\n\n`kind` The Character to base this Character off of. When used, the default value of any argument not supplied to this Character is the value of that argument supplied to ``kind``. This can be used to define a template character, and then copy that character with changes.\n\n This can also be a namespace, in which case the 'character' variable in the namespace is used as the kind.\n\n**Linked Image.** An image tag may be associated with a Character. This allows a say statement involving this character to display an image with the tag, and also allows Ren'Py to automatically select a side image to show when this character speaks.\n\n`image` A string giving the image tag that is linked with this character.\n\n**Voice Tag.** If a voice tag is assign to a Character, the voice files that are associated with it, can be muted or played in the preference screen.\n\n`voice_tag` A String that enables the voice file associated with the Character to be muted or played in the 'voice' channel.\n\n**Prefixes and Suffixes.** These allow a prefix and suffix to be applied to the name of the character, and to the text being shown. This can be used, for example, to add quotes before and after each line of dialogue.\n\n`what_prefix` A string that is prepended to the dialogue being spoken before it is shown.\n\n`what_suffix` A string that is appended to the dialogue being spoken before it is shown.\n\n`who_prefix` A string that is prepended to the name of the character before it is shown.\n\n`who_suffix` A string that is appended to the name of the character before it is shown.\n\n**Changing Name Display.** These options help to control the display of the name.\n\n`dynamic` If true, then `name` should either be a string containing a Python expression, a function, or a callable object. If it's a string, That string will be evaluated before each line of dialogue, and the result used as the name of the character. Otherwise, the function or callable object will be called with no arguments before each line of dialogue, and the return value of the call will be used as the name of the character.\n\n**Controlling Interactions.** These options control if the dialogue is displayed, if an interaction occurs, and the mode that is entered upon display.\n\n`condition` If given, this should be a string containing a Python expression. If the expression is false, the dialogue does not occur, as if the say statement did not happen.\n\n`interact` If true, the default, an interaction occurs whenever the dialogue is shown. If false, an interaction will not occur, and additional elements can be added to the screen.\n\n`advance` If true, the default, the player can click to advance through the statement, and other means of advancing (such as skip and auto-forward mode) will also work. If false, the player will be unable to move past the say statement unless an alternate means (such as a jump hyperlink or screen) is provided.\n\n`mode` A string giving the mode to enter when this character speaks. See the section on :ref:`modes ` for more details.\n\n`callback` A function that is called when events occur while the character is speaking. See the section on :ref:`character-callbacks` for more information.\n\n**Click-to-continue.** A click-to-continue indicator is displayed once all the text has finished displaying, to prompt the user to advance.\n\n`ctc` A displayable to use as the click-to-continue indicator, unless a more specific indicator is used.\n\n`ctc_pause` A displayable to use a the click-to-continue indicator when the display of text is paused by the {p} or {w} text tags.\n\n`ctc_timedpause` A displayable to use a the click-to-continue indicator when the display of text is paused by the {p=} or {w=} text tags. When None, this takes its default from `ctc_pause`, use ``Null()`` when you want a `ctc_pause` but no `ctc_timedpause`.\n\n`ctc_position` Controls the location of the click-to-continue indicator. If ``\\nestled\\``, the indicator is displayed as part of the text being shown, immediately after the last character. ``\\nestled-close\\`` is similar, except a break is not allowed between the text and the CTC indicator. If ``\\fixed\\``, a new screen containing the CTC indicator is shown, and the position style properties of the CTC displayable are used to position the CTC indicator.\n\n**Screens.** The display of dialogue uses a :ref:`screen `. These arguments allow you to select that screen, and to provide arguments to it.\n\n`screen` The name of the screen that is used to display the dialogue.\n\nKeyword arguments beginning with ``show_`` have the prefix stripped off, and are passed to the screen as arguments. For example, the value of ``show_myflag`` will become the value of the ``myflag`` variable in the screen. (The ``myflag`` variable isn't used by default, but can be used by a custom say screen.)\n\nOne show variable is, for historical reasons, handled by Ren'Py itself:\n\n`show_layer` If given, this should be a string giving the name of the layer to show the say screen on.\n\n**Styling Text and Windows.** Keyword arguments beginning with ``who_``, ``what_``, and ``window_`` have their prefix stripped, and are used to :doc:`style