diff --git a/.gitignore b/.gitignore index 8cc277d..f830bfc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build /.idea -/.gradle \ No newline at end of file +/.gradle +/buildSrc/.gradle \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f2b09d9..9d25b33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,39 @@ Changelog === +Version 26.0.2 +--- +* Fixed missing klibs for apple artifacts. + +Version 26.0.1 +--- +* Fixed sources.jar build (regression after 25.0.0) + +Version 26.0.0 +--- +* Added new experimental annotation: `@NotNullByDefault` + +Version 25.0.0 +--- +* Added Kotlin Multiplatform artifact (multiplatform-annotations). +* Removed Java 5 artifact. + +Version 24.1.0 +--- +* `@CheckReturnValue` is not experimental anymore. + +Version 24.0.1 +--- +* Added `@Documented` annotation where it would be useful. + +Version 24.0.0 +--- +* Added new annotation: `@CheckReturnValue`. + +Version 23.1.0 +--- +* Added new annotation: `@ApiStatus.Obsolete`. + Version 23.0.0 --- * Added new annotations: `@BlockingExecutor` and `@NonBlockingExecutor`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 887ec81..63c649c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,13 +16,12 @@ During the new version release: * Push changes * Use 'Draft a new release' button on the Releases GitHub page; select the added tag; copy it to the release title field; copy the added changelog section into the release details field. - -### Java 5 package -We generate annotations-java5 package for legacy clients. This package cannot use ElementType.TYPE_USE -which appeared in Java 8. The Java 5 package is generated from common/src sources -stripping the `, ElementType.TYPE_USE` substring from files. -So no Java features that appear in Java 6 or higher except `ElementType.TYPE_USE` should be used in common/src. -New TYPE_USE annotations should be created in java8/src. They will not appear in annotations-java5 package. + +### Multiplatform artifact +We publish two artifacts: annotations (annotations written in Java) and multiplatform-annotations (same annotations +written in Kotlin Multiplatform). Please check that changes are done both in java-annotations and +multiplatform-annotations folders. Jvm artifact of multiplatform-annotations should be a drop-in replacement of +java-annotations, every annotation added to java-annotations should also be added to multiplatform-annotations. ### Backward compatibility All the changes should be backward compatible i.e. you can only add new annotations and new elements into existing annotation. diff --git a/KEYS b/KEYS new file mode 100644 index 0000000..dc78d6d --- /dev/null +++ b/KEYS @@ -0,0 +1,102 @@ +pub rsa3072/0x1F7A8F87B9D8F501 2021-03-15 [C] [expires: 2026-03-15] + Key fingerprint = B46D C71E 03FE EB7F 89D1 F249 1F7A 8F87 B9D8 F501 +uid [ full ] Download +sub rsa3072/0x7D1BE4480B61E2A7 2021-03-15 [E] [expires: 2023-03-15] +sub rsa3072/0xC2148900BCD3C2AF 2021-03-15 [S] [expires: 2023-03-15] +sub rsa3072/0xCFF46EE3C17E53E9 2021-03-15 [A] [expires: 2023-03-15] + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQGNBGBP58sBDADYRZmxLOkqrz0QZ/yESRpv7IeHGLqDE1a8QfFtFb14MJCLSAAS +3nMD6Szi9mEjEqYdJURRcMjbUBhePgbhzGa3FYkjAB8lj6IKbu+ogCwVm1S8+caZ +C6HNP1CIefa1wQgi/6FNWEBKbKefUr/DoG1fBAWUvTPC2BjiYOHDaU1xFWwhF3Np +p0gEoK2KNgGgy/aSCi9Rb1M1ynPF7CcY8vKpAo6YfJpoNnput3t5FoF0uPnIac0F +gikw6Iz8knUoYeqW2MTKNBxgQrtS+Ji1J0EgzT2Nq1SBMPfmq4/h1+XOQweWY/NR +GNQTzcR3v+FkLkqCIaywcWUMXkhFXB8U3TdPa4bCEbFlP/AUkEw0X/obxm0isshU +w7MRMPoBXR3FkEApkxB+bFptY3ZbBYhu5PCf4FWBE8+FkYEJ31IS+nABC2u9Jcav +o5TqVd0y4e8VZ2qz18ez3j2G+nVthHz2OZ3AdEmq60K6iD57RY0H8zQK7xeEe3Ye +VoRmpZdS8Eyk2aEAEQEAAbQhRG93bmxvYWQgPGRvd25sb2FkQGpldGJyYWlucy5j +b20+iQHUBBMBCgA+AhsBBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAFiEEtG3HHgP+ +63+J0fJJH3qPh7nY9QEFAmBQ+RIFCQlnEscACgkQH3qPh7nY9QEwcQwA03ycUi3u +IiKMqSPJBj6hYG2PFXHodMLr6naZe1g6i+pZGftB40frpMl9d4uX1HISi2HzwH1I +NO8Ii+xhTk5uhECzRLkI+XXT4jTN3qNw1xmh034pUy+YqtflxGudMHjbhxMH19oR +m1gf0Nto3CVd4rqYaiI9bZqr04zkzUFewK8YWHoL+hnWl33iKx5gvWfvhyVknSnx +62bvtY0XZxpsfvQzas/KjL8VKnBTRewgtxtRYHpIuAwm+8E5R7HQUS3lf/HY9UEf +dmJRpEAZIODLO7F83TlE/6SPtUwtwjIx1Owan4zLqDS2Qb+SV3jMEXoR/3MCNbLf +wc2GMjSG3soeZ7prhzjIvgyW/2wpkZyZLqBevnsvmuDl+RpEQfSPfZLoTo0trDAm +4alV5ophiZLOdPD5d6wbrw505NdRZ2a8pCPV/UhRm7A1AhPfElobSOKtyW5TiXvz +pdJa9DG15eF4freZ+OPpo0epL8BBZ0tKu9Xi45My+Tss3Udwywks57GJiQGzBBAB +CgAdFiEEvawfF9kxnqb4ihZ5Yahr/e7qo0UFAmBQ+ecACgkQYahr/e7qo0UJWwwA +jkeDWvruJj6AJd6/2Glb59sd4H2abFo8DF61CIbzgURxZcGrbYZJC9RhKvHxXlW3 +GINZ933uVARNnnsrbSkhoSHiQS+hEz2Y+TqB/5bgcz7QDRvJmxWUxl/Jre47h+DM +eACxDZzc2NwW6Q9XCwUzvlEfl4/Ibp1i3drPGW1Em6wr56vkhoRanTBzObFIOdE6 +X23rom22JxGiLik70nrQmUpLor9sBKwCHj9TKOeiRTEhAerzWgFZpgTgVFflgCoq +c42aML5g0cE8hEDfHE4wm+55cT7hzjsCfetj4xN6g3t1M4d2m3XsZeBdQtX2M0Ng +fBquptMN4TcKjrh/pIYGdyjpxHiJvXAr0XW6j8hYpqwzkstbcaeuIzSZKxmD/mEp +pZzOL4V9tPsdsfjOTyDjbi8piywq35AujYO/gc/et/ewiwm1VqfLEkp52wuNuGRC +ojRoIUIthHojE6JNnvaNuuP9Tu9t72uv/+tTWoYIesykhA1t258hlCwZ7u69d0NZ +uQGNBGBP7DkBDADP875KFzMkAWge9UcuQyZnXPBE+pOJKTcBiUDcOYweHD+xmZvb +QX77JTsh8HHoV7lYDQKavDNkKyydlAY1rvIMakOArYLp3mJ9LEFZnhPXMAYw1gW3 +h6jAc9cWyUnVqGb8Quy1psQQ7BYkywgplSVEeEe3M+N0IYNGqcKUtOeBj5ce1eCc +2Nt8+6iwT1dX0sMmFm5w6fObFHCbWNXMC3hkJFuTufihfUjYkN1TYEexraCKB0nL +OPVifhFHa5qmibNlphBwNiaBBt9ABzFW6chIGhdDzxUdVcxFU+z3rFbLUm526vJq +oJgbfokI0JGAG/8MgXVXxSz7diLBm0/dnvS0NSLcPceYKcw9M3oI0vEBINe+irBp +qUSdVbNWnKT3wfClk1e6tCH9YdX8ZlOs4jh0xHtJL8yEk3LDtEYR2IjDRzYR2PIE +qp1lIj0s0nNub0HyfP+23pvbrkFJblIALLF5VYZ+vGhxNdRcZXRleAEx2Oa0RiBi +ZEHxSQuDDyyK92EAEQEAAYkBvAQYAQoAJhYhBLRtxx4D/ut/idHySR96j4e52PUB +BQJgT+w5AhsMBQkDwmcAAAoJEB96j4e52PUByakL/Rg+AN3xldnTgcZss8Ox5CY8 +j+SuOs5TtHd4x3amKrn7e0IlVJe0Kqh9IVAbFHXLI68XMb5dG3jxyh1H9ZY3FvDF +jYwGVMfizhtdJXkQBHLdrd9gaIhXZEJ/ik94PNqJbdCzx5JSQ88dMldg7nNQ9SVy +hXx+ynAqzxgclpBaqJFGk3t2laZMa+cevimCd2XH49TC4bwqGSsFXP7IlzxBATHm +ud/uy+SaR8DHuSlP0lzYpQCwh+Bd7nCK1X6w+zEDjvrNOSgO7mNHdrEyKJMJgqvV +Tp2cI75w5fumfUSdvPJ4L7LDYK7GKM7sKhVY16k6P8Oo/ZCq28Nex0qAuenNkDQq +zGDGrxToDhr4K7oEClFar3JV5uAEL77qFTDmr3F/p+RJhA84GyKBQpf3LskVK5Ga +sKmrn3BomvoPXlZElYOcQsUPj1rsu/RPDxAmRzCDsz0VV3qxwvBvUUY2ZPfIXyHm +HkrOqR4QyNoSf4cfDSNm/X6azd4OvJy8f/H2ouZSarkBjQRgT+xWAQwA0zSyL6bN +pTTKzByZ6BXO6VGWhbqXAZSJg/KGEqZta+wkjQQazToWiByIVb7imJl3sXavK6Kd +Pi0uBkQ2yPBsXmHZGRQz532avivuvllM7WknK/g6DJAQAq9Kti19CMPaW2B9UsIV +QP+Mdc5VsiNPebv4pcq6DciIaUoNik0YeZ7lyjbMJe0ykdlUHQNKZpCf+RrW7tZ1 +p5bvJyxxa0Lile4c4Nncjbr8K3tVRQEm8dBvdxjz/XvMCx/uxJGx2sw0m35nx1J4 +F3talMAEmybJfnd7OAKP+cduqSoNywKbM4v0sUZDsv5sBUF+hMbJK2B9cFiOjvS9 +koqrxpC4hz6iJZJDeA25q8fD2Q0iEbys9ROUhW+8McVzZ/gvLrsw7OUzoHkDsZxY +qj/7+CqqpN+Al3Rj/AwPb8GieZBKgPSaqEzdFZ7F2ljMrr3KC3USNBJzd0JZ3ami +7F6h/sThqDqzC2TASDkkdHSnEDbUN15m2jP5x9EVh/ei42lwwwet2KFLABEBAAGJ +A3IEGAEKACYWIQS0bcceA/7rf4nR8kkfeo+Hudj1AQUCYE/sVgIbAgUJA8JnAAHA +CRAfeo+Hudj1AcD0IAQZAQoAHRYhBDP9S/0zVUY0BT1zwMIUiQC808KvBQJgT+xW +AAoJEMIUiQC808KvLiEL/RD5ksGyNWhPu1qoP+PSl5myWniQgVKb5IxR83scsoUU +4w+qlp5CNGMpFznQexdL48Ai8B6khpUO3Si9kU/ZzvKLKf0xI+oIbUX+FaTvR9Ko +KTGWu3I705pFSshmo8lqZLMfpbxt8Gkz3SkZghRDRggkHcJKxV0OISZMxTwZS/+x +TIQW+rp/GKBRKpMEjcKnw4n0hYHSBI1B5Bi5gG9A5GFebc2w7GoxjrwFDoDs7jRY +ICF0zn32tKPLs1r4W3oMcG0x6pGM4A+VGde7iTYf6d7bDMYIETSkWHujLtxVR+zI +sguJxoOuL7Zy68EA5QmuJTsdIwuHNC1ZwcKJ1Xvb1CgeYys+MaDQrtEYHelq7QJ2 +iFvz8e71udzdTZqs9+NMTkQ+9pemab24nj4nGcUW78WI9M5vVaI6+ETygAYEQ+A3 +iny7Al8UehNdWK/pqND4bXDplewHdwf+tgAElFP5MrPhU6icdqY4L1kN8AJql0St +PGdgMiQiWw59oBUBiIZC3eoRDACOuvlWSDyRXXSyJUz1EwDOr0Zy2GpcFrxkP7Bq +SDtLdyLHuSWRdFamZie6hHV3eOS3eOG50K+6jFU5jm0UYAWQ1mD1vj7m9hmEskAY +/i8zYqqoV1NNp0L7VzB/1s/RvayTYubaHdbGtM7t8/LB2t3mQ/BfJKZy+2y5x8Bh +0EvTMQ3ULUdtKLXcxyaKXJTOw3lV8ea1AEitQOI4I//c5FPBTiV1rcFE2zrRK9m4 +FkFVluy7j7aWDkMpzAGjAzMhSv+HAiyG+shtVuaHrFw2QO8egolm/UXCHBCdW9B9 +4Z3xS0Lo67ICTA2Rn9LN0452g6ZrUhPM2yVlehcXSEHJpQjTpvWXqEys25cVgIC3 +TzeZ6mMv0sQ9kBTxsev3zpVU1hU+49nWL6MZAW8KMH+9preIiWDBflLIEo4e0Z3A +rJxYKSpNWBWQIxzGMA2HWmGRZ3yZcBG9qgq3eFepd3qbHZ/eHfHcNKN4t8rfVqZA +e4qvdb44XdL7p0sZcFVmpIJMDdO5AY0EYE/tVQEMAOBDLdK+QNaTjaedK/pK74ub +Nqpz/WTMLtSEHLLonv9d8bvMo5nn5U9XJEC2YytA1RiZ6scDrVzMa6s7JVg7jtNS +1fgpcGNvt1ZgwaZvC77YPprb9rRkoZWtSdmvW+6QJY3quc2D3CYHI01I+tbJXt3H +lhOsbsP09H+/LDyWxb/Ni9LOH/faRrXxJk8M/6hd9Ch9A/DQdwIqB+NmZLEuXrtq +c0RWXrl9OAAcvfVjM+yvNZMTIdQ3a+03tlzGJji1eE6bhjIEGEQOj/KO58JVzh9m +lWi5RqAdYLmnsYfWfJJ1F2vlBRZZfOPedpUVYN0cGwSnUtYTCx1o0mTVsPaBNObs +ccRssjuTFrZ5uF0TXLktYQcoQkWtS0kT3C7UuxqSyrYNyL2/6OD0JxenQnrITvgO +YUoCTzAEwIZWhGJ1qFuf62wtaHLfVcNocP7rEjr1js0074K9yxEufy6tmuyhz/7f +oN4YYSZvFcnvQ+1SpdR+6RJIqnLvYD6NMCH5nlsFIwARAQABiQG8BBgBCgAmFiEE +tG3HHgP+63+J0fJJH3qPh7nY9QEFAmBP7VUCGyAFCQPCZwAACgkQH3qPh7nY9QES +0AwAvGVX4JgCXCI8YEhs4/jsyb5NZn4700PhD13lrviV53FKyjltO8wnC09sHKoG +2WdyJYL43ZklmK5Q4u39qXhUqy8TPsRh6WHhiN8TWstNM+ZEhsFksttKG1lhJRMi +cfoz7OpAtWoGHE523legeqVGy9yFTnk+18HfVL2Y1lVCqQWmWzXJOeP9Miz6IRss +HyDY3Wq1R6BqtlM0MJUIaZxetnrXYe5PH0yGDGxrdOF+ISAPfxfQ0V+PXxML2eK1 +SfROGfrdFQn9DkX+T4kXxkezjF73jnxafSK/28HUoX2+GHcbjjxyWxxYJoQb5VBV +2epUWrS5UjDh+mFzXEyEuqRbbN+u17Xr6I2VaRFb6xst6nwB09dqKk1rBdkUmsiJ +IfUszW0k3fohg5X/JazEdd9eUYwaz99gEaJiNpjyfJ9jWjHOzmgGoekYN8Za/jiC +ps9gyGgn9XKZS+KIr7wHX3Le60hNcwk0jtKf7W3F1PkvH8pKMWGmNhg9a3HXnE2l +2ony +=N9Af +-----END PGP PUBLIC KEY BLOCK----- diff --git a/README.md b/README.md index 0c3b2b9..bb5eb45 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,19 @@ interpreted by IDEs and static analysis tools to improve code analysis. ## Using the annotations The annotations are published on [Maven Central](https://repo1.maven.org/maven2/org/jetbrains/annotations/). To add a dependency -using gradle write the following in the `build.gradle` file: +using gradle write the following in the +`build.gradle` file (Groovy DSL) ``` dependencies { - compileOnly 'org.jetbrains:annotations:23.0.0' + compileOnly 'org.jetbrains:annotations:26.0.2' +} + +``` + +or in the `build.gradle.kts` file (Kotlin DSL) +``` +dependencies { + compileOnly("org.jetbrains:annotations:26.0.2") } ``` @@ -25,11 +34,11 @@ To add a dependency using Maven, write the following in `pom.xml`: org.jetbrains annotations - 23.0.0 + 26.0.2 provided ``` -`annotations` artifact requires JDK 1.8 or higher. If your project is compiled using JDK 1.5, 1.6 or 1.7 you can use -the `annotations-java5` artifact instead. Please note that `annotations-java5` artifact is considered a legacy, so - most of new annotations will appear in the `annotations` artifact only. +`annotations` artifact requires JDK 1.8 or higher. If your project is compiled using JDK 1.5, 1.6 or 1.7 you can use +the `annotations-java5` artifact instead. Please note that `annotations-java5` artifact is considered a legacy +and will receive no further updates. The latest version of `annotations-java5` is 24.1.0. diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 94aaab4..0000000 --- a/build.gradle +++ /dev/null @@ -1,150 +0,0 @@ -import jetbrains.sign.GpgSignSignatoryProvider - -/* - * Copyright 2000-2021 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -buildscript { - repositories { - maven { url "https://packages.jetbrains.team/maven/p/jcs/maven" } - } - dependencies { - classpath 'com.jetbrains:jet-sign:38' - } -} - -plugins { - id "io.github.gradle-nexus.publish-plugin" version "1.1.0" -} - -ext.projectVersion = projectVersion -ext.publishingUser = System.getenv('PUBLISHING_USER') -ext.publishingPassword = System.getenv('PUBLISHING_PASSWORD') -if (ext.publishingPassword == null) { - ext.projectVersion = ext.projectVersion + '-SNAPSHOT' -} -println "##teamcity[setParameter name='java.annotations.version' value='$projectVersion']" - -allprojects { - group 'org.jetbrains' - version rootProject.ext.projectVersion -} - -nexusPublishing { - repositories { - sonatype { - username = rootProject.ext.publishingUser - password = rootProject.ext.publishingPassword - } - } -} - -subprojects { - apply plugin: 'java' - apply plugin: 'maven-publish' - apply plugin: 'signing' - - repositories { - mavenCentral() - } -} - -project(':java5').archivesBaseName = 'annotations-java5' -project(':java8').archivesBaseName = 'annotations' - -configure([project(':java5'), project(':java8')]) { - dependencies { - compile project(':module-info') - } - - task mainJar(type: Jar) { - into ("META-INF/versions/9", { - from (project(':module-info').sourceSets.main.output, { - // Skip extra files from common sources compiled with Java 9 target - include("module-info.class") - }) - }) - manifest.attributes("Multi-Release": true) - duplicatesStrategy = DuplicatesStrategy.FAIL - } - - task sourceJar(type: Jar) { - into ("META-INF/versions/9", { - from project(':module-info').sourceSets.main.java - }) - duplicatesStrategy = DuplicatesStrategy.FAIL - baseName = archivesBaseName + '-sources' - } - - task javadocJar(type: Jar) { - duplicatesStrategy = DuplicatesStrategy.FAIL - from javadoc - } - - artifacts { - archives mainJar, sourceJar - } - - publishing { - publications { - mavenJava(MavenPublication) { - group rootProject.group - version rootProject.ext.projectVersion - artifactId archivesBaseName - artifact mainJar - artifact sourceJar { - classifier 'sources' - } - artifact javadocJar { - classifier 'javadoc' - } - pom.withXml { - asNode().children().last() + { - resolveStrategy = DELEGATE_FIRST - name 'JetBrains Java Annotations' - description 'A set of annotations used for code inspection support and code documentation.' - url 'https://github.com/JetBrains/java-annotations' - scm { - url 'https://github.com/JetBrains/java-annotations' - connection 'scm:git:git://github.com/JetBrains/java-annotations.git' - developerConnection 'scm:git:ssh://github.com:JetBrains/java-annotations.git' - } - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'https://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - developers { - developer { - id 'JetBrains' - name 'JetBrains Team' - organization 'JetBrains' - organizationUrl 'https://www.jetbrains.com' - } - } - } - } - - } - } - } - - signing { - sign publishing.publications - signatories = new GpgSignSignatoryProvider() - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..9c94600 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,321 @@ +import jetbrains.sign.GpgSignSignatoryProvider +import org.gradle.jvm.tasks.Jar +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import plugins.publishing.* + +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +buildscript { + repositories { + maven { url = uri("https://packages.jetbrains.team/maven/p/jcs/maven") } + } + dependencies { + classpath("com.jetbrains:jet-sign:38") + } +} + +repositories { + mavenCentral() +} + +plugins { + kotlin("multiplatform") version "1.9.22" + id("io.github.gradle-nexus.publish-plugin") version "1.1.0" + `maven-publish` + signing + java +} + +var projectVersion = project.findProperty("projectVersion") as String +val publishingUser: String? = System.getenv("PUBLISHING_USER") +val publishingPassword: String? = System.getenv("PUBLISHING_PASSWORD") +if (publishingPassword == null) { + projectVersion += "-SNAPSHOT" +} +println("##teamcity[setParameter name='java.annotations.version' value='$projectVersion']") + +// https://github.com/gradle/gradle/issues/847 +group = "org.jetbrains.proto" +version = projectVersion + +kotlin { + androidNativeArm32() + androidNativeArm64() + androidNativeX86() + androidNativeX64() + + iosArm64() + iosX64() + iosSimulatorArm64() + + js(IR) { + browser {} + } + + jvmToolchain(8) + jvm { + compilations.all { + kotlinOptions.jvmTarget = "1.8" + } + withJava() + } + + linuxArm64() + linuxX64() + + macosX64() + macosArm64() + + mingwX64() + + tvosArm64() + tvosX64() + tvosSimulatorArm64() + + @Suppress("OPT_IN_USAGE") + wasmJs { + browser() + } + @Suppress("OPT_IN_USAGE") + wasmWasi { + nodejs() + } + + watchosArm32() + watchosArm64() + watchosDeviceArm64() + watchosX64() + watchosSimulatorArm64() + + sourceSets { + val commonMain by getting { + dependencies { + compileOnly("org.jetbrains.kotlin:kotlin-stdlib") + } + } + + val nonJvmMain by creating { + dependsOn(commonMain) + } + } + + targets.onEach { + if (it.platformType != KotlinPlatformType.jvm && it.platformType != KotlinPlatformType.common) { + it.compilations.getByName("main").defaultSourceSet.dependsOn(sourceSets.getByName("nonJvmMain")) + } + } + + targets.all { + compilations.all { + compilerOptions.configure { + optIn.add("kotlin.ExperimentalMultiplatform") + freeCompilerArgs.add("-Xexpect-actual-classes") + } + } + } +} + +// from https://github.com/Kotlin/kotlinx-datetime/blob/bc8adee2b9e3659e8e1c38fc09f3a4a1bdf85276/core/build.gradle.kts +tasks { + val compileJavaModuleInfo by registering(JavaCompile::class) { + val moduleName = "org.jetbrains.annotations" // this module's name + val compileKotlinJvm by getting(KotlinCompile::class) + val compileJava by getting(JavaCompile::class) + val sourceDir = file("src/jvmMain/moduleInfo/") + val targetDir = compileKotlinJvm.destinationDirectory.map { it.dir("../moduleInfo/") } + + // Use a Java 11 compiler for the module info. + javaCompiler.set(project.javaToolchains.compilerFor { languageVersion.set(JavaLanguageVersion.of(11)) }) + + // Always compile kotlin and java classes before the module descriptor. + dependsOn(compileKotlinJvm) + dependsOn(compileJava) + + // Add the module-info source file. + source(sourceDir) + + // Set the task outputs and destination dir + outputs.dir(targetDir) + destinationDirectory.set(targetDir) + + // Configure JVM compatibility + sourceCompatibility = JavaVersion.VERSION_1_9.toString() + targetCompatibility = JavaVersion.VERSION_1_9.toString() + + // Set the Java release version. + options.release.set(9) + + // Ignore warnings about using 'requires transitive' on automatic modules. + // not needed when compiling with recent JDKs, e.g. 17 + options.compilerArgs.add("-Xlint:-requires-transitive-automatic") + + // Patch the compileKotlinJvm output classes into the compilation so exporting packages works correctly. + options.compilerArgs.addAll(listOf("--patch-module", "$moduleName=${compileJava.destinationDirectory.get()}")) + + // Use the classpath of the compileKotlinJvm task. + // Also ensure that the module path is used instead of classpath. + classpath = compileKotlinJvm.libraries + modularity.inferModulePath.set(true) + } + + // Configure the JAR task so that it will include the compiled module-info class file. + val jvmJar by existing(Jar::class) { + manifest { + attributes("Multi-Release" to true) + } + from(compileJavaModuleInfo.map { it.destinationDirectory }) { + into("META-INF/versions/9/") + } + } + + val javaOnlySourcesJar by creating(Jar::class) { + from(kotlin.sourceSets["jvmMain"].kotlin) { + into("") + } + archiveClassifier.set("sources") + } + + val allMetadataJar by existing(Jar::class) { + archiveClassifier.set("common") + } + + val javadocJar by creating(Jar::class) { + from(javadoc) + archiveClassifier.set("javadoc") + } +} + +nexusPublishing { + repositories { + sonatype { + username.set(publishingUser) + password.set(publishingPassword) + } + } +} + +configurations { + create("javaOnlySourcesElements") { + copyAttributes(configurations.findByName("jvmSourcesElements")!!.attributes, attributes) + } + + create("javadocElements") { + attributes { + attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category::class.java, Category.DOCUMENTATION)) + attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, project.objects.named(DocsType::class.java, DocsType.JAVADOC)) + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, Usage.JAVA_RUNTIME)) + } + } +} + +artifacts { + add("javaOnlySourcesElements", tasks.getByName("javaOnlySourcesJar")) + add("javadocElements", tasks.getByName("javadocJar")) +} + +publishing { + val artifactBaseName = base.archivesName.get() + configureMultiModuleMavenPublishing { + val rootModule = module("rootModule") { + mavenPublication { + artifactId = artifactBaseName + groupId = "org.jetbrains" + configureKotlinPomAttributes(packaging = "jar") + } + variant("metadataApiElements") { suppressPomMetadataWarnings() } + variant("metadataSourcesElementsFromJvm") { + name = "metadataSourcesElements" + configuration { + // to avoid clash in Gradle 8+ with metadataSourcesElements configuration with the same attributes + isCanBeConsumed = false + } + attributes { + copyAttributes(from = project.configurations["metadataSourcesElements"].attributes, to = this) + } + artifact(tasks["sourcesJar"]) { + classifier = "sources-common" + } + } + variant("jvmApiElements") + variant("jvmRuntimeElements") { + configureVariantDetails { mapToMavenScope("runtime") } + } + variant("javaOnlySourcesElements") + variant("javadocElements") + } + val targetModules = kotlin.targets.filter { it.targetName != "jvm" && it.targetName != "metadata" }.map { target -> + val targetName = target.targetName + module("${targetName}Module") { + mavenPublication { + artifactId = "$artifactBaseName-$targetName" + groupId = "org.jetbrains" + configureKotlinPomAttributes(packaging = "klib") + } + variant("${targetName}ApiElements") + if (configurations.findByName("${targetName}RuntimeElements") != null) { + variant("${targetName}RuntimeElements") + } + variant("${targetName}SourcesElements") + } + } + + // Makes all variants from accompanying artifacts visible through `available-at` + rootModule.include(*targetModules.toTypedArray()) + } +} + +fun MavenPublication.configureKotlinPomAttributes( + packaging: String, +) { + pom { + this.packaging = packaging + name.set("JetBrains Java Annotations") + description.set("A set of annotations used for code inspection support and code documentation.") + url.set("https://github.com/JetBrains/java-annotations") + scm { + url.set("https://github.com/JetBrains/java-annotations") + connection.set("scm:git:git://github.com/JetBrains/java-annotations.git") + developerConnection.set("scm:git:ssh://github.com:JetBrains/java-annotations.git") + } + licenses { + license { + name.set("The Apache Software License, Version 2.0") + url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") + } + } + developers { + developer { + id.set("JetBrains") + name.set("JetBrains Team") + organization.set("JetBrains") + organizationUrl.set("https://www.jetbrains.com") + } + } + } +} + +signing { + sign(publishing.publications) + signatories = GpgSignSignatoryProvider() +} + +tasks.register("signAll") { + dependsOn(tasks.withType()) +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..cc02e63 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} diff --git a/buildSrc/src/main/kotlin/plugins/publishing/CustomVariantPublishingDsl.kt b/buildSrc/src/main/kotlin/plugins/publishing/CustomVariantPublishingDsl.kt new file mode 100644 index 0000000..0a65dee --- /dev/null +++ b/buildSrc/src/main/kotlin/plugins/publishing/CustomVariantPublishingDsl.kt @@ -0,0 +1,206 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +package plugins.publishing + +import org.gradle.api.Project +import org.gradle.api.artifacts.ConfigurablePublishArtifact +import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ConfigurationContainer +import org.gradle.api.attributes.Attribute +import org.gradle.api.attributes.AttributeContainer +import org.gradle.api.component.* +import org.gradle.api.internal.component.SoftwareComponentInternal +import org.gradle.api.internal.component.UsageContext +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.extra +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.newInstance + +private open class ComponentsFactoryAccess +@javax.inject.Inject +constructor(val factory: SoftwareComponentFactory) + +val Project.componentFactory: SoftwareComponentFactory + get() = findProperty("_componentFactory") as SoftwareComponentFactory? + ?: objects.newInstance().factory + .also { project.extra["_componentFactory"] = it } + +fun copyAttributes(from: AttributeContainer, to: AttributeContainer) { + // capture type argument T + fun copyOneAttribute(from: AttributeContainer, to: AttributeContainer, key: Attribute) { + val value = checkNotNull(from.getAttribute(key)) + to.attribute(key, value) + } + for (key in from.keySet()) { + copyOneAttribute(from, to, key) + } +} + +class MultiModuleMavenPublishingConfiguration { + val modules = mutableMapOf() + + class Module(val name: String) { + val variants = mutableMapOf() + val includes = mutableSetOf() + + class Variant( + val configurationName: String + ) { + var name: String = configurationName + val attributesConfigurations = mutableListOf Unit>() + fun attributes(code: AttributeContainer.() -> Unit) { + attributesConfigurations += code + } + + val artifactsWithConfigurations = mutableListOf Unit>>() + fun artifact(file: Any, code: ConfigurablePublishArtifact.() -> Unit = {}) { + artifactsWithConfigurations += file to code + } + + val configurationConfigurations = mutableListOf Unit>() + fun configuration(code: Configuration.() -> Unit) { + configurationConfigurations += code + } + + val variantDetailsConfigurations = mutableListOf Unit>() + fun configureVariantDetails(code: ConfigurationVariantDetails.() -> Unit) { + variantDetailsConfigurations += code + } + + var suppressPomMetadataWarnings: Boolean = false + fun suppressPomMetadataWarnings() { suppressPomMetadataWarnings = true } + } + + val mavenPublicationConfigurations = mutableListOf Unit>() + fun mavenPublication(code: MavenPublication.() -> Unit) { + mavenPublicationConfigurations += code + } + + fun variant(fromConfigurationName: String, code: Variant.() -> Unit = {}): Variant { + val variant = variants.getOrPut(fromConfigurationName) { Variant(fromConfigurationName) } + variant.code() + return variant + } + + fun include(vararg modules: Module) { + includes.addAll(modules) + } + } + + fun module(name: String, code: Module.() -> Unit): Module { + val module = modules.getOrPut(name) { Module(name) } + module.code() + return module + } +} + +fun Project.configureMultiModuleMavenPublishing(code: MultiModuleMavenPublishingConfiguration.() -> Unit) { + val publishingConfiguration = MultiModuleMavenPublishingConfiguration() + publishingConfiguration.code() + + val components = publishingConfiguration + .modules + .mapValues { (_, module) -> project.createModulePublication(module) } + + val componentsWithExternals = publishingConfiguration + .modules + .filter { (_, module) -> module.includes.isNotEmpty() } + .mapValues { (moduleName, module) -> + val mainComponent = components[moduleName] ?: error("Component with name $moduleName wasn't created") + val externalComponents = module.includes + .map { components[it.name] ?: error("Component with name ${it.name} wasn't created") } + .toSet() + ComponentWithExternalVariants(mainComponent, externalComponents) + } + + // override some components with items from componentsWithExternals + val mergedComponents = components + componentsWithExternals + + val publicationsContainer = project.extensions.getByType().publications + for ((componentName, component) in mergedComponents) { + publicationsContainer.create(componentName) { + from(component) + val module = publishingConfiguration.modules[componentName]!! + module.mavenPublicationConfigurations.forEach { configure -> configure() } + module.variants.values.filter { it.suppressPomMetadataWarnings }.forEach { + suppressPomMetadataWarningsFor(it.name) + } + } + } +} + + +fun Project.createModulePublication(module: MultiModuleMavenPublishingConfiguration.Module): SoftwareComponent { + val component = componentFactory.adhoc(module.name) + module.variants.values.forEach { addVariant(component, it) } + + val newNames = module.variants.map { it.key to it.value.name }.filter { it.first != it.second }.toMap() + return if (newNames.isNotEmpty()) { + ComponentWithRenamedVariants(newNames, component as SoftwareComponentInternal) + } else { + component + } +} + +fun Project.addVariant(component: AdhocComponentWithVariants, variant: MultiModuleMavenPublishingConfiguration.Module.Variant) { + val configuration: Configuration = configurations.getOrCreate(variant.configurationName) + configuration.apply { + isCanBeResolved = false + + variant.attributesConfigurations.forEach { configure -> attributes.configure() } + } + + for ((artifactNotation, configure) in variant.artifactsWithConfigurations) { + artifacts.add(configuration.name, artifactNotation) { + configure() + } + } + + for (configure in variant.configurationConfigurations) { + configuration.apply(configure) + } + + component.addVariantsFromConfiguration(configuration) { + variant.variantDetailsConfigurations.forEach { configure -> configure() } + } +} + +private class RenamedVariant(val newName: String, context: UsageContext) : UsageContext by context { + override fun getName(): String = newName +} + +private class ComponentWithRenamedVariants( + val newNames: Map, + private val base: SoftwareComponentInternal +): SoftwareComponentInternal by base { + + override fun getName(): String = base.name + override fun getUsages(): Set { + return base.usages.map { + val newName = newNames[it.name] + if (newName != null) { + RenamedVariant(newName, it) + } else { + it + } + }.toSet() + } +} + +private class ComponentWithExternalVariants( + private val mainComponent: SoftwareComponent, + private val externalComponents: Set +) : ComponentWithVariants, SoftwareComponentInternal { + override fun getName(): String = mainComponent.name + + override fun getUsages(): Set = (mainComponent as SoftwareComponentInternal).usages + + override fun getVariants(): Set = externalComponents +} + +fun ConfigurationContainer.getOrCreate(name: String): Configuration = findByName(name) ?: create(name) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c84cb92..309be6e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,10 @@ # limitations under the License. # -projectVersion=23.0.0 -#JDK_5= \ No newline at end of file +projectVersion=26.0.2 +kotlin.code.style=official +kotlin.mpp.stability.nowarn=true +kotlin.stdlib.default.dependency=false +kotlin.internal.mpp.createDefaultMultiplatformPublications=false +kotlin.native.ignoreIncorrectDependencies=true +kotlin.mpp.applyDefaultHierarchyTemplate=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09ddbca..c59c9b4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -19,4 +19,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip diff --git a/java5/build.gradle b/java5/build.gradle deleted file mode 100644 index dc57369..0000000 --- a/java5/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000-2021 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -sourceCompatibility = 1.5 - -def jdk5Home = System.getenv("JDK_5") -if (hasProperty("JDK_5")) { - jdk5Home = JDK_5 -} -if (jdk5Home == null) { - throw new GradleException('JDK_5 environment variable is not defined. It must point to any JDK that ' + - 'is capable to compile with Java 5 target (Any JDK version from 1.5 to 1.8)') -} - -def generatedSourcesDir = "${buildDir}/generated/" - -sourceSets { - generated { - java.srcDir generatedSourcesDir - } -} - -task generateSrc(type: Copy) { - from project(':common').sourceSets.main.java - into generatedSourcesDir - filter { line -> line.replaceAll(", ElementType.TYPE_USE", "")} -} - -compileJava { - options.fork = true - options.forkOptions.executable = "$jdk5Home/bin/javac" - dependsOn(generateSrc) - source sourceSets.generated.java -} - -mainJar { - from sourceSets.main.output -} - -sourceJar { - dependsOn(generateSrc) - from sourceSets.generated.java -} - -javadoc { - source = [sourceSets.generated.java] -} - diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock new file mode 100644 index 0000000..5a16699 --- /dev/null +++ b/kotlin-js-store/yarn.lock @@ -0,0 +1,1995 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.1.tgz#621270c02c0a5d4f4669eb1caa9723c91cf201de" + integrity sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/json-schema@*", "@types/json-schema@^7.0.8": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@*", "@types/node@>=10.0.0": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@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@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@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@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.1.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== + +"@webpack-cli/info@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== + +"@webpack-cli/serve@^2.0.3": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn@^8.7.1, acorn@^8.8.2: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +body-parser@^1.19.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.14.5: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001587: + version "1.0.30001612" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz#d34248b4ec1f117b70b24ad9ee04c90e0b8a14ae" + integrity sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^3.5.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +date-format@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.4, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.668: + version "1.4.746" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz#787213e75f6c7bccb55dfe8b68170555c548d093" + integrity sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + +enhanced-resolve@^5.13.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + +envinfo@^7.7.3: + version "7.12.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" + integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.7: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.0.0: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +format-util@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +karma-chrome-launcher@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz#eb9c95024f2d6dfbb3748d3415ac9b381906b9a9" + integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz#b01d73f8f688f533bcc8f5d273d43458e13b5488" + integrity sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA== + dependencies: + graceful-fs "^4.2.10" + +karma-webpack@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.2.tgz#a983f874cee6f35990c4b2dcc3d274653714de8e" + integrity sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ== + dependencies: + "@colors/colors" "1.5.0" + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.4.1" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.4.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" + integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" + rfdc "^1.3.0" + streamroller "^3.1.5" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.3, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.20.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.1.1, schema-utils@^3.1.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +socket.io-adapter@~2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006" + integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg== + dependencies: + debug "~4.3.4" + ws "~8.11.0" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.4.1: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8" + integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +source-map-js@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-loader@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" + integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== + dependencies: + abab "^2.0.6" + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" + integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.7: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.26.0: + version "5.30.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.4.tgz#62b4d16a819424e6317fd5ceffb4ee8dc769803a" + integrity sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + +ua-parser-js@^0.7.30: + version "0.7.37" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832" + integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@^1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +watchpack@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-cli@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.0.tgz#abc4b1f44b50250f2632d8b8b536cfe2f6257891" + integrity sha512-a7KRJnCxejFoDpYTOwzm5o21ZXMaNqtRlvS183XzGDUPRdVEzJNImcQokqYZ8BNTnk9DkKiuWxw75+DCCoZ26w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.1.0" + "@webpack-cli/info" "^2.0.1" + "@webpack-cli/serve" "^2.0.3" + colorette "^2.0.14" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.82.0: + version "5.82.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.82.0.tgz#3c0d074dec79401db026b4ba0fb23d6333f88e7d" + integrity sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@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" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.13.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.2" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +which@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/settings.gradle b/settings.gradle index c4e6b4c..5c973a0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,6 +14,4 @@ * limitations under the License. */ -rootProject.name = 'annotations-parent' - -include 'common', 'java5', 'java8', 'module-info' \ No newline at end of file +rootProject.name = 'annotations' diff --git a/java8/build.gradle b/src/commonMain/kotlin/org/intellij/lang/annotations/Identifier.kt similarity index 66% rename from java8/build.gradle rename to src/commonMain/kotlin/org/intellij/lang/annotations/Identifier.kt index 9394239..3195ba2 100644 --- a/java8/build.gradle +++ b/src/commonMain/kotlin/org/intellij/lang/annotations/Identifier.kt @@ -13,19 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.intellij.lang.annotations -sourceCompatibility = 1.8 - -mainJar { - from sourceSets.main.output - from project(':common').sourceSets.main.output -} - -sourceJar { - from sourceSets.main.java - from project(':common').sourceSets.main.java -} - -javadoc { - source = [sourceSets.main.java, project(':common').sourceSets.main.java] -} +@Pattern("\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*") +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Identifier() diff --git a/src/commonMain/kotlin/org/intellij/lang/annotations/Language.kt b/src/commonMain/kotlin/org/intellij/lang/annotations/Language.kt new file mode 100644 index 0000000..b8c91cf --- /dev/null +++ b/src/commonMain/kotlin/org/intellij/lang/annotations/Language.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +import org.jetbrains.annotations.NonNls + +/** + * Specifies that an element of the program represents a string that is a source code on a specified language. + * Code editors may use this annotation to enable syntax highlighting, code completion and other features + * inside the literals that assigned to the annotated variables, passed as arguments to the annotated parameters, + * or returned from the annotated methods. + * + * + * This annotation also could be used as a meta-annotation, to define derived annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent Java methods: + * + *
+ * @Language(value = "JAVA", prefix = "class X{", suffix = "}")
+ * @interface JavaMethod {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.ANNOTATION_CLASS +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Language( + /** + * Language name like "JAVA", "HTML", "XML", "RegExp", etc. + * The complete list of supported languages is not specified. However, at least the following languages should be + * recognized: + * + * * "JAVA" - Java programming language + * * "HTML" - HTML + * * "XML" - XML + * * "RegExp" - Regular expression supported by Java [java.util.regex.Pattern] + * + */ + @get:NonNls val value: String, + /** + * A constant prefix that is assumed to be implicitly added before the literal. + * This helps to apply proper highlighting when the program element represents only a part of the valid program. + * E.g. if the method parameter accepts a Java method, it could be annotated as + * `void methodProcessor(@Language(value="JAVA", prefix="class X {", suffix="}")`. + */ + @get:NonNls val prefix: String = "", + /** + * A constant suffix that is assumed to be implicitly added after the literal. See [.prefix] for details. + */ + @get:NonNls val suffix: String = "" +) \ No newline at end of file diff --git a/src/commonMain/kotlin/org/intellij/lang/annotations/Pattern.kt b/src/commonMain/kotlin/org/intellij/lang/annotations/Pattern.kt new file mode 100644 index 0000000..9b0e461 --- /dev/null +++ b/src/commonMain/kotlin/org/intellij/lang/annotations/Pattern.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +import org.jetbrains.annotations.NonNls + +/** + * Specifies that an element of the program represents a string that must completely match given regular expression. + * Code editors may use this annotation to report errors if the literals that assigned to the annotated variables, + * passed as arguments to the annotated parameters, or returned from the annotated methods, do not match the supplied + * pattern. + * + * + * This annotation also could be used as a meta-annotation, to define other annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent UUIDs: + * + *
+ * @Pattern("[\\dA-Fa-f]{8}-[\\dA-Fa-f]{4}-[\\dA-Fa-f]{4}-[\\dA-Fa-f]{4}-[\\dA-Fa-f]{12}")
+ * @interface UUID {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + * + * @see RegExp + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.ANNOTATION_CLASS +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Pattern( + /** + * A regular expression that matches all the valid string literals that assigned to the annotated variables, + * passed as arguments to the annotated parameters, or returned from the annotated methods. + */ + @get:Language("RegExp") @get:NonNls val value: String +) diff --git a/src/commonMain/kotlin/org/intellij/lang/annotations/RegExp.kt b/src/commonMain/kotlin/org/intellij/lang/annotations/RegExp.kt new file mode 100644 index 0000000..10b4c1b --- /dev/null +++ b/src/commonMain/kotlin/org/intellij/lang/annotations/RegExp.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +import org.jetbrains.annotations.NonNls + +/** + * Specifies that an element of the program represents a string that is a regular expression text supported + * by [java.util.regex.Pattern]. + * Code editors may use this annotation to enable syntax highlighting, code completion and other features + * inside the literals that assigned to the annotated variables, passed as arguments to the annotated parameters, + * or returned from the annotated methods. + * + * @see Language + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.ANNOTATION_CLASS +) +@Language("RegExp") +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class RegExp( + /** + * A constant prefix that is assumed to be implicitly added before the regular expression. + */ + @get:NonNls val prefix: String = "", + /** + * A constant suffix that is assumed to be implicitly added after the regular expression. + */ + @get:NonNls val suffix: String = "" +) diff --git a/src/commonMain/kotlin/org/intellij/lang/annotations/Subst.kt b/src/commonMain/kotlin/org/intellij/lang/annotations/Subst.kt new file mode 100644 index 0000000..62ac347 --- /dev/null +++ b/src/commonMain/kotlin/org/intellij/lang/annotations/Subst.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +/** + * Specifies the replacement value for non-constant variables and method return values. + * This may help static analyzers to properly parse the concatenation of several values + * which is used in @[Language] or [Pattern] context. + * + * + * Example: + *
+ * @Subst("Tahoma")
+ * final String font = new JLabel().getFont().getName();
+ *
+ * @Language("HTML")
+ * String message = "<html><span style='font: " + font + "; font-size:smaller'>"
+ * + ... + "</span></html>";
+
* + * + * + * Here the parser assumes that when `font` appears in the concatenation its value is `"Tahoma"`, + * so it can continue parsing the concatenation. + * + * + * @see Language + * + * @see Pattern + */ +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.VALUE_PARAMETER +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Subst(val value: String) diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/ApiStatus.kt b/src/commonMain/kotlin/org/jetbrains/annotations/ApiStatus.kt new file mode 100644 index 0000000..6ae5e94 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/ApiStatus.kt @@ -0,0 +1,224 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Set of annotations which can be used to specify status of API Element. + * + * @since 18.0.0 + */ +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect class ApiStatus private constructor() { + /** + * + * Indicates that a public API of the annotated element (class, method or field) is not in stable state yet. It may be renamed, changed or + * even removed in a future version. This annotation refers to API status only, it doesn't mean that the implementation has + * an 'experimental' quality. + * + * + * It's safe to use an element marked with this annotation if the usage is located in the same sources codebase as the declaration. However, + * if the declaration belongs to an external library such usages may lead to problems when the library will be updated to another version. + * + * + * If a package is marked with this annotation, all its containing classes are considered experimental. + * Subpackages of this package are not affected and should be marked independently. + * + * + * If a type is marked with this annotation, all its members are considered experimental, but its inheritors are not. + * + * + * If a method is marked with this annotation, overriding methods are not considered experimental. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class Experimental() + + /** + * Indicates that the annotated element (class, method, field, etc) must not be considered as a public API. It's made visible to allow + * usages in other packages of the declaring library, but it must not be used outside of that library. Such elements + * may be renamed, changed or removed in future versions. + * + * + * If a package is marked with this annotation, all its containing classes are considered internal. + * Subpackages of this package are not affected and should be marked independently. + * + * + * If a type is marked with this annotation, all its members are considered internal, but its inheritors are not. + * + * + * If a method is marked with this annotation, overriding methods are not considered internal. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class Internal() + + /** + * + * Indicates that a public API of the annotated element (class, method or field) is subject to deprecation in a future version. + * It's a weaker variant of [Deprecated] annotation. + * The annotated API is not supposed to be used in the new code because a better API exists, + * but it's permitted to postpone the migration of the existing code, therefore the usage is not considered a warning. + * + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class Obsolete( + /** + * Specifies in which version the API became obsolete. + */ + val since: String = "" + ) + + /** + * + * Indicates that a public API of the annotated element (class, method or field) is subject to removal in a future version. + * It's a stronger variant of [Deprecated] annotation. + * + * + * Since many tools aren't aware of this annotation it should be used as an addition to `@Deprecated` annotation + * or `@deprecated` Javadoc tag only. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class ScheduledForRemoval( + /** + * Specifies in which version the API will be removed. + */ + val inVersion: String = "" + ) + + /** + * + * Indicates that the annotated element firstly appeared in the specified version of the library, so the code using that element + * won't be compatible with older versions of the library. This information may be used by IDEs and static analysis tools. + * This annotation can be used instead of '@since' Javadoc tag if it's needed to keep that information in *.class files or if you need + * to generate them automatically. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class AvailableSince( + /** + * Specifies a version where the annotation API firstly appeared. + */ + val value: String + ) + + /** + * + * Indicates that the annotated API class, interface or method **must not be extended, implemented or overridden**. + * + * + * API class, interface or method may not be marked `final` because it is extended by classes of the declaring library + * but it is not supposed to be extended outside the library. Instances of classes and interfaces marked with this annotation + * may be cast to an internal implementing class in the library code, leading to `ClassCastException` + * if a different implementation is provided by a client. + * + * + * New abstract methods may be added to such classes and interfaces in new versions of the library breaking compatibility + * with a client's implementations. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class NonExtendable() + + /** + * + * Indicates that the annotated method is part of SPI (Service Provider Interface), which is intended to be + * **only implemented or overridden** but not called by clients of the declaring library. + * If a class or interface is marked with this annotation it means that all its methods can be only overridden. + * + * + * Although there is a standard mechanism of `protected` methods, it is not applicable to interface's methods. + * Also, API method may be made `public` to allow calls only from different parts of the declaring library but not outside it. + * + * + * Signatures of such methods may be changed in new versions of the library in the following steps. Firstly, a method with new signature + * is added to the library delegating to the old method by default. Secondly, all clients implement the new method and remove + * implementations of the old one. This leads to compatibility breakage with code that calls the methods directly. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class OverrideOnly() +} \ No newline at end of file diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/Async.kt b/src/commonMain/kotlin/org/jetbrains/annotations/Async.kt new file mode 100644 index 0000000..720c4fb --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/Async.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Helper annotations for asynchronous computation. + * Used for example in IntelliJ IDEA's debugger for async stacktraces feature. + * + * @author egor + */ +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect class Async private constructor() { + /** + * Indicates that the marked method schedules async computation. + * Scheduled object is either `this`, or the annotated parameter value. + */ + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.VALUE_PARAMETER + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class Schedule() + + /** + * Indicates that the marked method executes async computation. + * Executed object is either `this`, or the annotated parameter value. + * This object needs to match with the one annotated with [Schedule] + */ + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.VALUE_PARAMETER + ) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class Execute() +} diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/Blocking.kt b/src/commonMain/kotlin/org/jetbrains/annotations/Blocking.kt new file mode 100644 index 0000000..10c77d2 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/Blocking.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated method is inherently blocking and should not be executed in a non-blocking context. + * + * + * When this annotation is used on a `class`, all the methods declared by the annotated class are considered + * *blocking*. + * + * + * Apart from documentation purposes this annotation is intended to be used by static analysis tools to validate against + * probable runtime errors and element contract violations. + * + * @since 22.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.CLASS +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Blocking() diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/BlockingExecutor.kt b/src/commonMain/kotlin/org/jetbrains/annotations/BlockingExecutor.kt new file mode 100644 index 0000000..1a72180 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/BlockingExecutor.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated executor (CoroutineContext, Scheduler) + * allows blocking methods execution. + * + * + * If a given executor does not allow blocking calls, [NonBlockingExecutor] should be used. + * + * + * + * Example 1 (Kotlin coroutines): + *
`
+ * class BlockingExampleService {
+ * val dispatcher: @BlockingExecutor CoroutineContext
+ * get() { ... }
+ *
+ * suspend fun foo() {
+ * val result = withContext(dispatcher) {
+ * blockingBuzz() // no IDE warning
+ * }
+ * }
+ *
+ * @Blocking fun blockingBuzz() { ... }
+ * }
+`
* + * + * + * + * Example 2 (Java with Reactor framework): + *
`
+ * class BlockingExampleService {
+ * private static final @BlockingExecutor Scheduler blockingScheduler =
+ * Schedulers.newBoundedElastic(4, 10, "executor");
+ *
+ * public Flux foo(Flux urls) {
+ * return urls.publishOn(blockingScheduler)
+ * .map(url -> blockingBuzz(url));  // no IDE warning
+ * }
+ *
+ * @Blocking
+ * private String blockingBuzz(String url) { ... }
+ * }
+`
* + * + * @see Blocking + * + * @see NonBlocking + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class BlockingExecutor() diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/CheckReturnValue.kt b/src/commonMain/kotlin/org/jetbrains/annotations/CheckReturnValue.kt new file mode 100644 index 0000000..8abec13 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/CheckReturnValue.kt @@ -0,0 +1,42 @@ +package org.jetbrains.annotations + +/** + * Specifies that the method is impure and that its return value must be used. + * + * + * For pure methods (annotated with `@Contract(pure = true)`), + * it's implied that the resulting value is important, + * so this annotation would be redundant. + * + * + * Some impure methods have side effects and still require the return value to be used. + * For example, [java.io.InputStream.read] + * returns the number of bytes actually stored in the byte array. + * Without checking the return value, it's impossible to say how many bytes were actually read. + * + * + * This annotation should not be used if the return value of the method + * provides only *additional* information. + * For example, the main purpose of [java.util.Collection.add] + * is to modify the collection, and the return value is only interesting + * when adding an element to a set, to see if the set already contained that element before. + * + * + * When used on a type, the annotation applies to all methods that do not return `void`. + * + * + * When used on a package, the annotation applies to all types of that package. + * + * @see Contract.pure + */ +@MustBeDocumented +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.CLASS, + AnnotationTarget.FILE +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class CheckReturnValue() diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/Contract.kt b/src/commonMain/kotlin/org/jetbrains/annotations/Contract.kt new file mode 100644 index 0000000..046cfa6 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/Contract.kt @@ -0,0 +1,113 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies some aspects of the method behavior depending on the arguments. Can be used by tools for advanced data flow analysis. + * Note that this annotation just describes how the code works and doesn't add any functionality by means of code generation. + * + * + * + * Method contract has the following syntax:

+ *
`contract ::= (clause ';')* clause
+ * clause ::= args '->' effect
+ * args ::= ((arg ',')* arg )?
+ * arg ::= value-constraint
+ * value-constraint ::= '_' | 'null' | '!null' | 'false' | 'true'
+ * effect ::= value-constraint | 'fail' | 'this' | 'new' | 'param'`
+ * + * + * + * The constraints denote the following:

+ * + * * _ - any value + * * null - null value + * * !null - a value statically proved to be not-null + * * true - true boolean value + * * false - false boolean value + * + * + * The additional return values denote the following:

+ * + * * fail - the method throws an exception, if the arguments satisfy argument constraints + * * new - (supported in IntelliJ IDEA since version 2018.2) the method returns a non-null new object which is distinct from any other object existing in the heap prior to method execution. If method is also pure, then we can be sure that the new object is not stored to any field/array and will be lost if method return value is not used. + * * this - (supported in IntelliJ IDEA since version 2018.2) the method returns its qualifier value (not applicable for static methods) + * * param1, param2, ... - (supported in IntelliJ IDEA since version 2018.2) the method returns its first (second, ...) parameter value + * + * Examples: + * + * + * `@Contract("_, null -> null")` - the method returns null if its second argument is null

+ * `@Contract("_, null -> null; _, !null -> !null")` - the method returns null if its second argument is null and not-null otherwise

+ * `@Contract("true -> fail")` - a typical `assertFalse` method which throws an exception if `true` is passed to it

+ * `@Contract("_ -> this")` - the method always returns its qualifier (e.g. [StringBuilder.append]).

+ * `@Contract("null -> fail; _ -> param1")` - the method throws an exception if the first argument is null, + * otherwise it returns the first argument (e.g. `Objects.requireNonNull`).

+ * `@Contract("!null, _ -> param1; null, !null -> param2; null, null -> fail")` - the method returns the first non-null argument, + * or throws an exception if both arguments are null (e.g. `Objects.requireNonNullElse` in Java 9).

+ * + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Contract( + /** + * Contains the contract clauses describing causal relations between call arguments and the returned value + */ + @get:NonNls val value: String = "", + /** + * Specifies that the annotated method has no visible side effects. + * If its return value is not used, removing its invocation won't + * affect program state and change the semantics, unless method call throws an exception. + * Exception throwing is not considered to be a side effect. + * + * + * Method should not be marked as pure if it does not produce a side-effect by itself, + * but it could be used to establish a happens-before relation between an event in + * another thread, so changes performed in another thread might become visible in current thread + * after this method invocation. Examples of such methods are [Object.wait], [Thread.join] + * or [AtomicBoolean.get]. On the other hand, some synchronized methods like [java.util.Vector.get] + * could be marked as pure, because the purpose of synchronization here is to keep the collection internal integrity + * rather than to wait for an event in another thread. + * + * + * "Invisible" side effects (such as logging) that don't affect the "important" program semantics are allowed.



+ * + * + * This annotation may be used for more precise data flow analysis, and + * to check that the method's return value is actually used in the call place. + */ + val pure: Boolean = false, + /** + * Contains a specifier which describes which method parameters can be mutated during the method call. + * + * + * + * + * + * +
Possible values:
"this"Method mutates the receiver object, and doesn't mutates any objects passed as arguments (cannot be applied for static method or constructor)
"param"Method mutates the sole argument and doesn't mutate the receiver object (if applicable)
"param1", "param2", ...Method mutates the N-th argument
"this,param1"Method mutates the receiver and first argument and doesn't mutate any other arguments
* + * + * @return a mutation specifier string + */ + @get:NonNls val mutates: String = "" +) diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/Debug.kt b/src/commonMain/kotlin/org/jetbrains/annotations/Debug.kt new file mode 100644 index 0000000..340b580 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/Debug.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +import org.intellij.lang.annotations.Language + +/** + * @since 18.0.0 + */ +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect class Debug private constructor() { + /** + * Allows to change the presentation of an object in debuggers + */ + @Target(AnnotationTarget.CLASS) + @Retention(AnnotationRetention.BINARY) + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + annotation class Renderer( + /** + * Expression to be evaluated and used as the textual representation of the object.

+ * `this` refers to the class instance being presented + */ + @get:Language( + value = "JAVA", + prefix = "class Renderer{String \$text(){return ", + suffix = ";}}" + ) @get:NonNls val text: String = "", + /** + * Expression to be evaluated to obtain an array of object's children.

+ * Usually the result is an array of elements in a collection, or an array of entries in a map.

+ * `this` refers to the class instance being presented + */ + @get:Language( + value = "JAVA", + prefix = "class Renderer{Object[] \$childrenArray(){return ", + suffix = ";}}" + ) @get:NonNls val childrenArray: String = "", + /** + * Expression to be evaluated to check if the object has any children at all.

+ * This should work faster than [.childrenArray] and return boolean.

+ * `this` refers to the class instance being presented + */ + @get:Language( + value = "JAVA", + prefix = "class Renderer{boolean \$hasChildren(){return ", + suffix = ";}}" + ) @get:NonNls val hasChildren: String = "" + ) +} diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/MustBeInvokedByOverriders.kt b/src/commonMain/kotlin/org/jetbrains/annotations/MustBeInvokedByOverriders.kt new file mode 100644 index 0000000..975f348 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/MustBeInvokedByOverriders.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * The annotation should be applied to overridable non-abstract method + * and indicates that all the overriders must invoke this method via + * superclass method invocation expression. The static analysis tools + * may report a warning if overrider fails to invoke this method. + * + * @since 20.0.0 + */ +@MustBeDocumented +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) +@Retention( + AnnotationRetention.BINARY +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class MustBeInvokedByOverriders() diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/Nls.kt b/src/commonMain/kotlin/org/jetbrains/annotations/Nls.kt new file mode 100644 index 0000000..168a559 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/Nls.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies that an element of the program is a user-visible string which needs to be localized. + * This annotation is intended to be used by localization tools for + * detecting strings which should be reported as requiring localization. + * + * + * + * This annotation also could be used as a meta-annotation, to define derived annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent dialog titles: + * + *
+ * @Nls(capitalization = Capitalization.Title)
+ * @interface DialogTitle {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + * + * @see NonNls + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.CLASS, + AnnotationTarget.TYPE, + AnnotationTarget.FILE +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Nls(val capitalization: Capitalization = Capitalization.NotSpecified) { + @kotlin.jvm.ImplicitlyActualizedByJvmDeclaration + enum class Capitalization { + NotSpecified, + + /** + * e.g. This Is a Title + */ + Title, + + /** + * e.g. This is a sentence + */ + Sentence + } +} diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/NonBlocking.kt b/src/commonMain/kotlin/org/jetbrains/annotations/NonBlocking.kt new file mode 100644 index 0000000..4484d28 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/NonBlocking.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated method is inherently non-blocking and can be executed in a non-blocking context. + * + * + * When this annotation is used on a `class`, all the methods declared by the annotated class are considered + * *non-blocking*. + * + * + * Apart from documentation purposes this annotation is intended to be used by static analysis tools to validate against + * probable runtime errors and contract violations. + * + * @since 22.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.CLASS +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class NonBlocking() diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/NonBlockingExecutor.kt b/src/commonMain/kotlin/org/jetbrains/annotations/NonBlockingExecutor.kt new file mode 100644 index 0000000..59b4472 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/NonBlockingExecutor.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated executor (CoroutineContext, Scheduler) + * does not allow blocking methods execution. + * + * + * + * If a given executor allows blocking calls, [BlockingExecutor] should be used. + * + * + * + * Example 1 (Kotlin coroutines): + *
`
+ * class NonBlockingExampleService {
+ * val dispatcher: @NonBlockingExecutor CoroutineContext
+ * get() { ... }
+ *
+ * suspend fun foo() {
+ * val result = withContext(dispatcher) {
+ * blockingBuzz() // IDE warning: `Possibly blocking call in non-blocking context`
+ * }
+ * }
+ *
+ * @Blocking fun blockingBuzz() { ... }
+ * }
+`
* + * + * + * + * Example 2 (Java with Reactor framework): + *
`
+ * class NonBlockingExampleService {
+ * private static final @NonBlockingExecutor Scheduler operationsScheduler =
+ * Schedulers.newParallel("parallel");
+ *
+ * public Flux foo(Flux urls) {
+ * return urls.publishOn(operationsScheduler)
+ * .filter(url -> blockingBuzz(url) != null);  // IDE warning: `Possibly blocking call in non-blocking context`
+ * }
+ *
+ * @Blocking
+ * private String blockingBuzz(String url) { ... }
+ * }
+`
* + * @see Blocking + * + * @see NonBlocking + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class NonBlockingExecutor() diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/NonNls.kt b/src/commonMain/kotlin/org/jetbrains/annotations/NonNls.kt new file mode 100644 index 0000000..7a66cc8 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/NonNls.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies that an element of the program is not a user-visible string which needs to be localized, + * or does not contain such strings. This annotation is intended to be used by localization tools for + * detecting strings which should not be reported as requiring localization. + * + * * If a method parameter is annotated with `NonNls`, the strings passed + * as values of this parameter are not reported as requiring localization. + * Also, if the parameter of a property setter method is annotated with `NonNls`, values + * of that property in UI Designer forms are never highlighted as hard-coded strings. + * * If a field is annotated with `NonNls`, all string literals found in the + * initializer of the field are not reported as requiring localization. + * * If a method is called on a field, parameter or local variable annotated with `NonNls`, + * string literals passed as parameters to the method are not reported as requiring localization. + * * If a field, parameter or local variable annotated with `NonNls` is passed as a + * parameter to the `equals()` method invoked on a string literal, the literal is not + * reported as requiring localization. + * * If a field, parameter or local variable annotated with `NonNls` is found at + * the left side of an assignment expression, all string literals in the right side + * of the expression are not reported as requiring localization. + * * If a method is annotated with `NonNls`, string literals returned from the method + * are not reported as requiring localization. + * * If a class is annotated with `NonNls`, all string literals in + * the class and all its subclasses are not reported as requiring localization. + * * If a package is annotated with `NonNls`, all string literals in + * the package and all its subpackages are not reported as requiring localization. + * + * + * + * + * This annotation also could be used as a meta-annotation, to define derived annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent UUIDs, + * thus should not be localized: + * + *
+ * @NonNls
+ * @interface UUID {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.CLASS, + AnnotationTarget.TYPE, + AnnotationTarget.FILE +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class NonNls() diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/PropertyKey.kt b/src/commonMain/kotlin/org/jetbrains/annotations/PropertyKey.kt new file mode 100644 index 0000000..796370e --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/PropertyKey.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies that a method parameter, local variable, field or a method return value + * must be a valid property key in a specific resource bundle. When a string literal + * which is not a property key in the specified bundle is passed as a parameter, + * static analyzers may highlight it as an error. The annotation is also could be used + * by IDEs to provide completion in string literals passed as parameters. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.FIELD, + AnnotationTarget.TYPE, +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class PropertyKey( + /** + * The full-qualified name of the resource bundle in which the property keys must + * be present. Consists of a full-qualified name of the package corresponding to the + * directory where the resource bundle is located and the base name of the resource + * bundle (with no locale specifier or extension), separated with a dot. + */ + @get:NonNls val resourceBundle: String +) diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/Range.kt b/src/commonMain/kotlin/org/jetbrains/annotations/Range.kt new file mode 100644 index 0000000..3d11088 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/Range.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * An annotation which allows to specify for integral type (byte, char, short, int, long) an allowed values range. + * Applying this annotation to other types is not correct. + * + * + * Example: + *
`public @Range(from = 0, to = Integer.MAX_VALUE) int length() {
+ * return this.length; // returns a non-negative integer
+ * }`
+ * + * @since 17.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.TYPE) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Range( + /** + * @return minimal allowed value (inclusive) + */ + val from: Long, + /** + * @return maximal allowed value (inclusive) + */ + val to: Long +) \ No newline at end of file diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/TestOnly.kt b/src/commonMain/kotlin/org/jetbrains/annotations/TestOnly.kt new file mode 100644 index 0000000..66da9c9 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/TestOnly.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * A member or type annotated with TestOnly claims that it should be used from testing code only. + * + * + * Apart from documentation purposes this annotation is intended to be used by static analysis tools + * to validate against element contract violations. + * + * + * This annotation means that the annotated element exposes internal data and breaks encapsulation + * of the containing class; the annotation won't prevent its use from production code, developers + * even won't see warnings if their IDE doesn't support the annotation. It's better to provide + * proper API which can be used in production as well as in tests. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.CLASS +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class TestOnly() \ No newline at end of file diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/Unmodifiable.kt b/src/commonMain/kotlin/org/jetbrains/annotations/Unmodifiable.kt new file mode 100644 index 0000000..23df008 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/Unmodifiable.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * An annotation which marks a [java.util.Collection] or [java.util.Map] type + * as unmodifiable. A collection or a map is unmodifiable if any mutator methods + * (e.g. [java.util.Collection.add]) throw exception or have no effect, + * and the object references stored as collection elements, map keys, and map values + * are never changed. The referenced objects themselves still could be changed if they + * are mutable. + * + * @see UnmodifiableView + * + * @since 19.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.TYPE) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class Unmodifiable() \ No newline at end of file diff --git a/src/commonMain/kotlin/org/jetbrains/annotations/VisibleForTesting.kt b/src/commonMain/kotlin/org/jetbrains/annotations/VisibleForTesting.kt new file mode 100644 index 0000000..34d4cd7 --- /dev/null +++ b/src/commonMain/kotlin/org/jetbrains/annotations/VisibleForTesting.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * A member or type annotated with VisibleForTesting claims that its visibility is higher than necessary, + * only for testing purposes. In particular: + * + * * If public or protected member/type is annotated with VisibleForTesting, + * it's assumed that package-private access is enough for production code. + * * If package-private member/type is annotated with VisibleForTesting, + * it's assumed that private access is enough for production code. + * * It's illegal to annotate private member/type as VisibleForTesting. + * + * + * + * This annotation means that the annotated element exposes internal data and breaks encapsulation + * of the containing class; the annotation won't prevent its use from production code, developers + * even won't see warnings if their IDE doesn't support the annotation. It's better to provide + * proper API which can be used in production as well as in tests. + * + * @since 20.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.CLASS +) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect annotation class VisibleForTesting() \ No newline at end of file diff --git a/common/src/main/java/org/intellij/lang/annotations/Flow.java b/src/jvmMain/java/org/intellij/lang/annotations/Flow.java similarity index 100% rename from common/src/main/java/org/intellij/lang/annotations/Flow.java rename to src/jvmMain/java/org/intellij/lang/annotations/Flow.java diff --git a/common/src/main/java/org/intellij/lang/annotations/Identifier.java b/src/jvmMain/java/org/intellij/lang/annotations/Identifier.java similarity index 100% rename from common/src/main/java/org/intellij/lang/annotations/Identifier.java rename to src/jvmMain/java/org/intellij/lang/annotations/Identifier.java diff --git a/common/src/main/java/org/intellij/lang/annotations/JdkConstants.java b/src/jvmMain/java/org/intellij/lang/annotations/JdkConstants.java similarity index 100% rename from common/src/main/java/org/intellij/lang/annotations/JdkConstants.java rename to src/jvmMain/java/org/intellij/lang/annotations/JdkConstants.java diff --git a/common/src/main/java/org/intellij/lang/annotations/Language.java b/src/jvmMain/java/org/intellij/lang/annotations/Language.java similarity index 98% rename from common/src/main/java/org/intellij/lang/annotations/Language.java rename to src/jvmMain/java/org/intellij/lang/annotations/Language.java index e71e0bb..f0322d1 100644 --- a/common/src/main/java/org/intellij/lang/annotations/Language.java +++ b/src/jvmMain/java/org/intellij/lang/annotations/Language.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.NonNls; +import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -41,6 +42,7 @@ * Note that using the derived annotation as meta-annotation is not supported. * Meta-annotation works only one level deep. */ +@Documented @Retention(RetentionPolicy.CLASS) @Target({ METHOD, FIELD, PARAMETER, LOCAL_VARIABLE, ANNOTATION_TYPE }) public @interface Language { diff --git a/common/src/main/java/org/intellij/lang/annotations/MagicConstant.java b/src/jvmMain/java/org/intellij/lang/annotations/MagicConstant.java similarity index 99% rename from common/src/main/java/org/intellij/lang/annotations/MagicConstant.java rename to src/jvmMain/java/org/intellij/lang/annotations/MagicConstant.java index 127f05c..3f02eb7 100644 --- a/common/src/main/java/org/intellij/lang/annotations/MagicConstant.java +++ b/src/jvmMain/java/org/intellij/lang/annotations/MagicConstant.java @@ -75,6 +75,7 @@ * * The @MagicConstant annotation has SOURCE retention, i.e. it is removed upon compilation and does not create any runtime overhead. */ +@Documented @Retention(RetentionPolicy.SOURCE) @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, diff --git a/common/src/main/java/org/intellij/lang/annotations/Pattern.java b/src/jvmMain/java/org/intellij/lang/annotations/Pattern.java similarity index 97% rename from common/src/main/java/org/intellij/lang/annotations/Pattern.java rename to src/jvmMain/java/org/intellij/lang/annotations/Pattern.java index 3f40e33..34ec818 100644 --- a/common/src/main/java/org/intellij/lang/annotations/Pattern.java +++ b/src/jvmMain/java/org/intellij/lang/annotations/Pattern.java @@ -19,6 +19,7 @@ import org.jetbrains.annotations.NonNls; import static java.lang.annotation.ElementType.*; +import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -42,6 +43,7 @@ * * @see RegExp */ +@Documented @Retention(RetentionPolicy.CLASS) @Target({ METHOD, FIELD, PARAMETER, LOCAL_VARIABLE, ANNOTATION_TYPE }) public @interface Pattern { diff --git a/common/src/main/java/org/intellij/lang/annotations/PrintFormat.java b/src/jvmMain/java/org/intellij/lang/annotations/PrintFormat.java similarity index 65% rename from common/src/main/java/org/intellij/lang/annotations/PrintFormat.java rename to src/jvmMain/java/org/intellij/lang/annotations/PrintFormat.java index fc810b0..24f7a16 100644 --- a/common/src/main/java/org/intellij/lang/annotations/PrintFormat.java +++ b/src/jvmMain/java/org/intellij/lang/annotations/PrintFormat.java @@ -15,11 +15,33 @@ */ package org.intellij.lang.annotations; +import java.lang.annotation.Documented; + +/** + * Specifies that the method parameter is a printf-style print format pattern, + * as described in {@link java.util.Formatter}. + *

+ * Code editors that support {@link Pattern} annotation will check + * the syntax of this value automatically. It could also be especially recognized to + * check whether the subsequent var-arg arguments match the expected arguments + * mentioned in the pattern. E. g., consider that the following method is annotated: + *


+ * void myprintf(@PrintFormat String format, Object... args) {...}
+ * 
+ *

+ * In this case, code editors might recognize that the following call is erroneous, + * and issue a warning: + *


+ * myprintf("%d\n", "hello"); // warning: a number expected instead of "hello"
+ * 
+ * + * @see Pattern + */ +@Documented @Pattern(PrintFormatPattern.PRINT_FORMAT) public @interface PrintFormat { } -// split up complex regex and workaround for IDEA-9173 class PrintFormatPattern { // %[argument_index$][flags][width][.precision]conversion diff --git a/common/src/main/java/org/intellij/lang/annotations/RegExp.java b/src/jvmMain/java/org/intellij/lang/annotations/RegExp.java similarity index 97% rename from common/src/main/java/org/intellij/lang/annotations/RegExp.java rename to src/jvmMain/java/org/intellij/lang/annotations/RegExp.java index 31c7724..ecdeedd 100644 --- a/common/src/main/java/org/intellij/lang/annotations/RegExp.java +++ b/src/jvmMain/java/org/intellij/lang/annotations/RegExp.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.NonNls; import static java.lang.annotation.ElementType.*; +import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -31,6 +32,7 @@ * * @see Language */ +@Documented @Retention(RetentionPolicy.CLASS) @Target({METHOD, FIELD, PARAMETER, LOCAL_VARIABLE, ANNOTATION_TYPE}) @Language("RegExp") diff --git a/common/src/main/java/org/intellij/lang/annotations/Subst.java b/src/jvmMain/java/org/intellij/lang/annotations/Subst.java similarity index 97% rename from common/src/main/java/org/intellij/lang/annotations/Subst.java rename to src/jvmMain/java/org/intellij/lang/annotations/Subst.java index 14b3f2c..aaa0f24 100644 --- a/common/src/main/java/org/intellij/lang/annotations/Subst.java +++ b/src/jvmMain/java/org/intellij/lang/annotations/Subst.java @@ -33,7 +33,7 @@ * + ... + "</span></html>"; * *

- * Here the parser assumes that when {@code font} appears in the concatenation it's value is {@code "Tahoma"}, + * Here the parser assumes that when {@code font} appears in the concatenation its value is {@code "Tahoma"}, * so it can continue parsing the concatenation. *

* diff --git a/common/src/main/java/org/jetbrains/annotations/ApiStatus.java b/src/jvmMain/java/org/jetbrains/annotations/ApiStatus.java similarity index 89% rename from common/src/main/java/org/jetbrains/annotations/ApiStatus.java rename to src/jvmMain/java/org/jetbrains/annotations/ApiStatus.java index 53ded57..2f47e29 100644 --- a/common/src/main/java/org/jetbrains/annotations/ApiStatus.java +++ b/src/jvmMain/java/org/jetbrains/annotations/ApiStatus.java @@ -72,6 +72,25 @@ private ApiStatus() { }) public @interface Internal {} + /** + *

Indicates that a public API of the annotated element (class, method or field) is subject to deprecation in a future version. + * It's a weaker variant of {@link Deprecated} annotation. + * The annotated API is not supposed to be used in the new code because a better API exists, + * but it's permitted to postpone the migration of the existing code, therefore the usage is not considered a warning. + *

+ */ + @Documented + @Retention(RetentionPolicy.CLASS) + @Target({ + ElementType.TYPE, ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.PACKAGE + }) + public @interface Obsolete { + /** + * Specifies in which version the API became obsolete. + */ + String since() default ""; + } + /** *

Indicates that a public API of the annotated element (class, method or field) is subject to removal in a future version. * It's a stronger variant of {@link Deprecated} annotation.

diff --git a/common/src/main/java/org/jetbrains/annotations/Async.java b/src/jvmMain/java/org/jetbrains/annotations/Async.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/Async.java rename to src/jvmMain/java/org/jetbrains/annotations/Async.java diff --git a/common/src/main/java/org/jetbrains/annotations/Blocking.java b/src/jvmMain/java/org/jetbrains/annotations/Blocking.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/Blocking.java rename to src/jvmMain/java/org/jetbrains/annotations/Blocking.java diff --git a/java8/src/main/java/org/jetbrains/annotations/BlockingExecutor.java b/src/jvmMain/java/org/jetbrains/annotations/BlockingExecutor.java similarity index 100% rename from java8/src/main/java/org/jetbrains/annotations/BlockingExecutor.java rename to src/jvmMain/java/org/jetbrains/annotations/BlockingExecutor.java diff --git a/src/jvmMain/java/org/jetbrains/annotations/CheckReturnValue.java b/src/jvmMain/java/org/jetbrains/annotations/CheckReturnValue.java new file mode 100644 index 0000000..f836633 --- /dev/null +++ b/src/jvmMain/java/org/jetbrains/annotations/CheckReturnValue.java @@ -0,0 +1,35 @@ +package org.jetbrains.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** + * Specifies that the method is impure and that its return value must be used. + *

+ * For pure methods (annotated with {@code @Contract(pure = true)}), + * it's implied that the resulting value is important, + * so this annotation would be redundant. + *

+ * Some impure methods have side effects and still require the return value to be used. + * For example, {@link java.io.InputStream#read(byte[])} + * returns the number of bytes actually stored in the byte array. + * Without checking the return value, it's impossible to say how many bytes were actually read. + *

+ * This annotation should not be used if the return value of the method + * provides only additional information. + * For example, the main purpose of {@link java.util.Collection#add(Object)} + * is to modify the collection, and the return value is only interesting + * when adding an element to a set, to see if the set already contained that element before. + *

+ * When used on a type, the annotation applies to all methods that do not return {@code void}. + *

+ * When used on a package, the annotation applies to all types of that package. + * + * @see Contract#pure() + * @since 24.0.0 + */ +@Documented +@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE, ElementType.PACKAGE}) +public @interface CheckReturnValue { +} diff --git a/common/src/main/java/org/jetbrains/annotations/Contract.java b/src/jvmMain/java/org/jetbrains/annotations/Contract.java similarity index 88% rename from common/src/main/java/org/jetbrains/annotations/Contract.java rename to src/jvmMain/java/org/jetbrains/annotations/Contract.java index b3e1511..e1c116b 100644 --- a/common/src/main/java/org/jetbrains/annotations/Contract.java +++ b/src/jvmMain/java/org/jetbrains/annotations/Contract.java @@ -51,7 +51,7 @@ * {@code @Contract("_, null -> null")} - the method returns null if its second argument is null
* {@code @Contract("_, null -> null; _, !null -> !null")} - the method returns null if its second argument is null and not-null otherwise
* {@code @Contract("true -> fail")} - a typical {@code assertFalse} method which throws an exception if {@code true} is passed to it
- * {@code @Contract("_ -> this")} - the method always returns its qualifier (e.g. {@link StringBuilder#append(String)}). + * {@code @Contract("_ -> this")} - the method always returns its qualifier (e.g. {@link StringBuilder#append(String)}).
* {@code @Contract("null -> fail; _ -> param1")} - the method throws an exception if the first argument is null, * otherwise it returns the first argument (e.g. {@code Objects.requireNonNull}).
* {@code @Contract("!null, _ -> param1; null, !null -> param2; null, null -> fail")} - the method returns the first non-null argument, @@ -92,14 +92,17 @@ * Contains a specifier which describes which method parameters can be mutated during the method call. * * - * - * + * + * * - * + * + * + * *
Possible values:
"this"Method mutates the receiver object, and doesn't mutates any objects passed as arguments (cannot be applied for static method or constructor)
"param"Method mutates the sole argument and doesn't mutate the receiver object (if applicable)
"this"Method mutates the receiver object, and doesn't mutate any objects passed as arguments (cannot be applied for static method or constructor)
"param"Method mutates the sole argument and doesn't mutate the receiver object (if applicable) or anything else
"param1", "param2", ...Method mutates the N-th argument
"this,param1"Method mutates the receiver and first argument and doesn't mutate any other arguments
"io"Method performs input/output changing the outer world but does not mutate any observable program state
"this,param1"Method mutates the receiver and first argument and doesn't mutate any other arguments or observable program state
"io,this"Method performs input/output changing the outer world and mutates the receiver, but doesn't mutate any arguments or observable program state
* * Warning: This annotation parameter is experimental and may be changed or removed without further notice! * @return a mutation specifier string */ - @NonNls String mutates() default ""; + @NonNls + String mutates() default ""; } diff --git a/common/src/main/java/org/jetbrains/annotations/Debug.java b/src/jvmMain/java/org/jetbrains/annotations/Debug.java similarity index 97% rename from common/src/main/java/org/jetbrains/annotations/Debug.java rename to src/jvmMain/java/org/jetbrains/annotations/Debug.java index ef0af90..1da5e7d 100644 --- a/common/src/main/java/org/jetbrains/annotations/Debug.java +++ b/src/jvmMain/java/org/jetbrains/annotations/Debug.java @@ -35,7 +35,7 @@ private Debug() { } /** - * Allows to change the presentation of an object in debuggers + * Allows changing the presentation of an object in debuggers */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS) diff --git a/common/src/main/java/org/jetbrains/annotations/MustBeInvokedByOverriders.java b/src/jvmMain/java/org/jetbrains/annotations/MustBeInvokedByOverriders.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/MustBeInvokedByOverriders.java rename to src/jvmMain/java/org/jetbrains/annotations/MustBeInvokedByOverriders.java diff --git a/common/src/main/java/org/jetbrains/annotations/Nls.java b/src/jvmMain/java/org/jetbrains/annotations/Nls.java similarity index 95% rename from common/src/main/java/org/jetbrains/annotations/Nls.java rename to src/jvmMain/java/org/jetbrains/annotations/Nls.java index 0a1ed52..f3e3a31 100644 --- a/common/src/main/java/org/jetbrains/annotations/Nls.java +++ b/src/jvmMain/java/org/jetbrains/annotations/Nls.java @@ -23,7 +23,7 @@ import java.lang.annotation.Target; /** - * Specifies that an element of the program is an user-visible string which needs to be localized. + * Specifies that an element of the program is a user-visible string which needs to be localized. * This annotation is intended to be used by localization tools for * detecting strings which should be reported as requiring localization. * diff --git a/common/src/main/java/org/jetbrains/annotations/NonBlocking.java b/src/jvmMain/java/org/jetbrains/annotations/NonBlocking.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/NonBlocking.java rename to src/jvmMain/java/org/jetbrains/annotations/NonBlocking.java diff --git a/java8/src/main/java/org/jetbrains/annotations/NonBlockingExecutor.java b/src/jvmMain/java/org/jetbrains/annotations/NonBlockingExecutor.java similarity index 100% rename from java8/src/main/java/org/jetbrains/annotations/NonBlockingExecutor.java rename to src/jvmMain/java/org/jetbrains/annotations/NonBlockingExecutor.java diff --git a/common/src/main/java/org/jetbrains/annotations/NonNls.java b/src/jvmMain/java/org/jetbrains/annotations/NonNls.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/NonNls.java rename to src/jvmMain/java/org/jetbrains/annotations/NonNls.java diff --git a/common/src/main/java/org/jetbrains/annotations/NotNull.java b/src/jvmMain/java/org/jetbrains/annotations/NotNull.java similarity index 68% rename from common/src/main/java/org/jetbrains/annotations/NotNull.java rename to src/jvmMain/java/org/jetbrains/annotations/NotNull.java index b8ba2bb..b10698d 100644 --- a/common/src/main/java/org/jetbrains/annotations/NotNull.java +++ b/src/jvmMain/java/org/jetbrains/annotations/NotNull.java @@ -21,8 +21,22 @@ /** * An element annotated with NotNull claims {@code null} value is forbidden * to return (for methods), pass to (parameters) and hold (local variables and fields). + *

* Apart from documentation purposes this annotation is intended to be used by static analysis tools * to validate against probable runtime errors and element contract violations. + *

+ * If a field is annotated as {@code @NotNull} it's expected to be initialized during object construction. + * Tools may issue a warning if it's not the case. + *

+ * If a method overrides a superclass method, and the superclass method specifies the nullability on parameter + * or return type, then the subclass method should specify the same nullability, either directly or indirectly + * via {@link NotNullByDefault}. The only exception is the covariant return type nullability: if the superclass + * method is declared to return nullable value, then subclass may declare to return a not-null value. + *

+ * The tools may issue a warning if the nullability for a subclass method contradicts from the specified nullability + * of a superclass method. + * + * @see Nullable */ @Documented @Retention(RetentionPolicy.CLASS) @@ -36,7 +50,7 @@ /** * @return Custom exception type that should be thrown when not-nullity contract is violated. * The exception class should have a constructor with one String argument (message). - * + *

* By default, {@link IllegalArgumentException} is thrown on null method arguments and * {@link IllegalStateException} — on null return value. */ diff --git a/src/jvmMain/java/org/jetbrains/annotations/NotNullByDefault.java b/src/jvmMain/java/org/jetbrains/annotations/NotNullByDefault.java new file mode 100644 index 0000000..d32b2b7 --- /dev/null +++ b/src/jvmMain/java/org/jetbrains/annotations/NotNullByDefault.java @@ -0,0 +1,49 @@ +package org.jetbrains.annotations; + +import java.lang.annotation.*; + +/** + * A meta-annotation applicable to Java class or package, which means that the non-primitive types mentioned + * in the following contexts are recursively not-null by default: + *

    + *
  • Types of fields
  • + *
  • Types of method parameters
  • + *
  • Types of method return values
  • + *
+ * Recursively not-null means that along with types themselves, the components of array types, the type arguments + * of generic types and the upper bounds of wildcard types are also not-null. + *

+ * If a method overrides a superclass method, and the superclass method specifies the nullability on parameter + * or return type, then the subclass method should specify the same nullability, either directly or indirectly + * via {@code @NotNullByDefault}. The only exception is the covariant return type nullability: if the superclass + * method is declared to return nullable value, then subclass may declare to return a not-null value. + *

+ * The tools may issue a warning if the nullability for a subclass method contradicts from the specified nullability + * of a superclass method. + *

+ * For newly declared type parameters, the annotation applies to its bounds, including implicit {@code Object} + * bound if no explicit bound is declared. For example, {@code } declared under {@code @NotNullByDefault} scope + * means the same as {@code }. To reset to default behavior in this case, one should use + * {@code }. + *

+ * The type parameter references are not affected by {@code @NotNullByDefault}. For example: + *

{@code @NotNullByDefault
+ * interface Pair {
+ *   // Not assumed to be @NotNull; may return null depending on the K instantiation
+ *   K getKey();
+ *   // Returns @NotNull, as implicit upper bound of V is @NotNull Object,
+ *   // so it cannot be instantiated with a nullable type
+ *   V getValue();
+ * } }
+ *

+ * The annotation has no effect on local variables. + * + * @see NotNull + * @since 26.0.0 + */ +@Documented +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.TYPE, ElementType.PACKAGE}) +@ApiStatus.Experimental +public @interface NotNullByDefault { +} diff --git a/common/src/main/java/org/jetbrains/annotations/Nullable.java b/src/jvmMain/java/org/jetbrains/annotations/Nullable.java similarity index 68% rename from common/src/main/java/org/jetbrains/annotations/Nullable.java rename to src/jvmMain/java/org/jetbrains/annotations/Nullable.java index 8d9e497..d3649e5 100644 --- a/common/src/main/java/org/jetbrains/annotations/Nullable.java +++ b/src/jvmMain/java/org/jetbrains/annotations/Nullable.java @@ -19,20 +19,31 @@ import java.lang.annotation.*; /** - * An element annotated with {@link Nullable} claims {@code null} value is perfectly valid + * An element annotated with {@code Nullable} claims {@code null} value is perfectly valid * to return (for methods), pass to (parameters) or hold in (local variables and fields). * Apart from documentation purposes this annotation is intended to be used by static analysis tools * to validate against probable runtime errors or element contract violations. *

* By convention, this annotation applied only when the value should always be checked against {@code null} * because the developer could do nothing to prevent null from happening. - * Otherwise, too eager {@link Nullable} usage could lead to too many false positives from static analysis tools. + * Otherwise, too eager {@code Nullable} usage could lead to too many false positives from static analysis tools. *

- * For example, {@link java.util.Map#get(Object key)} should not be annotated {@link Nullable} because + * For example, {@link java.util.Map#get(Object key)} should not be annotated {@code Nullable} because * someone may have put not-null value in the map by this key and is expecting to find this value there ever since. + * It could be annotated as {@link UnknownNullability} or left unannotated. *

- * On the other hand, the {@link java.lang.ref.Reference#get()} should be annotated {@link Nullable} because + * On the other hand, the {@link java.lang.ref.Reference#get()} should be annotated {@code Nullable} because * it returns {@code null} if object got collected which can happen at any time completely unexpectedly. + *

+ * If a method overrides a superclass method, and the superclass method specifies the nullability on parameter + * or return type, then the subclass method should specify the same nullability, either directly or indirectly + * via {@link NotNullByDefault}. The only exception is the covariant return type nullability: if the superclass + * method is declared to return nullable value, then subclass may declare to return a not-null value. + *

+ * The tools may issue a warning if the nullability for a subclass method contradicts from the specified nullability + * of a superclass method. + * + * @see NotNull */ @Documented @Retention(RetentionPolicy.CLASS) diff --git a/common/src/main/java/org/jetbrains/annotations/PropertyKey.java b/src/jvmMain/java/org/jetbrains/annotations/PropertyKey.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/PropertyKey.java rename to src/jvmMain/java/org/jetbrains/annotations/PropertyKey.java diff --git a/java8/src/main/java/org/jetbrains/annotations/Range.java b/src/jvmMain/java/org/jetbrains/annotations/Range.java similarity index 100% rename from java8/src/main/java/org/jetbrains/annotations/Range.java rename to src/jvmMain/java/org/jetbrains/annotations/Range.java diff --git a/common/src/main/java/org/jetbrains/annotations/TestOnly.java b/src/jvmMain/java/org/jetbrains/annotations/TestOnly.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/TestOnly.java rename to src/jvmMain/java/org/jetbrains/annotations/TestOnly.java diff --git a/java8/src/main/java/org/jetbrains/annotations/UnknownNullability.java b/src/jvmMain/java/org/jetbrains/annotations/UnknownNullability.java similarity index 92% rename from java8/src/main/java/org/jetbrains/annotations/UnknownNullability.java rename to src/jvmMain/java/org/jetbrains/annotations/UnknownNullability.java index 1dd5a0a..79e026b 100644 --- a/java8/src/main/java/org/jetbrains/annotations/UnknownNullability.java +++ b/src/jvmMain/java/org/jetbrains/annotations/UnknownNullability.java @@ -23,7 +23,7 @@ import java.lang.annotation.Target; /** - * An element annotated with {@link UnknownNullability} claims that no specific nullability + * An element annotated with {@code UnknownNullability} claims that no specific nullability * should be assumed by static analyzer. The unconditional dereference of the annotated value * should not trigger a static analysis warning by default (though static analysis tool may have * an option to perform stricter analysis and issue warnings for {@code @UnknownNullability} as well). @@ -34,7 +34,9 @@ * The {@code UnknownNullability} is the default nullability for unannotated methods, so it's * rarely necessary. An explicit annotation may serve to document the method behavior and also * to override automatic annotation inference result that could be implemented in some static - * analysis tools. + * analysis tools. Finally, it can override the effect of {@link NotNullByDefault}. + * + * @since 21.0.0 */ @Documented @Retention(RetentionPolicy.CLASS) diff --git a/java8/src/main/java/org/jetbrains/annotations/Unmodifiable.java b/src/jvmMain/java/org/jetbrains/annotations/Unmodifiable.java similarity index 100% rename from java8/src/main/java/org/jetbrains/annotations/Unmodifiable.java rename to src/jvmMain/java/org/jetbrains/annotations/Unmodifiable.java diff --git a/java8/src/main/java/org/jetbrains/annotations/UnmodifiableView.java b/src/jvmMain/java/org/jetbrains/annotations/UnmodifiableView.java similarity index 100% rename from java8/src/main/java/org/jetbrains/annotations/UnmodifiableView.java rename to src/jvmMain/java/org/jetbrains/annotations/UnmodifiableView.java diff --git a/common/src/main/java/org/jetbrains/annotations/VisibleForTesting.java b/src/jvmMain/java/org/jetbrains/annotations/VisibleForTesting.java similarity index 100% rename from common/src/main/java/org/jetbrains/annotations/VisibleForTesting.java rename to src/jvmMain/java/org/jetbrains/annotations/VisibleForTesting.java diff --git a/module-info/src/main/java/module-info.java b/src/jvmMain/moduleInfo/module-info.java similarity index 100% rename from module-info/src/main/java/module-info.java rename to src/jvmMain/moduleInfo/module-info.java diff --git a/common/build.gradle b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Identifier.kt similarity index 80% rename from common/build.gradle rename to src/nonJvmMain/kotlin/org/intellij/lang/annotations/Identifier.kt index cf34d15..ca0af40 100644 --- a/common/build.gradle +++ b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Identifier.kt @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.intellij.lang.annotations -sourceCompatibility = 1.8 -javadoc.enabled = false +@Pattern("\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*") +actual annotation class Identifier diff --git a/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Language.kt b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Language.kt new file mode 100644 index 0000000..b36b271 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Language.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +import org.jetbrains.annotations.NonNls + +/** + * Specifies that an element of the program represents a string that is a source code on a specified language. + * Code editors may use this annotation to enable syntax highlighting, code completion and other features + * inside the literals that assigned to the annotated variables, passed as arguments to the annotated parameters, + * or returned from the annotated methods. + * + * + * This annotation also could be used as a meta-annotation, to define derived annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent Java methods: + * + *

+ * @Language(value = "JAVA", prefix = "class X{", suffix = "}")
+ * @interface JavaMethod {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.ANNOTATION_CLASS +) +actual annotation class Language( + /** + * Language name like "JAVA", "HTML", "XML", "RegExp", etc. + * The complete list of supported languages is not specified. However, at least the following languages should be + * recognized: + * + * * "JAVA" - Java programming language + * * "HTML" - HTML + * * "XML" - XML + * * "RegExp" - Regular expression supported by Java [java.util.regex.Pattern] + * + */ + @get:NonNls actual val value: String, + /** + * A constant prefix that is assumed to be implicitly added before the literal. + * This helps to apply proper highlighting when the program element represents only a part of the valid program. + * E.g. if the method parameter accepts a Java method, it could be annotated as + * `void methodProcessor(@Language(value="JAVA", prefix="class X {", suffix="}")`. + */ + @get:NonNls actual val prefix: String = "", + /** + * A constant suffix that is assumed to be implicitly added after the literal. See [.prefix] for details. + */ + @get:NonNls actual val suffix: String = "" +) \ No newline at end of file diff --git a/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Pattern.kt b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Pattern.kt new file mode 100644 index 0000000..670cefd --- /dev/null +++ b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Pattern.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +import org.jetbrains.annotations.NonNls + +/** + * Specifies that an element of the program represents a string that must completely match given regular expression. + * Code editors may use this annotation to report errors if the literals that assigned to the annotated variables, + * passed as arguments to the annotated parameters, or returned from the annotated methods, do not match the supplied + * pattern. + * + * + * This annotation also could be used as a meta-annotation, to define other annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent UUIDs: + * + *
+ * @Pattern("[\\dA-Fa-f]{8}-[\\dA-Fa-f]{4}-[\\dA-Fa-f]{4}-[\\dA-Fa-f]{4}-[\\dA-Fa-f]{12}")
+ * @interface UUID {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + * + * @see RegExp + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.ANNOTATION_CLASS +) +actual annotation class Pattern( + /** + * A regular expression that matches all the valid string literals that assigned to the annotated variables, + * passed as arguments to the annotated parameters, or returned from the annotated methods. + */ + @get:Language("RegExp") @get:NonNls actual val value: String +) diff --git a/src/nonJvmMain/kotlin/org/intellij/lang/annotations/RegExp.kt b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/RegExp.kt new file mode 100644 index 0000000..dd2ac3a --- /dev/null +++ b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/RegExp.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +import org.jetbrains.annotations.NonNls + +/** + * Specifies that an element of the program represents a string that is a regular expression text supported + * by [java.util.regex.Pattern]. + * Code editors may use this annotation to enable syntax highlighting, code completion and other features + * inside the literals that assigned to the annotated variables, passed as arguments to the annotated parameters, + * or returned from the annotated methods. + * + * @see Language + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.ANNOTATION_CLASS +) +@Language("RegExp") +actual annotation class RegExp( + /** + * A constant prefix that is assumed to be implicitly added before the regular expression. + */ + @get:NonNls actual val prefix: String = "", + /** + * A constant suffix that is assumed to be implicitly added after the regular expression. + */ + @get:NonNls actual val suffix: String = "" +) diff --git a/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Subst.kt b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Subst.kt new file mode 100644 index 0000000..feaeb8d --- /dev/null +++ b/src/nonJvmMain/kotlin/org/intellij/lang/annotations/Subst.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.lang.annotations + +/** + * Specifies the replacement value for non-constant variables and method return values. + * This may help static analyzers to properly parse the concatenation of several values + * which is used in @[Language] or [Pattern] context. + * + * + * Example: + *
+ * @Subst("Tahoma")
+ * final String font = new JLabel().getFont().getName();
+ *
+ * @Language("HTML")
+ * String message = "<html><span style='font: " + font + "; font-size:smaller'>"
+ * + ... + "</span></html>";
+
* + * + * + * Here the parser assumes that when `font` appears in the concatenation its value is `"Tahoma"`, + * so it can continue parsing the concatenation. + * + * + * @see Language + * + * @see Pattern + */ +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.VALUE_PARAMETER +) +actual annotation class Subst(actual val value: String) diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/ApiStatus.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/ApiStatus.kt new file mode 100644 index 0000000..ec33881 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/ApiStatus.kt @@ -0,0 +1,223 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Set of annotations which can be used to specify status of API Element. + * + * @since 18.0.0 + */ +actual class ApiStatus private actual constructor() { + /** + * Prohibited default constructor. + */ + init { + throw AssertionError("ApiStatus should not be instantiated") + } + + /** + * + * Indicates that a public API of the annotated element (class, method or field) is not in stable state yet. It may be renamed, changed or + * even removed in a future version. This annotation refers to API status only, it doesn't mean that the implementation has + * an 'experimental' quality. + * + * + * It's safe to use an element marked with this annotation if the usage is located in the same sources codebase as the declaration. However, + * if the declaration belongs to an external library such usages may lead to problems when the library will be updated to another version. + * + * + * If a package is marked with this annotation, all its containing classes are considered experimental. + * Subpackages of this package are not affected and should be marked independently. + * + * + * If a type is marked with this annotation, all its members are considered experimental, but its inheritors are not. + * + * + * If a method is marked with this annotation, overriding methods are not considered experimental. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + actual annotation class Experimental + + /** + * Indicates that the annotated element (class, method, field, etc) must not be considered as a public API. It's made visible to allow + * usages in other packages of the declaring library, but it must not be used outside of that library. Such elements + * may be renamed, changed or removed in future versions. + * + * + * If a package is marked with this annotation, all its containing classes are considered internal. + * Subpackages of this package are not affected and should be marked independently. + * + * + * If a type is marked with this annotation, all its members are considered internal, but its inheritors are not. + * + * + * If a method is marked with this annotation, overriding methods are not considered internal. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + actual annotation class Internal + + /** + * + * Indicates that a public API of the annotated element (class, method or field) is subject to deprecation in a future version. + * It's a weaker variant of [Deprecated] annotation. + * The annotated API is not supposed to be used in the new code because a better API exists, + * but it's permitted to postpone the migration of the existing code, therefore the usage is not considered a warning. + * + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + actual annotation class Obsolete( + /** + * Specifies in which version the API became obsolete. + */ + actual val since: String = "" + ) + + /** + * + * Indicates that a public API of the annotated element (class, method or field) is subject to removal in a future version. + * It's a stronger variant of [Deprecated] annotation. + * + * + * Since many tools aren't aware of this annotation it should be used as an addition to `@Deprecated` annotation + * or `@deprecated` Javadoc tag only. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + actual annotation class ScheduledForRemoval( + /** + * Specifies in which version the API will be removed. + */ + actual val inVersion: String = "" + ) + + /** + * + * Indicates that the annotated element firstly appeared in the specified version of the library, so the code using that element + * won't be compatible with older versions of the library. This information may be used by IDEs and static analysis tools. + * This annotation can be used instead of '@since' Javadoc tag if it's needed to keep that information in *.class files or if you need + * to generate them automatically. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.FILE + ) + actual annotation class AvailableSince( + /** + * Specifies a version where the annotation API firstly appeared. + */ + actual val value: String + ) + + /** + * + * Indicates that the annotated API class, interface or method **must not be extended, implemented or overridden**. + * + * + * API class, interface or method may not be marked `final` because it is extended by classes of the declaring library + * but it is not supposed to be extended outside the library. Instances of classes and interfaces marked with this annotation + * may be cast to an internal implementing class in the library code, leading to `ClassCastException` + * if a different implementation is provided by a client. + * + * + * New abstract methods may be added to such classes and interfaces in new versions of the library breaking compatibility + * with a client's implementations. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER + ) + actual annotation class NonExtendable + + /** + * + * Indicates that the annotated method is part of SPI (Service Provider Interface), which is intended to be + * **only implemented or overridden** but not called by clients of the declaring library. + * If a class or interface is marked with this annotation it means that all its methods can be only overridden. + * + * + * Although there is a standard mechanism of `protected` methods, it is not applicable to interface's methods. + * Also, API method may be made `public` to allow calls only from different parts of the declaring library but not outside it. + * + * + * Signatures of such methods may be changed in new versions of the library in the following steps. Firstly, a method with new signature + * is added to the library delegating to the old method by default. Secondly, all clients implement the new method and remove + * implementations of the old one. This leads to compatibility breakage with code that calls the methods directly. + */ + @MustBeDocumented + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER + ) + actual annotation class OverrideOnly +} \ No newline at end of file diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/Async.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Async.kt new file mode 100644 index 0000000..d4105da --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Async.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Helper annotations for asynchronous computation. + * Used for example in IntelliJ IDEA's debugger for async stacktraces feature. + * + * @author egor + */ +actual class Async private actual constructor() { + /** + * Prohibited default constructor. + */ + init { + throw AssertionError("Async should not be instantiated") + } + + /** + * Indicates that the marked method schedules async computation. + * Scheduled object is either `this`, or the annotated parameter value. + */ + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.VALUE_PARAMETER + ) + actual annotation class Schedule + + /** + * Indicates that the marked method executes async computation. + * Executed object is either `this`, or the annotated parameter value. + * This object needs to match with the one annotated with [Schedule] + */ + @Retention(AnnotationRetention.BINARY) + @Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.VALUE_PARAMETER + ) + actual annotation class Execute +} diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/Blocking.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Blocking.kt new file mode 100644 index 0000000..75df61a --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Blocking.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated method is inherently blocking and should not be executed in a non-blocking context. + * + * + * When this annotation is used on a `class`, all the methods declared by the annotated class are considered + * *blocking*. + * + * + * Apart from documentation purposes this annotation is intended to be used by static analysis tools to validate against + * probable runtime errors and element contract violations. + * + * @since 22.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.CLASS +) +actual annotation class Blocking diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/BlockingExecutor.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/BlockingExecutor.kt new file mode 100644 index 0000000..70235b6 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/BlockingExecutor.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated executor (CoroutineContext, Scheduler) + * allows blocking methods execution. + * + * + * If a given executor does not allow blocking calls, [NonBlockingExecutor] should be used. + * + * + * + * Example 1 (Kotlin coroutines): + *
`
+ * class BlockingExampleService {
+ * val dispatcher: @BlockingExecutor CoroutineContext
+ * get() { ... }
+ *
+ * suspend fun foo() {
+ * val result = withContext(dispatcher) {
+ * blockingBuzz() // no IDE warning
+ * }
+ * }
+ *
+ * @Blocking fun blockingBuzz() { ... }
+ * }
+`
* + * + * + * + * Example 2 (Java with Reactor framework): + *
`
+ * class BlockingExampleService {
+ * private static final @BlockingExecutor Scheduler blockingScheduler =
+ * Schedulers.newBoundedElastic(4, 10, "executor");
+ *
+ * public Flux foo(Flux urls) {
+ * return urls.publishOn(blockingScheduler)
+ * .map(url -> blockingBuzz(url));  // no IDE warning
+ * }
+ *
+ * @Blocking
+ * private String blockingBuzz(String url) { ... }
+ * }
+`
* + * + * @see Blocking + * + * @see NonBlocking + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE) +actual annotation class BlockingExecutor diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/CheckReturnValue.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/CheckReturnValue.kt new file mode 100644 index 0000000..5f5d0a4 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/CheckReturnValue.kt @@ -0,0 +1,41 @@ +package org.jetbrains.annotations + +/** + * Specifies that the method is impure and that its return value must be used. + * + * + * For pure methods (annotated with `@Contract(pure = true)`), + * it's implied that the resulting value is important, + * so this annotation would be redundant. + * + * + * Some impure methods have side effects and still require the return value to be used. + * For example, [java.io.InputStream.read] + * returns the number of bytes actually stored in the byte array. + * Without checking the return value, it's impossible to say how many bytes were actually read. + * + * + * This annotation should not be used if the return value of the method + * provides only *additional* information. + * For example, the main purpose of [java.util.Collection.add] + * is to modify the collection, and the return value is only interesting + * when adding an element to a set, to see if the set already contained that element before. + * + * + * When used on a type, the annotation applies to all methods that do not return `void`. + * + * + * When used on a package, the annotation applies to all types of that package. + * + * @see Contract.pure + */ +@MustBeDocumented +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.CLASS, + AnnotationTarget.FILE +) +actual annotation class CheckReturnValue diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/Contract.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Contract.kt new file mode 100644 index 0000000..c90d6fc --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Contract.kt @@ -0,0 +1,112 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies some aspects of the method behavior depending on the arguments. Can be used by tools for advanced data flow analysis. + * Note that this annotation just describes how the code works and doesn't add any functionality by means of code generation. + * + * + * + * Method contract has the following syntax:

+ *
`contract ::= (clause ';')* clause
+ * clause ::= args '->' effect
+ * args ::= ((arg ',')* arg )?
+ * arg ::= value-constraint
+ * value-constraint ::= '_' | 'null' | '!null' | 'false' | 'true'
+ * effect ::= value-constraint | 'fail' | 'this' | 'new' | 'param'`
+ * + * + * + * The constraints denote the following:

+ * + * * _ - any value + * * null - null value + * * !null - a value statically proved to be not-null + * * true - true boolean value + * * false - false boolean value + * + * + * The additional return values denote the following:

+ * + * * fail - the method throws an exception, if the arguments satisfy argument constraints + * * new - (supported in IntelliJ IDEA since version 2018.2) the method returns a non-null new object which is distinct from any other object existing in the heap prior to method execution. If method is also pure, then we can be sure that the new object is not stored to any field/array and will be lost if method return value is not used. + * * this - (supported in IntelliJ IDEA since version 2018.2) the method returns its qualifier value (not applicable for static methods) + * * param1, param2, ... - (supported in IntelliJ IDEA since version 2018.2) the method returns its first (second, ...) parameter value + * + * Examples: + * + * + * `@Contract("_, null -> null")` - the method returns null if its second argument is null

+ * `@Contract("_, null -> null; _, !null -> !null")` - the method returns null if its second argument is null and not-null otherwise

+ * `@Contract("true -> fail")` - a typical `assertFalse` method which throws an exception if `true` is passed to it

+ * `@Contract("_ -> this")` - the method always returns its qualifier (e.g. [StringBuilder.append]).

+ * `@Contract("null -> fail; _ -> param1")` - the method throws an exception if the first argument is null, + * otherwise it returns the first argument (e.g. `Objects.requireNonNull`).

+ * `@Contract("!null, _ -> param1; null, !null -> param2; null, null -> fail")` - the method returns the first non-null argument, + * or throws an exception if both arguments are null (e.g. `Objects.requireNonNullElse` in Java 9).

+ * + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR +) +actual annotation class Contract( + /** + * Contains the contract clauses describing causal relations between call arguments and the returned value + */ + @get:NonNls actual val value: String = "", + /** + * Specifies that the annotated method has no visible side effects. + * If its return value is not used, removing its invocation won't + * affect program state and change the semantics, unless method call throws an exception. + * Exception throwing is not considered to be a side effect. + * + * + * Method should not be marked as pure if it does not produce a side-effect by itself, + * but it could be used to establish a happens-before relation between an event in + * another thread, so changes performed in another thread might become visible in current thread + * after this method invocation. Examples of such methods are [Object.wait], [Thread.join] + * or [AtomicBoolean.get]. On the other hand, some synchronized methods like [java.util.Vector.get] + * could be marked as pure, because the purpose of synchronization here is to keep the collection internal integrity + * rather than to wait for an event in another thread. + * + * + * "Invisible" side effects (such as logging) that don't affect the "important" program semantics are allowed.



+ * + * + * This annotation may be used for more precise data flow analysis, and + * to check that the method's return value is actually used in the call place. + */ + actual val pure: Boolean = false, + /** + * Contains a specifier which describes which method parameters can be mutated during the method call. + * + * + * + * + * + * +
Possible values:
"this"Method mutates the receiver object, and doesn't mutates any objects passed as arguments (cannot be applied for static method or constructor)
"param"Method mutates the sole argument and doesn't mutate the receiver object (if applicable)
"param1", "param2", ...Method mutates the N-th argument
"this,param1"Method mutates the receiver and first argument and doesn't mutate any other arguments
* + * + * @return a mutation specifier string + */ + @get:NonNls actual val mutates: String = "" +) diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/Debug.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Debug.kt new file mode 100644 index 0000000..82b7f97 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Debug.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +import org.intellij.lang.annotations.Language + +/** + * @since 18.0.0 + */ +actual class Debug private actual constructor() { + /** + * Prohibited default constructor. + */ + init { + throw AssertionError("Debug should not be instantiated") + } + + /** + * Allows to change the presentation of an object in debuggers + */ + @Target(AnnotationTarget.CLASS) + @Retention(AnnotationRetention.BINARY) + actual annotation class Renderer( + /** + * Expression to be evaluated and used as the textual representation of the object.

+ * `this` refers to the class instance being presented + */ + @get:Language( + value = "JAVA", + prefix = "class Renderer{String \$text(){return ", + suffix = ";}}" + ) @get:NonNls actual val text: String = "", + /** + * Expression to be evaluated to obtain an array of object's children.

+ * Usually the result is an array of elements in a collection, or an array of entries in a map.

+ * `this` refers to the class instance being presented + */ + @get:Language( + value = "JAVA", + prefix = "class Renderer{Object[] \$childrenArray(){return ", + suffix = ";}}" + ) @get:NonNls actual val childrenArray: String = "", + /** + * Expression to be evaluated to check if the object has any children at all.

+ * This should work faster than [.childrenArray] and return boolean.

+ * `this` refers to the class instance being presented + */ + @get:Language( + value = "JAVA", + prefix = "class Renderer{boolean \$hasChildren(){return ", + suffix = ";}}" + ) @get:NonNls actual val hasChildren: String = "" + ) +} diff --git a/module-info/build.gradle b/src/nonJvmMain/kotlin/org/jetbrains/annotations/MustBeInvokedByOverriders.kt similarity index 52% rename from module-info/build.gradle rename to src/nonJvmMain/kotlin/org/jetbrains/annotations/MustBeInvokedByOverriders.kt index 7d9c6a4..d6719f2 100644 --- a/module-info/build.gradle +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/MustBeInvokedByOverriders.kt @@ -13,19 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.jetbrains.annotations -sourceCompatibility = 1.9 - -dependencies { - compile project(':common') -} - -compileJava { - // Without common sources, compiler complains that exported packages don't exist - source = [sourceSets.main.java, project(':common').sourceSets.main.java] -} - -task mainJar(type: Jar) { -} - -javadoc.enabled = false +/** + * The annotation should be applied to overridable non-abstract method + * and indicates that all the overriders must invoke this method via + * superclass method invocation expression. The static analysis tools + * may report a warning if overrider fails to invoke this method. + * + * @since 20.0.0 + */ +@MustBeDocumented +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) +@Retention( + AnnotationRetention.BINARY +) +actual annotation class MustBeInvokedByOverriders diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/Nls.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Nls.kt new file mode 100644 index 0000000..8885ca2 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Nls.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies that an element of the program is a user-visible string which needs to be localized. + * This annotation is intended to be used by localization tools for + * detecting strings which should be reported as requiring localization. + * + * + * + * This annotation also could be used as a meta-annotation, to define derived annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent dialog titles: + * + *
+ * @Nls(capitalization = Capitalization.Title)
+ * @interface DialogTitle {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + * + * @see NonNls + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.CLASS, + AnnotationTarget.TYPE, + AnnotationTarget.FILE +) +actual annotation class Nls(actual val capitalization: Capitalization = Capitalization.NotSpecified) { + actual enum class Capitalization { + NotSpecified, + + /** + * e.g. This Is a Title + */ + Title, + + /** + * e.g. This is a sentence + */ + Sentence + } +} diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonBlocking.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonBlocking.kt new file mode 100644 index 0000000..81b8ea1 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonBlocking.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated method is inherently non-blocking and can be executed in a non-blocking context. + * + * + * When this annotation is used on a `class`, all the methods declared by the annotated class are considered + * *non-blocking*. + * + * + * Apart from documentation purposes this annotation is intended to be used by static analysis tools to validate against + * probable runtime errors and contract violations. + * + * @since 22.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.CLASS +) +actual annotation class NonBlocking diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonBlockingExecutor.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonBlockingExecutor.kt new file mode 100644 index 0000000..293719d --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonBlockingExecutor.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Indicates that the annotated executor (CoroutineContext, Scheduler) + * does not allow blocking methods execution. + * + * + * + * If a given executor allows blocking calls, [BlockingExecutor] should be used. + * + * + * + * Example 1 (Kotlin coroutines): + *
`
+ * class NonBlockingExampleService {
+ * val dispatcher: @NonBlockingExecutor CoroutineContext
+ * get() { ... }
+ *
+ * suspend fun foo() {
+ * val result = withContext(dispatcher) {
+ * blockingBuzz() // IDE warning: `Possibly blocking call in non-blocking context`
+ * }
+ * }
+ *
+ * @Blocking fun blockingBuzz() { ... }
+ * }
+`
* + * + * + * + * Example 2 (Java with Reactor framework): + *
`
+ * class NonBlockingExampleService {
+ * private static final @NonBlockingExecutor Scheduler operationsScheduler =
+ * Schedulers.newParallel("parallel");
+ *
+ * public Flux foo(Flux urls) {
+ * return urls.publishOn(operationsScheduler)
+ * .filter(url -> blockingBuzz(url) != null);  // IDE warning: `Possibly blocking call in non-blocking context`
+ * }
+ *
+ * @Blocking
+ * private String blockingBuzz(String url) { ... }
+ * }
+`
* + * @see Blocking + * + * @see NonBlocking + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE) +actual annotation class NonBlockingExecutor diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonNls.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonNls.kt new file mode 100644 index 0000000..55f81cc --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/NonNls.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies that an element of the program is not a user-visible string which needs to be localized, + * or does not contain such strings. This annotation is intended to be used by localization tools for + * detecting strings which should not be reported as requiring localization. + * + * * If a method parameter is annotated with `NonNls`, the strings passed + * as values of this parameter are not reported as requiring localization. + * Also, if the parameter of a property setter method is annotated with `NonNls`, values + * of that property in UI Designer forms are never highlighted as hard-coded strings. + * * If a field is annotated with `NonNls`, all string literals found in the + * initializer of the field are not reported as requiring localization. + * * If a method is called on a field, parameter or local variable annotated with `NonNls`, + * string literals passed as parameters to the method are not reported as requiring localization. + * * If a field, parameter or local variable annotated with `NonNls` is passed as a + * parameter to the `equals()` method invoked on a string literal, the literal is not + * reported as requiring localization. + * * If a field, parameter or local variable annotated with `NonNls` is found at + * the left side of an assignment expression, all string literals in the right side + * of the expression are not reported as requiring localization. + * * If a method is annotated with `NonNls`, string literals returned from the method + * are not reported as requiring localization. + * * If a class is annotated with `NonNls`, all string literals in + * the class and all its subclasses are not reported as requiring localization. + * * If a package is annotated with `NonNls`, all string literals in + * the package and all its subpackages are not reported as requiring localization. + * + * + * + * + * This annotation also could be used as a meta-annotation, to define derived annotations for convenience. + * E.g. the following annotation could be defined to annotate the strings that represent UUIDs, + * thus should not be localized: + * + *
+ * @NonNls
+ * @interface UUID {}
+
* + * + * + * Note that using the derived annotation as meta-annotation is not supported. + * Meta-annotation works only one level deep. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FIELD, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.CLASS, + AnnotationTarget.TYPE, + AnnotationTarget.FILE +) +actual annotation class NonNls diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/PropertyKey.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/PropertyKey.kt new file mode 100644 index 0000000..a081b8e --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/PropertyKey.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * Specifies that a method parameter, local variable, field or a method return value + * must be a valid property key in a specific resource bundle. When a string literal + * which is not a property key in the specified bundle is passed as a parameter, + * static analyzers may highlight it as an error. The annotation is also could be used + * by IDEs to provide completion in string literals passed as parameters. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.FIELD, + AnnotationTarget.TYPE, +) +actual annotation class PropertyKey( + /** + * The full-qualified name of the resource bundle in which the property keys must + * be present. Consists of a full-qualified name of the package corresponding to the + * directory where the resource bundle is located and the base name of the resource + * bundle (with no locale specifier or extension), separated with a dot. + */ + @get:NonNls actual val resourceBundle: String +) diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/Range.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Range.kt new file mode 100644 index 0000000..e2bc96a --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Range.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * An annotation which allows to specify for integral type (byte, char, short, int, long) an allowed values range. + * Applying this annotation to other types is not correct. + * + * + * Example: + *
`public @Range(from = 0, to = Integer.MAX_VALUE) int length() {
+ * return this.length; // returns a non-negative integer
+ * }`
+ * + * @since 17.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.TYPE) +actual annotation class Range( + /** + * @return minimal allowed value (inclusive) + */ + actual val from: Long, + /** + * @return maximal allowed value (inclusive) + */ + actual val to: Long +) \ No newline at end of file diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/TestOnly.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/TestOnly.kt new file mode 100644 index 0000000..585c64f --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/TestOnly.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * A member or type annotated with TestOnly claims that it should be used from testing code only. + * + * + * Apart from documentation purposes this annotation is intended to be used by static analysis tools + * to validate against element contract violations. + * + * + * This annotation means that the annotated element exposes internal data and breaks encapsulation + * of the containing class; the annotation won't prevent its use from production code, developers + * even won't see warnings if their IDE doesn't support the annotation. It's better to provide + * proper API which can be used in production as well as in tests. + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.CLASS +) +actual annotation class TestOnly \ No newline at end of file diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/Unmodifiable.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Unmodifiable.kt new file mode 100644 index 0000000..d1a2baa --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/Unmodifiable.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * An annotation which marks a [java.util.Collection] or [java.util.Map] type + * as unmodifiable. A collection or a map is unmodifiable if any mutator methods + * (e.g. [java.util.Collection.add]) throw exception or have no effect, + * and the object references stored as collection elements, map keys, and map values + * are never changed. The referenced objects themselves still could be changed if they + * are mutable. + * + * @see UnmodifiableView + * + * @since 19.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.TYPE) +actual annotation class Unmodifiable \ No newline at end of file diff --git a/src/nonJvmMain/kotlin/org/jetbrains/annotations/VisibleForTesting.kt b/src/nonJvmMain/kotlin/org/jetbrains/annotations/VisibleForTesting.kt new file mode 100644 index 0000000..ce49dd5 --- /dev/null +++ b/src/nonJvmMain/kotlin/org/jetbrains/annotations/VisibleForTesting.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.annotations + +/** + * A member or type annotated with VisibleForTesting claims that its visibility is higher than necessary, + * only for testing purposes. In particular: + * + * * If public or protected member/type is annotated with VisibleForTesting, + * it's assumed that package-private access is enough for production code. + * * If package-private member/type is annotated with VisibleForTesting, + * it's assumed that private access is enough for production code. + * * It's illegal to annotate private member/type as VisibleForTesting. + * + * + * + * This annotation means that the annotated element exposes internal data and breaks encapsulation + * of the containing class; the annotation won't prevent its use from production code, developers + * even won't see warnings if their IDE doesn't support the annotation. It's better to provide + * proper API which can be used in production as well as in tests. + * + * @since 20.0.0 + */ +@MustBeDocumented +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.CLASS +) +actual annotation class VisibleForTesting \ No newline at end of file